1// See README.txt for information and build instructions. 2 3#include <ctime> 4#include <fstream> 5#include <google/protobuf/util/time_util.h> 6#include <iostream> 7#include <string> 8 9#include "addressbook.pb.h" 10 11using namespace std; 12 13using google::protobuf::util::TimeUtil; 14 15// This function fills in a Person message based on user input. 16void PromptForAddress(tutorial::Person* person) { 17 cout << "Enter person ID number: "; 18 int id; 19 cin >> id; 20 person->set_id(id); 21 cin.ignore(256, '\n'); 22 23 cout << "Enter name: "; 24 getline(cin, *person->mutable_name()); 25 26 cout << "Enter email address (blank for none): "; 27 string email; 28 getline(cin, email); 29 if (!email.empty()) { 30 person->set_email(email); 31 } 32 33 while (true) { 34 cout << "Enter a phone number (or leave blank to finish): "; 35 string number; 36 getline(cin, number); 37 if (number.empty()) { 38 break; 39 } 40 41 tutorial::Person::PhoneNumber* phone_number = person->add_phones(); 42 phone_number->set_number(number); 43 44 cout << "Is this a mobile, home, or work phone? "; 45 string type; 46 getline(cin, type); 47 if (type == "mobile") { 48 phone_number->set_type(tutorial::Person::MOBILE); 49 } else if (type == "home") { 50 phone_number->set_type(tutorial::Person::HOME); 51 } else if (type == "work") { 52 phone_number->set_type(tutorial::Person::WORK); 53 } else { 54 cout << "Unknown phone type. Using default." << endl; 55 } 56 } 57 *person->mutable_last_updated() = TimeUtil::SecondsToTimestamp(time(NULL)); 58} 59 60// Main function: Reads the entire address book from a file, 61// adds one person based on user input, then writes it back out to the same 62// file. 63int main(int argc, char* argv[]) { 64 // Verify that the version of the library that we linked against is 65 // compatible with the version of the headers we compiled against. 66 GOOGLE_PROTOBUF_VERIFY_VERSION; 67 68 if (argc != 2) { 69 cerr << "Usage: " << argv[0] << " ADDRESS_BOOK_FILE" << endl; 70 return -1; 71 } 72 73 tutorial::AddressBook address_book; 74 75 { 76 // Read the existing address book. 77 fstream input(argv[1], ios::in | ios::binary); 78 if (!input) { 79 cout << argv[1] << ": File not found. Creating a new file." << endl; 80 } else if (!address_book.ParseFromIstream(&input)) { 81 cerr << "Failed to parse address book." << endl; 82 return -1; 83 } 84 } 85 86 // Add an address. 87 PromptForAddress(address_book.add_people()); 88 89 { 90 // Write the new address book back to disk. 91 fstream output(argv[1], ios::out | ios::trunc | ios::binary); 92 if (!address_book.SerializeToOstream(&output)) { 93 cerr << "Failed to write address book." << endl; 94 return -1; 95 } 96 } 97 98 // Optional: Delete all global objects allocated by libprotobuf. 99 google::protobuf::ShutdownProtobufLibrary(); 100 101 return 0; 102} 103