main.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include <iostream>
  2. #include <vector>
  3. #include <grpc++/grpc++.h>
  4. #include "addressbook.pb.h"
  5. #include "addressbook.grpc.pb.h"
  6. using namespace ::qtprotobuf::examples;
  7. class ContactsHandler;
  8. class AddressBookService final : public AddressBook::WithAsyncMethod_contacts<AddressBook::Service> {
  9. public:
  10. Contacts m_contacts;
  11. std::vector<::grpc::ServerAsyncWriter<Contacts> *> m_clients;
  12. AddressBookService(): m_clients({}) {
  13. Contact* contact = m_contacts.add_list();
  14. contact->set_firstname("John");
  15. contact->set_lastname("Doe");
  16. contact = m_contacts.add_list();
  17. contact->set_firstname("Jane");
  18. contact->set_lastname("Doe");
  19. contact = m_contacts.add_list();
  20. contact->set_firstname("John");
  21. contact->set_lastname("McClane");
  22. contact = m_contacts.add_list();
  23. contact->set_firstname("Alexey");
  24. contact->set_lastname("Edelev");
  25. contact = m_contacts.add_list();
  26. contact->set_firstname("Ebenezer");
  27. contact->set_lastname("Scrooge");
  28. Job *job = new Job;
  29. job->set_title("Job title");
  30. contact->set_allocated_job(job);
  31. PhoneNumber *home = (*contact->mutable_phones()).Add();
  32. home->set_countrycode(49);
  33. home->set_number(12324534679);
  34. }
  35. ~AddressBookService() {}
  36. void updateContacts() {
  37. for(int i = 0; i < (m_clients.size() - 1); i++) {
  38. m_clients[i]->Write(m_contacts, nullptr);
  39. }
  40. }
  41. void registerWriter(ContactsHandler *handler);
  42. ::grpc::Status addContact(::grpc::ServerContext* context, const Contact* request, Contacts* response) override
  43. {
  44. std::cout << "addContact called" << std::endl;
  45. Contact* newContact = m_contacts.add_list();
  46. *newContact = *request;
  47. *response = m_contacts;
  48. updateContacts();
  49. return ::grpc::Status();
  50. }
  51. ::grpc::Status removeContact(::grpc::ServerContext* context, const Contact* request, Contacts* response) override
  52. {
  53. std::cout << "removeContact called" << std::endl;
  54. updateContacts();
  55. return ::grpc::Status(::grpc::UNIMPLEMENTED, "Unimplemented");
  56. }
  57. ::grpc::Status makeCall(::grpc::ServerContext* context, const Contact* request, SimpleResult* response) override
  58. {
  59. std::cout << "makeCall called" << std::endl;
  60. return ::grpc::Status(::grpc::UNIMPLEMENTED, "Unimplemented");
  61. }
  62. ::grpc::Status navigateTo(::grpc::ServerContext* context, const Address* request, SimpleResult* response) override
  63. {
  64. std::cout << "navigateTo called" << std::endl;
  65. return ::grpc::Status(::grpc::UNIMPLEMENTED, "Unimplemented");
  66. }
  67. };
  68. class ContactsHandler {
  69. public:
  70. ContactsHandler(AddressBookService* service, ::grpc::ServerCompletionQueue* cq) : tag_(0xdeadbeef)
  71. , writer_(&ctx_)
  72. , cq_(cq)
  73. {
  74. service->Requestcontacts(&ctx_, &request_, &writer_, cq_, cq_, &tag_);
  75. service->registerWriter(this);
  76. }
  77. int tag_;
  78. grpc::ServerContext ctx_;
  79. ListFrame request_;
  80. ::grpc::ServerAsyncWriter< ::qtprotobuf::examples::Contacts> writer_;
  81. ::grpc::ServerCompletionQueue* cq_;
  82. };
  83. void AddressBookService::registerWriter(ContactsHandler *handler) {
  84. m_clients.push_back(&(handler->writer_));
  85. }
  86. int main(int argc, char *argv[])
  87. {
  88. std::string server_address("localhost:65001");
  89. AddressBookService service;
  90. grpc::ServerBuilder builder;
  91. builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
  92. builder.RegisterService(&service);
  93. std::unique_ptr<grpc::ServerCompletionQueue> cq = builder.AddCompletionQueue();
  94. std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
  95. std::cout << "Server listening on " << server_address << std::endl;
  96. ContactsHandler *last = new ContactsHandler(&service, cq.get());
  97. while (true) {
  98. int *tag;
  99. bool ok;
  100. cq->Next((void**)&tag, &ok);
  101. if (tag == nullptr) {
  102. continue;
  103. }
  104. if ((*tag) == 0xdeadbeef) {
  105. last->writer_.Write(service.m_contacts, nullptr);
  106. last = new ContactsHandler(&service, cq.get());
  107. }
  108. }
  109. }