C++ Client  0.0.0.0
C++ wrapper for Corelink DLL
CorelinkStreamData.h
Go to the documentation of this file.
1 
5 #ifndef CORELINKSTREAMDATA_H
6 #define CORELINKSTREAMDATA_H
7 
8 #include "CorelinkClasses.h"
9 
10 namespace Corelink {
11 
12  inline StreamData::StreamData(const int& streamID, const int& state, const int& mtu,
13  const std::string& user, const std::string& workspace, const std::string& meta,
14  int streamRef, const std::vector<std::string>& type) :
15  streamID(streamID), state(state), mtu(mtu), user(user), workspace(workspace), meta(meta), streamRef(streamRef), type(type)
16  {}
17 
18  inline StreamData::StreamData() :
19  streamID(STREAM_DEF), state(Const::STREAM_STATE_NONE), mtu(-1), user(), workspace(), meta(), streamRef(-1), type()
20  {}
21 
23 
24  inline StreamData::StreamData(const StreamData& rhs) :
25  state(rhs.state), mtu(rhs.mtu), streamRef(rhs.streamRef), streamID(rhs.streamID), user(rhs.user), workspace(rhs.workspace), meta(rhs.meta), type(rhs.type)
26  {}
27 
29  streamID = rhs.streamID;
30  user = rhs.user;
31  workspace = rhs.workspace;
32  meta = rhs.meta;
33  state = rhs.state;
34  mtu = rhs.mtu;
35  streamRef = rhs.streamRef;
36  type = rhs.type;
37  return *this;
38  }
39 
40  inline std::ostream& operator<<(std::ostream& os, const StreamData& rhs) {
41  os << "Stream: " << rhs.streamID << " User: " << rhs.user << " Workspace: " << rhs.workspace << "\nMeta: " << rhs.meta
42  << "\nProtocol:" << streamStateName(rhs.state)
43  << " State: " << ((rhs.state & Const::STREAM_STATE_SEND) > 0 ? "sender" : "") << ((rhs.state & Const::STREAM_STATE_RECV) > 0 ? "receiver" : "")
44  << "\nTypes: [";
45  if (rhs.type.size() > 0) {
46  os << rhs.type[0];
47  for (size_t i = 1; i < rhs.type.size(); ++i) { os << ", " << rhs.type[i]; }
48  }
49  os << "]\n";
50  if (rhs.streamRef > -1) { os << "Internal identifier: " << rhs.streamRef << "\n"; }
51  return os;
52  }
53 
54  inline StreamData StreamData::parse(const char* data) {
55  int* dataCasted;
56  int streamID, state, mtu, len, tmp;
57  std::string user, workspace, meta;
58  std::vector<std::string> types;
59  dataCasted = (int*)data;
60 
61  len = dataCasted[0];
62  streamID = dataCasted[len + 1];
63  state = dataCasted[len + 2];
64  mtu = dataCasted[len + 3];
65 
66  types.resize(len - 6);
67  tmp = (len + 4) * sizeof(int);
68  user = std::string(data + tmp, dataCasted[4]);
69  tmp += dataCasted[4];
70  workspace = std::string(data + tmp, dataCasted[5]);
71  tmp += dataCasted[5];
72  meta = std::string(data + tmp, dataCasted[6]);
73  tmp += dataCasted[6];
74  for (std::size_t i = 0; i < types.size(); ++i) {
75  types[i] = std::string(data + tmp, dataCasted[7 + i]);
76  tmp += dataCasted[7 + i];
77  }
78 
79  return StreamData(streamID, state, mtu, user, workspace, meta, CorelinkDLL::getStreamRef(streamID), types);
80  }
81 
82  inline bool StreamData::isSender() const
83  {
84  return (streamID & Const::STREAM_STATE_SEND) > 0;
85  }
86 
87  inline bool StreamData::isSender(const STREAM_ID& streamID) {
88  return CorelinkDLL::isSendStream(streamID);
89  }
90 
91  inline bool StreamData::isReceiver() const
92  {
93  return (streamID & Const::STREAM_STATE_RECV) > 0;
94  }
95 
96  inline bool StreamData::isReceiver(const STREAM_ID& streamID) {
97  return CorelinkDLL::isRecvStream(streamID);
98  }
99 
100  inline StreamData StreamData::getStreamData(const STREAM_ID& streamID) {
101  char* data;
102  int len;
103  StreamData stream;
104  #ifdef WRAPPER_ALLOC
105  len = CorelinkDLL::getStreamDataLen(streamID);
106  if (len == 0) { return StreamData(); }
107  data = new char[len];
108  CorelinkDLL::getStreamDataStr(streamID, data);
109  stream = parse(data);
110  delete[] data;
111  return stream;
112  #else
113  data = (char*)CorelinkDLL::getStreamData(streamID, len);
114  if (len == 0) { return StreamData(); }
115  stream = parse(data);
116  return stream;
117  #endif
118  }
119 
121  int state, ref;
122  state = CorelinkDLL::getStreamState(streamID);
123  ref = CorelinkDLL::getStreamRef(streamID);
124  if (ref < 0 || (state & Corelink::Const::STREAM_STATE_SEND) == 0) { return SendStream(); }
125  return SendStream(streamID, state, ref);
126  }
127 
129  int state, ref;
130  state = CorelinkDLL::getStreamState(streamID);
131  ref = CorelinkDLL::getStreamRef(streamID);
132  if (ref < 0 || (state & Corelink::Const::STREAM_STATE_RECV) == 0) { return RecvStream(); }
133  return RecvStream(streamID, state, ref);
134  }
135 
136  inline std::vector<STREAM_ID> StreamData::listClientStreams()
137  {
138  char* data;
139  int* dataCasted;
140  std::vector<STREAM_ID> streamIDs;
141  streamIDs = std::vector<STREAM_ID>();
142  #ifdef WRAPPER_ALLOC
143  int commID;
144  CorelinkDLL::getClientStreamsPushed(commID);
145  streamIDs.resize(CorelinkDLL::getCommDataLen(commID) / sizeof(int));
146  data = new char[streamIDs.size() * sizeof(int)];
147  dataCasted = (int*)data;
148  CorelinkDLL::getCommDataStr(commID, data);
149  for (std::size_t i = 0; i < streamIDs.size(); ++i) {
150  streamIDs[i] = dataCasted[i];
151  }
152  delete[] data;
153  dataCasted = nullptr;
154  return streamIDs;
155  #else
156  data = CorelinkDLL::getClientStreams();
157  dataCasted = (int*)data;
158  streamIDs.resize(dataCasted[0]);
159  for (std::size_t i = 0; i < streamIDs.size(); ++i) {
160  streamIDs[i] = dataCasted[i + 1];
161  }
162  CorelinkDLL::freeData(data);
163  dataCasted = nullptr;
164  return streamIDs;
165  #endif
166  }
167 
168  inline std::vector<STREAM_ID> StreamData::listStreamSources(const STREAM_ID& streamID) {
169  char* data;
170  int* dataCasted;
171  std::vector<STREAM_ID> streamIDs;
172  streamIDs = std::vector<STREAM_ID>();
173 #ifdef WRAPPER_ALLOC
174  int commID;
175  CorelinkDLL::getClientStreamSourcesPushed(streamID, commID);
176  streamIDs.resize(CorelinkDLL::getCommDataLen(commID) / sizeof(int));
177  data = new char[streamIDs.size() * sizeof(int)];
178  dataCasted = (int*)data;
179  CorelinkDLL::getCommDataStr(commID, data);
180  for (std::size_t i = 0; i < streamIDs.size(); ++i) {
181  streamIDs[i] = dataCasted[i];
182  }
183  delete[] data;
184  dataCasted = nullptr;
185  return streamIDs;
186 #else
187  data = CorelinkDLL::getClientStreamSources(streamID);
188  dataCasted = (int*)data;
189  streamIDs.resize(dataCasted[0]);
190  for (std::size_t i = 0; i < streamIDs.size(); ++i) {
191  streamIDs[i] = dataCasted[i + 1];
192  }
193  CorelinkDLL::freeData(data);
194  dataCasted = nullptr;
195  return streamIDs;
196 #endif
197  }
198 }
199 #endif