DSL
serialize.h
1 //@AUTOHEADER@BEGIN@
2 /***********************************************************************\
3 | Drift Standard Libraries v1.01 |
4 | Copyright 2010-2023 Drift Solutions / Indy Sams |
5 | Docs and more information available at https://www.driftsolutions.dev |
6 | This file released under the 3-clause BSD license, |
7 | see included DSL.LICENSE.TXT file for details. |
8 \***********************************************************************/
9 //@AUTOHEADER@END@
10 
11 #ifndef __DSL_SERIALIZE_H__
12 #define __DSL_SERIALIZE_H__
13 
14 #include <drift/Buffer.h>
15 
16 class DSL_API_CLASS DSL_Serializable {
17 private:
18  bool _serialize_int(DSL_BUFFER * buf, void * val, uint8_t size, bool deserialize);
19 protected:
20  bool serialize_var(DSL_BUFFER * buf, uint8_t * val, bool deserialize) { return _serialize_int(buf, val, 1, deserialize); }
21  bool serialize_var(DSL_BUFFER * buf, int8_t * val, bool deserialize) { return _serialize_int(buf, val, 1, deserialize); }
22  bool serialize_var(DSL_BUFFER * buf, uint16_t * val, bool deserialize) { return _serialize_int(buf, val, 2, deserialize); }
23  bool serialize_var(DSL_BUFFER * buf, int16_t * val, bool deserialize) { return _serialize_int(buf, val, 2, deserialize); }
24  bool serialize_var(DSL_BUFFER * buf, uint32_t * val, bool deserialize) { return _serialize_int(buf, val, sizeof(uint32_t), deserialize); }
25  bool serialize_var(DSL_BUFFER * buf, int32_t * val, bool deserialize) { return _serialize_int(buf, val, sizeof(int32_t), deserialize); }
26  bool serialize_var(DSL_BUFFER * buf, uint64_t * val, bool deserialize) { return _serialize_int(buf, val, sizeof(uint64_t), deserialize); }
27  bool serialize_var(DSL_BUFFER * buf, int64_t * val, bool deserialize) { return _serialize_int(buf, val, sizeof(int64_t), deserialize); }
28  bool serialize_var(DSL_BUFFER * buf, double * val, bool deserialize) { return _serialize_int(buf, val, sizeof(double), deserialize); }
29  bool serialize_var(DSL_BUFFER * buf, float * val, bool deserialize) { return _serialize_int(buf, val, sizeof(float), deserialize); }
30  bool serialize_var(DSL_BUFFER * buf, string * val, bool deserialize);
31  bool serialize_var(DSL_BUFFER * buf, char * data, size_t dataSize, bool deserialize);
32  bool serialize_var(DSL_BUFFER * buf, uint8_t * data, size_t lSize, bool deserialize);
33  #define ser(x) if (!serialize_var(buf, x, deserialize)) { return false; }
34  #define ser2(x,y) if (!serialize_var(buf, x, y, deserialize)) { return false; }
35 
36  /* Serialize a vector of fixed size data such as an integer or struct */
37  template <typename T> bool serialize_vector(DSL_BUFFER * buf, vector<T>& vec, bool deserialize) {
38  if (deserialize) {
39  uint32 num;
40  ser(&num);
41  T obj;
42  vec.clear();
43  for (uint32 i = 0; i < num; i++) {
44  ser2((uint8 *)&obj, sizeof(T));
45  vec.push_back(obj);
46  }
47  } else {
48  uint32 num = vec.size();
49  ser(&num);
50  for (auto x = vec.begin(); x != vec.end(); x++) {
51  ser2((uint8 *)&(*x), sizeof(T));
52  }
53  }
54  return true;
55  }
56  #define serv(x,y) if (!serialize_vector<y>(buf, x, deserialize)) { return false; }
57 
58  /* Serialize a vector of DSL_Serializable objects */
59  template <typename T> bool serialize_vector2(DSL_BUFFER * buf, vector<T>& vec, bool deserialize) {
60  if (deserialize) {
61  uint32 num;
62  ser(&num);
63  T obj;
64  vec.clear();
65  for (uint32 i = 0; i < num; i++) {
66  string tmp;
67  ser(&tmp);
68  if (!obj.FromSerialized(tmp)) { return false; }
69  vec.push_back(obj);
70  }
71  } else {
72  uint32 num = vec.size();
73  ser(&num);
74  for (auto x = vec.begin(); x != vec.end(); x++) {
75  string tmp = x->GetSerialized();
76  ser(&tmp);
77  }
78  }
79  return true;
80  }
81  #define serv2(x,y) if (!serialize_vector2<y>(buf, x, deserialize)) { return false; }
82 
83  /* Serialize a vector of std::string's */
84  bool serialize_vector_string(DSL_BUFFER * buf, vector<string>& vec, bool deserialize) {
85  if (deserialize) {
86  uint32 num;
87  ser(&num);
88  vec.clear();
89  string tmp;
90  for (uint32 i = 0; i < num; i++) {
91  ser(&tmp);
92  vec.push_back(tmp);
93  }
94  } else {
95  uint32 num = (uint32)vec.size();
96  ser(&num);
97  for (auto x = vec.begin(); x != vec.end(); x++) {
98  ser(&(*x));
99  }
100  }
101  return true;
102  }
103  #define servstr(x,y) if (!serialize_vector_string(buf, x, deserialize)) { return false; }
104 
105  virtual bool Serialize(DSL_BUFFER * buf, bool deserialize) = 0;
106 public:
107  string GetSerialized();
108  bool FromSerialized(const string& str);
109  bool GetSerialized(DSL_BUFFER * buf);
110  bool FromSerialized(DSL_BUFFER * buf);
111 
112 #ifdef ENABLE_ZLIB
113  string GetCompressed(int compression_level = 5);
114  bool FromCompressed(const string& str);
115  bool GetCompressed(DSL_BUFFER * buf, int compression_level = 5);
116  bool FromCompressed(DSL_BUFFER * buf);
117 #endif
118 };
119 
120 class DSL_API_CLASS DSL_Serializable_DSD : public DSL_Serializable {
121 protected:
122  map<uint8, string> dsd_entries;
123  bool serializeEntries(DSL_BUFFER * buf);
124 public:
125  virtual bool Serialize(DSL_BUFFER * buf, bool deserialize) = 0;
126 };
127 
128 DSL_API bool DSL_CC dsl_serialize_int(DSL_BUFFER * buf, const void * pVal, size_t lSize);
129 DSL_API bool DSL_CC dsl_deserialize_int(DSL_BUFFER * buf, void * pVal, size_t lSize);
130 DSL_API bool DSL_CC dsl_serialize_string(DSL_BUFFER * buf, const string * val);
131 DSL_API bool DSL_CC dsl_deserialize_string(DSL_BUFFER * buf, string * val);
132 /* This varchar version encodes the buffer with a variable int before the data specifying the size */
133 DSL_API bool DSL_CC dsl_serialize_varchar(DSL_BUFFER * buf, const uint8_t * val, uint32_t lSize);
134 DSL_API bool DSL_CC dsl_deserialize_varchar(DSL_BUFFER * buf, uint8_t * val, uint32_t lSize);
135 /* This fixed version encodes the whole data buffer of size you specify at a fixed size */
136 DSL_API bool DSL_CC dsl_serialize_fixed(DSL_BUFFER * buf, const uint8_t * val, uint32_t lSize);
137 DSL_API bool DSL_CC dsl_deserialize_fixed(DSL_BUFFER * buf, uint8_t * val, uint32_t lSize);
138 
139 #endif // __DSL_SERIALIZE_H__