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