CMSDK  2.0.1
DataMessage.h
1 #if !defined(_DATAMESSAGE_H_)
2 #define _DATAMESSAGE_H_
3 
4 // Data Message Version History
5 // Initial version:
6 // - data->cid = DATAMESSAGEOLDID
7 // - does not contain cver, cenc, cyclecputime, cyclewalltime, chaincputime, chainwalltime
8 // Version 10:
9 // - data->cid = DATAMESSAGEID
10 // - now contains cver, cenc, cyclecputime, cyclewalltime, chaincputime, chainwalltime
11 
12 #define CURRENTDATAMESSAGEVERSION 10
13 
14 #include "Types.h"
15 #include "ObjectIDs.h"
16 //#include "Collections.h"
17 #include "Utils.h"
18 
19 namespace cmlabs {
20 
22  uint32 size;
23  uint32 cid;
24 };
25 
27  uint32 size; // auto
28  uint32 cid; // auto
29  uint64 memid; // auto
30  uint64 time; // auto
31  uint64 sendtime; // api
32  uint64 recvtime; // api
33  uint16 origin; // NodeID, api
34  uint16 destination; // NodeID, api
35 
36  uint64 ttl; // spec
37  uint16 priority; // spec
38  uint8 policy; // spec
39 
40  uint32 from; // user
41  uint32 to; // user
42 
43  PsyType type; // api/user
44  uint32 tag; // api/user
45  uint16 status; // api/user
46  uint64 reference; // api
47  uint64 serial; // api/user
48  PsyContext contextchange; // api/user
49 
50  uint32 userSize; // size of user data
51  uint32 userCount; // number of user data entries
52 };
53 
55  uint32 size; // auto
56  uint32 cid; // auto
57  uint16 cver; // auto
58  uint16 cenc; // auto
59  uint64 memid; // auto
60  uint64 time; // auto
61  uint64 sendtime; // api
62  uint64 recvtime; // api
63  uint16 origin; // NodeID, api
64  uint16 destination; // NodeID, api
65 
66  uint64 ttl; // spec
67  uint16 priority; // spec
68  uint8 policy; // spec
69 
70  uint32 from; // user
71  uint32 to; // user
72 
73  PsyType type; // api/user
74  uint32 tag; // api/user
75  uint16 status; // api/user
76  uint64 reference; // api
77  uint64 serial; // api/user
78  PsyContext contextchange; // api/user
79 
80  uint32 userSize; // size of user data
81  uint32 userCount; // number of user data entries
82 
83  uint32 cyclecputime; // CPU time spent in this cycle, in us
84  uint32 cyclewalltime; // Wall time spent in this cycle, in us
85  uint32 chaincputime; // CPU time spent in this message chain, in us
86  uint32 chainwalltime; // Wall time spent in this message chain, in us
87  uint32 chaincount; // number of messages in the chain
88 
89  uint32 systemid; // id of system sending the message
90 
91  std::string toJSON(std::map<uint16, std::string>* subtypes = NULL, std::map<uint16, std::string>* subcontexts = NULL, std::map<uint32, std::string>* compNames = NULL);
92  std::string toXML(std::map<uint16, std::string>* subtypes = NULL, std::map<uint16, std::string>* subcontexts = NULL, std::map<uint32, std::string>* compNames = NULL);
93 };
94 
95 class DataMessage {
96 public:
103  static DataMessage* FindClosestMessage(uint64 t, std::map<uint64, DataMessage*> &messages);
104 
105  static bool ConvertDataFromOlderMessageFormat(const char* data, char **newData);
106 
110  DataMessage();
116  DataMessage(PsyType type, uint32 from);
125  DataMessage(PsyType type, uint32 from, uint32 to, uint64 ttl = 0, uint16 priority = 0);
135  DataMessage(PsyType type, uint32 from, uint32 to, uint32 tag, uint64 time, uint64 ttl = 0, uint16 priority = 0);
141  DataMessage(char* data, bool copy = false);
146  DataMessage(const char* data);
151  DataMessage(const DataMessage& msg);
159  DataMessage(const char* data, uint32 maxDraftSize);
167  DataMessage(const DataMessage& msg, uint32 maxDraftSize);
171  ~DataMessage();
172 
178  return new DataMessage((const char*)(this->data));
179  }
180 
188  const char* swapMessageData(const char* data);
189 
197  bool fillInDraftUserDataFrom(const char* data, uint32 maxDraftSize);
198 
203  bool isValid() {return data && GetObjID(data) == DATAMESSAGEID; }
204 
205  // User
206 
214  uint32 getContentType(const char* key);
215 
223  uint32 getContentSize(const char* key);
224 
234  bool getAsBool(const char* key);
235 
244  std::string getAsString(const char* key);
245 
254  int64 getAsInt(const char* key);
255 
264  uint64 getAsTime(const char* key);
265 
274  float64 getAsFloat(const char* key);
275 
283  uint64 getTime(const char* key);
284 
292  const char* getString(const char* key);
293 
302  const char* getString(const char* key, uint32 &size);
303 
312  bool getInt(const char* key, int64& value);
313 
323  bool getDouble(const char* key, double& value);
324 
334  bool getFloat(const char* key, float64& value);
335 
344  const char* getData(const char* key, uint32& size);
345 
355  char* getDataCopy(const char* key, uint32& size);
356 
365  DataMessage* getAttachedMessageCopy(const char* key);
366 
367 
368 
369 
378  uint64 getTime(const char* key, bool& success);
379 
389  const char* getString(const char* key, bool& success);
390 
400  const char* getString(const char* key, uint32 &size, bool& success);
401 
413  int64 getInt(const char* key, bool& success);
414 
426  double getDouble(const char* key, bool& success);
427 
438  float64 getFloat(const char* key, bool& success);
439 
449  const char* getData(const char* key, uint32& size, bool& success);
450 
462  char* getDataCopy(const char* key, uint32& size, bool& success);
463 
473  DataMessage* getAttachedMessageCopy(const char* key, bool& success);
474 
475 
485  int64 getInt(const char* key);
486 
497  double getDouble(const char* key);
498 
499 
510  float64 getFloat(const char* key);
511 
512  // *** setting all of the above, returns success or fail (usually because the message is not valid)
513 
522  bool setTime(const char* key, uint64 value);
523 
531  bool setString(const char* key, const char* value);
532 
541  bool setInt(const char* key, int64 value);
542 
550  bool setDouble(const char* key, double value);
551 
559  bool setFloat(const char* key, float64 value);
560 
568  bool setData(const char* key, const char* value, uint32 size);
569 
577  bool setAttachedMessage(const char* key, DataMessage* msg);
578 
584  uint32 getUserSize() {
585  return data->userSize;
586  }
587 
593  uint32 getUserCount() {
594  return data->userCount;
595  }
596 
597  // Arrays
598  // *** Same as above for single values, but now getting and setting entries in arrays
599  // myval[0] = val, myval[1] = val, myval[2] = val, etc.
600 
601  enum KeyType {NONE, SINGLE, ARRAY, MAP};
602 
610  KeyType getKeyType(const char* key);
611 
618  bool isArrayContent(const char* key);
619 
626  bool isMapContent(const char* key);
627 
634  bool isSingleValue(const char* key);
635 
636 
643  bool hasKey(const char* key);
644 
651  bool hasString(const char* key);
652 
659  bool hasInteger(const char* key);
660 
667  bool hasFloat(const char* key);
668 
675  bool hasTime(const char* key);
676 
683  bool hasData(const char* key);
684 
691  bool hasMessage(const char* key);
692 
693 
699  uint32 getContentType(int64 i, const char* key);
700 
706  uint32 getContentSize(int64 i, const char* key);
707 
716  uint64 getTime(int64 i, const char* key);
717 
723  std::string getAsString(int64 i, const char* key);
724 
730  int64 getAsInt(int64 i, const char* key);
731 
737  uint64 getAsTime(int64 i, const char* key);
738 
744  float64 getAsFloat(int64 i, const char* key);
745 
751  const char* getString(int64 i, const char* key);
752 
759  const char* getString(int64 i, const char* key, uint32 &size);
760 
767  bool getInt(int64 i, const char* key, int64& value);
768 
775  bool getDouble(int64 i, const char* key, double& value);
776 
783  bool getFloat(int64 i, const char* key, float64& value);
784 
791  int64 getInt(int64 i, const char* key, bool& success);
798  double getDouble(int64 i, const char* key, bool& success);
805  float64 getFloat(int64 i, const char* key, bool& success);
812  int64 getInt(int64 i, const char* key);
818  double getDouble(int64 i, const char* key);
824  float64 getFloat(int64 i, const char* key);
825 
832  const char* getData(int64 i, const char* key, uint32& size);
833 
840  char* getDataCopy(int64 i, const char* key, uint32& size);
841 
848  DataMessage* getAttachedMessageCopy(int64 i, const char* key);
849 
857  bool setTime(int64 i, const char* key, uint64 value);
858 
865  bool setString(int64 i, const char* key, const char* value);
866 
873  bool setInt(int64 i, const char* key, int64 value);
874 
881  bool setDouble(int64 i, const char* key, double value);
882 
889  bool setFloat(int64 i, const char* key, float64 value);
897  bool setData(int64 i, const char* key, const char* value, uint32 size);
898  // bool setData(int64 i, const char* key, const void* value, uint32 size);
899 
906  bool setAttachedMessage(int64 i, const char* key, DataMessage* msg);
907 
908  // *** Same as above but reading whole arrays in one go
909  std::map<int64, uint64> getTimeArray(const char* key);
914  std::map<int64, std::string> getAsStringArray(const char* key);
919  std::map<int64, int64> getAsIntArray(const char* key);
924  std::map<int64, float64> getAsFloatArray(const char* key);
929  std::map<int64, std::string> getStringArray(const char* key);
935  std::map<int64, int64> getIntArray(const char* key);
940  std::map<int64, double> getDoubleArray(const char* key);
945  std::map<int64, float64> getFloatArray(const char* key);
950  std::map<int64, DataMessage*> getAttachedMessageArray(const char* key);
951 
956  uint32 getArraySize(const char* key);
957 
962  uint32 getArrayCount(const char* key);
963 
968  uint32 getMapSize(const char* key);
969 
974  uint32 getMapCount(const char* key);
975 
976 
979  // *** Same as above but setting whole arrays in one go
986  bool setTimeArray(const char* key, std::map<int64, uint64>& map);
987 
994  bool setStringArray(const char* key, std::map<int64, std::string>& map);
995 
1002  bool setIntArray(const char* key, std::map<int64, int64>& map);
1003 
1010  bool setDoubleArray(const char* key, std::map<int64, double>& map);
1011 
1018  bool setFloatArray(const char* key, std::map<int64, float64>& map);
1019 
1026  bool setAttachedMessageArray(const char* key, std::map<int64, DataMessage*>& map);
1027 
1028  // Maps
1032  // *** Same as for arrays, but now with maps
1033  // myval["up"] = val, myval["down"] = val, myval["left"] = val, etc.
1034 
1043  uint32 getContentType(const char* idx, const char* key);
1044 
1052  uint32 getContentSize(const char* idx, const char* key);
1061  uint64 getTime(const char* idx, const char* key);
1070  std::string getAsString(const char* idx, const char* key);
1079  int64 getAsInt(const char* idx, const char* key);
1088  uint64 getAsTime(const char* idx, const char* key);
1097  float64 getAsFloat(const char* idx, const char* key);
1105  const char* getString(const char* idx, const char* key);
1114  const char* getString(const char* idx, const char* key, uint32 &size);
1124  bool getInt(const char* idx, const char* key, int64& value);
1134  bool getDouble(const char* idx, const char* key, double& value);
1144  bool getFloat(const char* idx, const char* key, float64& value);
1152  int64 getInt(const char* idx, const char* key, bool& success);
1161  double getDouble(const char* idx, const char* key, bool& success);
1170  float64 getFloat(const char* idx, const char* key, bool& success);
1178  int64 getInt(const char* idx, const char* key);
1187  double getDouble(const char* idx, const char* key);
1195  float64 getFloat(const char* idx, const char* key);
1204  const char* getData(const char* idx, const char* key, uint32& size);
1205 
1214  char* getDataCopy(const char* idx, const char* key, uint32& size);
1222  DataMessage* getAttachedMessageCopy(const char* idx, const char* key);
1231  bool setTime(const char* idx, const char* key, uint64 value);
1240  bool setString(const char* idx, const char* key, const char* value);
1249  bool setInt(const char* idx, const char* key, int64 value);
1259  bool setDouble(const char* idx, const char* key, double value);
1269  bool setFloat(const char* idx, const char* key, float64 value);
1279  bool setData(const char* idx, const char* key, const char* value, uint32 size);
1288  bool setAttachedMessage(const char* idx, const char* key, DataMessage* msg);
1289 
1296  std::map<std::string, uint64> getTimeMap(const char* key);
1304  std::map<std::string, std::string> getAsStringMap(const char* key);
1312  std::map<std::string, int64> getAsIntMap(const char* key);
1320  std::map<std::string, float64> getAsFloatMap(const char* key);
1327  std::map<std::string, std::string> getStringMap(const char* key);
1334  std::map<std::string, int64> getIntMap(const char* key);
1342  std::map<std::string, double> getDoubleMap(const char* key);
1349  std::map<std::string, float64> getFloatMap(const char* key);
1356  std::map<std::string, DataMessage*> getAttachedMessageMap(const char* key);
1364  bool setTimeMap(const char* key, std::map<std::string, uint64>& map);
1372  bool setStringMap(const char* key, std::map<std::string, std::string>& map);
1380  bool setIntMap(const char* key, std::map<std::string, int64>& map);
1388  bool setDoubleMap(const char* key, std::map<std::string, double>& map);
1396  bool setFloatMap(const char* key, std::map<std::string, float64>& map);
1404  bool setAttachedMessageMap(const char* key, std::map<std::string, DataMessage*>& map);
1405 
1413  std::string toJSON(std::map<uint16, std::string>* subtypes = NULL, std::map<uint16, std::string>* subcontexts = NULL, std::map<uint32, std::string>* compNames = NULL);
1414 
1420  std::string toXML(std::map<uint16, std::string>* subtypes = NULL, std::map<uint16, std::string>* subcontexts = NULL, std::map<uint32, std::string>* compNames = NULL);
1421 
1429  std::string toCSV(const char* separator = NULL, const char* preample = NULL, std::map<uint16, std::string>* subtypes = NULL, std::map<uint16, std::string>* subcontexts = NULL, std::map<uint32, std::string>* compNames = NULL);
1430 
1438  static std::string GetCSVHeader(const char* separator = NULL, const char* preample = NULL);
1439 
1440 
1447 
1451  std::string getUserEntriesAsString();
1452 
1458  std::string getUserEntriesAsJSON(bool asText);
1459 
1460 
1461  // API - inline
1462 
1463  /* getRawData()
1464  Retrieve the raw data from the message
1465  @return NULL if the message is not valid
1466  @return data else
1467  */
1468  char* getRawData() {
1469  if (data->cid != DATAMESSAGEID) return NULL;
1470  return (char*)data;
1471  }
1472 
1473  /* getOrigin()
1474  Get and return origin of message
1475  @return NULL if the message is not valid
1476  @return origin else
1477  */
1478 
1479  uint16 getOrigin() {
1480  if (data->cid != DATAMESSAGEID) return 0;
1481  return data->origin;
1482  }
1483 
1484  /* getDestination()
1485  Get and return destination of message
1486  @return NULL if the message is not valid
1487  @return destination else
1488  */
1489  uint16 getDestination() {
1490  if (data->cid != DATAMESSAGEID) return 0;
1491  return data->destination;
1492  }
1493 
1499  bool setOrigin(uint16 addr) {
1500  if (data->cid != DATAMESSAGEID) return false;
1501  data->origin = addr;
1502  return true;
1503  }
1504 
1510  bool setDestination(uint16 addr) {
1511  if (data->cid != DATAMESSAGEID) return false;
1512  data->destination = addr;
1513  return true;
1514  }
1515 
1522  uint32 getSize() {
1523  if (data->cid != DATAMESSAGEID) return 0;
1524  return data->size;
1525  }
1526 
1537  bool setMultiple(uint32 from, uint32 to, uint32 tag, uint64 ttl, uint8 policy, uint64 sendtime) {
1538  if (data->cid != DATAMESSAGEID) return false;
1539  if (from) data->from = from;
1540  if (to) data->to = to;
1541  if (tag) data->tag = tag;
1542  if (ttl) data->ttl = ttl;
1543  if (policy) data->policy = policy;
1544  if (sendtime) data->sendtime = sendtime;
1545  return true;
1546  }
1547 
1554  uint32 getTag() {
1555  if (data->cid != DATAMESSAGEID) return 0;
1556  return data->tag;
1557  }
1558 
1569  bool setTag(uint32 tag) {
1570  if (data->cid != DATAMESSAGEID) return false;
1571  data->tag = tag;
1572  return true;
1573  }
1574 
1579  uint64 getReference() {
1580  if (data->cid != DATAMESSAGEID) return 0;
1581  return data->reference;
1582  }
1583 
1589  bool setReference(uint64 ref) {
1590  if (data->cid != DATAMESSAGEID) return false;
1591  data->reference = ref;
1592  return true;
1593  }
1594 
1595 
1600  uint32 getSystemID() {
1601  if (data->cid != DATAMESSAGEID) return 0;
1602  return data->systemid;
1603  }
1604 
1610  bool setSystemID(uint32 id) {
1611  if (data->cid != DATAMESSAGEID) return false;
1612  data->systemid = id;
1613  return true;
1614  }
1615 
1620  uint64 getMemID() {
1621  if (data->cid != DATAMESSAGEID) return 0;
1622  return data->memid;
1623  }
1624 
1631  bool setMemID(uint64 id) {
1632  if (data->cid != DATAMESSAGEID) return false;
1633  data->memid = id;
1634  return true;
1635  }
1636 
1641  uint32 getFrom() {
1642  if (data->cid != DATAMESSAGEID) return 0;
1643  return data->from;
1644  }
1645 
1657  bool setFrom(uint32 from) {
1658  if (data->cid != DATAMESSAGEID) return false;
1659  data->from = from;
1660  return true;
1661  }
1662 
1671  uint32 getTo() {
1672  if (data->cid != DATAMESSAGEID) return 0;
1673  return data->to;
1674  }
1675 
1686  bool setTo(uint32 to) {
1687  if (data->cid != DATAMESSAGEID) return false;
1688  data->to = to;
1689  return true;
1690  }
1691 
1701  PsyType t = NOTYPE;
1702  if (data->cid != DATAMESSAGEID) return t;
1703  return data->type;
1704  }
1705 
1716  bool setType(PsyType &type) {
1717  if (data->cid != DATAMESSAGEID) return false;
1718  data->type = type;
1719  return true;
1720  }
1721 
1733  PsyContext c = NOCONTEXT;
1734  if (data->cid != DATAMESSAGEID) return c;
1735  return data->contextchange;
1736  }
1737 
1751  bool setContextChange(PsyContext& context) {
1752  if (data->cid != DATAMESSAGEID) return false;
1753  data->contextchange = context;
1754  return true;
1755  }
1756 
1771  uint64 getTTL() {
1772  if (data->cid != DATAMESSAGEID) return 0;
1773  return data->ttl;
1774  }
1775 
1786  uint64 getEOL() {
1787  if (data->cid != DATAMESSAGEID) return 0;
1788  if (!data->ttl)
1789  return 0;
1790  return data->time + data->ttl;
1791  }
1792 
1808  bool setTTL(uint64 ttl) {
1809  if (data->cid != DATAMESSAGEID) return false;
1810  data->ttl = ttl;
1811  return true;
1812  }
1813 
1826  bool setEOL(uint64 eol) {
1827  if (data->cid != DATAMESSAGEID) return false;
1828  int64 ttl = eol - data->time;
1829  if (ttl > 0) {
1830  data->ttl = (uint64)ttl;
1831  return true;
1832  }
1833  else
1834  return false;
1835  }
1836 
1847  uint16 getPriority() {
1848  if (data->cid != DATAMESSAGEID) return 0;
1849  return data->priority;
1850  }
1851 
1866  bool setPriority(uint16 priority) {
1867  if (data->cid != DATAMESSAGEID) return false;
1868  data->priority = priority;
1869  return true;
1870  }
1871 
1882  uint8 getPolicy() {
1883  if (data->cid != DATAMESSAGEID) return 0;
1884  return data->policy;
1885  }
1886 
1898  bool setPolicy(uint8 policy) {
1899  if (data->cid != DATAMESSAGEID) return false;
1900  data->policy = policy;
1901  return true;
1902  }
1903 
1913  uint64 getSendTime() {
1914  if (data->cid != DATAMESSAGEID) return 0;
1915  return data->sendtime;
1916  }
1917 
1929  bool setSendTime(uint64 time) {
1930  if (data->cid != DATAMESSAGEID) return false;
1931  data->sendtime = time;
1932  return true;
1933  }
1934 
1944  uint64 getRecvTime() {
1945  if (data->cid != DATAMESSAGEID) return 0;
1946  return data->recvtime;
1947  }
1948 
1960  bool setRecvTime(uint64 time) {
1961  if (data->cid != DATAMESSAGEID) return false;
1962  data->recvtime = time;
1963  return true;
1964  }
1965 
1976  uint64 getCreatedTime() {
1977  if (data->cid != DATAMESSAGEID) return 0;
1978  return data->time;
1979  }
1980 
1992  bool setCreatedTime(uint64 t) {
1993  if (data->cid != DATAMESSAGEID) return 0;
1994  data->time = t;
1995  return true;
1996  }
1997 
2007  uint16 getStatus() {
2008  if (data->cid != DATAMESSAGEID) return 0;
2009  return data->status;
2010  }
2011 
2023  bool setStatus(uint16 status) {
2024  if (data->cid != DATAMESSAGEID) return false;
2025  data->status = status;
2026  return true;
2027  }
2028 
2037  uint64 getSerial() {
2038  if (data->cid != DATAMESSAGEID) return 0;
2039  return data->serial;
2040  }
2041 
2053  bool setSerial(uint64 serial) {
2054  if (data->cid != DATAMESSAGEID) return false;
2055  data->serial = serial;
2056  return true;
2057  }
2058 
2059 
2060 
2061 
2062 
2063 
2064 
2065 
2066 
2081  bool addTimeUsage(uint32 cycleCPUTime, uint32 cycleWallTime, uint32 chainCPUTime = 0, uint32 chainWallTime = 0, uint32 chainCount = 0);
2082 
2083 
2093  uint16 getCycleCPUTime() {
2094  if (data->cid != DATAMESSAGEID) return 0;
2095  return data->cyclecputime;
2096  }
2097 
2109  bool setCycleCPUTime(uint32 t) {
2110  if (data->cid != DATAMESSAGEID) return false;
2111  data->cyclecputime = t;
2112  return true;
2113  }
2114 
2115 
2116 
2117 
2127  uint16 getCycleWallTime() {
2128  if (data->cid != DATAMESSAGEID) return 0;
2129  return data->cyclewalltime;
2130  }
2131 
2143  bool setCycleWallTime(uint32 t) {
2144  if (data->cid != DATAMESSAGEID) return false;
2145  data->cyclewalltime = t;
2146  return true;
2147  }
2148 
2149 
2150 
2151 
2152 
2162  uint16 getChainCPUTime() {
2163  if (data->cid != DATAMESSAGEID) return 0;
2164  return data->chaincputime;
2165  }
2166 
2178  bool setChainCPUTime(uint32 t) {
2179  if (data->cid != DATAMESSAGEID) return false;
2180  data->chaincputime = t;
2181  return true;
2182  }
2183 
2184 
2185 
2186 
2196  uint16 getChainWallTime() {
2197  if (data->cid != DATAMESSAGEID) return 0;
2198  return data->chainwalltime;
2199  }
2200 
2212  bool setChainWallTime(uint32 t) {
2213  if (data->cid != DATAMESSAGEID) return false;
2214  data->chainwalltime = t;
2215  return true;
2216  }
2217 
2218 
2219 
2229  uint32 getChainCount() {
2230  if (data->cid != DATAMESSAGEID) return 0;
2231  return data->chaincount;
2232  }
2233 
2245  bool setChainCount(uint32 count) {
2246  if (data->cid != DATAMESSAGEID) return false;
2247  data->chaincount= count;
2248  return true;
2249  }
2250 
2261  bool deleteEntry(const char* key) {
2262  if (data->cid != DATAMESSAGEID) return false;
2263  return removeEntry(key);
2264  }
2265 
2266 
2267 
2268 
2269 
2270 
2271 
2272 
2273 
2274 
2275 
2276 
2277 
2278 
2279 
2280 
2281 
2282  DataMessageHeader* data;
2283 
2284 protected:
2285  bool setRawData(const char* key, const char* value, uint32 size, uint32 datatype);
2286 
2296  char* findKey(const char* key) {
2297  if (data->cid != DATAMESSAGEID) return NULL;
2298  char* src = (char*)data + sizeof(DataMessageHeader);
2299  char* srcEnd = (char*)data + data->size;
2300  while (src < srcEnd) {
2301  if (((DataMessageEntryHeader*)src)->cid == CONSTCHARID) {
2302  if (stricmp(key, src+sizeof(DataMessageEntryHeader)) == 0)
2303  return src;
2304  }
2305  src += ((DataMessageEntryHeader*)src)->size;
2306  }
2307  return NULL;
2308  }
2309 
2321  char* findEntry(const char* key) {
2322  char* src = findKey(key);
2323  if (src == NULL) return NULL;
2324  return src + sizeof(DataMessageEntryHeader) + strlen(key) + 1;
2325  }
2326 
2338  bool removeEntry(const char* key) {
2339  char* src = findKey(key);
2340  if (src == NULL) return true;
2341  ((DataMessageEntryHeader*)src)->cid = UNUSEDID;
2342  data->userCount--;
2343  data->userSize -= ((DataMessageEntryHeader*)src)->size;
2344  return true;
2345  }
2346 
2359  char* findSpace(uint32 space) {
2360  if (data->cid != DATAMESSAGEID) return NULL;
2361  char* src = (char*)data + sizeof(DataMessageHeader);
2362  char* srcEnd = (char*)data + data->size;
2363  while (src < srcEnd) {
2364  if ( (((DataMessageEntryHeader*)src)->cid == UNUSEDID) &&
2365  (((DataMessageEntryHeader*)src)->size == space)) {
2366  // Used to allow anything smaller, but that needs fixing permanently first
2367  // (((DataMessageEntryHeader*)src)->size >= space) ) {
2368  return src;
2369  }
2370  src += ((DataMessageEntryHeader*)src)->size;
2371  }
2372  return NULL;
2373  }
2374 
2375 };
2376 
2377 } // namespace cmlabs
2378 
2379 #endif //_DATAMESSAGE_H_
2380 
std::string getUserEntriesAsJSON(bool asText)
Definition: DataMessage.cpp:307
bool hasInteger(const char *key)
Definition: DataMessage.cpp:1937
uint32 getMapCount(const char *key)
Definition: DataMessage.cpp:2603
const char * getString(const char *key)
Definition: DataMessage.cpp:1561
uint32 getArraySize(const char *key)
Definition: DataMessage.cpp:2555
bool getFloat(const char *key, float64 &value)
Definition: DataMessage.cpp:1588
bool setEOL(uint64 eol)
Definition: DataMessage.h:1826
float64 getAsFloat(const char *key)
Definition: DataMessage.cpp:1416
bool setRecvTime(uint64 time)
Definition: DataMessage.h:1960
uint8 getPolicy()
Definition: DataMessage.h:1882
bool isSingleValue(const char *key)
Definition: DataMessage.cpp:1968
std::map< std::string, double > getDoubleMap(const char *key)
Definition: DataMessage.cpp:2820
bool isMapContent(const char *key)
Definition: DataMessage.cpp:1881
bool deleteEntry(const char *key)
Definition: DataMessage.h:2261
Definition: Bitmap.h:7
std::map< int64, std::string > getAsStringArray(const char *key)
Definition: DataMessage.cpp:2310
bool setData(const char *key, const char *value, uint32 size)
Definition: DataMessage.cpp:1799
Definition: DataMessage.h:26
bool setTime(const char *key, uint64 value)
Definition: DataMessage.cpp:1782
uint32 getContentSize(const char *key)
Definition: DataMessage.cpp:1651
bool setFloatArray(const char *key, std::map< int64, float64 > &map)
Definition: DataMessage.cpp:2528
uint16 getCycleCPUTime()
Definition: DataMessage.h:2093
uint32 getSize()
Definition: DataMessage.h:1522
KeyType getKeyType(const char *key)
Definition: DataMessage.cpp:1899
std::map< std::string, DataMessage * > getAttachedMessageMap(const char *key)
Definition: DataMessage.cpp:2870
uint32 getTag()
Definition: DataMessage.h:1554
bool setAttachedMessage(const char *key, DataMessage *msg)
Definition: DataMessage.cpp:1803
bool setDoubleArray(const char *key, std::map< int64, double > &map)
Definition: DataMessage.cpp:2518
bool setAttachedMessageMap(const char *key, std::map< std::string, DataMessage *> &map)
Definition: DataMessage.cpp:2945
std::map< int64, float64 > getFloatArray(const char *key)
Definition: DataMessage.cpp:2436
uint64 getSendTime()
Definition: DataMessage.h:1913
uint64 getAsTime(const char *key)
Definition: DataMessage.cpp:1412
uint16 getStatus()
Definition: DataMessage.h:2007
uint32 getUserCount()
Definition: DataMessage.h:593
uint64 getMemID()
Definition: DataMessage.h:1620
bool isValid()
Definition: DataMessage.h:203
std::string toCSV(const char *separator=NULL, const char *preample=NULL, std::map< uint16, std::string > *subtypes=NULL, std::map< uint16, std::string > *subcontexts=NULL, std::map< uint32, std::string > *compNames=NULL)
Definition: DataMessage.cpp:670
bool hasTime(const char *key)
Definition: DataMessage.cpp:1949
bool setStringArray(const char *key, std::map< int64, std::string > &map)
Definition: DataMessage.cpp:2498
bool setTTL(uint64 ttl)
Definition: DataMessage.h:1808
Definition: DataMessage.h:54
uint16 getChainCPUTime()
Definition: DataMessage.h:2162
bool setIntMap(const char *key, std::map< std::string, int64 > &map)
Definition: DataMessage.cpp:2915
std::map< std::string, int64 > getAsIntMap(const char *key)
Definition: DataMessage.cpp:2638
Definition: DataMessage.h:21
std::map< std::string, float64 > getAsFloatMap(const char *key)
Definition: DataMessage.cpp:2682
bool setPolicy(uint8 policy)
Definition: DataMessage.h:1898
bool setChainCount(uint32 count)
Definition: DataMessage.h:2245
std::map< int64, DataMessage * > getAttachedMessageArray(const char *key)
Definition: DataMessage.cpp:2462
std::map< std::string, std::string > getAsStringMap(const char *key)
Definition: DataMessage.cpp:2726
bool setDestination(uint16 addr)
Definition: DataMessage.h:1510
bool setCycleCPUTime(uint32 t)
Definition: DataMessage.h:2109
bool setSendTime(uint64 time)
Definition: DataMessage.h:1929
bool setFloat(const char *key, float64 value)
Definition: DataMessage.cpp:1795
bool setTo(uint32 to)
Definition: DataMessage.h:1686
bool setStatus(uint16 status)
Definition: DataMessage.h:2023
bool setType(PsyType &type)
Definition: DataMessage.h:1716
bool setMemID(uint64 id)
Definition: DataMessage.h:1631
bool setDoubleMap(const char *key, std::map< std::string, double > &map)
Definition: DataMessage.cpp:2925
bool setContextChange(PsyContext &context)
Definition: DataMessage.h:1751
bool setTimeArray(const char *key, std::map< int64, uint64 > &map)
Definition: DataMessage.cpp:2488
std::string getAsString(const char *key)
Definition: DataMessage.cpp:1478
static DataMessage * FindClosestMessage(uint64 t, std::map< uint64, DataMessage *> &messages)
Definition: DataMessage.cpp:2956
bool hasData(const char *key)
Definition: DataMessage.cpp:1955
bool setSerial(uint64 serial)
Definition: DataMessage.h:2053
std::map< std::string, int64 > getIntMap(const char *key)
Definition: DataMessage.cpp:2795
bool setString(const char *key, const char *value)
Definition: DataMessage.cpp:1776
DataMessage * copy()
Definition: DataMessage.h:177
bool setFloatMap(const char *key, std::map< std::string, float64 > &map)
Definition: DataMessage.cpp:2935
uint64 getEOL()
Definition: DataMessage.h:1786
PsyType getType()
Definition: DataMessage.h:1700
~DataMessage()
Definition: DataMessage.cpp:1393
int64 getAsInt(const char *key)
Definition: DataMessage.cpp:1408
uint64 getTime(const char *key)
Definition: DataMessage.cpp:1571
uint32 getSystemID()
Definition: DataMessage.h:1600
bool getInt(const char *key, int64 &value)
Definition: DataMessage.cpp:1576
Definition: Types.h:207
bool setFrom(uint32 from)
Definition: DataMessage.h:1657
bool setTimeMap(const char *key, std::map< std::string, uint64 > &map)
Definition: DataMessage.cpp:2895
bool setSystemID(uint32 id)
Definition: DataMessage.h:1610
bool hasKey(const char *key)
Definition: DataMessage.cpp:1927
std::map< int64, std::string > getStringArray(const char *key)
Definition: DataMessage.cpp:2357
uint16 getChainWallTime()
Definition: DataMessage.h:2196
bool fillInDraftUserDataFrom(const char *data, uint32 maxDraftSize)
Definition: DataMessage.cpp:1216
uint16 getPriority()
Definition: DataMessage.h:1847
Definition: Types.h:80
uint64 getRecvTime()
Definition: DataMessage.h:1944
uint32 copyUserEntriesFromMessage(DataMessage *msg)
Definition: DataMessage.cpp:99
bool setDouble(const char *key, double value)
Definition: DataMessage.cpp:1790
uint32 getContentType(const char *key)
Definition: DataMessage.cpp:1645
bool addTimeUsage(uint32 cycleCPUTime, uint32 cycleWallTime, uint32 chainCPUTime=0, uint32 chainWallTime=0, uint32 chainCount=0)
Definition: DataMessage.cpp:2977
uint32 getArrayCount(const char *key)
Definition: DataMessage.cpp:2577
bool setIntArray(const char *key, std::map< int64, int64 > &map)
Definition: DataMessage.cpp:2508
DataMessage * getAttachedMessageCopy(const char *key)
Definition: DataMessage.cpp:1604
DataMessage()
Definition: DataMessage.cpp:1000
char * findEntry(const char *key)
Definition: DataMessage.h:2321
bool setReference(uint64 ref)
Definition: DataMessage.h:1589
std::map< int64, float64 > getAsFloatArray(const char *key)
Definition: DataMessage.cpp:2263
char * findKey(const char *key)
Definition: DataMessage.h:2296
bool setTag(uint32 tag)
Definition: DataMessage.h:1569
uint32 getFrom()
Definition: DataMessage.h:1641
std::map< int64, int64 > getAsIntArray(const char *key)
Definition: DataMessage.cpp:2216
bool hasString(const char *key)
Definition: DataMessage.cpp:1931
uint16 getCycleWallTime()
Definition: DataMessage.h:2127
bool setCycleWallTime(uint32 t)
Definition: DataMessage.h:2143
bool setChainCPUTime(uint32 t)
Definition: DataMessage.h:2178
uint64 getReference()
Definition: DataMessage.h:1579
std::string toXML(std::map< uint16, std::string > *subtypes=NULL, std::map< uint16, std::string > *subcontexts=NULL, std::map< uint32, std::string > *compNames=NULL)
Definition: DataMessage.cpp:775
bool setInt(const char *key, int64 value)
Definition: DataMessage.cpp:1786
std::map< std::string, uint64 > getTimeMap(const char *key)
Definition: DataMessage.cpp:2613
std::map< std::string, std::string > getStringMap(const char *key)
Definition: DataMessage.cpp:2770
bool hasFloat(const char *key)
Definition: DataMessage.cpp:1943
std::map< int64, double > getDoubleArray(const char *key)
Definition: DataMessage.cpp:2410
uint64 getTTL()
Definition: DataMessage.h:1771
std::map< int64, int64 > getIntArray(const char *key)
Definition: DataMessage.cpp:2384
uint64 getSerial()
Definition: DataMessage.h:2037
const char * getData(const char *key, uint32 &size)
Definition: DataMessage.cpp:1594
char * findSpace(uint32 space)
Definition: DataMessage.h:2359
uint32 getUserSize()
Definition: DataMessage.h:584
std::map< std::string, float64 > getFloatMap(const char *key)
Definition: DataMessage.cpp:2845
uint64 getCreatedTime()
Definition: DataMessage.h:1976
bool setAttachedMessageArray(const char *key, std::map< int64, DataMessage *> &map)
Definition: DataMessage.cpp:2538
std::string toJSON(std::map< uint16, std::string > *subtypes=NULL, std::map< uint16, std::string > *subcontexts=NULL, std::map< uint32, std::string > *compNames=NULL)
Definition: DataMessage.cpp:609
PsyContext getContextChange()
Definition: DataMessage.h:1732
bool removeEntry(const char *key)
Definition: DataMessage.h:2338
static std::string GetCSVHeader(const char *separator=NULL, const char *preample=NULL)
Definition: DataMessage.cpp:752
uint32 getMapSize(const char *key)
Definition: DataMessage.cpp:2581
bool setCreatedTime(uint64 t)
Definition: DataMessage.h:1992
bool hasMessage(const char *key)
Definition: DataMessage.cpp:1961
uint32 getTo()
Definition: DataMessage.h:1671
uint32 getChainCount()
Definition: DataMessage.h:2229
bool setPriority(uint16 priority)
Definition: DataMessage.h:1866
const char * swapMessageData(const char *data)
Definition: DataMessage.cpp:1399
bool setOrigin(uint16 addr)
Definition: DataMessage.h:1499
Definition: DataMessage.h:95
bool setStringMap(const char *key, std::map< std::string, std::string > &map)
Definition: DataMessage.cpp:2905
bool isArrayContent(const char *key)
Definition: DataMessage.cpp:1863
bool setMultiple(uint32 from, uint32 to, uint32 tag, uint64 ttl, uint8 policy, uint64 sendtime)
Definition: DataMessage.h:1537
bool getDouble(const char *key, double &value)
Definition: DataMessage.cpp:1582
bool getAsBool(const char *key)
Definition: DataMessage.cpp:1445
bool setChainWallTime(uint32 t)
Definition: DataMessage.h:2212
char * getDataCopy(const char *key, uint32 &size)
Definition: DataMessage.cpp:1599
std::string getUserEntriesAsString()
Definition: DataMessage.cpp:122