Open Lighting Architecture  0.9.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
OlaServerServiceImpl.h
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This program 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
10  * GNU Library General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15  *
16  * OlaServerServiceImpl.h
17  * Implemtation of the OlaService interface
18  * Copyright (C) 2005 - 2008 Simon Newton
19  */
20 
21 #include <vector>
22 #include <string>
23 #include "common/protocol/Ola.pb.h"
24 #include "common/protocol/OlaService.pb.h"
25 #include "ola/Callback.h"
26 #include "ola/rdm/RDMCommand.h"
27 #include "ola/rdm/UID.h"
28 #include "olad/ClientBroker.h"
29 
30 #ifndef OLAD_OLASERVERSERVICEIMPL_H_
31 #define OLAD_OLASERVERSERVICEIMPL_H_
32 
33 namespace ola {
34 
35 
36 /*
37  * This class forms part of the core of the Server. It implements all the
38  * methods the clients can invoke on the server.o
39  *
40  * This class doesn't contain any client specific data, which means we only
41  * need to create one of them. Any client specific data is passed in
42  * per-method.
43  */
45  public:
46  OlaServerServiceImpl(class UniverseStore *universe_store,
47  class DeviceManager *device_manager,
48  class PluginManager *plugin_manager,
49  class ExportMap *export_map,
50  class PortManager *port_manager,
51  class ClientBroker *broker,
52  const class TimeStamp *wake_up_time,
53  const ola::rdm::UID &uid):
54  m_universe_store(universe_store),
55  m_device_manager(device_manager),
56  m_plugin_manager(plugin_manager),
57  m_export_map(export_map),
58  m_port_manager(port_manager),
59  m_broker(broker),
60  m_wake_up_time(wake_up_time),
61  m_uid(uid) {}
63 
64  void GetDmx(ola::rpc::RpcController* controller,
65  const ola::proto::UniverseRequest* request,
66  ola::proto::DmxData* response,
68  void RegisterForDmx(ola::rpc::RpcController* controller,
69  const ola::proto::RegisterDmxRequest* request,
70  ola::proto::Ack* response,
72  class Client *client);
73  void UpdateDmxData(ola::rpc::RpcController* controller,
74  const ola::proto::DmxData* request,
75  ola::proto::Ack* response,
77  class Client *client);
78  void StreamDmxData(ola::rpc::RpcController* controller,
79  const ::ola::proto::DmxData* request,
80  ::ola::proto::STREAMING_NO_RESPONSE* response,
82  class Client *client);
83  void SetUniverseName(ola::rpc::RpcController* controller,
84  const ola::proto::UniverseNameRequest* request,
85  ola::proto::Ack* response,
87  void SetMergeMode(ola::rpc::RpcController* controller,
88  const ola::proto::MergeModeRequest* request,
89  ola::proto::Ack* response,
91  void PatchPort(ola::rpc::RpcController* controller,
92  const ola::proto::PatchPortRequest* request,
93  ola::proto::Ack* response,
95  void SetPortPriority(ola::rpc::RpcController* controller,
96  const ola::proto::PortPriorityRequest* request,
97  ola::proto::Ack* response,
99  void GetUniverseInfo(ola::rpc::RpcController* controller,
100  const ola::proto::OptionalUniverseRequest* request,
101  ola::proto::UniverseInfoReply* response,
103  void GetPlugins(ola::rpc::RpcController* controller,
104  const ola::proto::PluginListRequest* request,
105  ola::proto::PluginListReply* response,
107  void GetPluginDescription(
108  ola::rpc::RpcController* controller,
109  const ola::proto::PluginDescriptionRequest* request,
110  ola::proto::PluginDescriptionReply* response,
112  void GetPluginState(
113  ola::rpc::RpcController* controller,
114  const ola::proto::PluginStateRequest* request,
115  ola::proto::PluginStateReply* response,
117  void GetDeviceInfo(ola::rpc::RpcController* controller,
118  const ola::proto::DeviceInfoRequest* request,
119  ola::proto::DeviceInfoReply* response,
121  void GetCandidatePorts(ola::rpc::RpcController* controller,
122  const ola::proto::OptionalUniverseRequest* request,
123  ola::proto::DeviceInfoReply* response,
125  void ConfigureDevice(ola::rpc::RpcController* controller,
126  const ola::proto::DeviceConfigRequest* request,
127  ola::proto::DeviceConfigReply* response,
129  void GetUIDs(ola::rpc::RpcController* controller,
130  const ola::proto::UniverseRequest* request,
131  ola::proto::UIDListReply* response,
133  void ForceDiscovery(ola::rpc::RpcController* controller,
134  const ola::proto::DiscoveryRequest* request,
135  ola::proto::UIDListReply* response,
137  void RDMCommand(ola::rpc::RpcController* controller,
138  const ::ola::proto::RDMRequest* request,
139  ola::proto::RDMResponse* response,
141  const ola::rdm::UID *uid,
142  class Client *client);
143  void RDMDiscoveryCommand(ola::rpc::RpcController* controller,
144  const ::ola::proto::RDMDiscoveryRequest* request,
145  ola::proto::RDMResponse* response,
147  const ola::rdm::UID *uid,
148  class Client *client);
149  void SetSourceUID(ola::rpc::RpcController* controller,
150  const ::ola::proto::UID* request,
151  ola::proto::Ack* response,
153 
154  void SendTimeCode(ola::rpc::RpcController* controller,
155  const ::ola::proto::TimeCode* request,
156  ::ola::proto::Ack* response,
158 
159  private:
160  void HandleRDMResponse(ola::proto::RDMResponse* response,
162  bool include_raw_packets,
163  ola::rdm::rdm_response_code code,
164  const ola::rdm::RDMResponse *rdm_response,
165  const std::vector<std::string> &packets);
166  void RDMDiscoveryComplete(unsigned int universe,
168  ola::proto::UIDListReply *response,
169  const ola::rdm::UIDSet &uids);
170 
171  void MissingUniverseError(ola::rpc::RpcController* controller);
172  void MissingPluginError(ola::rpc::RpcController* controller);
173  void MissingDeviceError(ola::rpc::RpcController* controller);
174  void MissingPortError(ola::rpc::RpcController* controller);
175 
176  void AddPlugin(class AbstractPlugin *plugin,
177  ola::proto::PluginInfo *plugin_info) const;
178  void AddDevice(class AbstractDevice *device,
179  unsigned int alias,
180  ola::proto::DeviceInfoReply* response) const;
181 
182  template <class PortClass>
183  void PopulatePort(const PortClass &port,
184  ola::proto::PortInfo *port_info) const;
185 
186  void SetProtoUID(const ola::rdm::UID &uid, ola::proto::UID *pb_uid);
187 
188  UniverseStore *m_universe_store;
189  DeviceManager *m_device_manager;
190  class PluginManager *m_plugin_manager;
191  class ExportMap *m_export_map;
192  class PortManager *m_port_manager;
193  class ClientBroker *m_broker;
194  const class TimeStamp *m_wake_up_time;
195  ola::rdm::UID m_uid;
196 };
197 
198 
199 /*
200  * This implements the client specific portion of the OlaServerService.
201  * In other words, it implements the methods that the clients can invoke on the
202  * server and holds the client data so the requests can be performed. It pretty
203  * much passes everything through to the OlaServerServiceImpl.
204  */
205 class OlaClientService: public ola::proto::OlaServerService {
206  public:
207  OlaClientService(class Client *client,
208  OlaServerServiceImpl *impl):
209  m_client(client),
210  m_impl(impl),
211  m_uid(NULL) {
212  }
213  ~OlaClientService();
214 
215  void GetDmx(ola::rpc::RpcController* controller,
216  const ola::proto::UniverseRequest* request,
217  ola::proto::DmxData* response,
219  m_impl->GetDmx(controller, request, response, done);
220  }
221 
222  void RegisterForDmx(ola::rpc::RpcController* controller,
223  const ola::proto::RegisterDmxRequest* request,
224  ola::proto::Ack* response,
226  m_impl->RegisterForDmx(controller, request, response, done, m_client);
227  }
228 
229  void UpdateDmxData(ola::rpc::RpcController* controller,
230  const ola::proto::DmxData* request,
231  ola::proto::Ack* response,
233  m_impl->UpdateDmxData(controller, request, response, done, m_client);
234  }
235 
236  void StreamDmxData(ola::rpc::RpcController* controller,
237  const ::ola::proto::DmxData* request,
238  ::ola::proto::STREAMING_NO_RESPONSE* response,
240  m_impl->StreamDmxData(controller, request, response, done, m_client);
241  }
242 
243  void SetUniverseName(ola::rpc::RpcController* controller,
244  const ola::proto::UniverseNameRequest* request,
245  ola::proto::Ack* response,
247  m_impl->SetUniverseName(controller, request, response, done);
248  }
249 
250  void SetMergeMode(ola::rpc::RpcController* controller,
251  const ola::proto::MergeModeRequest* request,
252  ola::proto::Ack* response,
254  m_impl->SetMergeMode(controller, request, response, done);
255  }
256 
257  void PatchPort(ola::rpc::RpcController* controller,
258  const ola::proto::PatchPortRequest* request,
259  ola::proto::Ack* response,
261  m_impl->PatchPort(controller, request, response, done);
262  }
263 
264  void SetPortPriority(ola::rpc::RpcController* controller,
265  const ola::proto::PortPriorityRequest* request,
266  ola::proto::Ack* response,
268  m_impl->SetPortPriority(controller, request, response, done);
269  }
270 
271  void GetUniverseInfo(ola::rpc::RpcController* controller,
272  const ola::proto::OptionalUniverseRequest* request,
273  ola::proto::UniverseInfoReply* response,
275  m_impl->GetUniverseInfo(controller, request, response, done);
276  }
277 
278  void GetPlugins(ola::rpc::RpcController* controller,
279  const ola::proto::PluginListRequest* request,
280  ola::proto::PluginListReply* response,
282  m_impl->GetPlugins(controller, request, response, done);
283  }
284 
285  void GetPluginDescription(
286  ola::rpc::RpcController* controller,
287  const ola::proto::PluginDescriptionRequest* request,
288  ola::proto::PluginDescriptionReply* response,
290  m_impl->GetPluginDescription(controller, request, response, done);
291  }
292 
293  void GetPluginState(
294  ola::rpc::RpcController* controller,
295  const ola::proto::PluginStateRequest* request,
296  ola::proto::PluginStateReply* response,
298  m_impl->GetPluginState(controller, request, response, done);
299  }
300 
301  void GetDeviceInfo(ola::rpc::RpcController* controller,
302  const ola::proto::DeviceInfoRequest* request,
303  ola::proto::DeviceInfoReply* response,
305  m_impl->GetDeviceInfo(controller, request, response, done);
306  }
307 
308  void GetCandidatePorts(ola::rpc::RpcController* controller,
309  const ola::proto::OptionalUniverseRequest* request,
310  ola::proto::DeviceInfoReply* response,
312  m_impl->GetCandidatePorts(controller, request, response, done);
313  }
314 
315  void ConfigureDevice(ola::rpc::RpcController* controller,
316  const ola::proto::DeviceConfigRequest* request,
317  ola::proto::DeviceConfigReply* response,
319  m_impl->ConfigureDevice(controller, request, response, done);
320  }
321 
322  void GetUIDs(ola::rpc::RpcController* controller,
323  const ola::proto::UniverseRequest* request,
324  ola::proto::UIDListReply* response,
326  m_impl->GetUIDs(controller, request, response, done);
327  }
328 
329  void ForceDiscovery(ola::rpc::RpcController* controller,
330  const ola::proto::DiscoveryRequest* request,
331  ola::proto::UIDListReply* response,
333  m_impl->ForceDiscovery(controller, request, response, done);
334  }
335 
336  void RDMCommand(ola::rpc::RpcController* controller,
337  const ::ola::proto::RDMRequest* request,
338  ola::proto::RDMResponse* response,
340  m_impl->RDMCommand(controller, request, response, done, m_uid, m_client);
341  }
342 
343  void RDMDiscoveryCommand(ola::rpc::RpcController* controller,
344  const ::ola::proto::RDMDiscoveryRequest* request,
345  ola::proto::RDMResponse* response,
347  m_impl->RDMDiscoveryCommand(controller, request, response, done, m_uid,
348  m_client);
349  }
350 
351  void SetSourceUID(ola::rpc::RpcController* controller,
352  const ::ola::proto::UID* request,
353  ola::proto::Ack* response,
355 
356  void SendTimeCode(ola::rpc::RpcController* controller,
357  const ::ola::proto::TimeCode* request,
358  ::ola::proto::Ack* response,
360  m_impl->SendTimeCode(controller, request, response, done);
361  }
362 
363  Client *GetClient() const { return m_client; }
364 
365  private:
366  class Client *m_client;
367  OlaServerServiceImpl *m_impl;
368  ola::rdm::UID *m_uid;
369 };
370 
371 
376  public:
377  OlaClientService *New(Client *client, OlaServerServiceImpl *impl);
378 };
379 } // namespace ola
380 #endif // OLAD_OLASERVERSERVICEIMPL_H_