C++ Client  0.0.0.0
C++ wrapper for Corelink DLL
CorelinkClient.h
Go to the documentation of this file.
1 
5 #ifndef CORELINKCLIENT_H
6 #define CORELINKCLIENT_H
7 #pragma once
8 
9 #include "CorelinkClasses.h"
10 #include "CorelinkException.h"
11 #include "CorelinkConst.h"
12 
13 namespace Corelink {
14  inline bool isActive() {
15  return CorelinkDLL::getClientState();
16  }
17 
18  inline std::vector<std::string> Client::getCommResponseDataHelper(char* data) {
19  std::vector<std::string> dataParsed;
20  int* dataCast;
21  int lenHeader;
22  int lenData;
23  dataCast = (int*) data;
24  dataParsed = std::vector<std::string>();
25  dataParsed.resize(dataCast[0]);
26  lenHeader = (dataCast[0] + 1) * sizeof(int);
27  lenData = 0;
28  for (int i = 0; i < dataCast[0]; ++i) {
29  dataParsed[i] = std::string(data + lenHeader + lenData, dataCast[i + 1]);
30  lenData += dataCast[i + 1];
31  }
32  dataCast = nullptr;
33  return dataParsed;
34  }
35 
36  inline std::vector<std::string> Client::getCommResponseData(const int& commID) {
37  int responseLen;
38  char* responseMsg;
39  std::vector<std::string> data;
40  #ifdef WRAPPER_ALLOC
41  responseLen = CorelinkDLL::getCommDataLen(commID);
42  responseMsg = new char[responseLen];
43  CorelinkDLL::getCommDataStr(commID, responseMsg);
44  data = getCommResponseDataHelper(responseMsg);
45  delete[] responseMsg;
46  return data;
47  #else
48  responseMsg = CorelinkDLL::getCommData(commID, responseLen);
49  data = getCommResponseDataHelper(responseMsg);
50  CorelinkDLL::freeData(responseMsg);
51  return data;
52  #endif
53  }
54 
55  inline const char** Client::vecStringToCharArray(const std::vector<std::string>& vec) {
56  const char** data = new const char*[vec.size()];
57  for (int i = 0; i < vec.size();++i) {
58  data[i] = vec[i].c_str();
59  }
60  return data;
61  }
62 
63  // TODO: replace some logic with StreamData.parse
64  // Look at StreamData.getStreamData for reference
65  inline StreamData Client::getDataStreamInfo(int& commID) {
66  std::vector<std::string> dataOut;
67  dataOut = getCommResponseData(commID);
68 
69  int streamID = *(STREAM_ID*)dataOut[0].c_str();
70  int streamRef = CorelinkDLL::getStreamRef(streamID);
71 
72  return StreamData(streamID, *((int*)dataOut[1].c_str()), *((int*)dataOut[2].c_str()), dataOut[3], dataOut[4], dataOut[5], streamRef, std::vector<std::string>(dataOut.begin() + 6, dataOut.end()));
73  }
74 
75  inline void Client::connect(const std::string& serverIP, int port) {
76  int errorID;
77  CorelinkDLL::corelinkConnect(serverIP.c_str(), port, errorID);
78  CorelinkException::GetDLLException(errorID);
79  }
80 
81  inline void Client::connectPlugin() {
82  int errorID;
83  CorelinkDLL::corelinkConnectPlugin(errorID);
84  CorelinkException::GetDLLException(errorID);
85  }
86 
87  inline void Client::cleanup() {
88  if (!CorelinkDLL::getClientState()) { return; }
89  std::vector<int> streams = StreamData::listClientStreams();
90  // clear out on recv callbacks to avoid memory leaks.
91  for (std::size_t i = 0; i < streams.size(); ++i) {
92  if (StreamData::isReceiver(streams[i])) {
94  }
95  }
96 
97  CorelinkDLL::corelinkCleanup();
98  }
99 
104  inline std::string Client::getToken() {
105  char* data;
106  std::string token;
107  int len;
108  #ifdef WRAPPER_ALLOC
109  len = CorelinkDLL::getTokenLen();
110  if (len == 0) { return ""; }
111  data = new char[len];
112  CorelinkDLL::getTokenStr(data);
113  token = std::string(data, len);
114  delete[] data;
115  return token;
116  #else
117  data = CorelinkDLL::getToken(len);
118  token = std::string(data, len);
119  CorelinkDLL::freeData(data);
120  return token;
121  #endif
122  }
123 
124  inline std::vector<std::string> Client::listServerFunctions() {
125  int commID, errorID;
126  CorelinkDLL::commListFunctions(commID, errorID);
127  CorelinkException::GetDLLException(errorID);
128  return getCommResponseData(commID);
129  }
130 
131  inline std::vector<std::string> Client::describeServerFunction(const std::string& func) {
132  int commID, errorID;
133  std::vector<std::string> data;
134  CorelinkDLL::commGetFunctionInfo(func.c_str(), commID, errorID);
135  CorelinkException::GetDLLException(errorID);
136  data = getCommResponseData(commID);
137  return data;
138  }
139 
140  inline std::vector<std::string> Client::listWorkspaces() {
141  int commID, errorID;
142  CorelinkDLL::commListWorkspaces(commID, errorID);
143  CorelinkException::GetDLLException(errorID);
144  return getCommResponseData(commID);
145  }
146 
147  inline bool Client::addWorkspace(const std::string& workspace) {
148  return CorelinkDLL::commAddWorkspace(workspace.c_str());
149  }
150 
151  inline bool Client::rmWorkspace(const std::string& workspace) {
152  return CorelinkDLL::commRmWorkspace(workspace.c_str());
153  }
154 
155  inline rapidjson::Document Client::genericComm(const rapidjson::Document& json) {
156  rapidjson::Document res = rapidjson::Document();
157  rapidjson::StringBuffer buffer;
158  rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
159  int commID, errorID;
160  std::string jsonStr;
161 
162  res.SetObject();
163  if (!json.IsObject()) {
164  return res;
165  }
166 
167  json.Accept(writer);
168  jsonStr = buffer.GetString();
169  CorelinkDLL::commGeneric(jsonStr.c_str(), (int) jsonStr.size(), commID, errorID);
170  CorelinkException::GetDLLException(errorID);
171  jsonStr = getCommResponseData(commID)[0];
172  res.Parse(jsonStr.c_str(), jsonStr.size());
173  return res;
174  }
175 
176  inline rapidjson::Document Client::genericComm(const std::string& json) {
177  rapidjson::Document res = rapidjson::Document();
178  int commID, errorID;
179  std::string jsonStr;
180  CorelinkDLL::commGeneric(json.c_str(), (int) json.size(), commID, errorID);
181  CorelinkException::GetDLLException(errorID);
182  jsonStr = getCommResponseData(commID)[0];
183 
184  res.SetObject();
185  res.Parse(jsonStr.c_str(), jsonStr.size());
186  return res;
187  }
188 
189  inline rapidjson::Document Client::genericComm(const char* json, const int& len) {
190  rapidjson::Document res = rapidjson::Document();
191  int commID, errorID;
192  std::string jsonStr;
193  CorelinkDLL::commGeneric(json, len, commID, errorID);
194  CorelinkException::GetDLLException(errorID);
195  jsonStr = getCommResponseData(commID)[0];
196 
197  res.SetObject();
198  res.Parse(jsonStr.c_str(), jsonStr.size());
199  return res;
200  }
201 
202  inline std::vector<int> Client::listStreams(const std::vector<std::string>& workspaces, const std::vector<std::string>& types) {
203  int commID, errorID;
204  std::vector<std::string> response;
205  std::vector<int> data;
206  const char** dataWorkspaces = vecStringToCharArray(workspaces);
207  const char** dataTypes = vecStringToCharArray(types);
208  CorelinkDLL::commListStreams(dataWorkspaces, (int) workspaces.size(), dataTypes, (int) types.size(), commID, errorID);
209  delete[] dataWorkspaces;
210  delete[] dataTypes;
211  CorelinkException::GetDLLException(errorID);
212  response = getCommResponseData(commID);
213  data.resize(response.size());
214  for (int i = 0; i < response.size(); ++i) {
215  data[i] = *((int*)response[i].c_str());
216  }
217  return data;
218  }
219 
220  inline StreamData Client::streamInfo(const int& streamID) {
221  int commID, errorID;
222  CorelinkDLL::commGetStreamInfo(streamID, commID, errorID);
223  CorelinkException::GetDLLException(errorID);
224  return getDataStreamInfo(commID);
225  }
226 
227  inline SendStream Client::createSender(const std::string& workspace, const std::string& type, const std::string& meta, bool echo, bool alert, int protocol) {
228  int commID, errorID;
229  CorelinkDLL::commAddSender(workspace.c_str(), type.c_str(), meta.c_str(), echo, alert, protocol, commID, errorID);
230  CorelinkException::GetDLLException(errorID);
231  return SendStream(getDataStreamInfo(commID));
232  }
233 
234  inline RecvStream Client::createReceiver(const std::string& workspace, const std::vector<std::string>& types, const std::string& meta, bool echo, bool alert, int protocol) {
235  int commID, errorID;
236  const char** typeData = vecStringToCharArray(types);
237  CorelinkDLL::commAddReceiver(workspace.c_str(), typeData, (int) types.size(), meta.c_str(), echo, alert, protocol, commID, errorID);
238  CorelinkException::GetDLLException(errorID);
239  return RecvStream(getDataStreamInfo(commID));
240  }
241 
242  inline bool Client::subscribe(const STREAM_ID& receiverID, const STREAM_ID& senderID) {
243  bool output = CorelinkDLL::commSubscribe(receiverID, senderID);
244  return output;
245  }
246 
247  inline bool Client::unsubscribe(const STREAM_ID& receiverID, const STREAM_ID& senderID) {
248  bool output = CorelinkDLL::commUnsubscribe(receiverID, senderID);
249  return output;
250  }
251 
252  inline bool Client::rmStream(const STREAM_ID& streamID) {
253  bool output = CorelinkDLL::commDisconnect(streamID);
254  return output;
255  }
256 }
257 
258 #endif