From 72c23fb27b469a6b962e8208ad26f3ca43ad5642 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 29 Apr 2022 09:27:38 +0800 Subject: [PATCH 01/19] modify:is not delete so file --- XEngine_Source/VSClean.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/VSClean.bat b/XEngine_Source/VSClean.bat index bf8eca3..d2cff75 100644 --- a/XEngine_Source/VSClean.bat +++ b/XEngine_Source/VSClean.bat @@ -1,5 +1,5 @@ @echo Off -del /s /a *.ncb *.so *.o *.db +del /s /a *.ncb *.o *.db FOR /R . %%d IN (.) DO rd /s /q "%%d\Debug" 2>nul FOR /R . %%d IN (.) DO rd /s /q "%%d\Release" 2>nul FOR /R . %%d IN (.) DO rd /s /q "%%d\x64" 2>nul -- Gitee From 740d829084cc55a4772a63ba6eaa53128e997a9e Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 7 Jun 2022 13:52:22 +0800 Subject: [PATCH 02/19] modify:parament name --- .../XEngine_HttpApp/XEngine_HTTPTask.cpp | 30 +++++++++---------- .../XEngine_HttpApp/XEngine_Hdr.h | 1 + 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp index 91fbae8..cc3839b 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp @@ -88,14 +88,14 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR TCHAR tszKey[128]; TCHAR tszValue[128]; LPCTSTR lpszFuncName = _T("api"); - LPCTSTR lpszParamFunc1 = _T("function"); - LPCTSTR lpszParamFunc2 = _T("params1"); - LPCTSTR lpszParamValue1 = _T("ip"); - LPCTSTR lpszParamValue2 = _T("id"); - LPCTSTR lpszParamValue3 = _T("phone"); - LPCTSTR lpszParamValue4 = _T("bank"); - LPCTSTR lpszParamValue5 = _T("language"); - LPCTSTR lpszParamValue6 = _T("translation"); + LPCTSTR lpszParamFuncKey = _T("function"); + LPCTSTR lpszParamName = _T("params1"); + LPCTSTR lpszParamIPAddr = _T("ip"); + LPCTSTR lpszParamIDCard = _T("id"); + LPCTSTR lpszParamPhone = _T("phone"); + LPCTSTR lpszParamBank = _T("bank"); + LPCTSTR lpszParamLanguage = _T("language"); + LPCTSTR lpszParamTranslation = _T("translation"); memset(tszKey, '\0', sizeof(tszKey)); memset(tszValue, '\0', sizeof(tszValue)); @@ -111,7 +111,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR } //获得函数名 BaseLib_OperatorString_GetKeyValue(pptszList[0], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc1, tszKey, _tcslen(lpszParamFunc1))) + if (0 != _tcsnicmp(lpszParamFuncKey, tszKey, _tcslen(lpszParamFuncKey))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -127,7 +127,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR return TRUE; } //是不是ip查询 - if (0 == _tcsnicmp(lpszParamValue1, tszValue, _tcslen(lpszParamValue1))) + if (0 == _tcsnicmp(lpszParamIPAddr, tszValue, _tcslen(lpszParamIPAddr))) { memset(tszKey, '\0', sizeof(tszKey)); memset(tszValue, '\0', sizeof(tszValue)); @@ -149,7 +149,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszGetType); XEngine_HTTPTask_IPInfo(lpszClientAddr, tszValue, _ttoi(tszGetType)); } - else if (0 == _tcsnicmp(lpszParamValue2, tszValue, _tcslen(lpszParamValue2))) + else if (0 == _tcsnicmp(lpszParamIDCard, tszValue, _tcslen(lpszParamIDCard))) { //是不是身份证查询 memset(tszKey, '\0', sizeof(tszKey)); @@ -172,7 +172,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszGetType); XEngine_HTTPTask_IDCard(lpszClientAddr, tszValue, _ttoi(tszGetType)); } - else if (0 == _tcsnicmp(lpszParamValue3, tszValue, _tcslen(lpszParamValue3))) + else if (0 == _tcsnicmp(lpszParamPhone, tszValue, _tcslen(lpszParamPhone))) { //是不是电话号码查询 memset(tszKey, '\0', sizeof(tszKey)); @@ -195,7 +195,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszGetType); XEngine_HTTPTask_PhoneInfo(lpszClientAddr, tszValue, _ttoi(tszGetType)); } - else if (0 == _tcsnicmp(lpszParamValue4, tszValue, _tcslen(lpszParamValue4))) + else if (0 == _tcsnicmp(lpszParamBank, tszValue, _tcslen(lpszParamBank))) { //是不是银行卡信息 memset(tszKey, '\0', sizeof(tszKey)); @@ -218,7 +218,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszGetType); XEngine_HTTPTask_BankInfo(lpszClientAddr, tszValue, _ttoi(tszGetType)); } - else if (0 == _tcsnicmp(lpszParamValue5, tszValue, _tcslen(lpszParamValue5))) + else if (0 == _tcsnicmp(lpszParamLanguage, tszValue, _tcslen(lpszParamLanguage))) { //是不是语言转换 TCHAR tszCvtType[64]; @@ -245,7 +245,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[3], "=", tszKey, tszCvtType); XEngine_HTTPTask_Language(lpszClientAddr, tszValue, _ttoi(tszGetType), _ttoi(tszCvtType)); } - else if (0 == _tcsnicmp(lpszParamValue6, tszValue, _tcslen(lpszParamValue6))) + else if (0 == _tcsnicmp(lpszParamTranslation, tszValue, _tcslen(lpszParamTranslation))) { //是不是翻译 TCHAR tszCvtType[64]; diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h index 78f771d..5eab759 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h @@ -62,6 +62,7 @@ using namespace std; #include "XEngine_HTTPTask/HTTPTask_Bank.h" #include "XEngine_HTTPTask/HTTPTask_Language.h" #include "XEngine_HTTPTask/HTTPTask_Translation.h" +#include "XEngine_HTTPTask/HTTPTask_Forward.h" /******************************************************************** // Created: 2022/01/20 14:42:06 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ServiceApp\XEngine_HttpApp\XEngine_Hdr.h -- Gitee From 9e9813ef89204b1842ae5c7ae1d5e21c796f198c Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 7 Jun 2022 14:07:33 +0800 Subject: [PATCH 03/19] added:code for framework of forward --- .../XEngine_HttpApp/XEngine_HTTPTask.cpp | 43 ++++++++++++++++--- .../XEngine_HTTPTask/HTTPTask_Forward.cpp | 7 +++ .../XEngine_HTTPTask/HTTPTask_Forward.h | 3 ++ .../XEngine_HttpApp/XEngine_HttpApp.vcxproj | 2 + .../XEngine_HttpApp.vcxproj.filters | 6 +++ 5 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.cpp create mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.h diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp index cc3839b..649c9bb 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp @@ -96,6 +96,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR LPCTSTR lpszParamBank = _T("bank"); LPCTSTR lpszParamLanguage = _T("language"); LPCTSTR lpszParamTranslation = _T("translation"); + LPCTSTR lpszParamForward = _T("forward"); memset(tszKey, '\0', sizeof(tszKey)); memset(tszValue, '\0', sizeof(tszValue)); @@ -132,7 +133,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR memset(tszKey, '\0', sizeof(tszKey)); memset(tszValue, '\0', sizeof(tszValue)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -155,7 +156,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR memset(tszKey, '\0', sizeof(tszKey)); memset(tszValue, '\0', sizeof(tszValue)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -178,7 +179,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR memset(tszKey, '\0', sizeof(tszKey)); memset(tszValue, '\0', sizeof(tszValue)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -201,7 +202,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR memset(tszKey, '\0', sizeof(tszKey)); memset(tszValue, '\0', sizeof(tszValue)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -230,7 +231,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR memset(tszGetType, '\0', sizeof(tszGetType)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -257,7 +258,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR memset(tszGetType, '\0', sizeof(tszGetType)); BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFunc2, tszKey, _tcslen(lpszParamFunc2))) + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) { st_HDRParam.nHttpCode = 404; RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); @@ -272,6 +273,36 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[3], "=", tszKey, tszCvtType); XEngine_HTTPTask_Translation(lpszClientAddr, tszValue, _ttoi(tszGetType), _ttoi(tszCvtType));; } + else if (0 == _tcsnicmp(lpszParamForward, tszValue, _tcslen(lpszParamForward))) + { + //数据转发接口 + TCHAR tszSrcAddr[128]; + TCHAR tszDstAddr[128]; + + memset(tszKey, '\0', sizeof(tszKey)); + memset(tszValue, '\0', sizeof(tszValue)); + memset(tszSrcAddr, '\0', sizeof(tszSrcAddr)); + memset(tszDstAddr, '\0', sizeof(tszDstAddr)); + + BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) + { + st_HDRParam.nHttpCode = 404; + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return FALSE; + } + //类型0为获取列表,1为注册,2为转发请求,3为心跳 + int nType = _ttoi(tszValue); + if (1 == nType) + { + BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszSrcAddr); + BaseLib_OperatorString_GetKeyValue(pptszList[3], "=", tszKey, tszDstAddr); + } + XEngine_HTTPTask_Forward(lpszClientAddr, nType, tszSrcAddr, tszDstAddr); + } BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); } else diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.cpp new file mode 100644 index 0000000..671fe88 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.cpp @@ -0,0 +1,7 @@ +#include "../XEngine_Hdr.h" + + +BOOL XEngine_HTTPTask_Forward(LPCTSTR lpszClientAddr, int nType, LPCTSTR lpszSrcAddr, LPCTSTR lpszDstAddr) +{ + return TRUE; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.h new file mode 100644 index 0000000..5da22b6 --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.h @@ -0,0 +1,3 @@ +#pragma once + +BOOL XEngine_HTTPTask_Forward(LPCTSTR lpszClientAddr, int nType, LPCTSTR lpszSrcAddr, LPCTSTR lpszDstAddr); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj index 1af4aec..9789887 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj @@ -157,6 +157,7 @@ + @@ -170,6 +171,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 9118afe..ae21e7f 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters @@ -54,6 +54,9 @@ 源文件 + + 源文件\XEngine_HTTPTask + @@ -89,5 +92,8 @@ 头文件 + + 头文件\XEngine_HTTPTask + \ No newline at end of file -- Gitee From ae5d92b732de74290462bb8db9b7c8f757fc7f88 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 8 Jun 2022 09:25:10 +0800 Subject: [PATCH 04/19] delete:forward code --- .../XEngine_HttpApp/XEngine_HTTPTask.cpp | 30 ------------------- .../XEngine_HTTPTask/HTTPTask_Forward.cpp | 7 ----- .../XEngine_HTTPTask/HTTPTask_Forward.h | 3 -- .../XEngine_HttpApp/XEngine_Hdr.h | 1 - .../XEngine_HttpApp/XEngine_HttpApp.vcxproj | 2 -- .../XEngine_HttpApp.vcxproj.filters | 6 ---- 6 files changed, 49 deletions(-) delete mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.cpp delete mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.h diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp index 649c9bb..9e83f78 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp @@ -273,36 +273,6 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[3], "=", tszKey, tszCvtType); XEngine_HTTPTask_Translation(lpszClientAddr, tszValue, _ttoi(tszGetType), _ttoi(tszCvtType));; } - else if (0 == _tcsnicmp(lpszParamForward, tszValue, _tcslen(lpszParamForward))) - { - //数据转发接口 - TCHAR tszSrcAddr[128]; - TCHAR tszDstAddr[128]; - - memset(tszKey, '\0', sizeof(tszKey)); - memset(tszValue, '\0', sizeof(tszValue)); - memset(tszSrcAddr, '\0', sizeof(tszSrcAddr)); - memset(tszDstAddr, '\0', sizeof(tszDstAddr)); - - BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) - { - st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); - XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); - BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return FALSE; - } - //类型0为获取列表,1为注册,2为转发请求,3为心跳 - int nType = _ttoi(tszValue); - if (1 == nType) - { - BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszSrcAddr); - BaseLib_OperatorString_GetKeyValue(pptszList[3], "=", tszKey, tszDstAddr); - } - XEngine_HTTPTask_Forward(lpszClientAddr, nType, tszSrcAddr, tszDstAddr); - } BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); } else diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.cpp deleted file mode 100644 index 671fe88..0000000 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "../XEngine_Hdr.h" - - -BOOL XEngine_HTTPTask_Forward(LPCTSTR lpszClientAddr, int nType, LPCTSTR lpszSrcAddr, LPCTSTR lpszDstAddr) -{ - return TRUE; -} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.h deleted file mode 100644 index 5da22b6..0000000 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_Forward.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -BOOL XEngine_HTTPTask_Forward(LPCTSTR lpszClientAddr, int nType, LPCTSTR lpszSrcAddr, LPCTSTR lpszDstAddr); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h index 5eab759..78f771d 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h @@ -62,7 +62,6 @@ using namespace std; #include "XEngine_HTTPTask/HTTPTask_Bank.h" #include "XEngine_HTTPTask/HTTPTask_Language.h" #include "XEngine_HTTPTask/HTTPTask_Translation.h" -#include "XEngine_HTTPTask/HTTPTask_Forward.h" /******************************************************************** // Created: 2022/01/20 14:42:06 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ServiceApp\XEngine_HttpApp\XEngine_Hdr.h diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj index 9789887..1af4aec 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj @@ -157,7 +157,6 @@ - @@ -171,7 +170,6 @@ - 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 ae21e7f..9118afe 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters @@ -54,9 +54,6 @@ 源文件 - - 源文件\XEngine_HTTPTask - @@ -92,8 +89,5 @@ 头文件 - - 头文件\XEngine_HTTPTask - \ No newline at end of file -- Gitee From 65d10a7baced7996ed2ce46df742f2ba2d73a8d8 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 14 Jun 2022 17:11:21 +0800 Subject: [PATCH 05/19] added:p2p client for help module --- XEngine_Source/XEngine_ModuleHelp/Makefile | 8 +- .../XEngine_ModuleHelp/ModuleHelp_Define.h | 147 +++++- .../XEngine_ModuleHelp/ModuleHelp_Error.h | 12 +- .../ModuleHelp_P2PClient.cpp | 470 ++++++++++++++++++ .../ModuleHelp_P2PClient.h | 31 ++ .../XEngine_ModuleHelp/XEngine_ModuleHelp.def | 10 +- .../XEngine_ModuleHelp.vcxproj | 3 + .../XEngine_ModuleHelp.vcxproj.filters | 12 + XEngine_Source/XEngine_ModuleHelp/pch.cpp | 33 ++ XEngine_Source/XEngine_ModuleHelp/pch.h | 6 + 10 files changed, 726 insertions(+), 6 deletions(-) create mode 100644 XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp create mode 100644 XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h diff --git a/XEngine_Source/XEngine_ModuleHelp/Makefile b/XEngine_Source/XEngine_ModuleHelp/Makefile index d39d96f..93b5d4a 100644 --- a/XEngine_Source/XEngine_ModuleHelp/Makefile +++ b/XEngine_Source/XEngine_ModuleHelp/Makefile @@ -2,11 +2,11 @@ CC = g++ -Wall -std=c++17 -fPIC RELEASE = 0 UNICODE = 0 INCLUDE = -I ./ -I ../XEngine_ThirdPart/opencc/include -LOADBIN = -L ../XEngine_ThirdPart/opencc/ubuntu -LIB = -lopencc +LOADBIN = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L ../XEngine_ThirdPart/opencc/ubuntu +LIB = -lXEngine_BaseLib -lopencc LIBEX = -static-libgcc -lrt -ldl -lpthread LOADSO = -Wl,-rpath=./,--disable-new-dtags -LIBINCLUDE = ModuleHelp_IDCard.o ModuleHelp_Language.o pch.o +LIBINCLUDE = ModuleHelp_IDCard.o ModuleHelp_Language.o ModuleHelp_P2PClient.o pch.o ifeq ($(RELEASE),1) FLAGS = -c -O2 @@ -30,6 +30,8 @@ ModuleHelp_IDCard.o:./ModuleHelp_IDCard/ModuleHelp_IDCard.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./ModuleHelp_IDCard/ModuleHelp_IDCard.cpp ModuleHelp_Language.o:./ModuleHelp_Language/ModuleHelp_Language.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./ModuleHelp_Language/ModuleHelp_Language.cpp +ModuleHelp_P2PClient.o:./ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp pch.o:./pch.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./pch.cpp diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h index 65818bf..7305d2e 100644 --- a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h @@ -11,6 +11,25 @@ // History: *********************************************************************/ ////////////////////////////////////////////////////////////////////////// +// 导出数据结构 +////////////////////////////////////////////////////////////////////////// +//计时器 +typedef struct +{ + __int64x dwUserTime; //用户存在时间 + __int64x dwPacketTime; //包时间,拿到包后的存活时间 + __int64x dwKeepAlive; //保活计时器时间,经过网络时间 + unsigned short int usTTL : 1; //路由数 +}P2XP_TIMER_INFOMATION, * LPP2XP_TIMER_INFOMATION; +//一个节点信息 +typedef struct +{ + XENGINE_P2XPPEER_PROTOCOL st_PeerAddr; //P2P通信的时候使用的地址(客户方使用) + P2XP_TIMER_INFOMATION st_PeerTimer; //节点时间信息 + XENGINE_IPADDRINFO st_IPAddrInfo; //IP地址信息 + BOOL bIsLogin; +}XENGINE_P2XP_PEERINFO, * LPNETENGINE_P2XP_PEERINFO; +////////////////////////////////////////////////////////////////////////// /// 导出的函数 ////////////////////////////////////////////////////////////////////////// extern "C" DWORD ModuleHelp_GetLastError(int *pInt_SysError = NULL); @@ -90,4 +109,130 @@ extern "C" BOOL ModuleHelp_Language_ConvertZh(LPCTSTR lpszJsonFile, LPCTSTR lpsz 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleHelp_Translation_Convert(ENUM_XENGINE_APISERVICE_TRANSLATION_TYPE enTranslationType, TCHAR* ptszTranslationType); \ No newline at end of file +extern "C" BOOL ModuleHelp_Translation_Convert(ENUM_XENGINE_APISERVICE_TRANSLATION_TYPE enTranslationType, TCHAR* ptszTranslationType); +/************************************************************************/ +/* 节点管理器导出函数 */ +/************************************************************************/ +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Add +函数功能:添加一个客户到一个节点信息 + 参数.一:pSt_PeerInfo + In/Out:In + 类型:结构体指针 + 可空:N + 意思:要添加的节点信息 +返回值 + 类型:逻辑型 + 意思:是否添加成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO * pSt_PeerInfo); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Get +函数功能:获取P2P节点对应信息 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要查询的地址 + 参数.二:pSt_PeerInfo + In/Out:Out + 类型:数据结构指针 + 可空:Y + 意思:如果为空将不导出对应的数据 +返回值 + 类型:逻辑型 + 意思:是否查找成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol, XENGINE_P2XP_PEERINFO * pSt_PeerInfo = NULL); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetLan +函数功能:获取局域网IP地址列表 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要查找地址信息 + 参数.二:pppSt_P2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:导出局域网IP地址列表 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出地址列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:参数二需要调用基础库的BaseLib_OperatorMemory_Free函数进行内存释放 +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol, XENGINE_P2XPPEER_PROTOCOL * **pppSt_P2XPClient, int* pInt_ListCount); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetLList +函数功能:获取同一公网下所有局域网主IP列表 + 参数.一:lpszPubAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要获取的IP地址 + 参数.二:pppszP2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出内网主IP地址列表 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:参数二需要调用基础库的BaseLib_OperatorMemory_Free函数进行内存释放 +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_GetLList(LPCSTR lpszPubAddr, CHAR * **pppszP2XPClient, int* pInt_ListCount); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetWList +函数功能:获取所有连接到的公网地址列表 + 参数.一:pppszP2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出地址列表 + 参数.二:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_GetWList(CHAR * **pppszP2XPClient, int* pInt_ListCount); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Delete +函数功能:删除一个指定的节点 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要删除的节点地址 +返回值 + 类型:逻辑型 + 意思:是否成功删除 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_DelAll +函数功能:清空节点列表数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_DelAll(); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h index fd95452..c18d384 100644 --- a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h @@ -21,4 +21,14 @@ ////////////////////////////////////////////////////////////////////////// #define ERROR_XENGINE_APISERVICE_MODULE_HELP_LANGUAGE_PARAMENT 0xD1001 //参数错误 #define ERROR_XENGINE_APISERVICE_MODULE_HELP_LANGUAGE_FAILED 0xD1002 //处理失败 -#define ERROR_XENGINE_APISERVICE_MODULE_HELP_LANGUAGE_NOTSUPPORT 0xD1003 //不支持的类型 \ No newline at end of file +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_LANGUAGE_NOTSUPPORT 0xD1003 //不支持的类型 +////////////////////////////////////////////////////////////////////////// +// 节点管理器错误 +////////////////////////////////////////////////////////////////////////// +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_ISEXIST 0xB0E0001 //用户已经存在 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_MALLOC 0xB0E0002 //申请内存失败 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT 0xB0E0010 //获取用户信息失败,参数错误 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND 0xB0E0011 //没有找到用户 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPUBADDRR 0xB0E0051 //公网IP地址没有找到 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPRIADDR 0xB0E0052 //私有网络IP地址没有找到 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOLIST 0xB0E0053 //没有数据存在 diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp new file mode 100644 index 0000000..cf9cf66 --- /dev/null +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp @@ -0,0 +1,470 @@ +#include "pch.h" +#include "ModuleHelp_P2PClient.h" +/******************************************************************** +// Created: 2022/06/13 16:56:32 +// File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_P2PClient\ModuleHelp_P2PClient.cpp +// File Path: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_P2PClient +// File Base: ModuleHelp_P2PClient +// File Ext: cpp +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: P2P客户端管理器 +// History: +*********************************************************************/ +CModuleHelp_P2PClient::CModuleHelp_P2PClient() +{ +} +CModuleHelp_P2PClient::~CModuleHelp_P2PClient() +{ +} +////////////////////////////////////////////////////////////////////////// +// 公有函数 +////////////////////////////////////////////////////////////////////////// +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Add +函数功能:添加一个客户到一个节点信息 + 参数.一:pSt_PeerInfo + In/Out:In + 类型:结构体指针 + 可空:N + 意思:要添加的节点信息 +返回值 + 类型:逻辑型 + 意思:是否添加成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO* pSt_PeerInfo) +{ + ModuleHelp_IsErrorOccur = FALSE; + + st_Locker.lock(); + unordered_map > >::iterator stl_MapIteratorAddr = stl_MapClients.find(pSt_PeerInfo->st_PeerAddr.tszPublicAddr); + if (stl_MapIteratorAddr == stl_MapClients.end()) + { + //没有找到,一个一个加入,首先加入私有同步网络 + list stl_ListSecond; + stl_ListSecond.push_back(*pSt_PeerInfo); + //获取私有网络的路由地址 + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + if (!BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_PeerInfo->st_PeerAddr.tszPrivateAddr, &st_LibAddr)) + { + //没有内网地址不加入. + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = BaseLib_GetLastError(); + return FALSE; + } + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + //然后加入到 + unordered_map > stl_MapSecond; + stl_MapSecond.insert(make_pair(tszPrivateAddr, stl_ListSecond)); + stl_MapClients.insert(make_pair(pSt_PeerInfo->st_PeerAddr.tszPublicAddr, stl_MapSecond)); + } + else + { + //找到了这个公网的地址 + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + //获取私有网络的路由地址 + if (!BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_PeerInfo->st_PeerAddr.tszPrivateAddr, &st_LibAddr)) + { + //没有内网地址不加入. + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = BaseLib_GetLastError(); + return FALSE; + } + //内网地址192.168.1.2 内网出口192.168.1.1 链接地址10.0.1.0:13444 + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + unordered_map >::iterator stl_MapIteartorPrivate = stl_MapIteratorAddr->second.find(tszPrivateAddr); + if (stl_MapIteartorPrivate == stl_MapIteratorAddr->second.end()) + { + list stl_ListClient; + stl_ListClient.push_back(*pSt_PeerInfo); + stl_MapIteratorAddr->second.insert(make_pair(tszPrivateAddr, stl_ListClient)); + } + else + { + BOOL bIsFound = FALSE; + //查找链接地址是否存在.存在表示已经加入过了,那么就什么都不做 + list::iterator stl_ListIterator = stl_MapIteartorPrivate->second.begin(); + for (; stl_ListIterator != stl_MapIteartorPrivate->second.end(); stl_ListIterator++) + { + if (0 == _tcscmp(stl_ListIterator->st_PeerAddr.tszConnectAddr, pSt_PeerInfo->st_PeerAddr.tszConnectAddr)) + { + bIsFound = TRUE; + break; + } + } + //没有找到就加入 + if (!bIsFound) + { + stl_MapIteartorPrivate->second.push_back(*pSt_PeerInfo); + } + } + } + st_Locker.unlock(); + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Get +函数功能:获取P2P节点对应信息 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要查询的地址 + 参数.二:pSt_PeerInfo + In/Out:Out + 类型:数据结构指针 + 可空:Y + 意思:如果为空将不导出对应的数据 +返回值 + 类型:逻辑型 + 意思:是否查找成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL *pSt_P2PProtocol, XENGINE_P2XP_PEERINFO* pSt_PeerInfo /* = NULL */) +{ + ModuleHelp_IsErrorOccur = FALSE; + + if (NULL == pSt_P2PProtocol) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT; + return FALSE; + } + //查找元素 + st_Locker.lock_shared(); + unordered_map > >::const_iterator stl_MapPubIterator = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); + if (stl_MapPubIterator == stl_MapClients.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + //转换地址 + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + //获取私有网络的路由地址 + BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_P2PProtocol->tszPrivateAddr, &st_LibAddr); + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + + unordered_map >::const_iterator stl_MapPriIterator = stl_MapPubIterator->second.find(tszPrivateAddr); + if (stl_MapPriIterator == stl_MapPubIterator->second.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + BOOL bFound = FALSE; + list::const_iterator stl_ListIterator = stl_MapPriIterator->second.begin(); + for (; stl_ListIterator != stl_MapPriIterator->second.end(); stl_ListIterator++) + { + if (0 == _tcsncmp(pSt_P2PProtocol->tszConnectAddr, stl_ListIterator->st_PeerAddr.tszConnectAddr, _tcslen(pSt_P2PProtocol->tszConnectAddr))) + { + bFound = TRUE; + break; + } + } + if (!bFound) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + //判断是否导出节点信息 + if (NULL != pSt_PeerInfo) + { + *pSt_PeerInfo = *stl_ListIterator; + } + st_Locker.unlock_shared(); + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetLan +函数功能:获取局域网IP地址列表 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要查找地址信息 + 参数.二:pppSt_P2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:导出局域网IP地址列表 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出地址列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:参数二需要调用基础库的BaseLib_OperatorMemory_Free函数进行内存释放 +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, XENGINE_P2XPPEER_PROTOCOL*** pppSt_P2XPClient, int* pInt_ListCount) +{ + ModuleHelp_IsErrorOccur = FALSE; + + if ((NULL == pSt_P2PProtocol) || (NULL == pppSt_P2XPClient) || (NULL == pInt_ListCount)) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT; + return FALSE; + } + //查找公网IP地址 + st_Locker.lock_shared(); + unordered_map > >::const_iterator stl_MapIterator = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); + if (stl_MapIterator == stl_MapClients.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPUBADDRR; + st_Locker.unlock_shared(); + return FALSE; + } + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + //如果输入的是192.168.1.1 IP,就我们自己分割,否则认为输入的是 192.168.1 + if (BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_P2PProtocol->tszPrivateAddr, &st_LibAddr)) + { + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + unordered_map >::const_iterator stl_MapSubIterator = stl_MapIterator->second.find(tszPrivateAddr); + if (stl_MapSubIterator == stl_MapIterator->second.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPRIADDR; + st_Locker.unlock_shared(); + return FALSE; + } + if (stl_MapSubIterator->second.empty()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOLIST; + st_Locker.unlock_shared(); + return FALSE; + } + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_P2XPClient, stl_MapSubIterator->second.size(), sizeof(XENGINE_P2XPPEER_PROTOCOL)); + list::const_iterator stl_ListIterator = stl_MapSubIterator->second.begin(); + for (int i = 0; stl_ListIterator != stl_MapSubIterator->second.end(); stl_ListIterator++, i++) + { + *(*pppSt_P2XPClient)[i] = stl_ListIterator->st_PeerAddr; + } + *pInt_ListCount = stl_MapSubIterator->second.size(); + } + else + { + unordered_map < string, list >::const_iterator stl_MapSubIterator = stl_MapIterator->second.find(pSt_P2PProtocol->tszPrivateAddr); + if (stl_MapSubIterator == stl_MapIterator->second.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPRIADDR; + st_Locker.unlock_shared(); + return FALSE; + } + if (stl_MapSubIterator->second.empty()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOLIST; + st_Locker.unlock_shared(); + return FALSE; + } + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_P2XPClient, stl_MapSubIterator->second.size(), sizeof(XENGINE_P2XPPEER_PROTOCOL)); + list::const_iterator stl_ListIterator = stl_MapSubIterator->second.begin(); + for (int i = 0; stl_ListIterator != stl_MapSubIterator->second.end(); stl_ListIterator++, i++) + { + *(*pppSt_P2XPClient)[i] = stl_ListIterator->st_PeerAddr; + } + *pInt_ListCount = stl_MapSubIterator->second.size(); + } + st_Locker.unlock_shared(); + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetLList +函数功能:获取同一公网下所有局域网主IP列表 + 参数.一:lpszPubAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要获取的IP地址 + 参数.二:pppszP2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出内网主IP地址列表 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:参数二需要调用基础库的BaseLib_OperatorMemory_Free函数进行内存释放 +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_GetLList(LPCTSTR lpszPubAddr, TCHAR*** pppszP2XPClient, int* pInt_ListCount) +{ + ModuleHelp_IsErrorOccur = FALSE; + + if ((NULL == lpszPubAddr) || (NULL == pppszP2XPClient) || (NULL == pInt_ListCount)) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT; + return FALSE; + } + st_Locker.lock_shared(); + unordered_map > >::const_iterator stl_MapIterator = stl_MapClients.find(lpszPubAddr); + if (stl_MapIterator == stl_MapClients.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppszP2XPClient, stl_MapIterator->second.size(), 128); + unordered_map >::const_iterator stl_MapListIterator = stl_MapIterator->second.begin(); + for (int i = 0; stl_MapListIterator != stl_MapIterator->second.end(); stl_MapListIterator++, i++) + { + _tcscpy((*pppszP2XPClient)[i], stl_MapListIterator->first.c_str()); + } + *pInt_ListCount = stl_MapIterator->second.size(); + st_Locker.unlock_shared(); + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_GetWList +函数功能:获取所有连接到的公网地址列表 + 参数.一:pppszP2XPClient + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出地址列表 + 参数.二:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_GetWList(TCHAR*** pppszP2XPClient, int* pInt_ListCount) +{ + ModuleHelp_IsErrorOccur = FALSE; + + if ((NULL == pppszP2XPClient) || (NULL == pInt_ListCount)) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT; + return FALSE; + } + if (stl_MapClients.size() <= 0) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + return FALSE; + } + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppszP2XPClient, stl_MapClients.size(), 128); + + st_Locker.lock_shared(); + unordered_map > >::const_iterator stl_MapIterator = stl_MapClients.begin(); + for (int i = 0; stl_MapIterator != stl_MapClients.end(); stl_MapIterator++, i++) + { + _tcscpy((*pppszP2XPClient)[i], stl_MapIterator->first.c_str()); + } + *pInt_ListCount = stl_MapClients.size(); + st_Locker.unlock_shared(); + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Delete +函数功能:删除一个指定的节点 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要删除的节点地址 +返回值 + 类型:逻辑型 + 意思:是否成功删除 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol) +{ + ModuleHelp_IsErrorOccur = FALSE; + //查找公网地址 + unordered_map > >::iterator stl_MapPubIteartor = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); + if (stl_MapPubIteartor != stl_MapClients.end()) + { + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + if (BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_P2PProtocol->tszPrivateAddr, &st_LibAddr)) + { + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + //查找私有路由地址 + unordered_map >::iterator stl_MapSubIterator = stl_MapPubIteartor->second.find(tszPrivateAddr); + if (stl_MapSubIterator != stl_MapPubIteartor->second.end()) + { + //查找局域网自身的IP地址是否存在 + list::iterator stl_ListIterator = stl_MapSubIterator->second.begin(); + for (; stl_ListIterator != stl_MapSubIterator->second.end(); stl_ListIterator++) + { + if (0 == _tcscmp(stl_ListIterator->st_PeerAddr.tszConnectAddr, pSt_P2PProtocol->tszConnectAddr)) + { + //找到了删除 + stl_MapSubIterator->second.erase(stl_ListIterator); + break; + } + } + if (stl_MapSubIterator->second.empty()) + { + //如果这个私有网络列表为空,那么就清楚他 + stl_MapPubIteartor->second.erase(stl_MapSubIterator); + } + } + } + if (stl_MapPubIteartor->second.empty()) + { + stl_MapClients.erase(stl_MapPubIteartor); //如果这个公有网络IP地址列表为空,那么就删除他. + } + } + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_DelAll +函数功能:清空节点列表数据 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_DelAll() +{ + ModuleHelp_IsErrorOccur = FALSE; + + st_Locker.lock(); + stl_MapClients.clear(); + st_Locker.unlock(); + + return TRUE; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h new file mode 100644 index 0000000..fd01f96 --- /dev/null +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h @@ -0,0 +1,31 @@ +#pragma once +/******************************************************************** +// Created: 2022/06/13 16:55:53 +// File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_P2PClient\ModuleHelp_P2PClient.h +// File Path: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_P2PClient +// File Base: ModuleHelp_P2PClient +// File Ext: h +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: P2P客户端管理器 +// History: +*********************************************************************/ + +class CModuleHelp_P2PClient +{ +public: + CModuleHelp_P2PClient(); + ~CModuleHelp_P2PClient(); +public: + BOOL ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO* pSt_PeerInfo); + BOOL ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, XENGINE_P2XP_PEERINFO* pSt_PeerInfo = NULL); + BOOL ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, XENGINE_P2XPPEER_PROTOCOL*** pppSt_P2XPClient, int* pInt_ListCount); + BOOL ModuleHelp_P2PClient_GetLList(LPCTSTR lpszPubAddr, TCHAR*** pppszP2XPClient, int* pInt_ListCount); + BOOL ModuleHelp_P2PClient_GetWList(TCHAR*** pppszP2XPClient, int* pInt_ListCount); + BOOL ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol); + BOOL ModuleHelp_P2PClient_DelAll(); +private: + shared_mutex st_Locker; +private: + unordered_map > > stl_MapClients; +}; diff --git a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def index ea96692..472a066 100644 --- a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def +++ b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def @@ -7,4 +7,12 @@ EXPORTS ModuleHelp_IDCard_CheckSum ModuleHelp_Language_ConvertZh - ModuleHelp_Translation_Convert \ No newline at end of file + ModuleHelp_Translation_Convert + + ModuleHelp_P2PClient_Add + ModuleHelp_P2PClient_Get + ModuleHelp_P2PClient_GetLan + ModuleHelp_P2PClient_GetLList + ModuleHelp_P2PClient_GetWList + ModuleHelp_P2PClient_Delete + ModuleHelp_P2PClient_DelAll \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj index fc8326d..06db81a 100644 --- a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj +++ b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj @@ -73,6 +73,7 @@ true $(XEngine_Include);../XEngine_ThirdPart/opencc/include;$(IncludePath) + $(XEngine_Lib32);$(LibraryPath) false @@ -164,12 +165,14 @@ + + Create Create diff --git a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj.filters b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj.filters index e7d2db5..d8282e6 100644 --- a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj.filters +++ b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj.filters @@ -25,6 +25,12 @@ {47b05cf6-fe24-43df-8860-e291baa7ffbb} + + {65195020-af5e-4083-804d-288f2ce618ec} + + + {2b552f75-e436-45a8-ba71-e398eeb4a68a} + @@ -45,6 +51,9 @@ 头文件\ModuleHelp_Language + + 头文件\ModuleHelp_P2PClient + @@ -59,6 +68,9 @@ 源文件\ModuleHelp_Language + + 源文件\ModuleHelp_P2PClient + diff --git a/XEngine_Source/XEngine_ModuleHelp/pch.cpp b/XEngine_Source/XEngine_ModuleHelp/pch.cpp index 23dc3ac..d09a3e7 100644 --- a/XEngine_Source/XEngine_ModuleHelp/pch.cpp +++ b/XEngine_Source/XEngine_ModuleHelp/pch.cpp @@ -1,6 +1,7 @@ #include "pch.h" #include "ModuleHelp_IDCard/ModuleHelp_IDCard.h" #include "ModuleHelp_Language/ModuleHelp_Language.h" +#include "ModuleHelp_P2PClient/ModuleHelp_P2PClient.h" /******************************************************************** // Created: 2022/03/04 13:37:38 // File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\pch.cpp @@ -17,6 +18,7 @@ DWORD ModuleHelp_dwErrorCode = 0; ////////////////////////////////////////////////////////////////////////// CModuleHelp_IDCard m_IDCard; CModuleHelp_Language m_Language; +CModuleHelp_P2PClient m_P2PClient; ////////////////////////////////////////////////////////////////////////// /// 导出的函数 ////////////////////////////////////////////////////////////////////////// @@ -49,4 +51,35 @@ extern "C" BOOL ModuleHelp_Language_ConvertZh(LPCTSTR lpszJsonFile, LPCTSTR lpsz extern "C" BOOL ModuleHelp_Translation_Convert(ENUM_XENGINE_APISERVICE_TRANSLATION_TYPE enTranslationType, TCHAR * ptszTranslationType) { return m_Language.ModuleHelp_Translation_Convert(enTranslationType, ptszTranslationType); +} +/************************************************************************/ +/* 导出的P2P客户端帮助函数 */ +/************************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO * pSt_PeerInfo) +{ + return m_P2PClient.ModuleHelp_P2PClient_Add(pSt_PeerInfo); +} +extern "C" BOOL ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol, XENGINE_P2XP_PEERINFO * pSt_PeerInfo /* = NULL */) +{ + return m_P2PClient.ModuleHelp_P2PClient_Get(pSt_P2PProtocol, pSt_PeerInfo); +} +extern "C" BOOL ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol, XENGINE_P2XPPEER_PROTOCOL * **pppSt_P2XPClient, int* pInt_ListCount) +{ + return m_P2PClient.ModuleHelp_P2PClient_GetLan(pSt_P2PProtocol, pppSt_P2XPClient, pInt_ListCount); +} +extern "C" BOOL ModuleHelp_P2PClient_GetLList(LPCTSTR lpszPubAddr, TCHAR * **pppszP2XPClient, int* pInt_ListCount) +{ + return m_P2PClient.ModuleHelp_P2PClient_GetLList(lpszPubAddr, pppszP2XPClient, pInt_ListCount); +} +extern "C" BOOL ModuleHelp_P2PClient_GetWList(TCHAR * **pppszP2XPClient, int* pInt_ListCount) +{ + return m_P2PClient.ModuleHelp_P2PClient_GetWList(pppszP2XPClient, pInt_ListCount); +} +extern "C" BOOL ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol) +{ + return m_P2PClient.ModuleHelp_P2PClient_Delete(pSt_P2PProtocol); +} +extern "C" BOOL ModuleHelp_P2PClient_DelAll() +{ + return m_P2PClient.ModuleHelp_P2PClient_DelAll(); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/pch.h b/XEngine_Source/XEngine_ModuleHelp/pch.h index 9d58df7..bc631e4 100644 --- a/XEngine_Source/XEngine_ModuleHelp/pch.h +++ b/XEngine_Source/XEngine_ModuleHelp/pch.h @@ -15,10 +15,15 @@ #endif //PCH_H #include #include +#include +#include #include +using namespace std; #include #include #include +#include +#include #include "../XEngine_UserProtocol.h" #include "ModuleHelp_Define.h" #include "ModuleHelp_Error.h" @@ -37,6 +42,7 @@ extern BOOL ModuleHelp_IsErrorOccur; extern DWORD ModuleHelp_dwErrorCode; #ifdef _MSC_BUILD +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") #ifdef _WIN64 #pragma comment(lib,"../XEngine_ThirdPart/opencc/libx64/opencc") #else -- Gitee From 35e5072cba86122b81b46ecd433fc5047516d64e Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 16 Jun 2022 09:21:24 +0800 Subject: [PATCH 06/19] added:p2p protocol parse --- .../ModuleProtocol_Define.h | 103 +++++++++- .../ModuleProtocol_Parse.cpp | 187 ++++++++++++++++++ .../ModuleProtocol_Parse.h | 3 + .../XEngine_ModuleProtocol.def | 6 +- XEngine_Source/XEngine_ModuleProtocol/pch.cpp | 16 ++ 5 files changed, 313 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h index 4cbbd21..54274a3 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h @@ -411,4 +411,105 @@ extern "C" BOOL ModuleProtocol_Parse_Bank(LPCTSTR lpszMsgBuffer, int nMsgLen, XE 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo); \ No newline at end of file +extern "C" BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo); +/******************************************************************** +函数名称:ModuleProtocol_Parse_P2PLogin +函数功能:登录解析函数 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入缓冲区大小 + 参数.三:pSt_P2XPPeer + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输出解析后的节点信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Parse_P2PLogin(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL * pSt_P2XPPeer); +/******************************************************************** +函数名称:ModuleProtocol_Parse_P2PList +函数功能:解析列表请求 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入缓冲区大小 + 参数.三:ptszPubAddr + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出公有地址 + 参数.四:ptszPriAddr + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出私有地址 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Parse_P2PList(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR * ptszPubAddr, TCHAR * ptszPriAddr); +/******************************************************************** +函数名称:ModuleProtocol_Parse_P2PList +函数功能:解析列表请求 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入缓冲区大小 + 参数.三:ptszUserName + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出查询的用户名 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Parse_P2PUser(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR * ptszUserName); +/******************************************************************** +函数名称:ModuleProtocol_Parse_P2PConnect +函数功能:请求连接到指定地址 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入缓冲区大小 + 参数.三:pSt_P2XPPeer + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输出解析后的节点信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Parse_P2PConnect(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPIO_PROTOCOL * pSt_IOProtocol); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp index 03040fb..f9dada1 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp @@ -240,4 +240,191 @@ BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuff _tcscpy(pSt_LanguageInfo->tszSourceStr, st_JsonTranslation[0][0]["src"].asCString()); _tcscpy(pSt_LanguageInfo->tszDestStr, st_JsonTranslation[0][0]["tgt"].asCString()); return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Parse_P2PLogin +函数功能:登录解析函数 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入缓冲区大小 + 参数.三:pSt_P2XPPeer + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输出解析后的节点信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_P2PLogin(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_P2XPPeer) +{ + Protocol_IsErrorOccur = FALSE; + + if ((NULL == lpszMsgBuffer) || (NULL == pSt_P2XPPeer)) + { + Protocol_IsErrorOccur = TRUE; + Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; + return FALSE; + } + Json::Value st_JsonRoot; + Json::CharReaderBuilder st_JsonBuild; + Json::CharReader* pSt_JsonReader(st_JsonBuild.newCharReader()); + + JSONCPP_STRING st_JsonError; + //解析JSON + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) + { + Protocol_IsErrorOccur = TRUE; + Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; + return FALSE; + } + delete pSt_JsonReader; + pSt_JsonReader = NULL; + + if (!st_JsonRoot["tszUserName"].isNull()) + { + _tcscpy(pSt_P2XPPeer->tszUserName, st_JsonRoot["tszUserName"].asCString()); + } + if (!st_JsonRoot["tszPrivateAddr"].isNull()) + { + _tcscpy(pSt_P2XPPeer->tszPrivateAddr, st_JsonRoot["tszPrivateAddr"].asCString()); + } + if (!st_JsonRoot["tszPublicAddr"].isNull()) + { + _tcscpy(pSt_P2XPPeer->tszPublicAddr, st_JsonRoot["tszPublicAddr"].asCString()); + } + if (!st_JsonRoot["dwConnectType"].isNull()) + { + pSt_P2XPPeer->dwConnectType = st_JsonRoot["dwConnectType"].asInt(); + } + if (!st_JsonRoot["dwPeerType"].isNull()) + { + pSt_P2XPPeer->dwPeerType = st_JsonRoot["dwPeerType"].asInt(); + } + return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Parse_P2PList +函数功能:解析列表请求 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入缓冲区大小 + 参数.三:ptszPubAddr + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出公有地址 + 参数.四:ptszPriAddr + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出私有地址 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_P2PList(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR* ptszPubAddr, TCHAR* ptszPriAddr) +{ + Protocol_IsErrorOccur = FALSE; + + if ((NULL == lpszMsgBuffer) || (NULL == ptszPubAddr) || (NULL == ptszPriAddr)) + { + Protocol_IsErrorOccur = TRUE; + Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; + return FALSE; + } + Json::Value st_JsonRoot; + Json::CharReaderBuilder st_JsonBuild; + Json::CharReader* pSt_JsonReader(st_JsonBuild.newCharReader()); + + JSONCPP_STRING st_JsonError; + //解析JSON + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) + { + Protocol_IsErrorOccur = TRUE; + Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; + return FALSE; + } + delete pSt_JsonReader; + pSt_JsonReader = NULL; + + if (!st_JsonRoot["tszPublicAddr"].isNull()) + { + _tcscpy(ptszPubAddr, st_JsonRoot["tszPublicAddr"].asCString()); + } + if (!st_JsonRoot["tszPrivateAddr"].isNull()) + { + _tcscpy(ptszPriAddr, st_JsonRoot["tszPrivateAddr"].asCString()); + } + return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Parse_P2PList +函数功能:解析列表请求 + 参数.一:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的缓冲区 + 参数.二:nMsgLen + In/Out:In + 类型:整数型 + 可空:N + 意思:输入缓冲区大小 + 参数.三:ptszUserName + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出查询的用户名 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_P2PUser(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR* ptszUserName) +{ + Protocol_IsErrorOccur = FALSE; + + if ((NULL == lpszMsgBuffer) || (NULL == ptszUserName)) + { + Protocol_IsErrorOccur = TRUE; + Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; + return FALSE; + } + Json::Value st_JsonRoot; + Json::CharReaderBuilder st_JsonBuild; + Json::CharReader* pSt_JsonReader(st_JsonBuild.newCharReader()); + + JSONCPP_STRING st_JsonError; + //解析JSON + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) + { + Protocol_IsErrorOccur = TRUE; + Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; + return FALSE; + } + delete pSt_JsonReader; + pSt_JsonReader = NULL; + + if (!st_JsonRoot["tszUserName"].isNull()) + { + _tcscpy(ptszUserName, st_JsonRoot["tszUserName"].asCString()); + } + return TRUE; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h index f7c7e08..3f802e0 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h @@ -21,5 +21,8 @@ public: BOOL ModuleProtocol_Parse_IDCard(LPCTSTR lpszMsgBuffer, XENGINE_IDCARDINFO* pSt_IDInfo); BOOL ModuleProtocol_Parse_Bank(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_BANKINFO* pSt_BankInfo); BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo); + BOOL ModuleProtocol_Parse_P2PLogin(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_P2XPPeer); + BOOL ModuleProtocol_Parse_P2PList(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR* ptszPubAddr, TCHAR* ptszPriAddr); + BOOL ModuleProtocol_Parse_P2PUser(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR* ptszUserName); private: }; \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def index 8fce14c..e4e73d6 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def +++ b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def @@ -16,4 +16,8 @@ EXPORTS ModuleProtocol_Parse_IDCard ModuleProtocol_Parse_Bank - ModuleProtocol_Parse_Translation \ No newline at end of file + ModuleProtocol_Parse_Translation + ModuleProtocol_Parse_Lan + ModuleProtocol_Parse_WLan + ModuleProtocol_Parse_User + ModuleProtocol_Parse_Connect \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp index e83179b..4b9f165 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp @@ -85,4 +85,20 @@ extern "C" BOOL ModuleProtocol_Parse_Bank(LPCTSTR lpszMsgBuffer, int nMsgLen, XE extern "C" BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_LANGUAGEINFO * pSt_LanguageInfo) { return m_ProtocolParse.ModuleProtocol_Parse_Translation(lpszMsgBuffer, nMsgLen, pSt_LanguageInfo); +} +extern "C" BOOL ModuleProtocol_Parse_P2PLogin(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL * pSt_P2XPPeer) +{ + return m_P2XPParse.ModuleProtocol_Parse_P2PLogin(lpszMsgBuffer, nMsgLen, pSt_P2XPPeer); +} +extern "C" BOOL ModuleProtocol_Parse_P2PList(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR * ptszPubAddr, TCHAR * ptszPriAddr) +{ + return m_P2XPParse.ModuleProtocol_Parse_P2PList(lpszMsgBuffer, nMsgLen, ptszPubAddr, ptszPriAddr); +} +extern "C" BOOL ModuleProtocol_Parse_P2PUser(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR * ptszUserName) +{ + return m_P2XPParse.ModuleProtocol_Parse_P2PUser(lpszMsgBuffer, nMsgLen, ptszUserName); +} +extern "C" BOOL ModuleProtocol_Parse_P2PConnect(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPIO_PROTOCOL * pSt_IOProtocol) +{ + return m_P2XPParse.ModuleProtocol_Parse_P2PConnect(lpszMsgBuffer, nMsgLen, pSt_IOProtocol); } \ No newline at end of file -- Gitee From 2b581b03a88ed41096b9dbd5a7bc7d2461cf2817 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 16 Jun 2022 11:00:17 +0800 Subject: [PATCH 07/19] added:P2P packet protocol improved:p2p parse function --- .../ModuleProtocol_Define.h | 209 ++++++++---- .../ModuleProtocol_Packet.cpp | 312 ++++++++++++++++++ .../ModuleProtocol_Packet.h | 12 +- .../ModuleProtocol_Parse.cpp | 133 +------- .../ModuleProtocol_Parse.h | 4 +- .../XEngine_ModuleProtocol.def | 10 +- XEngine_Source/XEngine_ModuleProtocol/pch.cpp | 36 +- XEngine_Source/XEngine_ModuleProtocol/pch.h | 8 +- 8 files changed, 502 insertions(+), 222 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h index 54274a3..82033bf 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Define.h @@ -342,156 +342,219 @@ extern "C" BOOL ModuleProtocol_Packet_LanguageQuery(TCHAR* ptszMsgBuffer, int* p 备注: *********************************************************************/ extern "C" BOOL ModuleProtocol_Packet_LanguageQuery2(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo, int nCode = 0); -/************************************************************************/ -/* 导出的协议解析函数 */ -/************************************************************************/ /******************************************************************** -函数名称:ModuleProtocol_Parse_IDCard -函数功能:ID身份证号码解析 - 参数.一:lpszMsgBuffer - In/Out:In - 类型:常量字符指针 +函数名称:ModuleProtocol_Packet_P2PCommon +函数功能:P2XP公用协议打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 可空:N - 意思:输入要解析的身份证 - 参数.二:pSt_IDInfo + 意思:输出打好包的缓冲区 + 参数.二:pInt_MsgLen In/Out:Out - 类型:数据结构指针 + 类型:整数型指针 可空:N - 意思:输出ID身份证编码信息 + 意思:输出缓冲区大小 + 参数.三:nCode + In/Out:In + 类型:整数型 + 可空:Y + 意思:输入返回的值 + 参数.四:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输入要打包的后续内容 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleProtocol_Parse_IDCard(LPCTSTR lpszMsgBuffer, XENGINE_IDCARDINFO* pSt_IDInfo); +extern "C" BOOL ModuleProtocol_Packet_P2PCommon(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nCode = 0, LPCTSTR lpszMsgBuffer = NULL); /******************************************************************** -函数名称:ModuleProtocol_Parse_Bank -函数功能:银行卡解析 - 参数.一:lpszMsgBuffer +函数名称:ModuleProtocol_Packet_P2PLan +函数功能:响应同步局域网地址列表 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pppSt_ListClients In/Out:In - 类型:常量字符指针 + 类型:三级指针 可空:N - 意思:输入要解析的内容 - 参数.二:nMsgLen + 意思:输入局域网地址信息列表 + 参数.四:nListCount In/Out:In 类型:整数型 可空:N - 意思:输入解析大小 - 参数.三:pSt_BankInfo + 意思:局域网地址列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Packet_P2PLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL*** pppSt_ListClients, int nListCount); +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PWLan +函数功能:响应同步局域网所有地址列表 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pStl_ListClients In/Out:In - 类型:数据结构指针 + 类型:容器指针 可空:N - 意思:输出解析好的内容 + 意思:客户端列表 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleProtocol_Parse_Bank(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_BANKINFO* pSt_BankInfo); +extern "C" BOOL ModuleProtocol_Packet_P2PWLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, list* pStl_ListClients); /******************************************************************** -函数名称:ModuleProtocol_Parse_Translation -函数功能:翻译解析 - 参数.一:lpszMsgBuffer - In/Out:In - 类型:常量字符指针 +函数名称:ModuleProtocol_Packet_P2PUser +函数功能:响应用户查询用户信息的请求协议封包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 可空:N - 意思:输入要解析的内容 - 参数.二:nMsgLen + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pSt_PeerInfo In/Out:In - 类型:整数型 + 类型:数据结构指针 可空:N - 意思:输入解析大小 - 参数.三:pSt_LanguageInfo + 意思:输入获取到的用户信息 + 参数.四:pSt_AddrInfo In/Out:In 类型:数据结构指针 可空:N - 意思:输出解析好的内容 + 意思:IP地址信息 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo); +extern "C" BOOL ModuleProtocol_Packet_P2PUser(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_PeerInfo, XENGINE_IPADDRINFO* pSt_AddrInfo); /******************************************************************** -函数名称:ModuleProtocol_Parse_P2PLogin -函数功能:登录解析函数 - 参数.一:lpszMsgBuffer +函数名称:ModuleProtocol_Packet_P2PConnect +函数功能:请求连接打包函数 + 参数.一:pSt_ProtocolHdr In/Out:In - 类型:常量字符指针 + 类型:数据结构指针 可空:N - 意思:输入要解析的缓冲区 - 参数.二:nMsgLen + 意思:输入要打包的协议头 + 参数.二:pSt_IOProtocol In/Out:In - 类型:整数型 + 类型:数据结构指针 可空:N - 意思:输入缓冲区大小 - 参数.三:pSt_P2XPPeer + 意思:输入连接信息 + 参数.三:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.四:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleProtocol_Packet_P2PConnect(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPIO_PROTOCOL* pSt_IOProtocol); +/************************************************************************/ +/* 导出的协议解析函数 */ +/************************************************************************/ +/******************************************************************** +函数名称:ModuleProtocol_Parse_IDCard +函数功能:ID身份证号码解析 + 参数.一:lpszMsgBuffer In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要解析的身份证 + 参数.二:pSt_IDInfo + In/Out:Out 类型:数据结构指针 可空:N - 意思:输出解析后的节点信息 + 意思:输出ID身份证编码信息 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleProtocol_Parse_P2PLogin(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL * pSt_P2XPPeer); +extern "C" BOOL ModuleProtocol_Parse_IDCard(LPCTSTR lpszMsgBuffer, XENGINE_IDCARDINFO* pSt_IDInfo); /******************************************************************** -函数名称:ModuleProtocol_Parse_P2PList -函数功能:解析列表请求 +函数名称:ModuleProtocol_Parse_Bank +函数功能:银行卡解析 参数.一:lpszMsgBuffer In/Out:In 类型:常量字符指针 可空:N - 意思:输入要解析的缓冲区 + 意思:输入要解析的内容 参数.二:nMsgLen In/Out:In 类型:整数型 可空:N - 意思:输入缓冲区大小 - 参数.三:ptszPubAddr - In/Out:Out - 类型:字符指针 - 可空:N - 意思:输出公有地址 - 参数.四:ptszPriAddr - In/Out:Out - 类型:字符指针 + 意思:输入解析大小 + 参数.三:pSt_BankInfo + In/Out:In + 类型:数据结构指针 可空:N - 意思:输出私有地址 + 意思:输出解析好的内容 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleProtocol_Parse_P2PList(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR * ptszPubAddr, TCHAR * ptszPriAddr); +extern "C" BOOL ModuleProtocol_Parse_Bank(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_BANKINFO* pSt_BankInfo); /******************************************************************** -函数名称:ModuleProtocol_Parse_P2PList -函数功能:解析列表请求 +函数名称:ModuleProtocol_Parse_Translation +函数功能:翻译解析 参数.一:lpszMsgBuffer In/Out:In 类型:常量字符指针 可空:N - 意思:输入要解析的缓冲区 + 意思:输入要解析的内容 参数.二:nMsgLen In/Out:In 类型:整数型 可空:N - 意思:输入缓冲区大小 - 参数.三:ptszUserName - In/Out:Out - 类型:字符指针 + 意思:输入解析大小 + 参数.三:pSt_LanguageInfo + In/Out:In + 类型:数据结构指针 可空:N - 意思:输出查询的用户名 + 意思:输出解析好的内容 返回值 类型:逻辑型 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleProtocol_Parse_P2PUser(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR * ptszUserName); +extern "C" BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo); /******************************************************************** -函数名称:ModuleProtocol_Parse_P2PConnect -函数功能:请求连接到指定地址 +函数名称:ModuleProtocol_Parse_P2PClient +函数功能:P2P客户端请求解析函数 参数.一:lpszMsgBuffer In/Out:In 类型:常量字符指针 @@ -512,4 +575,4 @@ extern "C" BOOL ModuleProtocol_Parse_P2PUser(LPCTSTR lpszMsgBuffer, int nMsgLen, 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleProtocol_Parse_P2PConnect(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPIO_PROTOCOL * pSt_IOProtocol); \ No newline at end of file +extern "C" BOOL ModuleProtocol_Parse_P2PClient(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL * pSt_P2XPPeer); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp index c6846c6..e3f17cb 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.cpp @@ -634,4 +634,316 @@ BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_LanguageQuery2(TCHAR* ptszMsg "%s\r\n" "%d", nCode, pSt_LanguageInfo->tszSourceStr, pSt_LanguageInfo->tszDestStr, pSt_LanguageInfo->enType); return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PCommon +函数功能:P2XP公用协议打包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出打好包的缓冲区 + 参数.二:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出缓冲区大小 + 参数.三:nCode + In/Out:In + 类型:整数型 + 可空:Y + 意思:输入返回的值 + 参数.四:lpszMsgBuffer + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输入要打包的后续内容 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_P2PCommon(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nCode /* = 0 */, LPCTSTR lpszMsgBuffer /* = NULL */) +{ + 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; + + st_JsonRoot["nCode"] = 0; + if (NULL != lpszMsgBuffer) + { + st_JsonRoot["lpszMsgBuffer"] = lpszMsgBuffer; + } + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); + return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PLan +函数功能:响应同步局域网地址列表 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pppSt_ListClients + In/Out:In + 类型:三级指针 + 可空:N + 意思:输入局域网地址信息列表 + 参数.四:nListCount + In/Out:In + 类型:整数型 + 可空:N + 意思:局域网地址列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_P2PLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL*** pppSt_ListClients, int nListCount) +{ + ModuleProtocol_IsErrorOccur = FALSE; + + if ((NULL == pppSt_ListClients) || (NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + ModuleProtocol_IsErrorOccur = FALSE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PACKET_PARAMENT; + return FALSE; + } + Json::Value st_JsonRoot; + Json::Value st_JsonArray; + for (int i = 0; i < nListCount; i++) + { + Json::Value st_JsonObject; + st_JsonObject["ClientUser"] = (*pppSt_ListClients)[i]->tszUserName; + st_JsonObject["ClientAddr"] = (*pppSt_ListClients)[i]->tszPrivateAddr; + st_JsonArray.append(st_JsonObject); + } + st_JsonRoot["nCode"] = 0; + st_JsonRoot["lpszMsgBuffer"] = "sucess"; + st_JsonRoot["ClientArray"] = st_JsonArray; + st_JsonRoot["ClientCount"] = nListCount; + + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); + return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PWLan +函数功能:响应同步局域网所有地址列表 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pStl_ListClients + In/Out:In + 类型:容器指针 + 可空:N + 意思:客户端列表 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_P2PWLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, list* pStl_ListClients) +{ + ModuleProtocol_IsErrorOccur = FALSE; + + if ((NULL == pStl_ListClients) || (NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + ModuleProtocol_IsErrorOccur = FALSE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PACKET_PARAMENT; + return FALSE; + } + unordered_map> stl_MapClient; + //首先处理公网下的局域网网段列表 + for (auto stl_ListIterator = pStl_ListClients->begin(); stl_ListIterator != pStl_ListClients->end(); stl_ListIterator++) + { + TCHAR tszClientAddr[128]; + XENGINE_LIBADDR st_LibAddr; + P2XPPROTOCOL_LANPACKET st_LANPacket; + + memset(tszClientAddr, '\0', sizeof(tszClientAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + memset(&st_LANPacket, '\0', sizeof(P2XPPROTOCOL_LANPACKET)); + //分割 + BaseLib_OperatorIPAddr_IsIPV4Addr(stl_ListIterator->tszPrivateAddr, &st_LibAddr); + _stprintf(tszClientAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + //赋值 + _tcscpy(st_LANPacket.tszUsername, stl_ListIterator->tszUserName); + _tcscpy(st_LANPacket.tszClientAddr, stl_ListIterator->tszPrivateAddr); + //判断是否存在 + unordered_map>::iterator stl_MapIterator = stl_MapClient.find(tszClientAddr); + if (stl_MapIterator == stl_MapClient.end()) + { + list stl_ListClient; + + stl_ListClient.push_back(st_LANPacket); + stl_MapClient.insert(make_pair(tszClientAddr, stl_ListClient)); + } + else + { + stl_MapIterator->second.push_back(st_LANPacket); + } + } + //打包成JSON数据 + int nCount = 0; + Json::Value st_JsonRoot; + Json::Value st_JsonArray; + + for (auto stl_MapIterator = stl_MapClient.begin(); stl_MapIterator != stl_MapClient.end(); stl_MapIterator++) + { + Json::Value st_JsonList; + for (auto stl_ListIterator = stl_MapIterator->second.begin(); stl_ListIterator != stl_MapIterator->second.end(); stl_ListIterator++) + { + Json::Value st_JsonObject; + + nCount++; + st_JsonObject["ClientUser"] = stl_ListIterator->tszUsername; + st_JsonObject["ClientAddr"] = stl_ListIterator->tszClientAddr; + st_JsonList.append(st_JsonObject); + } + st_JsonArray["tszLANAddr"] = stl_MapIterator->first.c_str(); + st_JsonArray["tszLANList"] = st_JsonList; + } + st_JsonRoot["nCode"] = 0; + st_JsonRoot["lpszMsgBuffer"] = "sucess"; + st_JsonRoot["ClientArray"] = st_JsonArray; + st_JsonRoot["ClientCount"] = nCount; + + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); + return TRUE; +} +/******************************************************************** +函数名称:ModuleProtocol_Packet_P2PUser +函数功能:响应用户查询用户信息的请求协议封包函数 + 参数.一:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.二:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 + 参数.三:pSt_PeerInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入获取到的用户信息 + 参数.四:pSt_AddrInfo + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:IP地址信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_P2PUser(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_PeerInfo, XENGINE_IPADDRINFO* pSt_AddrInfo) +{ + ModuleProtocol_IsErrorOccur = FALSE; + + if ((NULL == pSt_PeerInfo) || (NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + ModuleProtocol_IsErrorOccur = FALSE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PACKET_PARAMENT; + return FALSE; + } + Json::Value st_JsonRoot; + Json::Value st_JsonAddr; + Json::StreamWriterBuilder st_JsonBuilder; + + st_JsonRoot["Code"] = 0; + st_JsonRoot["lpszMsgBuffer"] = "sucess"; + st_JsonRoot["dwConnectType"] = (Json::Value::UInt)pSt_PeerInfo->dwConnectType; + st_JsonRoot["dwPeerType"] = pSt_PeerInfo->dwPeerType; + st_JsonRoot["tszConnectAddr"] = pSt_PeerInfo->tszConnectAddr; + st_JsonRoot["tszPrivateAddr"] = pSt_PeerInfo->tszPrivateAddr; + st_JsonRoot["tszPublicAddr"] = pSt_PeerInfo->tszPublicAddr; + st_JsonRoot["tszUserName"] = pSt_PeerInfo->tszUserName; + + st_JsonAddr["tszIPCountry"] = pSt_AddrInfo->tszIPCountry; + st_JsonAddr["tszIPProvince"] = pSt_AddrInfo->tszIPProvince; + st_JsonAddr["tszIPCity"] = pSt_AddrInfo->tszIPCity; + st_JsonAddr["tszIPCounty"] = pSt_AddrInfo->tszIPCounty; + st_JsonAddr["tszIPISP"] = pSt_AddrInfo->tszIPISP; + + st_JsonRoot["st_AddrInfo"] = st_JsonAddr; + + 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_P2PConnect +函数功能:请求连接打包函数 + 参数.一:pSt_ProtocolHdr + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入要打包的协议头 + 参数.二:pSt_IOProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:输入连接信息 + 参数.三:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:N + 意思:导出封装好的缓冲区 + 参数.四:pInt_MsgLen + In/Out:In/Out + 类型:整数型指针 + 可空:N + 意思:输入你的缓冲区大小,输出缓冲区真实大小 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleProtocol_Packet::ModuleProtocol_Packet_P2PConnect(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPIO_PROTOCOL* pSt_IOProtocol) +{ + ModuleProtocol_IsErrorOccur = FALSE; + + if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) + { + ModuleProtocol_IsErrorOccur = FALSE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PACKET_PARAMENT; + return FALSE; + } + Json::Value st_JsonRoot; + + st_JsonRoot["tszSourceUser"] = pSt_IOProtocol->tszSourceUser; + st_JsonRoot["tszDestUser"] = pSt_IOProtocol->tszDestUser; + st_JsonRoot["tszConnectAddr"] = pSt_IOProtocol->tszConnectAddr; + st_JsonRoot["nDestPort"] = pSt_IOProtocol->nDestPort; + st_JsonRoot["bIsTcp"] = pSt_IOProtocol->bIsTcp; + + *pInt_MsgLen = st_JsonRoot.toStyledString().length(); + memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); + return TRUE; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h index ab7ce1f..5c38539 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Packet/ModuleProtocol_Packet.h @@ -10,7 +10,11 @@ // Purpose: 协议打包类 // History: *********************************************************************/ - +typedef struct +{ + TCHAR tszUsername[MAX_PATH]; + TCHAR tszClientAddr[128]; +}P2XPPROTOCOL_LANPACKET; class CModuleProtocol_Packet { @@ -28,5 +32,11 @@ public: BOOL ModuleProtocol_Packet_BankQuery2(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_BANKINFO* pSt_BankInfo, int nCode = 0); BOOL ModuleProtocol_Packet_LanguageQuery(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo, int nCode = 0, LPCTSTR lpszMsgBuffer = NULL); BOOL ModuleProtocol_Packet_LanguageQuery2(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo, int nCode = 0); +public: + BOOL ModuleProtocol_Packet_P2PCommon(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, int nCode = 0, LPCTSTR lpszMsgBuffer = NULL); + BOOL ModuleProtocol_Packet_P2PLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL*** pppSt_ListClients, int nListCount); + BOOL ModuleProtocol_Packet_P2PWLan(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, list* pStl_ListClients); + BOOL ModuleProtocol_Packet_P2PUser(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_PeerInfo, XENGINE_IPADDRINFO* pSt_AddrInfo); + BOOL ModuleProtocol_Packet_P2PConnect(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPIO_PROTOCOL* pSt_IOProtocol); private: }; \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp index f9dada1..f0ce369 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.cpp @@ -242,8 +242,8 @@ BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuff return TRUE; } /******************************************************************** -函数名称:ModuleProtocol_Parse_P2PLogin -函数功能:登录解析函数 +函数名称:ModuleProtocol_Parse_P2PClient +函数功能:P2P客户端请求解析函数 参数.一:lpszMsgBuffer In/Out:In 类型:常量字符指针 @@ -264,14 +264,14 @@ BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuff 意思:是否成功 备注: *********************************************************************/ -BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_P2PLogin(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_P2XPPeer) +BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_P2PClient(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_P2XPPeer) { - Protocol_IsErrorOccur = FALSE; + ModuleProtocol_IsErrorOccur = FALSE; if ((NULL == lpszMsgBuffer) || (NULL == pSt_P2XPPeer)) { - Protocol_IsErrorOccur = TRUE; - Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; + ModuleProtocol_IsErrorOccur = TRUE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PARSE_PARAMENT; return FALSE; } Json::Value st_JsonRoot; @@ -282,8 +282,8 @@ BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_P2PLogin(LPCTSTR lpszMsgBuffer, //解析JSON if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) { - Protocol_IsErrorOccur = TRUE; - Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; + ModuleProtocol_IsErrorOccur = TRUE; + ModuleProtocol_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_PROTOCOL_PARSE_JSON; return FALSE; } delete pSt_JsonReader; @@ -310,121 +310,4 @@ BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_P2PLogin(LPCTSTR lpszMsgBuffer, pSt_P2XPPeer->dwPeerType = st_JsonRoot["dwPeerType"].asInt(); } return TRUE; -} -/******************************************************************** -函数名称:ModuleProtocol_Parse_P2PList -函数功能:解析列表请求 - 参数.一:lpszMsgBuffer - In/Out:In - 类型:常量字符指针 - 可空:N - 意思:输入要解析的缓冲区 - 参数.二:nMsgLen - In/Out:In - 类型:整数型 - 可空:N - 意思:输入缓冲区大小 - 参数.三:ptszPubAddr - In/Out:Out - 类型:字符指针 - 可空:N - 意思:输出公有地址 - 参数.四:ptszPriAddr - In/Out:Out - 类型:字符指针 - 可空:N - 意思:输出私有地址 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_P2PList(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR* ptszPubAddr, TCHAR* ptszPriAddr) -{ - Protocol_IsErrorOccur = FALSE; - - if ((NULL == lpszMsgBuffer) || (NULL == ptszPubAddr) || (NULL == ptszPriAddr)) - { - Protocol_IsErrorOccur = TRUE; - Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; - } - Json::Value st_JsonRoot; - Json::CharReaderBuilder st_JsonBuild; - Json::CharReader* pSt_JsonReader(st_JsonBuild.newCharReader()); - - JSONCPP_STRING st_JsonError; - //解析JSON - if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) - { - Protocol_IsErrorOccur = TRUE; - Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; - return FALSE; - } - delete pSt_JsonReader; - pSt_JsonReader = NULL; - - if (!st_JsonRoot["tszPublicAddr"].isNull()) - { - _tcscpy(ptszPubAddr, st_JsonRoot["tszPublicAddr"].asCString()); - } - if (!st_JsonRoot["tszPrivateAddr"].isNull()) - { - _tcscpy(ptszPriAddr, st_JsonRoot["tszPrivateAddr"].asCString()); - } - return TRUE; -} -/******************************************************************** -函数名称:ModuleProtocol_Parse_P2PList -函数功能:解析列表请求 - 参数.一:lpszMsgBuffer - In/Out:In - 类型:常量字符指针 - 可空:N - 意思:输入要解析的缓冲区 - 参数.二:nMsgLen - In/Out:In - 类型:整数型 - 可空:N - 意思:输入缓冲区大小 - 参数.三:ptszUserName - In/Out:Out - 类型:字符指针 - 可空:N - 意思:输出查询的用户名 -返回值 - 类型:逻辑型 - 意思:是否成功 -备注: -*********************************************************************/ -BOOL CModuleProtocol_Parse::ModuleProtocol_Parse_P2PUser(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR* ptszUserName) -{ - Protocol_IsErrorOccur = FALSE; - - if ((NULL == lpszMsgBuffer) || (NULL == ptszUserName)) - { - Protocol_IsErrorOccur = TRUE; - Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; - } - Json::Value st_JsonRoot; - Json::CharReaderBuilder st_JsonBuild; - Json::CharReader* pSt_JsonReader(st_JsonBuild.newCharReader()); - - JSONCPP_STRING st_JsonError; - //解析JSON - if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) - { - Protocol_IsErrorOccur = TRUE; - Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; - return FALSE; - } - delete pSt_JsonReader; - pSt_JsonReader = NULL; - - if (!st_JsonRoot["tszUserName"].isNull()) - { - _tcscpy(ptszUserName, st_JsonRoot["tszUserName"].asCString()); - } - return TRUE; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h index 3f802e0..71b5104 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h +++ b/XEngine_Source/XEngine_ModuleProtocol/ModuleProtocol_Parse/ModuleProtocol_Parse.h @@ -21,8 +21,6 @@ public: BOOL ModuleProtocol_Parse_IDCard(LPCTSTR lpszMsgBuffer, XENGINE_IDCARDINFO* pSt_IDInfo); BOOL ModuleProtocol_Parse_Bank(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_BANKINFO* pSt_BankInfo); BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_LANGUAGEINFO* pSt_LanguageInfo); - BOOL ModuleProtocol_Parse_P2PLogin(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_P2XPPeer); - BOOL ModuleProtocol_Parse_P2PList(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR* ptszPubAddr, TCHAR* ptszPriAddr); - BOOL ModuleProtocol_Parse_P2PUser(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR* ptszUserName); + BOOL ModuleProtocol_Parse_P2PClient(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL* pSt_P2XPPeer); private: }; \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def index e4e73d6..7e371c4 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def +++ b/XEngine_Source/XEngine_ModuleProtocol/XEngine_ModuleProtocol.def @@ -13,11 +13,13 @@ EXPORTS ModuleProtocol_Packet_BankQuery2 ModuleProtocol_Packet_LanguageQuery ModuleProtocol_Packet_LanguageQuery2 + ModuleProtocol_Packet_P2PCommon + ModuleProtocol_Packet_P2PLan + ModuleProtocol_Packet_P2PWLan + ModuleProtocol_Packet_P2PUser + ModuleProtocol_Packet_P2PConnect ModuleProtocol_Parse_IDCard ModuleProtocol_Parse_Bank ModuleProtocol_Parse_Translation - ModuleProtocol_Parse_Lan - ModuleProtocol_Parse_WLan - ModuleProtocol_Parse_User - ModuleProtocol_Parse_Connect \ No newline at end of file + ModuleProtocol_Parse_P2PClient \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp index 4b9f165..f9a04a5 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/pch.cpp +++ b/XEngine_Source/XEngine_ModuleProtocol/pch.cpp @@ -71,6 +71,26 @@ extern "C" BOOL ModuleProtocol_Packet_LanguageQuery2(TCHAR * ptszMsgBuffer, int* { return m_ProtocolPacket.ModuleProtocol_Packet_LanguageQuery2(ptszMsgBuffer, pInt_MsgLen, pSt_LanguageInfo, nCode); } +extern "C" BOOL ModuleProtocol_Packet_P2PCommon(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, int nCode, LPCTSTR lpszMsgBuffer) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_P2PCommon(ptszMsgBuffer, pInt_MsgLen, nCode, lpszMsgBuffer); +} +extern "C" BOOL ModuleProtocol_Packet_P2PLan(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL * **pppSt_ListClients, int nListCount) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_P2PLan(ptszMsgBuffer, pInt_MsgLen, pppSt_ListClients, nListCount); +} +extern "C" BOOL ModuleProtocol_Packet_P2PWLan(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, list*pStl_ListClients) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_P2PWLan(ptszMsgBuffer, pInt_MsgLen, pStl_ListClients); +} +extern "C" BOOL ModuleProtocol_Packet_P2PUser(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPPEER_PROTOCOL * pSt_PeerInfo, XENGINE_IPADDRINFO * pSt_AddrInfo) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_P2PUser(ptszMsgBuffer, pInt_MsgLen, pSt_PeerInfo, pSt_AddrInfo); +} +extern "C" BOOL ModuleProtocol_Packet_P2PConnect(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, XENGINE_P2XPIO_PROTOCOL * pSt_IOProtocol) +{ + return m_ProtocolPacket.ModuleProtocol_Packet_P2PConnect(ptszMsgBuffer, pInt_MsgLen, pSt_IOProtocol); +} /************************************************************************/ /* 导出的协议解析函数 */ /************************************************************************/ @@ -86,19 +106,7 @@ extern "C" BOOL ModuleProtocol_Parse_Translation(LPCTSTR lpszMsgBuffer, int nMsg { return m_ProtocolParse.ModuleProtocol_Parse_Translation(lpszMsgBuffer, nMsgLen, pSt_LanguageInfo); } -extern "C" BOOL ModuleProtocol_Parse_P2PLogin(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL * pSt_P2XPPeer) -{ - return m_P2XPParse.ModuleProtocol_Parse_P2PLogin(lpszMsgBuffer, nMsgLen, pSt_P2XPPeer); -} -extern "C" BOOL ModuleProtocol_Parse_P2PList(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR * ptszPubAddr, TCHAR * ptszPriAddr) -{ - return m_P2XPParse.ModuleProtocol_Parse_P2PList(lpszMsgBuffer, nMsgLen, ptszPubAddr, ptszPriAddr); -} -extern "C" BOOL ModuleProtocol_Parse_P2PUser(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR * ptszUserName) -{ - return m_P2XPParse.ModuleProtocol_Parse_P2PUser(lpszMsgBuffer, nMsgLen, ptszUserName); -} -extern "C" BOOL ModuleProtocol_Parse_P2PConnect(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPIO_PROTOCOL * pSt_IOProtocol) +extern "C" BOOL ModuleProtocol_Parse_P2PClient(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_P2XPPEER_PROTOCOL * pSt_P2XPPeer) { - return m_P2XPParse.ModuleProtocol_Parse_P2PConnect(lpszMsgBuffer, nMsgLen, pSt_IOProtocol); + return m_ProtocolParse.ModuleProtocol_Parse_P2PClient(lpszMsgBuffer, nMsgLen, pSt_P2XPPeer); } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleProtocol/pch.h b/XEngine_Source/XEngine_ModuleProtocol/pch.h index 96ac564..faf8f1c 100644 --- a/XEngine_Source/XEngine_ModuleProtocol/pch.h +++ b/XEngine_Source/XEngine_ModuleProtocol/pch.h @@ -15,12 +15,15 @@ #endif //PCH_H #include #include +#include +#include #include #include #include #include -#include -#include +#include +#include +using namespace std; #include "../XEngine_UserProtocol.h" #include "ModuleProtocol_Define.h" #include "ModuleProtocol_Error.h" @@ -39,6 +42,7 @@ extern BOOL ModuleProtocol_IsErrorOccur; extern DWORD ModuleProtocol_dwErrorCode; #ifdef _MSC_BUILD +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") #ifdef _DEBUG #ifdef _WIN64 #pragma comment(lib,"../x64/Debug/jsoncpp") -- Gitee From 9a13483c36dae620f5304c254c773400025d8b95 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 17 Jun 2022 09:14:16 +0800 Subject: [PATCH 08/19] added:p2pclient example --- XEngine_APPClient/XEngine_APPClient.sln | 10 ++ .../XEngine_HTTPTask/HTTPTask_P2PClient.cpp | 126 ++++++++++++++++++ .../XEngine_HTTPTask/HTTPTask_P2PClient.h | 3 + 3 files changed, 139 insertions(+) create mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp create mode 100644 XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.h diff --git a/XEngine_APPClient/XEngine_APPClient.sln b/XEngine_APPClient/XEngine_APPClient.sln index d3e2372..2a351ea 100644 --- a/XEngine_APPClient/XEngine_APPClient.sln +++ b/XEngine_APPClient/XEngine_APPClient.sln @@ -15,6 +15,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_LanguageExample", EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_TranslationExample", "APPClient_TranslationExample\APPClient_TranslationExample.vcxproj", "{B98E33E1-7128-4E04-A328-70665C01CF34}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_P2PExample", "APPClient_P2PExample\APPClient_P2PExample.vcxproj", "{D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -71,6 +73,14 @@ Global {B98E33E1-7128-4E04-A328-70665C01CF34}.Release|x64.Build.0 = Release|x64 {B98E33E1-7128-4E04-A328-70665C01CF34}.Release|x86.ActiveCfg = Release|Win32 {B98E33E1-7128-4E04-A328-70665C01CF34}.Release|x86.Build.0 = Release|Win32 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Debug|x64.ActiveCfg = Debug|x64 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Debug|x64.Build.0 = Debug|x64 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Debug|x86.ActiveCfg = Debug|Win32 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Debug|x86.Build.0 = Debug|Win32 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Release|x64.ActiveCfg = Release|x64 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Release|x64.Build.0 = Release|x64 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Release|x86.ActiveCfg = Release|Win32 + {D3C54AFE-44F5-4D2F-B4C6-7B3F9FAED95B}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp new file mode 100644 index 0000000..69f56bc --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp @@ -0,0 +1,126 @@ +#include "../XEngine_Hdr.h" + +BOOL XEngine_HTTPTask_P2PClient(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, int unOperatorCode) +{ + int nSDLen = 4096; + int nRVLen = 4096; + TCHAR tszSDBuffer[4096]; + TCHAR tszRVBuffer[MAX_PATH]; + RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; //发送给客户端的参数 + + memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); + memset(tszRVBuffer, '\0', sizeof(tszRVBuffer)); + memset(&st_HDRParam, '\0', sizeof(RFCCOMPONENTS_HTTP_HDRPARAM)); + + st_HDRParam.nHttpCode = 200; //HTTP CODE码 + st_HDRParam.bIsClose = TRUE; //收到回复后就关闭 + if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQLOGIN == unOperatorCode) + { + XENGINE_P2XP_PEERINFO st_ClientPeer; + memset(&st_ClientPeer, '\0', sizeof(XENGINE_P2XP_PEERINFO)); + + if (!ModuleProtocol_Parse_P2PClient(lpszMsgBuffer, nMsgLen, &st_ClientPeer.st_PeerAddr)) + { + ModuleProtocol_Packet_P2PCommon(tszRVBuffer, &nRVLen, 400, "协议错误"); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("HTTP客户端:%s,处理登录错误,解析协议失败,错误码:%lX"), lpszClientAddr, ModuleProtocol_GetLastError()); + return FALSE; + } + //如果没有填充公用地址,用他的连接地址代替,外网服务器都可以这样做 + if (_tcslen(st_ClientPeer.st_PeerAddr.tszPublicAddr) <= 0) + { + _tcscpy(st_ClientPeer.st_PeerAddr.tszPublicAddr, lpszClientAddr); + BaseLib_OperatorIPAddr_SegAddr(st_ClientPeer.st_PeerAddr.tszPublicAddr, NULL); + } + //获取外网IP所在位置 + ModuleDatabase_IPInfo_IPV4Query(&st_ClientPeer.st_IPAddrInfo, st_ClientPeer.st_PeerAddr.tszPublicAddr); + + st_ClientPeer.st_PeerTimer.dwUserTime = time(NULL); + st_ClientPeer.st_PeerTimer.dwKeepAlive = time(NULL); + st_ClientPeer.bIsLogin = TRUE; + _tcscpy(st_ClientPeer.st_PeerAddr.tszConnectAddr, lpszClientAddr); + if (!ModuleHelp_P2PClient_Add(&st_ClientPeer)) + { + ModuleProtocol_Packet_P2PCommon(tszRVBuffer, &nRVLen, 500, "内部错误"); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("HTTP客户端:%s,处理登录错误,设置用户信息失败,错误码:%lX"), lpszClientAddr, ModuleHelp_GetLastError()); + return FALSE; + } + ModuleProtocol_Packet_P2PCommon(tszSDBuffer, &nSDLen); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,处理用户登录请求成功,用户名:%s"), lpszClientAddr, st_ClientPeer.st_PeerAddr.tszUserName); + } + else if (XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQLANLIST == unOperatorCode) + { + XENGINE_P2XPPEER_PROTOCOL st_P2PProtocol; + memset(&st_P2PProtocol, '\0', sizeof(XENGINE_P2XPPEER_PROTOCOL)); + + if (!ModuleProtocol_Parse_P2PClient(lpszMsgBuffer, nMsgLen, &st_P2PProtocol)) + { + ModuleProtocol_Packet_P2PCommon(tszRVBuffer, &nRVLen, 400, "协议错误"); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("HTTP客户端:%s,列表请求失败,协议解析错误,错误码:%lX"), lpszClientAddr, ModuleProtocol_GetLastError()); + return FALSE; + } + //请求同步列表 + if (_tcslen(st_P2PProtocol.tszPrivateAddr) > 0) + { + int nListCount = 0; + XENGINE_P2XPPEER_PROTOCOL** ppSt_ListClients; + if (!ModuleHelp_P2PClient_GetLan(&st_P2PProtocol, &ppSt_ListClients, &nListCount)) + { + ModuleProtocol_Packet_P2PCommon(tszRVBuffer, &nRVLen, 500, "内部错误"); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("HTTP客户端:%s,列表请求失败,请求同步局域网列表失败,公有地址:%s,私有地址:%s,错误码:%lX"), lpszClientAddr, st_P2PProtocol.tszPublicAddr, st_P2PProtocol.tszPrivateAddr, ModuleHelp_GetLastError()); + return FALSE; + } + ModuleProtocol_Packet_P2PLan(tszSDBuffer, &nSDLen, &ppSt_ListClients, nListCount); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListClients, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,请求同步局域网列表成功,公有地址:%s,私有地址:%s"), lpszClientAddr, st_P2PProtocol.tszPublicAddr, st_P2PProtocol.tszPrivateAddr); + } + else + { + //公网下所有列表 + int nListCount = 0; + TCHAR** ppszClientList; + list stl_ListClient; + if (ModuleHelp_P2PClient_GetLList(st_P2PProtocol.tszPublicAddr, &ppszClientList, &nListCount)) + { + for (int i = 0; i < nListCount; i++) + { + int nLanCount = 0; + XENGINE_P2XPPEER_PROTOCOL** ppSt_ListClients; + memset(st_P2PProtocol.tszPrivateAddr, '\0', sizeof(st_P2PProtocol.tszPrivateAddr)); + + _tcscpy(st_P2PProtocol.tszPrivateAddr, ppszClientList[i]); + + if (ModuleHelp_P2PClient_GetLan(&st_P2PProtocol, &ppSt_ListClients, &nLanCount)) + { + for (int j = 0; j < nLanCount; j++) + { + stl_ListClient.push_back(*ppSt_ListClients[j]); + } + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListClients, nLanCount); + } + } + BaseLib_OperatorMemory_Free((XPPPMEM)&ppszClientList, nListCount); + } + ModuleProtocol_Packet_P2PWLan(tszRVBuffer, &nRVLen, &stl_ListClient); + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,请求同步公有局域网列表成功,公有地址:%s"), lpszClientAddr, st_P2PProtocol.tszPublicAddr); + } + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("客户端:%s,请求了一条未知的子协议:%lX"), lpszClientAddr, unOperatorCode); + } + return TRUE; +} \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.h new file mode 100644 index 0000000..e23c9cd --- /dev/null +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.h @@ -0,0 +1,3 @@ +#pragma once + +BOOL XEngine_HTTPTask_P2PClient(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, int unOperatorCode); \ No newline at end of file -- Gitee From b4b6b1e51c2fa0407779ac0d31eb5cd3d32062aa Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 17 Jun 2022 09:16:03 +0800 Subject: [PATCH 09/19] added:post with p2pclient --- .../XEngine_HttpApp/XEngine_HTTPTask.cpp | 136 ++++++++++-------- .../XEngine_HttpApp/XEngine_Hdr.h | 1 + .../XEngine_HttpApp/XEngine_HttpApp.vcxproj | 2 + .../XEngine_HttpApp.vcxproj.filters | 14 +- XEngine_Source/XEngine_UserProtocol.h | 28 ++++ 5 files changed, 120 insertions(+), 61 deletions(-) diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp index 9e83f78..eacbf61 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp @@ -57,7 +57,7 @@ XHTHREAD CALLBACK XEngine_HTTPTask_Thread(LPVOID lParam) BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR lpszClientAddr, LPCTSTR lpszRVBuffer, int nRVLen) { int nMsgLen = 4096; - //LPCTSTR lpszMethodPost = _T("POST"); + LPCTSTR lpszMethodPost = _T("POST"); LPCTSTR lpszMethodGet = _T("GET"); TCHAR tszMsgBuffer[4096]; RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; //发送给客户端的参数 @@ -67,66 +67,88 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR st_HDRParam.nHttpCode = 200; //HTTP CODE码 st_HDRParam.bIsClose = TRUE; //收到回复后就关闭 - if (0 == _tcsnicmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodGet))) - { - TCHAR** pptszList; - TCHAR tszUrlName[128]; - int nListCount = 0; - memset(tszUrlName, '\0', sizeof(tszUrlName)); - //得到URL参数个数 - RfcComponents_HttpHelp_GetParament(pSt_HTTPParam->tszHttpUri, &pptszList, &nListCount, tszUrlName); - if (nListCount < 1) - { - st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); - XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); - BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return FALSE; - } - TCHAR tszKey[128]; - TCHAR tszValue[128]; - LPCTSTR lpszFuncName = _T("api"); - LPCTSTR lpszParamFuncKey = _T("function"); - LPCTSTR lpszParamName = _T("params1"); - LPCTSTR lpszParamIPAddr = _T("ip"); - LPCTSTR lpszParamIDCard = _T("id"); - LPCTSTR lpszParamPhone = _T("phone"); - LPCTSTR lpszParamBank = _T("bank"); - LPCTSTR lpszParamLanguage = _T("language"); - LPCTSTR lpszParamTranslation = _T("translation"); - LPCTSTR lpszParamForward = _T("forward"); + TCHAR** pptszList; + TCHAR tszUrlName[128]; + int nListCount = 0; - memset(tszKey, '\0', sizeof(tszKey)); - memset(tszValue, '\0', sizeof(tszValue)); + memset(tszUrlName, '\0', sizeof(tszUrlName)); + //得到URL参数个数 + RfcComponents_HttpHelp_GetParament(pSt_HTTPParam->tszHttpUri, &pptszList, &nListCount, tszUrlName); + if (nListCount < 1) + { + st_HDRParam.nHttpCode = 404; + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return FALSE; + } + TCHAR tszKey[128]; + TCHAR tszValue[128]; + LPCTSTR lpszFuncName = _T("api"); + LPCTSTR lpszParamFuncKey = _T("function"); + LPCTSTR lpszParamName = _T("params1"); + LPCTSTR lpszParamIPAddr = _T("ip"); + LPCTSTR lpszParamIDCard = _T("id"); + LPCTSTR lpszParamPhone = _T("phone"); + LPCTSTR lpszParamBank = _T("bank"); + LPCTSTR lpszParamLanguage = _T("language"); + LPCTSTR lpszParamTranslation = _T("translation"); + LPCTSTR lpszParamForward = _T("forward"); + LPCTSTR lpszParamP2PClient = _T("p2p"); - if (0 != _tcsnicmp(lpszFuncName, tszUrlName, _tcslen(lpszFuncName))) - { - st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); - XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); - BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return FALSE; - } - //获得函数名 - BaseLib_OperatorString_GetKeyValue(pptszList[0], "=", tszKey, tszValue); - if (0 != _tcsnicmp(lpszParamFuncKey, tszKey, _tcslen(lpszParamFuncKey))) - { - st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); - XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); - BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); - return FALSE; - } - //首先处理插件 - if (ModulePlugin_Loader_Find(tszValue)) + memset(tszKey, '\0', sizeof(tszKey)); + memset(tszValue, '\0', sizeof(tszValue)); + + if (0 != _tcsnicmp(lpszFuncName, tszUrlName, _tcslen(lpszFuncName))) + { + st_HDRParam.nHttpCode = 404; + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return FALSE; + } + //获得函数名 + BaseLib_OperatorString_GetKeyValue(pptszList[0], "=", tszKey, tszValue); + if (0 != _tcsnicmp(lpszParamFuncKey, tszKey, _tcslen(lpszParamFuncKey))) + { + st_HDRParam.nHttpCode = 404; + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return FALSE; + } + //首先处理插件 + if (ModulePlugin_Loader_Find(tszValue)) + { + XEngine_PluginTask_Handle(tszValue, lpszClientAddr, lpszRVBuffer, nRVLen, &pptszList, nListCount); + return TRUE; + } + if (0 == _tcsnicmp(lpszMethodPost, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodPost))) + { + if (0 == _tcsnicmp(lpszParamP2PClient, tszValue, _tcslen(lpszParamP2PClient))) { - XEngine_PluginTask_Handle(tszValue, lpszClientAddr, lpszRVBuffer, nRVLen, &pptszList, nListCount); - return TRUE; + //是不是P2P + memset(tszKey, '\0', sizeof(tszKey)); + memset(tszValue, '\0', sizeof(tszValue)); + BaseLib_OperatorString_GetKeyValue(pptszList[1], "=", tszKey, tszValue); + if (0 != _tcsnicmp(lpszParamName, tszKey, _tcslen(lpszParamName))) + { + st_HDRParam.nHttpCode = 404; + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszMsgBuffer, &nMsgLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszMsgBuffer, nMsgLen); + BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,发送的URL请求参数不正确:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri); + return FALSE; + } + XEngine_HTTPTask_P2PClient(lpszClientAddr, lpszRVBuffer, nRVLen, _ttoi(tszValue)); } + } + else if (0 == _tcsnicmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodGet))) + { //是不是ip查询 if (0 == _tcsnicmp(lpszParamIPAddr, tszValue, _tcslen(lpszParamIPAddr))) { @@ -271,7 +293,7 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR BaseLib_OperatorString_GetKeyValue(pptszList[2], "=", tszKey, tszGetType); BaseLib_OperatorString_GetKeyValue(pptszList[3], "=", tszKey, tszCvtType); - XEngine_HTTPTask_Translation(lpszClientAddr, tszValue, _ttoi(tszGetType), _ttoi(tszCvtType));; + XEngine_HTTPTask_Translation(lpszClientAddr, tszValue, _ttoi(tszGetType), _ttoi(tszCvtType)); } BaseLib_OperatorMemory_Free((XPPPMEM)&pptszList, nListCount); } diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h index 78f771d..8d838f6 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_Hdr.h @@ -62,6 +62,7 @@ using namespace std; #include "XEngine_HTTPTask/HTTPTask_Bank.h" #include "XEngine_HTTPTask/HTTPTask_Language.h" #include "XEngine_HTTPTask/HTTPTask_Translation.h" +#include "XEngine_HTTPTask/HTTPTask_P2PClient.h" /******************************************************************** // Created: 2022/01/20 14:42:06 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ServiceApp\XEngine_HttpApp\XEngine_Hdr.h diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj index 1af4aec..d73a563 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj @@ -160,6 +160,7 @@ + @@ -173,6 +174,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 9118afe..3cfc923 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.vcxproj.filters @@ -1,10 +1,6 @@  - - {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 @@ -16,6 +12,10 @@ {9bf2e74a-551b-4d8d-ad34-ccd13e64e985} + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + {a205153f-6995-49dc-ae5f-cd2bc0d31549} @@ -54,6 +54,9 @@ 源文件 + + 源文件\XEngine_HTTPTask + @@ -89,5 +92,8 @@ 头文件 + + 头文件\XEngine_HTTPTask + \ No newline at end of file diff --git a/XEngine_Source/XEngine_UserProtocol.h b/XEngine_Source/XEngine_UserProtocol.h index 9984755..d687cdd 100644 --- a/XEngine_Source/XEngine_UserProtocol.h +++ b/XEngine_Source/XEngine_UserProtocol.h @@ -78,6 +78,15 @@ typedef enum ////////////////////////////////////////////////////////////////////////// #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MSG_TEXTREQ 0x0001 //发送消息 #define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_MSG_TEXTREP 0x0002 //回复消息 +//P2XP协议 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQLOGIN 0x6001 //登录 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REPLOGIN 0x6002 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQLANLIST 0x6003 //同步列表协议,同步本地局域网IP中的客户端 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REPLANLIST 0x6004 //同步列表回复确认协议 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQCONNECT 0x6005 //请求用户连接到网络服务 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REPCONNECT 0x6006 //确认连接协议 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REQUSERQUERY 0x6007 //用户查询 +#define XENGINE_COMMUNICATION_PROTOCOL_OPERATOR_CODE_P2XP_REPUSERQUERY 0x6008 //用户查询确认 /////////////////////////////////////////////////////////////////////////// // 导出的数据结构 /////////////////////////////////////////////////////////////////////////// @@ -143,4 +152,23 @@ typedef struct TCHAR tszDestStr[1024]; //转换字符串 int enType; //简繁为ENUM_XENGINE_APISERVICE_LANGUAGE_TYPE 翻译为ENUM_XENGINE_APISERVICE_TRANSLATION_TYPE }XENGINE_LANGUAGEINFO; +//连接信息 +typedef struct +{ + CHAR tszUserName[64]; //用户信息 + CHAR tszPrivateAddr[32]; //私有本地地址,内网地址 + CHAR tszPublicAddr[32]; //外网地址 + CHAR tszConnectAddr[32]; //链接地址 + WORD dwConnectType; //连接类型 + WORD dwPeerType; //节点类型 +}XENGINE_P2XPPEER_PROTOCOL, * LPXENGINE_P2XPPEER_PROTOCOL; +//P2XP通道连接命令 +typedef struct tag_XEngine_P2XPIO_Protocol +{ + CHAR tszSourceUser[32]; //请求连接的用户 + CHAR tszDestUser[32]; //要连接的用户 + CHAR tszConnectAddr[32]; //连接的IP地址 + int nDestPort; //要连接的端口 + BOOL bIsTcp; //连接类型TCP,否则为UDP +}XENGINE_P2XPIO_PROTOCOL, * LPXENGINE_P2XPIO_PROTOCOL; #pragma pack(pop) \ No newline at end of file -- Gitee From b9ca3df97ad6c8cbe564ae124ea6138286cfca04 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 20 Jun 2022 14:25:03 +0800 Subject: [PATCH 10/19] modify:does not use list manage p2pclient.use map --- .../XEngine_ModuleHelp/ModuleHelp_Define.h | 37 +++ .../XEngine_ModuleHelp/ModuleHelp_Error.h | 11 +- .../ModuleHelp_P2PClient.cpp | 243 ++++++++++++------ .../ModuleHelp_P2PClient.h | 17 +- .../XEngine_ModuleHelp/XEngine_ModuleHelp.def | 2 + XEngine_Source/XEngine_ModuleHelp/pch.cpp | 8 + 6 files changed, 231 insertions(+), 87 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h index 7305d2e..8c29ca1 100644 --- a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h @@ -11,6 +11,10 @@ // History: *********************************************************************/ ////////////////////////////////////////////////////////////////////////// +// 导出回调函数 +////////////////////////////////////////////////////////////////////////// +typedef void(CALLBACK* CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT)(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, LPVOID lParam); +////////////////////////////////////////////////////////////////////////// // 导出数据结构 ////////////////////////////////////////////////////////////////////////// //计时器 @@ -114,6 +118,39 @@ extern "C" BOOL ModuleHelp_Translation_Convert(ENUM_XENGINE_APISERVICE_TRANSLATI /* 节点管理器导出函数 */ /************************************************************************/ /******************************************************************** +函数名称:ModuleHelp_P2PClient_Init +函数功能:初始化P2P客户端 + 参数.一:nTimeout + In/Out:In + 类型:整数型 + 可空:N + 意思:输入超时时间,秒 + 参数.二:fpCall_P2PClient + In/Out:In/Out + 类型:回调函数 + 可空:N + 意思:P2P客户端导出信息 + 参数.三:lParam + In/Out:In/Out + 类型:无类型指针 + 可空:Y + 意思:回调函数自定义参数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Init(int nTimeout, CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT fpCall_P2PClient, LPVOID lParam = NULL); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Destory +函数功能:销毁 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Destory(); +/******************************************************************** 函数名称:ModuleHelp_P2PClient_Add 函数功能:添加一个客户到一个节点信息 参数.一:pSt_PeerInfo diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h index c18d384..cd90753 100644 --- a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Error.h @@ -27,8 +27,9 @@ ////////////////////////////////////////////////////////////////////////// #define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_ISEXIST 0xB0E0001 //用户已经存在 #define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_MALLOC 0xB0E0002 //申请内存失败 -#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT 0xB0E0010 //获取用户信息失败,参数错误 -#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND 0xB0E0011 //没有找到用户 -#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPUBADDRR 0xB0E0051 //公网IP地址没有找到 -#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPRIADDR 0xB0E0052 //私有网络IP地址没有找到 -#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOLIST 0xB0E0053 //没有数据存在 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT 0xB0E0003 //获取用户信息失败,参数错误 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND 0xB0E0004 //没有找到用户 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPUBADDRR 0xB0E0005 //公网IP地址没有找到 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPRIADDR 0xB0E0006 //私有网络IP地址没有找到 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOLIST 0xB0E0007 //没有数据存在 +#define ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_THREAD 0xB0E0008 //创建线程失败 \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp index cf9cf66..0cc25f8 100644 --- a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp @@ -21,6 +21,69 @@ CModuleHelp_P2PClient::~CModuleHelp_P2PClient() // 公有函数 ////////////////////////////////////////////////////////////////////////// /******************************************************************** +函数名称:ModuleHelp_P2PClient_Init +函数功能:初始化P2P客户端 + 参数.一:nTimeout + In/Out:In + 类型:整数型 + 可空:N + 意思:输入超时时间,秒 + 参数.二:fpCall_P2PClient + In/Out:In/Out + 类型:回调函数 + 可空:N + 意思:P2P客户端导出信息 + 参数.三:lParam + In/Out:In/Out + 类型:无类型指针 + 可空:Y + 意思:回调函数自定义参数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Init(int nTimeout, CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT fpCall_P2PClient, LPVOID lParam /* = NULL */) +{ + ModuleHelp_IsErrorOccur = FALSE; + + m_bIsRun = TRUE; + m_nTimeout = nTimeout; + m_lParam = lParam; + lpCall_P2PClient = fpCall_P2PClient; + + pSTDThread = make_shared(ModuleHelp_P2PClient_Thread, this); + if (NULL == pSTDThread) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_THREAD; + return FALSE; + } + return TRUE; +} +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Destory +函数功能:销毁 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Destory() +{ + ModuleHelp_IsErrorOccur = FALSE; + + if (m_bIsRun) + { + m_bIsRun = FALSE; + if (pSTDThread->joinable()) + { + pSTDThread->join(); + } + } + return TRUE; +} +/******************************************************************** 函数名称:ModuleHelp_P2PClient_Add 函数功能:添加一个客户到一个节点信息 参数.一:pSt_PeerInfo @@ -38,12 +101,12 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO* pSt_ ModuleHelp_IsErrorOccur = FALSE; st_Locker.lock(); - unordered_map > >::iterator stl_MapIteratorAddr = stl_MapClients.find(pSt_PeerInfo->st_PeerAddr.tszPublicAddr); + unordered_map > >::iterator stl_MapIteratorAddr = stl_MapClients.find(pSt_PeerInfo->st_PeerAddr.tszPublicAddr); if (stl_MapIteratorAddr == stl_MapClients.end()) { //没有找到,一个一个加入,首先加入私有同步网络 - list stl_ListSecond; - stl_ListSecond.push_back(*pSt_PeerInfo); + unordered_map stl_MapPrivate; + stl_MapPrivate.insert(make_pair(pSt_PeerInfo->st_PeerAddr.tszConnectAddr, *pSt_PeerInfo)); //获取私有网络的路由地址 XENGINE_LIBADDR st_LibAddr; TCHAR tszPrivateAddr[64]; @@ -58,10 +121,11 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO* pSt_ return FALSE; } _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); - //然后加入到 - unordered_map > stl_MapSecond; - stl_MapSecond.insert(make_pair(tszPrivateAddr, stl_ListSecond)); - stl_MapClients.insert(make_pair(pSt_PeerInfo->st_PeerAddr.tszPublicAddr, stl_MapSecond)); + //然后加入到私网地址 + unordered_map > stl_MapPriAddr; + stl_MapPriAddr.insert(make_pair(tszPrivateAddr, stl_MapPrivate)); + //加入公网 + stl_MapClients.insert(make_pair(pSt_PeerInfo->st_PeerAddr.tszPublicAddr, stl_MapPriAddr)); } else { @@ -81,30 +145,23 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO* pSt_ } //内网地址192.168.1.2 内网出口192.168.1.1 链接地址10.0.1.0:13444 _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); - unordered_map >::iterator stl_MapIteartorPrivate = stl_MapIteratorAddr->second.find(tszPrivateAddr); - if (stl_MapIteartorPrivate == stl_MapIteratorAddr->second.end()) + unordered_map >::iterator stl_MapPriIteartor = stl_MapIteratorAddr->second.find(tszPrivateAddr); + if (stl_MapPriIteartor == stl_MapIteratorAddr->second.end()) { - list stl_ListClient; - stl_ListClient.push_back(*pSt_PeerInfo); - stl_MapIteratorAddr->second.insert(make_pair(tszPrivateAddr, stl_ListClient)); + //没有私网地址 + unordered_map stl_MapPrivate; + stl_MapPrivate.insert(make_pair(pSt_PeerInfo->st_PeerAddr.tszConnectAddr, *pSt_PeerInfo)); + + stl_MapIteratorAddr->second.insert(make_pair(tszPrivateAddr, stl_MapPrivate)); } else { - BOOL bIsFound = FALSE; - //查找链接地址是否存在.存在表示已经加入过了,那么就什么都不做 - list::iterator stl_ListIterator = stl_MapIteartorPrivate->second.begin(); - for (; stl_ListIterator != stl_MapIteartorPrivate->second.end(); stl_ListIterator++) + //查找链接地址是否存在.存在表示已经加入过了,那么就什么都不做 + unordered_map::iterator stl_MapConnIterator = stl_MapPriIteartor->second.find(pSt_PeerInfo->st_PeerAddr.tszConnectAddr); + if (stl_MapConnIterator == stl_MapPriIteartor->second.find(pSt_PeerInfo->st_PeerAddr.tszConnectAddr)) { - if (0 == _tcscmp(stl_ListIterator->st_PeerAddr.tszConnectAddr, pSt_PeerInfo->st_PeerAddr.tszConnectAddr)) - { - bIsFound = TRUE; - break; - } - } - //没有找到就加入 - if (!bIsFound) - { - stl_MapIteartorPrivate->second.push_back(*pSt_PeerInfo); + //没有找到就加入 + stl_MapPriIteartor->second.insert(make_pair(pSt_PeerInfo->st_PeerAddr.tszConnectAddr, *pSt_PeerInfo)); } } } @@ -141,7 +198,7 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL * } //查找元素 st_Locker.lock_shared(); - unordered_map > >::const_iterator stl_MapPubIterator = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); + unordered_map > >::const_iterator stl_MapPubIterator = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); if (stl_MapPubIterator == stl_MapClients.end()) { ModuleHelp_IsErrorOccur = TRUE; @@ -159,7 +216,7 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL * BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_P2PProtocol->tszPrivateAddr, &st_LibAddr); _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); - unordered_map >::const_iterator stl_MapPriIterator = stl_MapPubIterator->second.find(tszPrivateAddr); + unordered_map >::const_iterator stl_MapPriIterator = stl_MapPubIterator->second.find(tszPrivateAddr); if (stl_MapPriIterator == stl_MapPubIterator->second.end()) { ModuleHelp_IsErrorOccur = TRUE; @@ -167,17 +224,8 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL * st_Locker.unlock_shared(); return FALSE; } - BOOL bFound = FALSE; - list::const_iterator stl_ListIterator = stl_MapPriIterator->second.begin(); - for (; stl_ListIterator != stl_MapPriIterator->second.end(); stl_ListIterator++) - { - if (0 == _tcsncmp(pSt_P2PProtocol->tszConnectAddr, stl_ListIterator->st_PeerAddr.tszConnectAddr, _tcslen(pSt_P2PProtocol->tszConnectAddr))) - { - bFound = TRUE; - break; - } - } - if (!bFound) + unordered_map::const_iterator stl_MapConnIterator = stl_MapPriIterator->second.find(pSt_P2PProtocol->tszConnectAddr); + if (stl_MapConnIterator == stl_MapPriIterator->second.end()) { ModuleHelp_IsErrorOccur = TRUE; ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; @@ -187,7 +235,7 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL * //判断是否导出节点信息 if (NULL != pSt_PeerInfo) { - *pSt_PeerInfo = *stl_ListIterator; + *pSt_PeerInfo = stl_MapConnIterator->second; } st_Locker.unlock_shared(); return TRUE; @@ -227,8 +275,8 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCO } //查找公网IP地址 st_Locker.lock_shared(); - unordered_map > >::const_iterator stl_MapIterator = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); - if (stl_MapIterator == stl_MapClients.end()) + unordered_map > >::const_iterator stl_MapPubIterator = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); + if (stl_MapPubIterator == stl_MapClients.end()) { ModuleHelp_IsErrorOccur = TRUE; ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPUBADDRR; @@ -244,53 +292,53 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCO if (BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_P2PProtocol->tszPrivateAddr, &st_LibAddr)) { _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); - unordered_map >::const_iterator stl_MapSubIterator = stl_MapIterator->second.find(tszPrivateAddr); - if (stl_MapSubIterator == stl_MapIterator->second.end()) + unordered_map >::const_iterator stl_MapPriIterator = stl_MapPubIterator->second.find(tszPrivateAddr); + if (stl_MapPriIterator == stl_MapPubIterator->second.end()) { ModuleHelp_IsErrorOccur = TRUE; ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPRIADDR; st_Locker.unlock_shared(); return FALSE; } - if (stl_MapSubIterator->second.empty()) + if (stl_MapPriIterator->second.empty()) { ModuleHelp_IsErrorOccur = TRUE; ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOLIST; st_Locker.unlock_shared(); return FALSE; } - BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_P2XPClient, stl_MapSubIterator->second.size(), sizeof(XENGINE_P2XPPEER_PROTOCOL)); - list::const_iterator stl_ListIterator = stl_MapSubIterator->second.begin(); - for (int i = 0; stl_ListIterator != stl_MapSubIterator->second.end(); stl_ListIterator++, i++) + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_P2XPClient, stl_MapPriIterator->second.size(), sizeof(XENGINE_P2XPPEER_PROTOCOL)); + unordered_map::const_iterator stl_MapConnIterator = stl_MapPriIterator->second.begin(); + for (int i = 0; stl_MapConnIterator != stl_MapPriIterator->second.end(); stl_MapConnIterator++, i++) { - *(*pppSt_P2XPClient)[i] = stl_ListIterator->st_PeerAddr; + *(*pppSt_P2XPClient)[i] = stl_MapConnIterator->second.st_PeerAddr; } - *pInt_ListCount = stl_MapSubIterator->second.size(); + *pInt_ListCount = stl_MapPriIterator->second.size(); } else { - unordered_map < string, list >::const_iterator stl_MapSubIterator = stl_MapIterator->second.find(pSt_P2PProtocol->tszPrivateAddr); - if (stl_MapSubIterator == stl_MapIterator->second.end()) + unordered_map >::const_iterator stl_MapPriIterator = stl_MapPubIterator->second.find(pSt_P2PProtocol->tszPrivateAddr); + if (stl_MapPriIterator == stl_MapPubIterator->second.end()) { ModuleHelp_IsErrorOccur = TRUE; ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTPRIADDR; st_Locker.unlock_shared(); return FALSE; } - if (stl_MapSubIterator->second.empty()) + if (stl_MapPriIterator->second.empty()) { ModuleHelp_IsErrorOccur = TRUE; ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOLIST; st_Locker.unlock_shared(); return FALSE; } - BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_P2XPClient, stl_MapSubIterator->second.size(), sizeof(XENGINE_P2XPPEER_PROTOCOL)); - list::const_iterator stl_ListIterator = stl_MapSubIterator->second.begin(); - for (int i = 0; stl_ListIterator != stl_MapSubIterator->second.end(); stl_ListIterator++, i++) + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_P2XPClient, stl_MapPriIterator->second.size(), sizeof(XENGINE_P2XPPEER_PROTOCOL)); + unordered_map::const_iterator stl_MapConnIterator = stl_MapPriIterator->second.begin(); + for (int i = 0; stl_MapConnIterator != stl_MapPriIterator->second.end(); stl_MapConnIterator++, i++) { - *(*pppSt_P2XPClient)[i] = stl_ListIterator->st_PeerAddr; + *(*pppSt_P2XPClient)[i] = stl_MapConnIterator->second.st_PeerAddr; } - *pInt_ListCount = stl_MapSubIterator->second.size(); + *pInt_ListCount = stl_MapPriIterator->second.size(); } st_Locker.unlock_shared(); return TRUE; @@ -329,21 +377,21 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_GetLList(LPCTSTR lpszPubAddr, T return FALSE; } st_Locker.lock_shared(); - unordered_map > >::const_iterator stl_MapIterator = stl_MapClients.find(lpszPubAddr); - if (stl_MapIterator == stl_MapClients.end()) + unordered_map > >::const_iterator stl_MapPubIterator = stl_MapClients.find(lpszPubAddr); + if (stl_MapPubIterator == stl_MapClients.end()) { ModuleHelp_IsErrorOccur = TRUE; ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; st_Locker.unlock_shared(); return FALSE; } - BaseLib_OperatorMemory_Malloc((XPPPMEM)pppszP2XPClient, stl_MapIterator->second.size(), 128); - unordered_map >::const_iterator stl_MapListIterator = stl_MapIterator->second.begin(); - for (int i = 0; stl_MapListIterator != stl_MapIterator->second.end(); stl_MapListIterator++, i++) + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppszP2XPClient, stl_MapPubIterator->second.size(), 128); + unordered_map >::const_iterator stl_MapPriIterator = stl_MapPubIterator->second.begin(); + for (int i = 0; stl_MapPriIterator != stl_MapPubIterator->second.end(); stl_MapPriIterator++, i++) { - _tcscpy((*pppszP2XPClient)[i], stl_MapListIterator->first.c_str()); + _tcscpy((*pppszP2XPClient)[i], stl_MapPriIterator->first.c_str()); } - *pInt_ListCount = stl_MapIterator->second.size(); + *pInt_ListCount = stl_MapPubIterator->second.size(); st_Locker.unlock_shared(); return TRUE; } @@ -384,7 +432,7 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_GetWList(TCHAR*** pppszP2XPClie BaseLib_OperatorMemory_Malloc((XPPPMEM)pppszP2XPClient, stl_MapClients.size(), 128); st_Locker.lock_shared(); - unordered_map > >::const_iterator stl_MapIterator = stl_MapClients.begin(); + unordered_map > >::const_iterator stl_MapIterator = stl_MapClients.begin(); for (int i = 0; stl_MapIterator != stl_MapClients.end(); stl_MapIterator++, i++) { _tcscpy((*pppszP2XPClient)[i], stl_MapIterator->first.c_str()); @@ -410,7 +458,7 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCO { ModuleHelp_IsErrorOccur = FALSE; //查找公网地址 - unordered_map > >::iterator stl_MapPubIteartor = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); + unordered_map > >::iterator stl_MapPubIteartor = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); if (stl_MapPubIteartor != stl_MapClients.end()) { XENGINE_LIBADDR st_LibAddr; @@ -422,24 +470,20 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCO { _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); //查找私有路由地址 - unordered_map >::iterator stl_MapSubIterator = stl_MapPubIteartor->second.find(tszPrivateAddr); - if (stl_MapSubIterator != stl_MapPubIteartor->second.end()) + unordered_map >::iterator stl_MapPriIterator = stl_MapPubIteartor->second.find(tszPrivateAddr); + if (stl_MapPriIterator != stl_MapPubIteartor->second.end()) { //查找局域网自身的IP地址是否存在 - list::iterator stl_ListIterator = stl_MapSubIterator->second.begin(); - for (; stl_ListIterator != stl_MapSubIterator->second.end(); stl_ListIterator++) + unordered_map::iterator stl_MapConnIterator = stl_MapPriIterator->second.find(pSt_P2PProtocol->tszConnectAddr); + if (stl_MapConnIterator != stl_MapPriIterator->second.end()) { - if (0 == _tcscmp(stl_ListIterator->st_PeerAddr.tszConnectAddr, pSt_P2PProtocol->tszConnectAddr)) - { - //找到了删除 - stl_MapSubIterator->second.erase(stl_ListIterator); - break; - } + //找到了删除 + stl_MapPriIterator->second.erase(stl_MapConnIterator); } - if (stl_MapSubIterator->second.empty()) + if (stl_MapPriIterator->second.empty()) { //如果这个私有网络列表为空,那么就清楚他 - stl_MapPubIteartor->second.erase(stl_MapSubIterator); + stl_MapPubIteartor->second.erase(stl_MapPriIterator); } } } @@ -467,4 +511,45 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_DelAll() st_Locker.unlock(); return TRUE; +} +////////////////////////////////////////////////////////////////////////// +// 保护函数 +////////////////////////////////////////////////////////////////////////// +XHTHREAD CALLBACK CModuleHelp_P2PClient::ModuleHelp_P2PClient_Thread(LPVOID lParam) +{ + CModuleHelp_P2PClient* pClass_This = (CModuleHelp_P2PClient*)lParam; + list stl_ListRemove; + + while (pClass_This->m_bIsRun) + { + pClass_This->st_Locker.lock_shared(); + //公网轮训 + for (unordered_map > >::iterator stl_MapPubIterator = pClass_This->stl_MapClients.begin(); stl_MapPubIterator != pClass_This->stl_MapClients.end(); stl_MapPubIterator++) + { + //内网轮训 + for (unordered_map >::iterator stl_MapPriIterator = stl_MapPubIterator->second.begin(); stl_MapPriIterator != stl_MapPubIterator->second.end(); stl_MapPriIterator++) + { + //连接地址 + for (unordered_map::iterator stl_MapConnIterator = stl_MapPriIterator->second.begin(); stl_MapConnIterator != stl_MapPriIterator->second.end(); stl_MapConnIterator++) + { + //是否超时 + time_t nTimeEnd = time(NULL); + if ((nTimeEnd - stl_MapConnIterator->second.st_PeerTimer.dwUserTime) > pClass_This->m_nTimeout) + { + stl_ListRemove.push_back(stl_MapConnIterator->second); + } + } + } + } + pClass_This->st_Locker.unlock_shared(); + + for (auto stl_ListIterator = stl_ListRemove.begin(); stl_ListIterator != stl_ListRemove.end(); stl_ListIterator++) + { + pClass_This->ModuleHelp_P2PClient_Delete((XENGINE_P2XPPEER_PROTOCOL*) & stl_ListIterator); + pClass_This->lpCall_P2PClient((XENGINE_P2XPPEER_PROTOCOL*)&stl_ListIterator, pClass_This->m_lParam); + } + stl_ListRemove.clear(); + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + return 0; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h index fd01f96..eefe1d1 100644 --- a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h @@ -10,22 +10,33 @@ // Purpose: P2P客户端管理器 // History: *********************************************************************/ - class CModuleHelp_P2PClient { public: CModuleHelp_P2PClient(); ~CModuleHelp_P2PClient(); public: + BOOL ModuleHelp_P2PClient_Init(int nTimeout, CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT fpCall_P2PClient, LPVOID lParam = NULL); + BOOL ModuleHelp_P2PClient_Destory(); BOOL ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO* pSt_PeerInfo); BOOL ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, XENGINE_P2XP_PEERINFO* pSt_PeerInfo = NULL); BOOL ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, XENGINE_P2XPPEER_PROTOCOL*** pppSt_P2XPClient, int* pInt_ListCount); BOOL ModuleHelp_P2PClient_GetLList(LPCTSTR lpszPubAddr, TCHAR*** pppszP2XPClient, int* pInt_ListCount); BOOL ModuleHelp_P2PClient_GetWList(TCHAR*** pppszP2XPClient, int* pInt_ListCount); BOOL ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol); - BOOL ModuleHelp_P2PClient_DelAll(); + BOOL ModuleHelp_P2PClient_DelAll(); +protected: + static XHTHREAD CALLBACK ModuleHelp_P2PClient_Thread(LPVOID lParam); +private: + BOOL m_bIsRun; + int m_nTimeout; + LPVOID m_lParam; + CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT lpCall_P2PClient; private: shared_mutex st_Locker; private: - unordered_map > > stl_MapClients; + shared_ptr pSTDThread; +private: + //接口:公网 内网 连接. + unordered_map > > stl_MapClients; }; diff --git a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def index 472a066..6424eae 100644 --- a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def +++ b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def @@ -9,6 +9,8 @@ EXPORTS ModuleHelp_Language_ConvertZh ModuleHelp_Translation_Convert + ModuleHelp_P2PClient_Init + ModuleHelp_P2PClient_Destory ModuleHelp_P2PClient_Add ModuleHelp_P2PClient_Get ModuleHelp_P2PClient_GetLan diff --git a/XEngine_Source/XEngine_ModuleHelp/pch.cpp b/XEngine_Source/XEngine_ModuleHelp/pch.cpp index d09a3e7..828fe0b 100644 --- a/XEngine_Source/XEngine_ModuleHelp/pch.cpp +++ b/XEngine_Source/XEngine_ModuleHelp/pch.cpp @@ -55,6 +55,14 @@ extern "C" BOOL ModuleHelp_Translation_Convert(ENUM_XENGINE_APISERVICE_TRANSLATI /************************************************************************/ /* 导出的P2P客户端帮助函数 */ /************************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Init(int nTimeout, CALLBACK_APISERVICE_MODULE_HELP_P2PCLIENT fpCall_P2PClient, LPVOID lParam) +{ + return m_P2PClient.ModuleHelp_P2PClient_Init(nTimeout, fpCall_P2PClient, lParam); +} +extern "C" BOOL ModuleHelp_P2PClient_Destory() +{ + return m_P2PClient.ModuleHelp_P2PClient_Destory(); +} extern "C" BOOL ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO * pSt_PeerInfo) { return m_P2PClient.ModuleHelp_P2PClient_Add(pSt_PeerInfo); -- Gitee From b43c96010aa349b70c805f561b4a6677f60997da Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 22 Jun 2022 09:24:53 +0800 Subject: [PATCH 11/19] delete:unused configure field and code --- XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h | 4 +--- .../ModuleConfigure_Json/ModuleConfigure_Json.cpp | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h index cf64d39..29bb4d8 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h @@ -18,20 +18,18 @@ typedef struct TCHAR tszIPAddr[128]; //本机IP地址,根据需要配置 BOOL bDeamon; //是否以守护进程启动,LINUX有效 int nHttpPort; //HTTP服务端口 - int nCenterPort; //业务端口 struct { int nMaxClient; //最大客户端个数 int nMaxQueue; //最大队列个数 int nIOThread; //网络IO线程数 int nHTTPThread; //HTTP任务处理线程数 - int nCenterThread; //业务任务处理线程数 }st_XMax; struct { int nTimeCheck; //检测次数 int nHTTPTimeOut; //HTTP超时时间 - int nCenterTimeOut; //业务超时时间 + int nP2PTimeOut; //P2P客户端超时时间 }st_XTime; //次数*时间=超时 struct { diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index 7faf991..b9cbb55 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -97,7 +97,7 @@ BOOL CModuleConfigure_Json::ModuleConfigure_Json_File(LPCTSTR lpszConfigFile, XE pSt_ServerConfig->st_XMax.nIOThread = st_JsonXMax["nIOThread"].asInt(); pSt_ServerConfig->st_XMax.nHTTPThread = st_JsonXMax["nHttpThread"].asInt(); - if (st_JsonRoot["XTime"].empty() || (2 != st_JsonRoot["XTime"].size())) + if (st_JsonRoot["XTime"].empty() || (3 != st_JsonRoot["XTime"].size())) { Config_IsErrorOccur = TRUE; Config_dwErrorCode = ERROR_MODULE_CONFIGURE_JSON_XTIME; @@ -106,6 +106,7 @@ BOOL CModuleConfigure_Json::ModuleConfigure_Json_File(LPCTSTR lpszConfigFile, XE Json::Value st_JsonXTime = st_JsonRoot["XTime"]; pSt_ServerConfig->st_XTime.nTimeCheck = st_JsonXTime["nTimeCheck"].asInt(); pSt_ServerConfig->st_XTime.nHTTPTimeOut = st_JsonXTime["nHttpTimeOut"].asInt(); + pSt_ServerConfig->st_XTime.nP2PTimeOut = st_JsonXTime["nP2PTimeOut"].asInt(); if (st_JsonRoot["XLog"].empty() || (3 != st_JsonRoot["XLog"].size())) { -- Gitee From 75c052ace54105155caab4e743cec9076f201870 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 24 Jun 2022 14:08:07 +0800 Subject: [PATCH 12/19] added:p2p client heart for module help --- .../XEngine_ModuleHelp/ModuleHelp_Define.h | 16 ++++- .../ModuleHelp_P2PClient.cpp | 63 +++++++++++++++++++ .../ModuleHelp_P2PClient.h | 7 ++- .../XEngine_ModuleHelp/XEngine_ModuleHelp.def | 3 +- XEngine_Source/XEngine_ModuleHelp/pch.cpp | 4 ++ 5 files changed, 88 insertions(+), 5 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h index 8c29ca1..59cf06f 100644 --- a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_Define.h @@ -272,4 +272,18 @@ extern "C" BOOL ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PP 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL ModuleHelp_P2PClient_DelAll(); \ No newline at end of file +extern "C" BOOL ModuleHelp_P2PClient_DelAll(); +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Heart +函数功能:触发一次心跳 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的节点地址 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" BOOL ModuleHelp_P2PClient_Heart(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp index 0cc25f8..058a81f 100644 --- a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.cpp @@ -512,6 +512,69 @@ BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_DelAll() return TRUE; } +/******************************************************************** +函数名称:ModuleHelp_P2PClient_Heart +函数功能:触发一次心跳 + 参数.一:pSt_P2PProtocol + In/Out:In + 类型:数据结构指针 + 可空:N + 意思:要操作的节点地址 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +BOOL CModuleHelp_P2PClient::ModuleHelp_P2PClient_Heart(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol) +{ + ModuleHelp_IsErrorOccur = FALSE; + + if (NULL == pSt_P2PProtocol) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_PARAMENT; + return FALSE; + } + //查找元素 + st_Locker.lock_shared(); + unordered_map > >::iterator stl_MapPubIterator = stl_MapClients.find(pSt_P2PProtocol->tszPublicAddr); + if (stl_MapPubIterator == stl_MapClients.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + //转换地址 + XENGINE_LIBADDR st_LibAddr; + TCHAR tszPrivateAddr[64]; + + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + memset(&st_LibAddr, '\0', sizeof(XENGINE_LIBADDR)); + //获取私有网络的路由地址 + BaseLib_OperatorIPAddr_IsIPV4Addr(pSt_P2PProtocol->tszPrivateAddr, &st_LibAddr); + _stprintf_s(tszPrivateAddr, _T("%d.%d.%d"), st_LibAddr.nIPAddr1, st_LibAddr.nIPAddr2, st_LibAddr.nIPAddr3); + + unordered_map >::iterator stl_MapPriIterator = stl_MapPubIterator->second.find(tszPrivateAddr); + if (stl_MapPriIterator == stl_MapPubIterator->second.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + unordered_map::iterator stl_MapConnIterator = stl_MapPriIterator->second.find(pSt_P2PProtocol->tszConnectAddr); + if (stl_MapConnIterator == stl_MapPriIterator->second.end()) + { + ModuleHelp_IsErrorOccur = TRUE; + ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_P2P_NOTFOUND; + st_Locker.unlock_shared(); + return FALSE; + } + stl_MapConnIterator->second.st_PeerTimer.dwUserTime = time(NULL); + st_Locker.unlock_shared(); + return TRUE; +} ////////////////////////////////////////////////////////////////////////// // 保护函数 ////////////////////////////////////////////////////////////////////////// diff --git a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h index eefe1d1..f2ba48a 100644 --- a/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h +++ b/XEngine_Source/XEngine_ModuleHelp/ModuleHelp_P2PClient/ModuleHelp_P2PClient.h @@ -20,11 +20,12 @@ public: BOOL ModuleHelp_P2PClient_Destory(); BOOL ModuleHelp_P2PClient_Add(XENGINE_P2XP_PEERINFO* pSt_PeerInfo); BOOL ModuleHelp_P2PClient_Get(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, XENGINE_P2XP_PEERINFO* pSt_PeerInfo = NULL); - BOOL ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, XENGINE_P2XPPEER_PROTOCOL*** pppSt_P2XPClient, int* pInt_ListCount); + BOOL ModuleHelp_P2PClient_GetLan(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, XENGINE_P2XPPEER_PROTOCOL*** pppSt_P2XPClient, int* pInt_ListCount); BOOL ModuleHelp_P2PClient_GetLList(LPCTSTR lpszPubAddr, TCHAR*** pppszP2XPClient, int* pInt_ListCount); - BOOL ModuleHelp_P2PClient_GetWList(TCHAR*** pppszP2XPClient, int* pInt_ListCount); + BOOL ModuleHelp_P2PClient_GetWList(TCHAR*** pppszP2XPClient, int* pInt_ListCount); BOOL ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol); - BOOL ModuleHelp_P2PClient_DelAll(); + BOOL ModuleHelp_P2PClient_DelAll(); + BOOL ModuleHelp_P2PClient_Heart(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol); protected: static XHTHREAD CALLBACK ModuleHelp_P2PClient_Thread(LPVOID lParam); private: diff --git a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def index 6424eae..3284528 100644 --- a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def +++ b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.def @@ -17,4 +17,5 @@ EXPORTS ModuleHelp_P2PClient_GetLList ModuleHelp_P2PClient_GetWList ModuleHelp_P2PClient_Delete - ModuleHelp_P2PClient_DelAll \ No newline at end of file + ModuleHelp_P2PClient_DelAll + ModuleHelp_P2PClient_Heart \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleHelp/pch.cpp b/XEngine_Source/XEngine_ModuleHelp/pch.cpp index 828fe0b..b695366 100644 --- a/XEngine_Source/XEngine_ModuleHelp/pch.cpp +++ b/XEngine_Source/XEngine_ModuleHelp/pch.cpp @@ -90,4 +90,8 @@ extern "C" BOOL ModuleHelp_P2PClient_Delete(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PP extern "C" BOOL ModuleHelp_P2PClient_DelAll() { return m_P2PClient.ModuleHelp_P2PClient_DelAll(); +} +extern "C" BOOL ModuleHelp_P2PClient_Heart(XENGINE_P2XPPEER_PROTOCOL * pSt_P2PProtocol) +{ + return m_P2PClient.ModuleHelp_P2PClient_Heart(pSt_P2PProtocol); } \ No newline at end of file -- Gitee From 64de1ca81b6f7aecd4884f5961bbc283b96351c3 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 27 Jun 2022 09:14:17 +0800 Subject: [PATCH 13/19] added:p2p client callback --- .../XEngine_HTTPTask/HTTPTask_P2PClient.cpp | 4 ++++ .../XEngine_HTTPTask/HTTPTask_P2PClient.h | 1 + .../XEngine_HttpApp/XEngine_HttpApp.cpp | 12 ++++++++++++ 3 files changed, 17 insertions(+) diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp index 69f56bc..4cc44cd 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp @@ -1,5 +1,9 @@ #include "../XEngine_Hdr.h" +void CALLBACK XEngine_HTTPTask_P2PCallback(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, LPVOID lParam) +{ + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("HTTP客户端:公网:%s,私网:%s,连接:%s P2P离开"), pSt_P2PProtocol->tszPublicAddr, pSt_P2PProtocol->tszPrivateAddr, pSt_P2PProtocol->tszConnectAddr); +} BOOL XEngine_HTTPTask_P2PClient(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, int unOperatorCode) { int nSDLen = 4096; diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.h b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.h index e23c9cd..02bfba9 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.h @@ -1,3 +1,4 @@ #pragma once +void CALLBACK XEngine_HTTPTask_P2PCallback(XENGINE_P2XPPEER_PROTOCOL* pSt_P2PProtocol, LPVOID lParam); BOOL XEngine_HTTPTask_P2PClient(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, int unOperatorCode); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp index 9b72db2..8b25c75 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HttpApp.cpp @@ -38,6 +38,8 @@ void ServiceApp_Stop(int signo) ModuleDatabase_IDCard_Destory(); ModuleDatabase_Phone_Destory(); ModuleDatabase_Bank_Destory(); + //销毁其他 + ModuleHelp_P2PClient_Destory(); //销毁日志资源 HelpComponents_XLog_Destroy(xhLog); ModulePlugin_Core_Destroy(); @@ -226,6 +228,14 @@ int main(int argc, char** argv) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("启动服务中,HTTP消息服务没有被启用")); } + //初始化P2P + if (!ModuleHelp_P2PClient_Init(st_ServiceConfig.st_XTime.nP2PTimeOut, XEngine_HTTPTask_P2PCallback)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动P2P客户端管理器失败,错误:%lX"), ModuleHelp_GetLastError()); + goto XENGINE_SERVICEAPP_EXIT; + } + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动P2P客户端管理器成功,超时时间设置:%d 秒"), st_ServiceConfig.st_XTime.nP2PTimeOut); + //启动插件 if (!ModulePlugin_Core_Init()) { @@ -278,6 +288,8 @@ XENGINE_SERVICEAPP_EXIT: ModuleDatabase_IDCard_Destory(); ModuleDatabase_Phone_Destory(); ModuleDatabase_Bank_Destory(); + //销毁其他 + ModuleHelp_P2PClient_Destory(); //销毁日志资源 HelpComponents_XLog_Destroy(xhLog); ModulePlugin_Core_Destroy(); -- Gitee From 51a42e964e3efa28ce905d352b0a7658229ca832 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 27 Jun 2022 10:36:28 +0800 Subject: [PATCH 14/19] fixed:p2p send msg is crash --- .../XEngine_HTTPTask/HTTPTask_P2PClient.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp index 4cc44cd..8f4c23d 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask/HTTPTask_P2PClient.cpp @@ -52,7 +52,7 @@ BOOL XEngine_HTTPTask_P2PClient(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, i XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("HTTP客户端:%s,处理登录错误,设置用户信息失败,错误码:%lX"), lpszClientAddr, ModuleHelp_GetLastError()); return FALSE; } - ModuleProtocol_Packet_P2PCommon(tszSDBuffer, &nSDLen); + ModuleProtocol_Packet_P2PCommon(tszRVBuffer, &nRVLen); RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("HTTP客户端:%s,处理用户登录请求成功,用户名:%s"), lpszClientAddr, st_ClientPeer.st_PeerAddr.tszUserName); @@ -83,7 +83,7 @@ BOOL XEngine_HTTPTask_P2PClient(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, i XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("HTTP客户端:%s,列表请求失败,请求同步局域网列表失败,公有地址:%s,私有地址:%s,错误码:%lX"), lpszClientAddr, st_P2PProtocol.tszPublicAddr, st_P2PProtocol.tszPrivateAddr, ModuleHelp_GetLastError()); return FALSE; } - ModuleProtocol_Packet_P2PLan(tszSDBuffer, &nSDLen, &ppSt_ListClients, nListCount); + ModuleProtocol_Packet_P2PLan(tszRVBuffer, &nRVLen, &ppSt_ListClients, nListCount); RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListClients, nListCount); @@ -124,6 +124,9 @@ BOOL XEngine_HTTPTask_P2PClient(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, i } else { + st_HDRParam.nHttpCode = 404; + RfcComponents_HttpServer_SendMsgEx(xhHTTPPacket, tszSDBuffer, &nSDLen, &st_HDRParam); + XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("客户端:%s,请求了一条未知的子协议:%lX"), lpszClientAddr, unOperatorCode); } return TRUE; -- Gitee From 52881fda73c59f535ecfabab676ac7b9ae4d01cd Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 27 Jun 2022 11:09:33 +0800 Subject: [PATCH 15/19] fixed:build error --- XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj | 3 +++ XEngine_Source/XEngine_ModuleHelp/pch.h | 2 ++ XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile | 4 +++- .../XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp | 1 - 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj index 06db81a..482b508 100644 --- a/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj +++ b/XEngine_Source/XEngine_ModuleHelp/XEngine_ModuleHelp.vcxproj @@ -78,14 +78,17 @@ false $(XEngine_Include);../XEngine_ThirdPart/opencc/include;$(IncludePath) + $(XEngine_Lib32);$(LibraryPath) true $(XEngine_Include);../XEngine_ThirdPart/opencc/include;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) false $(XEngine_Include);../XEngine_ThirdPart/opencc/include;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) diff --git a/XEngine_Source/XEngine_ModuleHelp/pch.h b/XEngine_Source/XEngine_ModuleHelp/pch.h index bc631e4..69dc24f 100644 --- a/XEngine_Source/XEngine_ModuleHelp/pch.h +++ b/XEngine_Source/XEngine_ModuleHelp/pch.h @@ -15,6 +15,8 @@ #endif //PCH_H #include #include +#include +#include #include #include #include diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile index 2c7d9f7..b06de8a 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/Makefile @@ -10,7 +10,7 @@ LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool LIBEX = -static-libgcc -ldl -lrt -lpthread LOADSO = -Wl,-rpath=./,--disable-new-dtags LIBINCLUDE = XEngine_Configure.o XEngine_Network.o XEngine_HTTPTask.o XEngine_PluginTask.o XEngine_HttpApp.o \ - HTTPTask_IPInfo.o HTTPTask_IDCard.o HTTPTask_Phone.o HTTPTask_Bank.o HTTPTask_Language.o HTTPTask_Translation.o + HTTPTask_IPInfo.o HTTPTask_IDCard.o HTTPTask_Phone.o HTTPTask_Bank.o HTTPTask_Language.o HTTPTask_Translation.o HTTPTask_P2PClient.o ifeq ($(RELEASE),1) FLAGS = -c -O2 @@ -50,6 +50,8 @@ HTTPTask_Language.o:./XEngine_HTTPTask/HTTPTask_Language.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./XEngine_HTTPTask/HTTPTask_Language.cpp HTTPTask_Translation.o:./XEngine_HTTPTask/HTTPTask_Translation.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./XEngine_HTTPTask/HTTPTask_Translation.cpp +HTTPTask_P2PClient.o:./XEngine_HTTPTask/HTTPTask_P2PClient.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./XEngine_HTTPTask/HTTPTask_P2PClient.cpp XEngine_HttpApp.o:./XEngine_HttpApp.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./XEngine_HttpApp.cpp diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp index eacbf61..48a9e37 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_HttpApp/XEngine_HTTPTask.cpp @@ -95,7 +95,6 @@ BOOL XEngine_HTTPTask_Handle(RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, LPCTSTR LPCTSTR lpszParamBank = _T("bank"); LPCTSTR lpszParamLanguage = _T("language"); LPCTSTR lpszParamTranslation = _T("translation"); - LPCTSTR lpszParamForward = _T("forward"); LPCTSTR lpszParamP2PClient = _T("p2p"); memset(tszKey, '\0', sizeof(tszKey)); -- Gitee From 9844f6e5c7d699083c1596c913ef0331912fcf52 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 27 Jun 2022 13:52:56 +0800 Subject: [PATCH 16/19] added:p2p client example --- .../APPClient_P2PExample.cpp | 158 ++++++++++++++++++ .../APPClient_P2PExample.vcxproj | 143 ++++++++++++++++ .../APPClient_P2PExample.vcxproj.filters | 22 +++ .../APPClient_P2PExample.vcxproj.user | 4 + 4 files changed, 327 insertions(+) create mode 100644 XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.cpp create mode 100644 XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj create mode 100644 XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj.filters create mode 100644 XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj.user diff --git a/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.cpp b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.cpp new file mode 100644 index 0000000..a086ddc --- /dev/null +++ b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.cpp @@ -0,0 +1,158 @@ +#ifdef _MSC_BUILD +#include +#include +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") +#pragma comment(lib,"XEngine_Core/XEngine_NetXApi") +#pragma comment(lib,"XEngine_NetHelp/NetHelp_APIHelp") +#pragma comment(lib,"Ws2_32") +#pragma comment(lib,"../../XEngine_Source/x64/Debug/jsoncpp") +#else +#include +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../XEngine_Source/XEngine_UserProtocol.h" + +//需要优先配置XEngine +//WINDOWS使用VS2022 x64 debug 编译 +//linux使用下面的命令编译 +//g++ -std=c++17 -Wall -g APPClient_P2PExample.cpp -o APPClient_P2PExample.exe -I ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_Core -L /usr/local/lib/XEngine_Release/XEngine_NetHelp -lXEngine_BaseLib -lXEngine_NetXApi -lNetHelp_APIHelp -ljsoncpp + +LPCTSTR lpszUserName = _T("123123aa"); +TCHAR tszPublicAddr[128]; +TCHAR tszPrivateAddr[128]; + +int nPort = 5103; +SOCKET m_hSocket; + +int APPClient_P2XPLogin() +{ + Json::Value st_JsonRoot; + LPCTSTR lpszAddr = _T("http://192.168.1.8:5501/api?function=p2p¶ms1=24577"); + ENUM_XENGINE_NETXAPI_SOCKET_CONNECTTYPE dwNetType; + + memset(tszPublicAddr, '\0', sizeof(tszPublicAddr)); + memset(tszPrivateAddr, '\0', sizeof(tszPrivateAddr)); + //获取网络连接类型 + if (!NetXApi_Socket_GetNetConnectType(&dwNetType)) + { + return -1; + } + int nListCount = 0; + NETXAPI_CARDINFO** ppSt_APICard; + NetXApi_Socket_GetCardInfo(&ppSt_APICard, &nListCount, AF_INET); + APIHelp_NetWork_GetIPNet(tszPublicAddr); + if (nListCount <= 0) + { + return -1; + } + //得到IP地址 + strcpy(tszPrivateAddr, ppSt_APICard[0]->tszIPAddr); + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_APICard, nListCount); + + st_JsonRoot["tszUserName"] = lpszUserName; + st_JsonRoot["tszPrivateAddr"] = tszPrivateAddr; + st_JsonRoot["tszPublicAddr"] = tszPublicAddr; + st_JsonRoot["dwConnectType"] = (Json::Value::UInt)dwNetType; + st_JsonRoot["dwPeerType"] = 0; + + int nMsgLen = 0; + int nHTTPCode = 0; + TCHAR* ptszMsgBuffer = NULL; + if (!APIHelp_HttpRequest_Post(lpszAddr, st_JsonRoot.toStyledString().c_str(), &nHTTPCode, &ptszMsgBuffer, &nMsgLen)) + { + return -1; + } + printf("APPClient_P2XPLogin,&nMsgLen:%d,%s\n", nMsgLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + return 0; +} + +int APPClient_P2XPList() +{ + Json::Value st_JsonRoot; + LPCTSTR lpszAddr = _T("http://192.168.1.8:5501/api?function=p2p¶ms1=24579"); + + st_JsonRoot["tszUserName"] = lpszUserName; + st_JsonRoot["tszPrivateAddr"] = tszPrivateAddr; + st_JsonRoot["tszPublicAddr"] = tszPublicAddr; + + int nMsgLen = 0; + int nHTTPCode = 0; + TCHAR* ptszMsgBuffer = NULL; + if (!APIHelp_HttpRequest_Post(lpszAddr, st_JsonRoot.toStyledString().c_str(), &nHTTPCode, &ptszMsgBuffer, &nMsgLen)) + { + return -1; + } + printf("APPClient_P2XPList,&nMsgLen:%d,%s\n", nMsgLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + return 0; +} + +int APPClient_P2XPGetUser() +{ + Json::Value st_JsonRoot; + LPCTSTR lpszAddr = _T("http://192.168.1.8:5501/api?function=p2p¶ms1=24583"); + + st_JsonRoot["tszUserName"] = lpszUserName; + st_JsonRoot["tszPrivateAddr"] = tszPrivateAddr; + st_JsonRoot["tszPublicAddr"] = tszPublicAddr; + + int nMsgLen = 0; + int nHTTPCode = 0; + TCHAR* ptszMsgBuffer = NULL; + if (!APIHelp_HttpRequest_Post(lpszAddr, st_JsonRoot.toStyledString().c_str(), &nHTTPCode, &ptszMsgBuffer, &nMsgLen)) + { + return -1; + } + printf("APPClient_P2XPGetUser,&nMsgLen:%d,%s\n", nMsgLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + return 0; +} + +int APPClient_P2XPConnect() +{ + Json::Value st_JsonRoot; + LPCTSTR lpszAddr = _T("http://192.168.1.8:5501/api?function=p2p¶ms1=24581"); + + st_JsonRoot["tszUserName"] = lpszUserName; + st_JsonRoot["tszPrivateAddr"] = tszPrivateAddr; + st_JsonRoot["tszPublicAddr"] = tszPublicAddr; + + int nMsgLen = 0; + int nHTTPCode = 0; + TCHAR* ptszMsgBuffer = NULL; + if (!APIHelp_HttpRequest_Post(lpszAddr, st_JsonRoot.toStyledString().c_str(), &nHTTPCode, &ptszMsgBuffer, &nMsgLen)) + { + return -1; + } + printf("APPClient_P2XPConnect,&nMsgLen:%d,%s\n", nMsgLen, ptszMsgBuffer); + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + return 0; +} + +int main() +{ +#ifdef _MSC_BUILD + WSADATA st_WSAData; + WSAStartup(MAKEWORD(2, 2), &st_WSAData); +#endif + + APPClient_P2XPLogin(); + APPClient_P2XPList(); + //APPClient_P2XPGetUser(); + //APPClient_P2XPConnect(); + +#ifdef _MSC_BUILD + WSACleanup(); +#endif + return 0; +} \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj new file mode 100644 index 0000000..ba0a1ba --- /dev/null +++ b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj @@ -0,0 +1,143 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {d3c54afe-44f5-4d2f-b4c6-7b3f9faed95b} + APPClientP2PExample + 10.0 + + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + MultiByte + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + $(XEngine_Include);../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) + + + $(XEngine_Include);$(IncludePath) + $(XEngine_Lib32);$(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;_CRT_SECURE_NO_WARNINGS;%(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_P2PExample/APPClient_P2PExample.vcxproj.filters b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj.filters new file mode 100644 index 0000000..178aff0 --- /dev/null +++ b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.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_P2PExample/APPClient_P2PExample.vcxproj.user b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/XEngine_APPClient/APPClient_P2PExample/APPClient_P2PExample.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file -- Gitee From 7f2ae0b2b0c9f21775572304def625a78db611b9 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 27 Jun 2022 15:54:26 +0800 Subject: [PATCH 17/19] update:configure file --- XEngine_Release/XEngine_Config/XEngine_Config.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index e4d2d08..831e304 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -10,7 +10,8 @@ }, "XTime":{ "nTimeCheck":3, - "nHttpTimeOut":5 + "nHttpTimeOut":5, + "nP2PTimeOut":60 }, "XLog":{ "MaxSize":1024000, @@ -30,6 +31,7 @@ "tszPluginFile":"./XEngine_Config/XEngine_PluginConfig.json" }, "XVer":[ + "2.2.0.1001 Build20220701", "2.1.0.1001 Build20220429", "1.1.0.1001 Build20220402", "1.0.0.1001 Build20220311" -- Gitee From baf4f0ebc9662718f46c8a9d06343d1c914198ef Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 28 Jun 2022 09:00:56 +0800 Subject: [PATCH 18/19] update:readme and docment --- README.en.md | 9 ++++++--- README.md | 9 ++++++--- XEngine_Docment/Docment_en.docx | Bin 122465 -> 125244 bytes XEngine_Docment/Docment_zh.docx | Bin 123555 -> 126584 bytes 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/README.en.md b/README.en.md index 26315a4..019997a 100644 --- a/README.en.md +++ b/README.en.md @@ -1,6 +1,7 @@ [中文](README.md) || [English](README.en.md) # XEngine_APIService This repository has a development and master branch. If you want to use it, please use the master branch +As long as the repository is not in suspended state, we will maintain and develop it all the time, please use it with confidence ## Introduction c c++ 接口服务器 @@ -30,9 +31,11 @@ and support plugin module 15. Exchange rate calculation (planned) 16. QR code generation and parse (planned) 17. Simplified and Traditional Conversion -18. Oil price inquiry (planned) -19. Twenty-four solar terms (planned) -20. Xinhua Dictionary +18. Twenty-four solar terms (planned) +19. Xinhua Dictionary +20. Metering Conversion +21. CDKey Creator (planned) +22. Distributed lock (planned) ## install diff --git a/README.md b/README.md index 32d087f..b85e417 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ [中文](README.md) || [English](README.en.md) # XEngine_APIService 本仓库有开发和主分支,如果要使用,请使用master分支下的代码 +只要仓库不是在暂停状态,那么就会有人一直维护和开发,请放心使用 ## 介绍 c c++ 接口服务器 @@ -30,9 +31,11 @@ c c++ interface api service 15. 汇率计算(计划中) 16. 二维码生成解析(计划中) 17. 简繁转换 -18. 油价查询(计划中) -19. 二十四节气(计划中) -20. 新华词典 +18. 二十四节气(计划中) +19. 新华词典 +20. 计量转换(计划中) +21. CDKey创建支持(计划中) +22. 分布式锁API(计划中) ## 安装教程 diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index f0303dd65b4e47af78242ada2f320e18054355d2..9df27402a71b203c6ee70fd1284a7f9f9d7540d4 100644 GIT binary patch delta 109232 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 Pu?3)o_xl5x3+n#^#u!-S delta 106432 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

