Add more grpc - Asyncstuff
[src/agl-compositor.git] / clients / grpc-async-cb.cpp
1 #include <cstdio>
2 #include <ctime>
3 #include <algorithm>
4 #include <queue>
5
6 #include <grpc/grpc.h>
7 #include <grpcpp/grpcpp.h>
8 #include <grpcpp/server.h>
9 #include <grpcpp/server_builder.h>
10 #include <grpcpp/server_context.h>
11
12 #include <grpcpp/ext/proto_server_reflection_plugin.h>
13 #include <grpcpp/health_check_service_interface.h>
14
15 #include "log.h"
16 #include "agl_shell.grpc.pb.h"
17 #include "grpc-async-cb.h"
18
19 Lister::Lister(Shell *shell) : m_shell(shell)
20 {
21         // don't call NextWrite() just yet we do it explicitly when getting
22         // the events from the compositor
23 }
24
25 void
26 Lister::OnDone()
27 {
28         delete this;
29 }
30
31 void Lister::OnWriteDone(bool ok)
32 {
33         LOG("ok %d\n", ok);
34         if (ok) {
35                 // normally we should finish here, but we don't do that to keep
36                 // the channel open
37                 //Finish(grpc::Status::OK);
38         }
39 }
40
41 void 
42 Lister::NextWrite(void)
43 {
44         // we're going to have a Lister instance per client so we're safe here
45         StartWrite(&m_shell->m_shell_data->current_app_state);
46 }
47
48 grpc::ServerUnaryReactor *
49 GrpcServiceImpl::ActivateApp(grpc::CallbackServerContext *context,
50                             const ::agl_shell_ipc::ActivateRequest* request,
51                             google::protobuf::Empty* /*response*/)
52 {
53         LOG("activating app %s on output %s\n", request->app_id().c_str(),
54                                                 request->output_name().c_str());
55
56         m_aglShell->ActivateApp(request->app_id(), request->output_name());
57
58         grpc::ServerUnaryReactor* reactor = context->DefaultReactor();
59         reactor->Finish(grpc::Status::OK);
60         return reactor;
61 }
62
63 grpc::ServerUnaryReactor *
64 GrpcServiceImpl::DeactivateApp(grpc::CallbackServerContext *context,
65                               const ::agl_shell_ipc::DeactivateRequest* request,
66                               google::protobuf::Empty* /*response*/)
67 {
68         m_aglShell->DeactivateApp(request->app_id());
69
70         grpc::ServerUnaryReactor* reactor = context->DefaultReactor();
71         reactor->Finish(grpc::Status::OK);
72         return reactor;
73 }
74
75 grpc::ServerUnaryReactor *
76 GrpcServiceImpl::SetAppFloat(grpc::CallbackServerContext *context,
77                             const ::agl_shell_ipc::FloatRequest* request,
78                             google::protobuf::Empty* /* response */)
79 {
80         m_aglShell->SetAppFloat(request->app_id());
81
82         grpc::ServerUnaryReactor* reactor = context->DefaultReactor();
83         reactor->Finish(grpc::Status::OK);
84         return reactor;
85 }
86
87 grpc::ServerUnaryReactor *
88 GrpcServiceImpl::SetAppSplit(grpc::CallbackServerContext *context,
89            const ::agl_shell_ipc::SplitRequest* request,
90            google::protobuf::Empty* /*response*/)
91 {
92         m_aglShell->SetAppSplit(request->app_id(), request->tile_orientation());
93
94         grpc::ServerUnaryReactor* reactor = context->DefaultReactor();
95         reactor->Finish(grpc::Status::OK);
96         return reactor;
97 }
98
99 grpc::ServerWriteReactor<::agl_shell_ipc::AppState>*
100 GrpcServiceImpl::AppStatusState(grpc::CallbackServerContext* context,
101                                  const google::protobuf::Empty*)
102 {
103
104         Lister *n = new Lister(m_aglShell);
105
106         m_aglShell->m_shell_data->server_context_list.push_back(std::pair(context, n));
107         LOG("added lister %p\n", static_cast<void *>(n));
108
109         // just return  a Lister to keep the channel open
110         return n;
111 }