Open Lighting Architecture 0.10.9
Loading...
Searching...
No Matches
RpcChannel.h
1/*
2 * This library is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU Lesser General Public
4 * License as published by the Free Software Foundation; either
5 * version 2.1 of the License, or (at your option) any later version.
6 *
7 * This library is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 * Lesser General Public License for more details.
11 *
12 * You should have received a copy of the GNU Lesser General Public
13 * License along with this library; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15 *
16 * RpcChannel.h
17 * The RPC Channel
18 * Copyright (C) 2005 Simon Newton
19 */
20
21#ifndef COMMON_RPC_RPCCHANNEL_H_
22#define COMMON_RPC_RPCCHANNEL_H_
23
24#if HAVE_CONFIG_H
25#include <config.h>
26#endif // HAVE_CONFIG_H
27
28#include <stdint.h>
29#include <google/protobuf/service.h>
30#include <ola/Callback.h>
31#include <ola/io/Descriptor.h>
32#include <ola/util/SequenceNumber.h>
33#include <memory>
34
35#include "ola/ExportMap.h"
36
37#include HASH_MAP_H
38
39namespace ola {
40namespace rpc {
41
42class RpcMessage;
43class RpcService;
44
52 public :
60
70 RpcChannel(RpcService *service,
72 ExportMap *export_map = NULL);
73
78
83 void SetService(RpcService *service) { m_service = service; }
84
91 bool PendingRPCs() const { return !m_requests.empty(); }
92
96 void DescriptorReady();
97
110
114 void CallMethod(const google::protobuf::MethodDescriptor *method,
115 class RpcController *controller,
116 const google::protobuf::Message *request,
117 google::protobuf::Message *response,
119
125 void RequestComplete(class OutstandingRequest *request);
126
132
136 static const unsigned int PROTOCOL_VERSION = 1;
137
138 private:
139 typedef HASH_NAMESPACE::HASH_MAP_CLASS<int, class OutstandingResponse*>
140 ResponseMap;
141
142 std::auto_ptr<RpcSession> m_session;
143 RpcService *m_service; // service to dispatch requests to
144 std::auto_ptr<CloseCallback> m_on_close;
145 // the descriptor to read/write to.
146 class ola::io::ConnectedDescriptor *m_descriptor;
147 SequenceNumber<uint32_t> m_sequence;
148 uint8_t *m_buffer; // buffer for incoming msgs
149 unsigned int m_buffer_size; // size of the buffer
150 unsigned int m_expected_size; // the total size of the current msg
151 unsigned int m_current_size; // the amount of data read for the current msg
152 HASH_NAMESPACE::HASH_MAP_CLASS<int, class OutstandingRequest*> m_requests;
153 ResponseMap m_responses;
154 ExportMap *m_export_map;
155 UIntMap *m_recv_type_map;
156
157 bool SendMsg(RpcMessage *msg);
158 int AllocateMsgBuffer(unsigned int size);
159 int ReadHeader(unsigned int *version, unsigned int *size) const;
160 bool HandleNewMsg(uint8_t *buffer, unsigned int size);
161 void HandleRequest(RpcMessage *msg);
162 void HandleStreamRequest(RpcMessage *msg);
163
164 // server end
165 void SendRequestFailed(class OutstandingRequest *request);
166 void SendNotImplemented(int msg_id);
167 void DeleteOutstandingRequest(class OutstandingRequest *request);
168
169 // client end
170 void HandleResponse(RpcMessage *msg);
171 void HandleFailedResponse(RpcMessage *msg);
172 void HandleCanceledResponse(RpcMessage *msg);
173 void HandleNotImplemented(RpcMessage *msg);
174
175 void HandleChannelClose();
176
177 static const char K_RPC_RECEIVED_TYPE_VAR[];
178 static const char K_RPC_RECEIVED_VAR[];
179 static const char K_RPC_SENT_ERROR_VAR[];
180 static const char K_RPC_SENT_VAR[];
181 static const char *K_RPC_VARIABLES[];
182 static const char STREAMING_NO_RESPONSE[];
183 static const unsigned int INITIAL_BUFFER_SIZE = 1 << 11; // 2k
184 static const unsigned int MAX_BUFFER_SIZE = 1 << 20; // 1M
185};
186} // namespace rpc
187} // namespace ola
188#endif // COMMON_RPC_RPCCHANNEL_H_
Export variables on the http server.
A container for the exported variables.
Definition ExportMap.h:324
SequenceNumber, this ensures that we increment the sequence number whenever we go to use it.
Definition SequenceNumber.h:30
A 0 argument callback which deletes itself after it's run.
Definition Callback.h:141
A 1 argument callback which deletes itself after it's run.
Definition Callback.h:1004
Definition ExportMap.h:242
A BidirectionalFileDescriptor that also generates notifications when closed.
Definition Descriptor.h:283
Definition RpcChannel.cpp:61
The RPC channel used to communicate between the client and the server. This implementation runs over ...
Definition RpcChannel.h:51
RpcSession * Session()
Return the RpcSession associated with this channel.
Definition RpcChannel.cpp:276
void RequestComplete(class OutstandingRequest *request)
Invoked by the RPC completion handler when the server side response is ready.
Definition RpcChannel.cpp:259
~RpcChannel()
Destructor.
Definition RpcChannel.cpp:138
SingleUseCallback1< void, class RpcSession * > CloseCallback
The callback to run when the channel is closed.
Definition RpcChannel.h:59
static const unsigned int PROTOCOL_VERSION
the RPC protocol version.
Definition RpcChannel.h:136
void CallMethod(const google::protobuf::MethodDescriptor *method, class RpcController *controller, const google::protobuf::Message *request, google::protobuf::Message *response, SingleUseCallback0< void > *done)
Invoke an RPC method on this channel.
Definition RpcChannel.cpp:205
void SetChannelCloseHandler(CloseCallback *callback)
Set the Callback to be run when the channel fails. The callback will be invoked if the descriptor is ...
Definition RpcChannel.cpp:201
RpcChannel(RpcService *service, ola::io::ConnectedDescriptor *descriptor, ExportMap *export_map=NULL)
Create a new RpcChannel.
Definition RpcChannel.cpp:109
bool PendingRPCs() const
Check if there are any pending RPCs on the channel. Pending RPCs are those where a request has been s...
Definition RpcChannel.h:91
void DescriptorReady()
Called when new data arrives on the descriptor.
Definition RpcChannel.cpp:142
void SetService(RpcService *service)
Set the Service to use to handle incoming requests.
Definition RpcChannel.h:83
A RpcController object is passed every time an RPC is invoked and is used to indicate the success or ...
Definition RpcController.h:42
Definition RpcService.h:35
Represents the RPC session between a client and server.
Definition RpcSession.h:45
The namespace containing all OLA symbols.
Definition Credentials.cpp:44