dj0lC!@Z;*FfH(znt#m&APP- z8g~4^oKa8a`FTP9rpGT=;g-p{z0T3}vDTX8opzP@u)98YBJ!pqu>|^&VOuKgk6w9t z=3TPkDg$Ayx#_2Wv?ap~9#0w}cdyW~OAtCo=mc*!@NM_pU)s(JL(=rO=1 zXKKD#UM3^7D%T_{9`)sBtxZ~A17LLSL-WKzvr|u7WGk|N`g0Q~S6ZE8 z&OH4R5|osGx!-ox1Fd0qsiDLYsCIkI8KuTFJD~IRK3L+LVMa#8RgyXca>SKhPdgS} zFv_RJ9;`82uG{Dtl-QN+e1eDM)0A2@$AARKv}DF+JC_mUs#&9NR886vIoy`O7WMBa z)_-OW44WQkTw0KqFWUEyU><|C<_3e&DBkUor_HK=Ka$Uxme7vzW6q2;2}iirZN%~# zF^%bHOgm=1-*h%ftfBsDq7kJNNhYT*pN7sfGt#?`PG@=&yS~&iXZ5r@9g-I04ks)9 zl4Df*etDWIy^J})fZ%1TQ$L84nlnK@@3Up31VabPtA5%dblVcho{Tx@ZlkHkz1|d= z_LaJSYS+<8&@9Ic?wLCE@Fb6;XJF^x8K|edp8B7bO}-;rn$O&$EHS1?K25efgbC%z*) z>TVmDXZSMt6(+T;iHp`zkS~+#Hpy9Ko=Loa?6#&J z%{M+jtXuh}gVQ4YA6KwEPiiDA@m<}n0&9@r*7t$V09h-^f;}YT z1zhm*|2f93ow>Gs8FgSiH@Y`-68nm%I4dl7Eb-@6mfgN$G|#-VUhnVrB+!O`>Gs5b z5W<_f)|=XfVsj~x$;sF{9}D=b$BgSa?*+j;(82m0>=24PQv%49SgCzqr#&+QyFQUy z`WU;;K;1!d$DO_=vS&XYY_XiRKJ05+wX1w&_6{uMNYZm|s({lLL-T{=`KmD^;(XK%IG}l;m^lX4 zy!U}bfe2iWk&Vr-t+~paRkNOi7cIw7AbaXJ0Su9>9s{?LIq?HByP01|K3ywv=%sq5 zFT+xn#?G@nEm}0?R}kfs@T+yh+TGcgW75?Zqy3}`X@B?cd!?(wL;Z8p^VqBM zIDE)jS(aR#m4%WScI<$E_j`H;B>D&ES&$T8(u&pvaat3@bc}$^k*6N3Mt3n|s6rX! z9@SUAdxRXK)Ez@18Fb0@6-KpWzo}$aBgqcoV`!LsnjX&Sy&v0!5+(P+NNctoA|TSJ zWJoQQ0J)+<9>+V+oXW@UvVH8TfYXz}iSxzNI}{-|rv4a5I5VDq$ARK3bB81jeV#@Z zes{RRlK-4C9)f*gVy@Ts(Hd6kz?6VJrSEKN@^g6>e4I0J(Z_}LvGopKwl!llqH>S9 zPszo)OppJNoKskq?{n&p-fw!oM9pFhF2+w|S5C!5kmEV#2?SDJ0h?1Qrz~Q4A7y`K zi=8*DwwW^`(e$f-zA5}FKe)~|{-4n)vSv-v9j|Cab#nQptm`v*7EToY;zId5ldfO+ zrks*Fb6_W2>5&zD@G0=Zr4#jQ82yoQ25iCX({&0W0ov7=0bR*F)A_)QkkN4dl472m zo2DLLRtJNL{8-LF%;6|&gAY1d#?=^nMqQI4!-LW_R|n63+$%F(=X1icliyTPXfr*C z;Pb>wQ;=w2lJCREfX2-CaZ1x#mpN3jlV9#R+8^X;eB#>6`xMSkg=Id?_Gsol0hxPe z1Wu5n?k{sf+oS%fHZ93WPEIhBxSl2-pc8INHW8V8)6Y4rtzjvuEAb(xL_Yr9`khhznSJ3z z!nG#K)lra$@F}0BqAPhYSPjlk-P^x}Ad?*rl0l7sXYRKJpG3yEbZnLH%d@@s4!x`3 zT@Xyx`#`lQpZ+4*vyLCvlek!ZZCowyM1Y@+>nU@T?q98abBAnbozjXv0k%6zeFA@V zAC4373s9)ubQ_4MJi*9_(W2EDbV66=s+q8#EA4oc7K$QskIG}fs^;&AY-fa4C|dbI zo}Zn6h155?JVv88HIY%bn=?2@+vQvx0XTMf&HBKj*7oRu_~q=UsXNK&*Qo<5*iZcq zl{6)u0xAxeA@AT*FUGc1Pq^E}x}TS5V%p@iky3zqpCM_4KD_Bo1x~z=gaF(|t*Fjx zFTkf9qi0b1O!CnR4(gj;cVV1FsE8eph7R?AJ9pip^WJ84qj&5vtfa&V@xJ(trIFMU ziRP6?A^~RmGDcD)-;~+g(G__Q_6%NEmnPJA@iU?4r#@|m!^JdsY- zT94>)Mj9_H7>WdP%oE63F0rL|Twlfqv-(1q39l)0{{N7d${!!I2&s&=6#^Jy9uJgHoE85?<{wYW1a=U$s>{3 zm-cE%CGu(S(Mu;Km{t=RhnwQwJhay$a+-MMYmkm)cA4b4Wki$Y!y3!EZNPMSeio6_ zto6N?T_ISWh2<9mA%BNem64wd=LoLt8sqphqr}BI)z>!1K(e(?L}bu?moLSCaHx~& zY07-`>ud?#o4Xh3elw(Ba5cj2`853GX?0%OP<0okOJw_#$Sc_Zy+~5?fxK$7T{8eO zoBO8SvAktgkMg=q6Doc3W`4yWF*>9t`I02aYI%$~blA*wL;9!$sh-BT7S>G( zAZDR-_)=1lRc{7SKMs9=SOFvtkINaTfKq%?GkB?=tN4zm$p+UQJS22ToGh4rr7z`4 zkf^At$Q+5@F1^-lr|i~g3?j3N`@>KQ`6czvy6Sa*9=5VEy1o?Zl|8I1_*oAS(5zSkYh936cyV%E&j z=_rnY2XKa%U1|TjD}5_OyD{gdb^P7`@ITiK@F8dP3u_;&VQQDVXt;x#Pn-3}C=1dU z_^Pt(?s)Ql6^-W8c4&`W(YsViA(b>tRdrFgbrQrpX)E6WqOxNT^uq%@J?ExGdd|B9 zO(b(L-*j+US5DmT%nz`IS_9QG$slYD3~NO_evzO@&8I;`rIp5&>8$+dIW}Nn^)wP~ z%u>Q#C{&B5eLia;21u~NR4k1|hv}+EhxfU^T_!bugZHyhVaA|3s!C{*7l&@or{Tq} zxR^1DE{g4fWVD#BI~Y+I|1i(?8@{PE#akgu)lIn*v=6SR)R3SrEXz)O*43R_Os5## z8EOqweI%Eg-*IpEH^l?^DMXYp7h=*}1KEYFCVI#_V1d1AZXdN375y^C#%}F`pxrv; z)AV3}O|Oj=0;^lrEpr&wBiDK~ldJfSxm^m8a|R4ZLE@U*$QAV7(IXMvM2^|nNc}r1 z7{2_D8?bPLO7&s=(z->Tk_N5WVu6-&Wn)Nn=bmYRj&GRUreF3 z{{k0XbrQyi)c4*IskcRP26{U6XEAtJ12&B+Iiay_T!;sOl-e|Xqb$S|iyYR3ib2HhHVDakx2A!TvUB>K>^_>>i z2F*}e5%C};#f6X@ks`W0Z$Jj*v!da~OmB@&YlrMJj>3MLJaI9cdDscNF7sgL8F2O0rMa!wtju&fk#{ z$hsV3b|AMLBkqsYyuJ_c8~-pRFK$+k0imt>pU2&`eSH}t4VMvT+whY;oyG}a_Lhzp z3YG$EiM(CL`IyRF?y|2*RD;+3!$sDA!?-L}?xBQdtqzA)eQ@m^rrqSz#afSx8~IsF zaH!P2HU~!#K%>=8i|qtGVf^j_0N%Y}jY!=ai07rTMi{Ps_~Y)8N&r znw5E=Dzez82MY#rhSHXtxn^25277K*-zX%)U!VCBtovYLkC?Tft`usm4zP>-HQSLh{DI;3dP}V|0wG+CB-rMIy2+E*wZ7H5v7Prq4}N_0q~xRtnn`?OTut}#-@X%Rnhsvm`nGX~p4YJVp|;bHCr z&d*lpT2IrxK4U0<&w=yKtfJ!2Pg}&)>-)av*%l){Q@gNw5iso?3_41&q?+~Om(q$>GJAhyG~&6? zF2!l_AbF_k%HP4=lopCRLAD~tD2kC5si(mN15c*Jp-XIko+O~4L$0WnFv%~*Jr_{y zeV`S{Ry=@OP09YZh6N_i+Hzy`)X3cK6Y>}Is@`;mV)`P{)v8xi#Tz3(pQaN?BI5?c z3@=)adBeu#uG)2z$fzOq`cJZ*17E9E>Dvs23xIFVKq#vijRc6{5;DUfr-_;_wK4}; zADQ}{L!Y^SKEcPTJ6}I-yB)1}*kWgKj+nKqVp|)?Hr(npH#7^lMN;By_nX2-B;S*o zP{Dxoke?^qRa%`Yje*bdZalA-TdU?a%1HWmP&z3h%rOUiV%gU(fHh!(81uq*v1UGt zM6rI|S;)PRsGRvU2$hU}4c0tdjX7phep`*kb9?Y{(g%D!;13e# z@Zx0f?CW=!(ZJy;86C5G%#1**$Lv!w!!ZT%$(^tK9o!kcM_I~1B{fF*_A75D(HMKD zG?M6lj(+dC*1~)^tMhko9%g=<6D&5DYw#ZJk#Yv2hI>YSUT=8+yfG-M=auea0KYwJ*$T^fy9AN-H}9jus{|9O2NUhX;O!%)pE z0-luDm$|`5wkG%Qx*F!Xi8Oj*&HD2Vmj;D@$>q+yGouVmYYG$YvGwB3ItIKJW^_9#3HtQ&6=B)ohtp#Z0Yh%N!E;^ zytGoqXqUf(_c%TN*K#;>xz?+i%+~&5gHST{JL>|(nk%|4Z+!uB49=-O+bH~XgRe1v z66}c8Q)2)2n@aG1IVJM-;OY6a?JcaDl0%_jzK;*eZL2Z6YMEm1pp8@<^jZ(H^UP6d zL`7R|^*aa5YohIGy&KBv95d?#pYMZ?^2^PnbD+F$JxxL6J>#Paz6DFx90S?fr~Z_h z%Iu}4NeD!8$DgA+YwjH`=qJ4?p?w#BQ`%yq8t=?|LE8*gQofJ!wYHH2f*Vu+a;(t8 z)YC4w+eBx88iFh5nFIV)iIqA0_JF0^U}bYfdG5`6Z;YT}o;k*- zNK&0Sxqr2ArFX;|Y`FRg`b@m>UBnuwK7Hvon-Z1KRS~a4*1=Njr)lJwc{4PBUCg)o z3U9dAWCVlz1tiNaH-d&)uW1a!Dr0uo9OSb~Q($x8>a~Qmo{=Bc@cW$^4qm-AEejH% zg=|vk9eHml$I=Jy5e&#vF9nObN~gW^~TL%OIVv z8Sp3P%woSqTOpQn44%`p0?@I@WaO@bq1E%Zo+ccE%=(K&#dAu45HliwV^4qaf8O(~ zt~#})(zUjcMo}By?3%%_ud}9$qbFmN=Z6|!vNraO$C>Gyzk{m)o z66Ig`1{rbYc{Gc%G1p^HZ;C-a_@ippib8SLw8XG{Q;ZV!e2!U~K}#@`@0@vb<>S&U zxf4a4C8hIscoK;lw45S;hxw)|-j<~-uJ=&>nMrx$nz#~C_=Y*1Tkpud&xyR!1`1TQ zEH0$`gLtyuRG)8X-IUBQM7gV=QDwAh%&B`;b*~z*r%%@=NvO$|=T`s>PwqfZQ>~KT z`}?$eGb4?L2@EoSXH>jp6z8p#LRWv1$avA%n)#*&Z#K9PE>Vg(FV8d^B|Bnc=K{@ zHo+_P=pEAn?RS9CsD zx&$|Bo)X9rM0_=COm`f&FA_1@l&sCl2{cYy_6`}H#?$u4lHz0MIR({HV_!2^*&!KE zoRq^i0}wYDdsKdHla|`7-x<(|-fx>YdE${UqJ61Z!DnVA95+&S;yh8KSTzd*q9-l{g$kV~cNW_g@_*(jIJj8)}ha7qs z_xC}6Cy^}i=7tY4u^yAODqT@)fQp@&mJ-!JJ%baMXxlsIA-s~>A7S*?cE||tBr*Yr zSbxp>a&9bvg4(05n8AY-?}LU(Y@_xLA|3UOwRbR^ys-7>)A%f3=EiBK2bRAxdSB>UyfOBXX4{O zkUdx!a?B|Y_eH{XNeM@@t5rU;`#e!@$P@3k*0AW_x$iYMgyw+ODPanwg)hOcNITbh z9{qCilqjcN(@q?;h9b)~gF$$hc_yiUyXu)^SV*nOp>)>tswHwz^yN;JuE~CXMhc`6 zkM)WUL$!4;E|88}!pCSVpZZ{3^|{O2StA9t_q7J=`rOhxL?NahS6V`{FH72dazAdz z+##F%Y2VI#j5BkgpZ)fl6KyZ5tv`C+w7Vo+azr_DFPzo22K%leFZIqY-`K0OkA9)4 zDfWTU%r#JvxTbgb@u?}Ln%nVzzKIj0gx*Pi;iFY0{@faKV%6v!54;JrmSdo2`hC#8 ze6ea!fO94CY4am{K0ZDg0NoSGO!5W@%BLNVBctI89>D5z_iEXo-(Niq8VIXJN+he> z3b?Q-eQ`u&5gIfbg7*jWb-0i@V-b@wOJ+DG{N~Y|=c~ud_~X28UHTRZmk)q{cEOqbWh| z9awiA+j7h(!_DvGn(JzRuU}AuX>H6eQK_tfnt2$_!OC>`AWyHkiN^E#Q-bC#?;os_ zh?w&GV3>B%<~>~oAn;F5825o-04d;Ja`o5p%*!S~eDHOD|?CH@Uc=zgY; zA&ZV1HFu(}hHWFcVeY6!Y6jxu*^&7nCvUCu)Vs>Iycg#A_10K_zJ3QuaN`1IgM=D$ zj97HfdOo^09^98KQ=+wC98{~6FEcN&ff>cY`2~EIYrP<4&YF~Y88vFTZVPn$l9Ck- zL}uk@R_B^IvM{Za)0F0RC4O5 zSHC0bz9sj}yxF~fX(N#+Im;ErozazB&;lrCQjcy2QsmTCs7S74(3P>fX*ojzwrzeN66_GQ1~P}@F0~VvyA(&}PuVSBm{LX~H^KFKAD)Er*p!@l+HNU< z#CheLa;fFGYYZl{dtxJWA^_R;%-R1OMiVis4VaLll!X+FlKqO;t8I6q%kZx!*=#hTfxSaCP#mSq~2K z%%liGf=}kxR#%|5p`M0_F#Bgc7FLM106FIFck;{eG4@^qFt>Xm+L0(r1f~w*uXtR} zz`JHO_@V~4f2#*b_yu`NB>DA2$=^8?akK=>TWgBZ7B25BWueoRma4l9|4!~v?lCxB z%}u54wWfZXMep3mMotqZ1b*-Cn2BU*;uIS+O z%Z!=^L<8(sPXji&r9Zbo_B69Ri571;HwF@(f&3ku0Gn8A9V>$YRA$XMqh zx-U|Ze@{Eu%Do2H3*&5!Idq0g-+4I{U#1VZ2wv~$mn=LM`LX;RwJ(XyTlg~X))cBC zG*z#sog<8tT1-z)i;!bfMfUkQ;foW+yXY$~Es;;-wPh5?7#YIUNH}gJjp}I^b3Jh= z6cUz@+&h=94ShRb;#G;XK;r*UBAhc&c-W^Ae<^7DfXlV$_?udcL7@{z{LU)9&Gb#l zq@cBKTKPdV9i@BM(K|71Wsn4Ha8lz~*|4WG&dd5)n9>vvCUmKGT zGK1P7B(F8k4oXhP1wmeM)A<~Cs=$}HT9Aa_kWe`NLV&7O;M%N%mQu@XDF0?hE5)9MrpzaNSH z!T~GinWqsi_A6uFJdDpHGis}(qN=xA9TbIApE(SU(&9Y^95%lxT+ManSHQsC*3&ve zd8cQzYIfL|Z4xyPXUUn=A{%u{b6J=y>e^olx zxdI)`1jcgRs9uV>-c;#j`{*bnX^}i791LBQ^Jx-L&-|tvmio-#uG%^7U>vuz4c&@)k@=sKaz zQzssLv(||RWtmlFs~(o>&TDRmf9|k}qFN8ph_uCUJt5W0T_uYEzn{OO96T{U>#@UE z^%yw(tnyipLy3KAqyuuL^}(U;q@Q*I7-yzy6_yi7s`pX5jFUeldI|N7amh$0D-D`@ zC2#qCbg36(s^7Vs(ySndg5ied>Ij7^zsaY$PxB7mR081Ojxm&rB7xfRe+q-1d)^CL z+JY3;Io)(C0Hey^(VaZ4b?n>P2;>a3_}ntGAV%QW*V$H@G|;Uz19$VX^%#v2GAkl> zeETvt2pNf{`W?s`2(*;wnv}Vm4cMhCPliOpseBp`VBUZmw&+)4K}lqaYwyS(zxCFt z-@yUf9Jw2QO?Fa_k>|=fe`Fom0J?K^p6uQ{jT`&=)_Vt`YNMN^#PMI(Y2+6P_vWm{ z$-jJ41Y@Wb>rHht>a)H1XAD*~Mlbr$o?l^*>7&~bo5NoCR@P9*P z<@ zc7ii^D2t+IC*O2of5WE#qcBx8FK-!%^dmEB@Jmif-WWQ3%5~N1=;NswR!W?bwCuzI zo(dIm%&yN}o>RyxubN}z0sEF=Dho2zm{phH{+$&DFTDc&_ZStq1}nmvj4%P)v|jHJ+QzvtIeN`7+%je%t8E^u$S2v*sWNHS3$+I=m@Jrg}JKj!7?s&v~jke#8oup?lN{3UA9{7y1JKv^|=Fu}y zZiWt|-c&q(P8Q`2rhd;1?glykPNW|RLhW1w30I-mn!$w_JNbJdQE}X)#dQf-rG<|{ zS;1MZ=mppEf6RS-K{xdpTw-&XMc6K`ct(q)&F;Wg@utdHRE(Cc0`$YuQQ8H=8r4_p zMpKDXq(n<-Wt}Zz&3)2?+yc)W1bq^et{M1&!j_r2o9fCQqd0R1->I0QC zkXAj?f2z?-)!#F(V@G_5u`M=g;Ef6N(Z@HzKBAUQHyfs>67SoRxU`_Ga+ z1$T+fE3mOsft`|*tJyQS?%mO1-!Nup|Al>LzV+MyVW6dI2Do&dnSI%zXPRqo zf8UvQ8TSXPVezEiIaGTcX`$%6`NewDi~h_=Fz;9uV`>UpS4ZS}(?h;9YY}!5LG&5} zJtIPz5|>uu(v((6;ik3}b>GvQ;>x(2at10>wXv)jFg4oO+%L798THs9=QZ@sr(s}7 z493n@7Iw%nhl;N{+v>1|6YG6wL}O})f5-<&1J=5ch*#wpd1BNnF}HypeWrGism7IG z??a+BYiXpz@8kN(-(g+neR}9IieN0qVD8JzgPp6guJ)U3FzD4*PkY>00l5agffgM( zMj9i149xm3d5Pz|~ldChdPJdI0(9VVGUG=5b7b}6xP_BX4x~|YUf9neu zeC{2Mn=p{pn3pt0dhaR-!NPKNbc(rWluZ>F{;K>wR7h7G9Iz|RDJvMEwjoc6=yi8t zl5L#MwAPQe2x;#fedT5IYjyPNK{3`6oilO_O4qi`;}EoBo0IFDgbcgXZ5Cne-Y1Q<~b0~<9f(3Zy1$++N6b7zNvnTZK=A+(1+xX z|D5-|-$#^s&Pa)i_6tLxO4fVFgb;Awpe^c6^_ACPG9|EIS@n0!2g^H8mJ%^B(t4V} z&y`pY7zc=synjZiM%F+X1J$1=OUu^g(m5c&+iyHZ95%go)uM8D`8%5|e|Fa8K;Nkr z$u(g1F6rd}7=tI~JvUsvjK3N4gzT)f-t|(==>7pYqAVuIfXZeE$pg7c*OEdC-;VUa zNRWcP>UV^quf%PrHn`mrYe+&}=BX#y65(|~n>14C@VGDf0Gy(`?|^!Y#>@3Sr%I>H z=^f`RgH04C;@k8~f=q+ujA(^&8wQhK%f8SjRt=`QVl=eUA zeh{mA(}!-I$q}We6<|Q!GLVK^CFk#`*K8(%)An$JY6j?Px?i=Nh@R?oP6tj2xk)~4 za1rKL5IuJ8bBs!ozs^-MuW533?kt=E=HY?4kxn%Q3 zoG)Hmq7Y9A&F-oTfBiNHCTrGMBhEyU;mf&wG6F~f>yclM72R=i#8%vbvc+_+;!fpG z9Gr`JGvQW&jLxqB0j|wYy(xT1Ycbct4TLAha9I-jr4su~XGanQ-1$Beq*VIbC@>ogJ!IYzBYM!(cZ+^(x^3KA9Zd7J4fwWMWtuIkVd z1%eTps!Dwzf9&6N$ijSJ2Kh~uf=}tSo!WeBwO4BZ0M~Wm=Z1^1Er)HDUdT1r6v*9=J3K8;PDIplL6b;zmx`50$r@=q9aw8Ql~5FIY9lqeeN zT_qNc9z4hB1)R}5-G?5KLOBLFB0X`2H`ead{-;Jme;M5e&VWbF_c^g$^l8-GWj}LQ zi8yz6SXyEbuGjl;=ccSGQFW9k1$5ubciqsjIG=nB7`m zL0PC8jwxn9BJN*$2hRNd%-GX~t7XnLAVH{I>!#Zj{6T#M(F+l{o&nc2GhO_1B~bZ3 za*C{^e|l5#7-_37648y6K!E3c$^}%d(lc0{xpzKo(^eQ~e4WjwItVhT>>R_B$V>{{u`Z{nt2WFC85g_u0ddYTIBs5P!(RGYf5BeW z+;-dyZI5FA?0WPIKEA8uuHD_7u?-oKr`q?LflgFgTWJ*R*8AWPbx*I2))UdpQ%`~# zCuaajohaT*0Q<{MJReBbQiq%$-J(+;oceHNb^9ggfOxp(cEUhpG~xoYKsA(OE**bU z`w!;J%tWg0*Ay*x{Dn5WtpJcpe^}L;fiA(f*6|}>(rW+>)VQ>Zs=(iozcc8tQomi2 zp_%2mE^OL;YdTt6-;I}SLB=+&OC@LZNOYMq56Z$PQNCSkFeFZJ?44gEl=*+V1|-WT z*A1Y5a3RJ%7?M}^dnW;LE{quoxJg-DBr9r!{2i6CSK%OaD0w{9E7tp{f8P^POvy{f zfY9WgCeBy64-%n(>YPr30Ip(#BrxM;E0f5-)V)pOXcf*5xywU{D{NSj{k7C78LlB( zseIGHi%?ug#we_-Q$oU8@4X`vdM~@mn2})!?c!WB*2}UZ(e=163qu0UaMd>*?ZgZ1 zXbf++>d{G5b{C?M1c0=Be`gXFdD+)PqJeO(^_v}Eh&9nN$kOtIM;vWht3r85#7A=t z1Sg4VbwpjfQ%mHx<35FplQgP(Zb;;i^Gz9v$-QX|d{ZG|NUmpMm^fKC&53eu^GnT6 zz7IM`b-?wevns6KRjBf>vJcE))#$XJh8v;K&)j`Hk!3xRsKTloe+!AdQ&yT_6;6Oc z+>i(gl_fMJAB>E(1|(~17qkc*ogBl_D+|T%h|gBGkA#I%_bCZ>yxs@D5J%*lr7m=B zT?Mx;3R$yeUnkn+d2^wwG|e#|jKpE{8Dm=&&S6N@JBJlbBC=k%XcBpu@=x(8xoInE zI3yTM@|&XLS_=PWf6Vg0!BB6iwBhVM3Lk&;uG&xi-t*L}KNWST-yugkp%fbf90x4hMkyJ+O=``^Jco# z|7^8xt_#PZ>^BlnobU={Au(d6b&H1mzND_Y%VVe+jn%<^tzUJWV8nDfsMPytO-^0b zS#W+Evu)PcHp-`kg>_1b(~m^o+O#cs;m}2;EqV38Ciyt z5?+0w!iGeBe{jwK!6)*H`U> zZfZ<&24+^+FHn~|k1FS;2v`!go~BB4fYg2eFi+_C(n$BW2ufN3B(LnCV%8&nf0iSAcrL+Ec58R}po2Nm$VuE2d<6ZWRrG-ajkm|2!osI1;U;Ams_&lzS8w$1Bwg z7&Sm0DOt6zFB=IhPiLgf0Gm!>2}ZHZ^VRx5Gh&@vYX+?7+ZPGuis}!D6k9LG)>SY+ z&)$hle~QG9J{2k|waT-A@{sddvtD_-l`R)8b8Ytt#`=hBp`M0vN@tvu%u2rBEwQa~ zMTMl!wD9j67PGXghUClLD0(ccS~Ead@UBXA#WK&&mR9FoB`4<8d>WR~%JF;Jpx4jS zs66-CT3K=I+*ZJTy;aB73`CqW^X<}hRMUPVe?j||rxAxF_RajAH&}FjQ{Y70NjYX2 z{RUHlIWOY}Obu>h&)}Fah}6?g5Y2v?K-SWy5%HMhdp-@)qOcw!Uuquub{tVeQ@snvSXrBEck3H4h{LvBjA^ zB*?kT79;r*!#8EQyZk(QD!qhBM19Z;OL>WmbYQ{=5FxUIVE)Z7NQV_MOO1n_(1 zS6I{x72CNPxX&|kDk!E%F15>OG*lHko(3nHS*r(M1}k&D4{pcgvIYr*9xZ%4i9+P6 z#v{=?FC?$0T=H zJ~}5$EnI$W-iH>;wbuJ4@{+5AL}e}QZ870L`QX~UlKiM^YuzM6;owVOOPt+0iX+W4(8uwn zk{=i)UM+e1LMf5uNo_fj1ylNS!qo3%l)#gsvMw{yye!Sv>dOh^s9CLBbA)8J)FC6Z z0K8c5gF&)wa?a+5D$g-aLhcv08f1XBO)>9R1&Fx`- zWL(S-@n&*vED<${^)$$N^!h20?@XU|SjyQwQ6Y~vE$&Sc-Gnk*&S}K0Soeay44mrx zJ}$G4IdG;PkW}?P{F3CAl0#r`Wv*IwLC8CImHT{8O9%?(3EWyUP@a`tg5@e6?$d>T-@-#wvVCJm%kx1#7gA@xZAhpXh0H66y zS^h_#dRrGaLC%1mm$)ZQaD@l^eISf8tEiW%aAN8mEIS_T-UyK6w&n#uJ|(G;e9UD7|^Cd2b^c|8fUEe`maTy$=|@%2{jHy0#)L zYl(V@{HB^d3gg!p^|UOWlq?!1q~-$|$EclS#5U3np{nk4acfaxGM*WS<%NH)Vv8~6 z5XH%_yo%ELpCblJAb$Jx3`|zbRfERfM$$yG|U1ZKae)d2W6Mbc}RdJ`FN1 z^JW@>0CT4ve?4$D7f*@OD3@8H3`i_@t|-t1tVPXDx}Nq+$%n4UwT3o1G6(iNFrp+L zmP8mbcjAHbF|%;bp?Zr+zy$~dnAoBrS$hUjJZReMO;6178NU{C|Lnbc)zhv=emQ6p zO)=|tI6sX_R#+#Ko_h!2)F;ZP;SJA>+7mJx^ft!4f5i4tXr%--L>8#b5(!$CF@J zneu6DM$4yqEG&$rk_-M{xAj*5K6?V@Vp&jfYM|wHBBEU!N^*$JT zV3t#If1fyXDS5oxpHoNkIrh>!Vr)9?)j1WU0Fkeg1-`2LLGDp~S~?dhqRaB`_YqI* z)p@}!_8!Fq&*!f-5Fy4ck`msX^L&@igO1?DG;>F@iUMaYUfoABrof6r(1}?e2 zWnOGpxTAU>&Ro{ZJn^DJ?e*{IB3%qX#;8N?e|;?h*61e42*}0MNTSNO^n(Xx+^tpb zgVP)lMoWMuzKj8k%e9teV!`Fp1{+D9xfz*HX02Wt&LbGBr_E9vX;Z-ELG|bRh($lr zJ^+1Yj^>w>$VujM4Pd=#qP0jqbK;R+IuNlG>wVBx;B!lfLg>ED6#YFDH#mS~5D57+ zf6Uxz`zz$(Ip!LS0+;^UQXeQP>UY)`&XLpy7<24|9HVDK@9Xuzw~;scdc2eOYt&+h zWaWO_X0`IEchpg4ucfD!9-z9Zm2tu(TeC6S7o4i*r(z=cKKs?&T0W;xK<^y^+KwM6 zF`dMMYpoA{W9urtKVQ|M@JWFHOXVJwe?n$P*YA)thUtZDZ_YS{k|ESuxvLPG!}#X! ztP1$@`yeiQW#$gFNggA2qHaQM$G_mO0f}=4I?nfvaax3o$9vjzWaJ0c#b@iY4Tqv` zsb+8i^!4go>ccY6#N=cW=c&IiqNIKB2AcS!O)-e>0G(rQ_RS-^MPn$0HB1~nf60V! zBcBFQm>B_;q(BCBXF>g{;46JFpwFll>UZw+XvX~oL*5-r)57KbPHTfiGoQN6C=iZ8 zoh*l zXcRfkFDD}bqMuJ2VbIc5Z+$b4^eB1z;_*j5ZFI!U(}=<3o~Q}6g}`xjf6tM~K;`dz zV8i<~&IkfOIfI!_N@Ndi@de&}gEchPa|Nk}@M52Xh9qD(NdFY=F$hqToZjlKV|E_)II{z3PUX5g9wGdqd#W zQnfVY`BBA~%zeht6p6*re{xIP*gOk>BV6QK1Hn(0ni`{HPxi)>f9%uDp=}CeukR~0 zITF^ZtqoT6l<|0dd9?M-vhkV*D2X?ju z^JR}wMVU9#r1EmlJqpt=g5B>kXh!pQ#IHN%4L7gTUhQiYckk?G2b{N+;kqmsFZO&^-tKA za_@Zh_k853fB)#ekX`|TPh81Y&27|C<~=9Lq--fQ(u^B5EqsM9qHKBQ=I!41_9Ug~ ztLEI)Z>JrP=m?ihejj9+nlaYX@Blv2dq>nVN*i(v1YSnar-jv-{u~$#C~=-2Fc>`( z>UVSn-7*%SapAl1J1AfQMe{VSZrZf$25l_&EN5^?f3o+}Monbir^DpS>a}Upak1~< zP3zCJ29eoyA1Kxq8!0n{Lvp6|MDm_9i!cFkA$X}ZP_Nl_q129&kkppi22N>P%8U*A z-1;5;HNi7l!g$DiJ(@UY<)b7Vi>t?IACjm&8d;C3d>_>R`m5C3&J_?dcL>Q+tiv?F zY+u&Pe?V#>(8}Loz;--jLhg@pqvm!wS81V$t-RK>kuaLWWYzm1z`MWFXA*6`uX#>~ zL_9p^=2lSh(7&_bd25LqFuf_*ra`b$zXND-W|SHq^)L9^r%+Fml;d)3b03q@ykFB{e zYxb;ka%Ezh%^66IJrZB_VRs7@Zca%wdKIHhi7nqV_=puHPUr)3n%%2lXXyB> zf1buF-+eEQ8G*}OH!)RrZO(f16R#+Nt64xM*8s5y7<@fVA=;HuDOEK5g4_o{)~W>Z zX$rejlLPxd+BYL{*FW=VY`%>j^YL;G@NINl z3*7}W==H9F~6+mZ`rbJLGqaLG-e^Q}bjv3uL^DbFMwp$}%Yt}w7pEhD?sg(gi zm(0&GdetiC`!I)Hw)H#Wy?m{fe5p`oxIh%<_u05CiDnQaS5lmBs$dmKQ_TRy&6zoV z2@YjLIRn7o#ve$1OzLLyccz=Z>M22S&mW-)#e-7nO zb8d$yS0dU!haN5&$rIEZET}y&}El=ZUik6n@ z=fruH88ylP?N_d~_CKlx>wQLHYUU)wx8U6J1ml?lUd*R$AUyp$DlFTkkVbK(=hLn) ztS5@6Y1mhc!Br;f+Y+pkc^c>2f1wJv)@?>Bc;tQ~ae(@F^pVN6*2v)7`ye9*VXgNe zk$6tYf^nm4m-&HnB=>>%@JImF(;ic^s%wp|`&*vIUnH5wm>(NvgxWhekU%Qx1mng- z%+qtzcQQQ|fgkC)I>9pp#GbWQ_%QElqKFlA!e0N6Vy%KV^})rxt^O|nd$KlP5{I~`8z@-8C{uQBR<-1 zdVRKx1!(jAQh`&y^VVl5b%-v!dd*Hb29b2njj62DPmaN&oVgq|1v--D_mSk^GQSPa z_>j=b-#G!5az$18e)c@|e^Nsoj|ZWJLeKXRknij=mY)wiL(L6h`b^Zd@!hFa=$5>I-ceKAjamK<*r)5Lo&XjfAtN#OX@c!AIh5g z3R;kN?aQpcj2kt_s5ahmk1k*anSq)Y98npm$IC!b0Kq);wtP zBXN~`bQO8YNY=cndhh#Zbok6T?2K>YO!g@FX4hPP1^qQ~{MTA7w0C_im}zFB{nt?wWF*IV0S_^-2PkTO^7czw(8OCFgio(}-L z)*-4G_w-9}L0ze__MLNb_ktz0B>-r`UR1 z>za)2$+|T|bDtT5oV9~&_O%%k;XB!lNj?;F&6;uD-qd`p-B0{EU&kvu!IS8n-lzUj z%9%(qy};1W);E=+v^u59r6`#$wcnQ820v4JhXkcieeH2y+!G^1LWPu$S3mxxPYP@; zbYSgk1v^qEe`W8m{P7Og$y)fw?~JW4YIFOW4#}0gD{wFv#q)he?j_MpIJekOxz^|< z8xdt*tfyS-QCX3eD)ZppyK3PbF3(&Y<-A8)b_)&_6^^mv_0|OF%N>F}#7W69EaI$m zS`hGbT^nqz)KqyA3r}xL^d<@GwzSKll(kVU%kvUbf6ZNGsU<_}eIVMqkIkZvvootC zu*dg&n)pS=E!o4ARox{ zRwORi0)+GOY3jhT9$jy8q1d4D?La2rQ}?ZS5Sh>YCS* zOCe`!7s!!MS||$yxb{u;I}jbObu%l1t&L%q+GWEWn3NhTD?& ze>MsJkkTO}FR6@J9Tvsok@Y1c&t@zT(ba&bc8DA{rlIJSn z=|h=9o-B1Qz?-?E_{!#t-3q(tew{nyf4MxCjM>2ie7au_jUTy6#gxe~A~$ z(+K?xz*95$01{{1h5bm6=B!Du5arW08N$?j)`pXwV??qNDXX)xZ<=Ei1}VO*r%8gj zOj5!~%ML0l8@Bt)49T7hfh+5FO`C#b^i;|j?BMaK-vr>=*IZ`+(!|WIsu;0=*Y7AY zeP%zf6_fPZT8z_lCJ!KPa;@a@e|>C_Z%^Cl>l`CplRd7Vt8S3p?FqrNj?Dcu3|?7z zvI2RF64&Zz9dh=%tx%Pj5m*7GlMX3Q$B#H3xdA1Mrf7XdPh5DsJ zQdcQ=o?G_Pgh5>JI)aDqBBk5y+vH=0s?gdy=+E(XuyANb`*}WTB zDJq$ofmlR$7S>tp_DCg#RGEewFVH=c*s-Y#>foR#@taVkz=3&(vD{VU;rw;^Gn6|{miFHIHt9(8<@~s zogeBA`%Rr~65X16j7B=o+*L}h*SyU}w@~y=HEYG#9V3R%pKzVle;8J0bNVTwSFlp2 z5g#T%RGvn~ib6m6J5nr(N@m%jjLy9?i8b~bO#5Tbm;>zF8EQAB#&gD%H((^R_w}YE zM`H7gd32B7P2gW1e=MKI9&J6kEN^vkIYw5opSH@^Xdxm+b-(S znr~OfpLk1v>33HXA!~kh<7-X(^jrYlaXmwfdb?+#_+s8y+(SXE_FLJ~6@DHL6u|42ClV<@GcV z6Siv!KyKcR*Gr9ZzA4t>Gm&wd9@kbbf9JHTYG3a{0l-Bu2HfQ(Sksc}NbR!wI?esO z--f2BH{GF?e?_YEcXsj7p4+JbL_W>u*)z|ydr{ovfdx1>$6>jbi8W@yK! z*R@vroq|g{alflJ&giixDM781wTsUp9Iy9z?5go{bsi)8Qm0Wq4X0iH4pLjFlKLGZ z-WieEMZDX(^{v4`>eTPJ8B~wu@5r=eZIUmoIyL8pe{h!tS5L!X46U0I5tQ`N`TGJT zxkuGPNR#H%WH>TPpz{AqrwJXugtBtStB6FrQoqBtl;JLkxTOlMmZ;>+vmmFqWhKoH zK6GaNsYX=OoR*#Y4>M0`B%Se`)7+!XtvP)rDLwr0`AwCWb{}>pfsbB328q~4KTWkv zYfI&LfA9>oqVCydWKpZ>D#;lDt~U!G#F5k8W8|QEzhU-WvJzmQ5ldwRgXGGS_k7x^f4_5{1qRP2b5pv2@T(vBv}*!LDha#y zbx(bu=C1p!?rQFuk88Bl*fSzS!d=L@am>DG*d4Mb<6`?jy=LrbmtpU^U2s_7nX-F# zUFHM_Yjuuom;ot4+mLkWOjSM zf1SICS-z=823?1|>yIIXQSSpV{pFh~`CGC^%~=G+DLsl!0s^mAltk*iX02b`W6gNg zFPPViq39_k`%?Sh&~WRP=$Qi&bIPd4kf8dB)lubo+j`bwojz-gamSpg$qzK1&3=Ok zi$z@fKpn#9zLvi;x>BDh!AUliwiH|Wf08pIfvYL)qDP~%oii9&`9w_PfwBm>L)6u^ zFC(Ul+PBW!Xh*r^T|XGjuk=q3)SKGc*6KJ3OGcPR4vzNAF#6 zg4y@Yb#$l@duNT!!EAVBbRS`;*zLXMh6F-!P)c^m%iPz9sKA(V3~t9hjV$6%#)t=C zZAnk!P`InosD5YGqrGv_4Q`(^1_6>`1+2t0>z%kle><4gjW80*2W%Kp|u09H{Ik86W_~JMu?SPZW|N>dDm~M zNHTtKY{TN}8K76`leHl~OV8-o)zPQts;8AZIA<*$FC0;8aA*USXu9K|$TQ0$Onz6w zkWbTPG%<4r1G4eT2VM`;f6k}zF)}-LxO^;Xjv0Mca}6MWo89uOW6MXrsK{^-FuybCO4j@fACS9t!_;KaCKNU z1Kh0ctkOuop#8JUf12`1)2LAe=pCH83Bo6d8>SyE{%FU z)bD^2fZDa>HD}i9#9-VVnK4*$HG2kXJTqo@POv~3om6k|Skev|?RF(LYu1wvto^1W zSNd5e47%7tKJCNm%zc1rwezPeiaTs{JxwE!u1Nu%MBSA4&*0`xRKF@37e@ci{%Ncf z?-X=0-}D1Hf1mY@CrYqyzoR<0zZ{ChEpu(Bj*ClTN=~Ksw`9G?K<@kGoAUGo?P{$R zU+(FJs^6etbMK%O>{?&!w0G`I{SMCvq&y`b%D3#06XRhsL7j3e&$RvVSmQd%ov0XZ z&FGhQAF!Y~YsXZGr)Di@Nh zYe6ws{Ct{@vb}dyBtCi#psbmF^|WL3|H-c)_|(1I&x3oI`ML9end?&zYLA4wX25ts z-I@}8N)nR=@}nh7-X*8CX$`9*%#!t4r_XRCPUwWpW~tTOE))#u|7dkSVYSFHC@nG? zu3`y0e{1e*{bja9+?+fK#e(@ea*D~-a$bAjsIR=m` zS%=xfTD;ZQ2FXGSU7DQatr)I;2Wq_ecP{7y0oNR(o++z8FTn%w)*3Tu1jxTWv63okGQy?m~ zcTyv5D#fog=ce8`E9Qqscak#HAkzmd2$ z>jor|VJVM=gu7b^@LwcHVZU%(--KxM%Z;jnLfja`mnn=hiBDRV5Q&J)f0=s+!`WI< zYGe4I6=@{7)G5SiH0MJ^KFW%NzV6Gc})^N zOFwO%U7K+)fKksd!7b4df3w#>FKs8XzQS_X@i4SMCSYz!agLCTZs&0~l1wN|_xv5f z&cZAh14UK&QxeF*DK*kEC|z?`En>H2-RdBt?y&HqL!x>*e`gTZ^qaBpo!MPahM z^DMx+tLw@!c6?co=7wXss-sBu=8+-c2luX8-I^8Sdfk}UnOP;lf9+U)@Q{csgbhoA zg|%=FLvp|Rrd0xathq-wS&XWD^t4kjAW!{{L#&WWuiLH=tnURy4}919J|LCihAF}K zUJ(p*FyOsa3pXS}La9fwU8w)8-w~Qj?4+k1x9rnJBD(+Ociala!K$urfVT6SN^fV( z!5F8c?*&OP0n&OOf0n8kQ%Z1^6=u%w2>4d!o5T(H$bE3?lw4WGQEdRLo9C2+y!H$r zI-Jy+^`)0W-*W=%d*2IK>-NgNuqfb>3Ry~mQX9+Ii>6n=;G zRFRS)dAM!!X{Qi=X=N4#B8-UDyaa+##??N!Lt3abs^1aSe?|Jy5*JWu^7~!kd#{c& z(%J<#_)Evo{GC(l=i1l0bV2syS8$UgU$mMWnj$?G-LsUu<@?CAWprg!_#j>>?P9+x zYkt-HJOyGaQ~c6G1`BtO8T3T?`nR$7gl>0A%rua=#6fLF%_V zI{vvj6hf42SX^=qR0qoq)vTw%a$VZeO{O#{SBC^iM?Fm?r~c$A5&3!Ko6;>;pL!N7 zI_rFz#B)VtU}vP43mg861Q0Txb^>MP*H%jUOs`F8fBEpN>uK{S>B@DRbpT55<36w2 zqxaK%xz-^l8zjhb25jYuWFfyE7kbW3yq6NGr!k(+^jPlbn)kGx;N^4^%5#diRVJ=} z2aNct2%ugcVjC6bBf-mAoXjMfs{CA?RZYyEZ;DvTL9Mx=f;tN^psWt{bI)y??A|<$ z2sXFMf17z4+Hq$MQq zf8;pSm(wHiwO93xrwPC1jUfeRP(N*hB`AHZ0}|UZCHIk**YM_K}G0XIu=2vYbR|J`&{%rC}c&CWc?Vsknbu7rq{jg7Ur` zqn~+N-qQHE_HqW4!JeLkHlDgU6^ z9uc-E*P8c%jj(3$nl*kdy`xts2K!tc2u&gEdKw>t^O_PSWM+nJ4?b-_?Esd_HPF9) zEfz7&^uW*3cNPK_G0T(1`}h<>MH>YnyR_fXj^Vy6%|{|1T=$$#-fBGaeN-LFfAiP6 zO#@kzv;MGLGSfvHDD6vq01j)H)bGd$Sf7&2HyMGJaI?}cVWExoJNdL-=~zn+*sHQb z1RP#RMoJ#A9;mf z7|vrp?UKmIZ@NIjq_;Z=z^AIXf5sQ5emmnXT1WAW@-zzW15MZ5^kO`VgVpbVQ57T0 zV5}1f&UKTDRo#%kg9EjA4PS~_v}*|~dP@mrx@OsIxes=1(dqv@_T|$SGlmcBB4J+o?a8)GUUyHM z6yfHqVYM{0tM_rT8PX-e0InV)C4JKlioS6~J(qG|JK*{WAeS%dsp4p^RgwS8ymkf)icR<9M+)0m z`~fPgx#^EC7@QK7f6Iw;c#8Xf8-ro9PyOdWe_c1zQy1J@;d^OHJ)P1DAo-wZs#(tf z#y~m0zFe>Md_d{sy3N;nsY=_I22tH#W=JG+@_iPV(_*AFMj$wI?@#2OMorE8TNjLcpIwbw>jP*L+@LkL9U>~xbb>pN>~!>c3VkK7$B?L!%lBa? z?!BS{c0!6ZH{>Q*P*ZY=`{!M9@VBcb|Mi3^Q7TwZ(;!OIla#>LW&{u@T17~Y0qpEA zr$m`!oxdY{T6KqJy??wLJ@ZuPnl&lL95*TZ{GCIDHh1qOX_Zm;r(&Kjzay^vrNH?ys4@4%vAdE?zxqh0S*@^j))DxvH zTa1CiLCqQ1RLSN8eK3fnYKQ2WA7{7-9vA%Yfu!BjpTu=n`=?H@$bTTeW1` zGO7#H^2sh)BDagIM9*Nsqq*nr=m4IUw>Yq#Xg#-G>OD^h7k#hFI+$@LY+774HP}L) z(@FLvqaN}o!ha5>uSbR@Ya-2Hx+g;h2`rvwqj^Wo z4V~(eHquMSY%#zb^O%m_Z-CjT*mI1;Vp^Rqizc<2V}Ep;%^W529V|roeHLdvvwc7g zPhL~~4wNxU7nH+D`+AywLiVj)#*sW2p%bOMxvRcpF_^z zM5@se=!{|^A9+w!=lQjTP>wHSo^O2{Y6d`}T5GlBbEZA2Rn6Ub%rP93)`?=Oje-Yc zd+Mu^Pk%#0o(M0Y*6wswR$GR7$iXmaZFS_k0?~ z*Eb*|SqZX{cE#YqF3{FJ?8B=|o z`z?EJF%N`W(=%c?yuprY2G=oaol=5*H1kZ_gn#)&r4N+0>)}#gfq?=FQ@=C#7mm!9 z3q2`Zs&yk_;MR^OLF-hOH_1o;w|G;vw03-*ZO($ap`P^t)lxeiqlMsPN(Ah(BPKYm zNN{4^C9xlC);9tt-Vrj^`|#?sGo2FC=d|PwA(0iybz|Unr4x%>JJs5~B+7I1`!HSh zynoT(Qmd$~@_n!rwuITx)t`gl>~@x}8WKQ<`W>~G$x|ZrGvUrCjpWW&I+kDI=|(T+ zG3NE7xtmDD_Y>nxLdE9$Fh{S%A28!xG&yEe%cRf5(varKZ%U-}vDWR4bv}LcxBiW5 z>K)zYWhL@#v&r|2Q)pvtkLGE_oPqYF=6|M=G`k6*E4cKk%+(oP1bW>N`(9bMi><~{ z&AAP1M6cTie^pxE7)R9Dq#pg?7--%5QM;U)oEAsopHG9QKwn$yhOtdEx0bl*@@&su zC?kN1#A$@OHCe;lw%l*Ct2VP0AO;UeyP6veMq`);jm)QY)uQiABJhOI@mJ*sWX$XO3Q`aBEjHD757y_XYDR*tdMZFO>wzu=L;o={|zeL&J3))0(d zGDCT5iXNYt5qSI9d!ndVsUzH4tAmMSYRw0h{bg5;h;vpPC`K2ZOzpp`^XaqAh~E26 z2LdAf5)_Fd&Us33(;?HTH)VN$xqs(iw%a0p3xamNrslm2)!d`D8zz~W!J(U6X64`L z#1SRd7?j9(kWw;qeCi#vwpV(3)DaSwJU<#$KC;H7Cnh%@ynHfR^`ml?6eopsN z;>F%4Tw3Bs2jNt*HIF^52r1Xik35fDH$8*2POlXm=;zEG3J`NXN{?!;tbaXieQkBv z@Ygj1E8YDUWO&@pd9o%fGF*w6^~Azg<(ZPfY*luZpfcXp`aXO^C#z2I@V};vwvq@g z-{$@irK<_slMXM+&y)mm8LMW_=k?Dk*c_ z9;?u4KW+VzYg5ZKDoyKs9)B3l5{)W@pmj&>UO_$`RO)P#yq{T7rN+k`>ilTMh}S)L zFMWh9rDhG@rA2#7q`~rQg9~)MCVZDqR2r6_`4;-A-x)~e-c`8vl0zQ`1RZ@wSFrCi zOO-KDEg4fKksho2M;jgaiu^tjy9z+-ePEBX=dfTnx{J(2!frCj^M5qr&7&{#cMub_ z7W2>GI5h@?q*{QKP|TTgMPQ8KEO!WP&`4&Gl26+^7RTk7yJ~iVGaj#9HooZ8qp%TE z#*tiqFBQV|rqB%8?dgRq=C&mkX9A^zCC;a*O-e+EwwstDdyKxmY4c5sek_T8o)$$z zJp&bqSLREmRm3cO@^hlzvwZ3qFOh+$2|L#pbg4u zJT@;&D76?1QbB7zZTC@+l;{=KI^>X8O#51e59nlS@&kS}Yb!v)#?h)7Xhbhyl@iuL zM!zOaNi}1vF>2Ioo|a4^FDVfNP38)QvZ}w-eEOGU-!aDZ!hcroF&H{BW`_h2u(WRH zA!!>HSWFwHdLNe@U#8BSc=M!lYplVjr|OE)kN&GvMUENFeYJZ(Frqq3?mpWJRhA&wj`@`*A=TuAz%Ah502>skU zxN`ZE@+Gv1e=p*k5p^-;}SJF(FQAd8+C_*Hc$rm>tub`Y7kku55slySp)W{B>~6@|0Zcoy-Hu8wx|#({PYu zqkk_QGK2jlH#g`tRguxj`L0YZV;dyypVB)>kd$)P`{2968kchuPs9KkUv9oH8hqAQ zP_ZPZmuqm>3o^MkXJ86Ex%oR7+tQyiMs~OEQ?)A3Eiv1)xVTiE1#wf{v9(8qT}C># z=7v16BTNv%l8U(oDlfM@r|kPzSKjNA;(v0^F9&;kr5<%g-hFS+e1eX)x??12b05G3 zY+Ideyk|CCkNJQH=J$EoJ&Bl}2X9iJlGpy+`uj*>C$qe(6w^?3dm127nfct;Kqbva zGJ|K}H>rK_)~z7XS~E1?lyQIO;EQL3k>)dJ^h*nhmw0&1K%L+-bGtKqui}>+bALU$ zstf~?n(zD_1UDE5>uHQ~g;*&OG0VsgY_0fp>JUhRt$IVeW)}G;^|d+??Tqr9jutza zqZHQw_s=(-_0HY%P4yE8RjoJGyQ6VWnxJEFOue({jF;%ZnM6^1{SJI@*X8H~{5muC zGy@tcd8?-}qMI)ooC3{sep7DvnSaq^5yO{~^!yzL@t3D@WinTwCn?-*uEFX&rY)v+ zPW?dYUY)rSr{>&->7Czng?`S+f(Xq<-Gu6SKN-9t?D8!_GTe(2R?zm9azeocailM1O_pHuAn_ z%nt9&C%fIg<{fijG7Zg$n~=lR>Y#@38A`%HLaULIk#|lFd$1~6lZ$zG_GLcyM`vGV zOw!rm2KkTPtW#Pj80e0+#ZC>|dcUdDdn7l*tmW4;(HSHFg{j}Di8*5qvsQLjpAx=| za{XHCb4QGjyBD59PAkWp_kTGfb2FMDl#De7(&D&Mhg^b#{X3(TX=X)KGb!OK-HV4E zh_}w^GWY>A-?-d1_Ik~FxgD=HW2y@haLL1XQ@j;`EwygSSYDru$1kjS5TbnA0*je* z8~ZR>gY;yR?8?<~62xTccOVlQ(Z0w#DB-R#k}u7zwII*n@a7nYB!4}ls4z2=!e8OB`^@ZcK{Td zT}87r=!pCs?H9K68-KAD$rR^Wi$(K+YHpnL&e$v{7j>V`F|fMny)Rr0=M zMc3o5*VI{A0yoz{hW(lT>4LF9jY-XVWvyqFU{UIe-7&|YIcUAJV$kZnv+m$kxqH86 z@|Vqt%UsT)Z8}Qin%lN8V)JWna&1}jy|Be7k$jrc`?R7(O@AH7d><_|JLjqo$pf~t zeutH&U2{s*aVGwH*+sJYmf7**BocFx7Sh?be&@gEgyBv6H9% zz}Avc>V>P>Y_m!t)#vup7L3*T6^>D%TsFl5_393+H2_Y3Wz1VARrgOm4GsF5Xzqm( z@XRbWm^UJ%)PFm;g|p-DYtah68SEGRKG^H|KJdk@{Y8)8nIT+|23_g#FD_utS^dt% zKIwd%n3P|XF>BqHB~W2?jNN? zozqq8Gfjwc3`;Q)9V^@N$}Aj-3jeyDS5~J=mi(Rbu78A~BrvpCBvYa=wdZ#KXr7TX zxXTCRio&>oAk;VIIdgzsH3RkI*|S@0(w&tk>y;nDpUI~|uPmj>-96m7x&c>7bUQnr zCbQaK`=KvSS`I6AOWj`cX}Zv+cPN4{hMxOvaA#zeXQi#@WYr+ivLSaOa=Ihy7Z?Fg z>71H1EPq{Bm8t92k*rRZk`$eRO2d-iC(qrBui%xQp1!P-*!i{5|14RRsdieSPwsLi1J`H8?EL)J%6GdGd{A zhkvY6B1fX>gs&0DrcQ*}1{|z6l}1oG)eYN`89tnNC(dC6wF&hCZu z^j1MG(e;{}@XD6l8SA3DBI5_^a@^i&39Vp$S0d+EWsgdpYX%6XAc<3=V^CsOR*igI zbvXw6XVzn^qmRv%dUVw>H6!)nb+DLumw#-6DCr?{Xx#!T6C`krhqxmiQ17*u`AyW7lz{B{C0f-9jpT*&)hyw~P(0CvZleEPmscoqs5t zsCcWs>B%>2Jqk)7CX-_XTQgs>;@Sg0t1*`{xs1Q97dJRjZo0JGbQZ~{$-KXFkMifb zGsAj`uBX4fB3#q}E`De5`gXO70%d!&ZnF)S^_rM064>7!!|KaBOaE{By7Z3TmNxua zvjzzhiA~98Sa2zURmvSQx^yuibAJq8`ScEXnu2NhJEOf>VooVbbqaOMu*l^KO8ZOG z0zj1Z*O3iop>_xgeF&8t<5w(py(tM|>Xv-oSwkppdh6~7+w&TvEcG;|Ef7;mG+0Zl zhlKR|o>fcRU)4Ezfq}c z?zhjbV_fco&jmi3yBDV))PG#P4_kRo+~5Y*a!;FYNScp$Ll}2v74QZ&vFDv74~iBi zwX&+rGc(efc_ZA-y(5J?X9Qzgv@K7sZIiK?GinG@A~cu#U^u85@7p1P9d(Ckacu^PV$_(y>DM><&VP7H+eIn|J6^8a zVEpJ^wGX#C-v<}Sn$eXF+aI?&XFclYa;+g@#PMs)pI7Z=9HVkW!2M=SZV_PMFIhr67iV6nXvt_H*$=d zwyhd8?Cozma+r@xlkadfb9x`R3#IPrb{_thCaf_xlFyk~T|GQC?WuJmd0u%lk-Pw$ z@^?nxq`H501r$<|H3oy%kygzvRD?P<$B1YqgULQxy(SmcK7VqTd4l1N1!QW6?4wa+ z-ls#-JU=jQeyMiVKC&WNJEp!LYeVToJ?7qu;%f~?YoN^7=u0F}lItcW)r_IkHU7jp zS-WmiRv~A=Gf4!INFKL3$H=GcX*uol4p0p(2eEUS!`^S(!r(0cDb&(cZhQzu5OM(d`cipM?HrH+4O9<+ zGN*)JpMD8mRLvz*Cjw2NeXOS`5$NuT8ZL?;Q*&RR;(Qq&-A|QMeQ%$G#(zKe8;R6R%~~IuwYAF$4V1N3$`|gp z-aBADjfB}R6_J@4+As0*%tY>^&Na^|3dzSj)z=2+yQ$-dH$CKDWT#4UXIAA-JXFA5 zuUa<}9LDucWw}Jq`*+lKWUl(SKOT(ooExJr@riH*=rZeT11_R!Da|JquMVt#NBvLY zYJb$|>8zM*eIG0obrvMY9%p*u3S0zHN{@n0-ahY^*i~7nerSX%aaQYwVEUEz!7=W# zGrycZAfQ6^w83_paj^sQi>s-|u$7&yluWO#6okTuVage>mBHrfX;3X)`N%)M9q9w= zhxY8c56oIO#iaQ=+e`6FO7s=Z_~?N?Yk$ic+(D**J*l1sp|Yfhd{7fgLvxG{6zL%! zqoZx_L{0m^4fAQIkX@d7$W~GB8iR#ar9w;ISJo!6t<_xDJ$HOY-YU#iCOYqYNPVlN$uY7?X$^{!Jh!yplkVx^@R{(0E#r7N{hM%#)QyI;A^bF|htjjrXqQt3P&VL*J;EbHA zz4=msWa~U|nAEH_yaF6d$@aL?ml@j)U098QW{~Ge$)e3rjuGoz)2?!3;ms=@LV^Oj z_UOsW!rfOhP#g@hoRagtCOYGML4{@1;~eb98M`GxHj!)a8dg%i5BeY7g==n5gOb%P zkzH;H-v7+Y3@iiOL_Tf*(to2Dh)S?Ce+S9jo*4lVAys9$26_s1CK9?AwPUW%^qCko zHESK~0QXYjI?F7NS|$jhJi)HNX0p*|LWi5uVk8(@a=#%4>h646VIdbTYfw28iqHH$ zAF!jmOJwxKUGjY}nC$6Ms=0XU7hUUyY(qowlssKbWxGHMOOo~&NPqK0DxG4Ts+aS3 zK#ViCe$HytlFQ(nHz~s0A%H8d%o&|}p4^f%Zb(#U)!ekPZY~gBt1X{jPVYig()BcD zCykjq)t}Cp@jR80@B;H`dXT5bZ;YLts{D1t&!&Eic&BA(-U9xJu|qcR0V&x zW=(P>@0a>C^~SkJMSl%D&xDQt3AUZT!z4~0U7r|um;64=Ztd6VX&^0YR-$RP@ufq@ zxr6s+B$$L(o!=DE9;U{e0ov}&qn|s(K=MUna-Jgf8D%5UJh9(&(UCaMHfpU#!l>`mHm}EgGzm`o`VzfPKlr?8iqzzn zAncx5gbOhbtVOJjvj`_tGq`T&7q9xlkAYe$pEj6QYu)S|puO4$*Ii$pXWgeH?0`C_ zih$Wjr9>K5a{G5?WW}`;p{oYMH|HiVlL)-) zj(0yJ=+}MtM!7oNg{}j$5vOJh1qR}MTs1efq_>Pp(biw0E4sMBZRDFG{d%Qs32Dd= ze%B0OBdm8xI2awty10#6H0794@|`;ob%wg79K-ZZ7JmvXC48{D0ZG(6iHE$wPYf*FG$_asOeaDckuIf@YQ^IQ}MF&j4l+y=O=gX z=YmSkH9(TPoVj;U>@aw0Zc?t$QYqQ=n#lJ-5XI=qF&AK5&RV-3Yg%Iv&+Ej^Wmgm}V2Bp<`L1uUT+#rSSKHo#KB;O#qXwa{;o-pPd ziKn=9($W8|-c-6Ag=0$Yw>7=CYcv|~wH7*78M|AH8@IjRn251V9*5Pa8eRvkv(>_i4*Y+Y1jMp0|A3p+81`1>oyuN)b7JOWxJf zR3x@njmrVrF;Bg|ieL-*wB3!7r{u!Qnb`en^kOV82OTD!`nrEekZzTQLNdSA4*$1v zBcb3b!bIXUmiIvdTU&dS1Orgj5SlW+r+>;k3`sM(lH4CiHfz?bb@UJ|d0&;e^ECZ( zs=l6NLnaqzfdp8pqV7Y2tvS9niTr<^dJ=bL-C2TIys2VwA(0p=WE{y1JsB20$-r%_ zwK@;A?S;)VMr^yXB5&VKWFdAu$pcz9^c#s1%QNQ&+O(9XXN>4hRpXK9oL;r^Lx1wR z?)j!q)t^-(V9fS}TC3HOos<743ABksLP`|UR1S`5uz#&0>mOCCZ!`iF!(G_$%YX-A2y(?E|BoSKkQSe)#&vXS6d#aj9Xz9@iG4CJY zHw2_LH>rZXvhtp$__Ok-Lqf~OO*F5MsnJyq%d$;gAL!v!W>QQW&896m( zdM;P)10IXw`vAXJ#7s|Imm|!5SMCFba{9E!h&cBhd=4Cb z+KIX_J*pl9GLR8l837U_`YyTj2&oK|F{;-p=Sre%sk~5?v8%#ne3q0^I^@zw`kFwm)Y;ZNixE)z zT8ZgxOUr>ohv{4cbVhUP9SQN~-5;!m5+=E?MI5r`ZuFmk^~m$14lViYj5)Q5%zZ!^ zh~n2;^H;Ka?|Y=pFjMCk#qDXONj7r9N{287RTkt~K!m7NB7c8J_$xhRX6oxmEk-gB zN%b_5`i@}emG<5$r#HCyB=YmiDGt_jF@I-=RVodu&8uuht|-epBaO@kb^L{7erw9c zN6+68dJ?3qxsmK?5#N!i%9-RC)%BHuG6PttLN^VGUW~a9#Jmyh)bB`=V&Y2)j^4Zh zwVzW;&^wUI83h4(Naza|{IRhEG zvM?Km%bYbf67aKp8q)c~7Jt3($DkF=vwhNGg+WJfplmm- zTN2&Ra_OqBK{>guppC+_~c~U$oFB@G+Rv3)4s< z;GEva{c`5oLcyw@JQ$uPN13tC`-R^neKU}8vrhZqGP$bO=k1G9r>)G%QhHfC5zF_7 zhZn=+K)nNOrQ#n`4;Xb7e(f420t=FGKRelwTT&Z-}P8Zor40 z_Zr96tflxNK~iE3(#K%IK3!WmMsZTF^<#9z>{+iuTrJt4tn0>j0BkRX-DeBFbfzm! zJ_7Yp0yS$^^qlwUAhJF)9>QJdt{&(L#1%3Y;D6`e$^C51iEt|CCTEkZXlz?8l~V6K zaLLW76E$Fk>)dJ$-r^)*W}rH%usCKg0u{M;G?Q?d)bF@6+Y5alMLP>+AWUz+6>|m2 zCK8+PGth}uU5L<6eO4i&NCZ{WbH#u}k){sOLUT@it+m*=o@))}r=DnePC4(){2cRn zO@Emg0_S+2#Y^x;P$>D4T5QH4nHd|zGhb|%2lnYTeJ1KaGrQael9!)iO3~vE6V(5! zu6y0N<~XiAe=CN+8~yB4?JA+&Kpkg1Xm>YY%mq*qZ3~ttfuvjLx%&C#YqQmW|C^u4 zCzw^av+@ubvDS(YmQ?|~9BcLKADII~cYnrX$u{e#)KzEWodEV%`tdHBEcxY#GShsj z@3Uf-r)NiZ2EQ?PB`j5DRhP{J1xpY_D+7#sO=sc+rz@or(wjWr+<1s z=&kq31pS<~b8$j>Ld7Lzp<-E@*_79?0sC}T6=%)c2bYGkoI5O>gUeC;Qt(lXvl?qB z$wc)d+sMkVwO5S`VDCtL4R@JZjUzaU_*d_NrsxbiU2NJWwI}kB=v&qpuuyx=-*cNF znfqyr4_B-HA>ORaY4%!%KmB+}Lw`zUwN9z!xQypl5YgOoSAIYk&$&v#EEFToF+fo6 z)%bvmlgzK*qo#TzRPaS*#dAbSh}|=D_kdDW0w~`jpOu*hkpKzy9Jf2Qr^Lwkpw8gh zDIWJjEuHLvDYCBl75tji9C;0<2buRn#(i;Q2tM?^Jmdbn#;)pK`&zyJZyzNyWZ9{z*p z-BBD@Hn{bi*AsMlM)T~IcYmeNss~g;9=-dM77HoWrG^M4ve4vIFPHtN~s z3{e%dF@9y5)nTCJuS>yr0@#oih1L z4+}MK5=81Da&rv$@qbimYjlopQ1i6V)$LvExVpw0NWVN_-Zfe7Q)Vj&&QE)vG5{)# z#56%C6RUcCE%(%dw^7Nx=Z*hyLG5MSpJhr-*%$Y~EvI&67L2Cq8yc87T6+i!ZeO>7 z_sl#7Rb8Rw+9~9tIYQ4E9XIC@#z~7#=jcd@)4Ry`sE=B$DVcG1cnoN_GLYfS80p7nD7!uZ|BPyNuw{+2ru5~K69 zZimCtxkLKs_kU!n!zFC)faPsGpOhLi!@&Y6TRtCx4Go~S;D}|mT+~MlC1>J@EB9A` za)4c|@AF!~-?9e+s!Jm9gj(f)a=wA9o#}BAoQKBAHiWgZikZ6{5K(&Tt|bJt%1cv8 z!MNqzp;K}uuI4FvtSmr{4titie%YwV59AGu7#D`gnSW0cuPU7%QyN<`BPCBsD=NnI zG$|gQZ(0WTKfm?}1tjKFP#GU0do5U{07Jcp&K$L{wBUB6|Mmn@CF+`Oe1-J9mCbmo z+fZ#3#{2NJ4YnzxIL~e1M|1Ab^=MD^iP~{yELw@V3EsZ?##LU5-Tr#+u7FkjjRnxI z$C@@B5`SU7M@gkEzcy#5eSdN}m@K)I?<+!j?v}%nDBdT*=&S+jhJ!AW*_R;gzQu!Y6gAW#W+Vrai4D+7fM-a(!tT`$RsXk!-9yg{v z5ys=#mJ_aC-=^tNy3{YApRw$-4SDd4paa&J+BM&RFhI=mX(PE?$_PGzYh%V#r7x|l z+JARgh*@_J)C9;_nl@n8Io48L7z{NAcQKUY*oLq~STH8IKOr05NSAIOKT&FBD8TorKJQLO8!XPk} zPZQ-+>!F?|tC_XrMv+Lh!D}BKA@?n@MSnIcZePwSo1#!w^}r6IDs)>$8T7Qg-dpay zz!@J9L@aK*-2*VuMCenHY#rJmp#NCY-(gX%E%y+p-&(u%=ggKF6|5hN;Ng(E__>M!*eDAVsahoJ>Um(@(O%70Dpk| zaz1IQ6Y1L^dG>oK?oK(PRsuk3_Du#i<1P~K_p_7;3E!Zq=go**jtb!U6_o6@x~c~= zie+h0d5?Of=_|j)$+PC8kiTn5-pyP!Kd|wDDY`0-r@4Qnmj+-qf~xg^F8-Fb`#~M>`ON0uMg{Oj@*#ni=(pMe@b`-v>HY`~^ z(Z%CU?KOWXgbE3`e43A%8FupZgEUla+<$B@ZFyfAdveUubI7$lKp^c~Dm_CWDc?hz zG#UQVbLheOoPS_o}g8V(e%A#EP9&;+uCL}d(b0Q>PSbuwF;aH|C_Z{_h zpwsL7a2%XkH4hY|d2dHsV1H}#LT%GnU6&NdS@ zxg6^eb?JG{vVVBbie1=!+hnKm`-}?8iB!TA5hKnK6~d4UtluLXp*m_>_+rN^E#uCV zy*8YJGTCN%C}P|eX`WnJZVRcr%=I@BGtM_G&=K_>3h5{eX;Bj=W9yS=?HSF3Sl|%m zydLWDrMjipu);lVQh%3}J*sa&Ak8a~XG2QKFZZ_YlhsVxSPZh;oJ0%S0vVA$EJ2p1 zM0WKW97#2*w45@V`L!wcz4M-hN(ytDGjXx+CH_r8XbLuj(H1?3eIH@pvF^?f5^FFndUrLcOn!yuPJc|6x8pL)_;TsP0OM_Z21Q=imvF{ z17&Cla@Eszf>XUG3f#Vv)jaKrSoVGZIf7h~@44W@a#x1tzDj+KT&N6X`fn4~AKYHO zM<5!AH7zRo^(x_n05N47r5$^}cF~)9=Oa!eiCa%&X~j0ha(E*7O~w6NeSrMJh;8S4 ztor^61pWH1iGQRG1Dt?}1Qp{YZ=Nlb9@e%rxWj`&`F!%{T=T*c+%Z-=iK% z=C>z4tVmzB5zWgyy8FHpsK#KVDjM7R76>>pisLkuJgjdjmIqZ*doQ6Q4tBR0=mbK9WN96<93Pntvffm0-$s`VH{eztol}rB!_s zZ>GqV7RoOfrIwBs9?f5B-@88afVx+**VL{8tIuD0#~;tw?LgE|nGY5;1kA2E$|7`I zJJS0xNFn*Pg$Rg^*XY2=9I2lOZv(rZGahg-Rn>(p^*W>BEGW3y18*UDQGKJ@eI%0x z%6!}ls(%gUBTp2`JhR=&yX*B`B2^ye-YD4NF!S02-0VNEM1v zr*iGt%k92rjEk}f#ey6I3TswM_KmNxmnZb5_NUj8oZk9-5st`PsKI#<-OZ<|ua*cRBF^ZAIXd)1rbLZfi9#qjLzaD7 zGP^9Qt?*{~E-d!t{HDugj^=z@@4SFKPZ8_HwrdO|NtfhrzX#SmW9x6y9ea8k_MH2N zZ+}X2WWD8?wfY9>@4P9C2ySPu>D*;x!NR7Glrw(2ePEC)c%sBx-Ahzgqb{6t2b9ir zxB3Qc|5Y`RmvMR(AkpHNPpeJ&;PiM>Z*A0dJL#V0fy{4wRgz z{x_Ki`HE~qShq(94u9Qq_6kz8F6i6cY=7(XhlP$y_CN)%KAm^w*@ za(L%yLE+1+6(Iu@j{H6>BBc2=XqPEh34NDa@7L1n@GJE+2(NeI`A|DtpL6deR)2H$ zjCXD9+dENPl0vzH2TLIp9KmFz7;c(|_}(^fxx& z>NSf9OIi*GK<)=vdQwBx<{M`JBdP^H^}`x$6%v% zlyR|{GPdwj_CRhbInwjS-|5jAesB8zvtnskXB8yNQIbf^S^avtFx5Ax{%2<8XF4); z+Ov(?Vu?`EMy~Bcn-5yNvn|Z!x!$96qPp&BS-Cu~w16G;zH=hhC4c*qq>{U4o>`|L zbt0AK)3%e|(|kgKB)5E~D)>wW#jxy|MPLDU$(eYr+}<36fw;+=-YmZ$%TeQY%_7)2 z);vfdxNM`=VCvb;7yYWtL{e^-Z_HlHFUXhYdoFqT4;IYF934u8eV-GD7SpVqLPi9j zV~-w)y2we?7~qrACxVx9f=QZ zSFSb3^7#5-!IMjbL#<${HIR?|vd&=Eqk`zhCjvT_5nNYo!d7$^27DW!y zM-nk~%H&KGjDP>io5bRr?MTVuA}lLWJs>|iB`#pWnuX-eHeetbIbCLBlWebL-iRaQ zp2$%=^8{SDLQASkvH(r@@1fn4su~Lip*3<; z^=Ge%1UFi1kttfbcl}b4;4_hn1neKL%m=H& zi_&zjr+<<4Riv;iqq<8*j~4;j*6)QpbIj!T5$kM}waAlvN%aj?gcfam1(|9pcy-o) zvm~?5j`%g_9=~F-IE7;jSk%|7JrQH+OWZx%jEP-e&fSB?O`S3#s;WlR+);tze(vS- ztu#}=GJXxcBO+5@VO81DO}Kgu^wgOy`A#CWb$!;Wp_G#MQ(BA@LQ}PYSXkDa2e_9~o84x*^;e+WCsdzpcyJjr`_vuJ)eI>u$`O_6yvu{TDT+(Ja zLoA@qCQ+WYyJW9XX4}K3*~%x+Zz?p{@kBcq6_*?XVh(#E<5uzB*7zh2E}D0*5v3hS z;y*0_@|i=17T^Tr4!e&?Qm!A!Y&%@NM`^yRdq8w@?pd{ud41H=4*IZ}fdXoIf`9g8 z8(Uw-tKh!g%8X{48H}kdBRAFWISE&En``RIT5!itRV=FqO8MY1rbX^BQI+c{JC)qN z_2gjpe!%O*SIPGbPH}$i6HX}c*XuQ8HF9^kWKX*X!rFW0>(^^jiK?HrQ-#i6U)Exe z&Zv)`5%l%a?d1N;2LM&pH{B?*sDJ($<3=|LgP?l7fvbVJRT}{P)+F1+R7n?Q8$_18 z|7mj6I?(pmyD65+`m8!gbAq zZK$4n=mFSmGF)uEWQ_Z1;^e7^qRyVHQGV0MTco^uE!vvd7fPb^g!*ZR+<#Qv7o-kJ zyyScnms`?zQQPbR4q7An6p~3bk_|H9ohqXnve}lrU6v2nB5^ELb@OY>4=M{@Uot3E3Lx^CI|ZebuS6!`qmb0gvqbp1`B|F;yCTZh{n_;wHdv2VFC3ODV`=XWoo9RVT@tWDhVk5)q|(mtwp%6RiXkp!y1SUh&qNA;afflP^QIm4{y^y8Y;@ z`G72(=-MgZ;?!2DJJbFpJ(frd*cq9~T3IaONHuqM4A>+6Di#EW9JfK9?x*n^8V^e= zb5vuDFK1Q@IDh9?xUJKXxesV4{%!u!8xJW_$yDlT!c5fz`84!_w!E*kR`9Np_LgxM zHCF(cYp38F;Qse}c&d4tsqiKxo?k)L<-KPw_1$IDb27>^Y;4nUkE(IQs>;6WDYYUE#jfm z-A1*V+?Ca5M~Tm!&s}E8bIx5?$+#SAIFx2wQ@L}g&RIptjZkonj@`hewk@yb>EXAa zs@ExFpMQeI$*(Z-7>P8eg)h;St9}+lNi@R%=N7nw)IQbJ2l4qrK>Vsy?&&# zI**|usL*yl-tQkRf%~G%@zk&;x3vWJ6K%~zsw;VmsHv6p^Av>Th zzkjpZpx9h}1_MYcGnZ}1!zMe5t|KyO{vLM>?pQwU7@k#HPBGe?JD87a;&=AT*Xb4P zUb6LBa$S!{#^3BlH?+U#8;j6WjSh?bt#%~!U@$f6%MA;)uzZg@PVR56=y*AgYNHrr zYc3w(0;p)&21zY3KZn}a_}JOzA_u>g<$vx%ne#ve@=3ZP+YI%!9BV=XD4W@a1D8nV zLxx|;o@@hCpS}xP_04Us+Ke)qd6yCNaAxHgK#dD5=hN^pGE(A9ko&0hBgQwhkLzh7 zs%PF$MXw2xWZz^2ZpnpnGrTS74ce-RO$ zTjuN~+&U%p>mY#&B46V+(R9j_Ne!FF?aH-nd-b?{8cuQE=Z*;}KM_PMB&>3$0FXhQ z%J;y(C8h*hMwzUfJEUw{he?Y63ofhPLlj1iBP{?g8MBk|Rivb!cFAMpFD0Ya`j!V@ zdCzz5J|k__2ax;8L^}i&JENvP2!DuK&MG0U z=CvI=d`RyhyQEcOkB^}x2fsZOHJ!Q&(;@g~FRyX4S*iDw z7MJI|wNZ3ZU?AtgA!3y%5a4ta&)mfTTkT`jgCSm+ksp9|Iv9^^quxlO9Z8!wvbF%8 zKw-aZL+LJkSP`7t+@~`N2|#&1?R0-f|72-4_(5}|W00;3U(dvovj`jJ&UXoe_C9(| z^gD9ZJIs8C`aRrUzG7NtCwG3iOWZQ?F2@CnlNcrz1w`s;=TMr+8;dKG8p^eP@J^m{ z#uHDq6I<8AnMnq(#^C&-jF7VmGwF6F{(w%t!bKIoh8nbfYTsc2r>NCP8Wn%Cv@Kkr z#Ce~1G;4kZSs8$_nma5wT{)t+Axu#7`gGfF&1_@yUNgt9dJ6T=I%!!xa8_*;XcD#W zNCScd=iIUP6TXkxs|_}5j;L7cBl9w+NIgD8Jxznwd!oC{bI1{WSU+p_KpFVX*oZ_U z=XMXs6Qx?rsT^^ml22Ndco%>5d+---d19Q9SFHvtF6j1=Ph)8%LW~$&NUjApmPUKPx?{$o{^Nu z9SOqO&XaB2>r)xw1kw4_2A?+XOx86-Z26<3Y?GueHA%jn98uukB@n_s?~TGTL|AbD?FBcZ}2Bj4xlmhg8dz`YvkIx`yVe zCn>1-XFUy3u`x0yirSH}=wY#n^J(}p=?(H*ZuE(=%>)~f`+@4ccFb&}eARPH3(u-o zFn%zGW47U{o;lWvcv^JTMjqplkznv0Q1=|2-SWxk7X>kex^jOlfR)}87k#=oBZ+0- z$iF2v{1jf=(kEwmo~b4$$|!f3eLLWYlXG_pD7p(*-wqpg-f~W4V{0qh(4ozI$w?{l z-s=Z7i5g)&?IatXy5T3ejjLxB{T)*5`81r1_HHRf-ZRoj_#f6H=i4=^=H+{^nx{mY z;K_4qa=xiI1u1`2y~c$8%KVSrm3&m~A=jvIkn87yVZx-3_n0}aEs=4~KmK*iDzOle z`s(#HFkzWr7?!Ruz+$XxM0v2cKC^rtY9z1vJvVsRj8{RAK7q2T4a!}!F4W27+}0eu z2s7L=rizsVWl-nbH4sF}zPawB*k691k=D$bf^uU*s&#*7qS5XBb=R8q)V7Z>8N5)jn`=(k6rxi7pArE9az>Q+0Y z#opViWR&Yn{55rQhhz55y<|;)=Xwdrj@nzDjTgUnPc*|t`K2)!;@xjrGS%yW#mSRakPQJg zzo{@|S9ZKeFmzq{3kd(+=K`6oD{(cKYES;DUZa0lc0P+{_y_#Xg{*kXvmU`x{lt6^ zX_b3=gBSn$)pK;?zoo{2HoiixEJQuBob^k$A@`K~+lEnd(q`e9%*#k-6GjB$i10Og7v|UvFI^jAB7Y0S^wkjp~5~2d`6q0&rWDNW)*)6f@N_lSmfu5;W8|+pfM9!Ff0pmN`+8v zs?Mxo0ou!_iRB%&ziA`4TOQ=FXcJ$KWpI;n4CL`sFIpR%{EAbs$cfbLgK!j$_VOTE zNM9DOfQ8>%D~ko6s?#$Hch+Ub*L09)I7BzJX;l;8me;s=WOpCNksri2l zvtukZp`99osdW`R{IG!TpWb3N7qv_hoSH`kJ6 z%}xMwcf#t~M!l&XYaH!I&v=%z&U%0Ep^;elDi%5=6%A*hvQsMY!-9>F-{*Cy7n);W z8(r&;A=)hU(O(X!E&T&+NHCPQ!9ua1P&&gRD3mjihW@)wT5Wcc;&IZl;IbByd00M; zsJ%s*`1;ypA~X9UQ%)(RaQG~e1>2cVn~D9!tw5WTThnbW*Tej!vIu*BQ%ZlHi8Kcn zpsG>qT%nyC*L$yC6RSy$Pi=6^%MW3pL|FVR7WDRBjqXfm#fY^5>#sbMyU!>roa0My=f6|?iD<0VHJi+52O()O29(dqjGvIvKXaw$09HD2!C`~toxiHt6I&y zBdyohhn3}?mCOc`sq#X_jU9iMS5{bKkpNnAUJrf$$~%uXkG;P({&F#a} zpehT8qRlcbg)(4~gX^{6Dn%%(eyOA$3PoC=_KNK#_p_sX=N^BOP3?d6Be0BqS?|F` zNR>qSN$mEj6Ul;**f$9!BeIs9HXo`M4GW}q?jbnR&{Em!6Kbz4Bj~=T*U565Dr+?v z8|8LuKM)DPpRPITEs||DqHr(|?EmPsbifPjv@BpxNReqFa-I8uj2=FEw_(VgLM=!Y zH_CSb+W2~G`AgxEP!4~pZ?HvI`Uf|g3lA#WERg2qSMi+$QOft{JB6 zRsh(hML4|BsGbId-s?vd8#`P+ZF^sZ*77t8Yk8KaTETg#Gx&d|5^rL%oTcvKx$|L{ z;C~RGEi}*X!qb0>MV~~q^P-y zMu1XruaY+eQAU4$2qxgG9>F zgFMZTt?VVs2jyiJA?HFrvmB}s*LixQHv1|yxk(`#cpOrqf-=DW-^mEA zKs`O;J)U+K_PH{CfRQrp64~ZOb?ZtCgmcD`u(p3FY-SrdtE`;PJD63yul<@6FYsUM zN6CoSRJo}E7eFwnJwzRAnq+M`?pG=QPj_B)d#WHH5*#(-g@JEK@ilHh4p%WKya%H; z&mV|A;u*Ea^F=Ml{Bnw@sm546cv46&o&;o|`Zl+kiGu)@d0K5S>%76IxFx@vGF{OreH=R zD1R!-nO_c|F%>cfyHX+c{65>aqJq^ovLa@ETGak5R*d(^8Knn#-*&X-90O{m0{?&Y z9!0h>X3~Q3mUoO%B=XAp9K6DCN%Lt=xt?$6{mPJM8?orTpWb)u_G05n@WA2s33%{_ zy9bIYDq>kZ031mSIy^nFa3T}#C#=*xzXAj}a(BLmUUMOpyvI44xlrCCz-5k`81b{u zQ`G{L+o&E~Vm0jv36v=2lWp+YGQxkv)u8l{Yx}|xXwTt7U?}~>k#R-GtKCKI#0TFh z`ZglOi6rwh3BrtDvk+^kwJ-qAN`>Wnz&G=b;T=>t>pTS;fvoALVKY73f=5%xIPpgz z=Zx<>Xm3hVR@N5Yt9?X!+B1fA)kLn>ASQ8 z^?(+8t`fm2VS>76xn*$z+G38p^809%=yW8fQ5!saEq=|dso$ecm(p};kx~2bd+_@+ z?&6D5XRY0Z&g$1!?un!_;SX{ih&UsxRNtN}Jl~lXoVyS2u_+b{Ysk+jFp%r?dEKZ; z)_XWRpmu2)K$x6~KIpx8ZQ_6GcPzQ`tHyX{WguVhO-J+IyYh-ak@r*h3joFJ^}3R6?f1w?CxQrp1Clv+WvRZa*f-O|$0ieB zUmJEm8DiQfMv^(b2TgxW(WiWx5N*b49@~Yboju^kXO&>E9>IvjV6c!O&wUhVJnIL8 z?r4&C=V5_&tlx7`a?AMJ<5>6sxx*4{qrF^DBinG#h_lqLshHms_$(`U;b!sGGl$Ib z>^$HDo*a-X`*!kBaz9Ye_EB6B*pLz0$gd#Yd&@knI;PIlJWqf5@sbkNH(8`;d-=|L3CkP7y?!YNB^5(m%y320uafnqBan*`A3Be)M0xkG& zwIflLddMT>(-axaC=L?xC^?dC2LH46ouT-96{B}xpCNzAa@=6hpNWVP&3ty=nPo%) zt8cQ-$pgb`fSoVaEQO`KJBiHY3?Wo`RE@WR!%>tV z$9hGRNFRR|Aj+aI|G>2sE2f_&5810;an`TiT}YiDy&qs@W=*u|2?DPQY|R5@%s%W$ z8@6P|EuRDOlPC}tE_sfD2T!*7%@uQnvKvX-_# zOC9EI_er8j`<95ozwa0ZL`{vDvB=n8uVfMgTpV=gBICeccv;^9J zyT0+{>OEvN?s=;gEFxBxU;7e3FKvcNI+`YC&cw?NEO98$fpN}Uj=RTuOFYG}B!_*X zTS0#+zdSn;99kT;=3cUZ&8%Y)z^Jb+iNVmq7S$o*`%tIl!`2<+ z1sP5gEZc0V_qN3yJ#X(=l$8I=6M6~!D>PK^d8nY0-Z~ib>&hsO@{y#9^Y=XHQ{*Wl z^Nz6c$R1pL{2Vt#(yY}yeZytvZC4~uqBwtN2$yRut#MBqRXy_esF^oqd{hA<$62-! z^5%=wFC9B?Dej_`lb|bpJoEJMG&o+dg8Ri74BpwfSnl);70_mF>6 zrS@7+Tb^VV@@u;;5Q5D%1ZKAE8*xj_scZu>kdYq*Y1i~;wh^<-803qx2$!_lDCwkk zX;B}&G}b1vVztZCZ0K~$|U2K!-$_OCXB7RAo!4k-*WBC=7S9={f z1}x138?s~1#MP*0D_?)r80_cc%v*n(u)a=i4Hq<9(XWiv=$Mi)IXW)8 zS%=WmCIZ|!x-M|)Gky=p@@-pAi|AKk0A=2ZI@Rw1+W3EfewJL2 z4z6zsdIoM%dlmA_1FW(7hSG)HkQS$QMzWAA{Ge_#W02P>@ugo!`c=>zw&zrzl0LZ%Wmifb=j{8)6CHV5Wro^apsUbd>XdQGqFhnu!T=MX z_}A~@+s^5e`v$6Q)S8nXqkw;1`?Yk1m|e~TLC7PqlX6UCnDU#_0$ws&Bp?DZkiSQu zV#>Ac5{Rvy<2KZ%d%nF0jOB^$&{7;C=jaQCB0W3jA|ENg&rA7(WOt11viVFR0Ygcq zz9}yaSSc+q^@(m8S+gqM?$)@<$QR_@*HcGXO2`kkogxo-Lu!o*vYR~tKjzNRkEln zb<3x@h69Y%dsKwUD(H$pN$uu|4jOU467e~qY25NWML9>A$$7nr(Po}$+61txD#0j3 zB6*m*i`?#>-jk#=eX)NWoeiHh^K%exSOU39R6@M+9*hp?vYWGa=RhXAV*(PDj;-&r zzW|x@%PCAc=N*u6pnFcv`2G0WQio~U=>ulQMg$aSI>$iu_zz$1z{>paw5Nh`d1gr> zP=~8AI8f_)Cnr%QZIx}tXUG{c%6eqRW{@&FPR=4Zl;7vvz^s3BtVc92;|C)^?3z)% zX4!j&AkTdmH{sc@sw1EP()*_NWxa>I%ZK%IZG$b6ZK#%JzLCNk{Ai8N+m-gr70iOt zTYYh<6=_3s(l zXBi6sWA>gpok5Ny#cQ3iOh=-4l?)da$}s>_@}}zbL;Njo$eu*txjYn-0Epssm%)c0 zX}x;S6Rr5luZ^`N+g5FaoR`EF(Nw=3w{9baoRJbv8XA9c_L_3KY-sl2n6_jFNn)s= zlB45N+uUV(@A%;PO{dl6BfpOtNBU`n^)Sa;`Z?xgn-@J3(kKpN2mqes>Y43l<-(VUcu+x8nLy@`nH&KnOc|W1Z$>!u39Gjyq z&&I(s>b(kZo;pzV4KTZ7w*#2H_9{8?0n@X4V-rzWuJ;Im-g`Cj27!384M2M`gWjT( zS*Hu-oThru5II*hn({pgD`qBNbq=wB>e~!An6lvB0btBZal*`E;+(zlM90M#Pg^FWDXA#Xc5xE%B&#Z&% zQY1{BC=kIF{(r6QSyb79Ry|Oi!o?&lqPH3Oal&xpyA5V)MlgJv=asrREYcq}-^5mK z&GKQH6hx_BKOWFcwO0-NUDkvaMp_JL&YgczUoA8FwDBYdNB}`E7ah54uo))o)f7g<*jieiiKD3tR9H!QUgiLh?L|voe$e}u7&vk-%kqD0Jyo$CYpc8`;cL1PIYWe9S~+Q!dcV#bgN4jN zX7XpEplf0P=TU>N$9hEv%t+%*IwPxx&`Oh$PA&rKm=iU7O=F<78SoHpSRD1`MnRaw zdGj76dh!fbhht70*StXlXWV5T_=7|l%y>qvm&O9&mFv`$vQ^aYQ8xXZEXIGCwDI0+ z4i+?PufgeVBqefJwjJ!r<(Ut>)a1U*2PM(eWS$QnD76__)W*xx*?l2v(tu;_;%xcl z4i~!2pUw~vAD)I$b@W)nIUJc|nJM9}nd2XpBcp~abkK8Nk2)N^vfMFR2YtR&ugV+A`QGbuz)!-0z8V zfZcObZmysWoVk-V;wSh(jMM;ahOlH2ZD9!8q3W_F4 zi{#VJH;`9ZOsX^EiObN*%AFi)#H!04sM*c+&G%qxARIXc6P>%fg$f>j$lxwm1!@%5h)U$x z;o2hko@-7GidKSJXv%IqcV;VL&y^*>(~4lSX~Jwd2D3;&#;a6iz*5NXgYAU{RliiO zK&CV;B-itHxRCwdl1Z~j{;0%JPa~8MRFW34l`FrGkE(87wh@2B=(V8uoO)c@=1~3M zgT+_as|^%yS87>YG@T6D#-^N6DKKI*%A8dLZIbBc1(~STAr`eRgsid$_|EBzEz&~JBd6uXt*vKm-Lf{6|cj0sj{a4@QB#1k<#XQJ8k!*!jdbZg|h1#+VzFE&+Ql?wt z)~S+;h~zv_x8i>***6P;_9e3j%gz((-?PKAWz6mygeh@p3oQeRHT6r6L8Qr5GDI8t zL)>((4OiWY5i7TTR}l@d6yB{|DfNyt}YBcqASu}X8&btU;y*XLWp!QRIk-HJMvzy zFoS>nEx##0QN{Iq8l+TmY*vTdl31yAgWl{lNBDBdxXViAKo!2~0mT9`QEhp&PqFS| zgBfkbvjQ#3nRwt3CKnsD=)I%|sbt*;pO58rq(`jIg>s>}j~)vwL4MOi#5)yCR+Sm> zjcasB`KWo77Da6nbE?oD=vD46Dl;Gy<ly?D)?R= zdp`{lhL%9}K!mvO&d5ZsR#o2w)?seyX*f&D zAf<)xl1MVR5mB7{+5?4>OsDMy(~+K?2+9yy%O1#mX3add?kQ zJXm8rZJM85$8(z~6(`<*n-&S1Iv1!#;|kVkrb?w+SUCnr4>)4gx3?Le9v6SVTav$@ zM(C%%98p~XgnSQ?_Vjx!49@*aHU{MzfTI(Y6BtB6d-#Wq4mN8V+C(}{cKymo2p ze2EBw3~tT?XcLT#8iS2cR(f^{xv5r@XQL}^SE=6|&CUDRkTttj8H=Mfe<{ZsC9!(F z4@P>PnhxNz*TP|U=~)Gb()hQH8`4!k)uH4+qO~QY*(E-Lzoro+Vh zfLYk+iJX8>l_l&YHHmkJIw$Etz z?)E`tAlpF1CZc2iS^<9wYh~?Up7*L*#ez0fd&uq}A$FHNuur5P4`0mt&!@R8pqA9VgZc1ttZ={v1EpDWX)u1vkk&?^7PbKqwt*L<}7QiWSf|!UAraA1JSj5K%=+4 zC)nD%qp`W_?LF5v z;Yp``{Zcbj+2aqEEm`NXLeRpw8sQ&W(P)2x5+pl{MTOj)y`!o}o^$GZisIx~kQx)j zuirCJI(Y{irCER988KsdkyEIrQ4L@6RBrQYa_a7NsRqA%i~qb4mTT zeHv>!_bNGgVekAsGOihM-d#dP~cEw1xu{LU^ z=1zfE(0pe#4XuTI&usV4Sk3M>wf9<>jX~xycK57iQ0#xRykeqJ_u1@8Jl`(G)A|%U zs5`;V8f!Nr!jowkWdN_Xyv|fR-(9li9_wYl&v`dPCB@mv{d#@Szs?x~YI3wsK^ok_ zP`y?fPtnx0%zW~G&n60)^Ln+v^a<#mrR+++hss;;J3_&&&bmVbbp<>YdD8r)LV!pA z(ou)7_Yi-#Hbon%*DQ2g(n1S3wHfveNT&TA_qqAQ(-a*}#x?kkQek=i3|;DsrJ*4| z70s?*Tc}4e8&uJOzs|3{kBe5$Q9(qa zd+kyHhFE# z4=QMq!>acjUyx*Z*JKfgt+{i^3~i~%!s5D6Uz;WAg_{Xdtd^P6t6Z8=T-$c?k6~E zemUE<&|E#u{pZ6km3{e2eAQv*yz@rM@)8uv_dv2`_ELSqX-{7D@qnYsTn>waJHH(6 za%-@P1A}PRP7XzE>ZHXzZ%>8V!HlIvSigUCL~iqzgV%=}+wYMQ$o*QI=aD`IG@rw) zdoaJ2L~|cQ+`iWjCz`%+{T{LiXY%U-6K-9V&8hu$J#uZkwUJcK_l$^HuKICc^oYJz zm3jI-ZYFs%I!0xpj6EH^(XOkgE-Fw<`C@cM@Bwo_aBI5~1#%3}GJPbfMT*1LX?B08 z&a`BN>9CPo`8A@W=y5W;$EmRGxg)t5;lt(A_#ufcI^MjE-m8!#TD9SzsI+t&G8A3k z>=*^jGpBbD?2)&sUQ9m%>z4O)0Bv+G=Wv@+52b&4jf}7*@)xd1>GIsk7cwsC!yZ&Q@5y;MR#>fG zrx0sh+v@;t!pW#!gMqjkwZ-9>>y$vDD?_%SLy?(P)rXXZ$Wv2_a7mWJp$d9qsSlb; z_l%3-Lkd{sn%mV`$Y>FAu1I;#-W`jjXChT~II0?h{koIaFUtXa-F_8NClG&NwlQ}z zLVG};$zx}mQGF-RpK+H-1rrM7imc`Dku&PJ<>8jo)t(N)10@)$Z-mP&?hlqTdB}%b z&XQ`T$2mh1=N!e8AP}4HxrmPBxH-@tnH@XGA+MROV4-51>*qo(?->u}rs8__O>U~0 z(8mRRoOkDgD(6>XepqBl^DBQ`VnwM-a9pROzP=B?MYf>!5FeXLRa-!AGD?71eiMR= zF;J`1PElWu=Z|x6&o(PRqgN|m#(hy*A`*N%Y2e;2t zL{2b}>YF9pwaS0IeZm#YHoH`H&Np##m87eUQkh$3*iRO2dAE70NtPC5uZ)zCoL2!N zck+u)NunmsYeNP<^F2G6)9!&R_Ehh=hM$-jTwc8BSItq{#;-l^7!)y~_iL%9=#_MSS zcxW+cxxMG~P(btE_q;b=I5844`7{DrnSBB0yEp3SLYlp$x6VJhiILWOa68b7+v1j! z#Ji^xJ^C#jn`OL7b_4hV$j(>B8DbuYQ7#9yi9Ml%(!t>1ImLvoc6 zp+%Fc9w2|(cD;An`sxGbxV>!U>G!H9%Nfg=I3`HqqAyPLJ#n`z)pBotDTWg zldoxo8C5D_*7`lGLpW#ETO^>@!dqT3&uvwKzFL2`l?7eDdmyKmzS!kfa-_d=k$67R zwlmvFVcOa8uMx7v@`SV(6k?98xnNQ2ET-x9~n!-=X%3! zR}T;foA*K6(#k+>RCh@^&cA64vD3HyA{ zDAbi-4zQ-V#8jWXI_L0J2$OqZvPdsdvM!*aih6UlPkl9w|qLmHvJ!W%oQ5QWyL zbzjjH7TVxbuAhN4uiK$E?x1zAXPFgq$k{t@FX_JO^(?|vcQa3eKPddpu!w(p=ZH!? zJnP&Zh4vtOx{bZ}LmPS*6}$DcO)Zk#DVE*0%ekYdyoh3rfk3@%N?ItHRdjLy%}XQ!H4JiWpEd?a3s zMdg`3F-V#x_eC3;yS>LtJBWV=WUu94$|oOX6~!ZR{YV(SDr2J!J;=gnvbgJ3o|Z)* zt8f7T+q*Pqtpfos-nlk;v$~E)Sr{buV^dHtHK_$Y)|y^8n@Sw z1<18Pc@r+V+Kh{9#Tv-Japj6Mvfwm-XoGQ3 z5!z8|o$rz-EwnHN`5J4Mtbq5v3F1gWRhvWPrN7+4eae3uvPf$y0C^9-XwMMXV|ohN zgVpw*-<0wtm5gjNu%$T$$AvAK7SlQvGTxHq#2IpjC3a2~vw8q6yxepBoEsoy{+@y8 zsH}({95m>%jik7^VfEm8((}&QD@xryxez22V)pt{#U*zN!Rr^iaP)xs!3ZFy#im#_ z0p6}2T-ASWgEN#T#+@b%-fX>x8=b1d@||NJEk8slJHCJRfbL}0|M4{ScQPWw0v}js z<9$>hDkO}j?Mg@0YE*g0wYv6r7Il|%3`CDHW@>a4EmznoEwhS;wHhsKw9r~}q+)2y zZZqu}8zgZ}C%9IlA`e`#oV{lCl{Z%^Lr?Xuvj?_{yfeWmkvFb=N8*8w zS#6QSWjY*)7F-etWFDEf}Zg*Mth--2A4_o>zq4KAZOlxoFqyp=bD?G zn%zc>ZO#0gG!sWUf2q$V>QKK_0sE})toSzgX6C@)v0NnbJycxCYSep>B~7^xmefZY z8i2CP6=4EWbvBkyai3`!RF2=%E|JrI8vTF9^fm;9?$ay34?da)Dx<4Q(z`F3W@1C8cT(bMfQKs9SMM_eHXMxl9ahlS5TP3*?G@0DOp;* zUR~&Vj+%yhW|QuqweLOwm7qw)De@0PcRy#MYp`2W^^Jt%S?F|6J7pDf?rfJ_TYi5z zKW6TkxGQm!kvWh(ZSp;iAO1%5dISiQVa%~?=Ghnr$_LtF>`|$xmq|HtlJ6F~@!Us9lr=`8+_fgP7 zCa`|#xd@B((^h(nxw0-1>{1%SXr6!W)S&7;-$0G&IZ#)@vCKAV%@z;Ydt`kxqA3+C zC7fOWMV7>^4@9HwpxO{d1sJFq@}Qw|`jo|rN30Ygc(B>;3)w)2MU%J$d_|29N^2Jf$a z4{YFGs$1F^ggs}-&{fQniH@l2S&q(=qH0FW#IbG)D^}mYN3jIb0?wT=d>lD=;XT`Y z;QzQcUz7xDrvRHLI+EiiwgP{)Q16-CDA)Yj6XlikARprH5}Wljk&0V-Le!$6d+Of! zcpJEkXtKc7M)ojbc-cvxD(|uX(R0vMsq<-Uf@< zLe7vGZ|W<*0{3m|zJZO{e5=<=k7j))uDV-R>4$u?BrlW&!#_{62Yi3XRVsx6d}Tn-b;rQ2IcqKHHF^ zPuvDv#D}PdBOP10Dy)@jeB`H*}M)vHpWcoTS*_|9f;G{B zPqR7|Ok9h2cDWYF47p^~`2!TKHfqfS(U@meds10tGC%gf`)grA1YO+((D+bQRA?a!}-_RJ(^o_4a&^PuIBH zC+v!1h}AdjpU!`mJSDTv(mJAKpnzk>UDU@F0qnl*FqgGo3#dNUynV2s=XM*C*_oAh z`aFmh)Gr;H78%(_s_t4bP{i^~dD8>Tb2rO*jX11GeDy%&G}YUwpMsR+J(w5@pFC&c z8#*xkL=}tPjeC0f)(C9XH?)Q&Z$?l`&YxUaV1v?0^|XI^R$8U@swWhPh+?(@87S^Q znY)7$ZuWW}-fiv&raPEfy+{2YZfsi2oy;ndARq9}Y%{ch$`g80Y=a%iHcGT7h8EFR z9x&$)i^5jwvaT>+po z7Vs3+edT|hNwq8Nj@%E3`D9IKu|zkpVhXYh`2JeIbbG_dmFKBA?Ac#|So4-RI|7oN?;M?-bYJhv z`+?JxYYyNvD~)r=sUP${N@mqBsxLQCAl)~vZEAm654tr}a_&ecAZFgtW#H~d-t?Y4 z)g|+^9A(uL^J~+;?ku*TKmJ0tkun1DsxcsDu$Lk-+4K!IB6lR!gtE@JHs?bb+IWw{ z8ONr^?S)_>A)IaC2{QwQy9RYsePd}YMAam$h0KAG%aLv?KSU(L`LkBvP-0S_&mDMs z6Ip-DHsTkFp+zYhIFM>H@R4~k$^G2sL`c4r#jn6ielHrp$!WU=swGmbPW`J{5JNSa$oo|@3tl1nQt|?w5&5X6N%_()Ps=D%pI=)B%(Blm z?%|m)Q3Mx2CEI|mv`75%J5^<__sBy^ou!4&Tjt(h0{FUJZRUMImC}Oy(qDl}uMl#z zSs>T*#_~daY2*kCzH|0qAvKY4OC)4c{oMmX+ljm))UWbpopX3e z-SZ7NF*UO#b{}*Sb5Gn{o)ZDV<&?6?Z@R6t>9+c%``7d8)hO247+OMMR7SIJ{3_K4 z@;#(*`(&amyeDD+=}^`1{5^-?SqgvYif>z2$%MABIqYZkjWFtmuW+cnw&fl|3Rf() zo(7St4sBW>JA1bzXSZi|ncMAf%$-kC=EIHzGS@LkV)$QYpFh-dQ#(++n|w!~7}q(% zY4J-T;GqC(ta)gU)K`A9yge|V23M1aLd*eYW4Adh$l6^7Uk6k+-*XB5*J*#I^cwfS zcD|v?*7-&jJfr$@4qCL`?19T}b9tZ>T?%StP15-2FZFxm-hrIcvSS<9?3F;KRJ>Lj z!1*Q78Pi}^WIk)m-PFx{vpmG+@;zWjSFN9E)arcZd=t+ENX@4~9VN#`F}tVxVYP7q zBSf1PX|wdaRoi{c8ChVV091c_FRt+&OeWuRNEOtbc2e2Vt*P1!In|6kiFv$S5VOro ztS|c}1h^#Tbdve7m*&& z7(FqNe2=?f>FR>hujumS$4?GnwNdkFI7_Ku!mBc?`jW2e&V%-AhptFnJZxw|at@b-xTcMA+teOnHdFY6YnBHMjQ?24E&a$U|hmOXDd z+Q@a~j-(P|-#(`GQpq5Dz1`leTLjPe0oTcOB5$1g+a`LDybnAc=*`@F72MUVMwII` z<^5FA3XVw5QOXr(-o#NmXv=4>cRA$rZbyLlR&_i_yy13c43d9^1b2@0J|useE+QeW@j;^nd7JNGZt!%H8$SXXE5kyYXgl^Pt9E(a>!Zt@;#mAbz%uv zT&r_lpH!hU#)YIOQjzNiRsWtmqv?biPgD!ig}&ujOV^YBuW=La_36?ggPV9U`F$aw zJb#2;8u_b~-8+Akibre|N;CI(qKmISgOz@p`^Lhuw8wSnLdJJ^6bPF&2E!tN8>8d0 zEz{L)6x!QsbYzTRB`jFAfcokp`ucr3vH-7S(3R=U` zF*^Vef|U8?RC!nuIRer_OD$*oa}*TM-$S)76;Kg4=q%*u_S+2P^RCJ; z)YDesyv&x5g^kjbZQuj*4oIL7uPs-JTTU}=)wmnnlYEb8eCCh^p1!v9qFHWPTV({R zkXe88Jzk^EPxS!1Q2H`0erm=BiFwm*%JoCmYRL!&Si+FBtM^c>Zk~~Q8S$C?+AJy! z<HP^%Xr4&EFJ<8&~ATQDu-2Z?4a_R$q^=alN(Om2|$~R@(d=DPyS|m*ce44x}#B%iw-i4laT84^PjvKYkMkTv}-c^pxr(p)Jy zPs_{YEXNwV#0ttbVjCI3aGM*{scQ3radiFqJwpUG)m3QTPfIHE%-}nU8RXLd-Fl}GSe9zaHtzLX{vODl zj@5{TV^`EEL+k4NPxDEy^bcm`s*m1XY%d*u z3lR2)FwSxFQ?23b0ibAR@@HVjBhPvkjdIN`!0G9&OFZyY?Y4?+gDsK> z6%62;0(99%IxCgbu6D~ygi3=i1+40qo>pV;Ar8iW<{{54 zG8Xl;3qG>Z8 zIC0_HtEh({T-T~!_~b`&|EZyn%E~rMyGUik@1a+E?~DM8phumW3waDWNcl8Ku0%*; zO>vfMw_I)qpia#y`9b)mn(+dEOdqO749k({&mt**W#&Op3dyo|m!a96l|L!lXtCE$A;ErMuN+Z=rSHuCV<8jtsgrhr6FTx%unZ&3n(N`@&N_l8eCEpf8qBgRLdUTYVFM**?-&UWTeh zDi)|1L}e#uFE#BgnSwGEz;tz*DNIKtzMm!@o~QEyHUf59zeiba(n)DqiNLnSQJc4q zMfi(8T|RAxN2;@AQE%i*b?^lUrSoPiR6?$L&kU%Px?jue)J{|~{bI?x{Msbm){IJ# zjDvg1UrMHtWI*=K9L+O-c;N;pg;;ISc9-s(iZCz(*+xtzBaI7P4+Y?|&46^|_i=5_ zD#34eIT^>CqvQdVR;>5nQBr743qpFLk|6^{Tl;CM$n?2D@k2Nw-*XLgYgqtTo8yUA z@L1F1a$O*Al6web4|&vlkF}j>I%Ro48q3>QR5V{x$z~B|v@z#@dvNj-mAq_NWqr~L zN$rU>Bp)w#nEQ^}H`2@11L}CK<^zwVHbef>f%i|3c-bkx6b029)Py?O%Gg* z_tb4%s}sq*9P1`V ziqAIgnwc|_o69WzlX5!SKdp+ z8wk+lSCDa?GgqKgnY?Drot1p9ctrL<&8_s`AnKtVbKEHDDA89>qke#4m=-Q^&qSzx z(T!{~OYwIPR^n^j1Lr~_Zk(ppX?{7B%r$+N^$E3?xX$%S86j^|Fd*O=`Q_AM2Slu2 z3P<)z48|&dcPUttZPdR`|7{%r{lt2(@WpbS3Y$6{>pian8Z}oivGtAwJ1;m0{T>;c z%s@%kzpu;(10}zjzrCsz&S+fSL zGgFQ~$J!mEnOl5YJd&IT((73h`n{^PL6^DuHf|Dsi5g$w@UP6=ttcF=OuEikQ+Z!t zfk?_TewWN;?oFs(ugE z6Y+?DvcQzIhNOa+52Yru4K1HOnV{frc@tlEr&e;uRs#A*KTVX{(NH}&1`;!8?{NoK z>NZmR$wgQXk;}Y&tcUAIdjVq6TYBs3i4l^qfR*2iSx~Q$9^bBKP?1#@EO?LwHVrgEd1~ z0I9OqJjl+4ZjPASBm1UicO!dzoq^A&-$VAL^@Py)G4Hc)BEfs&VYkPs)_Hz8Sgj?0 z(KC3lzCzAk!TmEa=o`tYGj}m4Rnnw6LlBT2J$q@600r0Rz*2L$+A{UNqsEZDe2%r~ z8x%%94MsHgDtCH_4BMm*Zhjx}W)4q1Z73J@h-$HCq(qSI z*-@O0r+8!xWh2BZ2~|DdHZ;y*8;I$iRf2i%yh&{Hr##aJ2GSf37Uba^9Z-wTA#d~g zK?`IfXVl7l8_$kNdX0flNmr`eTpV8+a~QAyhf_U`>In_|w2bgUt~o)mM@CA2xMJjh z^E_n|kjVEaACh;oZKDd%Gjac-{hXsS^iYxsy+I}{8QmY2E%hAm2ZwZD^&0k=7n>Fp z7xRX^4en*;X*YmiPGml9ldsPaQB+dv=Hz}ys~_&q8{0UgHmMP zw>Od+_N00bwxp6qZE*_c${Nsr)}99{AvRWbBTCS`50mPFRJxO9{YzuqegU7R0~q0VG?0?v^{v$2oOm zR0K6gYaUs+ea7SI z`pUiMta_;Rl;{k4{ML4k4ummKZuOenx$D#?OLAYJ#Z+X;u?7Z_@{ zRXwol;JCC!RJV42N6AZno+sO=ppx7q@ske`S{3UQK&{)yEaEdF!Ph}kZ^-nGG5p4*zgXY<{9bl@CXQBSPb?s8SHT@C?~ zK3J4mZOeP@{o2KUjg0sekK`t2|a^iA?<6J3v7Kg7=4 z3WRUMW#9W^k08CqEm$i9QH_0AcRP3|YDyK_i zR2vp4sI(9k$t21(6gwC2-Hkwo_Fu9Iu3jIuy~aOTrUh@BZ_0|5V^IYN-~ z%RRLEhAnxfhOv5R0torF;X|(8Ezfz{6Sb!*-3OJOor;TWe)dhC=|ivi4S7f3U6AL* z08#|7_vU^u0O0Kn5-9A7WIIU!XtwJ0#Sh7N?|vNuGWit<*KQeE*f07&ukyvlwCp}Hu!GznptH>j6tvdD zfp$+lFxyZnPUMIzI`6jTn;-!IMD3$eQ(x`{^`1K=o9?x0VC@mBFAbtnJ2}gH&1#Tl z&do(MdjRd87_&nm1!Svia|k2lSkp9@XQ?)%fE90lN(+U}#HAe%-cx$`EY!yH_dM|H zGj}+$r+dc5SZH+Q3{i?o=DB(;jMaBdAt8XV+9?jA8XW9=nkaSNPsPOG`Eo>`n6c>z z9dIbk;lTA$6(?5~+`5u+)wh@XcHRz00f?@( zdnFQ+Yy_3Jy`F~1GG*=01Eg{7xibn;Wo-R_P@KFOJMyiN%-L&~ZAI_1Z%*38Xda`w zW!@K*s|NJWU0K+r8I}ixN>_|i;`)mKPxTExL@}MTkY!8u4T%nU#r&n9QeBbxkepf) z*>j9ELdN;j+fw-}SG`J=x6Dl)gsiVV(N*7RoCEFAuV-Q-SU#xm9s4{A7uC4!>Ww6S zs$WfnN#)jT100?lr~{L;QSisX56QUyAxsYKQSUi0?9(Sd4nAMzHIL)6Q{?V)4w0jjHp)Qd zH+9G83M$8?yi4~Q2t``FdObRww-2I!oG;YwZiC8`V<3^gWM1>Qa5)pV!2*MxU%@rc z_l_Qju?b<6$Hg-A%CZeGP~P-T8Jo@&%hrQ3*L>p#eW*7D|M28qW)D;f%N!-Icd{6= zjmTV%oAnF!)NND;eAHSXr}{yk&w88Y%<-Sx6QI-T+iiNerl&>rGI38Q(#I`-HB{iJ zrTF)J8kMTdA)n(ml^#CE-GlRxPjju#{Y{+Fn>gJYSfS1~bn@$3N}Kv$hq63tyae<{8j!J6uUKF=BJ#I!y^LM%yHq(_gs$p+(#)C-V$MaQo$e#Q&00dDS)PBLZ#{VP-sejjgC_s7_2{^ z<{sSR=ANbIVzrSjq12le)S%Ra5l2(&HAfUezmeH|5Ujs`&(4KCvj@k6XH^!GF!0oE zp>3b@0KK2!dbSx<#eR={C*wQhHYOh;pEiB<4eXRr6PU_2-1R;&RrXSs&giS(?L4qdsZr5x$1F!uhio@fflyR&#~Owzh;pU$gi!M zD)40WZQs9I4fvGIxo1_~bEk2W3eP72uPI}YCjj`Iyfzd8#cQ*F*NXNjY*oEJcJbC6 zQOf_yPiGrfu=dg@^Kccj%|(1V_tD{$C*I}c#3BdP(_9x|2HGN}mh&274Q?;noKFfK zWg)}9^sPYn;GP+^b7WHT_TgLOebjrD1b94h=ey`lEs2PNwX~7e*9NmAbXvcZS^z3% zx3L-%|3-yF;h9>0jn_@OJm=1Jv+pGHghdg&T0e%G%3E6mBXWjNBYp#w#Fx7iG;hr- zu?S;YGvvB&j@m1qHso1rUXx&TWvV%PJqFXZX8c8!hE`;~M^2*a*g!UYsHk+or+j4u z&|3V$ajExEiEqUM%38N~W`uL<%$GnRG% z#=)9bujiY8@O6$g&wI&R8|gC;m7E7OBuQ!Jdw6Mi&bhIPg61~`zHV*di)ats)Oru8 z6jJqRK^5%X9{|0X&;ZjEW^&y4u&No&D!_-<~)Fj|3%B#8d`E4BPm*NO)eL4ewe?2lI0D|$v)vKpTf}QDc;k=_F zbQ_gSGwyPc9473M@3C9;ycQsRWwvjWh~L^jI1#%us!P%jE;_&5kl)GZKCwUI5ZPex9g8T{QOsc_|^aX?)QKD z*ZX&W`1Oy!`|hv)-v2S4_lIBo`p19Se)q#K_FsShkAM8}`~TDO5C8h>UyOhAH~(h% z=?~xi{`c39-~Hwn!?(ft!>@k(yPy7aeE*Ms-yZw>zyI#XfBMUF|NZ~?G5`A8@Bi`t z`QOj_&G$e2{QZyr*N=bv*FXK++y4CHcYpf3AAal4zr0S-qkn(i?|%6Czy9tIzx@5D zfBp48{L<=&?|%GW|A*;cfB5Zx|DQjO2mYtO49}l`_47Y}|A+6#`25%Je)y-q`t!ek zjnVf%{LTOS4}a~yzW?s0pVyy$_ub$A_5b(Jf3yF$(fZH7`pxfu{D@g)Pq)AQ>)-$GpZ@vh+i3Q)|N8BBKmNMk-T&Qo|7P=F!}jezzWdGivHtIW z|CjMU{M*0!zyAGS{_?lSFMoUd|Nf7E{{FZB_h0P);ZOfI2*3T~fBWOlfA_<0e*dq({oVxm z?H_;h)8GB@4?lnR^G{=h|NN_;zW@1WWAoF0`Tqe>O9KQH000080EbTEKqYUt+iwA} z7k>+M9+&4w000T+1OO2L004Jya%3-LZ)0_BWo~pXcx`O$ed}`**Ou@1TXp{jU4J-r z?+h3{ZCM%llre^QhJX(?CpmM^EvhZG?T+PcomLwIQ&VLK5C|B^2>}A;;RF&U51UL# z0(Kl%&7X2h-I71uf8nmZcW+7EZdvM9>wjT+ITdWRTCMK2*IK{z-v9K+b90%%Sy9bN zik$2T^#*$aqMTCFl02R4IX!XoV7w=g(*!v!WE5FU_M8`UJ%1eh@Bi(e77}SCH9sfH zS^zE~=MoFqRI+DA)3S*}hjOVIaZbqf&Pgd%$thD>Z%Uavq)bgoDe=&PqNWdpgMXnQ z{VS^~DKVFW?;956vqG-NyxiQ*t0`GghVPnE)Hy-R^(yN0p*caFozEVGt7ipGnv^n< zb{?)B?BkbFl0EaPoG@?bVCja)M-uFY%wPNy>W-&y_+IwOBPIptHy%>O4BUev=VqjA z`7yj+4IXiZ-_qIL9^&j=hM%{P4Sz*sf;%s;~e{QNG}g%Q+Au%|0}jVRRtt zTV7TB73;a6^$PsDbAlw7Zp_<*R*)(b+>NLvXOJ5ye`RdPz3)ofFy-%xugro-H6kF# zRAoL}x}B`l*wsem+0wO$WV^VtVBd~M%elJ14%r`{5wc?GcCxwQ`JATA9e)utp>*Aa zg@xXQY_2yYn~J1D`a+RI@K*UlJ%PDYVsu(oRADj$&$bYX1{OlG01=R$LC{^3O8Pwc zou&Vbsr1*lc0MBp77}NL45-3b&mnrIl$Q9hAUmY8^VOq@tmWXn8A;ZXJ))4)hH{d? z&Pgd5MJ;_U*dH7=Kb*V3kAFs^?9|+aVR9Avt?byLg#`T$_?>0nHK{1GMAwaLf~vvE zQaafKs(K+I3v=*%XC{uGJTq+-{e9fBgoVI#zpzy>2Y#HoD9jH3o{3YPmo9C zkF$`_20s{)rzKeo42_K%%S-wvE96~`okPgontQLjBjeu3#>!W=+kfEn9+A@}YO^O{ z979@T{oH@F~h$Va{%)10jB-%z$C@tje`@SV)PGg;n2^bc>UsX52_lvOWhyWXA_OKxj@^iP@@ZN6+q}rgU3oQF zwGyr24_KS_(|wY1!sKv{{5DwR(~?$6evS>68t$lBdGlH zsx&>r-=lw5zBwhSIgNau`Qg&*(n*xUAEr1DrGRfll`swv!c>!v+JlN=vPWONk>C8R zBz=_!xX_i3(XT3N>M#|QN~KYFw5o4@Zc!TKF6@-gS|P=R08N<8ku%{pe;7&*a&H+? zNRu^4D;jy3ReykZ@d((n>^a#-Z4W$^NfRQ$>E>S(=d(b@Nf9)y`8h@y@}-iT)6@y^ z95ve$gf-yQtSaV2^{m)47??OY9Qdme_`~1k744nS!3g^!@Yk8ZUoQmyIv*g1pb-{aDPDb^>*ul)SY17W}Mu4LzR5& z2!51VfYTVum08Evxw~{p84$!z`k*hSZ>kW4n9=*}8{A9db(SIM`Z@2g{8lwOb0c=tvX7AdNu~XgzU}AWz-I7mN7bPDh-$C*RLY?QuHcRlC@zN^ne|KV{?UGMc z7k>pGjd=&bkAy?fNXKD5k5O4bpC7DJE|g!t>4dPgQ#d|a6@l$5ONGtV!mTy^%a5Gy zrj=1^wzMes2>1?iACC6L`u2w0)7r6mqiA8U>)#(eapdIt~yYIOO&{REE2=)(Y8w=r8G(*O5si^4E4u@on4sgT?#wQ5~Y+zDMU-u!G98s z^vAkW3L}BS^=roR_rhzIdqf>HvBA-%=CcGB+53h)i*FEx+;0_VQu}03oBa?^4+3q+B{YIe~Td z_Mrs*{j5Z_)HQ7zq2NmgK?AMN-hVv8{G00mBVOS1_5ANQ+KqdR#wdS?d=AJL z2}L`6?v6L(llXs~(2&9C>$~vvJ1Lb8_xrFY%~q5afoU^cSeOl>2iP|{rhhNL(jPD8 zw^odcYsS+T#kDV;n6{N3ASF1;A{wF&hUh>%){Vt6L>M6wy8c~$W3#w+v6G}ROiAv$ zIL4i{3__!=rQTs8R23SvWqMt>zrS0}(q72W-~G9`_PC>Dk<#0DSqueH7(wtVCs5mF zw9&LyhYMqWJRa>*J2e{E{(tNj=$g=%R*YvW+uydmeS*^3e>rS)?6EHyD3>!`(O(+=A_5})C z8_-GU#HX!{(=ZyN0Fo`I5Cv^07>$Lxv7esEUw=SfyIOd5vEA}VNq_9W_(hzat4h?t zVk`RTL0K+bdt(6d*H@h=XMnWx1|_lyTm_4RL@xV4oi$SCc<81BjaJ#aR& zO%5Z$Xt*1zM)gOJ%&9WPwb#ajTkV!YMrV{ly8S8c31X8%Qr6#%Xc&bIKHG{_|Keq5 zG}SXwqadPF=upNMiho49GByfw2$HBjU5Ad|4iQ62Y5&C#$E=a5_j^237>-1{6%L__ z##mm|pMTRCV#p|sVu)zygogd$NH_K~5j2bhjQhWA-+$d1Vi=;7MlnP&bP&UVNUR&{ zW{4C*aHzk(JFyT#G@XQml+GxHR0^?-#wLZ)c(@zee)H>h1KZy{D6D^D zyj;B8imN{!8Ls98ro{ z3j5X+k^ZinQOX1ns@NXAHtxOBZ(Y@I|7Y7xQ$p(fDu?EPDfOr#Yq`KeVn&j+WKZRA zA?VeoCy}20G1ezRJ0{rQjg3`v7zzMilS^yEa66)`(fwH9CHcZE{l~lm^H=?M?KE+~ z{j=j$B!7YI4h3|u@C4EY>5_1vLy%vPUyxrA)euSQwYoY^gA#eK@v|?1@LB{p8EE^I7<^^f_vi(0?loiJsXu^f(tf+2^qBlKMMb^Kd2MhzlNBj-%Hs-!3~ za~qkt#3I1XoyV^xznE^ZroJmyDv`c;n13jNnN#x_P;i2FoCFChl2}Xe5=P}0Pf^xP znL?5>6?-Ti4v{ahDfYAPiRyF-4^%NnV8{IG)IMfzLeR?R&&?2orD&7Nh=S^%w5OyD zRE1O60tkkahceQ%T>2EmTtt;nmR_2zPG#UFYeDA7fO%?VU`QJ@?tKjXIE7DsF@F{> z{=eTITHtrgy6FG5T*f-FqYlp#C>1z2mr0mdl?5ge)w3cbLFj~i7HKL+ zx3t0k6DTfSFTC8cd~F-=e(?WZvr^I|0oTf=>oWY1g z8HWkCvxrB+jwV+nA2Z$P$!gk@7JnC|S%n^}TaJf=b)YlvEG6br_wy=_AZVl@E_l@uE9enIXk`!oJCO6@?px6LF!7?GzXIWROf%4XsL zusHEh?XL%J;)chdvGSGWBJds{lF4u67c-#IjCOMCI>RU2%Vu<}Ki(N;bbks`Y?3@L zq8-hI-wXaW#g4WpBx2#C9R>bLJpnhW#J#LzbM2_w_*8;No_J68IP6WP4Q?-9D%^c( zfv=JqP`G{#hE<|9RZm=&hx0tR7!I~-=CpJGeElvsZ85(Xb^M$^8Bft3>Q`#AU zhPmlei1NYH;{;jCr|w`OqJLSKPtQDE^Y7YK6rhC$|LnweE?B$nyCh!*I~n%|dqcsX zbpthvY9uRxwwhDgp_AhGd)ihD(ojYFL!M}>m6B?9{abge1Z_1ZRZ+@(d4NK|t;z&} zy9B4_b=)hqnnQ%twAE^ZCJ?6_uekrhSbpjRz8E{J$0_iYOZTv~2Y*JD-Vok1gZM<$$L=47U1QL~q&IuBEZ zND5?V3evbdscTk_EbxO+eFB9e@UAU)Vo&%-V^MNeQ?1{4IObHzWl!ToFi1&NNM#z! z7byBL#knL^O8u8?kAF@MM>r?*jT=t`0sY!95CwD2>o*H${&rrgspFZr(z*xwj~RWb zI|xH?gPcr$<5jS9crTU?BkyA42R447_D1cE+M5|M-D(9{i&|+N8aLpa`)6q3v)Mi~ zp`=2QFm%+=8eI>`I{o@m@#Uh$BrShyxem+yFV$dBQHN` zG}<5Y{Gi(pt`yfcii=ljK5JeIds$=8V)ku*2WNwT7jK=J!fj)A%R_*j`f?$_4Y z^Kq_Xu5zwd--s_S$>ea^nB!EbUE z!94J%AT>Bre^k4)?c1*X8R= z#VvbPFTcC8lA+qeiFUR1Nr^-1Ubixt+%jR^UjdI^RjvX7)^rV2%-`pql)o$vDN zSM?tr=$Bry3f98I%Y{d8^eaCZpDY^7Yiz4^{qHx~PJcpdFwy_;#&nZXTH?VRzWOy| z3ylz%uXH6J(uiT14a`HwiN01{X_n?UR|z=rDD4O? z^JpvvjcsmN6dujI=_-04|7OtZ?x*w_Y7EhceRR6T@SmgWsK) z7-Mf*i0DKsD<_-gu{=M=9!biaC0)K0P|V~Dyf<3v&Er;g=>r|1x@kL2SuEmF$jrDA z3-?e$co#@-p|%st(ne{gW#~qhCA_$FySTb)*VkY=7|%Y|KfY>m?(^5i;}?uyjbE-A z7k}5b7a!)gR(eYp*j{|9uYV1b*7U9K4(OjeEq=5~UOa#3R#Uf*zkSjvPFkO)8O!WF z5aQ6@O#MStN=^2rV&=r&CH+vTP|Vx5C=_}Ou2B8}wPZ*yQ7ROyI$ zTDaslI2t@YEl+dp9WD#St&fk1nsMzO1b+v{l$>VVdu#k;ok#CPbgODNErX6w(6n!; z%)yaxD9QsfE_rwtH8O(s`ygO;AEzy?QXbumt9QiW7J+vlUyCKnw8UX zAlw&@_QlMBAk8E;DXb5?KYHTG$@j-=Qnl3GZx4F7#a+&C%%12_TXB1Nk+?u_ZhsUv zxqDL^D7%vqiw{A0{&^hi3$}qyo;rdD;6-um(*wm7pVEf$hrawuf4rEO(X?zX zap=&rq={m0N|`%!?!0>bP)3?OCz8%((IR3_`l%cFr;0)km_HRno0*@aR4WtgP`!k+ z!ZZ!(fa}l+Auup3EwR{eY@p9wB7eu5Cq-JOLIGE>$!uUJzARgk6~3&0rstjys@=R^ zxblq|1Ph!Jh4h?gPQ7_}nFV#LE`$@gJD8j8Y01z44BlvdT!3(MIKU96xOJzvVmC>5 z8i64mSJ{!I=|(L(s4u_NS8p2E?l2qK4A9=W)tldZrr%!6Z@egOJ<_kdV1M9Uc(e+; zalv~e2n^7E{WFN&nhe~V%g6@`mw(ak+}d8eZru2fbMd}FTAZApHW$EutltZsr2h3K zDOMt$xMuC?u&3CoY2c;nt$>i zhO*gS@tmkH{RFJrJaz+M=DtYvWIk;w;_=)5U?ezX0$&Rp7vH{{<^_IwXZ0e^Xre`1hRsZ(|?&lF&B+#6ywfv z;q{lj`L|D*&fyAXSjnD0_z%64f>ylz5atpvPRalNxcKuuvNf(PPgffhJIQy4?Mmz> z-asqToMC{(9n3D^tfITMa`vKG5$j zG3V88CNYsp5UovJ%72Vb)a_17g90IwY|4Hl@j%Oem?k-}ed(+G+iPXTvHbG%;nOE3 zPP5?a@W_dYljETDw;z9LTwkix69?FN3{1ko-e5EUc1!-vCrl^xvX8R2m_-0N9plGK7Qu2fn5))Bb+Ex;E7|Ff#9HHpM2Nvmy+%gk+SILD z!sA@|wFiLAS@=ng!&qL-Z{DipzJ!H9P6F%}>3I~RlYcX+&J;3}&xyc-B=-k$*-&lm zwtt9odU9UY<`c{l+Luf-I842{1bBNjpTC1Ov#r`J)E5u6qM9}A(*|I}x zbu9#RG=DFfRH5b*t2xGFZ53*vXpry3=5#vS)uUXV7>f?Hz|eQLF^GLydr4YRlu=K4 zJ8LrX!z$$5P!Wc&p5|(GHtXooApCeUSV=akxb~|-6IzK<0X$?B7f!K_d{q61`^M_e z`m3v~uZi_MkWW1uZE%Pf%H3xCZ|!Q#qG$at|gSsM3%e&v_^#yx%U zH~!v_#n&&aEqRc3t+(LTlFw_50+T8%D;wFRiRZNURUw;&Z4L=Rfp^#)wc)m^^gt0u zh^xw#`o+Ku(&2?X~gXR_)YrV@4yFFj@fPU4k4HsIAf_))(V} z9EaUD!}b(pUntxH3$v=etw-a+-fqn=93mO)-*42^{y;w_I6I1ktPEmeSj#I5>((%C znUJVbz(-mvNK~pVHdZ$bfikjpkC@8cIe(;6idb|CIC&vl33+NqbZS#U$fYDH*<;*$ zWzO`kpp5Ns3R-x|=TRZDAj=RSE3Z7?8jzcm@{k! zSl%{vVFv1&IlhnrBf=cJ6dL*XK*Ustn|I&D2O`3-@Gg{ZimFXxILcpVJs?4SwtpJc zFgR(qf*qe~Mv}E;Po;c1J?G32Yzkb-g;lt9cjny5iKZCxuXiXLA&d0E$cba4BPY%b zpM3AV(*Wh zi)!REQfpOakFpws!?pBc3)RTEnSTjoR+KFZ%FS|9XYzekoW!er4_LvZ&emPPPc_oM z=k!(_6SOR7Jre5U>h^)l93Nsvvqu!@>!5pHKA9C&K~vO;^I2;-35wnh+p@g~ zK62vpduJ$&pBUN8FwXIN;xA((XFhoEPpBVkMqvkGa#=qNE9tuQLw(j_JAXl}x|ik& z;Hp5rg{$|PE*(s^`1XCkY1n6>ruz+!Py@?VA8WT4B%JY~Z z#7X6ev8wTrx~Efisi8k6q<>~bZCtv5Fur43*T!(ciJ9AH;8d#6x?sFM&CE8$Wh@J}?9;Q;{CeQy_RCAJ2R~)mQ zH|?ibB?BRk+*iXU;LO<$57}*cvxePJ-&(ixfvfvZo_J+&^1Ov98h(VBMMvq%o$H`)J zYz+h($zBm$W1c)GZe@j6TN_r~I?V(kSxqo>BP5OtO$-^IzcQ9qYZ7qZ6q$zutO2Jc zMe1cKEHbC=n~D9l%EJ0A6E1cx!%~%IiAP(xo-B8FS~gf@j(kL{YrON#(#8sKjxw4N>jf~Z!E9#4WHHZ1Q2~53k??vXEb*q&#^7mba?%Lwn zbfpJAFJmRTkkf{85@LNTgYRvTU{Gcam~PEh$AlzDkFxG~e{jZq9Hte|$m^3Df5sXb zxt$MFiJw@6Zq8c5LQOWXh!0Mwk3rjMBViHxLc-f@F@It>V-b2+rZ2a`W!JR$7pDQ=$@mu?l^VE>$h?^)bX=xilUtYxoM*V6x7->3T!#ScU#iUN*OH zY4o+b84wH8YYqr)r`heHZnuL28+8TH%jB+}=Tvknt98&u+F{#1!jWjS1v>-4P&EAIwnbof6X+&NWCc~2%Y|SHGncJ^??mFg{+<@FjC;-G z5oa2aZDshi(97J1N0hXdN?toY1zb~L$Etc zZ+{T}3ngN)VCayLmHs$2FQ+sZ^^=sce-P%f@0g614E2TwdP9BD-f%2d@kTgVJ3ZEz zy50*^r6>m`73*p<*{r5KI;&>>yk$RqLYPtJ1XBEA#`($zxE@dTl#h{7yXGq@xppg8 zDsS>(+Px_uTiW-7A5t=k%FW~GP%PGGzJHO+3MtrNioeB=mi7|i+xb++`%A}Wh*?Q3 z?i6h1t&&HYk}{cO&r$m0epiw5Q|}|v5N!N63wKp1lVrhTWGGY68rv%k$!L;M8~m?l z?7!W3a9lf|5xKONHX*a-Y<(x`Bvp8m!#ST6-#|FrALqp+EmC|$y8rOEc}06C1%Kno z*<}k za0B5!t|R&H-SFCKKk`gUlWiZr?SIGix;I+x!sysgI<2C@^sX@L=g~Ncu7Rz-$9Oa{ zbT}3@cROsQkHeVK67{A|`ECSnGHLg&^@*+z!g^0TvIq$4Est83U|r1R5ZMvgD+}yW zm0891BD;R|O7ZVs=(nG5FFq{(zNx>tw7tA!Jh{L9(GU8Kzr#!9UC+FWaDR_*k8sb6 zHth8nUFgLROWJwVm!9>di%cbY@w}#>W(83>Dqn(l4@ow>H7`S5z-OTEp6`|6qUyqJVm4n zqI?Dvq5`kTH!)Swu z>WJ!y>iY=QN5{ty)e+S@w1}>F@h;@nkwHB(DB?NdIpX;~!t*gzIV;I2oa=!x_)d+% zmn!2C*Adqft?RkOSs$eJ--n1B?_cM?cWYV2K6aQs=rtP06eMkU8-LdXRYQg8nUolR zZ&Ca`h)n94Nzq$JZymk$edMiANOS0^d$*4e)SCv|BmJonoDgrmoWIz)Vi*@+%!6ro*hawkeX{C<>pf<9782|4soJQLez(g144c~&b zH@`zR8e<#r5uap#6Qe2{RW>OgM^WdsG98VIsiG~@LX6rRg?}1~!YcwDvBhhmerdDLlMPcA;l)1`ljs`YQkST5;uN;rTivUa#+T z31sFICj?&PJu@Wdq-0O|0B7sUWA+_R_U=Z7xc@LkSXWc2ut>zGA`$G@Y{?$&L<3{Z zVk>GE2bk@%*R~uE$A*SR!seb2wJLb{-Vl|Ea(>K}8r23v!JxGq3JNudI^Nw30Hbuj zqc%1gAb)COqk-KDpQIktzR~;|K*gTs-le3K(G_j4A!=5=Xmf2nD5ms{XMNo=$)46b0Y;%PP^grnD$wLh zkY%o{F%%~?Gb@VO6XH3I+k<8vj~phcy`1fMR+ttKtD-P_Se#N+(f00wlvWmo71%3P z$=KeSmE@cz;?1QuPNgYkP?rK z&{NB=Ptey6z%8UdoX=^er0E%LR8G^ga!h*ds&@%G$7GXMw*uAz?$W^LcWvX zy)&jYhQKx2-FyPIK_*xUlJ`s;Iur``_Xgp=P$Cu!h7Ji?>5o%nIV43+O6flcbAQ=) zOsP!9LZM(d78-zG@L#-tAYAcwI2o*|&ye-@JL}PEgM>UTo=b%C8()!R`rTiH>@WSr zPqh>3$U^&@g`CX?Vv@_lGh%8s!Rj-NXDeWkg9VN{33{$fh;KO@?rBp?9#b+>N*q1H zS?cxg`p4_W^~KR6HJNJPxN>33Jb#1Q7C;-!rv08D#Ht?54`P0>yYqus)kF6P^E%4j z#UwJU>fy1FR7Mn3lBSrFGGJpKr9UJ%0$~gj=CwhqMSvweJ#|qHOL`Ep5wg1*veSYl zU?HyeLR@rfP)D|1M`F`LDY%%szzxHa74Ab-IMa~wVM*0yjtJ*bVR~1XmVcn7%@Vh6 zgoZv2XXU!Ab!*DqM%kl~8z(7smb~QwaX7Hw!;(*{B7!4=BZBWI1pfItaLjXqrCtM?yx1;2#L?LS*USY{Dws(Xd>3K)&M(pl5 z?8fpn_aKDO&8FbEOE(~NBXsXY=+ZnO%*%-BFu0-AuII9J$i>i%xH&Vk$)(hjY!0Yzdp<;l4#%QH zrl-@wt#BBK7k|E-fAfQWYYQ>mGmj#sBc@|{+x{qT1228_$cg#6NfB$*5!Dk_s+RDYT@?y{9!U%ipv{EUq4YIe(ME9tzDaJ&Bs+3h5>YwDw(Rq(x^ zzgtY$UFW{lLs{hS%8_~=`MXgigX~?U_0`<{;BWJa_RelZZnDE`->AxcO+>pk=R(H} z9W!*y_KjmUrYdJ)Ye@9WFy3nJ3dw8sD#w4c(qpI`Qp^IZ`hTNG`mc`*%NH@;>M`Dm z*+8GOf&Y$X5}HYEH&?8Hn(2Ps-`71_Q)R-`ZgtCNz34NR z+2^@*_T#Z@ci#$rGq<(7bX~x;O!YZAd~)y%V2{J30k=^3Nguxxy%ZH7Riy zUJX%ogK-TLVuc$gszeHjigQI01-(Wy1w96=dP+$4i@z{QS2N9YIJOZP;0ui&LV<7+o@C7@7@n7tbA z{QJ$Y92Z-23j16!vq%XI)Yfp*apAHltFBVytyd>_u;pg{_TZwgE-5064<9k>OedE1dXq(k~rLqtc;&k#`GLpK~%LB zmP<$r8|(S818FK$2d?KUnfFo`{Z)7WA3gH_RU`Zv%FhJlG!Jr2;nPedhWOv^dJbsY%5@#kF~-V&1Z$bV*f)U;Z?>-|p{=E4Cww z!j0&Gx69u0rM~ZfmnSc$f4@y^gsYO2vPhvo`iFkhZe1Wkh$7|^2m3`Yl;VvU6QgOQ}5e9J9z{Rk>oMe98bp(w# z0y;Pkt8Y(UFUMo>@RHTAYx!>yHYf(|jjEs*bf^=%dX#9Zs>Ch~ZPq3A&f&Y9c%2Gd zWB)UFeACOqM=v-lcy0xt1uv>dLGLs*IZ-65Qk2J2Q$yqKweRKkan@p;s5eQ8S^uqP znhBvj@cV3|rUsp+z-X5cFxL;es;KR@Xds2Aznu!&hpGHz!|iiOIMRvkpP?|RN6;;~ zO7-Rwz`Uss^LQj+5X_>NpD$~%W5{`Xd)8yv|!-5Qv6h|bG+T=LVs|;4r_GOL*7UfvNzr23Y2!V}XD`goL zZM3QapiOE-d%NBx?jETp;F>YGZyF#Iz4}|x1%J)|&q{&^i6dWeLmu_}16lzZl!50M zaS%4{`SK%Gbw;xL(TJx_*^>e1%Z?e zRpDCrB42-6*8OzMnXBEyau#XL0wh&Ttoizg{S;Bo)P0`a!@OFyA=e#a_DAglJUNp_ zzU?J4s&^aD^mbu*d7@dfQdVUHuVe<}_#@i*@xaH`TDPYE0Pm5vt!a*kGA{Gd4S}yd zIB+R?Mof1Q9mZeytwwE}WP3WjweeMeZ#nfIxdzHSdbNm=E z9b8JPmY4T=j0Z!pAE{`;xj6NiMA-}RW6Rg84ifqPl8$E%p4P8}>=G9C6~dr~eJkTm zjcqE`P2K~e50(VpLDOUORBV1?=!@VwDqm*N-jhUo!#ZtlP6Yx-F1nQB`es zAA&dT13xKs*A;3^&|9b@TQ2(UxKCQq9$sBczUNw|b6BjmPNaz!dybmX(-z&{WWM+s zGzhtr_tH?kPSvBws7EYPTJ;0doXLG|#P<`rZ_-iMtvrXnu^e zHmwon6rCil_OM)WN1plYnardl; zX>_?~PCgYj^g3er6Z-cWzeCn|?C$1@WryfmOxGmq`7mowYj@H0wX)2AYsuTc>pCXe zZikXh>T3e(2bT@o_&bh=SaQ7*kAMs+*Q{qK0bao5bkIsMIu;`Xg6}qhp_!O6M4w2= z8psQb9%ok^JxebkCcz4@+<|vDKkL&AqqrdxC_j`hV2q8|p)z6s{MA%5@V*xmqj~8{ zr9|hA6Hs7M46oi!WHtw3X#R;aDFFuV8SUQ`9Lz}Dgl;Y2^+RL($4=vm_;`eUsNpIN zX)j_4u5JI+@-SA;#@9hSQeG{sjauK-x{?BB7@FdRCR2T$muv}-YXAB6kcZEYO{w9F zDSG|cr8y*l=#Wc?!NkWM5u8tzo^C197(ML>RaO*gAbgdLxwH@>kR{{-DXQuRql}uYx?G(0)aB(R z@weTW{(}upbY*RZ?dpQJ)wFIl3UI8U$${loD(^K}7{Drpw$oxtY=T1rA9LenMZb!a zGA*CX=T^H$R}Q9|abtZY{3@;WdN_punpnZ{4E zqH&b^vPG*mThO!nX3J7C=rzB=SIv^yf}4KL8Rrzmo{l)URo!_a z(I>pyJ$WLIRKC@2;qorGOB<7vnelPB{noIBCi1BH40#vpc5q{HzT$W4RA|KtCZ5S* z#TZ$sL?Or_h~EHZ@kz3lh+R1+)uJ2+xF~e@EUApru6$%CE3mkJ3?C`h9f;e7Sk&v< zJYo}0_rKvW0bmBOJaX-Hs>(q2NKKxllo&xtw$g^}%v@)Bs#lbSzFiU!X5s{;TSe3t zMItt;7#z^p%gDe7U3oMj4K4}WG+i!WJZCvw@suOGP(m^p$2(Pa50diGo;&}2!!DtdTeKCILR z5qHA>zQZNKiin{;yn>uDVVS^;7frt=)&I0x2`s8v3rV61pRixx-A}jqEi{~SZZ%?% z-Uq=4f)i*(T%1*xufj(o&0cDSV>8qO}VseNaP#jd!fcyKr z*%|FC%Olzz{4eq+bOx;>`0gzs&{xTBulauOiQhE-M-FC$9anHm zmFB}%(KxEOvAODtIVqM+8j`bh?DsfG08(NRcn7DgTM4^^f-h$QcU)2#+vN-OJTY0k z1r5?&5o-CFUW#}Df{%o~!@7IqbFv0Dj>38$yeUHC3d=J1h*Wp~xjievwsbN!uyVhx z-XOt{;us~CI6o`Y@!oP5kdcXTp>MlCb5_Bfj0FrnYN zSNAyf@n}dD(~{m=C=CTmN=JSRLmv~B9oD=F1>t9kC=^G^Fjs1su=oSFA4#QLCiz?t zB%F22u-*?9#d>c1by2NajyD+L7i;`@6(A)mv@*9ftr zaDAwGdoMnkn+=*lRw$MBM6C6FZls1pRdkjSUiJGnNU4X%pF4N^S5iAy>u;96UtZa( z7UeeTIr=bsn4sB1{1xu&`sy8SD8lqt=`F1+qNs_w95@VKp)O7)YLPvXBzKhtyH%%v{>Kb-9V+n1L6R}5;F^?R!isBnDIPobHoZiZ{x-*3JbJl=%7S=?|D9O za4K%pv>tX5*GiDHX`2pZgCBh=(9i+@)m-<@J&A=)eP_m00+G{Li%CRpFm-TRK&kU*6GRIp6|6~n{u4BbY54AH2GI$Lo6UiNIg8i@D_T%I72O9+HZe} z6AeG<>rHa4?Urrr&n?&s-6}=i&9QGyCu;;TJ^s8(q9rfl4~%RWGsVcpFvj8E zsq0IWuKVo$0)-+=#8sB)@hG-K=!`96Rm|1SGqv$X@Pf%Yu)}-dkPaQNPshujK{;cL zAM6v<`asg)jVS2FStb)pLFsS9K#a-l5P+@&cg>5`k?78rsFmi|jP_U=gWyrsN;c(5 zV*jll`CL{Ur3;kB4qhlJLL0){wpA235LR-3FV-B_BA>`9Vsrx;RHqKqty5~sS8BSw zQh?w6?DIa$8_UT`qUZZ9BiC#)|AgkUqp!fawJL zzBj3UHJU2U8j`%jTYrIzmc6UFPIzFkA7`0q8t!s^YkGFsqtg;z@BDcYh6^+6|K$(0 zA1fC(8WOE}-6UXGHl^&4Wx5qDg6Y-jY~G$*$ikpERr?fHaW%5_{D3L`=6+V`&`H6C zAIHxEIaFBmH#9R0m~)e>zUa8O-F-$MUntO!G^-pp`u%{B<64qz0}*GY>#4ouK67;kqW7*(Ei5BS2A^skclF__ z9e1rL(PSv0;$-oqis|b*5|s$D$->dBVvA`7eqI& z%tjz)&Ej6lN4tf~?;m5&E#{Q-UT(R#?pq;HpAVb?$=a==K^&Xe`$un~-|q4$r1(2T zG^EVqGRtx>68*qEZEO4Fy@2yUgK z!}EaJsG_@`WAdUJ2h{qtnW7t*TTz>6ny4cCdF63;X1R)0`pUo9D67nFXB5m@Y0$9O zQoVzBh5!@KwP#T+6)%UD?OPvIdePfzcjFf(GIwn;%R}(_d-hQdFGd-^!#RT*iqFsZ z+@(0beal;KEm{xOTluPE+DgHEYG%RN4h$%$2kbm@y;Q?abmMzI>QP19 zVKUL#M`LuuW(5TK~l2`yf(!X^`6?FA-d#NUbG=14CxpZ9Q6Qwbts;Y0S z5lr)9>zkv|bhG!8D0c2wzjZIoA^Z8vkVv%P+B8?u055Arl88n-m8|dfVbMLiB@yvI zr&3&5b*zH0vJ-!2dBjgx7`dZ}e+Nd4aLSaCEqKW*AiVat@piJWe^x|(uEvSO&Y?W# zf6pN@dxX3hX<)>?9!(aa*cgnQh(_U^X~f z?cP=Iocl)czHb!!mbbhV(xh3L#cn9ZcUkp-yV3E%vlKrsEGWCsiO)oAFwH3r_%U7} zh8>KbObg|06jTFeSRRjY>Hzc;1)X2xyJ}rmB6#LMVr3slcL(w;)=$`(*yzlMf`| zDtqq8jcS3F0W>~s!1x&E;X&A>RK08HfJH15s{STTvnoG~ zHaZm1n*u)a9h^b{1urH=!$Jr3-(aRN z)$@NOAQ}i0fsg;V|J2m83XMa=!9{y&Ys@Tk~X= zc{}Uea)d{p2Q_m-4CSo0y=owL&2_irexUKrR;y3Hj+m1k7ImG5$QeOs1Mf$T8}~cx zqlh_qbiR{q6PkF-Jm)zJ%oiF!!BT0ML>k%x9 zK;bAWGg0sdzZu6(X*l_l&llWnn)=%VFP09d0L}$FAHUU}MVxsl0B=9*`7?DMC-YxL zTW|}z*9(F<2@KMBYmHj!|6=tWThZ8>ESvfzoKRoQiXwAR;$?mL@_j^v)@7t-9mf^8 zK~e?Ko`?Vq>5t$5mA8+>xO~H^%L(T)ZbTn?>fX?~$vFx_2Zm6Yo%cwC+e$3pJv})I zeXx!*L=NN}lu#u0Kt)o;e3W}w({FTQ6a4j9$->cvH<~IF4lhWbfKU=kgE;S(xjZ&4 zgSRVs8e-e;mpl*w$Q>#Dy0a-(A>vrN&PX7v{cgGeR-Wv1mE`bonVScFZtej`la5evhIbZLoV$ZMyw zJU-BjBBE@Ef85fhJfDMuWdaiW5;mAha^ENV>FI@L>y`HCCUW?j#A zC8kTWydSLN4*jO5YF$~z-V*=>_dUbgeL8FKl0dWZy0Y{y_V0DVLO;gI2?O5J%KH3C z3qC3jevszT_0tVc7qoB_ls~}_t~t zz1s}eHa^BGnXF5aT$ipabGY`F}5<6vi{?80{_UIT|+AO7+GLj z`>LTz)tb+rbcNMFUfetBW#*jyo=eV7LC`qOJF|j*Ppm!1rA6Y_WVvG#8jQFYdFD^q ztnrt-Ic7+zK|?C^@dov<&BdpvoV&c0^p`ukvO-t$K1+bX-Ln$MG_2bHD4bg}e<_^b z{!%ze1cB>R(_%ig3KiF=g1Sww)jiD!Q zWpe&tXDJ+*VEX>I0IL&63taiVxr7K)DaAHPGw~!eh4e97cY5!DvzKIV&$4!B;}6CM z$}cqYpg{r@x+M^lU>8ITeb@tWqSDWSkf7^FAX2FGK8OY|vM-n1U5)ufB9=H1xl>qe8S& M#M#ef#9Wa67Zya9^Z)<= -- Gitee From a94e167dc81d72ed12bd1c1d420cda57b1aace1b Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 1 Jul 2022 10:12:01 +0800 Subject: [PATCH 19/19] update:CHANGELOG --- CHANGELOG | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index b07e438..86ef0f4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,15 @@ +XEngine_APIService V2.2.0.1001 + +添加:为p2p处理增加post方法 +添加:p2p协议模块解析和打包支持 +添加:帮助模块的p2p客户端 +修改:http参数名 + +added:post with p2pclient +added:p2p protocol parse and packet +added:p2p client for help module +modify:parament name +====================================================================================== XEngine_APIService V2.1.0.1001 添加:插件系统支持 -- Gitee

qU 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