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
DRCEResultDataSerializator.cpp
Go to the documentation of this file.
1 #include <Poco/JSON/Object.h>
2 #include <Poco/JSON/Array.h>
3 #include <Poco/JSON/JSON.h>
4 #include <Poco/JSON/Stringifier.h>
5 #include <Poco/JSON/Parser.h>
6 #include <Poco/JSON/JSONException.h>
7 #include <Poco/Dynamic/Var.h>
8 
10 #include "DRCEError.hpp"
12 
13 namespace HCE
14 {
15 namespace drce
16 {
17 //-----------------------------------------------------------------------------
19 : inherited(), resultData(resultData_)
20 {
21 }
22 //-----------------------------------------------------------------------------
24 {
26  errorMsg.clear();
27  try
28  {
29  Poco::JSON::Array::Ptr pItems = new Poco::JSON::Array();
30 
31  for (size_t i=0;i<resultData.getItemsCount();++i)
32  {
33  Poco::JSON::Object::Ptr pItemElem = new Poco::JSON::Object();
34 
35  pItemElem->set(drce_json_message_const::stdoutStream, resultData.getDataItem(i).getStdoutStream());
36  pItemElem->set(drce_json_message_const::stderrStream, resultData.getDataItem(i).getStderrStream());
37  pItemElem->set(drce_json_message_const::nodeName, resultData.getDataItem(i).getNodeName());
38  pItemElem->set(drce_json_message_const::time, resultData.getDataItem(i).getTime());
39  pItemElem->set(drce_json_message_const::exitStatus, resultData.getDataItem(i).getExitStatus());
40 
41  Poco::JSON::Array::Ptr pFiles = new Poco::JSON::Array();
42 
43  const size_t filesCount = resultData.getDataItem(i).getFilesCount();
44  for (size_t k=0;k<filesCount;++k)
45  {
46  Poco::JSON::Object::Ptr pFileElem = new Poco::JSON::Object();
47  pFileElem->set(drce_json_message_const::fileName, resultData.getDataItem(i).getFileItem(k).name);
48  pFileElem->set(drce_json_message_const::fileData, resultData.getDataItem(i).getFileItem(k).data);
50  pFiles->add(pFileElem);
51  }
52  pItemElem->set(drce_json_message_const::filesArray, pFiles);
53  pItems->add(pItemElem);
54  }
55 
56  std::stringstream ostr;
57  Poco::JSON::Stringifier::stringify(pItems, ostr);
58  json = ostr.str();
59 
60  _isError = false;
61  }
62  catch(std::exception& e)
63  {
64  _isError = true;
65  errorMsg = e.what();
67  }
68  return !_isError;
69 }
70 //-----------------------------------------------------------------------------
71 bool DRCEResultDataSerializator::unserialize(const std::string& json)
72 {
73  resultData.clear();
75  errorMsg.clear();
76 
77  try
78  {
79  Poco::JSON::Parser parser;
80  Poco::Dynamic::Var res = parser.parse(json);
81 
82  Poco::Dynamic::Var tmp;
83  Poco::JSON::Array::Ptr pItems = res.extract<Poco::JSON::Array::Ptr>();
84  if (!pItems.isNull())
85  {
86  for (size_t i=0;i<pItems->size();++i)
87  {
88  Poco::JSON::Object::Ptr pItemElem = pItems->getObject(i);
89  if (!pItemElem.isNull())
90  {
91  DRCEResultDataItem dataItem;
92  tmp = pItemElem->get(drce_json_message_const::stdoutStream);
93  if (tmp.isString())
94  dataItem.setStdoutStream(tmp.convert<std::string>());
95 
96  tmp = pItemElem->get(drce_json_message_const::stderrStream);
97  if (tmp.isString())
98  dataItem.setStderrStream(tmp.convert<std::string>());
99 
100  tmp = pItemElem->get(drce_json_message_const::nodeName);
101  if (tmp.isString())
102  dataItem.setNodeName(tmp.convert<std::string>());
103 
104  tmp = pItemElem->get(drce_json_message_const::time);
105  dataItem.setTime(convertVarToNumeric<unsigned int>(tmp, 0));
106 
107  tmp = pItemElem->get(drce_json_message_const::exitStatus);
108  dataItem.setExitStatus(convertVarToNumeric<unsigned int>(tmp, 0));
109 
110  Poco::JSON::Array::Ptr pFiles = pItemElem->getArray(drce_json_message_const::filesArray);
111  if (!pFiles.isNull())
112  {
113  for (size_t k=0;k<pFiles->size();++k)
114  {
115  Poco::JSON::Object::Ptr pFileElem = pFiles->getObject(k);
116  if (!pFileElem.isNull())
117  {
118  FileItem fileItem;
119 
120  tmp = pFileElem->get(drce_json_message_const::fileName);
121  if (tmp.isString())
122  fileItem.name = tmp.convert<std::string>();
123 
124  tmp = pFileElem->get(drce_json_message_const::fileData);
125  if (tmp.isString())
126  fileItem.data = tmp.convert<std::string>();
127 
128  tmp = pFileElem->get(drce_json_message_const::actionTypeMask);
129  fileItem.actionType = convertVarToNumeric<unsigned int>(tmp, 0);
130 
131  dataItem.addFileItem(std::forward<FileItem>(fileItem));
132  }
133  }
134  }
135  resultData.addDataItem(std::forward<DRCEResultDataItem>(dataItem));
136  }
137  }
138  }
139  _isError = false;
140  }
141  catch(Poco::JSON::JSONException& e)
142  {
143  _isError = true;
144  errorMsg = e.displayText();
146  }
147  catch(Poco::Exception& e)
148  {
149  _isError = true;
150  errorMsg = e.displayText();
152  }
153  return !_isError;
154 }
155 //-----------------------------------------------------------------------------
156 //-----------------------------------------------------------------------------
157 } // namespace drce
158 } // namespace HCE