RestObjectF.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. //#include <iostream>
  4. #include <DBXJSON.hpp>
  5. #include "IdBaseComponent.hpp"
  6. #include "IdComponent.hpp"
  7. #include "IdHTTP.hpp"
  8. #include "IdTCPClient.hpp"
  9. #include "IdTCPConnection.hpp"
  10. #pragma hdrstop
  11. //#include "McJSON.hpp"
  12. //https://github.com/hydrobyte/McJSON
  13. #include "RestObjectF.h"
  14. //---------------------------------------------------------------------------
  15. #pragma package(smart_init)
  16. TRestData::TRestData()
  17. {
  18. }
  19. //---------------------------------------------------------------------------
  20. TRestData::~TRestData()
  21. {
  22. }
  23. //---------------------------------------------------------------------------
  24. TRestObject::TRestObject()
  25. {
  26. }
  27. //---------------------------------------------------------------------------
  28. TRestObject::~TRestObject()
  29. {
  30. }
  31. //---------------------------------------------------------------------------
  32. TRestObjectList::TRestObjectList()
  33. {
  34. }
  35. //---------------------------------------------------------------------------
  36. TRestObjectList::~TRestObjectList()
  37. {
  38. }
  39. //---------------------------------------------------------------------------
  40. //---------------------------------------------------------------------------
  41. //TRestObjectManager *ObjCtlrManager = NULL;
  42. //---------------------------------------------------------------------------
  43. TRestObjectManager::TRestObjectManager()
  44. {
  45. }
  46. //---------------------------------------------------------------------------
  47. TRestObjectManager::~TRestObjectManager()
  48. {
  49. }
  50. //---------------------------------------------------------------------------
  51. String TRestObjectManager::Get(String AApiUrl, TForm *AParent)
  52. {
  53. //S := TIdURI.URLEncode(str);
  54. String result = "";
  55. TIdHTTP *IdHTTP1 = new TIdHTTP(NULL);
  56. TMemoryStream *stream = new TMemoryStream();
  57. TMemo *memo = new TMemo(AParent);
  58. try {
  59. try {
  60. memo->Visible = false;
  61. memo->Parent = AParent;
  62. IdHTTP1->Request->Clear();
  63. IdHTTP1->Request->BasicAuthentication = false;
  64. IdHTTP1->Request->ContentType = "application/json; charset=utf8";
  65. IdHTTP1->Request->Accept = "application/json; charset=utf8";
  66. IdHTTP1->Request->CharSet = "utf-8";
  67. //IdHTTP1->Request->ContentEncoding = "utf-8";
  68. IdHTTP1->ReadTimeout = 5000;
  69. IdHTTP1->AllowCookies = false;
  70. IdHTTP1->HTTPOptions = IdHTTP1->HTTPOptions >> hoInProcessAuth;
  71. //IdHTTP1->IOHandler->DefStringEncoding = TEncoding::GetEncoding(949);
  72. //result = IdHTTP1->Get(AApiUrl);
  73. //return result;
  74. IdHTTP1->Get(AApiUrl, stream);
  75. stream->Position = 0;
  76. memo->Lines->BeginUpdate();
  77. memo->Lines->LoadFromStream(stream, TEncoding::UTF8);
  78. memo->Lines->EndUpdate();
  79. result = memo->Text.Trim();
  80. IdHTTP1->Disconnect();
  81. IdHTTP1->IOHandler->InputBuffer->Clear();
  82. } catch(Exception &e) {
  83. }
  84. } __finally {
  85. if (IdHTTP1) delete IdHTTP1;
  86. if (stream) delete stream;
  87. if (memo) delete memo;
  88. }
  89. return result;
  90. //RawByteString rbstr = (char*)(urlStream->Memory);
  91. //if (Pos("utf-8", IdHTTP1->Response->ContentType)==0 && (Pos("charset=utf-8", rbstr)==0))
  92. // SetCodePage(rbstr, 949, false);
  93. //else
  94. //SetCodePage(rbstr, 65001, false);
  95. //String sResult = rbstr;
  96. }
  97. //---------------------------------------------------------------------------
  98. TStream* TRestObjectManager::GetStream(String AApiUrl)
  99. {
  100. String result = "";
  101. TIdHTTP *IdHTTP1 = new TIdHTTP(NULL);
  102. TMemoryStream *stream = new TMemoryStream();
  103. try {
  104. try {
  105. IdHTTP1->Request->Clear();
  106. IdHTTP1->Request->BasicAuthentication = false;
  107. IdHTTP1->Request->ContentType = "application/json; charset=utf8";
  108. IdHTTP1->Request->Accept = "application/json; charset=utf8";
  109. IdHTTP1->Request->CharSet = "utf-8";
  110. //IdHTTP1->Request->ContentEncoding = "utf-8";
  111. IdHTTP1->ReadTimeout = 5000;
  112. IdHTTP1->AllowCookies = false;
  113. IdHTTP1->HTTPOptions = IdHTTP1->HTTPOptions >> hoInProcessAuth;
  114. //IdHTTP1->IOHandler->DefStringEncoding = TEncoding::GetEncoding(949);
  115. //result = IdHTTP1->Get(AApiUrl);
  116. //return result;
  117. IdHTTP1->Get(AApiUrl, stream);
  118. stream->Position = 0;
  119. IdHTTP1->Disconnect();
  120. IdHTTP1->IOHandler->InputBuffer->Clear();
  121. } catch(Exception &e) {
  122. }
  123. } __finally {
  124. if (IdHTTP1) delete IdHTTP1;
  125. }
  126. return stream;
  127. //RawByteString rbstr = (char*)(urlStream->Memory);
  128. //if (Pos("utf-8", IdHTTP1->Response->ContentType)==0 && (Pos("charset=utf-8", rbstr)==0))
  129. // SetCodePage(rbstr, 949, false);
  130. //else
  131. //SetCodePage(rbstr, 65001, false);
  132. //String sResult = rbstr;
  133. }
  134. //---------------------------------------------------------------------------
  135. TMcJsonItem* TRestObjectManager::ParseJsonString(String AJsonData)
  136. {
  137. String AData = AJsonData.Trim();
  138. TMcJsonItem *Json = new TMcJsonItem();
  139. try {
  140. Json->AsJSON = AData;
  141. } catch(Exception &e) {
  142. }
  143. return Json;
  144. }
  145. //---------------------------------------------------------------------------
  146. TMcJsonItem* TRestObjectManager::ParseJsonStream(TStream *AStream)
  147. {
  148. TMcJsonItem *Json = new TMcJsonItem();
  149. try {
  150. Json->LoadFromStream(AStream, true);
  151. } catch(Exception &e) {
  152. }
  153. return Json;
  154. }
  155. //---------------------------------------------------------------------------
  156. String TRestObjectManager::GetValue(TMcJsonItem *AItem, String AKey)
  157. {
  158. String result = "";
  159. if (AItem) {
  160. TMcJsonItem *value = AItem->Values[AKey];
  161. if (value) {
  162. result = value->AsString;
  163. }
  164. }
  165. return result;
  166. }
  167. //---------------------------------------------------------------------------
  168. #if 0
  169. TJSONArray *jsonArr = NULL;
  170. try {
  171. reMsg->Lines->BeginUpdate();
  172. try {
  173. /*TBytes data;
  174. data.Length = AData.Length();
  175. ZeroMemory(&data[0], data.Length);
  176. CopyMemory(&data[0], AData.c_str(), data.Length);*/
  177. TStringStream *stream = new TStringStream(AData, TEncoding::UTF8);
  178. jsonArr = (TJSONArray*)TJSONObject::ParseJSONValue(TEncoding::UTF8->GetBytes(AData), 0);
  179. jsonArr = (TJSONArray*)TJSONObject::ParseJSONValue(TEncoding::UTF8->GetBytes(AData), 0);
  180. if (!jsonArr) {
  181. reMsg->Lines->Add("*******************************************: ");
  182. reMsg->Lines->Add("JSON Data Reading Failed: ");
  183. reMsg->Lines->Add("*******************************************: ");
  184. return;
  185. }
  186. reMsg->Lines->Add("Objects: " + String(jsonArr->Size()));
  187. reMsg->Lines->Add("*******************************************: ");
  188. cameraNmbr = "";
  189. cameraId = "";
  190. cameraNm = "";
  191. cameraIp = "";
  192. cameraStream = "";
  193. for (int ii = 0; ii < jsonArr->Size(); ii++) {
  194. TJSONObject *jo = (TJSONObject*)jsonArr->Get(ii);
  195. for (int jj = 0; jj < jo->Size(); jj++) {
  196. TJSONPair *obj = jo->Get(jj);
  197. if (obj->JsonString->Value() == CAMERA_NMBR) {
  198. cameraNmbr = obj->JsonValue->Value();
  199. }
  200. else if (obj->JsonString->Value() == CAMERA_ID) {
  201. cameraId = obj->JsonValue->Value();
  202. }
  203. else if (obj->JsonString->Value() == CAMERA_NM) {
  204. cameraNm = obj->JsonValue->Value();
  205. /*
  206. String sStrVal = obj->JsonValue->Value();
  207. reMsg->Lines->Add(TEncoding::Default->GetString(TEncoding::Default->GetBytes(sStrVal)));
  208. reMsg->Lines->Add(TEncoding::UTF8->GetString(TEncoding::UTF8->GetBytes(sStrVal)));
  209. reMsg->Lines->Add(TEncoding::UTF7->GetString(TEncoding::UTF7->GetBytes(sStrVal)));
  210. reMsg->Lines->Add(TEncoding::Unicode->GetString(TEncoding::Unicode->GetBytes(sStrVal)));
  211. reMsg->Lines->Add((TEncoding::UTF8->GetBytes(sStrVal)));
  212. reMsg->Lines->Add((TEncoding::UTF7->GetBytes(sStrVal)));
  213. reMsg->Lines->Add((TEncoding::Unicode->GetBytes(sStrVal)));
  214. */
  215. }
  216. else if (obj->JsonString->Value() == CAMERA_IP) {
  217. cameraIp = obj->JsonValue->Value();
  218. }
  219. else if (obj->JsonString->Value() == CAMERA_STREAM) {
  220. cameraStream = obj->JsonValue->Value();
  221. }
  222. }
  223. reMsg->Lines->Add(cameraNmbr + "," + cameraId + "," + cameraNm + "," + cameraIp + "," + cameraStream);
  224. ObjCtlrManager->SaveCameraInfo(ii+1, cameraNmbr, cameraId, cameraNm, cameraIp, cameraStream, "");
  225. }
  226. } catch(Exception &e) {
  227. }
  228. } __finally {
  229. if (jsonArr) jsonArr->Free();
  230. reMsg->Lines->EndUpdate();
  231. }
  232. #endif
  233. #if 0
  234. reMsg->Lines->BeginUpdate();
  235. AData = StringReplace(AData, "[", "", TReplaceFlags() << rfReplaceAll);
  236. AData = StringReplace(AData, "]", "", TReplaceFlags() << rfReplaceAll);
  237. AData = StringReplace(AData, "},", "}", TReplaceFlags() << rfReplaceAll);
  238. //AData = StringReplace(AData, "{", "", TReplaceFlags() << rfReplaceAll);
  239. TStringList *pStringList = new TStringList;
  240. try {
  241. pStringList->Delimiter = '}';
  242. pStringList->StrictDelimiter = true;
  243. pStringList->DelimitedText = AData;
  244. for (int ii = 0; ii < pStringList->Count; ii++) {
  245. //reMsg->Lines->Add("*******************************************: " + String(ii+1));
  246. //reMsg->Lines->Add(pStringList->Strings[ii]);
  247. }
  248. } __finally {
  249. if (pStringList) delete pStringList;
  250. }
  251. reMsg->Lines->EndUpdate();
  252. //return;
  253. #endif
  254. //String sFileName = "C:\\UTF8FileName.xml";
  255. //Memo1->Lines->LoadFromFile(sFileName, TEncoding::UTF8);
  256. //reMsg->Lines->Clear();
  257. //reMsg->Lines->Add(AData);
  258. //String((char *)pMemoryStream->Memory, pMemoryStream->Size);
  259. #include <OleAuto.h>
  260. char* UTF8ToANSI(const char *pszCode)
  261. {
  262. BSTR bstrWide;
  263. char* pszAnsi;
  264. int nLength;
  265. // Get nLength of the Wide Char buffer
  266. nLength = MultiByteToWideChar(CP_UTF8, 0, pszCode, strlen(pszCode) + 1,
  267. NULL, NULL);
  268. bstrWide = SysAllocStringLen(NULL, nLength);
  269. // Change UTF-8 to Unicode (UTF-16)
  270. MultiByteToWideChar(CP_UTF8, 0, pszCode, strlen(pszCode) + 1, bstrWide, nLength);
  271. // Get nLength of the multi byte buffer
  272. nLength = WideCharToMultiByte(CP_ACP, 0, bstrWide, -1, NULL, 0, NULL, NULL);
  273. pszAnsi = new char[nLength];
  274. // Change from unicode to mult byte
  275. WideCharToMultiByte(CP_ACP, 0, bstrWide, -1, pszAnsi, nLength, NULL, NULL);
  276. SysFreeString(bstrWide);
  277. return pszAnsi;
  278. }
  279. AnsiString __fastcall Utf8ToAscii(UTF8String AUtf8)
  280. {
  281. int nLen;
  282. WideString sUtf16;
  283. AnsiString sAscii = "";
  284. nLen = ::MultiByteToWideChar(CP_UTF8, 0, AUtf8.c_str(), AUtf8.Length(), NULL, 0);
  285. sUtf16.SetLength(nLen);
  286. ::MultiByteToWideChar(CP_UTF8, 0, AUtf8.c_str(), AUtf8.Length(), sUtf16.c_bstr(), nLen);
  287. nLen = ::WideCharToMultiByte(CP_ACP, 0, sUtf16.c_bstr(), sUtf16.Length(), NULL, 0, NULL, NULL);
  288. sAscii.SetLength(nLen);
  289. ::WideCharToMultiByte(CP_ACP, 0, sUtf16.c_bstr(), sUtf16.Length(), sAscii.c_str(), nLen, NULL, NULL);
  290. return sAscii;
  291. }
  292. //---------------------------------------------------------------------------
  293. #if 0
  294. TJSONArray *jsonArr = NULL;
  295. try {
  296. reMsg->Lines->BeginUpdate();
  297. try {
  298. //TStringStream *stream = new TStringStream(AData, TEncoding::UTF8);
  299. //jsonArr = (TJSONArray*)TJSONObject::ParseJSONValue(TEncoding::UTF8->GetBytes(AnsiString(AData)), 0);
  300. jsonArr = (TJSONArray*)TJSONObject::ParseJSONValue(BytesOf(AData), 0);
  301. //jsonArr = (TJSONArray*)TJSONObject::ParseJSONValue(stream->DataString, 0);
  302. if (!jsonArr) {
  303. reMsg->Lines->Add("*******************************************: ");
  304. reMsg->Lines->Add("JSON Data Reading Failed: ");
  305. reMsg->Lines->Add("*******************************************: ");
  306. return;
  307. }
  308. reMsg->Lines->Add("Objects: " + String(jsonArr->Size()));
  309. reMsg->Lines->Add("*******************************************: ");
  310. cameraNmbr = "";
  311. cameraId = "";
  312. cameraNm = "";
  313. cameraIp = "";
  314. cameraStream = "";
  315. for (int ii = 0; ii < jsonArr->Size(); ii++) {
  316. TJSONObject *jo = (TJSONObject*)jsonArr->Get(ii);
  317. for (int jj = 0; jj < jo->Size(); jj++) {
  318. TJSONPair *obj = jo->Get(jj);
  319. if (obj->JsonString->Value() == CAMERA_NMBR) {
  320. cameraNmbr = obj->JsonValue->Value();
  321. }
  322. else if (obj->JsonString->Value() == CAMERA_ID) {
  323. cameraId = obj->JsonValue->Value();
  324. }
  325. else if (obj->JsonString->Value() == CAMERA_NM) {
  326. cameraNm = obj->JsonValue->Value();
  327. //RawByteString rbstr = (char*)(AnsiString(cameraNm).c_str());
  328. //SetCodePage(rbstr, 949, false);
  329. //cameraNm = rbstr;
  330. //cameraNm= String(UTF8ToANSI(AnsiString(cameraNm).c_str()));
  331. reMsg->Lines->Add(cameraNm);
  332. cameraNm = (UTF8String)(obj->JsonValue->Value()).c_str();
  333. /*
  334. String sStrVal = obj->JsonValue->Value();
  335. reMsg->Lines->Add(TEncoding::Default->GetString(TEncoding::Default->GetBytes(sStrVal)));
  336. reMsg->Lines->Add(TEncoding::UTF8->GetString(TEncoding::UTF8->GetBytes(sStrVal)));
  337. reMsg->Lines->Add(TEncoding::UTF7->GetString(TEncoding::UTF7->GetBytes(sStrVal)));
  338. reMsg->Lines->Add(TEncoding::Unicode->GetString(TEncoding::Unicode->GetBytes(sStrVal)));
  339. reMsg->Lines->Add((TEncoding::UTF8->GetBytes(sStrVal)));
  340. reMsg->Lines->Add((TEncoding::UTF7->GetBytes(sStrVal)));
  341. reMsg->Lines->Add((TEncoding::Unicode->GetBytes(sStrVal)));
  342. */
  343. }
  344. else if (obj->JsonString->Value() == CAMERA_IP) {
  345. cameraIp = obj->JsonValue->Value();
  346. }
  347. else if (obj->JsonString->Value() == CAMERA_STREAM) {
  348. cameraStream = obj->JsonValue->Value();
  349. }
  350. }
  351. reMsg->Lines->Add(cameraNmbr + "," + cameraId + "," + cameraNm + "," + cameraIp + "," + cameraStream);
  352. ObjCtlrManager->SaveCameraInfo(ii+1, cameraNmbr, cameraId, cameraNm, cameraIp, cameraStream, "");
  353. }
  354. } catch(Exception &e) {
  355. }
  356. } __finally {
  357. if (jsonArr) jsonArr->Free();
  358. reMsg->Lines->EndUpdate();
  359. }
  360. #endif