HCE project C++ developers source code library  1.1.1
HCE project developer library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Response.hpp
Go to the documentation of this file.
1 
15 #ifndef RESPONSE_HPP
16 #define RESPONSE_HPP
17 
18 
22 #include <string>
23 #include <map>
24 
28 #include <Poco/Any.h>
29 #include <Poco/DynamicFactory.h>
30 #include <Poco/JSON/Parser.h>
31 #include <Poco/JSON/PrintHandler.h>
32 #include <Poco/JSON/JSONException.h>
33 #include <Poco/Environment.h>
34 
35 #include "Errors.hpp"
36 #include "EncodeDecodeBase64.hpp"
37 
38 
39 namespace HCE
40 {
41 
45 enum class CommandId {
46  DB_ENGINE_NAME=0
47 };
48 
49 
53 enum {
54  PUT=0 ,
55  GET ,
56  DEL ,
57  CHECK ,
59 // , COMMAND_COUNT //!< Keep it at the end of enum
60 };
61 
68 class Request {
69 public:
70  Request(const std::string& json) : initialized(false) {
71  #ifdef _DEBUG_
72  std::cout << "request constructor" << std::endl;
73  std::cout << json << std::endl;
74  #endif
75  try {
76  Poco::JSON::Array::Ptr obj;
77  Poco::JSON::Parser parser;
78  Poco::Dynamic::Var result = parser.parse(json);
79  if ( result.type() == typeid(Poco::JSON::Object::Ptr) ) {
80  type = result.extract<Poco::JSON::Object::Ptr>()->getValue<unsigned int>("type");
81  data = result.extract<Poco::JSON::Object::Ptr>()->getValue<std::string>("data");
82  }
83  initialized = true;
84  }
85  catch(const Poco::Exception& exc) {
86  std::cout << exc.displayText() << std::endl;
87  }
88  }
89 public:
90  unsigned int type;
91  std::string data;
93 };
94 
95 
100 //typedef bool STATUS;
101 struct DataSet
102 {
104  {
108  }
109  DataSet(const std::map<std::string, std::string>& docs)
110  {
111  Poco::JSON::Object items;
112  Poco::JSON::Object item;
113  for(auto doc : docs)
114  {
118  std::string base64_decoded = doc.second;
119  std::string base64_encoded = HCE::encodeBase64(base64_decoded);
120  Poco::Dynamic::Var value(base64_encoded);
121  item.set(doc.first,value);
122  }
123  items.set("documents",item);
124  std::ostringstream oss;
125  items.stringify(oss);
126  data = oss.str();
127 #ifdef _DEBUG_
128  std::cout << "data:\n"
129  << data << std::endl;
130 #endif
131  }
132  std::string jsonToString() const
133  {
137  return data;
138  }
139  bool operator==(const HCE::DataSet& rhs) const
140  {
144  return (data.compare(rhs.data)) ? false : true;
145  }
146  std::string data;
147  Poco::JSON::Object item;
148  };
152  struct Documents {
153  std::vector<std::pair<const std::string, const std::string> > docs;
154  };
160  struct Response
161  {
162  Response(unsigned err_code=ACTION_NOT_SUPPORT)
163  : error_code( Poco::NumberFormatter::format(err_code))
164  , error_message(error_messages[err_code])
165  , data()
166  , time() {
167  init();
168  }
169  Response(const std::map<std::string,std::string>& outData, const STATUS& status)
170  : error_code(Poco::NumberFormatter::format(status)), error_message(error_messages[status]), data(outData) {
174  init();
175  }
176  void init() {
177  item.set("error_code", Poco::Dynamic::Var(error_code));
178  item.set("error_message", Poco::Dynamic::Var(error_message));
179  item.set("data", Poco::Dynamic::Var(data.jsonToString()));
180  item.set("time", Poco::Dynamic::Var(time));
181  }
182  /*
183  Response(const std::string& json)
184  {
185  try
186  {
187  Poco::JSON::Array::Ptr obj;
188  Poco::JSON::Parser parser;
189  Poco::JSON::DefaultHandler defaultHandler;
190  parser.setHandler( &defaultHandler );
191  parser.parse(json);
192  Poco::DynamicAny result = defaultHandler.result();
193  if ( result.type() == typeid(Poco::JSON::Object::Ptr) )
194  {
195  if(result.extract<Poco::JSON::Object::Ptr>()->getObject("error_code"))
196  {
197  error_code = result.extract<Poco::JSON::Object::Ptr>()->getValue<std::string>("error_code");
198  }
199  if(result.extract<Poco::JSON::Object::Ptr>()->getObject("error_message"))
200  {
201  error_message = result.extract<Poco::JSON::Object::Ptr>()->getValue<std::string>("error_message");
202  }
203  }
204  }
205  catch(Poco::JSON::JSONException& jsone)
206  {
207  std::cout << jsone.message() << std::endl;
208  }
209  }
210  */
211  /*
212  Response(const std::string& errCode, const std::string& errMsg, const DataSet& outData, const std::string& elapsedTime)
213  : error_code(errCode), error_message(errMsg), data(outData), time(elapsedTime), item()
214  {
215  item.set("error_code", Poco::Dynamic::Var(error_code));
216  item.set("error_message", Poco::Dynamic::Var(error_message));
217  item.set("data", Poco::Dynamic::Var(data.jsonToString()));
218  item.set("time", Poco::Dynamic::Var(time));
219  }
220  */
221  static Documents docs() {
222  Documents doc;
223  return doc;
224  }
225  inline void setTime(const std::string& _time) {
226  item.set("time", Poco::Dynamic::Var(_time));
227  }
228  std::string json()
229  {
230  std::ostringstream oss;
231  item.stringify(oss);
232  return oss.str();
233  }
234  bool operator==(const HCE::Response& rhs) const
235  {
236  return (
237  this->error_code==rhs.error_code
238  && this->error_message==rhs.error_message
239  && this->data==rhs.data
240  );
241  }
242  std::string error_code;
243  std::string error_message;
245  std::string time;
246  Poco::JSON::Object item;
247  };
248 
249 }
250 
251 
252 #endif