add_person.cc 2.73 KB
Newer Older
temporal's avatar
temporal committed
1 2
// See README.txt for information and build instructions.

3
#include <ctime>
temporal's avatar
temporal committed
4
#include <fstream>
5 6
#include <google/protobuf/util/time_util.h>
#include <iostream>
temporal's avatar
temporal committed
7
#include <string>
8

temporal's avatar
temporal committed
9
#include "addressbook.pb.h"
10

temporal's avatar
temporal committed
11 12
using namespace std;

13 14
using google::protobuf::util::TimeUtil;

temporal's avatar
temporal committed
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
// This function fills in a Person message based on user input.
void PromptForAddress(tutorial::Person* person) {
  cout << "Enter person ID number: ";
  int id;
  cin >> id;
  person->set_id(id);
  cin.ignore(256, '\n');

  cout << "Enter name: ";
  getline(cin, *person->mutable_name());

  cout << "Enter email address (blank for none): ";
  string email;
  getline(cin, email);
  if (!email.empty()) {
    person->set_email(email);
  }

  while (true) {
    cout << "Enter a phone number (or leave blank to finish): ";
    string number;
    getline(cin, number);
    if (number.empty()) {
      break;
    }

Jan Tattermusch's avatar
Jan Tattermusch committed
41
    tutorial::Person::PhoneNumber* phone_number = person->add_phones();
temporal's avatar
temporal committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
    phone_number->set_number(number);

    cout << "Is this a mobile, home, or work phone? ";
    string type;
    getline(cin, type);
    if (type == "mobile") {
      phone_number->set_type(tutorial::Person::MOBILE);
    } else if (type == "home") {
      phone_number->set_type(tutorial::Person::HOME);
    } else if (type == "work") {
      phone_number->set_type(tutorial::Person::WORK);
    } else {
      cout << "Unknown phone type.  Using default." << endl;
    }
  }
57
  *person->mutable_last_updated() = TimeUtil::SecondsToTimestamp(time(NULL));
temporal's avatar
temporal committed
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
}

// Main function:  Reads the entire address book from a file,
//   adds one person based on user input, then writes it back out to the same
//   file.
int main(int argc, char* argv[]) {
  // Verify that the version of the library that we linked against is
  // compatible with the version of the headers we compiled against.
  GOOGLE_PROTOBUF_VERIFY_VERSION;

  if (argc != 2) {
    cerr << "Usage:  " << argv[0] << " ADDRESS_BOOK_FILE" << endl;
    return -1;
  }

  tutorial::AddressBook address_book;

  {
    // Read the existing address book.
    fstream input(argv[1], ios::in | ios::binary);
    if (!input) {
      cout << argv[1] << ": File not found.  Creating a new file." << endl;
    } else if (!address_book.ParseFromIstream(&input)) {
      cerr << "Failed to parse address book." << endl;
      return -1;
    }
  }

  // Add an address.
87
  PromptForAddress(address_book.add_people());
temporal's avatar
temporal committed
88 89 90 91 92 93 94 95 96 97

  {
    // Write the new address book back to disk.
    fstream output(argv[1], ios::out | ios::trunc | ios::binary);
    if (!address_book.SerializeToOstream(&output)) {
      cerr << "Failed to write address book." << endl;
      return -1;
    }
  }

98 99 100
  // Optional:  Delete all global objects allocated by libprotobuf.
  google::protobuf::ShutdownProtobufLibrary();

temporal's avatar
temporal committed
101 102
  return 0;
}