C++ Client  0.0.0.0
C++ wrapper for Corelink DLL
CorelinkClasses.h
Go to the documentation of this file.
1 
5 #ifndef CORELINKCLASSES_H
6 #define CORELINKCLASSES_H
7 #pragma once
8 
9 #include "CorelinkConst.h"
10 #include <stdexcept>
11 
12 namespace Corelink {
13  class CorelinkException;
14  class DLLInit;
15  class Client;
16  class StreamData;
17  class SendStream;
18  class RecvStream;
19  class Callback;
20  class RecvData;
21 }
22 
23 namespace Corelink {
24  class CorelinkException : public std::runtime_error {
25  friend class DLLInit;
26  friend class Client;
27  friend class StreamData;
28  friend class SendStream;
29  friend class RecvStream;
30  private:
31  CorelinkException(const std::string& msg, const int& code);
32 
38  static void GetDLLException(const unsigned int errorID);
39  public:
42  CorelinkException& operator=(const CorelinkException& rhs) = delete;
43 
45  const std::string msg;
47  const int code;
48  };
49 }
50 
51 namespace Corelink {
52  class DLLInit {
53  private:
54  DLLInit() = delete;
55  ~DLLInit() = delete;
56  public:
60  static void Init();
61 
66  static int getInitState();
67 
73  static void setInitState(int state);
74 
79  static std::string getLocalCertPath();
80 
86  static void setLocalCertPath(const char* path, int len);
87 
92  static void setLocalCertPath(const std::string& path);
93 
98  static std::string getServerCertPath();
99 
105  static void setServerCertPath(const char* path, int len);
106 
111  static void setServerCertPath(const std::string& path);
112 
118  static void setServerCredentials(const std::string& username, const std::string& password);
119 
127  static void setOnDrop(void(*func)(const STREAM_ID&));
128 
136  static void setOnStale(void(*func)(const STREAM_ID&));
137 
145  static void setOnSubscribe(void(*func)(const STREAM_ID&, const STREAM_ID&));
146 
154  static void setOnUpdate(void(*func)(const STREAM_ID&, const STREAM_ID&));
155  };
156 }
157 
158 namespace Corelink {
159  class Client {
160  private:
161  Client() = delete;
162  ~Client() = delete;
163 
167  static bool isActive();
168 
174  static std::vector<std::string> getCommResponseDataHelper(char* data);
175 
181  static std::vector<std::string> getCommResponseData(const int& commID);
182 
188  static const char** vecStringToCharArray(const std::vector<std::string>& vec);
189 
193  static StreamData getDataStreamInfo(int& commID);
194  public:
203  static void connect(const std::string& serverIP, int port);
204 
214  static void connectPlugin();
215 
219  static void cleanup();
220 
225  static std::string getToken();
226 
231  static std::vector<std::string> listServerFunctions();
232 
239  static std::vector<std::string> describeServerFunction(const std::string& func);
240 
245  static std::vector<std::string> listWorkspaces();
246 
252  static bool addWorkspace(const std::string& workspace);
253 
259  static bool rmWorkspace(const std::string& workspace);
260 
265  static rapidjson::Document genericComm(const rapidjson::Document& json);
266 
271  static rapidjson::Document genericComm(const std::string& json);
272 
278  static rapidjson::Document genericComm(const char* json, const int& len = 0);
279 
286  static std::vector<int> listStreams(const std::vector<std::string>& workspaces = {}, const std::vector<std::string>& types = {});
287 
293  static StreamData streamInfo(const int& streamID);
294 
305  static SendStream createSender(const std::string& workspace, const std::string& type, const std::string& meta, bool echo, bool alert, int protocol);
306 
317  static RecvStream createReceiver(const std::string& workspace, const std::vector<std::string>& types, const std::string& meta, bool echo, bool alert, int protocol);
318 
326  static bool subscribe(const STREAM_ID& receiverID, const STREAM_ID& senderID);
327 
335  static bool unsubscribe(const STREAM_ID& receiverID, const STREAM_ID& senderID);
336 
341  static bool rmStream(const STREAM_ID& streamID);
342  };
343 }
344 
345 namespace Corelink {
346  class StreamData {
347  friend class Client;
348  friend class DLLInit;
349  friend class Client;
350  friend class StreamData;
351  friend class SendStream;
352  friend class RecvStream;
353  private:
355  int streamRef;
356 
361  typedef void(*RecvFunc)(const STREAM_ID&, const STREAM_ID&, const char*, const int&);
362 
363  public:
364  // TODO: move the data to private instead of public and implement getters.
365  // Might not be necessary since this is readonly data from the dll.
366 
368  int streamID;
370  int state;
372  int mtu;
374  std::string user;
376  std::string workspace;
378  std::string meta;
380  std::vector<std::string> type;
381  private:
382  StreamData(const int& streamID, const int& state, const int& mtu, const std::string& user, const std::string& workspace, const std::string& meta, int streamRef, const std::vector<std::string>& type);
383 
384  public:
385  StreamData();
386  ~StreamData();
387  StreamData(const StreamData& rhs);
388  StreamData& operator=(const StreamData& rhs);
389  friend std::ostream& operator<<(std::ostream& os, const StreamData& rhs);
390 
391  static StreamData parse(const char* data);
392 
397  bool isSender() const;
398 
405  static bool isSender(const STREAM_ID& streamID);
406 
411  bool isReceiver() const;
412 
419  static bool isReceiver(const STREAM_ID& streamID);
420 
427  static StreamData getStreamData(const STREAM_ID& streamID);
428 
435  static SendStream getSenderHandler(const STREAM_ID& streamID);
436 
443  static RecvStream getReceiverHandler(const STREAM_ID& streamID);
444 
449  static std::vector<STREAM_ID> listClientStreams();
450 
455  static std::vector<STREAM_ID> listStreamSources(const STREAM_ID& streamID);
456 
457  };
458 }
459 
460 // TODO: determine which members should be const
461 namespace Corelink {
462  class SendStream {
463  friend class StreamData;
464  private:
466  STREAM_ID streamID;
468  int streamRef;
470  int state;
471  public:
472  private:
473  SendStream(const STREAM_ID& streamID = STREAM_DEF, int state = Const::STREAM_STATE_NONE, int streamRef = -1);
474  public:
475  SendStream(const StreamData& streamData);
476  SendStream(const SendStream& rhs);
477  SendStream(SendStream&& rhs);
478  SendStream& operator=(const SendStream& rhs);
479 
480  operator STREAM_ID() const;
481  private:
482  public:
491  bool send(const std::string& msg, const int& federationID = 0);
492 
503  bool send(const std::string& msg, const rapidjson::Document& json, bool serverCheck = false, const int& federationID = 0);
504 
514  bool send(const char* msg, int msgLen, const int& federationID = 0);
515 
527  bool send(const char* msg, int msgLen, const rapidjson::Document& json, bool serverCheck = false, const int& federationID = 0);
528  };
529 }
530 
531 namespace Corelink {
532  class RecvStream {
533  friend class StreamData;
534  private:
536  STREAM_ID streamID;
538  int streamRef;
540  int state;
541  public:
542  private:
543  RecvStream(const STREAM_ID& streamID = STREAM_DEF, int state = Const::STREAM_STATE_NONE, int streamRef = -1);
544  public:
545  RecvStream(const StreamData& streamData);
546  RecvStream(const RecvStream& rhs);
547  RecvStream(RecvStream&& rhs);
548  RecvStream& operator=(const RecvStream& rhs);
549 
550  operator STREAM_ID() const;
551  private:
552  public:
556  void setOnReceive();
557 
565  void setOnReceive(void(*func)(const STREAM_ID&, const STREAM_ID&, const char*, const int&));
566 
575  void setOnReceive(void(*func)(void*, const STREAM_ID&, const STREAM_ID&, const char*, const int&), void* obj);
576 
585  void setOnReceive(void(*func)(const STREAM_ID&, const STREAM_ID&, const char*, const int&, const rapidjson::Document&));
586 
596  void setOnReceive(void(*func)(void*, const STREAM_ID&, const STREAM_ID&, const char*, const int&, const rapidjson::Document&), void* obj);
597 
598  std::vector<STREAM_ID> listSources();
599  };
600 }
601 
602 namespace Corelink {
603  class Callback {
604  public:
605  virtual ~Callback() = default;
606 
607  virtual void Func(const RecvData& recvData) = 0;
608 
609  static void RecvCallback(STREAM_ID recvID, STREAM_ID sendID, const char* msg, int jsonLen, int msgLen, void* callback);
610  };
611 
612  class CallbackData : public Callback {
613  public:
621  void(*func)(const STREAM_ID&, const STREAM_ID&, const char*, const int&);
622 
623  CallbackData(void(*func)(const STREAM_ID&, const STREAM_ID&, const char*, const int&));
624 
625  ~CallbackData();
626 
627  void Func(const RecvData& recvData) override;
628 
629  static void RecvCallback(STREAM_ID recvID, STREAM_ID sendID, const char* msg, int jsonLen, int msgLen, void* callback);
630  };
631 
632  class CallbackDataVoid : public Callback {
633  public:
642  void(*func)(void*, const STREAM_ID&, const STREAM_ID&, const char*, const int&);
643 
644  void* obj;
645 
646  CallbackDataVoid(void(*func)(void*, const STREAM_ID&, const STREAM_ID&, const char*, const int&), void* obj);
647 
648  ~CallbackDataVoid();
649 
650  void Func(const RecvData& recvData) override;
651 
652  static void RecvCallback(STREAM_ID recvID, STREAM_ID sendID, const char* msg, int jsonLen, int msgLen, void* callback);
653  };
654 
655  class CallbackDataJson : public Callback {
656  public:
665  void(*func)(const STREAM_ID&, const STREAM_ID&, const char*, const int&, const rapidjson::Document&);
666 
667  CallbackDataJson(void(*func)(const STREAM_ID&, const STREAM_ID&, const char*, const int&, const rapidjson::Document&));
668 
669  ~CallbackDataJson();
670 
671  void Func(const RecvData& recvData) override;
672 
673  static void RecvCallback(STREAM_ID recvID, STREAM_ID sendID, const char* msg, int jsonLen, int msgLen, void* callback);
674  };
675 
677  public:
687  void(*func)(void*, const STREAM_ID&, const STREAM_ID&, const char*, const int&, const rapidjson::Document&);
688 
689  void* obj;
690 
691  CallbackDataJsonVoid(void(*func)(void*, const STREAM_ID&, const STREAM_ID&, const char*, const int&, const rapidjson::Document&), void* obj);
692 
694 
695  void Func(const RecvData& recvData) override;
696 
697  static void RecvCallback(STREAM_ID recvID, STREAM_ID sendID, const char* msg, int jsonLen, int msgLen, void* callback);
698  };
699 }
700 
701 namespace Corelink {
702  class RecvData {
703  public:
704  RecvData(STREAM_ID recvID, STREAM_ID sendID, const char* data, int hdrLen, int msgLen);
705  RecvData(const RecvData& rhs);
706  ~RecvData();
707  RecvData& operator=(const RecvData& rhs);
708 
709  STREAM_ID recvID;
710  STREAM_ID sendID;
711  const char* data;
712  int hdrLen;
713  int msgLen;
714  };
715 }
716 #endif