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