From 46f44c6f2569984514f6dfd548fd6418ca3d2b47 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Sun, 28 Apr 2024 15:06:40 +0800 Subject: [PATCH 01/24] fixed:image process ext name is incorrect --- .../APPClient_ImageExample/APPClient_ImageExample.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/XEngine_APPClient/APPClient_ImageExample/APPClient_ImageExample.cpp b/XEngine_APPClient/APPClient_ImageExample/APPClient_ImageExample.cpp index 0a453d6..2015c00 100644 --- a/XEngine_APPClient/APPClient_ImageExample/APPClient_ImageExample.cpp +++ b/XEngine_APPClient/APPClient_ImageExample/APPClient_ImageExample.cpp @@ -79,12 +79,14 @@ int test_imgzoom() FILE* pSt_File = _xtfopen(pptszListFile[i], _X("rb")); int nRet = (int)fread(ptszFileBuffer, 1, XENGINE_MEMORY_SIZE_MAX, pSt_File); fclose(pSt_File); + APPClient_ImageExample_GetAttr(ptszFileBuffer, nRet, &nWidth, &nHeight); - XCHAR tszAPIUrl[MAX_PATH]; - memset(tszAPIUrl, '\0', sizeof(tszAPIUrl)); + XCHAR tszAPIUrl[MAX_PATH] = {}; + XCHAR tszFileExt[64] = {}; - _xstprintf(tszAPIUrl, _X("http://127.0.0.1:5501/api?function=image&type=1&ext=png&width=%d&height=%d"), nWidth / 2, nHeight / 2); + BaseLib_OperatorString_GetFileAndPath(pptszListFile[i], NULL, NULL, NULL, tszFileExt); + _xstprintf(tszAPIUrl, _X("http://127.0.0.1:5501/api?function=image&type=1&ext=%s&width=%d&height=%d"), tszFileExt, nWidth / 2, nHeight / 2); XCHAR* ptszMsgBuffer = NULL; if (!APIClient_Http_Request(_X("POST"), tszAPIUrl, ptszFileBuffer, &nCode, &ptszMsgBuffer, &nRet)) -- Gitee From acc8e3b5d88aa60ea9785edd3d07508372df9919 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 29 Apr 2024 10:53:11 +0800 Subject: [PATCH 02/24] added:service name for machine --- .../ModuleDatabase_Machine.cpp | 54 +++++++++++++++---- .../ModuleProtocol_Parse.cpp | 4 ++ XEngine_Source/XEngine_UserProtocol.h | 1 + 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_Machine/ModuleDatabase_Machine.cpp b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_Machine/ModuleDatabase_Machine.cpp index 2de18b6..c080f89 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_Machine/ModuleDatabase_Machine.cpp +++ b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_Machine/ModuleDatabase_Machine.cpp @@ -95,7 +95,7 @@ bool CModuleDatabase_Machine::ModuleDatabase_Machine_Insert(XENGINE_MACHINEINFO* XCHAR tszSQLStatement[4096]; memset(tszSQLStatement, '\0', sizeof(tszSQLStatement)); - _xstprintf(tszSQLStatement, _X("INSERT INTO `XEngine_MachineList` (tszMachineName,tszMachineCode,tszMachineSystem,tszMachineText,nTimeNumber,tszCreateTime) VALUES('%s','%s','%s','%s',%lld,now())"), pSt_MachineInfo->tszMachineName, pSt_MachineInfo->tszMachineCode, pSt_MachineInfo->tszMachineSystem, pSt_MachineInfo->tszMachineText, pSt_MachineInfo->nTimeNumber); + _xstprintf(tszSQLStatement, _X("INSERT INTO `XEngine_MachineList` (tszServiceName,tszMachineName,tszMachineCode,tszMachineSystem,tszMachineText,nTimeNumber,tszCreateTime) VALUES('%s','%s','%s','%s','%s',%lld,now())"), pSt_MachineInfo->tszServiceName, pSt_MachineInfo->tszMachineName, pSt_MachineInfo->tszMachineCode, pSt_MachineInfo->tszMachineSystem, pSt_MachineInfo->tszMachineText, pSt_MachineInfo->nTimeNumber); #ifdef _MSC_BUILD XCHAR tszUTFStr[4096] = {}; int nSLen = _tcsxlen(tszSQLStatement); @@ -142,7 +142,14 @@ bool CModuleDatabase_Machine::ModuleDatabase_Machine_Query(XENGINE_MACHINEINFO* XCHAR tszSQLStatement[1024]; memset(tszSQLStatement, '\0', sizeof(tszSQLStatement)); - _xstprintf(tszSQLStatement, _X("SELECT * FROM `XEngine_MachineList` WHERE tszMachineCode = '%s'"), pSt_MachineInfo->tszMachineCode); + if (_tcsxlen(pSt_MachineInfo->tszServiceName) > 0) + { + _xstprintf(tszSQLStatement, _X("SELECT * FROM `XEngine_MachineList` WHERE tszMachineCode = '%s' AND tszServiceName = '%s'"), pSt_MachineInfo->tszMachineCode, pSt_MachineInfo->tszServiceName); + } + else + { + _xstprintf(tszSQLStatement, _X("SELECT * FROM `XEngine_MachineList` WHERE tszMachineCode = '%s'"), pSt_MachineInfo->tszMachineCode); + } if (!DataBase_MySQL_ExecuteQuery(xhDBSQL, &xhTable, tszSQLStatement, &nllLine, &nllRow)) { DBModule_IsErrorOccur = true; @@ -219,11 +226,25 @@ bool CModuleDatabase_Machine::ModuleDatabase_Machine_Delete(XENGINE_MACHINEINFO* if (_tcsxlen(pSt_MachineInfo->tszMachineCode) > 0) { - _xstprintf(tszSQLStatement, _X("DELETE FROM `XEngine_MachineList` WHERE tszMachineCode = '%s'"), pSt_MachineInfo->tszMachineCode); + if (_tcsxlen(pSt_MachineInfo->tszServiceName) > 0) + { + _xstprintf(tszSQLStatement, _X("DELETE FROM `XEngine_MachineList` WHERE tszMachineCode = '%s' AND tszServiceName = '%s'"), pSt_MachineInfo->tszMachineCode, pSt_MachineInfo->tszServiceName); + } + else + { + _xstprintf(tszSQLStatement, _X("DELETE FROM `XEngine_MachineList` WHERE tszMachineCode = '%s'"), pSt_MachineInfo->tszMachineCode); + } } else { - _xstprintf(tszSQLStatement, _X("DELETE FROM `XEngine_MachineList` WHERE tszMachineName = '%s'"), pSt_MachineInfo->tszMachineName); + if (_tcsxlen(pSt_MachineInfo->tszServiceName) > 0) + { + _xstprintf(tszSQLStatement, _X("DELETE FROM `XEngine_MachineList` WHERE tszMachineName = '%s' AND tszServiceName = '%s'"), pSt_MachineInfo->tszMachineName, pSt_MachineInfo->tszServiceName); + } + else + { + _xstprintf(tszSQLStatement, _X("DELETE FROM `XEngine_MachineList` WHERE tszMachineName = '%s'"), pSt_MachineInfo->tszMachineName); + } } if (!DataBase_MySQL_Execute(xhDBSQL, tszSQLStatement)) @@ -260,7 +281,14 @@ bool CModuleDatabase_Machine::ModuleDatabase_Machine_UPDate(XENGINE_MACHINEINFO* XCHAR tszSQLStatement[1024]; memset(tszSQLStatement, '\0', sizeof(tszSQLStatement)); - _xstprintf(tszSQLStatement, _X("UPDATE `XEngine_MachineList` SET nTimeNumber = %lld WHERE tszMachineCode = '%s'"), pSt_MachineInfo->nTimeNumber, pSt_MachineInfo->tszMachineCode); + if (_tcsxlen(pSt_MachineInfo->tszServiceName) > 0) + { + _xstprintf(tszSQLStatement, _X("UPDATE `XEngine_MachineList` SET nTimeNumber = %lld WHERE tszMachineCode = '%s' AND tszServiceName = '%s'"), pSt_MachineInfo->nTimeNumber, pSt_MachineInfo->tszMachineCode, pSt_MachineInfo->tszServiceName); + } + else + { + _xstprintf(tszSQLStatement, _X("UPDATE `XEngine_MachineList` SET nTimeNumber = %lld WHERE tszMachineCode = '%s'"), pSt_MachineInfo->nTimeNumber, pSt_MachineInfo->tszMachineCode); + } if (!DataBase_MySQL_Execute(xhDBSQL, tszSQLStatement)) { @@ -325,27 +353,31 @@ bool CModuleDatabase_Machine::ModuleDatabase_Machine_List(XENGINE_MACHINEINFO*** } if (NULL != pptszResult[1]) { - _tcsxcpy((*pppSt_MachineInfo)[i]->tszMachineName, pptszResult[1]); + _tcsxcpy((*pppSt_MachineInfo)[i]->tszServiceName, pptszResult[1]); } if (NULL != pptszResult[2]) { - _tcsxcpy((*pppSt_MachineInfo)[i]->tszMachineCode, pptszResult[2]); + _tcsxcpy((*pppSt_MachineInfo)[i]->tszMachineName, pptszResult[2]); } if (NULL != pptszResult[3]) { - _tcsxcpy((*pppSt_MachineInfo)[i]->tszMachineSystem, pptszResult[3]); + _tcsxcpy((*pppSt_MachineInfo)[i]->tszMachineCode, pptszResult[3]); } if (NULL != pptszResult[4]) { - _tcsxcpy((*pppSt_MachineInfo)[i]->tszMachineText, pptszResult[4]); + _tcsxcpy((*pppSt_MachineInfo)[i]->tszMachineSystem, pptszResult[4]); } if (NULL != pptszResult[5]) { - (*pppSt_MachineInfo)[i]->nTimeNumber = _ttxoll(pptszResult[5]); + _tcsxcpy((*pppSt_MachineInfo)[i]->tszMachineText, pptszResult[5]); } if (NULL != pptszResult[6]) { - _tcsxcpy((*pppSt_MachineInfo)[i]->tszCreateTime, pptszResult[6]); + (*pppSt_MachineInfo)[i]->nTimeNumber = _ttxoll(pptszResult[6]); + } + if (NULL != pptszResult[7]) + { + _tcsxcpy((*pppSt_MachineInfo)[i]->tszCreateTime, pptszResult[7]); } } DataBase_MySQL_FreeResult(xhDBSQL, xhTable); diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp index 8ab8ee1..451c3a6 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp @@ -1116,6 +1116,10 @@ bool CModuleProtocol_Parse::ModuleProtocol_Parse_Machine(LPCXSTR lpszMsgBuffer, return false; } + if (!st_JsonRoot["tszServiceName"].isNull()) + { + _tcsxcpy(pSt_MachineInfo->tszServiceName, st_JsonRoot["tszServiceName"].asCString()); + } if (!st_JsonRoot["tszMachineName"].isNull()) { _tcsxcpy(pSt_MachineInfo->tszMachineName, st_JsonRoot["tszMachineName"].asCString()); diff --git a/XEngine_Source/XEngine_UserProtocol.h b/XEngine_Source/XEngine_UserProtocol.h index fd4dc56..61bfebe 100644 --- a/XEngine_Source/XEngine_UserProtocol.h +++ b/XEngine_Source/XEngine_UserProtocol.h @@ -233,6 +233,7 @@ typedef struct typedef struct { XCHAR tszMachineText[2048]; + XCHAR tszServiceName[MAX_PATH]; XCHAR tszMachineName[MAX_PATH]; XCHAR tszMachineCode[MAX_PATH]; XCHAR tszMachineSystem[MAX_PATH]; -- Gitee From b595ce0ce080224c930c55736ac69563d14ae396 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 29 Apr 2024 10:53:38 +0800 Subject: [PATCH 03/24] update:machine sql --- XEngine_SQL/XEngine_APIMachine.sql | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/XEngine_SQL/XEngine_APIMachine.sql b/XEngine_SQL/XEngine_APIMachine.sql index fbd30c9..ab94f25 100644 --- a/XEngine_SQL/XEngine_APIMachine.sql +++ b/XEngine_SQL/XEngine_APIMachine.sql @@ -1,17 +1,17 @@ /* Navicat Premium Data Transfer - Source Server : mysql + Source Server : QCloud Source Server Type : MySQL Source Server Version : 80036 (8.0.36-0ubuntu0.22.04.1) - Source Host : 10.0.3.154:3306 + Source Host : 43.139.170.67:3306 Source Schema : XEngine_APIMachine Target Server Type : MySQL Target Server Version : 80036 (8.0.36-0ubuntu0.22.04.1) File Encoding : 65001 - Date: 07/04/2024 14:19:54 + Date: 29/04/2024 10:51:26 */ SET NAMES utf8mb4; @@ -23,6 +23,7 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `XEngine_MachineList`; CREATE TABLE `XEngine_MachineList` ( `ID` int NOT NULL AUTO_INCREMENT COMMENT 'ID', + `tszServiceName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '服务名称', `tszMachineName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '机器名称', `tszMachineCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '机器序列', `tszMachineSystem` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '系统名称', @@ -30,6 +31,6 @@ CREATE TABLE `XEngine_MachineList` ( `nTimeNumber` bigint NOT NULL COMMENT '启动次数', `tszCreateTime` datetime NOT NULL COMMENT '注册时间', PRIMARY KEY (`ID`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; SET FOREIGN_KEY_CHECKS = 1; -- Gitee From 4ce238ad91a757ffc3c47a0d8466b5e55ec0f754 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 30 Apr 2024 16:38:56 +0800 Subject: [PATCH 04/24] modify:jsoncpp is depend sub module --- .gitmodules | 3 + XEngine_Source/Makefile | 2 +- XEngine_Source/XEngine.sln | 84 +- XEngine_Source/XEngine_Depend | 1 + .../XEngine_ModuleConfigure/Makefile | 4 +- .../XEngine_ModuleConfigure.vcxproj | 2 +- .../XEngine_ModuleProtocol/Makefile | 4 +- .../XEngine_ModuleProtocol.vcxproj | 2 +- .../ModulePlugin_BMIndex/Makefile | 4 +- .../ModulePlugin_BMIndex.vcxproj | 2 +- .../ModulePlugin_IPAddr/Makefile | 4 +- .../ModulePlugin_IPAddr.vcxproj | 2 +- .../ModulePlugin_Meter/Makefile | 4 +- .../ModulePlugin_Meter.vcxproj | 2 +- .../ModulePlugin_Password/Makefile | 4 +- .../ModulePlugin_Password.vcxproj | 2 +- .../ModulePlugin_Phone/Makefile | 4 +- .../ModulePlugin_Phone.vcxproj | 2 +- .../ModulePlugin_Timezone/Makefile | 4 +- .../ModulePlugin_Timezone.vcxproj | 2 +- .../ModulePlugin_Zodiac/Makefile | 4 +- .../ModulePlugin_Zodiac.vcxproj | 2 +- .../XEngine_HttpApp/Makefile | 4 +- .../XEngine_ThirdPart/jsoncpp/Makefile | 71 - .../jsoncpp/json/allocator.h | 88 - .../jsoncpp/json/assertions.h | 61 - .../XEngine_ThirdPart/jsoncpp/json/config.h | 150 -- .../XEngine_ThirdPart/jsoncpp/json/forwards.h | 43 - .../XEngine_ThirdPart/jsoncpp/json/json.h | 15 - .../jsoncpp/json/json_features.h | 61 - .../XEngine_ThirdPart/jsoncpp/json/reader.h | 405 ---- .../XEngine_ThirdPart/jsoncpp/json/value.h | 935 -------- .../XEngine_ThirdPart/jsoncpp/json/version.h | 28 - .../XEngine_ThirdPart/jsoncpp/json/writer.h | 369 --- .../XEngine_ThirdPart/jsoncpp/json_reader.cpp | 1992 ----------------- .../XEngine_ThirdPart/jsoncpp/json_tool.h | 138 -- .../XEngine_ThirdPart/jsoncpp/json_value.cpp | 1634 -------------- .../jsoncpp/json_valueiterator.inl | 156 -- .../XEngine_ThirdPart/jsoncpp/json_writer.cpp | 1259 ----------- .../XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj | 177 -- .../jsoncpp/jsoncpp.vcxproj.filters | 63 - .../jsoncpp/jsoncpp.vcxproj.user | 4 - 42 files changed, 105 insertions(+), 7692 deletions(-) create mode 100644 .gitmodules create mode 160000 XEngine_Source/XEngine_Depend delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/allocator.h delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/assertions.h delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/config.h delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/forwards.h delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json.h delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json_features.h delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/reader.h delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/value.h delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/version.h delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/writer.h delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json_reader.cpp delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json_tool.h delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json_value.cpp delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json_valueiterator.inl delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json_writer.cpp delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.filters delete mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.user diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..1cc1974 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "XEngine_Source/XEngine_Depend"] + path = XEngine_Source/XEngine_Depend + url = https://github.com/libxengine/XEngine_OPenSource.git diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index a9e2bff..ecba64a 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -4,7 +4,7 @@ PLATFORM=linux FLAGS= #要编译的模块 -THIRDPART_MODULE_JSONCPP = ./XEngine_ThirdPart/jsoncpp +THIRDPART_MODULE_JSONCPP = ./XEngine_Depend/XEngine_Module/jsoncpp MODULE_CONFIGURE_PATH = ./XEngine_ModuleConfigure MODULE_DATABASE_PATH = ./XEngine_ModuleDatabase diff --git a/XEngine_Source/XEngine.sln b/XEngine_Source/XEngine.sln index 8a3ed84..1702a83 100644 --- a/XEngine_Source/XEngine.sln +++ b/XEngine_Source/XEngine.sln @@ -4,6 +4,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 17.1.32210.238 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_ModuleConfigure", "XEngine_ModuleConfigure\XEngine_ModuleConfigure.vcxproj", "{F54F152C-594F-4465-A44E-2DB915B39760}" + ProjectSection(ProjectDependencies) = postProject + {81DD7437-D986-4C9E-848C-589856FACEBD} = {81DD7437-D986-4C9E-848C-589856FACEBD} + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XEngine_UserHdr", "XEngine_UserHdr", "{9E4F2158-9AC1-4C19-A3F7-375A9DBCF856}" ProjectSection(SolutionItems) = preProject @@ -14,14 +17,30 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XEngine_ServiceApp", "XEngine_ServiceApp", "{79A9A569-7DA8-4D9D-AD34-D11115199EA1}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_HttpApp", "XEngine_ServiceApp\XEngine_HttpApp\XEngine_HttpApp.vcxproj", "{E756B7D2-D40D-4106-9C14-1D90F20A712E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XEngine_ThirdPart", "XEngine_ThirdPart", "{1F64BA84-8754-4FD3-87F8-9102F124EBC1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jsoncpp", "XEngine_ThirdPart\jsoncpp\jsoncpp.vcxproj", "{F1736B3F-03A2-4FC7-B045-A12BA8D724FB}" + ProjectSection(ProjectDependencies) = postProject + {140AD4A9-4918-4345-B352-507C345AEBE0} = {140AD4A9-4918-4345-B352-507C345AEBE0} + {201B6D13-82A7-49E9-9736-D6B3BFE05B30} = {201B6D13-82A7-49E9-9736-D6B3BFE05B30} + {32BB166A-3D3D-45EF-8BED-2E0471274159} = {32BB166A-3D3D-45EF-8BED-2E0471274159} + {37B8E91F-EC52-41F0-B21D-441D4270C05F} = {37B8E91F-EC52-41F0-B21D-441D4270C05F} + {6C935BE1-77E3-4719-A7A6-C76ABAFEE010} = {6C935BE1-77E3-4719-A7A6-C76ABAFEE010} + {6D0FCB40-D544-4AB2-A239-2FEBC4B98F6D} = {6D0FCB40-D544-4AB2-A239-2FEBC4B98F6D} + {6F111577-DAF8-4294-B516-0077C22D7613} = {6F111577-DAF8-4294-B516-0077C22D7613} + {81DD7437-D986-4C9E-848C-589856FACEBD} = {81DD7437-D986-4C9E-848C-589856FACEBD} + {8FBC495D-C05E-49A4-B938-A81C9DFC1E5A} = {8FBC495D-C05E-49A4-B938-A81C9DFC1E5A} + {92F971AB-CAC9-4D9B-A9CA-AFD9CA17E505} = {92F971AB-CAC9-4D9B-A9CA-AFD9CA17E505} + {BBC4B2B4-1143-45DF-8890-47CE26A61D0E} = {BBC4B2B4-1143-45DF-8890-47CE26A61D0E} + {CB443280-E283-44CD-B956-52C404A51DB6} = {CB443280-E283-44CD-B956-52C404A51DB6} + {D549160C-CC16-47F8-8345-1F4CF7A25CA2} = {D549160C-CC16-47F8-8345-1F4CF7A25CA2} + {F54F152C-594F-4465-A44E-2DB915B39760} = {F54F152C-594F-4465-A44E-2DB915B39760} + {F6520D2C-BB8E-45BB-964B-F5D6A4318A89} = {F6520D2C-BB8E-45BB-964B-F5D6A4318A89} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_ModuleDatabase", "XEngine_ModuleDatabase\XEngine_ModuleDatabase.vcxproj", "{140AD4A9-4918-4345-B352-507C345AEBE0}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_ModuleProtocol", "XEngine_ModuleProtocol\XEngine_ModuleProtocol.vcxproj", "{6C935BE1-77E3-4719-A7A6-C76ABAFEE010}" + ProjectSection(ProjectDependencies) = postProject + {81DD7437-D986-4C9E-848C-589856FACEBD} = {81DD7437-D986-4C9E-848C-589856FACEBD} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_ModuleHelp", "XEngine_ModuleHelp\XEngine_ModuleHelp.vcxproj", "{6D0FCB40-D544-4AB2-A239-2FEBC4B98F6D}" EndProject @@ -30,21 +49,51 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XEngine_PluginModule", "XEngine_PluginModule", "{D0473C03-9464-4C44-818A-AE212680CD05}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libModulePlugin_Zodiac", "XEngine_PluginModule\ModulePlugin_Zodiac\ModulePlugin_Zodiac.vcxproj", "{32BB166A-3D3D-45EF-8BED-2E0471274159}" + ProjectSection(ProjectDependencies) = postProject + {81DD7437-D986-4C9E-848C-589856FACEBD} = {81DD7437-D986-4C9E-848C-589856FACEBD} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libModulePlugin_Password", "XEngine_PluginModule\ModulePlugin_Password\ModulePlugin_Password.vcxproj", "{201B6D13-82A7-49E9-9736-D6B3BFE05B30}" + ProjectSection(ProjectDependencies) = postProject + {81DD7437-D986-4C9E-848C-589856FACEBD} = {81DD7437-D986-4C9E-848C-589856FACEBD} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libModulePlugin_Timezone", "XEngine_PluginModule\ModulePlugin_Timezone\ModulePlugin_Timezone.vcxproj", "{37B8E91F-EC52-41F0-B21D-441D4270C05F}" + ProjectSection(ProjectDependencies) = postProject + {81DD7437-D986-4C9E-848C-589856FACEBD} = {81DD7437-D986-4C9E-848C-589856FACEBD} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libModulePlugin_BMIndex", "XEngine_PluginModule\ModulePlugin_BMIndex\ModulePlugin_BMIndex.vcxproj", "{BBC4B2B4-1143-45DF-8890-47CE26A61D0E}" + ProjectSection(ProjectDependencies) = postProject + {81DD7437-D986-4C9E-848C-589856FACEBD} = {81DD7437-D986-4C9E-848C-589856FACEBD} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libModulePlugin_Meter", "XEngine_PluginModule\ModulePlugin_Meter\ModulePlugin_Meter.vcxproj", "{6F111577-DAF8-4294-B516-0077C22D7613}" + ProjectSection(ProjectDependencies) = postProject + {81DD7437-D986-4C9E-848C-589856FACEBD} = {81DD7437-D986-4C9E-848C-589856FACEBD} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libModulePlugin_Phone", "XEngine_PluginModule\ModulePlugin_Phone\ModulePlugin_Phone.vcxproj", "{8FBC495D-C05E-49A4-B938-A81C9DFC1E5A}" + ProjectSection(ProjectDependencies) = postProject + {81DD7437-D986-4C9E-848C-589856FACEBD} = {81DD7437-D986-4C9E-848C-589856FACEBD} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libModulePlugin_IPAddr", "XEngine_PluginModule\ModulePlugin_IPAddr\ModulePlugin_IPAddr.vcxproj", "{D549160C-CC16-47F8-8345-1F4CF7A25CA2}" + ProjectSection(ProjectDependencies) = postProject + {81DD7437-D986-4C9E-848C-589856FACEBD} = {81DD7437-D986-4C9E-848C-589856FACEBD} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_ModuleSystem", "XEngine_ModuleSystem\XEngine_ModuleSystem.vcxproj", "{92F971AB-CAC9-4D9B-A9CA-AFD9CA17E505}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XEngine_Depend", "XEngine_Depend", "{2B89A3C7-0CC8-4881-B195-61BAA9ACB78B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jsoncpp", "XEngine_Depend\XEngine_Module\jsoncpp\jsoncpp.vcxproj", "{81DD7437-D986-4C9E-848C-589856FACEBD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_InfoReport", "XEngine_Depend\XEngine_Module\XEngine_InfoReport\XEngine_InfoReport.vcxproj", "{F6520D2C-BB8E-45BB-964B-F5D6A4318A89}" + ProjectSection(ProjectDependencies) = postProject + {81DD7437-D986-4C9E-848C-589856FACEBD} = {81DD7437-D986-4C9E-848C-589856FACEBD} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -69,14 +118,6 @@ Global {E756B7D2-D40D-4106-9C14-1D90F20A712E}.Release|x64.Build.0 = Release|x64 {E756B7D2-D40D-4106-9C14-1D90F20A712E}.Release|x86.ActiveCfg = Release|Win32 {E756B7D2-D40D-4106-9C14-1D90F20A712E}.Release|x86.Build.0 = Release|Win32 - {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Debug|x64.ActiveCfg = Debug|x64 - {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Debug|x64.Build.0 = Debug|x64 - {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Debug|x86.ActiveCfg = Debug|Win32 - {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Debug|x86.Build.0 = Debug|Win32 - {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Release|x64.ActiveCfg = Release|x64 - {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Release|x64.Build.0 = Release|x64 - {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Release|x86.ActiveCfg = Release|Win32 - {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Release|x86.Build.0 = Release|Win32 {140AD4A9-4918-4345-B352-507C345AEBE0}.Debug|x64.ActiveCfg = Debug|x64 {140AD4A9-4918-4345-B352-507C345AEBE0}.Debug|x64.Build.0 = Debug|x64 {140AD4A9-4918-4345-B352-507C345AEBE0}.Debug|x86.ActiveCfg = Debug|Win32 @@ -173,13 +214,28 @@ Global {92F971AB-CAC9-4D9B-A9CA-AFD9CA17E505}.Release|x64.Build.0 = Release|x64 {92F971AB-CAC9-4D9B-A9CA-AFD9CA17E505}.Release|x86.ActiveCfg = Release|Win32 {92F971AB-CAC9-4D9B-A9CA-AFD9CA17E505}.Release|x86.Build.0 = Release|Win32 + {81DD7437-D986-4C9E-848C-589856FACEBD}.Debug|x64.ActiveCfg = Debug|x64 + {81DD7437-D986-4C9E-848C-589856FACEBD}.Debug|x64.Build.0 = Debug|x64 + {81DD7437-D986-4C9E-848C-589856FACEBD}.Debug|x86.ActiveCfg = Debug|Win32 + {81DD7437-D986-4C9E-848C-589856FACEBD}.Debug|x86.Build.0 = Debug|Win32 + {81DD7437-D986-4C9E-848C-589856FACEBD}.Release|x64.ActiveCfg = Release|x64 + {81DD7437-D986-4C9E-848C-589856FACEBD}.Release|x64.Build.0 = Release|x64 + {81DD7437-D986-4C9E-848C-589856FACEBD}.Release|x86.ActiveCfg = Release|Win32 + {81DD7437-D986-4C9E-848C-589856FACEBD}.Release|x86.Build.0 = Release|Win32 + {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Debug|x64.ActiveCfg = Debug|x64 + {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Debug|x64.Build.0 = Debug|x64 + {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Debug|x86.ActiveCfg = Debug|Win32 + {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Debug|x86.Build.0 = Debug|Win32 + {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Release|x64.ActiveCfg = Release|x64 + {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Release|x64.Build.0 = Release|x64 + {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Release|x86.ActiveCfg = Release|Win32 + {F6520D2C-BB8E-45BB-964B-F5D6A4318A89}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {E756B7D2-D40D-4106-9C14-1D90F20A712E} = {79A9A569-7DA8-4D9D-AD34-D11115199EA1} - {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} = {1F64BA84-8754-4FD3-87F8-9102F124EBC1} {32BB166A-3D3D-45EF-8BED-2E0471274159} = {D0473C03-9464-4C44-818A-AE212680CD05} {201B6D13-82A7-49E9-9736-D6B3BFE05B30} = {D0473C03-9464-4C44-818A-AE212680CD05} {37B8E91F-EC52-41F0-B21D-441D4270C05F} = {D0473C03-9464-4C44-818A-AE212680CD05} @@ -187,6 +243,8 @@ Global {6F111577-DAF8-4294-B516-0077C22D7613} = {D0473C03-9464-4C44-818A-AE212680CD05} {8FBC495D-C05E-49A4-B938-A81C9DFC1E5A} = {D0473C03-9464-4C44-818A-AE212680CD05} {D549160C-CC16-47F8-8345-1F4CF7A25CA2} = {D0473C03-9464-4C44-818A-AE212680CD05} + {81DD7437-D986-4C9E-848C-589856FACEBD} = {2B89A3C7-0CC8-4881-B195-61BAA9ACB78B} + {F6520D2C-BB8E-45BB-964B-F5D6A4318A89} = {2B89A3C7-0CC8-4881-B195-61BAA9ACB78B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9B202F91-A601-429E-BB0F-880DDEE096FE} diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend new file mode 160000 index 0000000..eff2078 --- /dev/null +++ b/XEngine_Source/XEngine_Depend @@ -0,0 +1 @@ +Subproject commit eff207853feeb6b9adf6fb282e456a44ff50242e diff --git a/XEngine_Source/XEngine_ModuleConfigure/Makefile b/XEngine_Source/XEngine_ModuleConfigure/Makefile index 1584487..5cd309e 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/Makefile +++ b/XEngine_Source/XEngine_ModuleConfigure/Makefile @@ -6,8 +6,8 @@ FILEEXT = LIBFLAG = RELEASE = 0 UNICODE = 0 -LOADHDR = -I ./ -I ../XEngine_ThirdPart/jsoncpp -LOADSO = -L ../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ -I ../XEngine_Depend/XEngine_Module/jsoncpp +LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp LIB = -ljsoncpp LIBEX = OBJECTS = ModuleConfigure_Json.o pch.o diff --git a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj index 2f05479..bb6fa3a 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj +++ b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj @@ -72,7 +72,7 @@ true - $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) diff --git a/XEngine_Source/XEngine_ModuleProtocol/Makefile b/XEngine_Source/XEngine_ModuleProtocol/Makefile index b492891..3a15f45 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/Makefile +++ b/XEngine_Source/XEngine_ModuleProtocol/Makefile @@ -6,8 +6,8 @@ FILEEXT = LIBFLAG = RELEASE = 0 UNICODE = 0 -LOADHDR = -I ./ -I ../XEngine_ThirdPart/jsoncpp -LOADSO = -L ../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ -I ../XEngine_Depend/XEngine_Module/jsoncpp +LOADSO = -L ../XEngine_Depend/XEngine_Module/jsoncpp LIB = -lXEngine_BaseLib -lNetHelp_XSocket -ljsoncpp LIBEX = OBJECTS = ModuleProtocol_Packet.o ModuleProtocol_Parse.o pch.o diff --git a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj index 5fb7e2f..63bf890 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj +++ b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj @@ -72,7 +72,7 @@ true - $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/Makefile b/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/Makefile index 11613aa..ffff591 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/Makefile +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/Makefile @@ -6,8 +6,8 @@ FILEEXT = LIBFLAG = RELEASE = 0 UNICODE = 0 -LOADHDR = -I ./ -I ../../XEngine_ThirdPart/jsoncpp -LOADSO = -L ../../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ -I ../../XEngine_Depend/XEngine_Module/jsoncpp +LOADSO = -L ../../XEngine_Depend/XEngine_Module/jsoncpp LIB = -lXEngine_BaseLib -ljsoncpp LIBEX = OBJECTS = Plugin_BMIndex.o pch.o diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/ModulePlugin_BMIndex.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/ModulePlugin_BMIndex.vcxproj index 5a26533..d9c3c4b 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/ModulePlugin_BMIndex.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/ModulePlugin_BMIndex.vcxproj @@ -73,7 +73,7 @@ $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ - ../../XEngine_ThirdPart/jsoncpp;$(XEngine_Include);$(IncludePath) + ../../XEngine_Depend/XEngine_Module/jsoncpp;$(XEngine_Include);$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(Configuration)\XEngine_LibPlugin\ $(ProjectName) diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/Makefile b/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/Makefile index 4a08ae0..98e7136 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/Makefile +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/Makefile @@ -6,8 +6,8 @@ FILEEXT = LIBFLAG = RELEASE = 0 UNICODE = 0 -LOADHDR = -I ./ -I ../../XEngine_ThirdPart/jsoncpp -LOADSO = -L ../../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ -I ../../XEngine_Depend/XEngine_Module/jsoncpp +LOADSO = -L ../../XEngine_Depend/XEngine_Module/jsoncpp LIB = -lXEngine_BaseLib -ljsoncpp LIBEX = OBJECTS = ModulePlugin_IPAddr.o ModulePlugin_Interface.o pch.o diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/ModulePlugin_IPAddr.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/ModulePlugin_IPAddr.vcxproj index e79494b..3755818 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/ModulePlugin_IPAddr.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/ModulePlugin_IPAddr.vcxproj @@ -72,7 +72,7 @@ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ $(Configuration)\XEngine_LibPlugin\ diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/Makefile b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/Makefile index fe14c33..309d71a 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/Makefile +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/Makefile @@ -6,8 +6,8 @@ FILEEXT = LIBFLAG = RELEASE = 0 UNICODE = 0 -LOADHDR = -I ./ -I ../../XEngine_ThirdPart/jsoncpp -LOADSO = -L ../../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ -I ../../XEngine_Depend/XEngine_Module/jsoncpp +LOADSO = -L ../../XEngine_Depend/XEngine_Module/jsoncpp LIB = -lXEngine_BaseLib -ljsoncpp LIBEX = OBJECTS = Plugin_Meter.o pch.o diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/ModulePlugin_Meter.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/ModulePlugin_Meter.vcxproj index f5f2394..54d449c 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/ModulePlugin_Meter.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/ModulePlugin_Meter.vcxproj @@ -74,7 +74,7 @@ $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ $(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/Makefile b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/Makefile index 55d72fa..82c89bb 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/Makefile +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/Makefile @@ -6,8 +6,8 @@ FILEEXT = LIBFLAG = RELEASE = 0 UNICODE = 0 -LOADHDR = -I ./ -I ../../XEngine_ThirdPart/jsoncpp -LOADSO = -L ../../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ -I ../../XEngine_Depend/XEngine_Module/jsoncpp +LOADSO = -L ../../XEngine_Depend/XEngine_Module/jsoncpp LIB = -lXEngine_BaseLib -ljsoncpp LIBEX = OBJECTS = Plugin_Password.o pch.o diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/ModulePlugin_Password.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/ModulePlugin_Password.vcxproj index f3effd5..704319b 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/ModulePlugin_Password.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/ModulePlugin_Password.vcxproj @@ -74,7 +74,7 @@ true $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(Configuration)\XEngine_LibPlugin\ diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/Makefile b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/Makefile index 485283f..e7c2e6e 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/Makefile +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/Makefile @@ -6,8 +6,8 @@ FILEEXT = LIBFLAG = RELEASE = 0 UNICODE = 0 -LOADHDR = -I ./ -I ../../XEngine_ThirdPart/jsoncpp -LOADSO = -L ../../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ -I ../../XEngine_Depend/XEngine_Module/jsoncpp +LOADSO = -L ../../XEngine_Depend/XEngine_Module/jsoncpp LIB = -lXEngine_BaseLib -ljsoncpp LIBEX = OBJECTS = ModulePlugin_DBPhone.o ModulePlugin_APIPhone.o pch.o diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/ModulePlugin_Phone.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/ModulePlugin_Phone.vcxproj index 8918a35..7caf3a0 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/ModulePlugin_Phone.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/ModulePlugin_Phone.vcxproj @@ -72,7 +72,7 @@ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ $(Configuration)\XEngine_LibPlugin\ diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/Makefile b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/Makefile index 448677d..d6369d4 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/Makefile +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/Makefile @@ -6,8 +6,8 @@ FILEEXT = LIBFLAG = RELEASE = 0 UNICODE = 0 -LOADHDR = -I ./ -I ../../XEngine_ThirdPart/jsoncpp -LOADSO = -L ../../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ -I ../../XEngine_Depend/XEngine_Module/jsoncpp +LOADSO = -L ../../XEngine_Depend/XEngine_Module/jsoncpp LIB = -lXEngine_BaseLib -ljsoncpp LIBEX = OBJECTS = Plugin_Timezone.o pch.o diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/ModulePlugin_Timezone.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/ModulePlugin_Timezone.vcxproj index 4e27953..3fd15e4 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/ModulePlugin_Timezone.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/ModulePlugin_Timezone.vcxproj @@ -72,7 +72,7 @@ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ $(Configuration)\XEngine_LibPlugin\ diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/Makefile b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/Makefile index 1c9a66b..b224754 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/Makefile +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/Makefile @@ -6,8 +6,8 @@ FILEEXT = LIBFLAG = RELEASE = 0 UNICODE = 0 -LOADHDR = -I ./ -I ../../XEngine_ThirdPart/jsoncpp -LOADSO = -L ../../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ -I ../../XEngine_Depend/XEngine_Module/jsoncpp +LOADSO = -L ../../XEngine_Depend/XEngine_Module/jsoncpp LIB = -lXEngine_BaseLib -ljsoncpp LIBEX = OBJECTS = Plugin_Zodiac.o pch.o diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/ModulePlugin_Zodiac.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/ModulePlugin_Zodiac.vcxproj index e5bd63c..5098ba5 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/ModulePlugin_Zodiac.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/ModulePlugin_Zodiac.vcxproj @@ -75,7 +75,7 @@ true $(Configuration)\XEngine_LibPlugin\ $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile index c4b4e10..d83a5cc 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile @@ -6,9 +6,9 @@ FILEEXT = LIBFLAG = RELEASE = 0 UNICODE = 0 -LOADHDR = -I ./ -I ../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ LOADSO = -L ../../XEngine_ModuleConfigure -L ../../XEngine_ModuleDatabase -L ../../XEngine_ModuleProtocol -L ../../XEngine_ModuleSystem -L ../../XEngine_ModuleHelp -L ../../XEngine_ModulePlugin \ - -L ../../XEngine_ThirdPart/jsoncpp + -L ../../XEngine_Depend/XEngine_Module/jsoncpp LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXEngine_OPenSsl -lXClient_Stream -lXClient_APIHelp -lHelpComponents_XLog -lRfcComponents_HttpProtocol -lXEngine_ProcFile -lXEngine_SystemApi -lXEngine_AVHelp -lXEngine_VideoCodec -lXEngine_AudioCodec -lXEngine_AVCollect \ -lXEngine_ModuleConfigure -lXEngine_ModuleDatabase -lXEngine_ModuleProtocol -lXEngine_ModuleSystem -lXEngine_ModuleHelp -lXEngine_ModulePlugin \ -ljsoncpp diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile b/XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile deleted file mode 100644 index 39af933..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -CC = g++ -Wall -std=c++17 -fPIC -PLATFORM = linux -PLATVER = -PLATDIR = -FILEEXT = -LIBFLAG = -RELEASE = 0 -UNICODE = 0 -LOADHDR = -I ./ -LOADSO = -L -LIB = -LIBEX = -OBJECTS = json_reader.o json_value.o json_writer.o - -ifeq ($(RELEASE),1) -FLAGS = -c -DEBUG = -else -FLAGS = -c -lc_p -DEBUG = -g -pg -endif - -ifeq ($(UNICODE),1) -UNICODE = -D _UNICODE -else -UNICODE = -endif - -ifeq ($(PLATFORM),linux) - ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) - PLATVER = -D __CENTOS__ - PLATDIR = XEngine_Linux/Centos - else - PLATVER = -D __UBUNTU__ - PLATDIR = XEngine_Linux/Ubuntu - endif - FILEEXT = so - LIBFLAG = -shared - LIBEX = -lpthread -lrt -ldl - LOADBIN = -Wl,-rpath=./,--disable-new-dtags -else ifeq ($(PLATFORM),mac) - CC += -Wno-deprecated-declarations - PLATVER = -D __MACOS__ - PLATDIR = XEngine_Mac - FILEEXT = dylib - LIBFLAG = -dynamiclib - LIBEX = -lpthread -ldl - LOADBIN = -Wl,-rpath,@loader_path/./ -endif - -all:$(OBJECTS) - $(CC) $(DEBUG) $(OBJECTS) -o libjsoncpp.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) - -json_reader.o:json_reader.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) json_reader.cpp -json_value.o:json_value.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) json_value.cpp -json_writer.o:json_writer.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) json_writer.cpp - -InstallAll:InstallSo -InstallSo:./libjsoncpp.$(FILEEXT) - cp ./libjsoncpp.$(FILEEXT) ../../../XEngine_Release/libjsoncpp.$(FILEEXT) - - - -CleanAll:CleanObj CleanMk -CleanObj: - rm *.o -CleanMk: - rm *.$(FILEEXT) diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/allocator.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/allocator.h deleted file mode 100644 index d669dda..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/allocator.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_ALLOCATOR_H_INCLUDED -#define JSON_ALLOCATOR_H_INCLUDED - -#include -#include - -#pragma pack(push, 8) - -namespace Json { -template class SecureAllocator { -public: - // Type definitions - using value_type = T; - using pointer = T*; - using const_pointer = const T*; - using reference = T&; - using const_reference = const T&; - using size_type = std::size_t; - using difference_type = std::ptrdiff_t; - - /** - * Allocate memory for N items using the standard allocator. - */ - pointer allocate(size_type n) { - // allocate using "global operator new" - return static_cast(::operator new(n * sizeof(T))); - } - - /** - * Release memory which was allocated for N items at pointer P. - * - * The memory block is filled with zeroes before being released. - */ - void deallocate(pointer p, size_type n) { - // memset_s is used because memset may be optimized away by the compiler - memset_s(p, n * sizeof(T), 0, n * sizeof(T)); - // free using "global operator delete" - ::operator delete(p); - } - - /** - * Construct an item in-place at pointer P. - */ - template void construct(pointer p, Args&&... args) { - // construct using "placement new" and "perfect forwarding" - ::new (static_cast(p)) T(std::forward(args)...); - } - - size_type max_size() const { return size_t(-1) / sizeof(T); } - - pointer address(reference x) const { return std::addressof(x); } - - const_pointer address(const_reference x) const { return std::addressof(x); } - - /** - * Destroy an item in-place at pointer P. - */ - void destroy(pointer p) { - // destroy using "explicit destructor" - p->~T(); - } - - // Boilerplate - SecureAllocator() {} - template SecureAllocator(const SecureAllocator&) {} - template struct rebind { using other = SecureAllocator; }; -}; - -template -bool operator==(const SecureAllocator&, const SecureAllocator&) { - return true; -} - -template -bool operator!=(const SecureAllocator&, const SecureAllocator&) { - return false; -} - -} // namespace Json - -#pragma pack(pop) - -#endif // JSON_ALLOCATOR_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/assertions.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/assertions.h deleted file mode 100644 index 0a0120d..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/assertions.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_ASSERTIONS_H_INCLUDED -#define JSON_ASSERTIONS_H_INCLUDED - -#include -#include - -#if !defined(JSON_IS_AMALGAMATION) -#include "config.h" -#endif // if !defined(JSON_IS_AMALGAMATION) - -/** It should not be possible for a maliciously designed file to - * cause an abort() or seg-fault, so these macros are used only - * for pre-condition violations and internal logic errors. - */ -#if JSON_USE_EXCEPTION - -// @todo <= add detail about condition in exception -#define JSON_ASSERT(condition) \ - do { \ - if (!(condition)) { \ - Json::throwLogicError("assert json failed"); \ - } \ - } while (0) - -#define JSON_FAIL_MESSAGE(message) \ - do { \ - OStringStream oss; \ - oss << message; \ - Json::throwLogicError(oss.str()); \ - abort(); \ - } while (0) - -#else // JSON_USE_EXCEPTION - -#define JSON_ASSERT(condition) assert(condition) - -// The call to assert() will show the failure message in debug builds. In -// release builds we abort, for a core-dump or debugger. -#define JSON_FAIL_MESSAGE(message) \ - { \ - OStringStream oss; \ - oss << message; \ - assert(false && oss.str().c_str()); \ - abort(); \ - } - -#endif - -#define JSON_ASSERT_MESSAGE(condition, message) \ - do { \ - if (!(condition)) { \ - JSON_FAIL_MESSAGE(message); \ - } \ - } while (0) - -#endif // JSON_ASSERTIONS_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/config.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/config.h deleted file mode 100644 index 81d7969..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/config.h +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_CONFIG_H_INCLUDED -#define JSON_CONFIG_H_INCLUDED -#include -#include -#include -#include -#include -#include -#include -#include - -// If non-zero, the library uses exceptions to report bad input instead of C -// assertion macros. The default is to use exceptions. -#ifndef JSON_USE_EXCEPTION -#define JSON_USE_EXCEPTION 1 -#endif - -// Temporary, tracked for removal with issue #982. -#ifndef JSON_USE_NULLREF -#define JSON_USE_NULLREF 1 -#endif - -/// If defined, indicates that the source file is amalgamated -/// to prevent private header inclusion. -/// Remarks: it is automatically defined in the generated amalgamated header. -// #define JSON_IS_AMALGAMATION - -// Export macros for DLL visibility -#if defined(JSON_DLL_BUILD) -#if defined(_MSC_VER) || defined(__MINGW32__) -#define JSON_API __declspec(dllexport) -#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING -#elif defined(__GNUC__) || defined(__clang__) -#define JSON_API __attribute__((visibility("default"))) -#endif // if defined(_MSC_VER) - -#elif defined(JSON_DLL) -#if defined(_MSC_VER) || defined(__MINGW32__) -#define JSON_API __declspec(dllimport) -#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING -#endif // if defined(_MSC_VER) -#endif // ifdef JSON_DLL_BUILD - -#if !defined(JSON_API) -#define JSON_API -#endif - -#if defined(_MSC_VER) && _MSC_VER < 1800 -#error \ - "ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities" -#endif - -#if defined(_MSC_VER) && _MSC_VER < 1900 -// As recommended at -// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 -extern JSON_API int msvc_pre1900_c99_snprintf(char* outBuf, size_t size, - const char* format, ...); -#define jsoncpp_snprintf msvc_pre1900_c99_snprintf -#else -#define jsoncpp_snprintf std::snprintf -#endif - -// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for -// integer -// Storages, and 64 bits integer support is disabled. -// #define JSON_NO_INT64 1 - -// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools. -// C++11 should be used directly in JSONCPP. -#define JSONCPP_OVERRIDE override - -#ifdef __clang__ -#if __has_extension(attribute_deprecated_with_message) -#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) -#endif -#elif defined(__GNUC__) // not clang (gcc comes later since clang emulates gcc) -#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) -#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) -#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) -#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) -#endif // GNUC version -#elif defined(_MSC_VER) // MSVC (after clang because clang on Windows emulates - // MSVC) -#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) -#endif // __clang__ || __GNUC__ || _MSC_VER - -#if !defined(JSONCPP_DEPRECATED) -#define JSONCPP_DEPRECATED(message) -#endif // if !defined(JSONCPP_DEPRECATED) - -#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 6)) -#define JSON_USE_INT64_DOUBLE_CONVERSION 1 -#endif - -#if !defined(JSON_IS_AMALGAMATION) - -#include "allocator.h" -#include "version.h" - -#endif // if !defined(JSON_IS_AMALGAMATION) - -namespace Json { -using Int = int; -using UInt = unsigned int; -#if defined(JSON_NO_INT64) -using LargestInt = int; -using LargestUInt = unsigned int; -#undef JSON_HAS_INT64 -#else // if defined(JSON_NO_INT64) -// For Microsoft Visual use specific types as long long is not supported -#if defined(_MSC_VER) // Microsoft Visual Studio -using Int64 = __int64; -using UInt64 = unsigned __int64; -#else // if defined(_MSC_VER) // Other platforms, use long long -using Int64 = int64_t; -using UInt64 = uint64_t; -#endif // if defined(_MSC_VER) -using LargestInt = Int64; -using LargestUInt = UInt64; -#define JSON_HAS_INT64 -#endif // if defined(JSON_NO_INT64) - -template -using Allocator = - typename std::conditional, - std::allocator>::type; -using String = std::basic_string, Allocator>; -using IStringStream = - std::basic_istringstream; -using OStringStream = - std::basic_ostringstream; -using IStream = std::istream; -using OStream = std::ostream; -} // namespace Json - -// Legacy names (formerly macros). -using JSONCPP_STRING = Json::String; -using JSONCPP_ISTRINGSTREAM = Json::IStringStream; -using JSONCPP_OSTRINGSTREAM = Json::OStringStream; -using JSONCPP_ISTREAM = Json::IStream; -using JSONCPP_OSTREAM = Json::OStream; - -#endif // JSON_CONFIG_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/forwards.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/forwards.h deleted file mode 100644 index 733b9d6..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/forwards.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_FORWARDS_H_INCLUDED -#define JSON_FORWARDS_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include "config.h" -#endif // if !defined(JSON_IS_AMALGAMATION) - -namespace Json { - -// writer.h -class StreamWriter; -class StreamWriterBuilder; -class Writer; -class FastWriter; -class StyledWriter; -class StyledStreamWriter; - -// reader.h -class Reader; -class CharReader; -class CharReaderBuilder; - -// json_features.h -class Features; - -// value.h -using ArrayIndex = unsigned int; -class StaticString; -class Path; -class PathArgument; -class Value; -class ValueIteratorBase; -class ValueIterator; -class ValueConstIterator; - -} // namespace Json - -#endif // JSON_FORWARDS_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json.h deleted file mode 100644 index c6a9bbd..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json.h +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_JSON_H_INCLUDED -#define JSON_JSON_H_INCLUDED - -#include "config.h" -#include "json_features.h" -#include "reader.h" -#include "value.h" -#include "writer.h" - -#endif // JSON_JSON_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json_features.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json_features.h deleted file mode 100644 index 6d881b8..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json_features.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_FEATURES_H_INCLUDED -#define JSON_FEATURES_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include "forwards.h" -#endif // if !defined(JSON_IS_AMALGAMATION) - -#pragma pack(push, 8) - -namespace Json { - -/** \brief Configuration passed to reader and writer. - * This configuration object can be used to force the Reader or Writer - * to behave in a standard conforming way. - */ -class JSON_API Features { -public: - /** \brief A configuration that allows all features and assumes all strings - * are UTF-8. - * - C & C++ comments are allowed - * - Root object can be any JSON value - * - Assumes Value strings are encoded in UTF-8 - */ - static Features all(); - - /** \brief A configuration that is strictly compatible with the JSON - * specification. - * - Comments are forbidden. - * - Root object must be either an array or an object value. - * - Assumes Value strings are encoded in UTF-8 - */ - static Features strictMode(); - - /** \brief Initialize the configuration like JsonConfig::allFeatures; - */ - Features(); - - /// \c true if comments are allowed. Default: \c true. - bool allowComments_{true}; - - /// \c true if root must be either an array or an object value. Default: \c - /// false. - bool strictRoot_{false}; - - /// \c true if dropped null placeholders are allowed. Default: \c false. - bool allowDroppedNullPlaceholders_{false}; - - /// \c true if numeric object key are allowed. Default: \c false. - bool allowNumericKeys_{false}; -}; - -} // namespace Json - -#pragma pack(pop) - -#endif // JSON_FEATURES_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/reader.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/reader.h deleted file mode 100644 index 775037e..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/reader.h +++ /dev/null @@ -1,405 +0,0 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_READER_H_INCLUDED -#define JSON_READER_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include "json_features.h" -#include "value.h" -#endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include -#include -#include - -// Disable warning C4251: : needs to have dll-interface to -// be used by... -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#pragma warning(push) -#pragma warning(disable : 4251) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#pragma pack(push, 8) - -namespace Json { - -/** \brief Unserialize a JSON document into a - * Value. - * - * \deprecated Use CharReader and CharReaderBuilder. - */ - -class JSON_API Reader { -public: - using Char = char; - using Location = const Char*; - - /** \brief An error tagged with where in the JSON text it was encountered. - * - * The offsets give the [start, limit) range of bytes within the text. Note - * that this is bytes, not codepoints. - */ - struct StructuredError { - ptrdiff_t offset_start; - ptrdiff_t offset_limit; - String message; - }; - - /** \brief Constructs a Reader allowing all features for parsing. - * \deprecated Use CharReader and CharReaderBuilder. - */ - Reader(); - - /** \brief Constructs a Reader allowing the specified feature set for parsing. - * \deprecated Use CharReader and CharReaderBuilder. - */ - Reader(const Features& features); - - /** \brief Read a Value from a JSON - * document. - * - * \param document UTF-8 encoded string containing the document - * to read. - * \param[out] root Contains the root value of the document if it - * was successfully parsed. - * \param collectComments \c true to collect comment and allow writing - * them back during serialization, \c false to - * discard comments. This parameter is ignored - * if Features::allowComments_ is \c false. - * \return \c true if the document was successfully parsed, \c false if an - * error occurred. - */ - bool parse(const std::string& document, Value& root, - bool collectComments = true); - - /** \brief Read a Value from a JSON - * document. - * - * \param beginDoc Pointer on the beginning of the UTF-8 encoded - * string of the document to read. - * \param endDoc Pointer on the end of the UTF-8 encoded string - * of the document to read. Must be >= beginDoc. - * \param[out] root Contains the root value of the document if it - * was successfully parsed. - * \param collectComments \c true to collect comment and allow writing - * them back during serialization, \c false to - * discard comments. This parameter is ignored - * if Features::allowComments_ is \c false. - * \return \c true if the document was successfully parsed, \c false if an - * error occurred. - */ - bool parse(const char* beginDoc, const char* endDoc, Value& root, - bool collectComments = true); - - /// \brief Parse from input stream. - /// \see Json::operator>>(std::istream&, Json::Value&). - bool parse(IStream& is, Value& root, bool collectComments = true); - - /** \brief Returns a user friendly string that list errors in the parsed - * document. - * - * \return Formatted error message with the list of errors with their - * location in the parsed document. An empty string is returned if no error - * occurred during parsing. - * \deprecated Use getFormattedErrorMessages() instead (typo fix). - */ - JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.") - String getFormatedErrorMessages() const; - - /** \brief Returns a user friendly string that list errors in the parsed - * document. - * - * \return Formatted error message with the list of errors with their - * location in the parsed document. An empty string is returned if no error - * occurred during parsing. - */ - String getFormattedErrorMessages() const; - - /** \brief Returns a vector of structured errors encountered while parsing. - * - * \return A (possibly empty) vector of StructuredError objects. Currently - * only one error can be returned, but the caller should tolerate multiple - * errors. This can occur if the parser recovers from a non-fatal parse - * error and then encounters additional errors. - */ - std::vector getStructuredErrors() const; - - /** \brief Add a semantic error message. - * - * \param value JSON Value location associated with the error - * \param message The error message. - * \return \c true if the error was successfully added, \c false if the Value - * offset exceeds the document size. - */ - bool pushError(const Value& value, const String& message); - - /** \brief Add a semantic error message with extra context. - * - * \param value JSON Value location associated with the error - * \param message The error message. - * \param extra Additional JSON Value location to contextualize the error - * \return \c true if the error was successfully added, \c false if either - * Value offset exceeds the document size. - */ - bool pushError(const Value& value, const String& message, const Value& extra); - - /** \brief Return whether there are any errors. - * - * \return \c true if there are no errors to report \c false if errors have - * occurred. - */ - bool good() const; - -private: - enum TokenType { - tokenEndOfStream = 0, - tokenObjectBegin, - tokenObjectEnd, - tokenArrayBegin, - tokenArrayEnd, - tokenString, - tokenNumber, - tokenTrue, - tokenFalse, - tokenNull, - tokenArraySeparator, - tokenMemberSeparator, - tokenComment, - tokenError - }; - - class Token { - public: - TokenType type_; - Location start_; - Location end_; - }; - - class ErrorInfo { - public: - Token token_; - String message_; - Location extra_; - }; - - using Errors = std::deque; - - bool readToken(Token& token); - void skipSpaces(); - bool match(const Char* pattern, int patternLength); - bool readComment(); - bool readCStyleComment(); - bool readCppStyleComment(); - bool readString(); - void readNumber(); - bool readValue(); - bool readObject(Token& token); - bool readArray(Token& token); - bool decodeNumber(Token& token); - bool decodeNumber(Token& token, Value& decoded); - bool decodeString(Token& token); - bool decodeString(Token& token, String& decoded); - bool decodeDouble(Token& token); - bool decodeDouble(Token& token, Value& decoded); - bool decodeUnicodeCodePoint(Token& token, Location& current, Location end, - unsigned int& unicode); - bool decodeUnicodeEscapeSequence(Token& token, Location& current, - Location end, unsigned int& unicode); - bool addError(const String& message, Token& token, Location extra = nullptr); - bool recoverFromError(TokenType skipUntilToken); - bool addErrorAndRecover(const String& message, Token& token, - TokenType skipUntilToken); - void skipUntilSpace(); - Value& currentValue(); - Char getNextChar(); - void getLocationLineAndColumn(Location location, int& line, - int& column) const; - String getLocationLineAndColumn(Location location) const; - void addComment(Location begin, Location end, CommentPlacement placement); - void skipCommentTokens(Token& token); - - static bool containsNewLine(Location begin, Location end); - static String normalizeEOL(Location begin, Location end); - - using Nodes = std::stack; - Nodes nodes_; - Errors errors_; - String document_; - Location begin_{}; - Location end_{}; - Location current_{}; - Location lastValueEnd_{}; - Value* lastValue_{}; - String commentsBefore_; - Features features_; - bool collectComments_{}; -}; // Reader - -/** Interface for reading JSON from a char array. - */ -class JSON_API CharReader { -public: - virtual ~CharReader() = default; - /** \brief Read a Value from a JSON - * document. The document must be a UTF-8 encoded string containing the - * document to read. - * - * \param beginDoc Pointer on the beginning of the UTF-8 encoded string - * of the document to read. - * \param endDoc Pointer on the end of the UTF-8 encoded string of the - * document to read. Must be >= beginDoc. - * \param[out] root Contains the root value of the document if it was - * successfully parsed. - * \param[out] errs Formatted error messages (if not NULL) a user - * friendly string that lists errors in the parsed - * document. - * \return \c true if the document was successfully parsed, \c false if an - * error occurred. - */ - virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, - String* errs) = 0; - - class JSON_API Factory { - public: - virtual ~Factory() = default; - /** \brief Allocate a CharReader via operator new(). - * \throw std::exception if something goes wrong (e.g. invalid settings) - */ - virtual CharReader* newCharReader() const = 0; - }; // Factory -}; // CharReader - -/** \brief Build a CharReader implementation. - * - * Usage: - * \code - * using namespace Json; - * CharReaderBuilder builder; - * builder["collectComments"] = false; - * Value value; - * String errs; - * bool ok = parseFromStream(builder, std::cin, &value, &errs); - * \endcode - */ -class JSON_API CharReaderBuilder : public CharReader::Factory { -public: - // Note: We use a Json::Value so that we can add data-members to this class - // without a major version bump. - /** Configuration of this builder. - * These are case-sensitive. - * Available settings (case-sensitive): - * - `"collectComments": false or true` - * - true to collect comment and allow writing them back during - * serialization, false to discard comments. This parameter is ignored - * if allowComments is false. - * - `"allowComments": false or true` - * - true if comments are allowed. - * - `"allowTrailingCommas": false or true` - * - true if trailing commas in objects and arrays are allowed. - * - `"strictRoot": false or true` - * - true if root must be either an array or an object value - * - `"allowDroppedNullPlaceholders": false or true` - * - true if dropped null placeholders are allowed. (See - * StreamWriterBuilder.) - * - `"allowNumericKeys": false or true` - * - true if numeric object keys are allowed. - * - `"allowSingleQuotes": false or true` - * - true if '' are allowed for strings (both keys and values) - * - `"stackLimit": integer` - * - Exceeding stackLimit (recursive depth of `readValue()`) will cause an - * exception. - * - This is a security issue (seg-faults caused by deeply nested JSON), so - * the default is low. - * - `"failIfExtra": false or true` - * - If true, `parse()` returns false when extra non-whitespace trails the - * JSON value in the input string. - * - `"rejectDupKeys": false or true` - * - If true, `parse()` returns false when a key is duplicated within an - * object. - * - `"allowSpecialFloats": false or true` - * - If true, special float values (NaNs and infinities) are allowed and - * their values are lossfree restorable. - * - `"skipBom": false or true` - * - If true, if the input starts with the Unicode byte order mark (BOM), - * it is skipped. - * - * You can examine 'settings_` yourself to see the defaults. You can also - * write and read them just like any JSON Value. - * \sa setDefaults() - */ - Json::Value settings_; - - CharReaderBuilder(); - ~CharReaderBuilder() override; - - CharReader* newCharReader() const override; - - /** \return true if 'settings' are legal and consistent; - * otherwise, indicate bad settings via 'invalid'. - */ - bool validate(Json::Value* invalid) const; - - /** A simple way to update a specific setting. - */ - Value& operator[](const String& key); - - /** Called by ctor, but you can use this to reset settings_. - * \pre 'settings' != NULL (but Json::null is fine) - * \remark Defaults: - * \snippet src/lib_json/json_reader.cpp CharReaderBuilderDefaults - */ - static void setDefaults(Json::Value* settings); - /** Same as old Features::strictMode(). - * \pre 'settings' != NULL (but Json::null is fine) - * \remark Defaults: - * \snippet src/lib_json/json_reader.cpp CharReaderBuilderStrictMode - */ - static void strictMode(Json::Value* settings); -}; - -/** Consume entire stream and use its begin/end. - * Someday we might have a real StreamReader, but for now this - * is convenient. - */ -bool JSON_API parseFromStream(CharReader::Factory const&, IStream&, Value* root, - String* errs); - -/** \brief Read from 'sin' into 'root'. - * - * Always keep comments from the input JSON. - * - * This can be used to read a file into a particular sub-object. - * For example: - * \code - * Json::Value root; - * cin >> root["dir"]["file"]; - * cout << root; - * \endcode - * Result: - * \verbatim - * { - * "dir": { - * "file": { - * // The input stream JSON would be nested here. - * } - * } - * } - * \endverbatim - * \throw std::exception on parse error. - * \see Json::operator<<() - */ -JSON_API IStream& operator>>(IStream&, Value&); - -} // namespace Json - -#pragma pack(pop) - -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#pragma warning(pop) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#endif // JSON_READER_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/value.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/value.h deleted file mode 100644 index d24ca53..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/value.h +++ /dev/null @@ -1,935 +0,0 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_H_INCLUDED -#define JSON_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include "forwards.h" -#endif // if !defined(JSON_IS_AMALGAMATION) - -// Conditional NORETURN attribute on the throw functions would: -// a) suppress false positives from static code analysis -// b) possibly improve optimization opportunities. -#if !defined(JSONCPP_NORETURN) -#if defined(_MSC_VER) && _MSC_VER == 1800 -#define JSONCPP_NORETURN __declspec(noreturn) -#else -#define JSONCPP_NORETURN [[noreturn]] -#endif -#endif - -// Support for '= delete' with template declarations was a late addition -// to the c++11 standard and is rejected by clang 3.8 and Apple clang 8.2 -// even though these declare themselves to be c++11 compilers. -#if !defined(JSONCPP_TEMPLATE_DELETE) -#if defined(__clang__) && defined(__apple_build_version__) -#if __apple_build_version__ <= 8000042 -#define JSONCPP_TEMPLATE_DELETE -#endif -#elif defined(__clang__) -#if __clang_major__ == 3 && __clang_minor__ <= 8 -#define JSONCPP_TEMPLATE_DELETE -#endif -#endif -#if !defined(JSONCPP_TEMPLATE_DELETE) -#define JSONCPP_TEMPLATE_DELETE = delete -#endif -#endif - -#include -#include -#include -#include -#include -#include - -// Disable warning C4251: : needs to have dll-interface to -// be used by... -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#pragma warning(push) -#pragma warning(disable : 4251 4275) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#pragma pack(push, 8) - -/** \brief JSON (JavaScript Object Notation). - */ -namespace Json { - -#if JSON_USE_EXCEPTION -/** Base class for all exceptions we throw. - * - * We use nothing but these internally. Of course, STL can throw others. - */ -class JSON_API Exception : public std::exception { -public: - Exception(String msg); - ~Exception() noexcept override; - char const* what() const noexcept override; - -protected: - String msg_; -}; - -/** Exceptions which the user cannot easily avoid. - * - * E.g. out-of-memory (when we use malloc), stack-overflow, malicious input - * - * \remark derived from Json::Exception - */ -class JSON_API RuntimeError : public Exception { -public: - RuntimeError(String const& msg); -}; - -/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros. - * - * These are precondition-violations (user bugs) and internal errors (our bugs). - * - * \remark derived from Json::Exception - */ -class JSON_API LogicError : public Exception { -public: - LogicError(String const& msg); -}; -#endif - -/// used internally -JSONCPP_NORETURN void throwRuntimeError(String const& msg); -/// used internally -JSONCPP_NORETURN void throwLogicError(String const& msg); - -/** \brief Type of the value held by a Value object. - */ -enum ValueType { - nullValue = 0, ///< 'null' value - intValue, ///< signed integer value - uintValue, ///< unsigned integer value - realValue, ///< double value - stringValue, ///< UTF-8 string value - booleanValue, ///< bool value - arrayValue, ///< array value (ordered list) - objectValue ///< object value (collection of name/value pairs). -}; - -enum CommentPlacement { - commentBefore = 0, ///< a comment placed on the line before a value - commentAfterOnSameLine, ///< a comment just after a value on the same line - commentAfter, ///< a comment on the line after a value (only make sense for - /// root value) - numberOfCommentPlacement -}; - -/** \brief Type of precision for formatting of real values. - */ -enum PrecisionType { - significantDigits = 0, ///< we set max number of significant digits in string - decimalPlaces ///< we set max number of digits after "." in string -}; - -/** \brief Lightweight wrapper to tag static string. - * - * Value constructor and objectValue member assignment takes advantage of the - * StaticString and avoid the cost of string duplication when storing the - * string or the member name. - * - * Example of usage: - * \code - * Json::Value aValue( StaticString("some text") ); - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode - */ -class JSON_API StaticString { -public: - explicit StaticString(const char* czstring) : c_str_(czstring) {} - - operator const char*() const { return c_str_; } - - const char* c_str() const { return c_str_; } - -private: - const char* c_str_; -}; - -/** \brief Represents a JSON value. - * - * This class is a discriminated union wrapper that can represents a: - * - signed integer [range: Value::minInt - Value::maxInt] - * - unsigned integer (range: 0 - Value::maxUInt) - * - double - * - UTF-8 string - * - boolean - * - 'null' - * - an ordered list of Value - * - collection of name/value pairs (javascript object) - * - * The type of the held value is represented by a #ValueType and - * can be obtained using type(). - * - * Values of an #objectValue or #arrayValue can be accessed using operator[]() - * methods. - * Non-const methods will automatically create the a #nullValue element - * if it does not exist. - * The sequence of an #arrayValue will be automatically resized and initialized - * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. - * - * The get() methods can be used to obtain default value in the case the - * required element does not exist. - * - * It is possible to iterate over the list of member keys of an object using - * the getMemberNames() method. - * - * \note #Value string-length fit in size_t, but keys must be < 2^30. - * (The reason is an implementation detail.) A #CharReader will raise an - * exception if a bound is exceeded to avoid security holes in your app, - * but the Value API does *not* check bounds. That is the responsibility - * of the caller. - */ -class JSON_API Value { - friend class ValueIteratorBase; - -public: - using Members = std::vector; - using iterator = ValueIterator; - using const_iterator = ValueConstIterator; - using UInt = Json::UInt; - using Int = Json::Int; -#if defined(JSON_HAS_INT64) - using UInt64 = Json::UInt64; - using Int64 = Json::Int64; -#endif // defined(JSON_HAS_INT64) - using LargestInt = Json::LargestInt; - using LargestUInt = Json::LargestUInt; - using ArrayIndex = Json::ArrayIndex; - - // Required for boost integration, e. g. BOOST_TEST - using value_type = std::string; - -#if JSON_USE_NULLREF - // Binary compatibility kludges, do not use. - static const Value& null; - static const Value& nullRef; -#endif - - // null and nullRef are deprecated, use this instead. - static Value const& nullSingleton(); - - /// Minimum signed integer value that can be stored in a Json::Value. - static constexpr LargestInt minLargestInt = - LargestInt(~(LargestUInt(-1) / 2)); - /// Maximum signed integer value that can be stored in a Json::Value. - static constexpr LargestInt maxLargestInt = LargestInt(LargestUInt(-1) / 2); - /// Maximum unsigned integer value that can be stored in a Json::Value. - static constexpr LargestUInt maxLargestUInt = LargestUInt(-1); - - /// Minimum signed int value that can be stored in a Json::Value. - static constexpr Int minInt = Int(~(UInt(-1) / 2)); - /// Maximum signed int value that can be stored in a Json::Value. - static constexpr Int maxInt = Int(UInt(-1) / 2); - /// Maximum unsigned int value that can be stored in a Json::Value. - static constexpr UInt maxUInt = UInt(-1); - -#if defined(JSON_HAS_INT64) - /// Minimum signed 64 bits int value that can be stored in a Json::Value. - static constexpr Int64 minInt64 = Int64(~(UInt64(-1) / 2)); - /// Maximum signed 64 bits int value that can be stored in a Json::Value. - static constexpr Int64 maxInt64 = Int64(UInt64(-1) / 2); - /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. - static constexpr UInt64 maxUInt64 = UInt64(-1); -#endif // defined(JSON_HAS_INT64) - /// Default precision for real value for string representation. - static constexpr UInt defaultRealPrecision = 17; - // The constant is hard-coded because some compiler have trouble - // converting Value::maxUInt64 to a double correctly (AIX/xlC). - // Assumes that UInt64 is a 64 bits integer. - static constexpr double maxUInt64AsDouble = 18446744073709551615.0; -// Workaround for bug in the NVIDIAs CUDA 9.1 nvcc compiler -// when using gcc and clang backend compilers. CZString -// cannot be defined as private. See issue #486 -#ifdef __NVCC__ -public: -#else -private: -#endif -#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - class CZString { - public: - enum DuplicationPolicy { noDuplication = 0, duplicate, duplicateOnCopy }; - CZString(ArrayIndex index); - CZString(char const* str, unsigned length, DuplicationPolicy allocate); - CZString(CZString const& other); - CZString(CZString&& other) noexcept; - ~CZString(); - CZString& operator=(const CZString& other); - CZString& operator=(CZString&& other) noexcept; - - bool operator<(CZString const& other) const; - bool operator==(CZString const& other) const; - ArrayIndex index() const; - // const char* c_str() const; ///< \deprecated - char const* data() const; - unsigned length() const; - bool isStaticString() const; - - private: - void swap(CZString& other); - - struct StringStorage { - unsigned policy_ : 2; - unsigned length_ : 30; // 1GB max - }; - - char const* cstr_; // actually, a prefixed string, unless policy is noDup - union { - ArrayIndex index_; - StringStorage storage_; - }; - }; - -public: - typedef std::map ObjectValues; -#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION - -public: - /** - * \brief Create a default Value of the given type. - * - * This is a very useful constructor. - * To create an empty array, pass arrayValue. - * To create an empty object, pass objectValue. - * Another Value can then be set to this one by assignment. - * This is useful since clear() and resize() will not alter types. - * - * Examples: - * \code - * Json::Value null_value; // null - * Json::Value arr_value(Json::arrayValue); // [] - * Json::Value obj_value(Json::objectValue); // {} - * \endcode - */ - Value(ValueType type = nullValue); - Value(Int value); - Value(UInt value); -#if defined(JSON_HAS_INT64) - Value(Int64 value); - Value(UInt64 value); -#endif // if defined(JSON_HAS_INT64) - Value(double value); - Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.) - Value(const char* begin, const char* end); ///< Copy all, incl zeroes. - /** - * \brief Constructs a value from a static string. - * - * Like other value string constructor but do not duplicate the string for - * internal storage. The given string must remain alive after the call to - * this constructor. - * - * \note This works only for null-terminated strings. (We cannot change the - * size of this class, so we have nowhere to store the length, which might be - * computed later for various operations.) - * - * Example of usage: - * \code - * static StaticString foo("some text"); - * Json::Value aValue(foo); - * \endcode - */ - Value(const StaticString& value); - Value(const String& value); - Value(bool value); - Value(std::nullptr_t ptr) = delete; - Value(const Value& other); - Value(Value&& other) noexcept; - ~Value(); - - /// \note Overwrite existing comments. To preserve comments, use - /// #swapPayload(). - Value& operator=(const Value& other); - Value& operator=(Value&& other) noexcept; - - /// Swap everything. - void swap(Value& other); - /// Swap values but leave comments and source offsets in place. - void swapPayload(Value& other); - - /// copy everything. - void copy(const Value& other); - /// copy values but leave comments and source offsets in place. - void copyPayload(const Value& other); - - ValueType type() const; - - /// Compare payload only, not comments etc. - bool operator<(const Value& other) const; - bool operator<=(const Value& other) const; - bool operator>=(const Value& other) const; - bool operator>(const Value& other) const; - bool operator==(const Value& other) const; - bool operator!=(const Value& other) const; - int compare(const Value& other) const; - - const char* asCString() const; ///< Embedded zeroes could cause you trouble! -#if JSONCPP_USING_SECURE_MEMORY - unsigned getCStringLength() const; // Allows you to understand the length of - // the CString -#endif - String asString() const; ///< Embedded zeroes are possible. - /** Get raw char* of string-value. - * \return false if !string. (Seg-fault if str or end are NULL.) - */ - bool getString(char const** begin, char const** end) const; - Int asInt() const; - UInt asUInt() const; -#if defined(JSON_HAS_INT64) - Int64 asInt64() const; - UInt64 asUInt64() const; -#endif // if defined(JSON_HAS_INT64) - LargestInt asLargestInt() const; - LargestUInt asLargestUInt() const; - float asFloat() const; - double asDouble() const; - bool asBool() const; - - bool isNull() const; - bool isBool() const; - bool isInt() const; - bool isInt64() const; - bool isUInt() const; - bool isUInt64() const; - bool isIntegral() const; - bool isDouble() const; - bool isNumeric() const; - bool isString() const; - bool isArray() const; - bool isObject() const; - - /// The `as` and `is` member function templates and specializations. - template T as() const JSONCPP_TEMPLATE_DELETE; - template bool is() const JSONCPP_TEMPLATE_DELETE; - - bool isConvertibleTo(ValueType other) const; - - /// Number of values in array or object - ArrayIndex size() const; - - /// \brief Return true if empty array, empty object, or null; - /// otherwise, false. - bool empty() const; - - /// Return !isNull() - explicit operator bool() const; - - /// Remove all object members and array elements. - /// \pre type() is arrayValue, objectValue, or nullValue - /// \post type() is unchanged - void clear(); - - /// Resize the array to newSize elements. - /// New elements are initialized to null. - /// May only be called on nullValue or arrayValue. - /// \pre type() is arrayValue or nullValue - /// \post type() is arrayValue - void resize(ArrayIndex newSize); - - //@{ - /// Access an array element (zero based index). If the array contains less - /// than index element, then null value are inserted in the array so that - /// its size is index+1. - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - Value& operator[](ArrayIndex index); - Value& operator[](int index); - //@} - - //@{ - /// Access an array element (zero based index). - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) - const Value& operator[](ArrayIndex index) const; - const Value& operator[](int index) const; - //@} - - /// If the array contains at least index+1 elements, returns the element - /// value, otherwise returns defaultValue. - Value get(ArrayIndex index, const Value& defaultValue) const; - /// Return true if index < size(). - bool isValidIndex(ArrayIndex index) const; - /// \brief Append value to array at the end. - /// - /// Equivalent to jsonvalue[jsonvalue.size()] = value; - Value& append(const Value& value); - Value& append(Value&& value); - - /// \brief Insert value in array at specific index - bool insert(ArrayIndex index, const Value& newValue); - bool insert(ArrayIndex index, Value&& newValue); - - /// Access an object value by name, create a null member if it does not exist. - /// \note Because of our implementation, keys are limited to 2^30 -1 chars. - /// Exceeding that will cause an exception. - Value& operator[](const char* key); - /// Access an object value by name, returns null if there is no member with - /// that name. - const Value& operator[](const char* key) const; - /// Access an object value by name, create a null member if it does not exist. - /// \param key may contain embedded nulls. - Value& operator[](const String& key); - /// Access an object value by name, returns null if there is no member with - /// that name. - /// \param key may contain embedded nulls. - const Value& operator[](const String& key) const; - /** \brief Access an object value by name, create a null member if it does not - * exist. - * - * If the object has no entry for that name, then the member name used to - * store the new entry is not duplicated. - * Example of use: - * \code - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode - */ - Value& operator[](const StaticString& key); - /// Return the member named key if it exist, defaultValue otherwise. - /// \note deep copy - Value get(const char* key, const Value& defaultValue) const; - /// Return the member named key if it exist, defaultValue otherwise. - /// \note deep copy - /// \note key may contain embedded nulls. - Value get(const char* begin, const char* end, - const Value& defaultValue) const; - /// Return the member named key if it exist, defaultValue otherwise. - /// \note deep copy - /// \param key may contain embedded nulls. - Value get(const String& key, const Value& defaultValue) const; - /// Most general and efficient version of isMember()const, get()const, - /// and operator[]const - /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 - Value const* find(char const* begin, char const* end) const; - /// Most general and efficient version of object-mutators. - /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 - /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue. - Value* demand(char const* begin, char const* end); - /// \brief Remove and return the named member. - /// - /// Do nothing if it did not exist. - /// \pre type() is objectValue or nullValue - /// \post type() is unchanged - void removeMember(const char* key); - /// Same as removeMember(const char*) - /// \param key may contain embedded nulls. - void removeMember(const String& key); - /// Same as removeMember(const char* begin, const char* end, Value* removed), - /// but 'key' is null-terminated. - bool removeMember(const char* key, Value* removed); - /** \brief Remove the named map member. - * - * Update 'removed' iff removed. - * \param key may contain embedded nulls. - * \return true iff removed (no exceptions) - */ - bool removeMember(String const& key, Value* removed); - /// Same as removeMember(String const& key, Value* removed) - bool removeMember(const char* begin, const char* end, Value* removed); - /** \brief Remove the indexed array element. - * - * O(n) expensive operations. - * Update 'removed' iff removed. - * \return true if removed (no exceptions) - */ - bool removeIndex(ArrayIndex index, Value* removed); - - /// Return true if the object has a member named key. - /// \note 'key' must be null-terminated. - bool isMember(const char* key) const; - /// Return true if the object has a member named key. - /// \param key may contain embedded nulls. - bool isMember(const String& key) const; - /// Same as isMember(String const& key)const - bool isMember(const char* begin, const char* end) const; - - /// \brief Return a list of the member names. - /// - /// If null, return an empty list. - /// \pre type() is objectValue or nullValue - /// \post if type() was nullValue, it remains nullValue - Members getMemberNames() const; - - /// \deprecated Always pass len. - JSONCPP_DEPRECATED("Use setComment(String const&) instead.") - void setComment(const char* comment, CommentPlacement placement) { - setComment(String(comment, strlen(comment)), placement); - } - /// Comments must be //... or /* ... */ - void setComment(const char* comment, size_t len, CommentPlacement placement) { - setComment(String(comment, len), placement); - } - /// Comments must be //... or /* ... */ - void setComment(String comment, CommentPlacement placement); - bool hasComment(CommentPlacement placement) const; - /// Include delimiters and embedded newlines. - String getComment(CommentPlacement placement) const; - - String toStyledString() const; - - const_iterator begin() const; - const_iterator end() const; - - iterator begin(); - iterator end(); - - // Accessors for the [start, limit) range of bytes within the JSON text from - // which this value was parsed, if any. - void setOffsetStart(ptrdiff_t start); - void setOffsetLimit(ptrdiff_t limit); - ptrdiff_t getOffsetStart() const; - ptrdiff_t getOffsetLimit() const; - -private: - void setType(ValueType v) { - bits_.value_type_ = static_cast(v); - } - bool isAllocated() const { return bits_.allocated_; } - void setIsAllocated(bool v) { bits_.allocated_ = v; } - - void initBasic(ValueType type, bool allocated = false); - void dupPayload(const Value& other); - void releasePayload(); - void dupMeta(const Value& other); - - Value& resolveReference(const char* key); - Value& resolveReference(const char* key, const char* end); - - // struct MemberNamesTransform - //{ - // typedef const char *result_type; - // const char *operator()( const CZString &name ) const - // { - // return name.c_str(); - // } - //}; - - union ValueHolder { - LargestInt int_; - LargestUInt uint_; - double real_; - bool bool_; - char* string_; // if allocated_, ptr to { unsigned, char[] }. - ObjectValues* map_; - } value_; - - struct { - // Really a ValueType, but types should agree for bitfield packing. - unsigned int value_type_ : 8; - // Unless allocated_, string_ must be null-terminated. - unsigned int allocated_ : 1; - } bits_; - - class Comments { - public: - Comments() = default; - Comments(const Comments& that); - Comments(Comments&& that) noexcept; - Comments& operator=(const Comments& that); - Comments& operator=(Comments&& that) noexcept; - bool has(CommentPlacement slot) const; - String get(CommentPlacement slot) const; - void set(CommentPlacement slot, String comment); - - private: - using Array = std::array; - std::unique_ptr ptr_; - }; - Comments comments_; - - // [start, limit) byte offsets in the source JSON text from which this Value - // was extracted. - ptrdiff_t start_; - ptrdiff_t limit_; -}; - -template <> inline bool Value::as() const { return asBool(); } -template <> inline bool Value::is() const { return isBool(); } - -template <> inline Int Value::as() const { return asInt(); } -template <> inline bool Value::is() const { return isInt(); } - -template <> inline UInt Value::as() const { return asUInt(); } -template <> inline bool Value::is() const { return isUInt(); } - -#if defined(JSON_HAS_INT64) -template <> inline Int64 Value::as() const { return asInt64(); } -template <> inline bool Value::is() const { return isInt64(); } - -template <> inline UInt64 Value::as() const { return asUInt64(); } -template <> inline bool Value::is() const { return isUInt64(); } -#endif - -template <> inline double Value::as() const { return asDouble(); } -template <> inline bool Value::is() const { return isDouble(); } - -template <> inline String Value::as() const { return asString(); } -template <> inline bool Value::is() const { return isString(); } - -/// These `as` specializations are type conversions, and do not have a -/// corresponding `is`. -template <> inline float Value::as() const { return asFloat(); } -template <> inline const char* Value::as() const { - return asCString(); -} - -/** \brief Experimental and untested: represents an element of the "path" to - * access a node. - */ -class JSON_API PathArgument { -public: - friend class Path; - - PathArgument(); - PathArgument(ArrayIndex index); - PathArgument(const char* key); - PathArgument(String key); - -private: - enum Kind { kindNone = 0, kindIndex, kindKey }; - String key_; - ArrayIndex index_{}; - Kind kind_{kindNone}; -}; - -/** \brief Experimental and untested: represents a "path" to access a node. - * - * Syntax: - * - "." => root node - * - ".[n]" => elements at index 'n' of root node (an array value) - * - ".name" => member named 'name' of root node (an object value) - * - ".name1.name2.name3" - * - ".[0][1][2].name1[3]" - * - ".%" => member name is provided as parameter - * - ".[%]" => index is provided as parameter - */ -class JSON_API Path { -public: - Path(const String& path, const PathArgument& a1 = PathArgument(), - const PathArgument& a2 = PathArgument(), - const PathArgument& a3 = PathArgument(), - const PathArgument& a4 = PathArgument(), - const PathArgument& a5 = PathArgument()); - - const Value& resolve(const Value& root) const; - Value resolve(const Value& root, const Value& defaultValue) const; - /// Creates the "path" to access the specified node and returns a reference on - /// the node. - Value& make(Value& root) const; - -private: - using InArgs = std::vector; - using Args = std::vector; - - void makePath(const String& path, const InArgs& in); - void addPathInArg(const String& path, const InArgs& in, - InArgs::const_iterator& itInArg, PathArgument::Kind kind); - static void invalidPath(const String& path, int location); - - Args args_; -}; - -/** \brief base class for Value iterators. - * - */ -class JSON_API ValueIteratorBase { -public: - using iterator_category = std::bidirectional_iterator_tag; - using size_t = unsigned int; - using difference_type = int; - using SelfType = ValueIteratorBase; - - bool operator==(const SelfType& other) const { return isEqual(other); } - - bool operator!=(const SelfType& other) const { return !isEqual(other); } - - difference_type operator-(const SelfType& other) const { - return other.computeDistance(*this); - } - - /// Return either the index or the member name of the referenced value as a - /// Value. - Value key() const; - - /// Return the index of the referenced Value, or -1 if it is not an - /// arrayValue. - UInt index() const; - - /// Return the member name of the referenced Value, or "" if it is not an - /// objectValue. - /// \note Avoid `c_str()` on result, as embedded zeroes are possible. - String name() const; - - /// Return the member name of the referenced Value. "" if it is not an - /// objectValue. - /// \deprecated This cannot be used for UTF-8 strings, since there can be - /// embedded nulls. - JSONCPP_DEPRECATED("Use `key = name();` instead.") - char const* memberName() const; - /// Return the member name of the referenced Value, or NULL if it is not an - /// objectValue. - /// \note Better version than memberName(). Allows embedded nulls. - char const* memberName(char const** end) const; - -protected: - /*! Internal utility functions to assist with implementing - * other iterator functions. The const and non-const versions - * of the "deref" protected methods expose the protected - * current_ member variable in a way that can often be - * optimized away by the compiler. - */ - const Value& deref() const; - Value& deref(); - - void increment(); - - void decrement(); - - difference_type computeDistance(const SelfType& other) const; - - bool isEqual(const SelfType& other) const; - - void copy(const SelfType& other); - -private: - Value::ObjectValues::iterator current_; - // Indicates that iterator is for a null value. - bool isNull_{true}; - -public: - // For some reason, BORLAND needs these at the end, rather - // than earlier. No idea why. - ValueIteratorBase(); - explicit ValueIteratorBase(const Value::ObjectValues::iterator& current); -}; - -/** \brief const iterator for object and array value. - * - */ -class JSON_API ValueConstIterator : public ValueIteratorBase { - friend class Value; - -public: - using value_type = const Value; - // typedef unsigned int size_t; - // typedef int difference_type; - using reference = const Value&; - using pointer = const Value*; - using SelfType = ValueConstIterator; - - ValueConstIterator(); - ValueConstIterator(ValueIterator const& other); - -private: - /*! \internal Use by Value to create an iterator. - */ - explicit ValueConstIterator(const Value::ObjectValues::iterator& current); - -public: - SelfType& operator=(const ValueIteratorBase& other); - - SelfType operator++(int) { - SelfType temp(*this); - ++*this; - return temp; - } - - SelfType operator--(int) { - SelfType temp(*this); - --*this; - return temp; - } - - SelfType& operator--() { - decrement(); - return *this; - } - - SelfType& operator++() { - increment(); - return *this; - } - - reference operator*() const { return deref(); } - - pointer operator->() const { return &deref(); } -}; - -/** \brief Iterator for object and array value. - */ -class JSON_API ValueIterator : public ValueIteratorBase { - friend class Value; - -public: - using value_type = Value; - using size_t = unsigned int; - using difference_type = int; - using reference = Value&; - using pointer = Value*; - using SelfType = ValueIterator; - - ValueIterator(); - explicit ValueIterator(const ValueConstIterator& other); - ValueIterator(const ValueIterator& other); - -private: - /*! \internal Use by Value to create an iterator. - */ - explicit ValueIterator(const Value::ObjectValues::iterator& current); - -public: - SelfType& operator=(const SelfType& other); - - SelfType operator++(int) { - SelfType temp(*this); - ++*this; - return temp; - } - - SelfType operator--(int) { - SelfType temp(*this); - --*this; - return temp; - } - - SelfType& operator--() { - decrement(); - return *this; - } - - SelfType& operator++() { - increment(); - return *this; - } - - /*! The return value of non-const iterators can be - * changed, so the these functions are not const - * because the returned references/pointers can be used - * to change state of the base class. - */ - reference operator*() const { return const_cast(deref()); } - pointer operator->() const { return const_cast(&deref()); } -}; - -inline void swap(Value& a, Value& b) { a.swap(b); } - -} // namespace Json - -#pragma pack(pop) - -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#pragma warning(pop) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#endif // JSON_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/version.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/version.h deleted file mode 100644 index 99a27fa..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/version.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef JSON_VERSION_H_INCLUDED -#define JSON_VERSION_H_INCLUDED - -// Note: version must be updated in three places when doing a release. This -// annoying process ensures that amalgamate, CMake, and meson all report the -// correct version. -// 1. /meson.build -// 2. /include/json/version.h -// 3. /CMakeLists.txt -// IMPORTANT: also update the SOVERSION!! - -#define JSONCPP_VERSION_STRING "1.9.5" -#define JSONCPP_VERSION_MAJOR 1 -#define JSONCPP_VERSION_MINOR 9 -#define JSONCPP_VERSION_PATCH 5 -#define JSONCPP_VERSION_QUALIFIER -#define JSONCPP_VERSION_HEXA \ - ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | \ - (JSONCPP_VERSION_PATCH << 8)) - -#ifdef JSONCPP_USING_SECURE_MEMORY -#undef JSONCPP_USING_SECURE_MEMORY -#endif -#define JSONCPP_USING_SECURE_MEMORY 0 -// If non-zero, the library zeroes any memory that it has allocated before -// it frees its memory. - -#endif // JSON_VERSION_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/writer.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/writer.h deleted file mode 100644 index acf7c35..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/writer.h +++ /dev/null @@ -1,369 +0,0 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef JSON_WRITER_H_INCLUDED -#define JSON_WRITER_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include "value.h" -#endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include - -// Disable warning C4251: : needs to have dll-interface to -// be used by... -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) && defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4251) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#pragma pack(push, 8) - -namespace Json { - -class Value; - -/** - * - * Usage: - * \code - * using namespace Json; - * void writeToStdout(StreamWriter::Factory const& factory, Value const& value) - * { std::unique_ptr const writer( factory.newStreamWriter()); - * writer->write(value, &std::cout); - * std::cout << std::endl; // add lf and flush - * } - * \endcode - */ -class JSON_API StreamWriter { -protected: - OStream* sout_; // not owned; will not delete -public: - StreamWriter(); - virtual ~StreamWriter(); - /** Write Value into document as configured in sub-class. - * Do not take ownership of sout, but maintain a reference during function. - * \pre sout != NULL - * \return zero on success (For now, we always return zero, so check the - * stream instead.) \throw std::exception possibly, depending on - * configuration - */ - virtual int write(Value const& root, OStream* sout) = 0; - - /** \brief A simple abstract factory. - */ - class JSON_API Factory { - public: - virtual ~Factory(); - /** \brief Allocate a CharReader via operator new(). - * \throw std::exception if something goes wrong (e.g. invalid settings) - */ - virtual StreamWriter* newStreamWriter() const = 0; - }; // Factory -}; // StreamWriter - -/** \brief Write into stringstream, then return string, for convenience. - * A StreamWriter will be created from the factory, used, and then deleted. - */ -String JSON_API writeString(StreamWriter::Factory const& factory, - Value const& root); - -/** \brief Build a StreamWriter implementation. - -* Usage: -* \code -* using namespace Json; -* Value value = ...; -* StreamWriterBuilder builder; -* builder["commentStyle"] = "None"; -* builder["indentation"] = " "; // or whatever you like -* std::unique_ptr writer( -* builder.newStreamWriter()); -* writer->write(value, &std::cout); -* std::cout << std::endl; // add lf and flush -* \endcode -*/ -class JSON_API StreamWriterBuilder : public StreamWriter::Factory { -public: - // Note: We use a Json::Value so that we can add data-members to this class - // without a major version bump. - /** Configuration of this builder. - * Available settings (case-sensitive): - * - "commentStyle": "None" or "All" - * - "indentation": "". - * - Setting this to an empty string also omits newline characters. - * - "enableYAMLCompatibility": false or true - * - slightly change the whitespace around colons - * - "dropNullPlaceholders": false or true - * - Drop the "null" string from the writer's output for nullValues. - * Strictly speaking, this is not valid JSON. But when the output is being - * fed to a browser's JavaScript, it makes for smaller output and the - * browser can handle the output just fine. - * - "useSpecialFloats": false or true - * - If true, outputs non-finite floating point values in the following way: - * NaN values as "NaN", positive infinity as "Infinity", and negative - * infinity as "-Infinity". - * - "precision": int - * - Number of precision digits for formatting of real values. - * - "precisionType": "significant"(default) or "decimal" - * - Type of precision for formatting of real values. - * - "emitUTF8": false or true - * - If true, outputs raw UTF8 strings instead of escaping them. - - * You can examine 'settings_` yourself - * to see the defaults. You can also write and read them just like any - * JSON Value. - * \sa setDefaults() - */ - Json::Value settings_; - - StreamWriterBuilder(); - ~StreamWriterBuilder() override; - - /** - * \throw std::exception if something goes wrong (e.g. invalid settings) - */ - StreamWriter* newStreamWriter() const override; - - /** \return true if 'settings' are legal and consistent; - * otherwise, indicate bad settings via 'invalid'. - */ - bool validate(Json::Value* invalid) const; - /** A simple way to update a specific setting. - */ - Value& operator[](const String& key); - - /** Called by ctor, but you can use this to reset settings_. - * \pre 'settings' != NULL (but Json::null is fine) - * \remark Defaults: - * \snippet src/lib_json/json_writer.cpp StreamWriterBuilderDefaults - */ - static void setDefaults(Json::Value* settings); -}; - -/** \brief Abstract class for writers. - * \deprecated Use StreamWriter. (And really, this is an implementation detail.) - */ -class JSON_API Writer { -public: - virtual ~Writer(); - - virtual String write(const Value& root) = 0; -}; - -/** \brief Outputs a Value in JSON format - *without formatting (not human friendly). - * - * The JSON document is written in a single line. It is not intended for 'human' - *consumption, - * but may be useful to support feature such as RPC where bandwidth is limited. - * \sa Reader, Value - * \deprecated Use StreamWriterBuilder. - */ -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4996) // Deriving from deprecated class -#endif -class JSON_API FastWriter - : public Writer { -public: - FastWriter(); - ~FastWriter() override = default; - - void enableYAMLCompatibility(); - - /** \brief Drop the "null" string from the writer's output for nullValues. - * Strictly speaking, this is not valid JSON. But when the output is being - * fed to a browser's JavaScript, it makes for smaller output and the - * browser can handle the output just fine. - */ - void dropNullPlaceholders(); - - void omitEndingLineFeed(); - -public: // overridden from Writer - String write(const Value& root) override; - -private: - void writeValue(const Value& value); - - String document_; - bool yamlCompatibilityEnabled_{false}; - bool dropNullPlaceholders_{false}; - bool omitEndingLineFeed_{false}; -}; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - -/** \brief Writes a Value in JSON format in a - *human friendly way. - * - * The rules for line break and indent are as follow: - * - Object value: - * - if empty then print {} without indent and line break - * - if not empty the print '{', line break & indent, print one value per - *line - * and then unindent and line break and print '}'. - * - Array value: - * - if empty then print [] without indent and line break - * - if the array contains no object value, empty array or some other value - *types, - * and all the values fit on one lines, then print the array on a single - *line. - * - otherwise, it the values do not fit on one line, or the array contains - * object or non empty array, then print one value per line. - * - * If the Value have comments then they are outputed according to their - *#CommentPlacement. - * - * \sa Reader, Value, Value::setComment() - * \deprecated Use StreamWriterBuilder. - */ -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4996) // Deriving from deprecated class -#endif -class JSON_API - StyledWriter : public Writer { -public: - StyledWriter(); - ~StyledWriter() override = default; - -public: // overridden from Writer - /** \brief Serialize a Value in JSON format. - * \param root Value to serialize. - * \return String containing the JSON document that represents the root value. - */ - String write(const Value& root) override; - -private: - void writeValue(const Value& value); - void writeArrayValue(const Value& value); - bool isMultilineArray(const Value& value); - void pushValue(const String& value); - void writeIndent(); - void writeWithIndent(const String& value); - void indent(); - void unindent(); - void writeCommentBeforeValue(const Value& root); - void writeCommentAfterValueOnSameLine(const Value& root); - static bool hasCommentForValue(const Value& value); - static String normalizeEOL(const String& text); - - using ChildValues = std::vector; - - ChildValues childValues_; - String document_; - String indentString_; - unsigned int rightMargin_{74}; - unsigned int indentSize_{3}; - bool addChildValues_{false}; -}; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - -/** \brief Writes a Value in JSON format in a - human friendly way, - to a stream rather than to a string. - * - * The rules for line break and indent are as follow: - * - Object value: - * - if empty then print {} without indent and line break - * - if not empty the print '{', line break & indent, print one value per - line - * and then unindent and line break and print '}'. - * - Array value: - * - if empty then print [] without indent and line break - * - if the array contains no object value, empty array or some other value - types, - * and all the values fit on one lines, then print the array on a single - line. - * - otherwise, it the values do not fit on one line, or the array contains - * object or non empty array, then print one value per line. - * - * If the Value have comments then they are outputed according to their - #CommentPlacement. - * - * \sa Reader, Value, Value::setComment() - * \deprecated Use StreamWriterBuilder. - */ -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4996) // Deriving from deprecated class -#endif -class JSON_API - StyledStreamWriter { -public: - /** - * \param indentation Each level will be indented by this amount extra. - */ - StyledStreamWriter(String indentation = "\t"); - ~StyledStreamWriter() = default; - -public: - /** \brief Serialize a Value in JSON format. - * \param out Stream to write to. (Can be ostringstream, e.g.) - * \param root Value to serialize. - * \note There is no point in deriving from Writer, since write() should not - * return a value. - */ - void write(OStream& out, const Value& root); - -private: - void writeValue(const Value& value); - void writeArrayValue(const Value& value); - bool isMultilineArray(const Value& value); - void pushValue(const String& value); - void writeIndent(); - void writeWithIndent(const String& value); - void indent(); - void unindent(); - void writeCommentBeforeValue(const Value& root); - void writeCommentAfterValueOnSameLine(const Value& root); - static bool hasCommentForValue(const Value& value); - static String normalizeEOL(const String& text); - - using ChildValues = std::vector; - - ChildValues childValues_; - OStream* document_; - String indentString_; - unsigned int rightMargin_{74}; - String indentation_; - bool addChildValues_ : 1; - bool indented_ : 1; -}; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - -#if defined(JSON_HAS_INT64) -String JSON_API valueToString(Int value); -String JSON_API valueToString(UInt value); -#endif // if defined(JSON_HAS_INT64) -String JSON_API valueToString(LargestInt value); -String JSON_API valueToString(LargestUInt value); -String JSON_API valueToString( - double value, unsigned int precision = Value::defaultRealPrecision, - PrecisionType precisionType = PrecisionType::significantDigits); -String JSON_API valueToString(bool value); -String JSON_API valueToQuotedString(const char* value); - -/// \brief Output using the StyledStreamWriter. -/// \see Json::operator>>() -JSON_API OStream& operator<<(OStream&, const Value& root); - -} // namespace Json - -#pragma pack(pop) - -#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#pragma warning(pop) -#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) - -#endif // JSON_WRITER_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_reader.cpp b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_reader.cpp deleted file mode 100644 index 02f4b2f..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_reader.cpp +++ /dev/null @@ -1,1992 +0,0 @@ -// Copyright 2007-2011 Baptiste Lepilleur and The JsonCpp Authors -// Copyright (C) 2016 InfoTeCS JSC. All rights reserved. -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#if !defined(JSON_IS_AMALGAMATION) -#include "json_tool.h" -#include -#include -#include -#endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#if __cplusplus >= 201103L - -#if !defined(sscanf) -#define sscanf std::sscanf -#endif - -#endif //__cplusplus - -#if defined(_MSC_VER) -#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) -#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 -#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES -#endif //_MSC_VER - -#if defined(_MSC_VER) -// Disable warning about strdup being deprecated. -#pragma warning(disable : 4996) -#endif - -// Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile -// time to change the stack limit -#if !defined(JSONCPP_DEPRECATED_STACK_LIMIT) -#define JSONCPP_DEPRECATED_STACK_LIMIT 1000 -#endif - -static size_t const stackLimit_g = - JSONCPP_DEPRECATED_STACK_LIMIT; // see readValue() - -namespace Json { - -#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) -using CharReaderPtr = std::unique_ptr; -#else -using CharReaderPtr = std::auto_ptr; -#endif - -// Implementation of class Features -// //////////////////////////////// - -Features::Features() = default; - -Features Features::all() { return {}; } - -Features Features::strictMode() { - Features features; - features.allowComments_ = false; - features.strictRoot_ = true; - features.allowDroppedNullPlaceholders_ = false; - features.allowNumericKeys_ = false; - return features; -} - -// Implementation of class Reader -// //////////////////////////////// - -bool Reader::containsNewLine(Reader::Location begin, Reader::Location end) { - return std::any_of(begin, end, [](char b) { return b == '\n' || b == '\r'; }); -} - -// Class Reader -// ////////////////////////////////////////////////////////////////// - -Reader::Reader() : features_(Features::all()) {} - -Reader::Reader(const Features& features) : features_(features) {} - -bool Reader::parse(const std::string& document, Value& root, - bool collectComments) { - document_.assign(document.begin(), document.end()); - const char* begin = document_.c_str(); - const char* end = begin + document_.length(); - return parse(begin, end, root, collectComments); -} - -bool Reader::parse(std::istream& is, Value& root, bool collectComments) { - // std::istream_iterator begin(is); - // std::istream_iterator end; - // Those would allow streamed input from a file, if parse() were a - // template function. - - // Since String is reference-counted, this at least does not - // create an extra copy. - String doc(std::istreambuf_iterator(is), {}); - return parse(doc.data(), doc.data() + doc.size(), root, collectComments); -} - -bool Reader::parse(const char* beginDoc, const char* endDoc, Value& root, - bool collectComments) { - if (!features_.allowComments_) { - collectComments = false; - } - - begin_ = beginDoc; - end_ = endDoc; - collectComments_ = collectComments; - current_ = begin_; - lastValueEnd_ = nullptr; - lastValue_ = nullptr; - commentsBefore_.clear(); - errors_.clear(); - while (!nodes_.empty()) - nodes_.pop(); - nodes_.push(&root); - - bool successful = readValue(); - Token token; - skipCommentTokens(token); - if (collectComments_ && !commentsBefore_.empty()) - root.setComment(commentsBefore_, commentAfter); - if (features_.strictRoot_) { - if (!root.isArray() && !root.isObject()) { - // Set error location to start of doc, ideally should be first token found - // in doc - token.type_ = tokenError; - token.start_ = beginDoc; - token.end_ = endDoc; - addError( - "A valid JSON document must be either an array or an object value.", - token); - return false; - } - } - return successful; -} - -bool Reader::readValue() { - // readValue() may call itself only if it calls readObject() or ReadArray(). - // These methods execute nodes_.push() just before and nodes_.pop)() just - // after calling readValue(). parse() executes one nodes_.push(), so > instead - // of >=. - if (nodes_.size() > stackLimit_g) - throwRuntimeError("Exceeded stackLimit in readValue()."); - - Token token; - skipCommentTokens(token); - bool successful = true; - - if (collectComments_ && !commentsBefore_.empty()) { - currentValue().setComment(commentsBefore_, commentBefore); - commentsBefore_.clear(); - } - - switch (token.type_) { - case tokenObjectBegin: - successful = readObject(token); - currentValue().setOffsetLimit(current_ - begin_); - break; - case tokenArrayBegin: - successful = readArray(token); - currentValue().setOffsetLimit(current_ - begin_); - break; - case tokenNumber: - successful = decodeNumber(token); - break; - case tokenString: - successful = decodeString(token); - break; - case tokenTrue: { - Value v(true); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenFalse: { - Value v(false); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenNull: { - Value v; - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenArraySeparator: - case tokenObjectEnd: - case tokenArrayEnd: - if (features_.allowDroppedNullPlaceholders_) { - // "Un-read" the current token and mark the current value as a null - // token. - current_--; - Value v; - currentValue().swapPayload(v); - currentValue().setOffsetStart(current_ - begin_ - 1); - currentValue().setOffsetLimit(current_ - begin_); - break; - } // Else, fall through... - default: - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return addError("Syntax error: value, object or array expected.", token); - } - - if (collectComments_) { - lastValueEnd_ = current_; - lastValue_ = ¤tValue(); - } - - return successful; -} - -void Reader::skipCommentTokens(Token& token) { - if (features_.allowComments_) { - do { - readToken(token); - } while (token.type_ == tokenComment); - } else { - readToken(token); - } -} - -bool Reader::readToken(Token& token) { - skipSpaces(); - token.start_ = current_; - Char c = getNextChar(); - bool ok = true; - switch (c) { - case '{': - token.type_ = tokenObjectBegin; - break; - case '}': - token.type_ = tokenObjectEnd; - break; - case '[': - token.type_ = tokenArrayBegin; - break; - case ']': - token.type_ = tokenArrayEnd; - break; - case '"': - token.type_ = tokenString; - ok = readString(); - break; - case '/': - token.type_ = tokenComment; - ok = readComment(); - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '-': - token.type_ = tokenNumber; - readNumber(); - break; - case 't': - token.type_ = tokenTrue; - ok = match("rue", 3); - break; - case 'f': - token.type_ = tokenFalse; - ok = match("alse", 4); - break; - case 'n': - token.type_ = tokenNull; - ok = match("ull", 3); - break; - case ',': - token.type_ = tokenArraySeparator; - break; - case ':': - token.type_ = tokenMemberSeparator; - break; - case 0: - token.type_ = tokenEndOfStream; - break; - default: - ok = false; - break; - } - if (!ok) - token.type_ = tokenError; - token.end_ = current_; - return ok; -} - -void Reader::skipSpaces() { - while (current_ != end_) { - Char c = *current_; - if (c == ' ' || c == '\t' || c == '\r' || c == '\n') - ++current_; - else - break; - } -} - -bool Reader::match(const Char* pattern, int patternLength) { - if (end_ - current_ < patternLength) - return false; - int index = patternLength; - while (index--) - if (current_[index] != pattern[index]) - return false; - current_ += patternLength; - return true; -} - -bool Reader::readComment() { - Location commentBegin = current_ - 1; - Char c = getNextChar(); - bool successful = false; - if (c == '*') - successful = readCStyleComment(); - else if (c == '/') - successful = readCppStyleComment(); - if (!successful) - return false; - - if (collectComments_) { - CommentPlacement placement = commentBefore; - if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { - if (c != '*' || !containsNewLine(commentBegin, current_)) - placement = commentAfterOnSameLine; - } - - addComment(commentBegin, current_, placement); - } - return true; -} - -String Reader::normalizeEOL(Reader::Location begin, Reader::Location end) { - String normalized; - normalized.reserve(static_cast(end - begin)); - Reader::Location current = begin; - while (current != end) { - char c = *current++; - if (c == '\r') { - if (current != end && *current == '\n') - // convert dos EOL - ++current; - // convert Mac EOL - normalized += '\n'; - } else { - normalized += c; - } - } - return normalized; -} - -void Reader::addComment(Location begin, Location end, - CommentPlacement placement) { - assert(collectComments_); - const String& normalized = normalizeEOL(begin, end); - if (placement == commentAfterOnSameLine) { - assert(lastValue_ != nullptr); - lastValue_->setComment(normalized, placement); - } else { - commentsBefore_ += normalized; - } -} - -bool Reader::readCStyleComment() { - while ((current_ + 1) < end_) { - Char c = getNextChar(); - if (c == '*' && *current_ == '/') - break; - } - return getNextChar() == '/'; -} - -bool Reader::readCppStyleComment() { - while (current_ != end_) { - Char c = getNextChar(); - if (c == '\n') - break; - if (c == '\r') { - // Consume DOS EOL. It will be normalized in addComment. - if (current_ != end_ && *current_ == '\n') - getNextChar(); - // Break on Moc OS 9 EOL. - break; - } - } - return true; -} - -void Reader::readNumber() { - Location p = current_; - char c = '0'; // stopgap for already consumed character - // integral part - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - // fractional part - if (c == '.') { - c = (current_ = p) < end_ ? *p++ : '\0'; - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - } - // exponential part - if (c == 'e' || c == 'E') { - c = (current_ = p) < end_ ? *p++ : '\0'; - if (c == '+' || c == '-') - c = (current_ = p) < end_ ? *p++ : '\0'; - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - } -} - -bool Reader::readString() { - Char c = '\0'; - while (current_ != end_) { - c = getNextChar(); - if (c == '\\') - getNextChar(); - else if (c == '"') - break; - } - return c == '"'; -} - -bool Reader::readObject(Token& token) { - Token tokenName; - String name; - Value init(objectValue); - currentValue().swapPayload(init); - currentValue().setOffsetStart(token.start_ - begin_); - while (readToken(tokenName)) { - bool initialTokenOk = true; - while (tokenName.type_ == tokenComment && initialTokenOk) - initialTokenOk = readToken(tokenName); - if (!initialTokenOk) - break; - if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object - return true; - name.clear(); - if (tokenName.type_ == tokenString) { - if (!decodeString(tokenName, name)) - return recoverFromError(tokenObjectEnd); - } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { - Value numberName; - if (!decodeNumber(tokenName, numberName)) - return recoverFromError(tokenObjectEnd); - name = numberName.asString(); - } else { - break; - } - - Token colon; - if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { - return addErrorAndRecover("Missing ':' after object member name", colon, - tokenObjectEnd); - } - Value& value = currentValue()[name]; - nodes_.push(&value); - bool ok = readValue(); - nodes_.pop(); - if (!ok) // error already set - return recoverFromError(tokenObjectEnd); - - Token comma; - if (!readToken(comma) || - (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && - comma.type_ != tokenComment)) { - return addErrorAndRecover("Missing ',' or '}' in object declaration", - comma, tokenObjectEnd); - } - bool finalizeTokenOk = true; - while (comma.type_ == tokenComment && finalizeTokenOk) - finalizeTokenOk = readToken(comma); - if (comma.type_ == tokenObjectEnd) - return true; - } - return addErrorAndRecover("Missing '}' or object member name", tokenName, - tokenObjectEnd); -} - -bool Reader::readArray(Token& token) { - Value init(arrayValue); - currentValue().swapPayload(init); - currentValue().setOffsetStart(token.start_ - begin_); - skipSpaces(); - if (current_ != end_ && *current_ == ']') // empty array - { - Token endArray; - readToken(endArray); - return true; - } - int index = 0; - for (;;) { - Value& value = currentValue()[index++]; - nodes_.push(&value); - bool ok = readValue(); - nodes_.pop(); - if (!ok) // error already set - return recoverFromError(tokenArrayEnd); - - Token currentToken; - // Accept Comment after last item in the array. - ok = readToken(currentToken); - while (currentToken.type_ == tokenComment && ok) { - ok = readToken(currentToken); - } - bool badTokenType = (currentToken.type_ != tokenArraySeparator && - currentToken.type_ != tokenArrayEnd); - if (!ok || badTokenType) { - return addErrorAndRecover("Missing ',' or ']' in array declaration", - currentToken, tokenArrayEnd); - } - if (currentToken.type_ == tokenArrayEnd) - break; - } - return true; -} - -bool Reader::decodeNumber(Token& token) { - Value decoded; - if (!decodeNumber(token, decoded)) - return false; - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool Reader::decodeNumber(Token& token, Value& decoded) { - // Attempts to parse the number as an integer. If the number is - // larger than the maximum supported value of an integer then - // we decode the number as a double. - Location current = token.start_; - bool isNegative = *current == '-'; - if (isNegative) - ++current; - // TODO: Help the compiler do the div and mod at compile time or get rid of - // them. - Value::LargestUInt maxIntegerValue = - isNegative ? Value::LargestUInt(Value::maxLargestInt) + 1 - : Value::maxLargestUInt; - Value::LargestUInt threshold = maxIntegerValue / 10; - Value::LargestUInt value = 0; - while (current < token.end_) { - Char c = *current++; - if (c < '0' || c > '9') - return decodeDouble(token, decoded); - auto digit(static_cast(c - '0')); - if (value >= threshold) { - // We've hit or exceeded the max value divided by 10 (rounded down). If - // a) we've only just touched the limit, b) this is the last digit, and - // c) it's small enough to fit in that rounding delta, we're okay. - // Otherwise treat this number as a double to avoid overflow. - if (value > threshold || current != token.end_ || - digit > maxIntegerValue % 10) { - return decodeDouble(token, decoded); - } - } - value = value * 10 + digit; - } - if (isNegative && value == maxIntegerValue) - decoded = Value::minLargestInt; - else if (isNegative) - decoded = -Value::LargestInt(value); - else if (value <= Value::LargestUInt(Value::maxInt)) - decoded = Value::LargestInt(value); - else - decoded = value; - return true; -} - -bool Reader::decodeDouble(Token& token) { - Value decoded; - if (!decodeDouble(token, decoded)) - return false; - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool Reader::decodeDouble(Token& token, Value& decoded) { - double value = 0; - String buffer(token.start_, token.end_); - IStringStream is(buffer); - if (!(is >> value)) - return addError( - "'" + String(token.start_, token.end_) + "' is not a number.", token); - decoded = value; - return true; -} - -bool Reader::decodeString(Token& token) { - String decoded_string; - if (!decodeString(token, decoded_string)) - return false; - Value decoded(decoded_string); - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool Reader::decodeString(Token& token, String& decoded) { - decoded.reserve(static_cast(token.end_ - token.start_ - 2)); - Location current = token.start_ + 1; // skip '"' - Location end = token.end_ - 1; // do not include '"' - while (current != end) { - Char c = *current++; - if (c == '"') - break; - if (c == '\\') { - if (current == end) - return addError("Empty escape sequence in string", token, current); - Char escape = *current++; - switch (escape) { - case '"': - decoded += '"'; - break; - case '/': - decoded += '/'; - break; - case '\\': - decoded += '\\'; - break; - case 'b': - decoded += '\b'; - break; - case 'f': - decoded += '\f'; - break; - case 'n': - decoded += '\n'; - break; - case 'r': - decoded += '\r'; - break; - case 't': - decoded += '\t'; - break; - case 'u': { - unsigned int unicode; - if (!decodeUnicodeCodePoint(token, current, end, unicode)) - return false; - decoded += codePointToUTF8(unicode); - } break; - default: - return addError("Bad escape sequence in string", token, current); - } - } else { - decoded += c; - } - } - return true; -} - -bool Reader::decodeUnicodeCodePoint(Token& token, Location& current, - Location end, unsigned int& unicode) { - - if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) - return false; - if (unicode >= 0xD800 && unicode <= 0xDBFF) { - // surrogate pairs - if (end - current < 6) - return addError( - "additional six characters expected to parse unicode surrogate pair.", - token, current); - if (*(current++) == '\\' && *(current++) == 'u') { - unsigned int surrogatePair; - if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { - unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); - } else - return false; - } else - return addError("expecting another \\u token to begin the second half of " - "a unicode surrogate pair", - token, current); - } - return true; -} - -bool Reader::decodeUnicodeEscapeSequence(Token& token, Location& current, - Location end, - unsigned int& ret_unicode) { - if (end - current < 4) - return addError( - "Bad unicode escape sequence in string: four digits expected.", token, - current); - int unicode = 0; - for (int index = 0; index < 4; ++index) { - Char c = *current++; - unicode *= 16; - if (c >= '0' && c <= '9') - unicode += c - '0'; - else if (c >= 'a' && c <= 'f') - unicode += c - 'a' + 10; - else if (c >= 'A' && c <= 'F') - unicode += c - 'A' + 10; - else - return addError( - "Bad unicode escape sequence in string: hexadecimal digit expected.", - token, current); - } - ret_unicode = static_cast(unicode); - return true; -} - -bool Reader::addError(const String& message, Token& token, Location extra) { - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = extra; - errors_.push_back(info); - return false; -} - -bool Reader::recoverFromError(TokenType skipUntilToken) { - size_t const errorCount = errors_.size(); - Token skip; - for (;;) { - if (!readToken(skip)) - errors_.resize(errorCount); // discard errors caused by recovery - if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) - break; - } - errors_.resize(errorCount); - return false; -} - -bool Reader::addErrorAndRecover(const String& message, Token& token, - TokenType skipUntilToken) { - addError(message, token); - return recoverFromError(skipUntilToken); -} - -Value& Reader::currentValue() { return *(nodes_.top()); } - -Reader::Char Reader::getNextChar() { - if (current_ == end_) - return 0; - return *current_++; -} - -void Reader::getLocationLineAndColumn(Location location, int& line, - int& column) const { - Location current = begin_; - Location lastLineStart = current; - line = 0; - while (current < location && current != end_) { - Char c = *current++; - if (c == '\r') { - if (*current == '\n') - ++current; - lastLineStart = current; - ++line; - } else if (c == '\n') { - lastLineStart = current; - ++line; - } - } - // column & line start at 1 - column = int(location - lastLineStart) + 1; - ++line; -} - -String Reader::getLocationLineAndColumn(Location location) const { - int line, column; - getLocationLineAndColumn(location, line, column); - char buffer[18 + 16 + 16 + 1]; - jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); - return buffer; -} - -// Deprecated. Preserved for backward compatibility -String Reader::getFormatedErrorMessages() const { - return getFormattedErrorMessages(); -} - -String Reader::getFormattedErrorMessages() const { - String formattedMessage; - for (const auto& error : errors_) { - formattedMessage += - "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; - formattedMessage += " " + error.message_ + "\n"; - if (error.extra_) - formattedMessage += - "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; - } - return formattedMessage; -} - -std::vector Reader::getStructuredErrors() const { - std::vector allErrors; - for (const auto& error : errors_) { - Reader::StructuredError structured; - structured.offset_start = error.token_.start_ - begin_; - structured.offset_limit = error.token_.end_ - begin_; - structured.message = error.message_; - allErrors.push_back(structured); - } - return allErrors; -} - -bool Reader::pushError(const Value& value, const String& message) { - ptrdiff_t const length = end_ - begin_; - if (value.getOffsetStart() > length || value.getOffsetLimit() > length) - return false; - Token token; - token.type_ = tokenError; - token.start_ = begin_ + value.getOffsetStart(); - token.end_ = begin_ + value.getOffsetLimit(); - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = nullptr; - errors_.push_back(info); - return true; -} - -bool Reader::pushError(const Value& value, const String& message, - const Value& extra) { - ptrdiff_t const length = end_ - begin_; - if (value.getOffsetStart() > length || value.getOffsetLimit() > length || - extra.getOffsetLimit() > length) - return false; - Token token; - token.type_ = tokenError; - token.start_ = begin_ + value.getOffsetStart(); - token.end_ = begin_ + value.getOffsetLimit(); - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = begin_ + extra.getOffsetStart(); - errors_.push_back(info); - return true; -} - -bool Reader::good() const { return errors_.empty(); } - -// Originally copied from the Features class (now deprecated), used internally -// for features implementation. -class OurFeatures { -public: - static OurFeatures all(); - bool allowComments_; - bool allowTrailingCommas_; - bool strictRoot_; - bool allowDroppedNullPlaceholders_; - bool allowNumericKeys_; - bool allowSingleQuotes_; - bool failIfExtra_; - bool rejectDupKeys_; - bool allowSpecialFloats_; - bool skipBom_; - size_t stackLimit_; -}; // OurFeatures - -OurFeatures OurFeatures::all() { return {}; } - -// Implementation of class Reader -// //////////////////////////////// - -// Originally copied from the Reader class (now deprecated), used internally -// for implementing JSON reading. -class OurReader { -public: - using Char = char; - using Location = const Char*; - struct StructuredError { - ptrdiff_t offset_start; - ptrdiff_t offset_limit; - String message; - }; - - explicit OurReader(OurFeatures const& features); - bool parse(const char* beginDoc, const char* endDoc, Value& root, - bool collectComments = true); - String getFormattedErrorMessages() const; - std::vector getStructuredErrors() const; - -private: - OurReader(OurReader const&); // no impl - void operator=(OurReader const&); // no impl - - enum TokenType { - tokenEndOfStream = 0, - tokenObjectBegin, - tokenObjectEnd, - tokenArrayBegin, - tokenArrayEnd, - tokenString, - tokenNumber, - tokenTrue, - tokenFalse, - tokenNull, - tokenNaN, - tokenPosInf, - tokenNegInf, - tokenArraySeparator, - tokenMemberSeparator, - tokenComment, - tokenError - }; - - class Token { - public: - TokenType type_; - Location start_; - Location end_; - }; - - class ErrorInfo { - public: - Token token_; - String message_; - Location extra_; - }; - - using Errors = std::deque; - - bool readToken(Token& token); - void skipSpaces(); - void skipBom(bool skipBom); - bool match(const Char* pattern, int patternLength); - bool readComment(); - bool readCStyleComment(bool* containsNewLineResult); - bool readCppStyleComment(); - bool readString(); - bool readStringSingleQuote(); - bool readNumber(bool checkInf); - bool readValue(); - bool readObject(Token& token); - bool readArray(Token& token); - bool decodeNumber(Token& token); - bool decodeNumber(Token& token, Value& decoded); - bool decodeString(Token& token); - bool decodeString(Token& token, String& decoded); - bool decodeDouble(Token& token); - bool decodeDouble(Token& token, Value& decoded); - bool decodeUnicodeCodePoint(Token& token, Location& current, Location end, - unsigned int& unicode); - bool decodeUnicodeEscapeSequence(Token& token, Location& current, - Location end, unsigned int& unicode); - bool addError(const String& message, Token& token, Location extra = nullptr); - bool recoverFromError(TokenType skipUntilToken); - bool addErrorAndRecover(const String& message, Token& token, - TokenType skipUntilToken); - void skipUntilSpace(); - Value& currentValue(); - Char getNextChar(); - void getLocationLineAndColumn(Location location, int& line, - int& column) const; - String getLocationLineAndColumn(Location location) const; - void addComment(Location begin, Location end, CommentPlacement placement); - void skipCommentTokens(Token& token); - - static String normalizeEOL(Location begin, Location end); - static bool containsNewLine(Location begin, Location end); - - using Nodes = std::stack; - - Nodes nodes_{}; - Errors errors_{}; - String document_{}; - Location begin_ = nullptr; - Location end_ = nullptr; - Location current_ = nullptr; - Location lastValueEnd_ = nullptr; - Value* lastValue_ = nullptr; - bool lastValueHasAComment_ = false; - String commentsBefore_{}; - - OurFeatures const features_; - bool collectComments_ = false; -}; // OurReader - -// complete copy of Read impl, for OurReader - -bool OurReader::containsNewLine(OurReader::Location begin, - OurReader::Location end) { - return std::any_of(begin, end, [](char b) { return b == '\n' || b == '\r'; }); -} - -OurReader::OurReader(OurFeatures const& features) : features_(features) {} - -bool OurReader::parse(const char* beginDoc, const char* endDoc, Value& root, - bool collectComments) { - if (!features_.allowComments_) { - collectComments = false; - } - - begin_ = beginDoc; - end_ = endDoc; - collectComments_ = collectComments; - current_ = begin_; - lastValueEnd_ = nullptr; - lastValue_ = nullptr; - commentsBefore_.clear(); - errors_.clear(); - while (!nodes_.empty()) - nodes_.pop(); - nodes_.push(&root); - - // skip byte order mark if it exists at the beginning of the UTF-8 text. - skipBom(features_.skipBom_); - bool successful = readValue(); - nodes_.pop(); - Token token; - skipCommentTokens(token); - if (features_.failIfExtra_ && (token.type_ != tokenEndOfStream)) { - addError("Extra non-whitespace after JSON value.", token); - return false; - } - if (collectComments_ && !commentsBefore_.empty()) - root.setComment(commentsBefore_, commentAfter); - if (features_.strictRoot_) { - if (!root.isArray() && !root.isObject()) { - // Set error location to start of doc, ideally should be first token found - // in doc - token.type_ = tokenError; - token.start_ = beginDoc; - token.end_ = endDoc; - addError( - "A valid JSON document must be either an array or an object value.", - token); - return false; - } - } - return successful; -} - -bool OurReader::readValue() { - // To preserve the old behaviour we cast size_t to int. - if (nodes_.size() > features_.stackLimit_) - throwRuntimeError("Exceeded stackLimit in readValue()."); - Token token; - skipCommentTokens(token); - bool successful = true; - - if (collectComments_ && !commentsBefore_.empty()) { - currentValue().setComment(commentsBefore_, commentBefore); - commentsBefore_.clear(); - } - - switch (token.type_) { - case tokenObjectBegin: - successful = readObject(token); - currentValue().setOffsetLimit(current_ - begin_); - break; - case tokenArrayBegin: - successful = readArray(token); - currentValue().setOffsetLimit(current_ - begin_); - break; - case tokenNumber: - successful = decodeNumber(token); - break; - case tokenString: - successful = decodeString(token); - break; - case tokenTrue: { - Value v(true); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenFalse: { - Value v(false); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenNull: { - Value v; - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenNaN: { - Value v(std::numeric_limits::quiet_NaN()); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenPosInf: { - Value v(std::numeric_limits::infinity()); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenNegInf: { - Value v(-std::numeric_limits::infinity()); - currentValue().swapPayload(v); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - } break; - case tokenArraySeparator: - case tokenObjectEnd: - case tokenArrayEnd: - if (features_.allowDroppedNullPlaceholders_) { - // "Un-read" the current token and mark the current value as a null - // token. - current_--; - Value v; - currentValue().swapPayload(v); - currentValue().setOffsetStart(current_ - begin_ - 1); - currentValue().setOffsetLimit(current_ - begin_); - break; - } // else, fall through ... - default: - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return addError("Syntax error: value, object or array expected.", token); - } - - if (collectComments_) { - lastValueEnd_ = current_; - lastValueHasAComment_ = false; - lastValue_ = ¤tValue(); - } - - return successful; -} - -void OurReader::skipCommentTokens(Token& token) { - if (features_.allowComments_) { - do { - readToken(token); - } while (token.type_ == tokenComment); - } else { - readToken(token); - } -} - -bool OurReader::readToken(Token& token) { - skipSpaces(); - token.start_ = current_; - Char c = getNextChar(); - bool ok = true; - switch (c) { - case '{': - token.type_ = tokenObjectBegin; - break; - case '}': - token.type_ = tokenObjectEnd; - break; - case '[': - token.type_ = tokenArrayBegin; - break; - case ']': - token.type_ = tokenArrayEnd; - break; - case '"': - token.type_ = tokenString; - ok = readString(); - break; - case '\'': - if (features_.allowSingleQuotes_) { - token.type_ = tokenString; - ok = readStringSingleQuote(); - } else { - // If we don't allow single quotes, this is a failure case. - ok = false; - } - break; - case '/': - token.type_ = tokenComment; - ok = readComment(); - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - token.type_ = tokenNumber; - readNumber(false); - break; - case '-': - if (readNumber(true)) { - token.type_ = tokenNumber; - } else { - token.type_ = tokenNegInf; - ok = features_.allowSpecialFloats_ && match("nfinity", 7); - } - break; - case '+': - if (readNumber(true)) { - token.type_ = tokenNumber; - } else { - token.type_ = tokenPosInf; - ok = features_.allowSpecialFloats_ && match("nfinity", 7); - } - break; - case 't': - token.type_ = tokenTrue; - ok = match("rue", 3); - break; - case 'f': - token.type_ = tokenFalse; - ok = match("alse", 4); - break; - case 'n': - token.type_ = tokenNull; - ok = match("ull", 3); - break; - case 'N': - if (features_.allowSpecialFloats_) { - token.type_ = tokenNaN; - ok = match("aN", 2); - } else { - ok = false; - } - break; - case 'I': - if (features_.allowSpecialFloats_) { - token.type_ = tokenPosInf; - ok = match("nfinity", 7); - } else { - ok = false; - } - break; - case ',': - token.type_ = tokenArraySeparator; - break; - case ':': - token.type_ = tokenMemberSeparator; - break; - case 0: - token.type_ = tokenEndOfStream; - break; - default: - ok = false; - break; - } - if (!ok) - token.type_ = tokenError; - token.end_ = current_; - return ok; -} - -void OurReader::skipSpaces() { - while (current_ != end_) { - Char c = *current_; - if (c == ' ' || c == '\t' || c == '\r' || c == '\n') - ++current_; - else - break; - } -} - -void OurReader::skipBom(bool skipBom) { - // The default behavior is to skip BOM. - if (skipBom) { - if ((end_ - begin_) >= 3 && strncmp(begin_, "\xEF\xBB\xBF", 3) == 0) { - begin_ += 3; - current_ = begin_; - } - } -} - -bool OurReader::match(const Char* pattern, int patternLength) { - if (end_ - current_ < patternLength) - return false; - int index = patternLength; - while (index--) - if (current_[index] != pattern[index]) - return false; - current_ += patternLength; - return true; -} - -bool OurReader::readComment() { - const Location commentBegin = current_ - 1; - const Char c = getNextChar(); - bool successful = false; - bool cStyleWithEmbeddedNewline = false; - - const bool isCStyleComment = (c == '*'); - const bool isCppStyleComment = (c == '/'); - if (isCStyleComment) { - successful = readCStyleComment(&cStyleWithEmbeddedNewline); - } else if (isCppStyleComment) { - successful = readCppStyleComment(); - } - - if (!successful) - return false; - - if (collectComments_) { - CommentPlacement placement = commentBefore; - - if (!lastValueHasAComment_) { - if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { - if (isCppStyleComment || !cStyleWithEmbeddedNewline) { - placement = commentAfterOnSameLine; - lastValueHasAComment_ = true; - } - } - } - - addComment(commentBegin, current_, placement); - } - return true; -} - -String OurReader::normalizeEOL(OurReader::Location begin, - OurReader::Location end) { - String normalized; - normalized.reserve(static_cast(end - begin)); - OurReader::Location current = begin; - while (current != end) { - char c = *current++; - if (c == '\r') { - if (current != end && *current == '\n') - // convert dos EOL - ++current; - // convert Mac EOL - normalized += '\n'; - } else { - normalized += c; - } - } - return normalized; -} - -void OurReader::addComment(Location begin, Location end, - CommentPlacement placement) { - assert(collectComments_); - const String& normalized = normalizeEOL(begin, end); - if (placement == commentAfterOnSameLine) { - assert(lastValue_ != nullptr); - lastValue_->setComment(normalized, placement); - } else { - commentsBefore_ += normalized; - } -} - -bool OurReader::readCStyleComment(bool* containsNewLineResult) { - *containsNewLineResult = false; - - while ((current_ + 1) < end_) { - Char c = getNextChar(); - if (c == '*' && *current_ == '/') - break; - if (c == '\n') - *containsNewLineResult = true; - } - - return getNextChar() == '/'; -} - -bool OurReader::readCppStyleComment() { - while (current_ != end_) { - Char c = getNextChar(); - if (c == '\n') - break; - if (c == '\r') { - // Consume DOS EOL. It will be normalized in addComment. - if (current_ != end_ && *current_ == '\n') - getNextChar(); - // Break on Moc OS 9 EOL. - break; - } - } - return true; -} - -bool OurReader::readNumber(bool checkInf) { - Location p = current_; - if (checkInf && p != end_ && *p == 'I') { - current_ = ++p; - return false; - } - char c = '0'; // stopgap for already consumed character - // integral part - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - // fractional part - if (c == '.') { - c = (current_ = p) < end_ ? *p++ : '\0'; - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - } - // exponential part - if (c == 'e' || c == 'E') { - c = (current_ = p) < end_ ? *p++ : '\0'; - if (c == '+' || c == '-') - c = (current_ = p) < end_ ? *p++ : '\0'; - while (c >= '0' && c <= '9') - c = (current_ = p) < end_ ? *p++ : '\0'; - } - return true; -} -bool OurReader::readString() { - Char c = 0; - while (current_ != end_) { - c = getNextChar(); - if (c == '\\') - getNextChar(); - else if (c == '"') - break; - } - return c == '"'; -} - -bool OurReader::readStringSingleQuote() { - Char c = 0; - while (current_ != end_) { - c = getNextChar(); - if (c == '\\') - getNextChar(); - else if (c == '\'') - break; - } - return c == '\''; -} - -bool OurReader::readObject(Token& token) { - Token tokenName; - String name; - Value init(objectValue); - currentValue().swapPayload(init); - currentValue().setOffsetStart(token.start_ - begin_); - while (readToken(tokenName)) { - bool initialTokenOk = true; - while (tokenName.type_ == tokenComment && initialTokenOk) - initialTokenOk = readToken(tokenName); - if (!initialTokenOk) - break; - if (tokenName.type_ == tokenObjectEnd && - (name.empty() || - features_.allowTrailingCommas_)) // empty object or trailing comma - return true; - name.clear(); - if (tokenName.type_ == tokenString) { - if (!decodeString(tokenName, name)) - return recoverFromError(tokenObjectEnd); - } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { - Value numberName; - if (!decodeNumber(tokenName, numberName)) - return recoverFromError(tokenObjectEnd); - name = numberName.asString(); - } else { - break; - } - if (name.length() >= (1U << 30)) - throwRuntimeError("keylength >= 2^30"); - if (features_.rejectDupKeys_ && currentValue().isMember(name)) { - String msg = "Duplicate key: '" + name + "'"; - return addErrorAndRecover(msg, tokenName, tokenObjectEnd); - } - - Token colon; - if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { - return addErrorAndRecover("Missing ':' after object member name", colon, - tokenObjectEnd); - } - Value& value = currentValue()[name]; - nodes_.push(&value); - bool ok = readValue(); - nodes_.pop(); - if (!ok) // error already set - return recoverFromError(tokenObjectEnd); - - Token comma; - if (!readToken(comma) || - (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && - comma.type_ != tokenComment)) { - return addErrorAndRecover("Missing ',' or '}' in object declaration", - comma, tokenObjectEnd); - } - bool finalizeTokenOk = true; - while (comma.type_ == tokenComment && finalizeTokenOk) - finalizeTokenOk = readToken(comma); - if (comma.type_ == tokenObjectEnd) - return true; - } - return addErrorAndRecover("Missing '}' or object member name", tokenName, - tokenObjectEnd); -} - -bool OurReader::readArray(Token& token) { - Value init(arrayValue); - currentValue().swapPayload(init); - currentValue().setOffsetStart(token.start_ - begin_); - int index = 0; - for (;;) { - skipSpaces(); - if (current_ != end_ && *current_ == ']' && - (index == 0 || - (features_.allowTrailingCommas_ && - !features_.allowDroppedNullPlaceholders_))) // empty array or trailing - // comma - { - Token endArray; - readToken(endArray); - return true; - } - Value& value = currentValue()[index++]; - nodes_.push(&value); - bool ok = readValue(); - nodes_.pop(); - if (!ok) // error already set - return recoverFromError(tokenArrayEnd); - - Token currentToken; - // Accept Comment after last item in the array. - ok = readToken(currentToken); - while (currentToken.type_ == tokenComment && ok) { - ok = readToken(currentToken); - } - bool badTokenType = (currentToken.type_ != tokenArraySeparator && - currentToken.type_ != tokenArrayEnd); - if (!ok || badTokenType) { - return addErrorAndRecover("Missing ',' or ']' in array declaration", - currentToken, tokenArrayEnd); - } - if (currentToken.type_ == tokenArrayEnd) - break; - } - return true; -} - -bool OurReader::decodeNumber(Token& token) { - Value decoded; - if (!decodeNumber(token, decoded)) - return false; - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool OurReader::decodeNumber(Token& token, Value& decoded) { - // Attempts to parse the number as an integer. If the number is - // larger than the maximum supported value of an integer then - // we decode the number as a double. - Location current = token.start_; - const bool isNegative = *current == '-'; - if (isNegative) { - ++current; - } - - // We assume we can represent the largest and smallest integer types as - // unsigned integers with separate sign. This is only true if they can fit - // into an unsigned integer. - static_assert(Value::maxLargestInt <= Value::maxLargestUInt, - "Int must be smaller than UInt"); - - // We need to convert minLargestInt into a positive number. The easiest way - // to do this conversion is to assume our "threshold" value of minLargestInt - // divided by 10 can fit in maxLargestInt when absolute valued. This should - // be a safe assumption. - static_assert(Value::minLargestInt <= -Value::maxLargestInt, - "The absolute value of minLargestInt must be greater than or " - "equal to maxLargestInt"); - static_assert(Value::minLargestInt / 10 >= -Value::maxLargestInt, - "The absolute value of minLargestInt must be only 1 magnitude " - "larger than maxLargest Int"); - - static constexpr Value::LargestUInt positive_threshold = - Value::maxLargestUInt / 10; - static constexpr Value::UInt positive_last_digit = Value::maxLargestUInt % 10; - - // For the negative values, we have to be more careful. Since typically - // -Value::minLargestInt will cause an overflow, we first divide by 10 and - // then take the inverse. This assumes that minLargestInt is only a single - // power of 10 different in magnitude, which we check above. For the last - // digit, we take the modulus before negating for the same reason. - static constexpr auto negative_threshold = - Value::LargestUInt(-(Value::minLargestInt / 10)); - static constexpr auto negative_last_digit = - Value::UInt(-(Value::minLargestInt % 10)); - - const Value::LargestUInt threshold = - isNegative ? negative_threshold : positive_threshold; - const Value::UInt max_last_digit = - isNegative ? negative_last_digit : positive_last_digit; - - Value::LargestUInt value = 0; - while (current < token.end_) { - Char c = *current++; - if (c < '0' || c > '9') - return decodeDouble(token, decoded); - - const auto digit(static_cast(c - '0')); - if (value >= threshold) { - // We've hit or exceeded the max value divided by 10 (rounded down). If - // a) we've only just touched the limit, meaing value == threshold, - // b) this is the last digit, or - // c) it's small enough to fit in that rounding delta, we're okay. - // Otherwise treat this number as a double to avoid overflow. - if (value > threshold || current != token.end_ || - digit > max_last_digit) { - return decodeDouble(token, decoded); - } - } - value = value * 10 + digit; - } - - if (isNegative) { - // We use the same magnitude assumption here, just in case. - const auto last_digit = static_cast(value % 10); - decoded = -Value::LargestInt(value / 10) * 10 - last_digit; - } else if (value <= Value::LargestUInt(Value::maxLargestInt)) { - decoded = Value::LargestInt(value); - } else { - decoded = value; - } - - return true; -} - -bool OurReader::decodeDouble(Token& token) { - Value decoded; - if (!decodeDouble(token, decoded)) - return false; - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool OurReader::decodeDouble(Token& token, Value& decoded) { - double value = 0; - const String buffer(token.start_, token.end_); - IStringStream is(buffer); - if (!(is >> value)) { - return addError( - "'" + String(token.start_, token.end_) + "' is not a number.", token); - } - decoded = value; - return true; -} - -bool OurReader::decodeString(Token& token) { - String decoded_string; - if (!decodeString(token, decoded_string)) - return false; - Value decoded(decoded_string); - currentValue().swapPayload(decoded); - currentValue().setOffsetStart(token.start_ - begin_); - currentValue().setOffsetLimit(token.end_ - begin_); - return true; -} - -bool OurReader::decodeString(Token& token, String& decoded) { - decoded.reserve(static_cast(token.end_ - token.start_ - 2)); - Location current = token.start_ + 1; // skip '"' - Location end = token.end_ - 1; // do not include '"' - while (current != end) { - Char c = *current++; - if (c == '"') - break; - if (c == '\\') { - if (current == end) - return addError("Empty escape sequence in string", token, current); - Char escape = *current++; - switch (escape) { - case '"': - decoded += '"'; - break; - case '/': - decoded += '/'; - break; - case '\\': - decoded += '\\'; - break; - case 'b': - decoded += '\b'; - break; - case 'f': - decoded += '\f'; - break; - case 'n': - decoded += '\n'; - break; - case 'r': - decoded += '\r'; - break; - case 't': - decoded += '\t'; - break; - case 'u': { - unsigned int unicode; - if (!decodeUnicodeCodePoint(token, current, end, unicode)) - return false; - decoded += codePointToUTF8(unicode); - } break; - default: - return addError("Bad escape sequence in string", token, current); - } - } else { - decoded += c; - } - } - return true; -} - -bool OurReader::decodeUnicodeCodePoint(Token& token, Location& current, - Location end, unsigned int& unicode) { - - if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) - return false; - if (unicode >= 0xD800 && unicode <= 0xDBFF) { - // surrogate pairs - if (end - current < 6) - return addError( - "additional six characters expected to parse unicode surrogate pair.", - token, current); - if (*(current++) == '\\' && *(current++) == 'u') { - unsigned int surrogatePair; - if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { - unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); - } else - return false; - } else - return addError("expecting another \\u token to begin the second half of " - "a unicode surrogate pair", - token, current); - } - return true; -} - -bool OurReader::decodeUnicodeEscapeSequence(Token& token, Location& current, - Location end, - unsigned int& ret_unicode) { - if (end - current < 4) - return addError( - "Bad unicode escape sequence in string: four digits expected.", token, - current); - int unicode = 0; - for (int index = 0; index < 4; ++index) { - Char c = *current++; - unicode *= 16; - if (c >= '0' && c <= '9') - unicode += c - '0'; - else if (c >= 'a' && c <= 'f') - unicode += c - 'a' + 10; - else if (c >= 'A' && c <= 'F') - unicode += c - 'A' + 10; - else - return addError( - "Bad unicode escape sequence in string: hexadecimal digit expected.", - token, current); - } - ret_unicode = static_cast(unicode); - return true; -} - -bool OurReader::addError(const String& message, Token& token, Location extra) { - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = extra; - errors_.push_back(info); - return false; -} - -bool OurReader::recoverFromError(TokenType skipUntilToken) { - size_t errorCount = errors_.size(); - Token skip; - for (;;) { - if (!readToken(skip)) - errors_.resize(errorCount); // discard errors caused by recovery - if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) - break; - } - errors_.resize(errorCount); - return false; -} - -bool OurReader::addErrorAndRecover(const String& message, Token& token, - TokenType skipUntilToken) { - addError(message, token); - return recoverFromError(skipUntilToken); -} - -Value& OurReader::currentValue() { return *(nodes_.top()); } - -OurReader::Char OurReader::getNextChar() { - if (current_ == end_) - return 0; - return *current_++; -} - -void OurReader::getLocationLineAndColumn(Location location, int& line, - int& column) const { - Location current = begin_; - Location lastLineStart = current; - line = 0; - while (current < location && current != end_) { - Char c = *current++; - if (c == '\r') { - if (*current == '\n') - ++current; - lastLineStart = current; - ++line; - } else if (c == '\n') { - lastLineStart = current; - ++line; - } - } - // column & line start at 1 - column = int(location - lastLineStart) + 1; - ++line; -} - -String OurReader::getLocationLineAndColumn(Location location) const { - int line, column; - getLocationLineAndColumn(location, line, column); - char buffer[18 + 16 + 16 + 1]; - jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); - return buffer; -} - -String OurReader::getFormattedErrorMessages() const { - String formattedMessage; - for (const auto& error : errors_) { - formattedMessage += - "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; - formattedMessage += " " + error.message_ + "\n"; - if (error.extra_) - formattedMessage += - "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; - } - return formattedMessage; -} - -std::vector OurReader::getStructuredErrors() const { - std::vector allErrors; - for (const auto& error : errors_) { - OurReader::StructuredError structured; - structured.offset_start = error.token_.start_ - begin_; - structured.offset_limit = error.token_.end_ - begin_; - structured.message = error.message_; - allErrors.push_back(structured); - } - return allErrors; -} - -class OurCharReader : public CharReader { - bool const collectComments_; - OurReader reader_; - -public: - OurCharReader(bool collectComments, OurFeatures const& features) - : collectComments_(collectComments), reader_(features) {} - bool parse(char const* beginDoc, char const* endDoc, Value* root, - String* errs) override { - bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_); - if (errs) { - *errs = reader_.getFormattedErrorMessages(); - } - return ok; - } -}; - -CharReaderBuilder::CharReaderBuilder() { setDefaults(&settings_); } -CharReaderBuilder::~CharReaderBuilder() = default; -CharReader* CharReaderBuilder::newCharReader() const { - bool collectComments = settings_["collectComments"].asBool(); - OurFeatures features = OurFeatures::all(); - features.allowComments_ = settings_["allowComments"].asBool(); - features.allowTrailingCommas_ = settings_["allowTrailingCommas"].asBool(); - features.strictRoot_ = settings_["strictRoot"].asBool(); - features.allowDroppedNullPlaceholders_ = - settings_["allowDroppedNullPlaceholders"].asBool(); - features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool(); - features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool(); - - // Stack limit is always a size_t, so we get this as an unsigned int - // regardless of it we have 64-bit integer support enabled. - features.stackLimit_ = static_cast(settings_["stackLimit"].asUInt()); - features.failIfExtra_ = settings_["failIfExtra"].asBool(); - features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool(); - features.allowSpecialFloats_ = settings_["allowSpecialFloats"].asBool(); - features.skipBom_ = settings_["skipBom"].asBool(); - return new OurCharReader(collectComments, features); -} - -bool CharReaderBuilder::validate(Json::Value* invalid) const { - static const auto& valid_keys = *new std::set{ - "collectComments", - "allowComments", - "allowTrailingCommas", - "strictRoot", - "allowDroppedNullPlaceholders", - "allowNumericKeys", - "allowSingleQuotes", - "stackLimit", - "failIfExtra", - "rejectDupKeys", - "allowSpecialFloats", - "skipBom", - }; - for (auto si = settings_.begin(); si != settings_.end(); ++si) { - auto key = si.name(); - if (valid_keys.count(key)) - continue; - if (invalid) - (*invalid)[key] = *si; - else - return false; - } - return invalid ? invalid->empty() : true; -} - -Value& CharReaderBuilder::operator[](const String& key) { - return settings_[key]; -} -// static -void CharReaderBuilder::strictMode(Json::Value* settings) { - //! [CharReaderBuilderStrictMode] - (*settings)["allowComments"] = false; - (*settings)["allowTrailingCommas"] = false; - (*settings)["strictRoot"] = true; - (*settings)["allowDroppedNullPlaceholders"] = false; - (*settings)["allowNumericKeys"] = false; - (*settings)["allowSingleQuotes"] = false; - (*settings)["stackLimit"] = 1000; - (*settings)["failIfExtra"] = true; - (*settings)["rejectDupKeys"] = true; - (*settings)["allowSpecialFloats"] = false; - (*settings)["skipBom"] = true; - //! [CharReaderBuilderStrictMode] -} -// static -void CharReaderBuilder::setDefaults(Json::Value* settings) { - //! [CharReaderBuilderDefaults] - (*settings)["collectComments"] = true; - (*settings)["allowComments"] = true; - (*settings)["allowTrailingCommas"] = true; - (*settings)["strictRoot"] = false; - (*settings)["allowDroppedNullPlaceholders"] = false; - (*settings)["allowNumericKeys"] = false; - (*settings)["allowSingleQuotes"] = false; - (*settings)["stackLimit"] = 1000; - (*settings)["failIfExtra"] = false; - (*settings)["rejectDupKeys"] = false; - (*settings)["allowSpecialFloats"] = false; - (*settings)["skipBom"] = true; - //! [CharReaderBuilderDefaults] -} - -////////////////////////////////// -// global functions - -bool parseFromStream(CharReader::Factory const& fact, IStream& sin, Value* root, - String* errs) { - OStringStream ssin; - ssin << sin.rdbuf(); - String doc = ssin.str(); - char const* begin = doc.data(); - char const* end = begin + doc.size(); - // Note that we do not actually need a null-terminator. - CharReaderPtr const reader(fact.newCharReader()); - return reader->parse(begin, end, root, errs); -} - -IStream& operator>>(IStream& sin, Value& root) { - CharReaderBuilder b; - String errs; - bool ok = parseFromStream(b, sin, &root, &errs); - if (!ok) { - throwRuntimeError(errs); - } - return sin; -} - -} // namespace Json diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_tool.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_tool.h deleted file mode 100644 index 3d34f2e..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_tool.h +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED -#define LIB_JSONCPP_JSON_TOOL_H_INCLUDED - -#if !defined(JSON_IS_AMALGAMATION) -#include -#endif - -// Also support old flag NO_LOCALE_SUPPORT -#ifdef NO_LOCALE_SUPPORT -#define JSONCPP_NO_LOCALE_SUPPORT -#endif - -#ifndef JSONCPP_NO_LOCALE_SUPPORT -#include -#endif - -/* This header provides common string manipulation support, such as UTF-8, - * portable conversion from/to string... - * - * It is an internal header that must not be exposed. - */ - -namespace Json { -static inline char getDecimalPoint() { -#ifdef JSONCPP_NO_LOCALE_SUPPORT - return '\0'; -#else - struct lconv* lc = localeconv(); - return lc ? *(lc->decimal_point) : '\0'; -#endif -} - -/// Converts a unicode code-point to UTF-8. -static inline String codePointToUTF8(unsigned int cp) { - String result; - - // based on description from http://en.wikipedia.org/wiki/UTF-8 - - if (cp <= 0x7f) { - result.resize(1); - result[0] = static_cast(cp); - } else if (cp <= 0x7FF) { - result.resize(2); - result[1] = static_cast(0x80 | (0x3f & cp)); - result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); - } else if (cp <= 0xFFFF) { - result.resize(3); - result[2] = static_cast(0x80 | (0x3f & cp)); - result[1] = static_cast(0x80 | (0x3f & (cp >> 6))); - result[0] = static_cast(0xE0 | (0xf & (cp >> 12))); - } else if (cp <= 0x10FFFF) { - result.resize(4); - result[3] = static_cast(0x80 | (0x3f & cp)); - result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); - result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); - result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); - } - - return result; -} - -enum { - /// Constant that specify the size of the buffer that must be passed to - /// uintToString. - uintToStringBufferSize = 3 * sizeof(LargestUInt) + 1 -}; - -// Defines a char buffer for use with uintToString(). -using UIntToStringBuffer = char[uintToStringBufferSize]; - -/** Converts an unsigned integer to string. - * @param value Unsigned integer to convert to string - * @param current Input/Output string buffer. - * Must have at least uintToStringBufferSize chars free. - */ -static inline void uintToString(LargestUInt value, char*& current) { - *--current = 0; - do { - *--current = static_cast(value % 10U + static_cast('0')); - value /= 10; - } while (value != 0); -} - -/** Change ',' to '.' everywhere in buffer. - * - * We had a sophisticated way, but it did not work in WinCE. - * @see https://github.com/open-source-parsers/jsoncpp/pull/9 - */ -template Iter fixNumericLocale(Iter begin, Iter end) { - for (; begin != end; ++begin) { - if (*begin == ',') { - *begin = '.'; - } - } - return begin; -} - -template void fixNumericLocaleInput(Iter begin, Iter end) { - char decimalPoint = getDecimalPoint(); - if (decimalPoint == '\0' || decimalPoint == '.') { - return; - } - for (; begin != end; ++begin) { - if (*begin == '.') { - *begin = decimalPoint; - } - } -} - -/** - * Return iterator that would be the new end of the range [begin,end), if we - * were to delete zeros in the end of string, but not the last zero before '.'. - */ -template -Iter fixZerosInTheEnd(Iter begin, Iter end, unsigned int precision) { - for (; begin != end; --end) { - if (*(end - 1) != '0') { - return end; - } - // Don't delete the last zero before the decimal point. - if (begin != (end - 1) && begin != (end - 2) && *(end - 2) == '.') { - if (precision) { - return end; - } - return end - 2; - } - } - return end; -} - -} // namespace Json - -#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_value.cpp b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_value.cpp deleted file mode 100644 index c99b5b4..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_value.cpp +++ /dev/null @@ -1,1634 +0,0 @@ -// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include -#endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include -#include -#include -#include -#include -#include - -// Provide implementation equivalent of std::snprintf for older _MSC compilers -#if defined(_MSC_VER) && _MSC_VER < 1900 -#include -static int msvc_pre1900_c99_vsnprintf(char* outBuf, size_t size, - const char* format, va_list ap) { - int count = -1; - if (size != 0) - count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap); - if (count == -1) - count = _vscprintf(format, ap); - return count; -} - -int JSON_API msvc_pre1900_c99_snprintf(char* outBuf, size_t size, - const char* format, ...) { - va_list ap; - va_start(ap, format); - const int count = msvc_pre1900_c99_vsnprintf(outBuf, size, format, ap); - va_end(ap); - return count; -} -#endif - -// Disable warning C4702 : unreachable code -#if defined(_MSC_VER) -#pragma warning(disable : 4702) -#endif - -#define JSON_ASSERT_UNREACHABLE assert(false) - -namespace Json { -template -static std::unique_ptr cloneUnique(const std::unique_ptr& p) { - std::unique_ptr r; - if (p) { - r = std::unique_ptr(new T(*p)); - } - return r; -} - -// This is a walkaround to avoid the static initialization of Value::null. -// kNull must be word-aligned to avoid crashing on ARM. We use an alignment of -// 8 (instead of 4) as a bit of future-proofing. -#if defined(__ARMEL__) -#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) -#else -#define ALIGNAS(byte_alignment) -#endif - -// static -Value const& Value::nullSingleton() { - static Value const nullStatic; - return nullStatic; -} - -#if JSON_USE_NULLREF -// for backwards compatibility, we'll leave these global references around, but -// DO NOT use them in JSONCPP library code any more! -// static -Value const& Value::null = Value::nullSingleton(); - -// static -Value const& Value::nullRef = Value::nullSingleton(); -#endif - -#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) -template -static inline bool InRange(double d, T min, U max) { - // The casts can lose precision, but we are looking only for - // an approximate range. Might fail on edge cases though. ~cdunn - return d >= static_cast(min) && d <= static_cast(max); -} -#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) -static inline double integerToDouble(Json::UInt64 value) { - return static_cast(Int64(value / 2)) * 2.0 + - static_cast(Int64(value & 1)); -} - -template static inline double integerToDouble(T value) { - return static_cast(value); -} - -template -static inline bool InRange(double d, T min, U max) { - return d >= integerToDouble(min) && d <= integerToDouble(max); -} -#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - -/** Duplicates the specified string value. - * @param value Pointer to the string to duplicate. Must be zero-terminated if - * length is "unknown". - * @param length Length of the value. if equals to unknown, then it will be - * computed using strlen(value). - * @return Pointer on the duplicate instance of string. - */ -static inline char* duplicateStringValue(const char* value, size_t length) { - // Avoid an integer overflow in the call to malloc below by limiting length - // to a sane value. - if (length >= static_cast(Value::maxInt)) - length = Value::maxInt - 1; - - auto newString = static_cast(malloc(length + 1)); - if (newString == nullptr) { - throwRuntimeError("in Json::Value::duplicateStringValue(): " - "Failed to allocate string value buffer"); - } - memcpy(newString, value, length); - newString[length] = 0; - return newString; -} - -/* Record the length as a prefix. - */ -static inline char* duplicateAndPrefixStringValue(const char* value, - unsigned int length) { - // Avoid an integer overflow in the call to malloc below by limiting length - // to a sane value. - JSON_ASSERT_MESSAGE(length <= static_cast(Value::maxInt) - - sizeof(unsigned) - 1U, - "in Json::Value::duplicateAndPrefixStringValue(): " - "length too big for prefixing"); - size_t actualLength = sizeof(length) + length + 1; - auto newString = static_cast(malloc(actualLength)); - if (newString == nullptr) { - throwRuntimeError("in Json::Value::duplicateAndPrefixStringValue(): " - "Failed to allocate string value buffer"); - } - *reinterpret_cast(newString) = length; - memcpy(newString + sizeof(unsigned), value, length); - newString[actualLength - 1U] = - 0; // to avoid buffer over-run accidents by users later - return newString; -} -inline static void decodePrefixedString(bool isPrefixed, char const* prefixed, - unsigned* length, char const** value) { - if (!isPrefixed) { - *length = static_cast(strlen(prefixed)); - *value = prefixed; - } else { - *length = *reinterpret_cast(prefixed); - *value = prefixed + sizeof(unsigned); - } -} -/** Free the string duplicated by - * duplicateStringValue()/duplicateAndPrefixStringValue(). - */ -#if JSONCPP_USING_SECURE_MEMORY -static inline void releasePrefixedStringValue(char* value) { - unsigned length = 0; - char const* valueDecoded; - decodePrefixedString(true, value, &length, &valueDecoded); - size_t const size = sizeof(unsigned) + length + 1U; - memset(value, 0, size); - free(value); -} -static inline void releaseStringValue(char* value, unsigned length) { - // length==0 => we allocated the strings memory - size_t size = (length == 0) ? strlen(value) : length; - memset(value, 0, size); - free(value); -} -#else // !JSONCPP_USING_SECURE_MEMORY -static inline void releasePrefixedStringValue(char* value) { free(value); } -static inline void releaseStringValue(char* value, unsigned) { free(value); } -#endif // JSONCPP_USING_SECURE_MEMORY - -} // namespace Json - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ValueInternals... -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -#if !defined(JSON_IS_AMALGAMATION) - -#include "json_valueiterator.inl" -#endif // if !defined(JSON_IS_AMALGAMATION) - -namespace Json { - -#if JSON_USE_EXCEPTION -Exception::Exception(String msg) : msg_(std::move(msg)) {} -Exception::~Exception() noexcept = default; -char const* Exception::what() const noexcept { return msg_.c_str(); } -RuntimeError::RuntimeError(String const& msg) : Exception(msg) {} -LogicError::LogicError(String const& msg) : Exception(msg) {} -JSONCPP_NORETURN void throwRuntimeError(String const& msg) { - throw RuntimeError(msg); -} -JSONCPP_NORETURN void throwLogicError(String const& msg) { - throw LogicError(msg); -} -#else // !JSON_USE_EXCEPTION -JSONCPP_NORETURN void throwRuntimeError(String const& msg) { - std::cerr << msg << std::endl; - abort(); -} -JSONCPP_NORETURN void throwLogicError(String const& msg) { - std::cerr << msg << std::endl; - abort(); -} -#endif - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::CZString -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -// Notes: policy_ indicates if the string was allocated when -// a string is stored. - -Value::CZString::CZString(ArrayIndex index) : cstr_(nullptr), index_(index) {} - -Value::CZString::CZString(char const* str, unsigned length, - DuplicationPolicy allocate) - : cstr_(str) { - // allocate != duplicate - storage_.policy_ = allocate & 0x3; - storage_.length_ = length & 0x3FFFFFFF; -} - -Value::CZString::CZString(const CZString& other) { - cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != nullptr - ? duplicateStringValue(other.cstr_, other.storage_.length_) - : other.cstr_); - storage_.policy_ = - static_cast( - other.cstr_ - ? (static_cast(other.storage_.policy_) == - noDuplication - ? noDuplication - : duplicate) - : static_cast(other.storage_.policy_)) & - 3U; - storage_.length_ = other.storage_.length_; -} - -Value::CZString::CZString(CZString&& other) noexcept - : cstr_(other.cstr_), index_(other.index_) { - other.cstr_ = nullptr; -} - -Value::CZString::~CZString() { - if (cstr_ && storage_.policy_ == duplicate) { - releaseStringValue(const_cast(cstr_), - storage_.length_ + 1U); // +1 for null terminating - // character for sake of - // completeness but not actually - // necessary - } -} - -void Value::CZString::swap(CZString& other) { - std::swap(cstr_, other.cstr_); - std::swap(index_, other.index_); -} - -Value::CZString& Value::CZString::operator=(const CZString& other) { - cstr_ = other.cstr_; - index_ = other.index_; - return *this; -} - -Value::CZString& Value::CZString::operator=(CZString&& other) noexcept { - cstr_ = other.cstr_; - index_ = other.index_; - other.cstr_ = nullptr; - return *this; -} - -bool Value::CZString::operator<(const CZString& other) const { - if (!cstr_) - return index_ < other.index_; - // return strcmp(cstr_, other.cstr_) < 0; - // Assume both are strings. - unsigned this_len = this->storage_.length_; - unsigned other_len = other.storage_.length_; - unsigned min_len = std::min(this_len, other_len); - JSON_ASSERT(this->cstr_ && other.cstr_); - int comp = memcmp(this->cstr_, other.cstr_, min_len); - if (comp < 0) - return true; - if (comp > 0) - return false; - return (this_len < other_len); -} - -bool Value::CZString::operator==(const CZString& other) const { - if (!cstr_) - return index_ == other.index_; - // return strcmp(cstr_, other.cstr_) == 0; - // Assume both are strings. - unsigned this_len = this->storage_.length_; - unsigned other_len = other.storage_.length_; - if (this_len != other_len) - return false; - JSON_ASSERT(this->cstr_ && other.cstr_); - int comp = memcmp(this->cstr_, other.cstr_, this_len); - return comp == 0; -} - -ArrayIndex Value::CZString::index() const { return index_; } - -// const char* Value::CZString::c_str() const { return cstr_; } -const char* Value::CZString::data() const { return cstr_; } -unsigned Value::CZString::length() const { return storage_.length_; } -bool Value::CZString::isStaticString() const { - return storage_.policy_ == noDuplication; -} - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::Value -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -/*! \internal Default constructor initialization must be equivalent to: - * memset( this, 0, sizeof(Value) ) - * This optimization is used in ValueInternalMap fast allocator. - */ -Value::Value(ValueType type) { - static char const emptyString[] = ""; - initBasic(type); - switch (type) { - case nullValue: - break; - case intValue: - case uintValue: - value_.int_ = 0; - break; - case realValue: - value_.real_ = 0.0; - break; - case stringValue: - // allocated_ == false, so this is safe. - value_.string_ = const_cast(static_cast(emptyString)); - break; - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues(); - break; - case booleanValue: - value_.bool_ = false; - break; - default: - JSON_ASSERT_UNREACHABLE; - } -} - -Value::Value(Int value) { - initBasic(intValue); - value_.int_ = value; -} - -Value::Value(UInt value) { - initBasic(uintValue); - value_.uint_ = value; -} -#if defined(JSON_HAS_INT64) -Value::Value(Int64 value) { - initBasic(intValue); - value_.int_ = value; -} -Value::Value(UInt64 value) { - initBasic(uintValue); - value_.uint_ = value; -} -#endif // defined(JSON_HAS_INT64) - -Value::Value(double value) { - initBasic(realValue); - value_.real_ = value; -} - -Value::Value(const char* value) { - initBasic(stringValue, true); - JSON_ASSERT_MESSAGE(value != nullptr, - "Null Value Passed to Value Constructor"); - value_.string_ = duplicateAndPrefixStringValue( - value, static_cast(strlen(value))); -} - -Value::Value(const char* begin, const char* end) { - initBasic(stringValue, true); - value_.string_ = - duplicateAndPrefixStringValue(begin, static_cast(end - begin)); -} - -Value::Value(const String& value) { - initBasic(stringValue, true); - value_.string_ = duplicateAndPrefixStringValue( - value.data(), static_cast(value.length())); -} - -Value::Value(const StaticString& value) { - initBasic(stringValue); - value_.string_ = const_cast(value.c_str()); -} - -Value::Value(bool value) { - initBasic(booleanValue); - value_.bool_ = value; -} - -Value::Value(const Value& other) { - dupPayload(other); - dupMeta(other); -} - -Value::Value(Value&& other) noexcept { - initBasic(nullValue); - swap(other); -} - -Value::~Value() { - releasePayload(); - value_.uint_ = 0; -} - -Value& Value::operator=(const Value& other) { - Value(other).swap(*this); - return *this; -} - -Value& Value::operator=(Value&& other) noexcept { - other.swap(*this); - return *this; -} - -void Value::swapPayload(Value& other) { - std::swap(bits_, other.bits_); - std::swap(value_, other.value_); -} - -void Value::copyPayload(const Value& other) { - releasePayload(); - dupPayload(other); -} - -void Value::swap(Value& other) { - swapPayload(other); - std::swap(comments_, other.comments_); - std::swap(start_, other.start_); - std::swap(limit_, other.limit_); -} - -void Value::copy(const Value& other) { - copyPayload(other); - dupMeta(other); -} - -ValueType Value::type() const { - return static_cast(bits_.value_type_); -} - -int Value::compare(const Value& other) const { - if (*this < other) - return -1; - if (*this > other) - return 1; - return 0; -} - -bool Value::operator<(const Value& other) const { - int typeDelta = type() - other.type(); - if (typeDelta) - return typeDelta < 0; - switch (type()) { - case nullValue: - return false; - case intValue: - return value_.int_ < other.value_.int_; - case uintValue: - return value_.uint_ < other.value_.uint_; - case realValue: - return value_.real_ < other.value_.real_; - case booleanValue: - return value_.bool_ < other.value_.bool_; - case stringValue: { - if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { - return other.value_.string_ != nullptr; - } - unsigned this_len; - unsigned other_len; - char const* this_str; - char const* other_str; - decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, - &this_str); - decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, - &other_str); - unsigned min_len = std::min(this_len, other_len); - JSON_ASSERT(this_str && other_str); - int comp = memcmp(this_str, other_str, min_len); - if (comp < 0) - return true; - if (comp > 0) - return false; - return (this_len < other_len); - } - case arrayValue: - case objectValue: { - auto thisSize = value_.map_->size(); - auto otherSize = other.value_.map_->size(); - if (thisSize != otherSize) - return thisSize < otherSize; - return (*value_.map_) < (*other.value_.map_); - } - default: - JSON_ASSERT_UNREACHABLE; - } - return false; // unreachable -} - -bool Value::operator<=(const Value& other) const { return !(other < *this); } - -bool Value::operator>=(const Value& other) const { return !(*this < other); } - -bool Value::operator>(const Value& other) const { return other < *this; } - -bool Value::operator==(const Value& other) const { - if (type() != other.type()) - return false; - switch (type()) { - case nullValue: - return true; - case intValue: - return value_.int_ == other.value_.int_; - case uintValue: - return value_.uint_ == other.value_.uint_; - case realValue: - return value_.real_ == other.value_.real_; - case booleanValue: - return value_.bool_ == other.value_.bool_; - case stringValue: { - if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { - return (value_.string_ == other.value_.string_); - } - unsigned this_len; - unsigned other_len; - char const* this_str; - char const* other_str; - decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, - &this_str); - decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, - &other_str); - if (this_len != other_len) - return false; - JSON_ASSERT(this_str && other_str); - int comp = memcmp(this_str, other_str, this_len); - return comp == 0; - } - case arrayValue: - case objectValue: - return value_.map_->size() == other.value_.map_->size() && - (*value_.map_) == (*other.value_.map_); - default: - JSON_ASSERT_UNREACHABLE; - } - return false; // unreachable -} - -bool Value::operator!=(const Value& other) const { return !(*this == other); } - -const char* Value::asCString() const { - JSON_ASSERT_MESSAGE(type() == stringValue, - "in Json::Value::asCString(): requires stringValue"); - if (value_.string_ == nullptr) - return nullptr; - unsigned this_len; - char const* this_str; - decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, - &this_str); - return this_str; -} - -#if JSONCPP_USING_SECURE_MEMORY -unsigned Value::getCStringLength() const { - JSON_ASSERT_MESSAGE(type() == stringValue, - "in Json::Value::asCString(): requires stringValue"); - if (value_.string_ == 0) - return 0; - unsigned this_len; - char const* this_str; - decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, - &this_str); - return this_len; -} -#endif - -bool Value::getString(char const** begin, char const** end) const { - if (type() != stringValue) - return false; - if (value_.string_ == nullptr) - return false; - unsigned length; - decodePrefixedString(this->isAllocated(), this->value_.string_, &length, - begin); - *end = *begin + length; - return true; -} - -String Value::asString() const { - switch (type()) { - case nullValue: - return ""; - case stringValue: { - if (value_.string_ == nullptr) - return ""; - unsigned this_len; - char const* this_str; - decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, - &this_str); - return String(this_str, this_len); - } - case booleanValue: - return value_.bool_ ? "true" : "false"; - case intValue: - return valueToString(value_.int_); - case uintValue: - return valueToString(value_.uint_); - case realValue: - return valueToString(value_.real_); - default: - JSON_FAIL_MESSAGE("Type is not convertible to string"); - } -} - -Value::Int Value::asInt() const { - switch (type()) { - case intValue: - JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range"); - return Int(value_.int_); - case uintValue: - JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range"); - return Int(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt), - "double out of Int range"); - return Int(value_.real_); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to Int."); -} - -Value::UInt Value::asUInt() const { - switch (type()) { - case intValue: - JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range"); - return UInt(value_.int_); - case uintValue: - JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range"); - return UInt(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt), - "double out of UInt range"); - return UInt(value_.real_); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to UInt."); -} - -#if defined(JSON_HAS_INT64) - -Value::Int64 Value::asInt64() const { - switch (type()) { - case intValue: - return Int64(value_.int_); - case uintValue: - JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range"); - return Int64(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64), - "double out of Int64 range"); - return Int64(value_.real_); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to Int64."); -} - -Value::UInt64 Value::asUInt64() const { - switch (type()) { - case intValue: - JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range"); - return UInt64(value_.int_); - case uintValue: - return UInt64(value_.uint_); - case realValue: - JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64), - "double out of UInt64 range"); - return UInt64(value_.real_); - case nullValue: - return 0; - case booleanValue: - return value_.bool_ ? 1 : 0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to UInt64."); -} -#endif // if defined(JSON_HAS_INT64) - -LargestInt Value::asLargestInt() const { -#if defined(JSON_NO_INT64) - return asInt(); -#else - return asInt64(); -#endif -} - -LargestUInt Value::asLargestUInt() const { -#if defined(JSON_NO_INT64) - return asUInt(); -#else - return asUInt64(); -#endif -} - -double Value::asDouble() const { - switch (type()) { - case intValue: - return static_cast(value_.int_); - case uintValue: -#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - return static_cast(value_.uint_); -#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - return integerToDouble(value_.uint_); -#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - case realValue: - return value_.real_; - case nullValue: - return 0.0; - case booleanValue: - return value_.bool_ ? 1.0 : 0.0; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to double."); -} - -float Value::asFloat() const { - switch (type()) { - case intValue: - return static_cast(value_.int_); - case uintValue: -#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - return static_cast(value_.uint_); -#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - // This can fail (silently?) if the value is bigger than MAX_FLOAT. - return static_cast(integerToDouble(value_.uint_)); -#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) - case realValue: - return static_cast(value_.real_); - case nullValue: - return 0.0; - case booleanValue: - return value_.bool_ ? 1.0F : 0.0F; - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to float."); -} - -bool Value::asBool() const { - switch (type()) { - case booleanValue: - return value_.bool_; - case nullValue: - return false; - case intValue: - return value_.int_ != 0; - case uintValue: - return value_.uint_ != 0; - case realValue: { - // According to JavaScript language zero or NaN is regarded as false - const auto value_classification = std::fpclassify(value_.real_); - return value_classification != FP_ZERO && value_classification != FP_NAN; - } - default: - break; - } - JSON_FAIL_MESSAGE("Value is not convertible to bool."); -} - -bool Value::isConvertibleTo(ValueType other) const { - switch (other) { - case nullValue: - return (isNumeric() && asDouble() == 0.0) || - (type() == booleanValue && !value_.bool_) || - (type() == stringValue && asString().empty()) || - (type() == arrayValue && value_.map_->empty()) || - (type() == objectValue && value_.map_->empty()) || - type() == nullValue; - case intValue: - return isInt() || - (type() == realValue && InRange(value_.real_, minInt, maxInt)) || - type() == booleanValue || type() == nullValue; - case uintValue: - return isUInt() || - (type() == realValue && InRange(value_.real_, 0, maxUInt)) || - type() == booleanValue || type() == nullValue; - case realValue: - return isNumeric() || type() == booleanValue || type() == nullValue; - case booleanValue: - return isNumeric() || type() == booleanValue || type() == nullValue; - case stringValue: - return isNumeric() || type() == booleanValue || type() == stringValue || - type() == nullValue; - case arrayValue: - return type() == arrayValue || type() == nullValue; - case objectValue: - return type() == objectValue || type() == nullValue; - } - JSON_ASSERT_UNREACHABLE; - return false; -} - -/// Number of values in array or object -ArrayIndex Value::size() const { - switch (type()) { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - case stringValue: - return 0; - case arrayValue: // size of the array is highest index + 1 - if (!value_.map_->empty()) { - ObjectValues::const_iterator itLast = value_.map_->end(); - --itLast; - return (*itLast).first.index() + 1; - } - return 0; - case objectValue: - return ArrayIndex(value_.map_->size()); - } - JSON_ASSERT_UNREACHABLE; - return 0; // unreachable; -} - -bool Value::empty() const { - if (isNull() || isArray() || isObject()) - return size() == 0U; - return false; -} - -Value::operator bool() const { return !isNull(); } - -void Value::clear() { - JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue || - type() == objectValue, - "in Json::Value::clear(): requires complex value"); - start_ = 0; - limit_ = 0; - switch (type()) { - case arrayValue: - case objectValue: - value_.map_->clear(); - break; - default: - break; - } -} - -void Value::resize(ArrayIndex newSize) { - JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, - "in Json::Value::resize(): requires arrayValue"); - if (type() == nullValue) - *this = Value(arrayValue); - ArrayIndex oldSize = size(); - if (newSize == 0) - clear(); - else if (newSize > oldSize) - for (ArrayIndex i = oldSize; i < newSize; ++i) - (*this)[i]; - else { - for (ArrayIndex index = newSize; index < oldSize; ++index) { - value_.map_->erase(index); - } - JSON_ASSERT(size() == newSize); - } -} - -Value& Value::operator[](ArrayIndex index) { - JSON_ASSERT_MESSAGE( - type() == nullValue || type() == arrayValue, - "in Json::Value::operator[](ArrayIndex): requires arrayValue"); - if (type() == nullValue) - *this = Value(arrayValue); - CZString key(index); - auto it = value_.map_->lower_bound(key); - if (it != value_.map_->end() && (*it).first == key) - return (*it).second; - - ObjectValues::value_type defaultValue(key, nullSingleton()); - it = value_.map_->insert(it, defaultValue); - return (*it).second; -} - -Value& Value::operator[](int index) { - JSON_ASSERT_MESSAGE( - index >= 0, - "in Json::Value::operator[](int index): index cannot be negative"); - return (*this)[ArrayIndex(index)]; -} - -const Value& Value::operator[](ArrayIndex index) const { - JSON_ASSERT_MESSAGE( - type() == nullValue || type() == arrayValue, - "in Json::Value::operator[](ArrayIndex)const: requires arrayValue"); - if (type() == nullValue) - return nullSingleton(); - CZString key(index); - ObjectValues::const_iterator it = value_.map_->find(key); - if (it == value_.map_->end()) - return nullSingleton(); - return (*it).second; -} - -const Value& Value::operator[](int index) const { - JSON_ASSERT_MESSAGE( - index >= 0, - "in Json::Value::operator[](int index) const: index cannot be negative"); - return (*this)[ArrayIndex(index)]; -} - -void Value::initBasic(ValueType type, bool allocated) { - setType(type); - setIsAllocated(allocated); - comments_ = Comments{}; - start_ = 0; - limit_ = 0; -} - -void Value::dupPayload(const Value& other) { - setType(other.type()); - setIsAllocated(false); - switch (type()) { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - value_ = other.value_; - break; - case stringValue: - if (other.value_.string_ && other.isAllocated()) { - unsigned len; - char const* str; - decodePrefixedString(other.isAllocated(), other.value_.string_, &len, - &str); - value_.string_ = duplicateAndPrefixStringValue(str, len); - setIsAllocated(true); - } else { - value_.string_ = other.value_.string_; - } - break; - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues(*other.value_.map_); - break; - default: - JSON_ASSERT_UNREACHABLE; - } -} - -void Value::releasePayload() { - switch (type()) { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - break; - case stringValue: - if (isAllocated()) - releasePrefixedStringValue(value_.string_); - break; - case arrayValue: - case objectValue: - delete value_.map_; - break; - default: - JSON_ASSERT_UNREACHABLE; - } -} - -void Value::dupMeta(const Value& other) { - comments_ = other.comments_; - start_ = other.start_; - limit_ = other.limit_; -} - -// Access an object value by name, create a null member if it does not exist. -// @pre Type of '*this' is object or null. -// @param key is null-terminated. -Value& Value::resolveReference(const char* key) { - JSON_ASSERT_MESSAGE( - type() == nullValue || type() == objectValue, - "in Json::Value::resolveReference(): requires objectValue"); - if (type() == nullValue) - *this = Value(objectValue); - CZString actualKey(key, static_cast(strlen(key)), - CZString::noDuplication); // NOTE! - auto it = value_.map_->lower_bound(actualKey); - if (it != value_.map_->end() && (*it).first == actualKey) - return (*it).second; - - ObjectValues::value_type defaultValue(actualKey, nullSingleton()); - it = value_.map_->insert(it, defaultValue); - Value& value = (*it).second; - return value; -} - -// @param key is not null-terminated. -Value& Value::resolveReference(char const* key, char const* end) { - JSON_ASSERT_MESSAGE( - type() == nullValue || type() == objectValue, - "in Json::Value::resolveReference(key, end): requires objectValue"); - if (type() == nullValue) - *this = Value(objectValue); - CZString actualKey(key, static_cast(end - key), - CZString::duplicateOnCopy); - auto it = value_.map_->lower_bound(actualKey); - if (it != value_.map_->end() && (*it).first == actualKey) - return (*it).second; - - ObjectValues::value_type defaultValue(actualKey, nullSingleton()); - it = value_.map_->insert(it, defaultValue); - Value& value = (*it).second; - return value; -} - -Value Value::get(ArrayIndex index, const Value& defaultValue) const { - const Value* value = &((*this)[index]); - return value == &nullSingleton() ? defaultValue : *value; -} - -bool Value::isValidIndex(ArrayIndex index) const { return index < size(); } - -Value const* Value::find(char const* begin, char const* end) const { - JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, - "in Json::Value::find(begin, end): requires " - "objectValue or nullValue"); - if (type() == nullValue) - return nullptr; - CZString actualKey(begin, static_cast(end - begin), - CZString::noDuplication); - ObjectValues::const_iterator it = value_.map_->find(actualKey); - if (it == value_.map_->end()) - return nullptr; - return &(*it).second; -} -Value* Value::demand(char const* begin, char const* end) { - JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, - "in Json::Value::demand(begin, end): requires " - "objectValue or nullValue"); - return &resolveReference(begin, end); -} -const Value& Value::operator[](const char* key) const { - Value const* found = find(key, key + strlen(key)); - if (!found) - return nullSingleton(); - return *found; -} -Value const& Value::operator[](const String& key) const { - Value const* found = find(key.data(), key.data() + key.length()); - if (!found) - return nullSingleton(); - return *found; -} - -Value& Value::operator[](const char* key) { - return resolveReference(key, key + strlen(key)); -} - -Value& Value::operator[](const String& key) { - return resolveReference(key.data(), key.data() + key.length()); -} - -Value& Value::operator[](const StaticString& key) { - return resolveReference(key.c_str()); -} - -Value& Value::append(const Value& value) { return append(Value(value)); } - -Value& Value::append(Value&& value) { - JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, - "in Json::Value::append: requires arrayValue"); - if (type() == nullValue) { - *this = Value(arrayValue); - } - return this->value_.map_->emplace(size(), std::move(value)).first->second; -} - -bool Value::insert(ArrayIndex index, const Value& newValue) { - return insert(index, Value(newValue)); -} - -bool Value::insert(ArrayIndex index, Value&& newValue) { - JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, - "in Json::Value::insert: requires arrayValue"); - ArrayIndex length = size(); - if (index > length) { - return false; - } - for (ArrayIndex i = length; i > index; i--) { - (*this)[i] = std::move((*this)[i - 1]); - } - (*this)[index] = std::move(newValue); - return true; -} - -Value Value::get(char const* begin, char const* end, - Value const& defaultValue) const { - Value const* found = find(begin, end); - return !found ? defaultValue : *found; -} -Value Value::get(char const* key, Value const& defaultValue) const { - return get(key, key + strlen(key), defaultValue); -} -Value Value::get(String const& key, Value const& defaultValue) const { - return get(key.data(), key.data() + key.length(), defaultValue); -} - -bool Value::removeMember(const char* begin, const char* end, Value* removed) { - if (type() != objectValue) { - return false; - } - CZString actualKey(begin, static_cast(end - begin), - CZString::noDuplication); - auto it = value_.map_->find(actualKey); - if (it == value_.map_->end()) - return false; - if (removed) - *removed = std::move(it->second); - value_.map_->erase(it); - return true; -} -bool Value::removeMember(const char* key, Value* removed) { - return removeMember(key, key + strlen(key), removed); -} -bool Value::removeMember(String const& key, Value* removed) { - return removeMember(key.data(), key.data() + key.length(), removed); -} -void Value::removeMember(const char* key) { - JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, - "in Json::Value::removeMember(): requires objectValue"); - if (type() == nullValue) - return; - - CZString actualKey(key, unsigned(strlen(key)), CZString::noDuplication); - value_.map_->erase(actualKey); -} -void Value::removeMember(const String& key) { removeMember(key.c_str()); } - -bool Value::removeIndex(ArrayIndex index, Value* removed) { - if (type() != arrayValue) { - return false; - } - CZString key(index); - auto it = value_.map_->find(key); - if (it == value_.map_->end()) { - return false; - } - if (removed) - *removed = it->second; - ArrayIndex oldSize = size(); - // shift left all items left, into the place of the "removed" - for (ArrayIndex i = index; i < (oldSize - 1); ++i) { - CZString keey(i); - (*value_.map_)[keey] = (*this)[i + 1]; - } - // erase the last one ("leftover") - CZString keyLast(oldSize - 1); - auto itLast = value_.map_->find(keyLast); - value_.map_->erase(itLast); - return true; -} - -bool Value::isMember(char const* begin, char const* end) const { - Value const* value = find(begin, end); - return nullptr != value; -} -bool Value::isMember(char const* key) const { - return isMember(key, key + strlen(key)); -} -bool Value::isMember(String const& key) const { - return isMember(key.data(), key.data() + key.length()); -} - -Value::Members Value::getMemberNames() const { - JSON_ASSERT_MESSAGE( - type() == nullValue || type() == objectValue, - "in Json::Value::getMemberNames(), value must be objectValue"); - if (type() == nullValue) - return Value::Members(); - Members members; - members.reserve(value_.map_->size()); - ObjectValues::const_iterator it = value_.map_->begin(); - ObjectValues::const_iterator itEnd = value_.map_->end(); - for (; it != itEnd; ++it) { - members.push_back(String((*it).first.data(), (*it).first.length())); - } - return members; -} - -static bool IsIntegral(double d) { - double integral_part; - return modf(d, &integral_part) == 0.0; -} - -bool Value::isNull() const { return type() == nullValue; } - -bool Value::isBool() const { return type() == booleanValue; } - -bool Value::isInt() const { - switch (type()) { - case intValue: -#if defined(JSON_HAS_INT64) - return value_.int_ >= minInt && value_.int_ <= maxInt; -#else - return true; -#endif - case uintValue: - return value_.uint_ <= UInt(maxInt); - case realValue: - return value_.real_ >= minInt && value_.real_ <= maxInt && - IsIntegral(value_.real_); - default: - break; - } - return false; -} - -bool Value::isUInt() const { - switch (type()) { - case intValue: -#if defined(JSON_HAS_INT64) - return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt); -#else - return value_.int_ >= 0; -#endif - case uintValue: -#if defined(JSON_HAS_INT64) - return value_.uint_ <= maxUInt; -#else - return true; -#endif - case realValue: - return value_.real_ >= 0 && value_.real_ <= maxUInt && - IsIntegral(value_.real_); - default: - break; - } - return false; -} - -bool Value::isInt64() const { -#if defined(JSON_HAS_INT64) - switch (type()) { - case intValue: - return true; - case uintValue: - return value_.uint_ <= UInt64(maxInt64); - case realValue: - // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a - // double, so double(maxInt64) will be rounded up to 2^63. Therefore we - // require the value to be strictly less than the limit. - return value_.real_ >= double(minInt64) && - value_.real_ < double(maxInt64) && IsIntegral(value_.real_); - default: - break; - } -#endif // JSON_HAS_INT64 - return false; -} - -bool Value::isUInt64() const { -#if defined(JSON_HAS_INT64) - switch (type()) { - case intValue: - return value_.int_ >= 0; - case uintValue: - return true; - case realValue: - // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a - // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we - // require the value to be strictly less than the limit. - return value_.real_ >= 0 && value_.real_ < maxUInt64AsDouble && - IsIntegral(value_.real_); - default: - break; - } -#endif // JSON_HAS_INT64 - return false; -} - -bool Value::isIntegral() const { - switch (type()) { - case intValue: - case uintValue: - return true; - case realValue: -#if defined(JSON_HAS_INT64) - // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a - // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we - // require the value to be strictly less than the limit. - return value_.real_ >= double(minInt64) && - value_.real_ < maxUInt64AsDouble && IsIntegral(value_.real_); -#else - return value_.real_ >= minInt && value_.real_ <= maxUInt && - IsIntegral(value_.real_); -#endif // JSON_HAS_INT64 - default: - break; - } - return false; -} - -bool Value::isDouble() const { - return type() == intValue || type() == uintValue || type() == realValue; -} - -bool Value::isNumeric() const { return isDouble(); } - -bool Value::isString() const { return type() == stringValue; } - -bool Value::isArray() const { return type() == arrayValue; } - -bool Value::isObject() const { return type() == objectValue; } - -Value::Comments::Comments(const Comments& that) - : ptr_{cloneUnique(that.ptr_)} {} - -Value::Comments::Comments(Comments&& that) noexcept - : ptr_{std::move(that.ptr_)} {} - -Value::Comments& Value::Comments::operator=(const Comments& that) { - ptr_ = cloneUnique(that.ptr_); - return *this; -} - -Value::Comments& Value::Comments::operator=(Comments&& that) noexcept { - ptr_ = std::move(that.ptr_); - return *this; -} - -bool Value::Comments::has(CommentPlacement slot) const { - return ptr_ && !(*ptr_)[slot].empty(); -} - -String Value::Comments::get(CommentPlacement slot) const { - if (!ptr_) - return {}; - return (*ptr_)[slot]; -} - -void Value::Comments::set(CommentPlacement slot, String comment) { - if (slot >= CommentPlacement::numberOfCommentPlacement) - return; - if (!ptr_) - ptr_ = std::unique_ptr(new Array()); - (*ptr_)[slot] = std::move(comment); -} - -void Value::setComment(String comment, CommentPlacement placement) { - if (!comment.empty() && (comment.back() == '\n')) { - // Always discard trailing newline, to aid indentation. - comment.pop_back(); - } - JSON_ASSERT(!comment.empty()); - JSON_ASSERT_MESSAGE( - comment[0] == '\0' || comment[0] == '/', - "in Json::Value::setComment(): Comments must start with /"); - comments_.set(placement, std::move(comment)); -} - -bool Value::hasComment(CommentPlacement placement) const { - return comments_.has(placement); -} - -String Value::getComment(CommentPlacement placement) const { - return comments_.get(placement); -} - -void Value::setOffsetStart(ptrdiff_t start) { start_ = start; } - -void Value::setOffsetLimit(ptrdiff_t limit) { limit_ = limit; } - -ptrdiff_t Value::getOffsetStart() const { return start_; } - -ptrdiff_t Value::getOffsetLimit() const { return limit_; } - -String Value::toStyledString() const { - StreamWriterBuilder builder; - - String out = this->hasComment(commentBefore) ? "\n" : ""; - out += Json::writeString(builder, *this); - out += '\n'; - - return out; -} - -Value::const_iterator Value::begin() const { - switch (type()) { - case arrayValue: - case objectValue: - if (value_.map_) - return const_iterator(value_.map_->begin()); - break; - default: - break; - } - return {}; -} - -Value::const_iterator Value::end() const { - switch (type()) { - case arrayValue: - case objectValue: - if (value_.map_) - return const_iterator(value_.map_->end()); - break; - default: - break; - } - return {}; -} - -Value::iterator Value::begin() { - switch (type()) { - case arrayValue: - case objectValue: - if (value_.map_) - return iterator(value_.map_->begin()); - break; - default: - break; - } - return iterator(); -} - -Value::iterator Value::end() { - switch (type()) { - case arrayValue: - case objectValue: - if (value_.map_) - return iterator(value_.map_->end()); - break; - default: - break; - } - return iterator(); -} - -// class PathArgument -// ////////////////////////////////////////////////////////////////// - -PathArgument::PathArgument() = default; - -PathArgument::PathArgument(ArrayIndex index) - : index_(index), kind_(kindIndex) {} - -PathArgument::PathArgument(const char* key) : key_(key), kind_(kindKey) {} - -PathArgument::PathArgument(String key) : key_(std::move(key)), kind_(kindKey) {} - -// class Path -// ////////////////////////////////////////////////////////////////// - -Path::Path(const String& path, const PathArgument& a1, const PathArgument& a2, - const PathArgument& a3, const PathArgument& a4, - const PathArgument& a5) { - InArgs in; - in.reserve(5); - in.push_back(&a1); - in.push_back(&a2); - in.push_back(&a3); - in.push_back(&a4); - in.push_back(&a5); - makePath(path, in); -} - -void Path::makePath(const String& path, const InArgs& in) { - const char* current = path.c_str(); - const char* end = current + path.length(); - auto itInArg = in.begin(); - while (current != end) { - if (*current == '[') { - ++current; - if (*current == '%') - addPathInArg(path, in, itInArg, PathArgument::kindIndex); - else { - ArrayIndex index = 0; - for (; current != end && *current >= '0' && *current <= '9'; ++current) - index = index * 10 + ArrayIndex(*current - '0'); - args_.push_back(index); - } - if (current == end || *++current != ']') - invalidPath(path, int(current - path.c_str())); - } else if (*current == '%') { - addPathInArg(path, in, itInArg, PathArgument::kindKey); - ++current; - } else if (*current == '.' || *current == ']') { - ++current; - } else { - const char* beginName = current; - while (current != end && !strchr("[.", *current)) - ++current; - args_.push_back(String(beginName, current)); - } - } -} - -void Path::addPathInArg(const String& /*path*/, const InArgs& in, - InArgs::const_iterator& itInArg, - PathArgument::Kind kind) { - if (itInArg == in.end()) { - // Error: missing argument %d - } else if ((*itInArg)->kind_ != kind) { - // Error: bad argument type - } else { - args_.push_back(**itInArg++); - } -} - -void Path::invalidPath(const String& /*path*/, int /*location*/) { - // Error: invalid path. -} - -const Value& Path::resolve(const Value& root) const { - const Value* node = &root; - for (const auto& arg : args_) { - if (arg.kind_ == PathArgument::kindIndex) { - if (!node->isArray() || !node->isValidIndex(arg.index_)) { - // Error: unable to resolve path (array value expected at position... ) - return Value::nullSingleton(); - } - node = &((*node)[arg.index_]); - } else if (arg.kind_ == PathArgument::kindKey) { - if (!node->isObject()) { - // Error: unable to resolve path (object value expected at position...) - return Value::nullSingleton(); - } - node = &((*node)[arg.key_]); - if (node == &Value::nullSingleton()) { - // Error: unable to resolve path (object has no member named '' at - // position...) - return Value::nullSingleton(); - } - } - } - return *node; -} - -Value Path::resolve(const Value& root, const Value& defaultValue) const { - const Value* node = &root; - for (const auto& arg : args_) { - if (arg.kind_ == PathArgument::kindIndex) { - if (!node->isArray() || !node->isValidIndex(arg.index_)) - return defaultValue; - node = &((*node)[arg.index_]); - } else if (arg.kind_ == PathArgument::kindKey) { - if (!node->isObject()) - return defaultValue; - node = &((*node)[arg.key_]); - if (node == &Value::nullSingleton()) - return defaultValue; - } - } - return *node; -} - -Value& Path::make(Value& root) const { - Value* node = &root; - for (const auto& arg : args_) { - if (arg.kind_ == PathArgument::kindIndex) { - if (!node->isArray()) { - // Error: node is not an array at position ... - } - node = &((*node)[arg.index_]); - } else if (arg.kind_ == PathArgument::kindKey) { - if (!node->isObject()) { - // Error: node is not an object at position... - } - node = &((*node)[arg.key_]); - } - } - return *node; -} - -} // namespace Json diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_valueiterator.inl b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_valueiterator.inl deleted file mode 100644 index d6128b8..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_valueiterator.inl +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -// included by json_value.cpp - -namespace Json { - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueIteratorBase -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueIteratorBase::ValueIteratorBase() : current_() {} - -ValueIteratorBase::ValueIteratorBase( - const Value::ObjectValues::iterator& current) - : current_(current), isNull_(false) {} - -Value& ValueIteratorBase::deref() { return current_->second; } -const Value& ValueIteratorBase::deref() const { return current_->second; } - -void ValueIteratorBase::increment() { ++current_; } - -void ValueIteratorBase::decrement() { --current_; } - -ValueIteratorBase::difference_type -ValueIteratorBase::computeDistance(const SelfType& other) const { - // Iterator for null value are initialized using the default - // constructor, which initialize current_ to the default - // std::map::iterator. As begin() and end() are two instance - // of the default std::map::iterator, they can not be compared. - // To allow this, we handle this comparison specifically. - if (isNull_ && other.isNull_) { - return 0; - } - - // Usage of std::distance is not portable (does not compile with Sun Studio 12 - // RogueWave STL, - // which is the one used by default). - // Using a portable hand-made version for non random iterator instead: - // return difference_type( std::distance( current_, other.current_ ) ); - difference_type myDistance = 0; - for (Value::ObjectValues::iterator it = current_; it != other.current_; - ++it) { - ++myDistance; - } - return myDistance; -} - -bool ValueIteratorBase::isEqual(const SelfType& other) const { - if (isNull_) { - return other.isNull_; - } - return current_ == other.current_; -} - -void ValueIteratorBase::copy(const SelfType& other) { - current_ = other.current_; - isNull_ = other.isNull_; -} - -Value ValueIteratorBase::key() const { - const Value::CZString czstring = (*current_).first; - if (czstring.data()) { - if (czstring.isStaticString()) - return Value(StaticString(czstring.data())); - return Value(czstring.data(), czstring.data() + czstring.length()); - } - return Value(czstring.index()); -} - -UInt ValueIteratorBase::index() const { - const Value::CZString czstring = (*current_).first; - if (!czstring.data()) - return czstring.index(); - return Value::UInt(-1); -} - -String ValueIteratorBase::name() const { - char const* keey; - char const* end; - keey = memberName(&end); - if (!keey) - return String(); - return String(keey, end); -} - -char const* ValueIteratorBase::memberName() const { - const char* cname = (*current_).first.data(); - return cname ? cname : ""; -} - -char const* ValueIteratorBase::memberName(char const** end) const { - const char* cname = (*current_).first.data(); - if (!cname) { - *end = nullptr; - return nullptr; - } - *end = cname + (*current_).first.length(); - return cname; -} - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueConstIterator -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueConstIterator::ValueConstIterator() = default; - -ValueConstIterator::ValueConstIterator( - const Value::ObjectValues::iterator& current) - : ValueIteratorBase(current) {} - -ValueConstIterator::ValueConstIterator(ValueIterator const& other) - : ValueIteratorBase(other) {} - -ValueConstIterator& ValueConstIterator:: -operator=(const ValueIteratorBase& other) { - copy(other); - return *this; -} - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class ValueIterator -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -ValueIterator::ValueIterator() = default; - -ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) - : ValueIteratorBase(current) {} - -ValueIterator::ValueIterator(const ValueConstIterator& other) - : ValueIteratorBase(other) { - throwRuntimeError("ConstIterator to Iterator should never be allowed."); -} - -ValueIterator::ValueIterator(const ValueIterator& other) = default; - -ValueIterator& ValueIterator::operator=(const SelfType& other) { - copy(other); - return *this; -} - -} // namespace Json diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_writer.cpp b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_writer.cpp deleted file mode 100644 index 855f3a8..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_writer.cpp +++ /dev/null @@ -1,1259 +0,0 @@ -// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors -// Distributed under MIT license, or public domain if desired and -// recognized in your jurisdiction. -// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE - -#if !defined(JSON_IS_AMALGAMATION) -#include "json_tool.h" -#include -#endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if __cplusplus >= 201103L -#include -#include - -#if !defined(isnan) -#define isnan std::isnan -#endif - -#if !defined(isfinite) -#define isfinite std::isfinite -#endif - -#else -#include -#include - -#if defined(_MSC_VER) -#if !defined(isnan) -#include -#define isnan _isnan -#endif - -#if !defined(isfinite) -#include -#define isfinite _finite -#endif - -#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) -#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 -#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES - -#endif //_MSC_VER - -#if defined(__sun) && defined(__SVR4) // Solaris -#if !defined(isfinite) -#include -#define isfinite finite -#endif -#endif - -#if defined(__hpux) -#if !defined(isfinite) -#if defined(__ia64) && !defined(finite) -#define isfinite(x) \ - ((sizeof(x) == sizeof(float) ? _Isfinitef(x) : _IsFinite(x))) -#endif -#endif -#endif - -#if !defined(isnan) -// IEEE standard states that NaN values will not compare to themselves -#define isnan(x) ((x) != (x)) -#endif - -#if !defined(__APPLE__) -#if !defined(isfinite) -#define isfinite finite -#endif -#endif -#endif - -#if defined(_MSC_VER) -// Disable warning about strdup being deprecated. -#pragma warning(disable : 4996) -#endif - -namespace Json { - -#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) -using StreamWriterPtr = std::unique_ptr; -#else -using StreamWriterPtr = std::auto_ptr; -#endif - -String valueToString(LargestInt value) { - UIntToStringBuffer buffer; - char* current = buffer + sizeof(buffer); - if (value == Value::minLargestInt) { - uintToString(LargestUInt(Value::maxLargestInt) + 1, current); - *--current = '-'; - } else if (value < 0) { - uintToString(LargestUInt(-value), current); - *--current = '-'; - } else { - uintToString(LargestUInt(value), current); - } - assert(current >= buffer); - return current; -} - -String valueToString(LargestUInt value) { - UIntToStringBuffer buffer; - char* current = buffer + sizeof(buffer); - uintToString(value, current); - assert(current >= buffer); - return current; -} - -#if defined(JSON_HAS_INT64) - -String valueToString(Int value) { return valueToString(LargestInt(value)); } - -String valueToString(UInt value) { return valueToString(LargestUInt(value)); } - -#endif // # if defined(JSON_HAS_INT64) - -namespace { -String valueToString(double value, bool useSpecialFloats, - unsigned int precision, PrecisionType precisionType) { - // Print into the buffer. We need not request the alternative representation - // that always has a decimal point because JSON doesn't distinguish the - // concepts of reals and integers. - if (!isfinite(value)) { - static const char* const reps[2][3] = {{"NaN", "-Infinity", "Infinity"}, - {"null", "-1e+9999", "1e+9999"}}; - return reps[useSpecialFloats ? 0 : 1] - [isnan(value) ? 0 : (value < 0) ? 1 : 2]; - } - - String buffer(size_t(36), '\0'); - while (true) { - int len = jsoncpp_snprintf( - &*buffer.begin(), buffer.size(), - (precisionType == PrecisionType::significantDigits) ? "%.*g" : "%.*f", - precision, value); - assert(len >= 0); - auto wouldPrint = static_cast(len); - if (wouldPrint >= buffer.size()) { - buffer.resize(wouldPrint + 1); - continue; - } - buffer.resize(wouldPrint); - break; - } - - buffer.erase(fixNumericLocale(buffer.begin(), buffer.end()), buffer.end()); - - // try to ensure we preserve the fact that this was given to us as a double on - // input - if (buffer.find('.') == buffer.npos && buffer.find('e') == buffer.npos) { - buffer += ".0"; - } - - // strip the zero padding from the right - if (precisionType == PrecisionType::decimalPlaces) { - buffer.erase(fixZerosInTheEnd(buffer.begin(), buffer.end(), precision), - buffer.end()); - } - - return buffer; -} -} // namespace - -String valueToString(double value, unsigned int precision, - PrecisionType precisionType) { - return valueToString(value, false, precision, precisionType); -} - -String valueToString(bool value) { return value ? "true" : "false"; } - -static bool doesAnyCharRequireEscaping(char const* s, size_t n) { - assert(s || !n); - - return std::any_of(s, s + n, [](unsigned char c) { - return c == '\\' || c == '"' || c < 0x20 || c > 0x7F; - }); -} - -static unsigned int utf8ToCodepoint(const char*& s, const char* e) { - const unsigned int REPLACEMENT_CHARACTER = 0xFFFD; - - unsigned int firstByte = static_cast(*s); - - if (firstByte < 0x80) - return firstByte; - - if (firstByte < 0xE0) { - if (e - s < 2) - return REPLACEMENT_CHARACTER; - - unsigned int calculated = - ((firstByte & 0x1F) << 6) | (static_cast(s[1]) & 0x3F); - s += 1; - // oversized encoded characters are invalid - return calculated < 0x80 ? REPLACEMENT_CHARACTER : calculated; - } - - if (firstByte < 0xF0) { - if (e - s < 3) - return REPLACEMENT_CHARACTER; - - unsigned int calculated = ((firstByte & 0x0F) << 12) | - ((static_cast(s[1]) & 0x3F) << 6) | - (static_cast(s[2]) & 0x3F); - s += 2; - // surrogates aren't valid codepoints itself - // shouldn't be UTF-8 encoded - if (calculated >= 0xD800 && calculated <= 0xDFFF) - return REPLACEMENT_CHARACTER; - // oversized encoded characters are invalid - return calculated < 0x800 ? REPLACEMENT_CHARACTER : calculated; - } - - if (firstByte < 0xF8) { - if (e - s < 4) - return REPLACEMENT_CHARACTER; - - unsigned int calculated = ((firstByte & 0x07) << 18) | - ((static_cast(s[1]) & 0x3F) << 12) | - ((static_cast(s[2]) & 0x3F) << 6) | - (static_cast(s[3]) & 0x3F); - s += 3; - // oversized encoded characters are invalid - return calculated < 0x10000 ? REPLACEMENT_CHARACTER : calculated; - } - - return REPLACEMENT_CHARACTER; -} - -static const char hex2[] = "000102030405060708090a0b0c0d0e0f" - "101112131415161718191a1b1c1d1e1f" - "202122232425262728292a2b2c2d2e2f" - "303132333435363738393a3b3c3d3e3f" - "404142434445464748494a4b4c4d4e4f" - "505152535455565758595a5b5c5d5e5f" - "606162636465666768696a6b6c6d6e6f" - "707172737475767778797a7b7c7d7e7f" - "808182838485868788898a8b8c8d8e8f" - "909192939495969798999a9b9c9d9e9f" - "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" - "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" - "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" - "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" - "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" - "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; - -static String toHex16Bit(unsigned int x) { - const unsigned int hi = (x >> 8) & 0xff; - const unsigned int lo = x & 0xff; - String result(4, ' '); - result[0] = hex2[2 * hi]; - result[1] = hex2[2 * hi + 1]; - result[2] = hex2[2 * lo]; - result[3] = hex2[2 * lo + 1]; - return result; -} - -static void appendRaw(String& result, unsigned ch) { - result += static_cast(ch); -} - -static void appendHex(String& result, unsigned ch) { - result.append("\\u").append(toHex16Bit(ch)); -} - -static String valueToQuotedStringN(const char* value, size_t length, - bool emitUTF8 = false) { - if (value == nullptr) - return ""; - - if (!doesAnyCharRequireEscaping(value, length)) - return String("\"") + value + "\""; - // We have to walk value and escape any special characters. - // Appending to String is not efficient, but this should be rare. - // (Note: forward slashes are *not* rare, but I am not escaping them.) - String::size_type maxsize = length * 2 + 3; // allescaped+quotes+NULL - String result; - result.reserve(maxsize); // to avoid lots of mallocs - result += "\""; - char const* end = value + length; - for (const char* c = value; c != end; ++c) { - switch (*c) { - case '\"': - result += "\\\""; - break; - case '\\': - result += "\\\\"; - break; - case '\b': - result += "\\b"; - break; - case '\f': - result += "\\f"; - break; - case '\n': - result += "\\n"; - break; - case '\r': - result += "\\r"; - break; - case '\t': - result += "\\t"; - break; - // case '/': - // Even though \/ is considered a legal escape in JSON, a bare - // slash is also legal, so I see no reason to escape it. - // (I hope I am not misunderstanding something.) - // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); - if (codepoint < 0x20) { - appendHex(result, codepoint); - } else { - appendRaw(result, codepoint); - } - } else { - unsigned codepoint = utf8ToCodepoint(c, end); // modifies `c` - if (codepoint < 0x20) { - appendHex(result, codepoint); - } else if (codepoint < 0x80) { - appendRaw(result, codepoint); - } else if (codepoint < 0x10000) { - // Basic Multilingual Plane - appendHex(result, codepoint); - } else { - // Extended Unicode. Encode 20 bits as a surrogate pair. - codepoint -= 0x10000; - appendHex(result, 0xd800 + ((codepoint >> 10) & 0x3ff)); - appendHex(result, 0xdc00 + (codepoint & 0x3ff)); - } - } - } break; - } - } - result += "\""; - return result; -} - -String valueToQuotedString(const char* value) { - return valueToQuotedStringN(value, strlen(value)); -} - -// Class Writer -// ////////////////////////////////////////////////////////////////// -Writer::~Writer() = default; - -// Class FastWriter -// ////////////////////////////////////////////////////////////////// - -FastWriter::FastWriter() - - = default; - -void FastWriter::enableYAMLCompatibility() { yamlCompatibilityEnabled_ = true; } - -void FastWriter::dropNullPlaceholders() { dropNullPlaceholders_ = true; } - -void FastWriter::omitEndingLineFeed() { omitEndingLineFeed_ = true; } - -String FastWriter::write(const Value& root) { - document_.clear(); - writeValue(root); - if (!omitEndingLineFeed_) - document_ += '\n'; - return document_; -} - -void FastWriter::writeValue(const Value& value) { - switch (value.type()) { - case nullValue: - if (!dropNullPlaceholders_) - document_ += "null"; - break; - case intValue: - document_ += valueToString(value.asLargestInt()); - break; - case uintValue: - document_ += valueToString(value.asLargestUInt()); - break; - case realValue: - document_ += valueToString(value.asDouble()); - break; - case stringValue: { - // Is NULL possible for value.string_? No. - char const* str; - char const* end; - bool ok = value.getString(&str, &end); - if (ok) - document_ += valueToQuotedStringN(str, static_cast(end - str)); - break; - } - case booleanValue: - document_ += valueToString(value.asBool()); - break; - case arrayValue: { - document_ += '['; - ArrayIndex size = value.size(); - for (ArrayIndex index = 0; index < size; ++index) { - if (index > 0) - document_ += ','; - writeValue(value[index]); - } - document_ += ']'; - } break; - case objectValue: { - Value::Members members(value.getMemberNames()); - document_ += '{'; - for (auto it = members.begin(); it != members.end(); ++it) { - const String& name = *it; - if (it != members.begin()) - document_ += ','; - document_ += valueToQuotedStringN(name.data(), name.length()); - document_ += yamlCompatibilityEnabled_ ? ": " : ":"; - writeValue(value[name]); - } - document_ += '}'; - } break; - } -} - -// Class StyledWriter -// ////////////////////////////////////////////////////////////////// - -StyledWriter::StyledWriter() = default; - -String StyledWriter::write(const Value& root) { - document_.clear(); - addChildValues_ = false; - indentString_.clear(); - writeCommentBeforeValue(root); - writeValue(root); - writeCommentAfterValueOnSameLine(root); - document_ += '\n'; - return document_; -} - -void StyledWriter::writeValue(const Value& value) { - switch (value.type()) { - case nullValue: - pushValue("null"); - break; - case intValue: - pushValue(valueToString(value.asLargestInt())); - break; - case uintValue: - pushValue(valueToString(value.asLargestUInt())); - break; - case realValue: - pushValue(valueToString(value.asDouble())); - break; - case stringValue: { - // Is NULL possible for value.string_? No. - char const* str; - char const* end; - bool ok = value.getString(&str, &end); - if (ok) - pushValue(valueToQuotedStringN(str, static_cast(end - str))); - else - pushValue(""); - break; - } - case booleanValue: - pushValue(valueToString(value.asBool())); - break; - case arrayValue: - writeArrayValue(value); - break; - case objectValue: { - Value::Members members(value.getMemberNames()); - if (members.empty()) - pushValue("{}"); - else { - writeWithIndent("{"); - indent(); - auto it = members.begin(); - for (;;) { - const String& name = *it; - const Value& childValue = value[name]; - writeCommentBeforeValue(childValue); - writeWithIndent(valueToQuotedString(name.c_str())); - document_ += " : "; - writeValue(childValue); - if (++it == members.end()) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - document_ += ','; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("}"); - } - } break; - } -} - -void StyledWriter::writeArrayValue(const Value& value) { - size_t size = value.size(); - if (size == 0) - pushValue("[]"); - else { - bool isArrayMultiLine = isMultilineArray(value); - if (isArrayMultiLine) { - writeWithIndent("["); - indent(); - bool hasChildValue = !childValues_.empty(); - ArrayIndex index = 0; - for (;;) { - const Value& childValue = value[index]; - writeCommentBeforeValue(childValue); - if (hasChildValue) - writeWithIndent(childValues_[index]); - else { - writeIndent(); - writeValue(childValue); - } - if (++index == size) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - document_ += ','; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("]"); - } else // output on a single line - { - assert(childValues_.size() == size); - document_ += "[ "; - for (size_t index = 0; index < size; ++index) { - if (index > 0) - document_ += ", "; - document_ += childValues_[index]; - } - document_ += " ]"; - } - } -} - -bool StyledWriter::isMultilineArray(const Value& value) { - ArrayIndex const size = value.size(); - bool isMultiLine = size * 3 >= rightMargin_; - childValues_.clear(); - for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { - const Value& childValue = value[index]; - isMultiLine = ((childValue.isArray() || childValue.isObject()) && - !childValue.empty()); - } - if (!isMultiLine) // check if line length > max line length - { - childValues_.reserve(size); - addChildValues_ = true; - ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' - for (ArrayIndex index = 0; index < size; ++index) { - if (hasCommentForValue(value[index])) { - isMultiLine = true; - } - writeValue(value[index]); - lineLength += static_cast(childValues_[index].length()); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - -void StyledWriter::pushValue(const String& value) { - if (addChildValues_) - childValues_.push_back(value); - else - document_ += value; -} - -void StyledWriter::writeIndent() { - if (!document_.empty()) { - char last = document_[document_.length() - 1]; - if (last == ' ') // already indented - return; - if (last != '\n') // Comments may add new-line - document_ += '\n'; - } - document_ += indentString_; -} - -void StyledWriter::writeWithIndent(const String& value) { - writeIndent(); - document_ += value; -} - -void StyledWriter::indent() { indentString_ += String(indentSize_, ' '); } - -void StyledWriter::unindent() { - assert(indentString_.size() >= indentSize_); - indentString_.resize(indentString_.size() - indentSize_); -} - -void StyledWriter::writeCommentBeforeValue(const Value& root) { - if (!root.hasComment(commentBefore)) - return; - - document_ += '\n'; - writeIndent(); - const String& comment = root.getComment(commentBefore); - String::const_iterator iter = comment.begin(); - while (iter != comment.end()) { - document_ += *iter; - if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) - writeIndent(); - ++iter; - } - - // Comments are stripped of trailing newlines, so add one here - document_ += '\n'; -} - -void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { - if (root.hasComment(commentAfterOnSameLine)) - document_ += " " + root.getComment(commentAfterOnSameLine); - - if (root.hasComment(commentAfter)) { - document_ += '\n'; - document_ += root.getComment(commentAfter); - document_ += '\n'; - } -} - -bool StyledWriter::hasCommentForValue(const Value& value) { - return value.hasComment(commentBefore) || - value.hasComment(commentAfterOnSameLine) || - value.hasComment(commentAfter); -} - -// Class StyledStreamWriter -// ////////////////////////////////////////////////////////////////// - -StyledStreamWriter::StyledStreamWriter(String indentation) - : document_(nullptr), indentation_(std::move(indentation)), - addChildValues_(), indented_(false) {} - -void StyledStreamWriter::write(OStream& out, const Value& root) { - document_ = &out; - addChildValues_ = false; - indentString_.clear(); - indented_ = true; - writeCommentBeforeValue(root); - if (!indented_) - writeIndent(); - indented_ = true; - writeValue(root); - writeCommentAfterValueOnSameLine(root); - *document_ << "\n"; - document_ = nullptr; // Forget the stream, for safety. -} - -void StyledStreamWriter::writeValue(const Value& value) { - switch (value.type()) { - case nullValue: - pushValue("null"); - break; - case intValue: - pushValue(valueToString(value.asLargestInt())); - break; - case uintValue: - pushValue(valueToString(value.asLargestUInt())); - break; - case realValue: - pushValue(valueToString(value.asDouble())); - break; - case stringValue: { - // Is NULL possible for value.string_? No. - char const* str; - char const* end; - bool ok = value.getString(&str, &end); - if (ok) - pushValue(valueToQuotedStringN(str, static_cast(end - str))); - else - pushValue(""); - break; - } - case booleanValue: - pushValue(valueToString(value.asBool())); - break; - case arrayValue: - writeArrayValue(value); - break; - case objectValue: { - Value::Members members(value.getMemberNames()); - if (members.empty()) - pushValue("{}"); - else { - writeWithIndent("{"); - indent(); - auto it = members.begin(); - for (;;) { - const String& name = *it; - const Value& childValue = value[name]; - writeCommentBeforeValue(childValue); - writeWithIndent(valueToQuotedString(name.c_str())); - *document_ << " : "; - writeValue(childValue); - if (++it == members.end()) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - *document_ << ","; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("}"); - } - } break; - } -} - -void StyledStreamWriter::writeArrayValue(const Value& value) { - unsigned size = value.size(); - if (size == 0) - pushValue("[]"); - else { - bool isArrayMultiLine = isMultilineArray(value); - if (isArrayMultiLine) { - writeWithIndent("["); - indent(); - bool hasChildValue = !childValues_.empty(); - unsigned index = 0; - for (;;) { - const Value& childValue = value[index]; - writeCommentBeforeValue(childValue); - if (hasChildValue) - writeWithIndent(childValues_[index]); - else { - if (!indented_) - writeIndent(); - indented_ = true; - writeValue(childValue); - indented_ = false; - } - if (++index == size) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - *document_ << ","; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("]"); - } else // output on a single line - { - assert(childValues_.size() == size); - *document_ << "[ "; - for (unsigned index = 0; index < size; ++index) { - if (index > 0) - *document_ << ", "; - *document_ << childValues_[index]; - } - *document_ << " ]"; - } - } -} - -bool StyledStreamWriter::isMultilineArray(const Value& value) { - ArrayIndex const size = value.size(); - bool isMultiLine = size * 3 >= rightMargin_; - childValues_.clear(); - for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { - const Value& childValue = value[index]; - isMultiLine = ((childValue.isArray() || childValue.isObject()) && - !childValue.empty()); - } - if (!isMultiLine) // check if line length > max line length - { - childValues_.reserve(size); - addChildValues_ = true; - ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' - for (ArrayIndex index = 0; index < size; ++index) { - if (hasCommentForValue(value[index])) { - isMultiLine = true; - } - writeValue(value[index]); - lineLength += static_cast(childValues_[index].length()); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - -void StyledStreamWriter::pushValue(const String& value) { - if (addChildValues_) - childValues_.push_back(value); - else - *document_ << value; -} - -void StyledStreamWriter::writeIndent() { - // blep intended this to look at the so-far-written string - // to determine whether we are already indented, but - // with a stream we cannot do that. So we rely on some saved state. - // The caller checks indented_. - *document_ << '\n' << indentString_; -} - -void StyledStreamWriter::writeWithIndent(const String& value) { - if (!indented_) - writeIndent(); - *document_ << value; - indented_ = false; -} - -void StyledStreamWriter::indent() { indentString_ += indentation_; } - -void StyledStreamWriter::unindent() { - assert(indentString_.size() >= indentation_.size()); - indentString_.resize(indentString_.size() - indentation_.size()); -} - -void StyledStreamWriter::writeCommentBeforeValue(const Value& root) { - if (!root.hasComment(commentBefore)) - return; - - if (!indented_) - writeIndent(); - const String& comment = root.getComment(commentBefore); - String::const_iterator iter = comment.begin(); - while (iter != comment.end()) { - *document_ << *iter; - if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) - // writeIndent(); // would include newline - *document_ << indentString_; - ++iter; - } - indented_ = false; -} - -void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root) { - if (root.hasComment(commentAfterOnSameLine)) - *document_ << ' ' << root.getComment(commentAfterOnSameLine); - - if (root.hasComment(commentAfter)) { - writeIndent(); - *document_ << root.getComment(commentAfter); - } - indented_ = false; -} - -bool StyledStreamWriter::hasCommentForValue(const Value& value) { - return value.hasComment(commentBefore) || - value.hasComment(commentAfterOnSameLine) || - value.hasComment(commentAfter); -} - -////////////////////////// -// BuiltStyledStreamWriter - -/// Scoped enums are not available until C++11. -struct CommentStyle { - /// Decide whether to write comments. - enum Enum { - None, ///< Drop all comments. - Most, ///< Recover odd behavior of previous versions (not implemented yet). - All ///< Keep all comments. - }; -}; - -struct BuiltStyledStreamWriter : public StreamWriter { - BuiltStyledStreamWriter(String indentation, CommentStyle::Enum cs, - String colonSymbol, String nullSymbol, - String endingLineFeedSymbol, bool useSpecialFloats, - bool emitUTF8, unsigned int precision, - PrecisionType precisionType); - int write(Value const& root, OStream* sout) override; - -private: - void writeValue(Value const& value); - void writeArrayValue(Value const& value); - bool isMultilineArray(Value const& value); - void pushValue(String const& value); - void writeIndent(); - void writeWithIndent(String const& value); - void indent(); - void unindent(); - void writeCommentBeforeValue(Value const& root); - void writeCommentAfterValueOnSameLine(Value const& root); - static bool hasCommentForValue(const Value& value); - - using ChildValues = std::vector; - - ChildValues childValues_; - String indentString_; - unsigned int rightMargin_; - String indentation_; - CommentStyle::Enum cs_; - String colonSymbol_; - String nullSymbol_; - String endingLineFeedSymbol_; - bool addChildValues_ : 1; - bool indented_ : 1; - bool useSpecialFloats_ : 1; - bool emitUTF8_ : 1; - unsigned int precision_; - PrecisionType precisionType_; -}; -BuiltStyledStreamWriter::BuiltStyledStreamWriter( - String indentation, CommentStyle::Enum cs, String colonSymbol, - String nullSymbol, String endingLineFeedSymbol, bool useSpecialFloats, - bool emitUTF8, unsigned int precision, PrecisionType precisionType) - : rightMargin_(74), indentation_(std::move(indentation)), cs_(cs), - colonSymbol_(std::move(colonSymbol)), nullSymbol_(std::move(nullSymbol)), - endingLineFeedSymbol_(std::move(endingLineFeedSymbol)), - addChildValues_(false), indented_(false), - useSpecialFloats_(useSpecialFloats), emitUTF8_(emitUTF8), - precision_(precision), precisionType_(precisionType) {} -int BuiltStyledStreamWriter::write(Value const& root, OStream* sout) { - sout_ = sout; - addChildValues_ = false; - indented_ = true; - indentString_.clear(); - writeCommentBeforeValue(root); - if (!indented_) - writeIndent(); - indented_ = true; - writeValue(root); - writeCommentAfterValueOnSameLine(root); - *sout_ << endingLineFeedSymbol_; - sout_ = nullptr; - return 0; -} -void BuiltStyledStreamWriter::writeValue(Value const& value) { - switch (value.type()) { - case nullValue: - pushValue(nullSymbol_); - break; - case intValue: - pushValue(valueToString(value.asLargestInt())); - break; - case uintValue: - pushValue(valueToString(value.asLargestUInt())); - break; - case realValue: - pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_, - precisionType_)); - break; - case stringValue: { - // Is NULL is possible for value.string_? No. - char const* str; - char const* end; - bool ok = value.getString(&str, &end); - if (ok) - pushValue( - valueToQuotedStringN(str, static_cast(end - str), emitUTF8_)); - else - pushValue(""); - break; - } - case booleanValue: - pushValue(valueToString(value.asBool())); - break; - case arrayValue: - writeArrayValue(value); - break; - case objectValue: { - Value::Members members(value.getMemberNames()); - if (members.empty()) - pushValue("{}"); - else { - writeWithIndent("{"); - indent(); - auto it = members.begin(); - for (;;) { - String const& name = *it; - Value const& childValue = value[name]; - writeCommentBeforeValue(childValue); - writeWithIndent( - valueToQuotedStringN(name.data(), name.length(), emitUTF8_)); - *sout_ << colonSymbol_; - writeValue(childValue); - if (++it == members.end()) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - *sout_ << ","; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("}"); - } - } break; - } -} - -void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { - unsigned size = value.size(); - if (size == 0) - pushValue("[]"); - else { - bool isMultiLine = (cs_ == CommentStyle::All) || isMultilineArray(value); - if (isMultiLine) { - writeWithIndent("["); - indent(); - bool hasChildValue = !childValues_.empty(); - unsigned index = 0; - for (;;) { - Value const& childValue = value[index]; - writeCommentBeforeValue(childValue); - if (hasChildValue) - writeWithIndent(childValues_[index]); - else { - if (!indented_) - writeIndent(); - indented_ = true; - writeValue(childValue); - indented_ = false; - } - if (++index == size) { - writeCommentAfterValueOnSameLine(childValue); - break; - } - *sout_ << ","; - writeCommentAfterValueOnSameLine(childValue); - } - unindent(); - writeWithIndent("]"); - } else // output on a single line - { - assert(childValues_.size() == size); - *sout_ << "["; - if (!indentation_.empty()) - *sout_ << " "; - for (unsigned index = 0; index < size; ++index) { - if (index > 0) - *sout_ << ((!indentation_.empty()) ? ", " : ","); - *sout_ << childValues_[index]; - } - if (!indentation_.empty()) - *sout_ << " "; - *sout_ << "]"; - } - } -} - -bool BuiltStyledStreamWriter::isMultilineArray(Value const& value) { - ArrayIndex const size = value.size(); - bool isMultiLine = size * 3 >= rightMargin_; - childValues_.clear(); - for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { - Value const& childValue = value[index]; - isMultiLine = ((childValue.isArray() || childValue.isObject()) && - !childValue.empty()); - } - if (!isMultiLine) // check if line length > max line length - { - childValues_.reserve(size); - addChildValues_ = true; - ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' - for (ArrayIndex index = 0; index < size; ++index) { - if (hasCommentForValue(value[index])) { - isMultiLine = true; - } - writeValue(value[index]); - lineLength += static_cast(childValues_[index].length()); - } - addChildValues_ = false; - isMultiLine = isMultiLine || lineLength >= rightMargin_; - } - return isMultiLine; -} - -void BuiltStyledStreamWriter::pushValue(String const& value) { - if (addChildValues_) - childValues_.push_back(value); - else - *sout_ << value; -} - -void BuiltStyledStreamWriter::writeIndent() { - // blep intended this to look at the so-far-written string - // to determine whether we are already indented, but - // with a stream we cannot do that. So we rely on some saved state. - // The caller checks indented_. - - if (!indentation_.empty()) { - // In this case, drop newlines too. - *sout_ << '\n' << indentString_; - } -} - -void BuiltStyledStreamWriter::writeWithIndent(String const& value) { - if (!indented_) - writeIndent(); - *sout_ << value; - indented_ = false; -} - -void BuiltStyledStreamWriter::indent() { indentString_ += indentation_; } - -void BuiltStyledStreamWriter::unindent() { - assert(indentString_.size() >= indentation_.size()); - indentString_.resize(indentString_.size() - indentation_.size()); -} - -void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { - if (cs_ == CommentStyle::None) - return; - if (!root.hasComment(commentBefore)) - return; - - if (!indented_) - writeIndent(); - const String& comment = root.getComment(commentBefore); - String::const_iterator iter = comment.begin(); - while (iter != comment.end()) { - *sout_ << *iter; - if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) - // writeIndent(); // would write extra newline - *sout_ << indentString_; - ++iter; - } - indented_ = false; -} - -void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine( - Value const& root) { - if (cs_ == CommentStyle::None) - return; - if (root.hasComment(commentAfterOnSameLine)) - *sout_ << " " + root.getComment(commentAfterOnSameLine); - - if (root.hasComment(commentAfter)) { - writeIndent(); - *sout_ << root.getComment(commentAfter); - } -} - -// static -bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) { - return value.hasComment(commentBefore) || - value.hasComment(commentAfterOnSameLine) || - value.hasComment(commentAfter); -} - -/////////////// -// StreamWriter - -StreamWriter::StreamWriter() : sout_(nullptr) {} -StreamWriter::~StreamWriter() = default; -StreamWriter::Factory::~Factory() = default; -StreamWriterBuilder::StreamWriterBuilder() { setDefaults(&settings_); } -StreamWriterBuilder::~StreamWriterBuilder() = default; -StreamWriter* StreamWriterBuilder::newStreamWriter() const { - const String indentation = settings_["indentation"].asString(); - const String cs_str = settings_["commentStyle"].asString(); - const String pt_str = settings_["precisionType"].asString(); - const bool eyc = settings_["enableYAMLCompatibility"].asBool(); - const bool dnp = settings_["dropNullPlaceholders"].asBool(); - const bool usf = settings_["useSpecialFloats"].asBool(); - const bool emitUTF8 = settings_["emitUTF8"].asBool(); - unsigned int pre = settings_["precision"].asUInt(); - CommentStyle::Enum cs = CommentStyle::All; - if (cs_str == "All") { - cs = CommentStyle::All; - } else if (cs_str == "None") { - cs = CommentStyle::None; - } else { - throwRuntimeError("commentStyle must be 'All' or 'None'"); - } - PrecisionType precisionType(significantDigits); - if (pt_str == "significant") { - precisionType = PrecisionType::significantDigits; - } else if (pt_str == "decimal") { - precisionType = PrecisionType::decimalPlaces; - } else { - throwRuntimeError("precisionType must be 'significant' or 'decimal'"); - } - String colonSymbol = " : "; - if (eyc) { - colonSymbol = ": "; - } else if (indentation.empty()) { - colonSymbol = ":"; - } - String nullSymbol = "null"; - if (dnp) { - nullSymbol.clear(); - } - if (pre > 17) - pre = 17; - String endingLineFeedSymbol; - return new BuiltStyledStreamWriter(indentation, cs, colonSymbol, nullSymbol, - endingLineFeedSymbol, usf, emitUTF8, pre, - precisionType); -} - -bool StreamWriterBuilder::validate(Json::Value* invalid) const { - static const auto& valid_keys = *new std::set{ - "indentation", - "commentStyle", - "enableYAMLCompatibility", - "dropNullPlaceholders", - "useSpecialFloats", - "emitUTF8", - "precision", - "precisionType", - }; - for (auto si = settings_.begin(); si != settings_.end(); ++si) { - auto key = si.name(); - if (valid_keys.count(key)) - continue; - if (invalid) - (*invalid)[key] = *si; - else - return false; - } - return invalid ? invalid->empty() : true; -} - -Value& StreamWriterBuilder::operator[](const String& key) { - return settings_[key]; -} -// static -void StreamWriterBuilder::setDefaults(Json::Value* settings) { - //! [StreamWriterBuilderDefaults] - (*settings)["commentStyle"] = "All"; - (*settings)["indentation"] = "\t"; - (*settings)["enableYAMLCompatibility"] = false; - (*settings)["dropNullPlaceholders"] = false; - (*settings)["useSpecialFloats"] = false; - (*settings)["emitUTF8"] = false; - (*settings)["precision"] = 17; - (*settings)["precisionType"] = "significant"; - //! [StreamWriterBuilderDefaults] -} - -String writeString(StreamWriter::Factory const& factory, Value const& root) { - OStringStream sout; - StreamWriterPtr const writer(factory.newStreamWriter()); - writer->write(root, &sout); - return sout.str(); -} - -OStream& operator<<(OStream& sout, Value const& root) { - StreamWriterBuilder builder; - StreamWriterPtr const writer(builder.newStreamWriter()); - writer->write(root, &sout); - return sout; -} - -} // namespace Json diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj b/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj deleted file mode 100644 index e170cfc..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj +++ /dev/null @@ -1,177 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {f1736b3f-03a2-4fc7-b045-a12ba8d724fb} - jsoncpp - 10.0 - - - - DynamicLibrary - true - v143 - Unicode - - - DynamicLibrary - false - v143 - true - Unicode - - - DynamicLibrary - true - v143 - Unicode - - - DynamicLibrary - false - v143 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - ./;$(IncludePath) - - - false - ./;$(IncludePath) - - - true - ./;$(IncludePath) - - - false - ./;$(IncludePath) - - - - Level3 - true - WIN32;_DEBUG;JSONCPP_EXPORTS;_WINDOWS;_USRDLL;JSON_DLL_BUILD;%(PreprocessorDefinitions) - true - NotUsing - pch.h - - - Windows - true - false - - - - - Level3 - true - true - true - WIN32;NDEBUG;JSONCPP_EXPORTS;_WINDOWS;_USRDLL;JSON_DLL_BUILD;%(PreprocessorDefinitions) - true - NotUsing - pch.h - - - Windows - true - true - true - false - - - - - Level3 - true - _DEBUG;JSONCPP_EXPORTS;_WINDOWS;_USRDLL;JSON_DLL_BUILD;%(PreprocessorDefinitions) - true - NotUsing - pch.h - - - Windows - true - false - - - - - Level3 - true - true - true - NDEBUG;JSONCPP_EXPORTS;_WINDOWS;_USRDLL;JSON_DLL_BUILD;%(PreprocessorDefinitions) - true - NotUsing - pch.h - - - Windows - true - true - true - false - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.filters b/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.filters deleted file mode 100644 index ccf99d7..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.filters +++ /dev/null @@ -1,63 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {b702a2a0-b1a3-486d-b83e-23cb806e5158} - - - - - 源文件 - - - 源文件 - - - 源文件 - - - - - 头文件\json - - - 头文件\json - - - 头文件\json - - - 头文件\json - - - 头文件\json - - - 头文件\json - - - 头文件\json - - - 头文件\json - - - 头文件\json - - - 头文件\json - - - \ No newline at end of file diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.user b/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.user deleted file mode 100644 index 88a5509..0000000 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file -- Gitee From ea5a763321994de030110969e48db298ee96ecd2 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 30 Apr 2024 17:03:23 +0800 Subject: [PATCH 05/24] modify:detach version configure file --- .../ModuleConfig_Define.h | 19 ++++++ .../ModuleConfigure_Json.cpp | 61 +++++++++++++++++++ .../ModuleConfigure_Json.h | 1 + .../XEngine_ModuleConfigure.def | 1 + .../XEngine_ModuleConfigure.vcxproj | 2 +- .../XEngine_ModuleConfigure/pch.cpp | 4 ++ .../XEngine_HttpApp/XEngine_Configure.cpp | 8 ++- 7 files changed, 94 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h index e7438ff..b91c441 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h @@ -173,6 +173,25 @@ extern "C" XLONG ModuleConfigure_GetLastError(int* pInt_ErrorCode = NULL); *********************************************************************/ extern "C" bool ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVICECONFIG* pSt_ServerConfig); /******************************************************************** +函数名称:ModuleConfigure_Json_VersionFile +函数功能:读取版本配置文件 + 参数.一:lpszConfigFile + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要读取的配置文件 + 参数.二:pSt_ServerConfig + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出服务配置信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleConfigure_Json_VersionFile(LPCXSTR lpszConfigFile, XENGINE_SERVICECONFIG* pSt_ServerConfig); +/******************************************************************** 函数名称:ModuleConfigure_Json_QRCodeFile 函数功能:读取JSON配置文件 参数.一:lpszConfigFile diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index e9c3f46..a82f399 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -198,7 +198,68 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE Json::Value st_JsonVerSwitch = st_JsonXVerifcation["st_VerSwitch"]; pSt_ServerConfig->st_XVerifcation.st_VerSwitch.bBackService = st_JsonVerSwitch["bBackService"].asBool(); pSt_ServerConfig->st_XVerifcation.st_VerSwitch.bDeamon = st_JsonVerSwitch["bDeamon"].asBool(); + return true; +} +/******************************************************************** +函数名称:ModuleConfigure_Json_VersionFile +函数功能:读取版本配置文件 + 参数.一:lpszConfigFile + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要读取的配置文件 + 参数.二:pSt_ServerConfig + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出服务配置信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleConfigure_Json::ModuleConfigure_Json_VersionFile(LPCXSTR lpszConfigFile, XENGINE_SERVICECONFIG* pSt_ServerConfig) +{ + Config_IsErrorOccur = false; + if ((NULL == lpszConfigFile) || (NULL == pSt_ServerConfig)) + { + Config_IsErrorOccur = true; + Config_dwErrorCode = ERROR_MODULE_CONFIGURE_JSON_PARAMENT; + return false; + } + Json::Value st_JsonRoot; + JSONCPP_STRING st_JsonError; + Json::CharReaderBuilder st_JsonBuilder; + //读取配置文件所有内容到缓冲区 + FILE* pSt_File = _xtfopen(lpszConfigFile, _X("rb")); + if (NULL == pSt_File) + { + Config_IsErrorOccur = true; + Config_dwErrorCode = ERROR_MODULE_CONFIGURE_JSON_OPENFILE; + return false; + } + size_t nCount = 0; + XCHAR tszMsgBuffer[4096]; + while (1) + { + size_t nRet = fread(tszMsgBuffer + nCount, 1, 2048, pSt_File); + if (nRet <= 0) + { + break; + } + nCount += nRet; + } + fclose(pSt_File); + //开始解析配置文件 + std::unique_ptr const pSt_JsonReader(st_JsonBuilder.newCharReader()); + if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nCount, &st_JsonRoot, &st_JsonError)) + { + Config_IsErrorOccur = true; + Config_dwErrorCode = ERROR_MODULE_CONFIGURE_JSON_PARSE; + return false; + } + if (st_JsonRoot["XVer"].empty()) { Config_IsErrorOccur = true; diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.h index a581b7d..3f5a0c8 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.h @@ -18,6 +18,7 @@ public: ~CModuleConfigure_Json(); public: bool ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVICECONFIG* pSt_ServerConfig); + bool ModuleConfigure_Json_VersionFile(LPCXSTR lpszConfigFile, XENGINE_SERVICECONFIG* pSt_ServerConfig); bool ModuleConfigure_Json_QRCodeFile(LPCXSTR lpszConfigFile, XENGINE_QRCODECONFIG* pSt_QRCodeConfig); bool ModuleConfigure_Json_PluginFile(LPCXSTR lpszConfigFile, XENGINE_PLUGINCONFIG* pSt_PluginConfig); bool ModuleConfigure_Json_DeamonList(LPCXSTR lpszConfigFile, XENGINE_DEAMONAPPLIST* pSt_AppConfig); diff --git a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.def b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.def index 3915926..aeb270e 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.def +++ b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.def @@ -4,6 +4,7 @@ EXPORTS ModuleConfigure_GetLastError ModuleConfigure_Json_File + ModuleConfigure_Json_VersionFile ModuleConfigure_Json_QRCodeFile ModuleConfigure_Json_PluginFile ModuleConfigure_Json_DeamonList \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj index bb6fa3a..dd5512c 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj +++ b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj @@ -72,7 +72,7 @@ true - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;..\XEngine_ModuleConfigure;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) diff --git a/XEngine_Source/XEngine_ModuleConfigure/pch.cpp b/XEngine_Source/XEngine_ModuleConfigure/pch.cpp index ac44382..01f52d8 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/pch.cpp +++ b/XEngine_Source/XEngine_ModuleConfigure/pch.cpp @@ -33,6 +33,10 @@ extern "C" bool ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVIC { return m_ConfigJson.ModuleConfigure_Json_File(lpszConfigFile, pSt_ServerConfig); } +extern "C" bool ModuleConfigure_Json_VersionFile(LPCXSTR lpszConfigFile, XENGINE_SERVICECONFIG * pSt_ServerConfig) +{ + return m_ConfigJson.ModuleConfigure_Json_VersionFile(lpszConfigFile, pSt_ServerConfig); +} extern "C" bool ModuleConfigure_Json_QRCodeFile(LPCXSTR lpszConfigFile, XENGINE_QRCODECONFIG * pSt_QRCodeConfig) { return m_ConfigJson.ModuleConfigure_Json_QRCodeFile(lpszConfigFile, pSt_QRCodeConfig); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Configure.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Configure.cpp index dcadc18..9d2d2e1 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Configure.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Configure.cpp @@ -13,7 +13,8 @@ bool XEngine_Configure_Parament(int argc, char** argv) { LPCXSTR lpszConfigFile = _X("./XEngine_Config/XEngine_Config.json"); - + LPCXSTR lpszVersionFile = _X("./XEngine_Config/XEngine_VersionConfig.json"); + if (NULL != st_ServiceConfig.st_XVer.pStl_ListVer) { delete st_ServiceConfig.st_XVer.pStl_ListVer; @@ -25,6 +26,11 @@ bool XEngine_Configure_Parament(int argc, char** argv) printf("解析配置文件失败,ModuleConfigure_Json_File:%lX\n", ModuleConfigure_GetLastError()); return false; } + if (!ModuleConfigure_Json_VersionFile(lpszVersionFile, &st_ServiceConfig)) + { + printf("解析配置文件失败,ModuleConfigure_Json_VersionFile:%lX\n", ModuleConfigure_GetLastError()); + return false; + } for (int i = 0; i < argc; i++) { -- Gitee From da9cc8c6047d7bf1e1b2b693172d6d053632b648 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 30 Apr 2024 17:52:59 +0800 Subject: [PATCH 06/24] added:rfc witch udp port and stun code file --- .../ModuleConfig_Define.h | 1 + .../ModuleConfigure_Json.cpp | 1 + .../XEngine_HttpApp/XEngine_Hdr.h | 6 +++++ .../XEngine_HttpApp/XEngine_HttpApp.cpp | 23 ++++++++++++++++++- .../XEngine_HttpApp/XEngine_HttpApp.vcxproj | 2 ++ .../XEngine_HttpApp.vcxproj.filters | 12 ++++++++++ .../XEngine_HttpApp/XEngine_Network.cpp | 9 ++++++++ .../XEngine_HttpApp/XEngine_Network.h | 2 ++ 8 files changed, 55 insertions(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h index b91c441..6e7c389 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h @@ -20,6 +20,7 @@ typedef struct bool bAutoStart; //是否自动启动 bool bHideWnd; //是否隐藏窗口启动 int nHttpPort; //HTTP服务端口 + int nRFCPort; //RFC标准服务端口 struct { int nMaxClient; //最大客户端个数 diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index a82f399..b081402 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -86,6 +86,7 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE pSt_ServerConfig->bAutoStart = st_JsonRoot["bAutoStart"].asBool(); pSt_ServerConfig->bHideWnd = st_JsonRoot["bHideWnd"].asBool(); pSt_ServerConfig->nHttpPort = st_JsonRoot["nHttpPort"].asInt(); + pSt_ServerConfig->nRFCPort = st_JsonRoot["nRFCPort"].asInt(); if (st_JsonRoot["XMax"].empty() || (4 != st_JsonRoot["XMax"].size())) { diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h index fe6717d..e50e9d1 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h @@ -40,6 +40,8 @@ using namespace std; #include #include #include +#include +#include #include #include #include @@ -92,6 +94,8 @@ using namespace std; #include "XEngine_TaskGet/TaskGet_Reload.h" #include "XEngine_TaskGet/TaskGet_Weather.h" #include "XEngine_TaskGet/TaskGet_IDRegion.h" +//rfc +#include "XEngine_TaskRfc/RFCTask_Stun.h" /******************************************************************** // Created: 2022/01/20 14:42:06 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ServiceApp\XEngine_HttpApp\XEngine_Hdr.h @@ -109,6 +113,7 @@ extern bool bIsRun; extern XHANDLE xhLog; //HTTP服务器 extern XHANDLE xhHTTPSocket; +extern XHANDLE xhRFCSocket; extern XHANDLE xhHTTPHeart; extern XHANDLE xhHTTPPacket; extern XHANDLE xhHTTPPool; @@ -163,6 +168,7 @@ extern XENGINE_DEAMONAPPLIST st_DeamonAppConfig; #pragma comment(lib,"XEngine_Client/XClient_APIHelp.lib") #pragma comment(lib,"XEngine_HelpComponents/HelpComponents_XLog.lib") #pragma comment(lib,"XEngine_RfcComponents/RfcComponents_HttpProtocol.lib") +#pragma comment(lib,"XEngine_RfcComponents/RfcComponents_NatProtocol.lib") #pragma comment(lib,"XEngine_SystemSdk/XEngine_SystemApi") #pragma comment(lib,"XEngine_AVCodec/XEngine_AVCollect.lib") #pragma comment(lib,"XEngine_AVCodec/XEngine_VideoCodec.lib") diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp index 7493dda..bb1d68a 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp @@ -14,6 +14,7 @@ bool bIsRun = false; XHANDLE xhLog = NULL; //HTTP服务器 XHANDLE xhHTTPSocket = NULL; +XHANDLE xhRFCSocket = NULL; XHANDLE xhHTTPHeart = NULL; XHANDLE xhHTTPPacket = NULL; XHANDLE xhHTTPPool = 0; @@ -34,6 +35,7 @@ void ServiceApp_Stop(int signo) bIsRun = false; //销毁HTTP资源 NetCore_TCPXCore_DestroyEx(xhHTTPSocket); + NetCore_UDPXCore_DestroyEx(xhRFCSocket); SocketOpt_HeartBeat_DestoryEx(xhHTTPHeart); HttpProtocol_Server_DestroyEx(xhHTTPPacket); ManagePool_Thread_NQDestroy(xhHTTPPool); @@ -314,7 +316,25 @@ int main(int argc, char** argv) } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,HTTP消息服务没有被启用")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,HTTP服务没有被启用")); + } + //启动RFC标准服务 + if (st_ServiceConfig.nRFCPort > 0) + { + //网络 + xhRFCSocket = NetCore_UDPXCore_StartEx(st_ServiceConfig.nRFCPort, st_ServiceConfig.st_XMax.nIOThread); + if (NULL == xhRFCSocket) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动RFC网络服务器失败,错误:%lX"), NetCore_GetLastError()); + goto XENGINE_SERVICEAPP_EXIT; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动RFC网络服务器成功,RFC端口:%d,IO:%d"), st_ServiceConfig.nRFCPort, st_ServiceConfig.st_XMax.nIOThread); + NetCore_UDPXCore_RegisterCallBackEx(xhHTTPSocket, Network_Callback_RFCRecv); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,注册RFC网络事件成功")); + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,RFC服务没有被启用")); } //初始化P2P if (!ModuleHelp_P2PClient_Init(st_ServiceConfig.st_XTime.nP2PTimeOut, HTTPTask_TastPost_P2PCallback)) @@ -420,6 +440,7 @@ XENGINE_SERVICEAPP_EXIT: bIsRun = false; //销毁HTTP资源 NetCore_TCPXCore_DestroyEx(xhHTTPSocket); + NetCore_UDPXCore_DestroyEx(xhRFCSocket); SocketOpt_HeartBeat_DestoryEx(xhHTTPHeart); HttpProtocol_Server_DestroyEx(xhHTTPPacket); ManagePool_Thread_NQDestroy(xhHTTPPool); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj index c21656e..0de009f 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj @@ -177,6 +177,7 @@ + @@ -203,6 +204,7 @@ + diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters index fce2bc8..4cb7740 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters @@ -25,6 +25,12 @@ {a904cf8f-7387-403f-8686-0f5c35c6b72c} + + {7dbb6197-ab74-46a9-b43f-64edef792af2} + + + {0dfcfd07-5186-4d04-9266-c2cc9e221421} + @@ -99,6 +105,9 @@ 源文件\XEngine_TaskPost + + 源文件\XEngine_TaskRfc + @@ -173,5 +182,8 @@ 头文件\XEngine_TaskPost + + 头文件\XEngine_TaskRfc + \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp index eecee3c..218683a 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp @@ -36,6 +36,15 @@ void CALLBACK Network_Callback_HTTPHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket { XEngine_Network_Close(lpszClientAddr, true); } +//////////////////////////////////////////////////////////////////////////RFC相关 +void CALLBACK Network_Callback_RFCRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszMSGBuffer, int nMSGLen, XPVOID lParam) +{ + if (nMSGLen >= 20 && (lpszMSGBuffer[0] & 0xC0) == 0x00 && lpszMSGBuffer[4] == 0x21 && lpszMSGBuffer[5] == 0x12 && lpszMSGBuffer[6] == 0xA4 && lpszMSGBuffer[7] == 0x42) + { + //STUN消息的类型字段(前两位为00)以及魔术cookie字段 + RFCTask_Stun_Parse(lpszClientAddr, lpszMSGBuffer, nMSGLen); + } +} //////////////////////////////////////////////////////////////////////////网络IO关闭操作 void XEngine_Network_Close(LPCXSTR lpszClientAddr, bool bHeart) { diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.h index 79416c7..0984b08 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.h @@ -15,6 +15,8 @@ bool CALLBACK Network_Callback_HTTPLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket void CALLBACK Network_Callback_HTTPRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); void CALLBACK Network_Callback_HTTPLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); void CALLBACK Network_Callback_HTTPHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); +//RFC相关 +void CALLBACK Network_Callback_RFCRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszMSGBuffer, int nMSGLen, XPVOID lParam); //关闭与发送 void XEngine_Network_Close(LPCXSTR lpszClientAddr, bool bHeart); bool XEngine_Network_Send(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen); \ No newline at end of file -- Gitee From 19da9e631e68a6a4635b06b42c49bd264d339032 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 7 May 2024 16:34:00 +0800 Subject: [PATCH 07/24] added:query info for report --- XEngine_Source/VSCopy-Debug.bat | 1 + XEngine_Source/VSCopy-x64.bat | 1 + XEngine_Source/VSCopy-x86.bat | 1 + .../XEngine_TaskPost/TaskPost_Machine.cpp | 19 +++++++++++++++++++ 4 files changed, 22 insertions(+) diff --git a/XEngine_Source/VSCopy-Debug.bat b/XEngine_Source/VSCopy-Debug.bat index 0a6e364..e604c7e 100644 --- a/XEngine_Source/VSCopy-Debug.bat +++ b/XEngine_Source/VSCopy-Debug.bat @@ -14,6 +14,7 @@ copy /y "D:\XEngine\XEngine_SourceCode\Debug\XEngine_SystemApi.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\HelpComponents_DataBase.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\HelpComponents_XLog.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\RfcComponents_HttpProtocol.dll" "./" +copy /y "D:\XEngine\XEngine_SourceCode\Debug\RfcComponents_NatProtocol.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\XEngine_AVHelp.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\XEngine_VideoCodec.dll" "./" diff --git a/XEngine_Source/VSCopy-x64.bat b/XEngine_Source/VSCopy-x64.bat index f5028d0..586f199 100644 --- a/XEngine_Source/VSCopy-x64.bat +++ b/XEngine_Source/VSCopy-x64.bat @@ -14,6 +14,7 @@ copy /y "%XEngine_Lib64%\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" copy /y "%XEngine_Lib64%\XEngine_HelpComponents\HelpComponents_DataBase.dll" "./" copy /y "%XEngine_Lib64%\XEngine_HelpComponents\HelpComponents_XLog.dll" "./" copy /y "%XEngine_Lib64%\XEngine_RfcComponents\RfcComponents_HttpProtocol.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_RfcComponents\RfcComponents_NatProtocol.dll" "./" copy /y "%XEngine_Lib64%\XEngine_AVCodec\XEngine_AVHelp.dll" "./" copy /y "%XEngine_Lib64%\XEngine_AVCodec\XEngine_VideoCodec.dll" "./" diff --git a/XEngine_Source/VSCopy-x86.bat b/XEngine_Source/VSCopy-x86.bat index 0173755..a2dd361 100644 --- a/XEngine_Source/VSCopy-x86.bat +++ b/XEngine_Source/VSCopy-x86.bat @@ -14,6 +14,7 @@ copy /y "%XEngine_Lib32%\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" copy /y "%XEngine_Lib32%\XEngine_HelpComponents\HelpComponents_DataBase.dll" "./" copy /y "%XEngine_Lib32%\XEngine_HelpComponents\HelpComponents_XLog.dll" "./" copy /y "%XEngine_Lib32%\XEngine_RfcComponents\RfcComponents_HttpProtocol.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_RfcComponents\RfcComponents_NatProtocol.dll" "./" copy /y "%XEngine_Lib32%\XEngine_AVCodec\XEngine_AVHelp.dll" "./" copy /y "%XEngine_Lib32%\XEngine_AVCodec\XEngine_VideoCodec.dll" "./" diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_Machine.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_Machine.cpp index cd1cd86..ecdbf98 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_Machine.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_Machine.cpp @@ -62,6 +62,25 @@ bool HTTPTask_TastPost_Machine(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求删除一条信息收集数据成功,机器名:%s,机器编码:%s"), lpszClientAddr, st_MachineInfo.tszMachineName, st_MachineInfo.tszMachineCode); } + else if (2 == nType) + { + if (!ModuleDatabase_Machine_Query(&st_MachineInfo)) + { + ModuleProtocol_Packet_Common(tszRVBuffer, &nRVLen, 400, _X("query is failed")); + HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求的信息收集操作插入失败,错误:%lX"), lpszClientAddr, ModuleDB_GetLastError()); + return false; + } + int nListCount = 1; + XENGINE_MACHINEINFO** ppSt_MachineInfo; + BaseLib_OperatorMemory_Malloc((XPPPMEM)&ppSt_MachineInfo, nListCount, sizeof(XENGINE_MACHINEINFO)); + ModuleProtocol_Packet_Machine(tszRVBuffer, &nRVLen, &ppSt_MachineInfo, nListCount); + HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_MachineInfo, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求获取机器信息成功,服务名称:%s,机器编号:%s"), lpszClientAddr, st_MachineInfo.tszServiceName, st_MachineInfo.tszMachineCode); + } else { int nListCount = 0; -- Gitee From 6d23044b086c7109c9d79012ac02fef8262e8c1f Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 7 May 2024 16:50:09 +0800 Subject: [PATCH 08/24] fixed:set rfc handle of callback is incorrect --- .../XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp index bb1d68a..561fc36 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp @@ -329,7 +329,7 @@ int main(int argc, char** argv) goto XENGINE_SERVICEAPP_EXIT; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动RFC网络服务器成功,RFC端口:%d,IO:%d"), st_ServiceConfig.nRFCPort, st_ServiceConfig.st_XMax.nIOThread); - NetCore_UDPXCore_RegisterCallBackEx(xhHTTPSocket, Network_Callback_RFCRecv); + NetCore_UDPXCore_RegisterCallBackEx(xhRFCSocket, Network_Callback_RFCRecv); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,注册RFC网络事件成功")); } else -- Gitee From e6be8f6c8054f30a01781d937c39541928aac468 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 7 May 2024 17:08:53 +0800 Subject: [PATCH 09/24] fixed:query info is incorrect for machine --- .../ModuleDatabase_Machine.cpp | 16 ++++++++++------ .../XEngine_TaskPost/TaskPost_Machine.cpp | 2 ++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_Machine/ModuleDatabase_Machine.cpp b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_Machine/ModuleDatabase_Machine.cpp index c080f89..00e693a 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_Machine/ModuleDatabase_Machine.cpp +++ b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_Machine/ModuleDatabase_Machine.cpp @@ -172,27 +172,31 @@ bool CModuleDatabase_Machine::ModuleDatabase_Machine_Query(XENGINE_MACHINEINFO* } if (NULL != pptszResult[1]) { - _tcsxcpy(pSt_MachineInfo->tszMachineName, pptszResult[1]); + _tcsxcpy(pSt_MachineInfo->tszServiceName, pptszResult[1]); } if (NULL != pptszResult[2]) { - _tcsxcpy(pSt_MachineInfo->tszMachineCode, pptszResult[2]); + _tcsxcpy(pSt_MachineInfo->tszMachineName, pptszResult[2]); } if (NULL != pptszResult[3]) { - _tcsxcpy(pSt_MachineInfo->tszMachineSystem, pptszResult[3]); + _tcsxcpy(pSt_MachineInfo->tszMachineCode, pptszResult[3]); } if (NULL != pptszResult[4]) { - _tcsxcpy(pSt_MachineInfo->tszMachineText, pptszResult[4]); + _tcsxcpy(pSt_MachineInfo->tszMachineSystem, pptszResult[4]); } if (NULL != pptszResult[5]) { - pSt_MachineInfo->nTimeNumber = _ttxoll(pptszResult[5]); + _tcsxcpy(pSt_MachineInfo->tszMachineText, pptszResult[5]); } if (NULL != pptszResult[6]) { - _tcsxcpy(pSt_MachineInfo->tszCreateTime, pptszResult[6]); + pSt_MachineInfo->nTimeNumber = _ttxoll(pptszResult[6]); + } + if (NULL != pptszResult[7]) + { + _tcsxcpy(pSt_MachineInfo->tszCreateTime, pptszResult[7]); } } DataBase_MySQL_FreeResult(xhDBSQL, xhTable); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_Machine.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_Machine.cpp index ecdbf98..10d6051 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_Machine.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskPost/TaskPost_Machine.cpp @@ -75,6 +75,8 @@ bool HTTPTask_TastPost_Machine(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in int nListCount = 1; XENGINE_MACHINEINFO** ppSt_MachineInfo; BaseLib_OperatorMemory_Malloc((XPPPMEM)&ppSt_MachineInfo, nListCount, sizeof(XENGINE_MACHINEINFO)); + (*ppSt_MachineInfo)[0] = st_MachineInfo; + ModuleProtocol_Packet_Machine(tszRVBuffer, &nRVLen, &ppSt_MachineInfo, nListCount); HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); -- Gitee From c9e481241d4c918ed2a94093ca1d2da4babd8cb6 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 8 May 2024 11:24:10 +0800 Subject: [PATCH 10/24] added:stun code file fixed:Determine that the stun protocol is not handled correctly --- .../XEngine_HttpApp/XEngine_Network.cpp | 2 +- .../XEngine_TaskRfc/RFCTask_Stun.cpp | 58 +++++++++++++++++++ .../XEngine_TaskRfc/RFCTask_Stun.h | 3 + 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.cpp create mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.h diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp index 218683a..db30b10 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp @@ -39,7 +39,7 @@ void CALLBACK Network_Callback_HTTPHeart(LPCXSTR lpszClientAddr, XSOCKET hSocket //////////////////////////////////////////////////////////////////////////RFC相关 void CALLBACK Network_Callback_RFCRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszMSGBuffer, int nMSGLen, XPVOID lParam) { - if (nMSGLen >= 20 && (lpszMSGBuffer[0] & 0xC0) == 0x00 && lpszMSGBuffer[4] == 0x21 && lpszMSGBuffer[5] == 0x12 && lpszMSGBuffer[6] == 0xA4 && lpszMSGBuffer[7] == 0x42) + if ((nMSGLen >= 20) && ((lpszMSGBuffer[0] & 0xC0) == 0x00) && (lpszMSGBuffer[4] == 0x21) && (lpszMSGBuffer[5] == 0x12) && ((XBYTE)lpszMSGBuffer[6] == 0xA4) && (lpszMSGBuffer[7] == 0x42)) { //STUN消息的类型字段(前两位为00)以及魔术cookie字段 RFCTask_Stun_Parse(lpszClientAddr, lpszMSGBuffer, nMSGLen); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.cpp new file mode 100644 index 0000000..b6332a1 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.cpp @@ -0,0 +1,58 @@ +#include "../XEngine_Hdr.h" + +bool RFCTask_Stun_Parse(LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGLen) +{ + int nRVLen = 0; + int nSDLen = 0; + XCHAR tszRVBuffer[4096] = {}; + XCHAR tszSDBuffer[4096] = {}; + + int nListCount = 0; + RFCCOMPONENTS_NATATTR** ppSt_ListAttr; + RFCCOMPONENTS_NATSTUN st_NatClient = {}; + + if (!NatProtocol_StunNat_Parse(lpszMSGBuffer, nMSGLen, &st_NatClient, &ppSt_ListAttr, &nListCount)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RFC客户端:%s,发送不正确的STUN协议给服务器,不做处理"), lpszClientAddr); + return false; + } + if (RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_CLASS_REQUEST == st_NatClient.wOPClass && RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_MAPPED_ADDRESS == st_NatClient.wOPMethod) + { + int nIPPort = 0; + int nXLen = 0; + int nDLen = 0; + int nNLen = 0; + int nHLen = 0; + XCHAR tszIPAddr[128] = {}; + _tcsxcpy(tszIPAddr, lpszClientAddr); + BaseLib_OperatorIPAddr_SegAddr(tszIPAddr, &nIPPort); + + NatProtocol_StunNat_BuildMapAddress(tszRVBuffer, &nXLen, tszIPAddr, nIPPort, true); + nRVLen += nXLen; + NatProtocol_StunNat_BuildMapAddress(tszRVBuffer + nRVLen, &nDLen, tszIPAddr, nIPPort, false); + nRVLen += nDLen; +#if (XENGINE_VERSION_KERNEL >= 8) && (XENGINE_VERSION_MAIN >= 31) + int nOLen = 0; + NatProtocol_StunNat_BuildOriginAddress(tszRVBuffer + nRVLen, &nOLen, st_ServiceConfig.tszIPAddr, st_ServiceConfig.nRFCPort); + nRVLen += nOLen; +#endif + NatProtocol_StunNat_BuildAttr(tszRVBuffer + nRVLen, &nNLen, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_SERVERNAME, XENGINE_NAME_STR, _tcsxlen(XENGINE_NAME_STR)); + nRVLen += nNLen; + nSDLen = nRVLen; + NatProtocol_StunNat_Packet(tszSDBuffer, &nSDLen, (LPCXSTR)st_NatClient.byTokenStr, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_CLASS_RESPONSE, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_MAPPED_ADDRESS, tszRVBuffer); + NetCore_UDPXCore_SendEx(xhRFCSocket, lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RFC客户端:%s,发送STUN映射请求给服务器,处理成功"), lpszClientAddr); + } + else + { +#if (XENGINE_VERSION_KERNEL >= 8) && (XENGINE_VERSION_MAIN >= 31) + NatProtocol_StunNat_BuildError(tszRVBuffer, &nRVLen, _X("bad request or not support")); + nSDLen = nRVLen; + NatProtocol_StunNat_Packet(tszSDBuffer, &nSDLen, (LPCXSTR)st_NatClient.byTokenStr, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_CLASS_ERROR, 1, tszRVBuffer); + NetCore_UDPXCore_SendEx(xhRFCSocket, lpszClientAddr, tszSDBuffer, nSDLen); +#endif + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RFC客户端:%s,发送不正确的STUN协议给服务器,类型类型:%d-%d,不做处理"), lpszClientAddr, st_NatClient.wOPClass, st_NatClient.wOPMethod); + return false; + } + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.h new file mode 100644 index 0000000..7e0bdfc --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.h @@ -0,0 +1,3 @@ +#pragma once + +bool RFCTask_Stun_Parse(LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGLen); \ No newline at end of file -- Gitee From b219b52f19ca49a1c7003419d4792f584d6aa239 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 8 May 2024 11:38:10 +0800 Subject: [PATCH 11/24] added:info report supported --- XEngine_Source/XEngine_Depend | 2 +- .../ModuleConfig_Define.h | 6 ++++++ .../ModuleConfig_Error.h | 1 + .../ModuleConfigure_Json.cpp | 12 ++++++++++++ .../XEngine_HttpApp/XEngine_Hdr.h | 6 ++++++ .../XEngine_HttpApp/XEngine_HttpApp.cpp | 17 +++++++++++++++++ 6 files changed, 43 insertions(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_Depend b/XEngine_Source/XEngine_Depend index eff2078..adf0616 160000 --- a/XEngine_Source/XEngine_Depend +++ b/XEngine_Source/XEngine_Depend @@ -1 +1 @@ -Subproject commit eff207853feeb6b9adf6fb282e456a44ff50242e +Subproject commit adf061695f1c6a79fda9feda118c2fdd9efce8f1 diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h index 6e7c389..fcb0444 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h @@ -95,6 +95,12 @@ typedef struct bool bDeamon; }st_VerSwitch; }st_XVerifcation; + struct + { + bool bEnable; + XCHAR tszAPIUrl[MAX_PATH]; + XCHAR tszServiceName[128]; + }st_XReport; struct { list* pStl_ListVer; diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h index 252bfa0..b3f1c0c 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h @@ -24,6 +24,7 @@ #define ERROR_MODULE_CONFIGURE_JSON_XCONFIG 0xA000C //配置文件配置加载失败 #define ERROR_MODULE_CONFIGURE_JSON_XSLINK 0xA000D //短连接配置错误 #define ERROR_MODULE_CONFIGURE_JSON_XVERICATION 0xA000E //验证配置错误 +#define ERROR_MODULE_CONFIGURE_JSON_XREPORT 0xA000F //报告配置错误 ////////////////////////////////////////////////////////////////////////// #define ERROR_MODULE_CONFIGURE_FILE_PARAMENT 0xA1001 //参数错误 #define ERROR_MODULE_CONFIGURE_FILE_OPENFILE 0xA1002 //打开文件失败 diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index b081402..3a7a9bc 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -199,6 +199,18 @@ bool CModuleConfigure_Json::ModuleConfigure_Json_File(LPCXSTR lpszConfigFile, XE Json::Value st_JsonVerSwitch = st_JsonXVerifcation["st_VerSwitch"]; pSt_ServerConfig->st_XVerifcation.st_VerSwitch.bBackService = st_JsonVerSwitch["bBackService"].asBool(); pSt_ServerConfig->st_XVerifcation.st_VerSwitch.bDeamon = st_JsonVerSwitch["bDeamon"].asBool(); + + if (st_JsonRoot["XReport"].empty() || (3 != st_JsonRoot["XReport"].size())) + { + Config_IsErrorOccur = true; + Config_dwErrorCode = ERROR_MODULE_CONFIGURE_JSON_XREPORT; + return false; + } + Json::Value st_JsonXReport = st_JsonRoot["XReport"]; + + pSt_ServerConfig->st_XReport.bEnable = st_JsonXReport["bEnable"].asBool(); + _tcsxcpy(pSt_ServerConfig->st_XReport.tszAPIUrl, st_JsonXReport["tszAPIUrl"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XReport.tszServiceName, st_JsonXReport["tszServiceName"].asCString()); return true; } /******************************************************************** diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h index e50e9d1..42d0664 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h @@ -53,6 +53,8 @@ using namespace std; #include #include #include +#include "../../XEngine_Depend/XEngine_Module/XEngine_InfoReport/InfoReport_Define.h" +#include "../../XEngine_Depend/XEngine_Module/XEngine_InfoReport/InfoReport_Error.h" //加载项目相关头文件 #include "../../XEngine_BuildSwitch.h" #include "../../XEngine_UserProtocol.h" @@ -129,6 +131,7 @@ extern XENGINE_DEAMONAPPLIST st_DeamonAppConfig; #ifdef _MSC_BUILD #ifdef _WIN64 #ifdef _DEBUG +#pragma comment(lib,"../../x64/Debug/XEngine_InfoReport.lib") #pragma comment(lib,"../../x64/Debug/XEngine_ModuleConfigure.lib") #pragma comment(lib,"../../x64/Debug/XEngine_ModuleDatabase.lib") #pragma comment(lib,"../../x64/Debug/XEngine_ModuleProtocol.lib") @@ -136,6 +139,7 @@ extern XENGINE_DEAMONAPPLIST st_DeamonAppConfig; #pragma comment(lib,"../../x64/Debug/XEngine_ModuleHelp.lib") #pragma comment(lib,"../../x64/Debug/XEngine_ModulePlugin.lib") #else +#pragma comment(lib,"../../x64/Release/XEngine_InfoReport.lib") #pragma comment(lib,"../../x64/Release/XEngine_ModuleConfigure.lib") #pragma comment(lib,"../../x64/Release/XEngine_ModuleDatabase.lib") #pragma comment(lib,"../../x64/Release/XEngine_ModuleProtocol.lib") @@ -145,6 +149,7 @@ extern XENGINE_DEAMONAPPLIST st_DeamonAppConfig; #endif #else #ifdef _DEBUG +#pragma comment(lib,"../../Debug/XEngine_InfoReport.lib") #pragma comment(lib,"../../Debug/XEngine_ModuleConfigure.lib") #pragma comment(lib,"../../Debug/XEngine_ModuleDatabase.lib") #pragma comment(lib,"../../Debug/XEngine_ModuleProtocol.lib") @@ -152,6 +157,7 @@ extern XENGINE_DEAMONAPPLIST st_DeamonAppConfig; #pragma comment(lib,"../../Debug/XEngine_ModuleHelp.lib") #pragma comment(lib,"../../Debug/XEngine_ModulePlugin.lib") #else +#pragma comment(lib,"../../Release/XEngine_InfoReport.lib") #pragma comment(lib,"../../Release/XEngine_ModuleConfigure.lib") #pragma comment(lib,"../../Release/XEngine_ModuleDatabase.lib") #pragma comment(lib,"../../Release/XEngine_ModuleProtocol.lib") diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp index 561fc36..b07327e 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp @@ -427,6 +427,23 @@ int main(int argc, char** argv) //展示能力 XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,加载的Lib插件:%d 个,Lua插件:%d 个"), st_PluginLibConfig.pStl_ListPlugin->size(), st_PluginLuaConfig.pStl_ListPlugin->size()); + //发送信息报告 + if (st_ServiceConfig.st_XReport.bEnable) + { + if (InfoReport_APIMachine_Send(st_ServiceConfig.st_XReport.tszAPIUrl, st_ServiceConfig.st_XReport.tszServiceName)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动信息报告给API服务器:%s 成功"), st_ServiceConfig.st_XReport.tszAPIUrl); + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动信息报告给API服务器:%s 失败,错误:%lX"), st_ServiceConfig.st_XReport.tszAPIUrl, InfoReport_GetLastError()); + } + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,信息报告给API服务器没有启用")); + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("所有服务成功启动,服务运行中,XEngine版本:%s%s,发行版本次数:%d,当前版本:%s。。。"), BaseLib_OperatorVer_XNumberStr(), BaseLib_OperatorVer_XTypeStr(), st_ServiceConfig.st_XVer.pStl_ListVer->size(), st_ServiceConfig.st_XVer.pStl_ListVer->front().c_str()); while (true) { -- Gitee From 5a7140fe36c29ff8efe40ea06801532289502417 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 8 May 2024 14:20:26 +0800 Subject: [PATCH 12/24] added:NTP time sync protocol supported --- XEngine_Source/VSCopy-Debug.bat | 1 + XEngine_Source/VSCopy-x64.bat | 1 + XEngine_Source/VSCopy-x86.bat | 1 + .../XEngine_HttpApp/XEngine_Hdr.h | 4 ++++ .../XEngine_HttpApp/XEngine_HttpApp.vcxproj | 2 ++ .../XEngine_HttpApp.vcxproj.filters | 6 +++++ .../XEngine_HttpApp/XEngine_Network.cpp | 4 ++++ .../XEngine_TaskRfc/RFCTask_Ntp.cpp | 22 +++++++++++++++++++ .../XEngine_TaskRfc/RFCTask_Ntp.h | 3 +++ 9 files changed, 44 insertions(+) create mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.cpp create mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.h diff --git a/XEngine_Source/VSCopy-Debug.bat b/XEngine_Source/VSCopy-Debug.bat index e604c7e..6316112 100644 --- a/XEngine_Source/VSCopy-Debug.bat +++ b/XEngine_Source/VSCopy-Debug.bat @@ -15,6 +15,7 @@ copy /y "D:\XEngine\XEngine_SourceCode\Debug\HelpComponents_DataBase.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\HelpComponents_XLog.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\RfcComponents_HttpProtocol.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\RfcComponents_NatProtocol.dll" "./" +copy /y "D:\XEngine\XEngine_SourceCode\Debug\RfcComponents_NTPProtocol.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\XEngine_AVHelp.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\XEngine_VideoCodec.dll" "./" diff --git a/XEngine_Source/VSCopy-x64.bat b/XEngine_Source/VSCopy-x64.bat index 586f199..3403082 100644 --- a/XEngine_Source/VSCopy-x64.bat +++ b/XEngine_Source/VSCopy-x64.bat @@ -15,6 +15,7 @@ copy /y "%XEngine_Lib64%\XEngine_HelpComponents\HelpComponents_DataBase.dll" "./ copy /y "%XEngine_Lib64%\XEngine_HelpComponents\HelpComponents_XLog.dll" "./" copy /y "%XEngine_Lib64%\XEngine_RfcComponents\RfcComponents_HttpProtocol.dll" "./" copy /y "%XEngine_Lib64%\XEngine_RfcComponents\RfcComponents_NatProtocol.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_RfcComponents\RfcComponents_NTPProtocol.dll" "./" copy /y "%XEngine_Lib64%\XEngine_AVCodec\XEngine_AVHelp.dll" "./" copy /y "%XEngine_Lib64%\XEngine_AVCodec\XEngine_VideoCodec.dll" "./" diff --git a/XEngine_Source/VSCopy-x86.bat b/XEngine_Source/VSCopy-x86.bat index a2dd361..92a1953 100644 --- a/XEngine_Source/VSCopy-x86.bat +++ b/XEngine_Source/VSCopy-x86.bat @@ -15,6 +15,7 @@ copy /y "%XEngine_Lib32%\XEngine_HelpComponents\HelpComponents_DataBase.dll" "./ copy /y "%XEngine_Lib32%\XEngine_HelpComponents\HelpComponents_XLog.dll" "./" copy /y "%XEngine_Lib32%\XEngine_RfcComponents\RfcComponents_HttpProtocol.dll" "./" copy /y "%XEngine_Lib32%\XEngine_RfcComponents\RfcComponents_NatProtocol.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_RfcComponents\RfcComponents_NTPProtocol.dll" "./" copy /y "%XEngine_Lib32%\XEngine_AVCodec\XEngine_AVHelp.dll" "./" copy /y "%XEngine_Lib32%\XEngine_AVCodec\XEngine_VideoCodec.dll" "./" diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h index 42d0664..50874e6 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h @@ -42,6 +42,8 @@ using namespace std; #include #include #include +#include +#include #include #include #include @@ -98,6 +100,7 @@ using namespace std; #include "XEngine_TaskGet/TaskGet_IDRegion.h" //rfc #include "XEngine_TaskRfc/RFCTask_Stun.h" +#include "XEngine_TaskRfc/RFCTask_Ntp.h" /******************************************************************** // Created: 2022/01/20 14:42:06 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ServiceApp\XEngine_HttpApp\XEngine_Hdr.h @@ -175,6 +178,7 @@ extern XENGINE_DEAMONAPPLIST st_DeamonAppConfig; #pragma comment(lib,"XEngine_HelpComponents/HelpComponents_XLog.lib") #pragma comment(lib,"XEngine_RfcComponents/RfcComponents_HttpProtocol.lib") #pragma comment(lib,"XEngine_RfcComponents/RfcComponents_NatProtocol.lib") +#pragma comment(lib,"XEngine_RfcComponents/RfcComponents_NTPProtocol.lib") #pragma comment(lib,"XEngine_SystemSdk/XEngine_SystemApi") #pragma comment(lib,"XEngine_AVCodec/XEngine_AVCollect.lib") #pragma comment(lib,"XEngine_AVCodec/XEngine_VideoCodec.lib") diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj index 0de009f..a3ad302 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj @@ -177,6 +177,7 @@ + @@ -204,6 +205,7 @@ + diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters index 4cb7740..9715feb 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters @@ -108,6 +108,9 @@ 源文件\XEngine_TaskRfc + + 源文件\XEngine_TaskRfc + @@ -185,5 +188,8 @@ 头文件\XEngine_TaskRfc + + 头文件\XEngine_TaskRfc + \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp index db30b10..62c20db 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Network.cpp @@ -44,6 +44,10 @@ void CALLBACK Network_Callback_RFCRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, //STUN消息的类型字段(前两位为00)以及魔术cookie字段 RFCTask_Stun_Parse(lpszClientAddr, lpszMSGBuffer, nMSGLen); } + else if (nMSGLen == 48) + { + RFCTask_NTP_Parse(lpszClientAddr, lpszMSGBuffer, nMSGLen); + } } //////////////////////////////////////////////////////////////////////////网络IO关闭操作 void XEngine_Network_Close(LPCXSTR lpszClientAddr, bool bHeart) diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.cpp new file mode 100644 index 0000000..144a159 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.cpp @@ -0,0 +1,22 @@ +#include "../XEngine_Hdr.h" + +bool RFCTask_NTP_Parse(LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGLen) +{ + int nSDLen = 0; + XCHAR tszSDBuffer[4096] = {}; + NTPPROTOCOL_TIMEINFO st_TimeRecv = {}; + NTPPROTOCOL_TIMEINFO st_TimeTras = {}; + +#if (XENGINE_VERSION_KERNEL >= 8) && (XENGINE_VERSION_MAIN >= 31) + NTPProtocol_Packet_TimeConvert(&st_TimeRecv); + + NTPProtocol_Parse_Header(lpszMSGBuffer, nMSGLen, NULL, NULL, NULL, &st_TimeTras); + NTPProtocol_Packet_REPHeader(tszSDBuffer, &nSDLen, NULL, &st_TimeRecv, &st_TimeTras, st_ServiceConfig.tszIPAddr); + NetCore_UDPXCore_SendEx(xhRFCSocket, lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RFC客户端:%s,发送NTP时间同步请求给服务器,处理成功"), lpszClientAddr); +#else + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("RFC客户端:%s,发送NTP时间同步请求给服务器,处理失败,版本不支持"), lpszClientAddr); +#endif + + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.h new file mode 100644 index 0000000..962968a --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.h @@ -0,0 +1,3 @@ +#pragma once + +bool RFCTask_NTP_Parse(LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGLen); \ No newline at end of file -- Gitee From 54d7d329dacb23550e2bb6f486b6909848918cc8 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 8 May 2024 15:38:03 +0800 Subject: [PATCH 13/24] added:oil query price supported --- .../XEngine_ModuleDatabase/ModuleDB_Define.h | 56 ++++++++++++++++++- .../XEngine_ModuleDatabase.def | 7 ++- .../XEngine_ModuleDatabase.vcxproj | 4 +- .../XEngine_ModuleDatabase.vcxproj.filters | 12 ++++ XEngine_Source/XEngine_ModuleDatabase/pch.cpp | 21 +++++++ .../ModuleProtocol_Define.h | 24 ++++++++ .../ModuleProtocol_Packet.cpp | 56 +++++++++++++++++++ .../ModuleProtocol_Packet.h | 1 + .../XEngine_ModuleProtocol.def | 1 + .../XEngine_ModuleProtocol.vcxproj | 2 +- XEngine_Source/XEngine_ModuleProtocol/pch.cpp | 4 ++ .../XEngine_HttpApp/XEngine_HTTPTask.cpp | 9 +++ .../XEngine_HttpApp/XEngine_Hdr.h | 1 + .../XEngine_HttpApp/XEngine_HttpApp.cpp | 8 +++ .../XEngine_HttpApp/XEngine_HttpApp.vcxproj | 2 + .../XEngine_HttpApp.vcxproj.filters | 6 ++ XEngine_Source/XEngine_UserProtocol.h | 13 +++++ 17 files changed, 223 insertions(+), 4 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleDatabase/ModuleDB_Define.h b/XEngine_Source/XEngine_ModuleDatabase/ModuleDB_Define.h index ce8fb31..98f56ce 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/ModuleDB_Define.h +++ b/XEngine_Source/XEngine_ModuleDatabase/ModuleDB_Define.h @@ -567,4 +567,58 @@ extern "C" bool ModuleDatabase_Machine_UPDate(XENGINE_MACHINEINFO* pSt_MachineIn 意思:是否成功 备注: *********************************************************************/ -extern "C" bool ModuleDatabase_Machine_List(XENGINE_MACHINEINFO*** pppSt_MachineInfo, int* pInt_ListCount); \ No newline at end of file +extern "C" bool ModuleDatabase_Machine_List(XENGINE_MACHINEINFO*** pppSt_MachineInfo, int* pInt_ListCount); +/************************************************************************/ +/* 导出的油价查询数据库函数 */ +/************************************************************************/ +/******************************************************************** +函数名称:ModuleDatabase_OilInfo_Init +函数功能:初始化数据库 + 参数.一:pSt_DBConnector + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:数据数据库信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleDatabase_OilInfo_Init(DATABASE_MYSQL_CONNECTINFO* pSt_DBConnector); +/******************************************************************** +函数名称:ModuleDatabase_OilInfo_Destory +函数功能:销毁 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleDatabase_OilInfo_Destory(); +/******************************************************************** +函数名称:ModuleDatabase_OilInfo_Query +函数功能:查询数据 + 参数.一:pSt_OilInfo + In/Out:In/Out + 类型:数据结构指针 + 可空:N + 意思:输入查询的信息,输出完整的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleDatabase_OilInfo_Query(XENGINE_OILINFO* pSt_OilInfo); +/******************************************************************** +函数名称:ModuleDatabase_OilInfo_UPDate +函数功能:更新数据 + 参数.一:pSt_OilInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要更新的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleDatabase_OilInfo_UPDate(XENGINE_OILINFO* pSt_OilInfo); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.def b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.def index 13d23fd..81db5a9 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.def +++ b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.def @@ -45,4 +45,9 @@ EXPORTS ModuleDatabase_Machine_Query ModuleDatabase_Machine_Delete ModuleDatabase_Machine_UPDate - ModuleDatabase_Machine_List \ No newline at end of file + ModuleDatabase_Machine_List + + ModuleDatabase_OilInfo_Init + ModuleDatabase_OilInfo_Destory + ModuleDatabase_OilInfo_Query + ModuleDatabase_OilInfo_UPDate \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj index fd2d41c..b084fa6 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj +++ b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj @@ -72,7 +72,7 @@ true - $(XEngine_Include);$(IncludePath) + $(XEngine_Include);..\XEngine_ModuleDatabase;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) @@ -167,6 +167,7 @@ + @@ -180,6 +181,7 @@ + diff --git a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj.filters b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj.filters index 73aa4f7..5dc24f9 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj.filters +++ b/XEngine_Source/XEngine_ModuleDatabase/XEngine_ModuleDatabase.vcxproj.filters @@ -55,6 +55,12 @@ {9c9f01db-e8c6-4abb-a375-23d8e78bb1ea} + + {84bbe555-9f72-42dc-b580-e35766b8efb6} + + + {12427cf9-268d-4da5-841c-1da780846d6c} + @@ -90,6 +96,9 @@ 头文件\ModuleDatabase_Machine + + 头文件\ModuleDatabase_OilInfo + @@ -119,6 +128,9 @@ 源文件\ModuleDatabase_Machine + + 源文件\ModuleDatabase_OilInfo + diff --git a/XEngine_Source/XEngine_ModuleDatabase/pch.cpp b/XEngine_Source/XEngine_ModuleDatabase/pch.cpp index 47afa7b..77c8d9e 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/pch.cpp +++ b/XEngine_Source/XEngine_ModuleDatabase/pch.cpp @@ -6,6 +6,7 @@ #include "ModuleDatabase_ShortLink/ModuleDatabase_ShortLink.h" #include "ModuleDatabase_WordFilter/ModuleDatabase_WordFilter.h" #include "ModuleDatabase_Machine/ModuleDatabase_Machine.h" +#include "ModuleDatabase_OilInfo/ModuleDatabase_OilInfo.h" /******************************************************************** // Created: 2022/02/28 13:26:15 // File Name: D:\XEngine_IPInfo\XEngine_Source\XEngine_ModuleDatabase\pch.cpp @@ -27,6 +28,7 @@ CModuleDatabase_XLog m_XLog; CModuleDatabase_ShortLink m_ShortLink; CModuleDatabase_WordFilter m_WordFilter; CModuleDatabase_Machine m_MachineInfo; +CModuleDatabase_OilInfo m_OilInfo; ////////////////////////////////////////////////////////////////////////// /// 导出的函数 ////////////////////////////////////////////////////////////////////////// @@ -206,4 +208,23 @@ extern "C" bool ModuleDatabase_Machine_UPDate(XENGINE_MACHINEINFO * pSt_MachineI extern "C" bool ModuleDatabase_Machine_List(XENGINE_MACHINEINFO * **pppSt_MachineInfo, int* pInt_ListCount) { return m_MachineInfo.ModuleDatabase_Machine_List(pppSt_MachineInfo, pInt_ListCount); +} +/************************************************************************/ +/* 导出的油价查询数据库函数 */ +/************************************************************************/ +extern "C" bool ModuleDatabase_OilInfo_Init(DATABASE_MYSQL_CONNECTINFO * pSt_DBConnector) +{ + return m_OilInfo.ModuleDatabase_OilInfo_Init(pSt_DBConnector); +} +extern "C" bool ModuleDatabase_OilInfo_Destory() +{ + return m_OilInfo.ModuleDatabase_OilInfo_Destory(); +} +extern "C" bool ModuleDatabase_OilInfo_Query(XENGINE_OILINFO * pSt_OilInfo) +{ + return m_OilInfo.ModuleDatabase_OilInfo_Query(pSt_OilInfo); +} +extern "C" bool ModuleDatabase_OilInfo_UPDate(XENGINE_OILINFO * pSt_OilInfo) +{ + return m_OilInfo.ModuleDatabase_OilInfo_UPDate(pSt_OilInfo); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h index 5ca3a3a..fc377ac 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h @@ -761,6 +761,30 @@ extern "C" bool ModuleProtocol_Packet_SoftWare(XCHAR* ptszSWInfo, int* pInt_Len) 备注: *********************************************************************/ extern "C" bool ModuleProtocol_Packet_Machine(XCHAR* ptszMSGBuffer, int* pInt_MSGLen, XENGINE_MACHINEINFO*** pppSt_MachineList, int nListCount); +/******************************************************************** +函数名称:ModuleProtocol_Packet_OilInfo +函数功能:油价信息打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出打包的数据信息 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出打包大小 + 参数.三:pSt_OilInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要打包的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool ModuleProtocol_Packet_OilInfo(XCHAR* ptszMSGBuffer, int* pInt_MSGLen, XENGINE_OILINFO* pSt_OilInfo); /************************************************************************/ /* 导出的协议解析函数 */ /************************************************************************/ diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp index bd1861a..2e1262b 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp @@ -1547,6 +1547,62 @@ bool CModuleProtocol_Packet::ModuleProtocol_Packet_Machine(XCHAR* ptszMSGBuffer, return true; } /******************************************************************** +函数名称:ModuleProtocol_Packet_OilInfo +函数功能:油价信息打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出打包的数据信息 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出打包大小 + 参数.三:pSt_OilInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要打包的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleProtocol_Packet::ModuleProtocol_Packet_OilInfo(XCHAR* ptszMSGBuffer, int* pInt_MSGLen, XENGINE_OILINFO* pSt_OilInfo) +{ + ModuleProtocol_IsErrorOccur = false; + + if ((NULL == ptszMSGBuffer) || (NULL == pInt_MSGLen)) + { + ModuleProtocol_IsErrorOccur = true; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PACKET_PARAMENT; + return false; + } + Json::Value st_JsonRoot; + Json::Value st_JsonObject; + Json::StreamWriterBuilder st_JsonBuilder; + + st_JsonObject["tszCityStr"] = pSt_OilInfo->tszCityStr; + st_JsonObject["dlValue0"] = pSt_OilInfo->dlValue0; + st_JsonObject["dlValue10"] = pSt_OilInfo->dlValue10; + st_JsonObject["dlValue20"] = pSt_OilInfo->dlValue20; + st_JsonObject["dlValue35"] = pSt_OilInfo->dlValue35; + st_JsonObject["dlValue92"] = pSt_OilInfo->dlValue92; + st_JsonObject["dlValue95"] = pSt_OilInfo->dlValue95; + st_JsonObject["dlValue98"] = pSt_OilInfo->dlValue98; + st_JsonObject["tszUPTime"] = pSt_OilInfo->tszUPTime; + + st_JsonRoot["code"] = 0; + st_JsonRoot["msg"] = "success"; + st_JsonRoot["data"] = st_JsonObject; + st_JsonBuilder["emitUTF8"] = true; + + *pInt_MSGLen = Json::writeString(st_JsonBuilder, st_JsonRoot).length(); + memcpy(ptszMSGBuffer, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), *pInt_MSGLen); + return true; +} +/******************************************************************** 函数名称:ModuleProtocol_Packet_P2PLan 函数功能:响应同步局域网地址列表 参数.一:ptszMsgBuffer diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h index 840245d..f1bab71 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h @@ -44,6 +44,7 @@ public: bool ModuleProtocol_Packet_HardWare(XCHAR* ptszHWInfo, int* pInt_Len); bool ModuleProtocol_Packet_SoftWare(XCHAR* ptszSWInfo, int* pInt_Len); bool ModuleProtocol_Packet_Machine(XCHAR* ptszMSGBuffer, int* pInt_MSGLen, XENGINE_MACHINEINFO*** pppSt_MachineList, int nListCount); + bool ModuleProtocol_Packet_OilInfo(XCHAR* ptszMSGBuffer, int* pInt_MSGLen, XENGINE_OILINFO* pSt_OilInfo); public: bool ModuleProtocol_Packet_P2PLan(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL*** pppSt_ListClients, int nListCount); bool ModuleProtocol_Packet_P2PWLan(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, list* pStl_ListClients); diff --git a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def index 56d69e6..ba06b87 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def +++ b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def @@ -25,6 +25,7 @@ EXPORTS ModuleProtocol_Packet_HardWare ModuleProtocol_Packet_SoftWare ModuleProtocol_Packet_Machine + ModuleProtocol_Packet_OilInfo ModuleProtocol_Packet_P2PLan ModuleProtocol_Packet_P2PWLan ModuleProtocol_Packet_P2PWList diff --git a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj index 63bf890..114f439 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj +++ b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj @@ -72,7 +72,7 @@ true - $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;..\XEngine_ModuleProtocol;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) diff --git a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp index b6a02ae..d0635e1 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp @@ -119,6 +119,10 @@ extern "C" bool ModuleProtocol_Packet_Machine(XCHAR * ptszMSGBuffer, int* pInt_M { return m_ProtocolPacket.ModuleProtocol_Packet_Machine(ptszMSGBuffer, pInt_MSGLen, pppSt_MachineList, nListCount); } +extern "C" bool ModuleProtocol_Packet_OilInfo(XCHAR * ptszMSGBuffer, int* pInt_MSGLen, XENGINE_OILINFO * pSt_OilInfo) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_OilInfo(ptszMSGBuffer, pInt_MSGLen, pSt_OilInfo); +} extern "C" bool ModuleProtocol_Packet_P2PLan(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL * **pppSt_ListClients, int nListCount) { return m_ProtocolPacket.ModuleProtocol_Packet_P2PLan(ptszMsgBuffer, pInt_MsgLen, pppSt_ListClients, nListCount); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp index 7f6ce04..ad1a7ad 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp @@ -113,6 +113,7 @@ bool HTTPTask_TastPost_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST LPCXSTR lpszParamReload = _X("reload"); LPCXSTR lpszParamWeather = _X("weather"); LPCXSTR lpszParamRegion = _X("region"); + LPCXSTR lpszParamOil = _X("oil"); //post LPCXSTR lpszParamP2PClient = _X("p2p"); LPCXSTR lpszParamZIPCode = _X("zipcode"); @@ -436,6 +437,14 @@ bool HTTPTask_TastPost_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCXST } } } + else if (0 == _tcsxnicmp(lpszParamOil, tszValue, _tcsxlen(lpszParamOil))) + { + //油价:http://127.0.0.1:5501/api?function=oil¶m=地区 + memset(tszValue, '\0', sizeof(tszValue)); + + BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); + HTTPTask_TaskGet_Oil(lpszClientAddr, tszValue); + } else { st_HDRParam.nHttpCode = 404; diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h index 50874e6..aeb717b 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h @@ -98,6 +98,7 @@ using namespace std; #include "XEngine_TaskGet/TaskGet_Reload.h" #include "XEngine_TaskGet/TaskGet_Weather.h" #include "XEngine_TaskGet/TaskGet_IDRegion.h" +#include "XEngine_TaskGet/TaskGet_Oil.h" //rfc #include "XEngine_TaskRfc/RFCTask_Stun.h" #include "XEngine_TaskRfc/RFCTask_Ntp.h" diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp index b07327e..7e2157d 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp @@ -47,6 +47,7 @@ void ServiceApp_Stop(int signo) ModuleDatabase_ShortLink_Destory(); ModuleDatabase_WordFilter_Destory(); ModuleDatabase_Machine_Destory(); + ModuleDatabase_OilInfo_Destory(); //销毁其他 ModulePlugin_Loader_Destory(); ModuleHelp_P2PClient_Destory(); @@ -255,6 +256,12 @@ int main(int argc, char** argv) goto XENGINE_SERVICEAPP_EXIT; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化信息收集数据库成功")); + if (!ModuleDatabase_OilInfo_Init((DATABASE_MYSQL_CONNECTINFO*)&st_ServiceConfig.st_XSql)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化油价查询数据库失败,错误:%lX"), ModuleDB_GetLastError()); + goto XENGINE_SERVICEAPP_EXIT; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化油价查询数据库成功")); } else { @@ -469,6 +476,7 @@ XENGINE_SERVICEAPP_EXIT: ModuleDatabase_ShortLink_Destory(); ModuleDatabase_WordFilter_Destory(); ModuleDatabase_Machine_Destory(); + ModuleDatabase_OilInfo_Destory(); //销毁其他 ModulePlugin_Loader_Destory(); ModuleHelp_P2PClient_Destory(); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj index a3ad302..ba5d8bf 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj @@ -162,6 +162,7 @@ + @@ -190,6 +191,7 @@ + diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters index 9715feb..d0f4828 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters @@ -111,6 +111,9 @@ 源文件\XEngine_TaskRfc + + 源文件\XEngine_TaskGet + @@ -191,5 +194,8 @@ 头文件\XEngine_TaskRfc + + 头文件\XEngine_TaskGet + \ No newline at end of file diff --git a/XEngine_Source/XEngine_UserProtocol.h b/XEngine_Source/XEngine_UserProtocol.h index 61bfebe..7af0718 100644 --- a/XEngine_Source/XEngine_UserProtocol.h +++ b/XEngine_Source/XEngine_UserProtocol.h @@ -275,4 +275,17 @@ typedef struct int nTemperature; //温度 int nHumidity; //湿度 }XENGINE_WEATHERINFO; +//油价 +typedef struct +{ + XCHAR tszCityStr[64]; //省/自治区/直辖市 + double dlValue98; + double dlValue95; + double dlValue92; + double dlValue0; + double dlValue10; + double dlValue20; + double dlValue35; + XCHAR tszUPTime[64]; //更新时间 +}XENGINE_OILINFO; #pragma pack(pop) \ No newline at end of file -- Gitee From 0fbb9340760346e2caec2b740479b3d749c9849f Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 8 May 2024 15:40:08 +0800 Subject: [PATCH 14/24] update:configure file --- .../XEngine_Config/XEngine_Config.json | 27 +++++-------------- .../XEngine_Config/XEngine_VersionConfig.json | 24 +++++++++++++++++ 2 files changed, 30 insertions(+), 21 deletions(-) create mode 100644 XEngine_Release/XEngine_Config/XEngine_VersionConfig.json diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index ca2dcca..bb334a2 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -4,6 +4,7 @@ "bAutoStart":false, "bHideWnd":false, "nHttpPort":5501, + "nRFCPort":5502, "XMax":{ "nMaxClient":10000, "nMaxQueue":10000, @@ -61,25 +62,9 @@ "bDeamon":false } }, - "XVer":[ - "3.4.0.1001 Build20240411", - "3.3.0.1001 Build20240308", - "3.2.0.1001 Build20231229", - "3.1.0.1001 Build20231102", - "3.0.0.1001 Build20230908", - "2.11.0.1001 Build20230829", - "2.10.0.1001 Build20230810", - "2.9.0.1001 Build20230421", - "2.8.0.1001 Build20230207", - "2.7.0.1001 Build20230117", - "2.6.1.1001 Build20221213", - "2.6.0.1001 Build20221212", - "2.5.0.1001 Build20221102", - "2.4.0.1001 Build20220902", - "2.3.0.1001 Build20220723", - "2.2.0.1001 Build20220701", - "2.1.0.1001 Build20220429", - "1.1.0.1001 Build20220402", - "1.0.0.1001 Build20220311" - ] + "XReport":{ + "bEnable":true, + "tszAPIUrl":"http://app.xyry.org:5501/api?function=machine", + "tszServiceName":"XEngine_APIService" + } } \ No newline at end of file diff --git a/XEngine_Release/XEngine_Config/XEngine_VersionConfig.json b/XEngine_Release/XEngine_Config/XEngine_VersionConfig.json new file mode 100644 index 0000000..ce00d99 --- /dev/null +++ b/XEngine_Release/XEngine_Config/XEngine_VersionConfig.json @@ -0,0 +1,24 @@ +{ + "XVer":[ + "3.5.0.1001 Build20240508", + "3.4.0.1001 Build20240411", + "3.3.0.1001 Build20240308", + "3.2.0.1001 Build20231229", + "3.1.0.1001 Build20231102", + "3.0.0.1001 Build20230908", + "2.11.0.1001 Build20230829", + "2.10.0.1001 Build20230810", + "2.9.0.1001 Build20230421", + "2.8.0.1001 Build20230207", + "2.7.0.1001 Build20230117", + "2.6.1.1001 Build20221213", + "2.6.0.1001 Build20221212", + "2.5.0.1001 Build20221102", + "2.4.0.1001 Build20220902", + "2.3.0.1001 Build20220723", + "2.2.0.1001 Build20220701", + "2.1.0.1001 Build20220429", + "1.1.0.1001 Build20220402", + "1.0.0.1001 Build20220311" + ] +} \ No newline at end of file -- Gitee From fc81e98edef3eaeef428bfc7af23ab8b9c091d73 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 8 May 2024 15:53:44 +0800 Subject: [PATCH 15/24] fixed:linux and macos build error --- XEngine_Source/Makefile | 5 ++- .../XEngine_ModuleDatabase/Makefile | 4 +- .../XEngine_HttpApp/Makefile | 16 ++++++-- .../XEngine_TaskGet/TaskGet_Oil.cpp | 41 +++++++++++++++++++ .../XEngine_TaskGet/TaskGet_Oil.h | 3 ++ .../XEngine_TaskRfc/RFCTask_Ntp.cpp | 3 +- .../XEngine_TaskRfc/RFCTask_Stun.cpp | 1 - 7 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Oil.cpp create mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Oil.h diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index ecba64a..919d0bc 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -5,6 +5,7 @@ FLAGS= #要编译的模块 THIRDPART_MODULE_JSONCPP = ./XEngine_Depend/XEngine_Module/jsoncpp +THIRDPART_MODULE_REPORT = ./XEngine_Depend/XEngine_Module/XEngine_InfoReport MODULE_CONFIGURE_PATH = ./XEngine_ModuleConfigure MODULE_DATABASE_PATH = ./XEngine_ModuleDatabase @@ -24,7 +25,7 @@ PLUGIN_MODULE_IPADDR = ./XEngine_PluginModule/ModulePlugin_IPAddr APP_CENTER_PATH = ./XEngine_ServiceApp/XEngine_CenterApp APP_HTTP_PATH = ./XEngine_ServiceApp/XEngine_HttpApp -XENGINE_MODULES = libjsoncpp.so \ +XENGINE_MODULES = libjsoncpp.so libXEngine_InfoReport.so \ libXEngine_ModuleConfigure.so libXEngine_ModuleDatabase.so libXEngine_ModuleProtocol.so libXEngine_ModuleSystem.so libXEngine_ModuleHelp.so libXEngine_ModulePlugin.so \ libModulePlugin_Zodiac.so libModulePlugin_Password.so libModulePlugin_Timezone.so libModulePlugin_BMIndex.so libModulePlugin_Meter.so libModulePlugin_Phone.so libModulePlugin_IPAddr.so \ XEngine_HttpApp.exe @@ -34,6 +35,8 @@ MakeAll:$(XENGINE_MODULES) libjsoncpp.so: make -C $(THIRDPART_MODULE_JSONCPP) PLATFORM=$(PLATFORM) $(FLAGS) +libXEngine_InfoReport.so: + make -C $(THIRDPART_MODULE_REPORT) PLATFORM=$(PLATFORM) $(FLAGS) libXEngine_ModuleConfigure.so: make -C $(MODULE_CONFIGURE_PATH) PLATFORM=$(PLATFORM) $(FLAGS) diff --git a/XEngine_Source/XEngine_ModuleDatabase/Makefile b/XEngine_Source/XEngine_ModuleDatabase/Makefile index cd9c1e6..a108b31 100644 --- a/XEngine_Source/XEngine_ModuleDatabase/Makefile +++ b/XEngine_Source/XEngine_ModuleDatabase/Makefile @@ -10,7 +10,7 @@ LOADHDR = -I ./ LOADSO = LIB = -lXEngine_BaseLib -lHelpComponents_DataBase LIBEX = -OBJECTS = ModuleDatabase_IDCard.o ModuleDatabase_Bank.o ModuleDatabase_ZIPCode.o ModuleDatabase_XLog.o ModuleDatabase_ShortLink.o ModuleDatabase_WordFilter.o ModuleDatabase_Machine.o pch.o +OBJECTS = ModuleDatabase_IDCard.o ModuleDatabase_Bank.o ModuleDatabase_ZIPCode.o ModuleDatabase_XLog.o ModuleDatabase_ShortLink.o ModuleDatabase_WordFilter.o ModuleDatabase_Machine.o ModuleDatabase_OilInfo.o pch.o ifeq ($(RELEASE),1) FLAGS = -c @@ -66,6 +66,8 @@ ModuleDatabase_WordFilter.o:./ModuleDatabase_WordFilter/ModuleDatabase_WordFilte $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ModuleDatabase_WordFilter/ModuleDatabase_WordFilter.cpp ModuleDatabase_Machine.o:./ModuleDatabase_Machine/ModuleDatabase_Machine.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ModuleDatabase_Machine/ModuleDatabase_Machine.cpp +ModuleDatabase_OilInfo.o:./ModuleDatabase_OilInfo/ModuleDatabase_OilInfo.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./ModuleDatabase_OilInfo/ModuleDatabase_OilInfo.cpp pch.o:./pch.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile index d83a5cc..1b5d075 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile @@ -8,13 +8,14 @@ RELEASE = 0 UNICODE = 0 LOADHDR = -I ./ LOADSO = -L ../../XEngine_ModuleConfigure -L ../../XEngine_ModuleDatabase -L ../../XEngine_ModuleProtocol -L ../../XEngine_ModuleSystem -L ../../XEngine_ModuleHelp -L ../../XEngine_ModulePlugin \ - -L ../../XEngine_Depend/XEngine_Module/jsoncpp -LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXEngine_OPenSsl -lXClient_Stream -lXClient_APIHelp -lHelpComponents_XLog -lRfcComponents_HttpProtocol -lXEngine_ProcFile -lXEngine_SystemApi -lXEngine_AVHelp -lXEngine_VideoCodec -lXEngine_AudioCodec -lXEngine_AVCollect \ + -L ../../XEngine_Depend/XEngine_Module/jsoncpp -L ../../XEngine_Depend/XEngine_Module/XEngine_InfoReport +LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXEngine_OPenSsl -lXClient_Stream -lXClient_APIHelp -lHelpComponents_XLog -lRfcComponents_HttpProtocol -lRfcComponents_NatProtocol -lRfcComponents_NTPProtocol -lXEngine_ProcFile -lXEngine_SystemApi -lXEngine_AVHelp -lXEngine_VideoCodec -lXEngine_AudioCodec -lXEngine_AVCollect \ -lXEngine_ModuleConfigure -lXEngine_ModuleDatabase -lXEngine_ModuleProtocol -lXEngine_ModuleSystem -lXEngine_ModuleHelp -lXEngine_ModulePlugin \ - -ljsoncpp + -ljsoncpp -lXEngine_InfoReport LIBEX = OBJECTS = XEngine_Configure.o XEngine_Network.o XEngine_HTTPTask.o XEngine_PluginTask.o XEngine_HttpApp.o \ - TaskGet_Bank.o TaskGet_IDCard.o TaskGet_Locker.o TaskGet_Translation.o TaskGet_Reload.o TaskGet_Weather.o TaskGet_IDRegion.o \ + RFCTask_Ntp.o RFCTask_Stun.o \ + TaskGet_Bank.o TaskGet_IDCard.o TaskGet_Locker.o TaskGet_Translation.o TaskGet_Reload.o TaskGet_Weather.o TaskGet_IDRegion.o TaskGet_Oil.o \ TaskPost_DTest.o TaskPost_Log.o TaskPost_P2PClient.o TaskPost_PostCode.o TaskPost_QRCode.o TaskPost_ShortLink.o TaskPost_SocketTest.o TaskPost_WordFilter.o TaskPost_Image.o TaskPost_BackService.o TaskPost_Deamon.o TaskPost_Machine.o ifeq ($(RELEASE),1) @@ -65,6 +66,11 @@ XEngine_HTTPTask.o:./XEngine_HTTPTask.cpp XEngine_PluginTask.o:./XEngine_PluginTask.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_PluginTask.cpp +RFCTask_Ntp.o:./XEngine_TaskRfc/RFCTask_Ntp.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskRfc/RFCTask_Ntp.cpp +RFCTask_Stun.o:./XEngine_TaskRfc/RFCTask_Stun.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskRfc/RFCTask_Stun.cpp + TaskGet_Bank.o:./XEngine_TaskGet/TaskGet_Bank.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskGet/TaskGet_Bank.cpp TaskGet_IDCard.o:./XEngine_TaskGet/TaskGet_IDCard.cpp @@ -79,6 +85,8 @@ TaskGet_Weather.o:./XEngine_TaskGet/TaskGet_Weather.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskGet/TaskGet_Weather.cpp TaskGet_IDRegion.o:./XEngine_TaskGet/TaskGet_IDRegion.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskGet/TaskGet_IDRegion.cpp +TaskGet_Oil.o:./XEngine_TaskGet/TaskGet_Oil.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskGet/TaskGet_Oil.cpp TaskPost_DTest.o:./XEngine_TaskPost/TaskPost_DTest.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_TaskPost/TaskPost_DTest.cpp diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Oil.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Oil.cpp new file mode 100644 index 0000000..e58926e --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Oil.cpp @@ -0,0 +1,41 @@ +#include "../XEngine_Hdr.h" + +bool HTTPTask_TaskGet_Oil(LPCXSTR lpszClientAddr, LPCXSTR lpszCityStr) +{ + int nMsgLen = 4096; + int nPktLen = 4096; + XCHAR tszMsgBuffer[4096]; + XCHAR tszPktBuffer[4096]; + + XENGINE_OILINFO st_OilInfo = {}; + RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {}; //发送给客户端的参数 + + memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); + memset(tszPktBuffer, '\0', sizeof(tszPktBuffer)); + + st_HDRParam.nHttpCode = 200; //HTTP CODE码 + st_HDRParam.bIsClose = true; //收到回复后就关闭 + + if (!st_ServiceConfig.st_XSql.bEnable) + { + ModuleProtocol_Packet_Common(tszPktBuffer, &nPktLen, 501, _X("function is closed")); + HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam, tszPktBuffer, nPktLen); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求的油价查询功能已经被服务器关闭,无法继续"), lpszClientAddr); + return false; + } + _tcsxcpy(st_OilInfo.tszCityStr, lpszCityStr); + if (!ModuleDatabase_OilInfo_Query(&st_OilInfo)) + { + ModuleProtocol_Packet_IDQuery(tszPktBuffer, &nPktLen, NULL, NULL, 1001, _X("city name is incorrent")); + HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam, tszPktBuffer, nPktLen); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求的油价查询不正确,城市名:%s"), lpszClientAddr, lpszCityStr); + return false; + } + ModuleProtocol_Packet_OilInfo(tszPktBuffer, &nPktLen, &st_OilInfo); + HttpProtocol_Server_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam, tszPktBuffer, nPktLen); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("HTTP客户端:%s,请求油价查询成功,城市名:%s"), lpszClientAddr, lpszCityStr); + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Oil.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Oil.h new file mode 100644 index 0000000..8545760 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskGet/TaskGet_Oil.h @@ -0,0 +1,3 @@ +#pragma once + +bool HTTPTask_TaskGet_Oil(LPCXSTR lpszClientAddr, LPCXSTR lpszCityStr); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.cpp index 144a159..7897182 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Ntp.cpp @@ -2,12 +2,11 @@ bool RFCTask_NTP_Parse(LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGLen) { +#if (XENGINE_VERSION_KERNEL >= 8) && (XENGINE_VERSION_MAIN >= 31) int nSDLen = 0; XCHAR tszSDBuffer[4096] = {}; NTPPROTOCOL_TIMEINFO st_TimeRecv = {}; NTPPROTOCOL_TIMEINFO st_TimeTras = {}; - -#if (XENGINE_VERSION_KERNEL >= 8) && (XENGINE_VERSION_MAIN >= 31) NTPProtocol_Packet_TimeConvert(&st_TimeRecv); NTPProtocol_Parse_Header(lpszMSGBuffer, nMSGLen, NULL, NULL, NULL, &st_TimeTras); diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.cpp index b6332a1..1e0e64a 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_TaskRfc/RFCTask_Stun.cpp @@ -22,7 +22,6 @@ bool RFCTask_Stun_Parse(LPCXSTR lpszClientAddr, LPCXSTR lpszMSGBuffer, int nMSGL int nXLen = 0; int nDLen = 0; int nNLen = 0; - int nHLen = 0; XCHAR tszIPAddr[128] = {}; _tcsxcpy(tszIPAddr, lpszClientAddr); BaseLib_OperatorIPAddr_SegAddr(tszIPAddr, &nIPPort); -- Gitee From 8cb3e65df7d4d5b8e579155277091bf761ecafca Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 8 May 2024 16:38:20 +0800 Subject: [PATCH 16/24] added:lost oil info database --- .../ModuleDatabase_OilInfo.cpp | 205 ++++++++++++++++++ .../ModuleDatabase_OilInfo.h | 28 +++ 2 files changed, 233 insertions(+) create mode 100644 XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_OilInfo/ModuleDatabase_OilInfo.cpp create mode 100644 XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_OilInfo/ModuleDatabase_OilInfo.h diff --git a/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_OilInfo/ModuleDatabase_OilInfo.cpp b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_OilInfo/ModuleDatabase_OilInfo.cpp new file mode 100644 index 0000000..293eacd --- /dev/null +++ b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_OilInfo/ModuleDatabase_OilInfo.cpp @@ -0,0 +1,205 @@ +#include "pch.h" +#include "ModuleDatabase_OilInfo.h" +/******************************************************************** +// Created: 2024/05/08 14:52:14 +// File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleDatabase\ModuleDatabase_OilInfo\ModuleDatabase_OilInfo.cpp +// File Path: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleDatabase\ModuleDatabase_OilInfo +// File Base: ModuleDatabase_OilInfo +// File Ext: cpp +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: 油价信息查询接口 +// History: +*********************************************************************/ +CModuleDatabase_OilInfo::CModuleDatabase_OilInfo() +{ +} +CModuleDatabase_OilInfo::~CModuleDatabase_OilInfo() +{ + +} +////////////////////////////////////////////////////////////////////////// +// 公有函数 +////////////////////////////////////////////////////////////////////////// +/******************************************************************** +函数名称:ModuleDatabase_OilInfo_Init +函数功能:初始化数据库 + 参数.一:pSt_DBConnector + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:数据数据库信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleDatabase_OilInfo::ModuleDatabase_OilInfo_Init(DATABASE_MYSQL_CONNECTINFO* pSt_DBConnector) +{ + DBModule_IsErrorOccur = false; + + if (NULL == pSt_DBConnector) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = ERROR_APISERVICE_MODULE_DATABASE_PARAMENT; + return false; + } + //连接数据库 + _tcsxcpy(pSt_DBConnector->tszDBName, _X("XEngine_APIInfo")); + if (!DataBase_MySQL_Connect(&xhDBSQL, pSt_DBConnector)) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = DataBase_GetLastError(); + return false; + } + return true; +} +/******************************************************************** +函数名称:ModuleDatabase_OilInfo_Destory +函数功能:销毁 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleDatabase_OilInfo::ModuleDatabase_OilInfo_Destory() +{ + DBModule_IsErrorOccur = false; + + DataBase_MySQL_Close(xhDBSQL); + return true; +} +/******************************************************************** +函数名称:ModuleDatabase_OilInfo_Query +函数功能:查询数据 + 参数.一:pSt_OilInfo + In/Out:In/Out + 类型:数据结构指针 + 可空:N + 意思:输入查询的信息,输出完整的信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleDatabase_OilInfo::ModuleDatabase_OilInfo_Query(XENGINE_OILINFO* pSt_OilInfo) +{ + DBModule_IsErrorOccur = false; + + if ((NULL == pSt_OilInfo)) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = ERROR_APISERVICE_MODULE_DATABASE_PARAMENT; + return false; + } + //查询 + XNETHANDLE xhTable = 0; + __int64u nllLine = 0; + __int64u nllRow = 0; + + XCHAR tszSQLStatement[1024]; + memset(tszSQLStatement, '\0', sizeof(tszSQLStatement)); + + _xstprintf(tszSQLStatement, _X("SELECT * FROM `OilPrice` WHERE tszRegion = '%s'"), pSt_OilInfo->tszCityStr); +#ifdef _MSC_BUILD + XCHAR tszUTFStr[1024] = {}; + int nSLen = _tcsxlen(tszSQLStatement); + BaseLib_OperatorCharset_AnsiToUTF(tszSQLStatement, tszUTFStr, &nSLen); + if (!DataBase_MySQL_ExecuteQuery(xhDBSQL, &xhTable, tszUTFStr, &nllLine, &nllRow)) +#else + if (!DataBase_MySQL_ExecuteQuery(xhDBSQL, &xhTable, tszSQLStatement, &nllLine, &nllRow)) +#endif + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = DataBase_GetLastError(); + return false; + } + if (nllLine <= 0) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = ERROR_APISERVICE_MODULE_DATABASE_NOTFOUND; + return false; + } + for (__int64u i = 0; i < nllLine; i++) + { + XCHAR** pptszResult = DataBase_MySQL_GetResult(xhDBSQL, xhTable); + + if (NULL != pptszResult[1]) + { + pSt_OilInfo->dlValue98 = _ttxof(pptszResult[1]); + } + if (NULL != pptszResult[2]) + { + pSt_OilInfo->dlValue95 = _ttxof(pptszResult[2]); + } + if (NULL != pptszResult[3]) + { + pSt_OilInfo->dlValue92 = _ttxof(pptszResult[3]); + } + if (NULL != pptszResult[4]) + { + pSt_OilInfo->dlValue0 = _ttxof(pptszResult[4]); + } + if (NULL != pptszResult[5]) + { + pSt_OilInfo->dlValue10 = _ttxof(pptszResult[5]); + } + if (NULL != pptszResult[6]) + { + pSt_OilInfo->dlValue20 = _ttxof(pptszResult[6]); + } + if (NULL != pptszResult[7]) + { + pSt_OilInfo->dlValue35 = _ttxof(pptszResult[7]); + } + if (NULL != pptszResult[8]) + { + _tcsxcpy(pSt_OilInfo->tszUPTime, pptszResult[8]); + } + } + DataBase_MySQL_FreeResult(xhDBSQL, xhTable); + return true; +} +/******************************************************************** +函数名称:ModuleDatabase_OilInfo_UPDate +函数功能:更新数据 + 参数.一:pSt_OilInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要更新的数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CModuleDatabase_OilInfo::ModuleDatabase_OilInfo_UPDate(XENGINE_OILINFO* pSt_OilInfo) +{ + DBModule_IsErrorOccur = false; + + if (NULL == pSt_OilInfo) + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = ERROR_APISERVICE_MODULE_DATABASE_PARAMENT; + return false; + } + XCHAR tszSQLStatement[1024]; + memset(tszSQLStatement, '\0', sizeof(tszSQLStatement)); + + _xstprintf(tszSQLStatement, _X("UPDATE `OilPrice` SET 98 = %lf,95 = %lf,92 = %lf,0 = %lf,-10 = %lf,-20 = %lf,-35 = %lf,tszUPTime = 'now()' WHERE tszRegion = '%s'"), pSt_OilInfo->dlValue98, pSt_OilInfo->dlValue95, pSt_OilInfo->dlValue92, pSt_OilInfo->dlValue0, pSt_OilInfo->dlValue10, pSt_OilInfo->dlValue20, pSt_OilInfo->dlValue35, pSt_OilInfo->tszCityStr); + +#ifdef _MSC_BUILD + XCHAR tszUTFStr[1024] = {}; + int nSLen = _tcsxlen(tszSQLStatement); + BaseLib_OperatorCharset_AnsiToUTF(tszSQLStatement, tszUTFStr, &nSLen); + if (!DataBase_MySQL_Execute(xhDBSQL, tszUTFStr)) +#else + if (!DataBase_MySQL_Execute(xhDBSQL, tszSQLStatement)) +#endif + { + DBModule_IsErrorOccur = true; + DBModule_dwErrorCode = DataBase_GetLastError(); + return false; + } + return true; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_OilInfo/ModuleDatabase_OilInfo.h b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_OilInfo/ModuleDatabase_OilInfo.h new file mode 100644 index 0000000..01cade8 --- /dev/null +++ b/XEngine_Source/XEngine_ModuleDatabase/ModuleDatabase_OilInfo/ModuleDatabase_OilInfo.h @@ -0,0 +1,28 @@ +#pragma once +/******************************************************************** +// Created: 2024/05/08 14:51:51 +// File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleDatabase\ModuleDatabase_OilInfo\ModuleDatabase_OilInfo.h +// File Path: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleDatabase\ModuleDatabase_OilInfo +// File Base: ModuleDatabase_OilInfo +// File Ext: h +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: 油价信息查询接口 +// History: +*********************************************************************/ + + +class CModuleDatabase_OilInfo +{ +public: + CModuleDatabase_OilInfo(); + ~CModuleDatabase_OilInfo(); +public: + bool ModuleDatabase_OilInfo_Init(DATABASE_MYSQL_CONNECTINFO* pSt_DBConnector); + bool ModuleDatabase_OilInfo_Destory(); + bool ModuleDatabase_OilInfo_Query(XENGINE_OILINFO* pSt_OilInfo); + bool ModuleDatabase_OilInfo_UPDate(XENGINE_OILINFO* pSt_OilInfo); +protected: +private: + XNETHANDLE xhDBSQL; +}; \ No newline at end of file -- Gitee From 3d4d6dd28c2d17c2d14522537fb30c8bc5ab8184 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 8 May 2024 17:37:22 +0800 Subject: [PATCH 17/24] modify:report number count --- .../XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp index 7e2157d..6265676 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp @@ -439,7 +439,9 @@ int main(int argc, char** argv) { if (InfoReport_APIMachine_Send(st_ServiceConfig.st_XReport.tszAPIUrl, st_ServiceConfig.st_XReport.tszServiceName)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动信息报告给API服务器:%s 成功"), st_ServiceConfig.st_XReport.tszAPIUrl); + __int64x nTimeNumber = 0; + InfoReport_APIMachine_GetTime(st_ServiceConfig.st_XReport.tszAPIUrl, st_ServiceConfig.st_XReport.tszServiceName, &nTimeNumber); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动信息报告给API服务器:%s 成功,报告次数:%lld"), st_ServiceConfig.st_XReport.tszAPIUrl, nTimeNumber); } else { -- Gitee From 3b70b5844ea8916b37ee2b7f07d18f57cbb36722 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 10 May 2024 09:40:49 +0800 Subject: [PATCH 18/24] added:oil info query example --- .../APPClient_OilQuery/APPClient_OilQuery.cpp | 47 ++++++ .../APPClient_OilQuery.vcxproj | 139 ++++++++++++++++++ .../APPClient_OilQuery.vcxproj.filters | 22 +++ .../APPClient_OilQuery.vcxproj.user | 4 + XEngine_APPClient/XEngine_APPClient.sln | 10 ++ 5 files changed, 222 insertions(+) create mode 100644 XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.cpp create mode 100644 XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj create mode 100644 XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj.filters create mode 100644 XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj.user diff --git a/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.cpp b/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.cpp new file mode 100644 index 0000000..c3e11e7 --- /dev/null +++ b/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.cpp @@ -0,0 +1,47 @@ +#ifdef _MSC_BUILD +#include +#include +#pragma comment(lib,"Ws2_32") +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") +#pragma comment(lib,"XEngine_Client/XClient_APIHelp") +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//需要优先配置XEngine +//WINDOWS支持VS2022 x64 debug 编译调试 +//linux使用下面的命令编译 +//g++ -std=c++17 -Wall -g APPClient_OilQuery.cpp -o APPClient_OilQuery.exe -lXEngine_BaseLib -lXClient_APIHelp + +int main() +{ +#ifdef _MSC_BUILD + WSADATA st_WSAData; + WSAStartup(MAKEWORD(2, 2), &st_WSAData); +#endif + int nLen = 0; + XCHAR* ptszMsgBuffer = NULL; + //四川 + LPCXSTR lpszUrl = _X("http://127.0.0.1:5501/api?function=oil¶m=%E5%9B%9B%E5%B7%9D"); + + if (!APIClient_Http_Request(_X("GET"), lpszUrl, NULL, NULL, &ptszMsgBuffer, &nLen)) + { + printf("发送投递失败!\n"); + return 0; + } + printf("接受到数据,大小:%d,内容:%s\n", nLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + +#ifdef _MSC_BUILD + WSACleanup(); +#endif + return 0; +} \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj b/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj new file mode 100644 index 0000000..05caf9c --- /dev/null +++ b/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {018de3e3-1b0f-4550-8e7f-518b2f2c1381} + APPClientOilQuery + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + $(XEngine_Include);$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj.filters b/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj.filters new file mode 100644 index 0000000..6cf9012 --- /dev/null +++ b/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj.user b/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/XEngine_APPClient/APPClient_OilQuery/APPClient_OilQuery.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/XEngine_APPClient/XEngine_APPClient.sln b/XEngine_APPClient/XEngine_APPClient.sln index 3715ad1..da0b293 100644 --- a/XEngine_APPClient/XEngine_APPClient.sln +++ b/XEngine_APPClient/XEngine_APPClient.sln @@ -45,6 +45,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_DeamonExample", " EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_MachineExample", "APPClient_MachineExample\APPClient_MachineExample.vcxproj", "{7B5FB530-DBE4-4954-BC02-6C9411825A1D}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_OilQuery", "APPClient_OilQuery\APPClient_OilQuery.vcxproj", "{018DE3E3-1B0F-4550-8E7F-518B2F2C1381}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -221,6 +223,14 @@ Global {7B5FB530-DBE4-4954-BC02-6C9411825A1D}.Release|x64.Build.0 = Release|x64 {7B5FB530-DBE4-4954-BC02-6C9411825A1D}.Release|x86.ActiveCfg = Release|Win32 {7B5FB530-DBE4-4954-BC02-6C9411825A1D}.Release|x86.Build.0 = Release|Win32 + {018DE3E3-1B0F-4550-8E7F-518B2F2C1381}.Debug|x64.ActiveCfg = Debug|x64 + {018DE3E3-1B0F-4550-8E7F-518B2F2C1381}.Debug|x64.Build.0 = Debug|x64 + {018DE3E3-1B0F-4550-8E7F-518B2F2C1381}.Debug|x86.ActiveCfg = Debug|Win32 + {018DE3E3-1B0F-4550-8E7F-518B2F2C1381}.Debug|x86.Build.0 = Debug|Win32 + {018DE3E3-1B0F-4550-8E7F-518B2F2C1381}.Release|x64.ActiveCfg = Release|x64 + {018DE3E3-1B0F-4550-8E7F-518B2F2C1381}.Release|x64.Build.0 = Release|x64 + {018DE3E3-1B0F-4550-8E7F-518B2F2C1381}.Release|x86.ActiveCfg = Release|Win32 + {018DE3E3-1B0F-4550-8E7F-518B2F2C1381}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE -- Gitee From 8da39deb0914b0b652d18eec09dd8385600f380a Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 10 May 2024 09:42:14 +0800 Subject: [PATCH 19/24] fixed:vs build error --- .../XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj | 6 +++--- .../XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj | 6 +++--- .../ModulePlugin_BMIndex/ModulePlugin_BMIndex.vcxproj | 6 +++--- .../ModulePlugin_IPAddr/ModulePlugin_IPAddr.vcxproj | 6 +++--- .../ModulePlugin_Meter/ModulePlugin_Meter.vcxproj | 6 +++--- .../ModulePlugin_Password/ModulePlugin_Password.vcxproj | 6 +++--- .../ModulePlugin_Phone/ModulePlugin_Phone.vcxproj | 6 +++--- .../ModulePlugin_Timezone/ModulePlugin_Timezone.vcxproj | 6 +++--- .../ModulePlugin_Zodiac/ModulePlugin_Zodiac.vcxproj | 6 +++--- 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj index dd5512c..c497a86 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj +++ b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj @@ -77,16 +77,16 @@ false - $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) true - $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) false - $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) diff --git a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj index 114f439..8ae1fb3 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj +++ b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.vcxproj @@ -77,17 +77,17 @@ false - $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) true - $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) false - $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/ModulePlugin_BMIndex.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/ModulePlugin_BMIndex.vcxproj index d9c3c4b..801729f 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/ModulePlugin_BMIndex.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_BMIndex/ModulePlugin_BMIndex.vcxproj @@ -79,19 +79,19 @@ $(ProjectName) - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ $(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/ModulePlugin_IPAddr.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/ModulePlugin_IPAddr.vcxproj index 3755818..0b796b2 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/ModulePlugin_IPAddr.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_IPAddr/ModulePlugin_IPAddr.vcxproj @@ -78,19 +78,19 @@ $(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ $(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/ModulePlugin_Meter.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/ModulePlugin_Meter.vcxproj index 54d449c..8a0a430 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/ModulePlugin_Meter.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Meter/ModulePlugin_Meter.vcxproj @@ -80,19 +80,19 @@ $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ $(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/ModulePlugin_Password.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/ModulePlugin_Password.vcxproj index 704319b..11dfee1 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/ModulePlugin_Password.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Password/ModulePlugin_Password.vcxproj @@ -80,21 +80,21 @@ false - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ $(Configuration)\XEngine_LibPlugin\ true - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ false - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/ModulePlugin_Phone.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/ModulePlugin_Phone.vcxproj index 7caf3a0..82a6b5d 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/ModulePlugin_Phone.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Phone/ModulePlugin_Phone.vcxproj @@ -80,18 +80,18 @@ $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(ReferencePath) $(XEngine_Lib64);$(LibraryPath) - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ $(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/ModulePlugin_Timezone.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/ModulePlugin_Timezone.vcxproj index 3fd15e4..0e932ca 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/ModulePlugin_Timezone.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Timezone/ModulePlugin_Timezone.vcxproj @@ -78,19 +78,19 @@ $(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ $(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ diff --git a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/ModulePlugin_Zodiac.vcxproj b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/ModulePlugin_Zodiac.vcxproj index 5098ba5..558978c 100644 --- a/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/ModulePlugin_Zodiac.vcxproj +++ b/XEngine_Source/XEngine_PluginModule/ModulePlugin_Zodiac/ModulePlugin_Zodiac.vcxproj @@ -80,21 +80,21 @@ false - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) $(SolutionDir)$(Configuration)\XEngine_LibPlugin\ $(Configuration)\XEngine_LibPlugin\ true - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ false - $(XEngine_Include);../../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Include);../../XEngine_Depend/XEngine_Module/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) $(SolutionDir)$(Platform)\$(Configuration)\XEngine_LibPlugin\ $(Platform)\$(Configuration)\XEngine_LibPlugin\ -- Gitee From 951fb32421b687ee2e73bab8d10c939a747c89a7 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 10 May 2024 09:43:20 +0800 Subject: [PATCH 20/24] update:sql file --- XEngine_SQL/XEngine_APIInfo.sql | 67 ++++++++++++++++++++++++++---- XEngine_SQL/XEngine_APIMachine.sql | 8 ++-- 2 files changed, 63 insertions(+), 12 deletions(-) diff --git a/XEngine_SQL/XEngine_APIInfo.sql b/XEngine_SQL/XEngine_APIInfo.sql index abd484d..40498a7 100644 --- a/XEngine_SQL/XEngine_APIInfo.sql +++ b/XEngine_SQL/XEngine_APIInfo.sql @@ -1,17 +1,17 @@ /* Navicat Premium Data Transfer - Source Server : Test + Source Server : mysql Source Server Type : MySQL - Source Server Version : 80031 (8.0.31-0ubuntu0.20.04.2) - Source Host : 192.168.1.12:3306 + Source Server Version : 80036 (8.0.36-0ubuntu0.22.04.1) + Source Host : 10.0.3.154:3306 Source Schema : XEngine_APIInfo Target Server Type : MySQL - Target Server Version : 80031 (8.0.31-0ubuntu0.20.04.2) + Target Server Version : 80036 (8.0.36-0ubuntu0.22.04.1) File Encoding : 65001 - Date: 10/01/2023 15:57:39 + Date: 08/05/2024 15:41:40 */ SET NAMES utf8mb4; @@ -34,7 +34,7 @@ CREATE TABLE `AdministrativeArea` ( `first` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL, `lng` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL, `lat` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of AdministrativeArea @@ -3798,7 +3798,7 @@ CREATE TABLE `BankList` ( `tszBankAbridge` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `tszBankName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, PRIMARY KEY (`ID`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 169 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 169 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of BankList @@ -3972,6 +3972,57 @@ INSERT INTO `BankList` VALUES (166, 'ZRCBANK', '张家港农村商业银行'); INSERT INTO `BankList` VALUES (167, 'ZYCBANK', '遵义市商业银行'); INSERT INTO `BankList` VALUES (168, 'ZZBANK', '郑州银行'); +-- ---------------------------- +-- Table structure for OilPrice +-- ---------------------------- +DROP TABLE IF EXISTS `OilPrice`; +CREATE TABLE `OilPrice` ( + `tszRegion` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '地区', + `98` float(4, 2) NULL DEFAULT NULL COMMENT '98号汽油', + `95` float(4, 2) NULL DEFAULT NULL COMMENT '95号汽油', + `92` float(4, 2) NULL DEFAULT NULL COMMENT '92号汽油', + `0` float(4, 2) NULL DEFAULT NULL COMMENT '0号柴油', + `-10` float(4, 2) NULL DEFAULT NULL COMMENT '-10号柴油', + `-20` float(4, 2) NULL DEFAULT NULL COMMENT '-20号柴油', + `-35` float(4, 2) NULL DEFAULT NULL COMMENT '-30号柴油', + `tszUPTime` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of OilPrice +-- ---------------------------- +INSERT INTO `OilPrice` VALUES ('北京', 10.22, 8.72, 8.19, 7.91, 8.39, 8.79, 9.11, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('上海', 10.01, 8.67, 8.15, 7.84, 8.31, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('江苏', 10.48, 8.68, 8.16, 7.82, 8.29, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('天津', 10.15, 8.65, 8.18, 7.87, 8.34, 8.73, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('重庆', 10.53, 8.71, 8.25, 7.93, 8.40, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('江西', 10.25, 8.75, 8.15, 7.91, 8.46, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('辽宁', 9.67, 8.87, 8.34, 7.76, 0.00, 0.00, 8.90, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('安徽', 9.90, 8.70, 8.14, 7.90, 8.38, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('内蒙古', 9.51, 8.67, 8.12, 7.73, 8.21, 8.58, 8.83, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('福建', 10.20, 8.70, 8.15, 7.86, 8.33, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('宁夏', 9.74, 8.54, 8.09, 7.74, 8.21, 8.60, 8.91, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('甘肃', 10.22, 8.74, 8.19, 7.76, 8.24, 8.67, 8.94, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('青海', 9.51, 8.73, 8.15, 7.78, 8.25, 8.64, 8.95, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('广东', 10.89, 8.89, 8.21, 7.87, 0.00, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('山东', 9.47, 8.75, 8.15, 7.77, 8.22, 8.58, 8.89, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('广西', 10.04, 8.91, 8.25, 7.92, 0.00, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('山西', 9.98, 8.78, 8.13, 7.94, 8.41, 8.81, 9.13, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('贵州', 9.69, 8.79, 8.32, 7.97, 8.44, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('陕西', 11.19, 8.53, 8.07, 7.75, 8.22, 8.60, 8.91, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('海南', 11.20, 9.88, 9.30, 7.95, 0.00, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('四川', 9.62, 8.85, 8.28, 7.91, 8.38, 8.69, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('河北', 9.47, 8.65, 8.18, 7.87, 8.34, 8.73, 9.05, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('西藏', 10.68, 9.58, 9.06, 8.40, 8.92, 9.37, 9.66, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('河南', 9.41, 8.75, 8.20, 7.85, 8.32, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('新疆', 9.55, 8.55, 7.99, 7.63, 0.00, 8.15, 8.55, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('黑龙江', 9.90, 8.73, 8.15, 7.65, 0.00, 0.00, 8.81, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('吉林', 9.58, 8.79, 8.15, 7.78, 8.20, 8.63, 8.87, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('云南', 9.63, 8.95, 8.34, 7.93, 0.00, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('湖北', 10.15, 8.78, 8.20, 7.85, 0.00, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('浙江', 9.50, 8.68, 8.16, 7.85, 8.32, 0.00, 0.00, '2024-05-08 14:39:53'); +INSERT INTO `OilPrice` VALUES ('湖南', 9.65, 8.65, 8.13, 7.93, 0.00, 0.00, 0.00, '2024-05-08 14:39:53'); + -- ---------------------------- -- Table structure for RegionID -- ---------------------------- @@ -3980,7 +4031,7 @@ CREATE TABLE `RegionID` ( `code` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL, `name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL, `parentCode` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of RegionID diff --git a/XEngine_SQL/XEngine_APIMachine.sql b/XEngine_SQL/XEngine_APIMachine.sql index ab94f25..0c880b5 100644 --- a/XEngine_SQL/XEngine_APIMachine.sql +++ b/XEngine_SQL/XEngine_APIMachine.sql @@ -1,17 +1,17 @@ /* Navicat Premium Data Transfer - Source Server : QCloud + Source Server : mysql Source Server Type : MySQL Source Server Version : 80036 (8.0.36-0ubuntu0.22.04.1) - Source Host : 43.139.170.67:3306 + Source Host : 10.0.3.154:3306 Source Schema : XEngine_APIMachine Target Server Type : MySQL Target Server Version : 80036 (8.0.36-0ubuntu0.22.04.1) File Encoding : 65001 - Date: 29/04/2024 10:51:26 + Date: 08/05/2024 15:41:55 */ SET NAMES utf8mb4; @@ -31,6 +31,6 @@ CREATE TABLE `XEngine_MachineList` ( `nTimeNumber` bigint NOT NULL COMMENT '启动次数', `tszCreateTime` datetime NOT NULL COMMENT '注册时间', PRIMARY KEY (`ID`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; SET FOREIGN_KEY_CHECKS = 1; -- Gitee From 78c3540621f7e64a1cb88fd3e0a0665022c6a2ff Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 10 May 2024 09:45:37 +0800 Subject: [PATCH 21/24] added:some description file --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++ .github/workflows/msbuild.yml | 102 +++++++++++++++++ CODE_OF_CONDUCT.md | 128 ++++++++++++++++++++++ SECURITY.md | 15 +++ 5 files changed, 303 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/msbuild.yml create mode 100644 CODE_OF_CONDUCT.md create mode 100644 SECURITY.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dd84ea7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..bbcbbe7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/msbuild.yml b/.github/workflows/msbuild.yml new file mode 100644 index 0000000..fd1d032 --- /dev/null +++ b/.github/workflows/msbuild.yml @@ -0,0 +1,102 @@ +name: C++ Build with Dependencies + +#on: [push] # 触发条件,推送和拉取请求时, +on: + workflow_dispatch: # 添加这行来启用手动触发 + +permissions: + contents: write + +jobs: + build: + strategy: + matrix: + configuration: [Release] + platform: [x86] + + runs-on: windows-latest # 最新的 Windows 环境 + + steps: + # 检出您的主仓库代码 + - name: Checkout main repository code + uses: actions/checkout@v3 + + # 检出依赖的xengine仓库到指定的xengine目录 + - name: Checkout dependency repository (xengine) + uses: actions/checkout@v3 + with: + repository: libxengine/xengine + path: xengine + + # 设置依赖库的环境变量 + - name: Set up Dependency Environment Variables + run: | + echo "XENGINE_INCLUDE=${{ github.workspace }}/xengine" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "XENGINE_LIB32=${{ github.workspace }}/xengine/XEngine_Windows/x86" | Out-File -FilePath $env:GITHUB_ENV -Append + echo "XENGINE_LIB64=${{ github.workspace }}/xengine/XEngine_Windows/x64" | Out-File -FilePath $env:GITHUB_ENV -Append + shell: pwsh + + # 配置 MSBuild 的路径,准备构建 VC++ 项目 + - name: Setup MSBuild + uses: microsoft/setup-msbuild@v1.0.2 + #编译 + - name: Build Solution + run: msbuild XEngine_Source/XEngine_StorageApp.sln /p:Configuration=${{ matrix.configuration }} /p:Platform=${{ matrix.platform }} + + # 打包 + - name: Copy Build binaries for x86 + run: | + mkdir -p "x86/XEngine_StorageApp" + cp -r ./XEngine_Release/* x86/XEngine_StorageApp/ + cp -r ./XEngine_Source/Release/*.dll x86/XEngine_StorageApp/ + cp -r ./XEngine_Source/Release/*.exe x86/XEngine_StorageApp/ + cp -r ./XEngine_Source/VSCopy_x86.bat x86/XEngine_StorageApp/ + cd x86/XEngine_StorageApp && ./VSCopy_x86.bat + cd .. + cd .. + 7z a XEngine_StorageApp-x86-Windows.zip ./x86/XEngine_StorageApp/* + shell: pwsh + + - name: Calculate new tag + id: newtag + shell: bash + run: | + git fetch --tags + TAG=$(git tag --sort=-v:refname | head -n 1) + MAJOR=$(echo $TAG | cut -d '.' -f 1) + MINOR=$(echo $TAG | cut -d '.' -f 2) + PATCH=$(echo $TAG | cut -d '.' -f 3) + BUILD=$(echo $TAG | cut -d '.' -f 4) + MINOR_BUMP=$((MINOR + 1)) + NEW_TAG="${MAJOR}.${MINOR_BUMP}.0.${BUILD}" + echo "NEW_TAG=$NEW_TAG" >> $GITHUB_ENV + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + git tag $NEW_TAG + git push origin $NEW_TAG + + # 创建GitHub Release + - name: Create Release + id: create_release + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ env.NEW_TAG }} + name: Release ${{ env.NEW_TAG }} + body: | + [${{ github.sha }}](https://github.com/libxengine/XEngine_Storage/commit/${{ github.sha }}) + ${{ github.event.head_commit.message }} + draft: false + prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # 上传x86的zip包作为发布的artifacts + - name: Upload x86 Release Asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./XEngine_StorageApp-x86-Windows.zip + asset_name: XEngine_StorageApp-x86-Windows.zip + asset_content_type: application/zip diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..751bf62 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +486179@qq.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..78f6726 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,15 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| >= 2.x | :white_check_mark: | +| <= 1.x | :x: | + +## Reporting a Vulnerability + +www.xyry.org or 486179@qq.com -- Gitee From 061c17377a61c5c16a6ec1db687bfd6898a9b238 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 10 May 2024 09:46:11 +0800 Subject: [PATCH 22/24] delete:build yml file --- .github/workflows/msbuild.yml | 102 ---------------------------------- 1 file changed, 102 deletions(-) delete mode 100644 .github/workflows/msbuild.yml diff --git a/.github/workflows/msbuild.yml b/.github/workflows/msbuild.yml deleted file mode 100644 index fd1d032..0000000 --- a/.github/workflows/msbuild.yml +++ /dev/null @@ -1,102 +0,0 @@ -name: C++ Build with Dependencies - -#on: [push] # 触发条件,推送和拉取请求时, -on: - workflow_dispatch: # 添加这行来启用手动触发 - -permissions: - contents: write - -jobs: - build: - strategy: - matrix: - configuration: [Release] - platform: [x86] - - runs-on: windows-latest # 最新的 Windows 环境 - - steps: - # 检出您的主仓库代码 - - name: Checkout main repository code - uses: actions/checkout@v3 - - # 检出依赖的xengine仓库到指定的xengine目录 - - name: Checkout dependency repository (xengine) - uses: actions/checkout@v3 - with: - repository: libxengine/xengine - path: xengine - - # 设置依赖库的环境变量 - - name: Set up Dependency Environment Variables - run: | - echo "XENGINE_INCLUDE=${{ github.workspace }}/xengine" | Out-File -FilePath $env:GITHUB_ENV -Append - echo "XENGINE_LIB32=${{ github.workspace }}/xengine/XEngine_Windows/x86" | Out-File -FilePath $env:GITHUB_ENV -Append - echo "XENGINE_LIB64=${{ github.workspace }}/xengine/XEngine_Windows/x64" | Out-File -FilePath $env:GITHUB_ENV -Append - shell: pwsh - - # 配置 MSBuild 的路径,准备构建 VC++ 项目 - - name: Setup MSBuild - uses: microsoft/setup-msbuild@v1.0.2 - #编译 - - name: Build Solution - run: msbuild XEngine_Source/XEngine_StorageApp.sln /p:Configuration=${{ matrix.configuration }} /p:Platform=${{ matrix.platform }} - - # 打包 - - name: Copy Build binaries for x86 - run: | - mkdir -p "x86/XEngine_StorageApp" - cp -r ./XEngine_Release/* x86/XEngine_StorageApp/ - cp -r ./XEngine_Source/Release/*.dll x86/XEngine_StorageApp/ - cp -r ./XEngine_Source/Release/*.exe x86/XEngine_StorageApp/ - cp -r ./XEngine_Source/VSCopy_x86.bat x86/XEngine_StorageApp/ - cd x86/XEngine_StorageApp && ./VSCopy_x86.bat - cd .. - cd .. - 7z a XEngine_StorageApp-x86-Windows.zip ./x86/XEngine_StorageApp/* - shell: pwsh - - - name: Calculate new tag - id: newtag - shell: bash - run: | - git fetch --tags - TAG=$(git tag --sort=-v:refname | head -n 1) - MAJOR=$(echo $TAG | cut -d '.' -f 1) - MINOR=$(echo $TAG | cut -d '.' -f 2) - PATCH=$(echo $TAG | cut -d '.' -f 3) - BUILD=$(echo $TAG | cut -d '.' -f 4) - MINOR_BUMP=$((MINOR + 1)) - NEW_TAG="${MAJOR}.${MINOR_BUMP}.0.${BUILD}" - echo "NEW_TAG=$NEW_TAG" >> $GITHUB_ENV - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - git tag $NEW_TAG - git push origin $NEW_TAG - - # 创建GitHub Release - - name: Create Release - id: create_release - uses: softprops/action-gh-release@v1 - with: - tag_name: ${{ env.NEW_TAG }} - name: Release ${{ env.NEW_TAG }} - body: | - [${{ github.sha }}](https://github.com/libxengine/XEngine_Storage/commit/${{ github.sha }}) - ${{ github.event.head_commit.message }} - draft: false - prerelease: false - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - # 上传x86的zip包作为发布的artifacts - - name: Upload x86 Release Asset - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./XEngine_StorageApp-x86-Windows.zip - asset_name: XEngine_StorageApp-x86-Windows.zip - asset_content_type: application/zip -- Gitee From 0998efdf08f0c87151f25ad39ddf154ab50c4a76 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 10 May 2024 10:29:12 +0800 Subject: [PATCH 23/24] update:docment and readme --- CHANGELOG | 22 ++++++++++++++ README.en.md | 28 +++++++++++++++++- README.md | 28 +++++++++++++++++- XEngine_Docment/Docment_en.docx | Bin 156176 -> 158263 bytes XEngine_Docment/Docment_zh.docx | Bin 162924 -> 165913 bytes .../XEngine_Config/XEngine_VersionConfig.json | 2 +- 6 files changed, 77 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 17e4ae6..93aed37 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,25 @@ +XEngine_APIService V3.5.0.1001 + +增加:机器信息收集增加服务名字段 +增加:机器信息报告查询 +增加:RFC的UDP服务端口的STUN协议代码支持 +增加:信息报告配置支持 +增加:NTP时间同步协议支持 +增加:油价查询支持 +修改:jsoncpp现在使用子模块方式加载 +修改:分离了版本信息从配置文件中 +修复:图像扩展名没有处理的问题 + +added:rfc witch udp port and stun protocol supported +added:query info for report +added:service name for machine +added:info report supported +added:NTP time sync protocol supported +added:oil price query supported +modify:jsoncpp is depend sub module +modify:detach version configure file +fixed:image process ext name is incorrect +====================================================================================== XEngine_APIService V3.4.0.1001 增加:lua脚本心跳协议支持 diff --git a/README.en.md b/README.en.md index 6230981..c20bdd5 100644 --- a/README.en.md +++ b/README.en.md @@ -30,7 +30,7 @@ Support privatization deployment, free, safe, open source, controllable 9. Zodiac Constellation 10. Password generator 11. World Time Zones -12. Oil price inquiry (planned) +12. Oil price inquiry 13. Administrative zip code 14. Bank card verification 15. Exchange rate calculation (planned) @@ -52,6 +52,8 @@ Support privatization deployment, free, safe, open source, controllable 31. Region ID Convert 32. Machine Information Collect 33. heartbeat +34. STUN NAT Protocol +35. NTP Time Sync Protocol ## install @@ -75,6 +77,11 @@ need to vcpkg configure third-part env.refer vcpkg install guide.after installed use vs open and compile,suport windows 7sp1 and above Just Run it +#### sub module +Due to the dependent sub-modules, after you checkout the warehouse, execute the following command in the warehouse directory to pull the sub-modules +git submodule init +git submodule update + #### Linux ubuntu:sudo apt install sudo apt install liblua5.4-dev libopencv-dev libopencv-contrib-dev libqrencode-dev centos:compile by self @@ -213,6 +220,25 @@ Api:http://app.xyry.org:5501/api?function=log¶ms1=1 "nLogLevel":4 } ``` +Oil Query +API:http://app.xyry.org:5501/api?function=oil&addr=四川 +```json +{ + "code": 0, + "data": { + "dlValue0": 7.9100000000000001, + "dlValue10": 8.3800000000000008, + "dlValue20": 8.6899999999999995, + "dlValue35": 0, + "dlValue92": 8.2799999999999994, + "dlValue95": 8.8499999999999996, + "dlValue98": 9.6199999999999992, + "tszCityStr": "四川", + "tszUPTime": "2024-05-08 14:39:53" + }, + "msg": "success" +} +``` ## Participate in contribution I hope you will submit more code to participate in the contribution diff --git a/README.md b/README.md index 531b37f..3ff1335 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ c c++ interface api service 9. 生肖星座 10. 密码生成器 11. 世界时区 -12. 油价查询(计划中) +12. 油价查询 13. 行政邮编 14. 银行卡验证 15. 汇率计算(计划中) @@ -51,6 +51,8 @@ c c++ interface api service 31. 行政区域ID转换 32. 机器信息收集 33. 心跳处理 +34. STUN NAT协议 +35. NTP时间同步协议 ## 安装教程 @@ -69,6 +71,11 @@ macos执行:./XEngine_LINEnv.sh -i 3 需要MYSQL数据库8.0以上版本.通过CreateDatabase.sql创建表,然后导入剩余的表 修改配置文件里面XSQL里面的数据库配置为你的 +#### sub module +由于依赖的子模块,在你checkout仓库后,在仓库目录下执行下面的命令拉取子模块 +git submodule init +git submodule update + #### Windows 需要vcpkg配置第三方环境,具体参考vcpkg安装方式,安装好后执行:vcpkg.exe install lua:x86-windows opencv[contrib]:x86-windows libqrencode:x86-windows lua:x64-windows opencv[contrib]:x64-windows libqrencode:x64-windows 使用VS打开并且编译,支持WINDOWS 7SP1以上系统 @@ -214,6 +221,25 @@ make FLAGS=CleanAll 清理编译 "nLogLevel":4 } ``` +油价查询 +接口:http://app.xyry.org:5501/api?function=oil&addr=四川 +```json +{ + "code": 0, + "data": { + "dlValue0": 7.9100000000000001, + "dlValue10": 8.3800000000000008, + "dlValue20": 8.6899999999999995, + "dlValue35": 0, + "dlValue92": 8.2799999999999994, + "dlValue95": 8.8499999999999996, + "dlValue98": 9.6199999999999992, + "tszCityStr": "四川", + "tszUPTime": "2024-05-08 14:39:53" + }, + "msg": "success" +} +``` ## 参与贡献 希望大家多多提交代码参与贡献 diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index eca219da2e75a1b7e8a23c30a8c1c34ca1f8a0f4..b6f6ac111f2b9b205dea80def18e792d4d60bae6 100644 GIT binary patch delta 138508 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 z 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 diff --git a/XEngine_Docment/Docment_zh.docx b/XEngine_Docment/Docment_zh.docx index 488e12515e8ac8d664b024618d356c3dfe14112b..ce549778e1127b63a92881ccbfd984598238329a 100644 GIT binary patch delta 153650 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 z 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 z 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 JQe^=IC;`6)BnG;_W6*GzJ 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

pJl}@~l_HhT24o0VErt#M-L_0O{t{ZDW7M)n9Y( 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�t@lY;x4l|0qX|Ig0Whd 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

UiI;W7fx@A#Z@S0h}>>h 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 Date: Fri, 10 May 2024 10:38:34 +0800 Subject: [PATCH 24/24] modify:SECURITY.md --- SECURITY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 78f6726..06ae542 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -7,8 +7,8 @@ currently being supported with security updates. | Version | Supported | | ------- | ------------------ | -| >= 2.x | :white_check_mark: | -| <= 1.x | :x: | +| >= 3.x | :white_check_mark: | +| <= 2.x | :x: | ## Reporting a Vulnerability -- Gitee