xref: /aosp_15_r20/external/flatbuffers/grpc/samples/greeter/server.cpp (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker #include "greeter.grpc.fb.h"
2*890232f2SAndroid Build Coastguard Worker #include "greeter_generated.h"
3*890232f2SAndroid Build Coastguard Worker 
4*890232f2SAndroid Build Coastguard Worker #include <grpcpp/grpcpp.h>
5*890232f2SAndroid Build Coastguard Worker 
6*890232f2SAndroid Build Coastguard Worker #include <iostream>
7*890232f2SAndroid Build Coastguard Worker #include <memory>
8*890232f2SAndroid Build Coastguard Worker #include <string>
9*890232f2SAndroid Build Coastguard Worker 
10*890232f2SAndroid Build Coastguard Worker class GreeterServiceImpl final : public Greeter::Service {
SayHello(grpc::ServerContext * context,const flatbuffers::grpc::Message<HelloRequest> * request_msg,flatbuffers::grpc::Message<HelloReply> * response_msg)11*890232f2SAndroid Build Coastguard Worker   virtual grpc::Status SayHello(
12*890232f2SAndroid Build Coastguard Worker       grpc::ServerContext *context,
13*890232f2SAndroid Build Coastguard Worker       const flatbuffers::grpc::Message<HelloRequest> *request_msg,
14*890232f2SAndroid Build Coastguard Worker       flatbuffers::grpc::Message<HelloReply> *response_msg) override {
15*890232f2SAndroid Build Coastguard Worker     flatbuffers::grpc::MessageBuilder mb_;
16*890232f2SAndroid Build Coastguard Worker 
17*890232f2SAndroid Build Coastguard Worker     // We call GetRoot to "parse" the message. Verification is already
18*890232f2SAndroid Build Coastguard Worker     // performed by default. See the notes below for more details.
19*890232f2SAndroid Build Coastguard Worker     const HelloRequest *request = request_msg->GetRoot();
20*890232f2SAndroid Build Coastguard Worker 
21*890232f2SAndroid Build Coastguard Worker     // Fields are retrieved as usual with FlatBuffers
22*890232f2SAndroid Build Coastguard Worker     const std::string &name = request->name()->str();
23*890232f2SAndroid Build Coastguard Worker 
24*890232f2SAndroid Build Coastguard Worker     // `flatbuffers::grpc::MessageBuilder` is a `FlatBufferBuilder` with a
25*890232f2SAndroid Build Coastguard Worker     // special allocator for efficient gRPC buffer transfer, but otherwise
26*890232f2SAndroid Build Coastguard Worker     // usage is the same as usual.
27*890232f2SAndroid Build Coastguard Worker     auto msg_offset = mb_.CreateString("Hello, " + name);
28*890232f2SAndroid Build Coastguard Worker     auto hello_offset = CreateHelloReply(mb_, msg_offset);
29*890232f2SAndroid Build Coastguard Worker     mb_.Finish(hello_offset);
30*890232f2SAndroid Build Coastguard Worker 
31*890232f2SAndroid Build Coastguard Worker     // The `ReleaseMessage<T>()` function detaches the message from the
32*890232f2SAndroid Build Coastguard Worker     // builder, so we can transfer the resopnse to gRPC while simultaneously
33*890232f2SAndroid Build Coastguard Worker     // detaching that memory buffer from the builer.
34*890232f2SAndroid Build Coastguard Worker     *response_msg = mb_.ReleaseMessage<HelloReply>();
35*890232f2SAndroid Build Coastguard Worker     assert(response_msg->Verify());
36*890232f2SAndroid Build Coastguard Worker 
37*890232f2SAndroid Build Coastguard Worker     // Return an OK status.
38*890232f2SAndroid Build Coastguard Worker     return grpc::Status::OK;
39*890232f2SAndroid Build Coastguard Worker   }
40*890232f2SAndroid Build Coastguard Worker 
SayManyHellos(grpc::ServerContext * context,const flatbuffers::grpc::Message<ManyHellosRequest> * request_msg,grpc::ServerWriter<flatbuffers::grpc::Message<HelloReply>> * writer)41*890232f2SAndroid Build Coastguard Worker   virtual grpc::Status SayManyHellos(
42*890232f2SAndroid Build Coastguard Worker       grpc::ServerContext *context,
43*890232f2SAndroid Build Coastguard Worker       const flatbuffers::grpc::Message<ManyHellosRequest> *request_msg,
44*890232f2SAndroid Build Coastguard Worker       grpc::ServerWriter<flatbuffers::grpc::Message<HelloReply>> *writer)
45*890232f2SAndroid Build Coastguard Worker       override {
46*890232f2SAndroid Build Coastguard Worker     // The streaming usage below is simply a combination of standard gRPC
47*890232f2SAndroid Build Coastguard Worker     // streaming with the FlatBuffers usage shown above.
48*890232f2SAndroid Build Coastguard Worker     const ManyHellosRequest *request = request_msg->GetRoot();
49*890232f2SAndroid Build Coastguard Worker     const std::string &name = request->name()->str();
50*890232f2SAndroid Build Coastguard Worker     int num_greetings = request->num_greetings();
51*890232f2SAndroid Build Coastguard Worker 
52*890232f2SAndroid Build Coastguard Worker     for (int i = 0; i < num_greetings; i++) {
53*890232f2SAndroid Build Coastguard Worker       auto msg_offset = mb_.CreateString("Many hellos, " + name);
54*890232f2SAndroid Build Coastguard Worker       auto hello_offset = CreateHelloReply(mb_, msg_offset);
55*890232f2SAndroid Build Coastguard Worker       mb_.Finish(hello_offset);
56*890232f2SAndroid Build Coastguard Worker       writer->Write(mb_.ReleaseMessage<HelloReply>());
57*890232f2SAndroid Build Coastguard Worker     }
58*890232f2SAndroid Build Coastguard Worker 
59*890232f2SAndroid Build Coastguard Worker     return grpc::Status::OK;
60*890232f2SAndroid Build Coastguard Worker   }
61*890232f2SAndroid Build Coastguard Worker 
62*890232f2SAndroid Build Coastguard Worker   flatbuffers::grpc::MessageBuilder mb_;
63*890232f2SAndroid Build Coastguard Worker };
64*890232f2SAndroid Build Coastguard Worker 
RunServer()65*890232f2SAndroid Build Coastguard Worker void RunServer() {
66*890232f2SAndroid Build Coastguard Worker   std::string server_address("0.0.0.0:50051");
67*890232f2SAndroid Build Coastguard Worker   GreeterServiceImpl service;
68*890232f2SAndroid Build Coastguard Worker 
69*890232f2SAndroid Build Coastguard Worker   grpc::ServerBuilder builder;
70*890232f2SAndroid Build Coastguard Worker   builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
71*890232f2SAndroid Build Coastguard Worker   builder.RegisterService(&service);
72*890232f2SAndroid Build Coastguard Worker   std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
73*890232f2SAndroid Build Coastguard Worker   std::cerr << "Server listening on " << server_address << std::endl;
74*890232f2SAndroid Build Coastguard Worker 
75*890232f2SAndroid Build Coastguard Worker   server->Wait();
76*890232f2SAndroid Build Coastguard Worker }
77*890232f2SAndroid Build Coastguard Worker 
main(int argc,const char * argv[])78*890232f2SAndroid Build Coastguard Worker int main(int argc, const char *argv[]) {
79*890232f2SAndroid Build Coastguard Worker   RunServer();
80*890232f2SAndroid Build Coastguard Worker   return 0;
81*890232f2SAndroid Build Coastguard Worker }
82