xref: /aosp_15_r20/external/protobuf/examples/add_person.cc (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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