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