From 769ea96ee77c1adfbed29c4083b1f55ebd2f4025 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 17 Apr 2023 15:12:30 +0800 Subject: [PATCH 01/13] update:match xengine v8.10 --- .../APIHelp_Api/APIHelp_Api.cpp | 38 +++---- .../APIHelp_Distributed.cpp | 60 ++++++------ .../StorageModule_APIHelp/dllmain.cpp | 2 +- XEngine_Source/StorageModule_APIHelp/pch.h | 6 +- .../Config_Json/Config_Json.cpp | 42 ++++---- .../StorageModule_Config/dllmain.cpp | 2 +- .../Database_File/Database_File.cpp | 46 ++++----- .../Database_Help/Database_Help.cpp | 20 ++-- .../StorageModule_Database/dllmain.cpp | 2 +- .../Protocol_StoragePacket.cpp | 24 ++--- .../Protocol_Parse/Protocol_StorageParse.cpp | 36 +++---- .../StorageModule_Protocol/dllmain.cpp | 2 +- .../Session_Stroage/Session_DLStroage.cpp | 46 ++++----- .../Session_Stroage/Session_UPStroage.cpp | 50 +++++----- .../Session_User/Session_User.cpp | 16 +-- .../StorageModule_Session/dllmain.cpp | 2 +- .../XEngine_StorageApp/StorageApp_Center.cpp | 48 ++++----- .../XEngine_StorageApp/StorageApp_Config.cpp | 6 +- .../StorageApp_Download.cpp | 68 ++++++------- .../XEngine_StorageApp/StorageApp_Hdr.h | 8 +- .../XEngine_StorageApp/StorageApp_Network.cpp | 54 +++++----- .../XEngine_StorageApp/StorageApp_Network.h | 6 +- .../StorageApp_UPLoader.cpp | 98 +++++++++---------- .../Storage_APPTask/Storage_TaskManage.cpp | 74 +++++++------- .../Storage_APPTask/Storage_TaskPass.cpp | 6 +- .../XEngine_StorageApp/XEngine_StorageApp.cpp | 30 +++--- 26 files changed, 396 insertions(+), 396 deletions(-) diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp index f0975b2..fbe7bb8 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp @@ -63,21 +63,21 @@ BOOL CAPIHelp_Api::APIHelp_Api_ProxyAuth(TCHAR* ptszUser, TCHAR* ptszPass, TCHAR memset(tszAuthStr, '\0', MAX_PATH); memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); //是否有验证信息 - if (!RfcComponents_HttpHelp_GetAuthInfo(&pptszListHdr, nHdrCount, tszAuthStr, &nAuthLen, &nAuthType)) + if (!HttpProtocol_ServerHelp_GetAuthInfo(&pptszListHdr, nHdrCount, tszAuthStr, &nAuthLen, &nAuthType)) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTAUTH; return FALSE; } //是否是BASIC if (1 != nAuthType) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTSUPPORT; return FALSE; } OPenSsl_Help_BasicDecoder(tszAuthStr, ptszUser, ptszPass); - return TRUE; + return true; } /******************************************************************** 函数名称:APIHelp_Api_RangeFile @@ -127,7 +127,7 @@ BOOL CAPIHelp_Api::APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64 memset(tszValueStr, '\0', sizeof(tszValueStr)); memset(tszFieldStr, '\0', sizeof(tszFieldStr)); //是否有范围 - if (RfcComponents_HttpHelp_GetField(&pptszListHdr, nHdrCount, lpszRangeStr, tszFieldStr)) + if (HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, lpszRangeStr, tszFieldStr)) { //是否没有找到 int nBPos = 0; //某些时候有个BYTE @@ -137,7 +137,7 @@ BOOL CAPIHelp_Api::APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64 } if (!BaseLib_OperatorString_GetKeyValue(tszFieldStr + nBPos, "-", tszKeyStr, tszValueStr)) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARSELEN; return FALSE; } @@ -158,26 +158,26 @@ BOOL CAPIHelp_Api::APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64 *pInt_SPos = _ttoi(tszKeyStr); *pInt_EPos = _ttoi(tszValueStr); } - bFound = TRUE; + bFound = true; } if (0 == *pInt_Count) { - if (RfcComponents_HttpHelp_GetField(&pptszListHdr, nHdrCount, lpszLengthStr, tszFieldStr)) + if (HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, lpszLengthStr, tszFieldStr)) { *pInt_Count = _ttoi64(tszFieldStr); - bFound = TRUE; + bFound = true; } } if (!bFound) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTLENGTH; return FALSE; } - return TRUE; + return true; } /******************************************************************** 函数名称:APIHelp_Api_VerHash @@ -210,19 +210,19 @@ BOOL CAPIHelp_Api::APIHelp_Api_VerHash(LPCTSTR lpszFileHash, TCHAR** pptszListHd TCHAR tszValueStr[MAX_PATH]; memset(tszValueStr, '\0', MAX_PATH); - if (!RfcComponents_HttpHelp_GetField(&pptszListHdr, nHdrCount, lpszKeyStr, tszValueStr)) + if (!HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, lpszKeyStr, tszValueStr)) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTHASH; return FALSE; } if (0 != _tcsnicmp(lpszFileHash, tszValueStr, _tcslen(lpszFileHash))) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTMATCH; return FALSE; } - return TRUE; + return true; } /******************************************************************** 函数名称:APIHelp_Api_GetIPInfo @@ -258,14 +258,14 @@ BOOL CAPIHelp_Api::APIHelp_Api_GetIPInfo(LPCTSTR lpszMsgBuffer, int nMsgLen, XEN std::unique_ptr const pSt_JsonReader(st_JsonBuilder.newCharReader()); if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARSE; return FALSE; } //是否获取成功 if (0 != st_JsonRoot["code"].asInt()) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_CODE; return FALSE; } @@ -282,7 +282,7 @@ BOOL CAPIHelp_Api::APIHelp_Api_GetIPInfo(LPCTSTR lpszMsgBuffer, int nMsgLen, XEN _tcscpy(pSt_IPAddrInfo->tszIPISP, st_JsonObject["tszIPISP"].asCString()); _tcscpy(pSt_IPAddrInfo->tszIPTime, st_JsonObject["tszIPTime"].asCString()); - return TRUE; + return true; } /******************************************************************** 函数名称:APIHelp_Api_UrlParse @@ -349,5 +349,5 @@ BOOL CAPIHelp_Api::APIHelp_Api_UrlParse(TCHAR*** ppptszList, int nListCount, TCH _tcscpy(ptszKeyName, tszValue); } } - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp b/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp index 1addda3..4aedacb 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp @@ -54,7 +54,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_Lis if (!pStl_ListAddr->empty()) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARAMENT; return FALSE; } @@ -73,7 +73,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_Lis { if (xhToken == i) { - bFound = TRUE; + bFound = true; _tcscpy(ptszAddr, stl_ListIterator->c_str()); break; } @@ -90,7 +90,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_Lis { if (nRandomFront == i) { - bFound = TRUE; + bFound = true; _tcscpy(ptszAddr, stl_ListIterator->c_str()); break; } @@ -107,7 +107,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_Lis { if (nRandomBack == i) { - bFound = TRUE; + bFound = true; _tcscpy(ptszAddr, stl_ListIterator->c_str()); break; } @@ -116,11 +116,11 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_Lis if (!bFound) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTFOUND; return FALSE; } - return TRUE; + return true; } /******************************************************************** 函数名称:APIHelp_Distributed_FileList @@ -151,7 +151,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_FileList(list if ((NULL == pStl_ListParse) || (NULL == pppSt_ListPacket)) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARAMENT; return FALSE; } @@ -163,7 +163,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_FileList(list APIHelp_Distributed_FileListParse(stl_ListIterator->tszMsgBuffer, stl_ListIterator->nMsgLen, (*pppSt_ListPacket)[i]); } *pInt_ListCount = pStl_ListParse->size(); - return TRUE; + return true; } /******************************************************************** 函数名称:APIHelp_Distributed_DLStorage @@ -194,7 +194,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_DLStorage(LPCTSTR lpszMsgBuffer, if ((NULL == lpszMsgBuffer) || (NULL == pSt_StorageBucket)) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARAMENT; return FALSE; } @@ -208,14 +208,14 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_DLStorage(LPCTSTR lpszMsgBuffer, { if ('/' == lpszMsgBuffer[i]) { - bFound = TRUE; + bFound = true; memcpy(tszKeyStr, lpszMsgBuffer + 1, i - 1); break; } } if (!bFound) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTFOUND; return FALSE; } @@ -225,19 +225,19 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_DLStorage(LPCTSTR lpszMsgBuffer, { if (0 == _tcsncmp(tszKeyStr, stl_ListIterator->tszBuckKey, _tcslen(tszKeyStr))) { - bFound = TRUE; + bFound = true; *pSt_StorageBucket = *stl_ListIterator; break; } } if (!bFound) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTFOUND; return FALSE; } _tcscpy(pSt_StorageBucket->tszFileName, lpszMsgBuffer + i); - return TRUE; + return true; } /******************************************************************** 函数名称:APIHelp_Distributed_UPStorage @@ -268,7 +268,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_UPStorage(listtszBuckKey, stl_ListIterator->tszBuckKey, _tcslen(pSt_StorageBucket->tszBuckKey))) { - bFound = TRUE; + bFound = true; *pSt_StorageBucket = *stl_ListIterator; break; } } if (!bFound) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTFOUND; return FALSE; } @@ -340,7 +340,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_UPStorage(listtszBuckKey, _tcslen(lpszBuckKey))) { _tcscpy(ptszFilePath, stl_ListIterator->tszFilePath); - bFound = TRUE; + bFound = true; break; } } if (!bFound) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTFOUND; return FALSE; } - return TRUE; + return true; } ////////////////////////////////////////////////////////////////////////// // 保护函数 @@ -518,7 +518,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_FileListParse(LPCTSTR lpszMsgBuff std::unique_ptr const pSt_JsonReader(st_JsonBuilder.newCharReader()); if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) { - APIHelp_IsErrorOccur = TRUE; + APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARSE; return FALSE; } @@ -539,7 +539,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_FileListParse(LPCTSTR lpszMsgBuff break; } - return TRUE; + return true; } /******************************************************************** 函数名称:APIHelp_Distributed_GetSize diff --git a/XEngine_Source/StorageModule_APIHelp/dllmain.cpp b/XEngine_Source/StorageModule_APIHelp/dllmain.cpp index daed8c8..0745b19 100644 --- a/XEngine_Source/StorageModule_APIHelp/dllmain.cpp +++ b/XEngine_Source/StorageModule_APIHelp/dllmain.cpp @@ -14,6 +14,6 @@ BOOL APIENTRY DllMain( HMODULE hModule, case DLL_PROCESS_DETACH: break; } - return TRUE; + return true; } diff --git a/XEngine_Source/StorageModule_APIHelp/pch.h b/XEngine_Source/StorageModule_APIHelp/pch.h index 05fb3f5..08e564e 100644 --- a/XEngine_Source/StorageModule_APIHelp/pch.h +++ b/XEngine_Source/StorageModule_APIHelp/pch.h @@ -36,8 +36,8 @@ using namespace std; #include #include #include -#include -#include +#include +#include #include "../XStorage_Protocol.h" #include "../StorageModule_Config/Config_Define.h" #include "../StorageModule_Database/Database_Define.h" @@ -60,7 +60,7 @@ extern DWORD APIHelp_dwErrorCode; #ifdef _WINDOWS #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") #pragma comment(lib,"XEngine_Core/XEngine_OPenSsl") -#pragma comment(lib,"XEngine_RfcComponents/RfcComponents_HttpServer") +#pragma comment(lib,"XEngine_RfcComponents/RfcComponents_HttpProtocol") #pragma comment(lib,"XEngine_SystemSdk/XEngine_SystemApi") #ifdef _DEBUG #ifdef _WIN64 diff --git a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp index 8736432..c8c8e63 100644 --- a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp +++ b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp @@ -46,7 +46,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG if ((NULL == lpszConfigFile) || (NULL == pSt_ServerConfig)) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARAMENT; return FALSE; } @@ -57,7 +57,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG FILE* pSt_File = _tfopen(lpszConfigFile, _T("rb")); if (NULL == pSt_File) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARAMENT; return FALSE; } @@ -77,7 +77,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG std::unique_ptr const pSt_JsonReader(st_JsonBuilder.newCharReader()); if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nCount, &st_JsonRoot, &st_JsonError)) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARSE; return FALSE; } @@ -89,7 +89,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG if (st_JsonRoot["XMax"].empty() || (6 != st_JsonRoot["XMax"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XMAX; return FALSE; } @@ -103,7 +103,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG if (st_JsonRoot["XTime"].empty() || (5 != st_JsonRoot["XTime"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XTIME; return FALSE; } @@ -116,7 +116,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG if (st_JsonRoot["XLog"].empty() || (3 != st_JsonRoot["XLog"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XLOG; return FALSE; } @@ -127,7 +127,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG if (st_JsonRoot["XSql"].empty() || (5 != st_JsonRoot["XSql"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XSQL; return FALSE; } @@ -141,7 +141,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG if (st_JsonRoot["XStorage"].empty() || (3 != st_JsonRoot["XStorage"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XSTORAGE; return FALSE; } @@ -152,7 +152,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG if (st_JsonRoot["XProxy"].empty() || (2 != st_JsonRoot["XProxy"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XPROXY; return FALSE; } @@ -171,7 +171,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG if (st_JsonRoot["XLimit"].empty() || (5 != st_JsonRoot["XLimit"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XSTORAGE; return FALSE; } @@ -184,7 +184,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG if (st_JsonRoot["XP2xp"].empty() || (3 != st_JsonRoot["XP2xp"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_P2XP; return FALSE; } @@ -195,7 +195,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG if (st_JsonRoot["XCert"].empty() || (6 != st_JsonRoot["XCert"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_CERT; return FALSE; } @@ -215,7 +215,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG if (st_JsonRoot["XVer"].empty()) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XVER; return FALSE; } @@ -226,7 +226,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG { pSt_ServerConfig->st_XVer.pStl_ListStorage->push_back(st_JsonXVer[i].asCString()); } - return TRUE; + return true; } /******************************************************************** 函数名称:Config_Json_LoadBalance @@ -252,7 +252,7 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON if ((NULL == lpszConfigFile) || (NULL == pSt_ServerConfig)) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARAMENT; return FALSE; } @@ -263,7 +263,7 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON FILE* pSt_File = _tfopen(lpszConfigFile, _T("rb")); if (NULL == pSt_File) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARAMENT; return FALSE; } @@ -283,7 +283,7 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON std::unique_ptr const pSt_JsonReader(st_JsonBuilder.newCharReader()); if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nCount, &st_JsonRoot, &st_JsonError)) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARSE; return FALSE; } @@ -291,7 +291,7 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON if (st_JsonRoot["LBDistributed"].empty() || (4 != st_JsonRoot["LBDistributed"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_LBDISTRIBUTED; return FALSE; } @@ -303,7 +303,7 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON if (st_JsonRoot["LBLocation"].empty() || (4 != st_JsonRoot["LBLocation"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_LBLOCATION; return FALSE; } @@ -315,7 +315,7 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON if (st_JsonRoot["LoadBalance"].empty() || (4 != st_JsonRoot["LoadBalance"].size())) { - Config_IsErrorOccur = TRUE; + Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_LAODBALANCE; return FALSE; } @@ -358,5 +358,5 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON pSt_ServerConfig->st_LoadBalance.pStl_ListBucket->push_back(st_Bucket); } - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Config/dllmain.cpp b/XEngine_Source/StorageModule_Config/dllmain.cpp index daed8c8..0745b19 100644 --- a/XEngine_Source/StorageModule_Config/dllmain.cpp +++ b/XEngine_Source/StorageModule_Config/dllmain.cpp @@ -14,6 +14,6 @@ BOOL APIENTRY DllMain( HMODULE hModule, case DLL_PROCESS_DETACH: break; } - return TRUE; + return true; } diff --git a/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp b/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp index 571a0ca..efb1493 100644 --- a/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp +++ b/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp @@ -48,7 +48,7 @@ BOOL CDatabase_File::Database_File_Init(DATABASE_MYSQL_CONNECTINFO *pSt_DBConnec if (NULL == pSt_DBConnector) { - Database_IsErrorOccur = TRUE; + Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_INIT_PARAMENT; return FALSE; } @@ -60,22 +60,22 @@ BOOL CDatabase_File::Database_File_Init(DATABASE_MYSQL_CONNECTINFO *pSt_DBConnec #endif //连接数据库 _tcscpy(pSt_DBConnector->tszDBName, _T("XEngine_Storage")); - if (!DataBase_MySQL_Connect(&xhDBSQL, pSt_DBConnector, 5, TRUE, lpszStrCharset)) + if (!DataBase_MySQL_Connect(&xhDBSQL, pSt_DBConnector, 5, true, lpszStrCharset)) { - Database_IsErrorOccur = TRUE; + Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); return FALSE; } - bIsRun = TRUE; + bIsRun = true; pSTDThread = make_shared(Database_File_Thread, this); if (!pSTDThread->joinable()) { - Database_IsErrorOccur = TRUE; + Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_INIT_THREAD; return FALSE; } - return TRUE; + return true; } /******************************************************************** 函数名称:Database_File_Destory @@ -91,7 +91,7 @@ BOOL CDatabase_File::Database_File_Destory() if (!bIsRun) { - return TRUE; + return true; } bIsRun = FALSE; @@ -103,7 +103,7 @@ BOOL CDatabase_File::Database_File_Destory() } } DataBase_MySQL_Close(xhDBSQL); - return TRUE; + return true; } /******************************************************************** 函数名称:Database_File_FileInsert @@ -129,7 +129,7 @@ BOOL CDatabase_File::Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, if (NULL == pSt_DBManage) { - Database_IsErrorOccur = TRUE; + Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_INSERTFILE_PARAMENT; return FALSE; } @@ -138,7 +138,7 @@ BOOL CDatabase_File::Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, if (Database_File_FileQuery(&ppSt_ListFile, &nListCount, NULL, NULL, NULL, NULL, NULL, pSt_DBManage->st_ProtocolFile.tszFileHash)) { BaseLib_OperatorMemory_Free((void***)&ppSt_ListFile, nListCount); - return TRUE; + return true; } TCHAR tszSQLQuery[2048]; memset(tszSQLQuery, '\0', sizeof(tszSQLQuery)); @@ -167,11 +167,11 @@ BOOL CDatabase_File::Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, if (!DataBase_MySQL_Execute(xhDBSQL, m_StrSQL.c_str())) { - Database_IsErrorOccur = TRUE; + Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); return FALSE; } - return TRUE; + return true; } /******************************************************************** 函数名称:Database_File_FileDelete @@ -207,7 +207,7 @@ BOOL CDatabase_File::Database_File_FileDelete(LPCTSTR lpszBuckKey /* = NULL */, if ((NULL == lpszFileName) && (NULL == lpszHash)) { - Database_IsErrorOccur = TRUE; + Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_DELETEFILE_PARAMENT; return FALSE; } @@ -226,13 +226,13 @@ BOOL CDatabase_File::Database_File_FileDelete(LPCTSTR lpszBuckKey /* = NULL */, if (!DataBase_MySQL_Execute(xhDBSQL, tszSQLStatement)) { - Database_IsErrorOccur = TRUE; + Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); return FALSE; } } - return TRUE; + return true; } /******************************************************************** 函数名称:Database_File_FileQuery @@ -293,7 +293,7 @@ BOOL CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFi if ((NULL == lpszHash) && (NULL == lpszFileName)) { - Database_IsErrorOccur = TRUE; + Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_QUERYFILE_PARAMENT; return FALSE; } @@ -326,7 +326,7 @@ BOOL CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFi } if (!DataBase_MySQL_ExecuteQuery(xhDBSQL, &xhTable, tszSQLStatement, &nllLine, &nllRow)) { - Database_IsErrorOccur = TRUE; + Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); return FALSE; } @@ -444,7 +444,7 @@ BOOL CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFi //是否为空 if (stl_ListFile.empty()) { - Database_IsErrorOccur = TRUE; + Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_QUERYFILE_EMPTY; return FALSE; } @@ -457,7 +457,7 @@ BOOL CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFi } *pInt_ListCount = stl_ListFile.size(); stl_ListFile.clear(); - return TRUE; + return true; } ////////////////////////////////////////////////////////////////////////// // 保护函数 @@ -511,12 +511,12 @@ BOOL CDatabase_File::Database_File_CreateTable() if (!DataBase_MySQL_Execute(xhDBSQL, tszSQLQuery)) { - Database_IsErrorOccur = TRUE; + Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); return FALSE; } } - return TRUE; + return true; } /******************************************************************** 函数名称:Database_File_TimeDay @@ -556,7 +556,7 @@ BOOL CDatabase_File::Database_File_TimeMonth(LPCTSTR lpszStartTime, int* pInt_Mo *pInt_Month = nEndTime - nStartTime; } - return TRUE; + return true; } /******************************************************************** 函数名称:Database_File_TimeDel @@ -615,7 +615,7 @@ BOOL CDatabase_File::Database_File_TimeDel() } } DataBase_MySQL_FreeResult(xhDBSQL, xhTableResult); - return TRUE; + return true; } ////////////////////////////////////////////////////////////////////////// // 线程函数 diff --git a/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp b/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp index 6f1d586..3337387 100644 --- a/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp +++ b/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp @@ -60,7 +60,7 @@ BOOL CDatabase_Help::Database_Help_Insert(TCHAR* ptszSQLBuffer, XSTORAGECORE_DBF } _stprintf(ptszSQLBuffer, _T("INSERT INTO `%s` (BuckKey,FilePath,FileName,FileHash,FileUser,FileSize,FileTime) VALUES('%s','%s','%s','%s','%s',%lld,'%04d-%02d-%02d %02d:%02d:%02d')"), tszTableName, pSt_DBFile->tszBuckKey, pSt_DBFile->st_ProtocolFile.tszFilePath, pSt_DBFile->st_ProtocolFile.tszFileName, pSt_DBFile->st_ProtocolFile.tszFileHash, pSt_DBFile->st_ProtocolFile.tszFileUser, pSt_DBFile->st_ProtocolFile.nFileSize, st_LibTimer.wYear, st_LibTimer.wMonth, st_LibTimer.wDay, st_LibTimer.wHour, st_LibTimer.wMinute, st_LibTimer.wSecond); - return TRUE; + return true; } /******************************************************************** 函数名称:Database_Help_Delete @@ -109,7 +109,7 @@ BOOL CDatabase_Help::Database_Help_Delete(TCHAR* ptszSQLBuffer, LPCTSTR lpszTabl Database_Help_Packet(tszSQLQuery, lpszBuckKey, lpszFilePath, lpszFileName, lpszFileHash); _stprintf(ptszSQLBuffer, _T("DELETE FROM `%s` %s"), lpszTableName, tszSQLQuery); - return TRUE; + return true; } /******************************************************************** 函数名称:Database_Help_Query @@ -174,7 +174,7 @@ BOOL CDatabase_Help::Database_Help_Query(TCHAR* ptszSQLBuffer, LPCTSTR lpszTable _stprintf(ptszSQLBuffer, _T("SELECT * FROM `%s`"), lpszTableName); Database_Help_Packet(tszSQLQuery, lpszBuckKey, lpszFilePath, lpszFileName, lpszFileHash, lpszFileUser, lpszTimeStart, lpszTimeEnd); _tcscat(ptszSQLBuffer, tszSQLQuery); - return TRUE; + return true; } ////////////////////////////////////////////////////////////////////////// // 保护函数 @@ -250,7 +250,7 @@ BOOL CDatabase_Help::Database_Help_Packet(TCHAR* ptszSQLBuffer, LPCTSTR lpszBuck memset(tszSQLQuery, '\0', MAX_PATH); _stprintf(tszSQLQuery, _T("BuckKey = '%s'"), lpszBuckKey); _tcscat(ptszSQLBuffer, tszSQLQuery); - bInit = TRUE; + bInit = true; } } //文件路径 @@ -269,7 +269,7 @@ BOOL CDatabase_Help::Database_Help_Packet(TCHAR* ptszSQLBuffer, LPCTSTR lpszBuck memset(tszSQLQuery, '\0', MAX_PATH); _stprintf(tszSQLQuery, _T("FilePath = '%s'"), lpszFilePath); _tcscat(ptszSQLBuffer, tszSQLQuery); - bInit = TRUE; + bInit = true; } } //文件名称 @@ -288,7 +288,7 @@ BOOL CDatabase_Help::Database_Help_Packet(TCHAR* ptszSQLBuffer, LPCTSTR lpszBuck memset(tszSQLQuery, '\0', MAX_PATH); _stprintf(tszSQLQuery, _T("FileName = '%s'"), lpszFileName); _tcscat(ptszSQLBuffer, tszSQLQuery); - bInit = TRUE; + bInit = true; } } //文件HASH @@ -307,7 +307,7 @@ BOOL CDatabase_Help::Database_Help_Packet(TCHAR* ptszSQLBuffer, LPCTSTR lpszBuck memset(tszSQLQuery, '\0', MAX_PATH); _stprintf(tszSQLQuery, _T("FileHash = '%s'"), lpszFileHash); _tcscat(ptszSQLBuffer, tszSQLQuery); - bInit = TRUE; + bInit = true; } } //文件所属用户 @@ -326,7 +326,7 @@ BOOL CDatabase_Help::Database_Help_Packet(TCHAR* ptszSQLBuffer, LPCTSTR lpszBuck memset(tszSQLQuery, '\0', MAX_PATH); _stprintf(tszSQLQuery, _T("FileUser = '%s'"), lpszFileUser); _tcscat(ptszSQLBuffer, tszSQLQuery); - bInit = TRUE; + bInit = true; } } //时间范围 @@ -345,9 +345,9 @@ BOOL CDatabase_Help::Database_Help_Packet(TCHAR* ptszSQLBuffer, LPCTSTR lpszBuck memset(tszSQLQuery, '\0', MAX_PATH); _stprintf(tszSQLQuery, _T("BETWEEN '%s' AND '%s'"), lpszTimeStart, lpszTimeEnd); _tcscat(ptszSQLBuffer, tszSQLQuery); - bInit = TRUE; + bInit = true; } } - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Database/dllmain.cpp b/XEngine_Source/StorageModule_Database/dllmain.cpp index daed8c8..0745b19 100644 --- a/XEngine_Source/StorageModule_Database/dllmain.cpp +++ b/XEngine_Source/StorageModule_Database/dllmain.cpp @@ -14,6 +14,6 @@ BOOL APIENTRY DllMain( HMODULE hModule, case DLL_PROCESS_DETACH: break; } - return TRUE; + return true; } diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp index 07a953d..3f25d68 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp @@ -71,7 +71,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_QueryFile(TCHAR* ptszMsgBuf if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen) || (NULL == pppSt_DBFile)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; return FALSE; } @@ -115,7 +115,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_QueryFile(TCHAR* ptszMsgBuf //打包输出信息 *pInt_MsgLen = st_JsonRoot.toStyledString().length(); memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); - return TRUE; + return true; } /******************************************************************** 函数名称:Protocol_StoragePacket_Info @@ -161,7 +161,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_Info(TCHAR* ptszMsgBuffer, if ((NULL == pppSt_DLInfo) || (NULL == pppSt_UPInfo)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; return FALSE; } @@ -206,7 +206,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_Info(TCHAR* ptszMsgBuffer, //打包输出信息 *pInt_MsgLen = st_JsonRoot.toStyledString().length(); memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); - return TRUE; + return true; } /******************************************************************** 函数名称:XStorageProtocol_Core_REPQueryDir @@ -242,7 +242,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_DirOperator(TCHAR* ptszMsgB if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; return FALSE; } @@ -262,7 +262,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_DirOperator(TCHAR* ptszMsgB //打包输出信息 *pInt_MsgLen = st_JsonRoot.toStyledString().length(); memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); - return TRUE; + return true; } /******************************************************************** 函数名称:Protocol_StoragePacket_BasicAuth @@ -313,7 +313,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_BasicAuth(LPCTSTR lpszMetho if ((NULL == lpszUser) || (NULL == lpszPass)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; return FALSE; } @@ -327,7 +327,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_BasicAuth(LPCTSTR lpszMetho *pInt_MsgLen = st_JsonRoot.toStyledString().length(); _tcscpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str()); - return TRUE; + return true; } /******************************************************************** 函数名称:Protocol_StoragePacket_UPDown @@ -383,7 +383,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_UPDown(TCHAR* ptszMsgBuffer if ((NULL == lpszFileName) || (NULL == lpszClientAddr)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; return FALSE; } @@ -405,7 +405,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_UPDown(TCHAR* ptszMsgBuffer *pInt_MsgLen = st_JsonRoot.toStyledString().length(); _tcscpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str()); - return TRUE; + return true; } /******************************************************************** 函数名称:Protocol_StoragePacket_REQFile @@ -446,7 +446,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_REQFile(TCHAR* ptszMsgBuffe if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; return FALSE; } @@ -468,5 +468,5 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_REQFile(TCHAR* ptszMsgBuffe //打包输出信息 *pInt_MsgLen = st_JsonRoot.toStyledString().length(); memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.cpp b/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.cpp index 43cc634..73401dd 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.cpp +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.cpp @@ -76,7 +76,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_QueryFile(LPCTSTR lpszMsgBuff if (NULL == lpszMsgBuffer) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; return FALSE; } @@ -88,7 +88,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_QueryFile(LPCTSTR lpszMsgBuff //解析JSON if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcslen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; return FALSE; } @@ -144,7 +144,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_QueryFile(LPCTSTR lpszMsgBuff *pxhToken = st_JsonRoot["xhToken"].asUInt64(); } } - return TRUE; + return true; } /******************************************************************** 函数名称:Protocol_StorageParse_ReportFile @@ -186,7 +186,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_ReportFile(LPCTSTR lpszMsgBuf //解析JSON if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + nMsgLen, &st_JsonRoot, &st_JsonError)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; return FALSE; } @@ -234,7 +234,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_ReportFile(LPCTSTR lpszMsgBuf } } *pInt_ListCount = nCount; - return TRUE; + return true; } /******************************************************************** 函数名称:Protocol_StorageParse_DirOperator @@ -270,7 +270,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_DirOperator(LPCTSTR lpszMsgBu if ((NULL == lpszMsgBuffer) || (NULL == ptszUserDir)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; return FALSE; } @@ -282,7 +282,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_DirOperator(LPCTSTR lpszMsgBu //解析JSON if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcslen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; return FALSE; } @@ -295,7 +295,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_DirOperator(LPCTSTR lpszMsgBu { _tcscpy(ptszUserDir, st_JsonRoot["lpszUserDir"].asCString()); } - return TRUE; + return true; } /******************************************************************** 函数名称:Protocol_StorageParse_ProxyNotify @@ -346,7 +346,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_ProxyNotify(LPCTSTR lpszMsgBu if ((NULL == lpszMsgBuffer) || (NULL == ptszClientAddr)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; return FALSE; } @@ -358,7 +358,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_ProxyNotify(LPCTSTR lpszMsgBu //解析JSON if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcslen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; return FALSE; } @@ -371,7 +371,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_ProxyNotify(LPCTSTR lpszMsgBu _tcscpy(ptszBuckKey, st_JsonRoot["lpszBuckKey"].asCString()); *pInt_FileSize = st_JsonRoot["nFileSize"].asInt64(); - return TRUE; + return true; } /******************************************************************** 函数名称:Protocol_StorageParse_SpeedLimit @@ -407,7 +407,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_SpeedLimit(LPCTSTR lpszMsgBuf if ((NULL == lpszMsgBuffer) || (NULL == pInt_Limit)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; return FALSE; } @@ -419,7 +419,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_SpeedLimit(LPCTSTR lpszMsgBuf //解析JSON if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcslen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; return FALSE; } @@ -428,7 +428,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_SpeedLimit(LPCTSTR lpszMsgBuf *pInt_Code = st_JsonRoot["code"].asInt(); *pInt_Limit = st_JsonRoot["nLimitSpeed"].asInt(); - return TRUE; + return true; } /******************************************************************** 函数名称:Protocol_StorageParse_P2PToken @@ -459,7 +459,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_P2PToken(LPCTSTR lpszMsgBuffe if ((NULL == lpszMsgBuffer)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; return FALSE; } @@ -471,7 +471,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_P2PToken(LPCTSTR lpszMsgBuffe //解析JSON if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcslen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; return FALSE; } @@ -480,10 +480,10 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_P2PToken(LPCTSTR lpszMsgBuffe if (st_JsonRoot["xhToken"].isNull()) { - Protocol_IsErrorOccur = TRUE; + Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_TOKEN; return FALSE; } *pxhToken = st_JsonRoot["xhToken"].asUInt64(); - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Protocol/dllmain.cpp b/XEngine_Source/StorageModule_Protocol/dllmain.cpp index daed8c8..0745b19 100644 --- a/XEngine_Source/StorageModule_Protocol/dllmain.cpp +++ b/XEngine_Source/StorageModule_Protocol/dllmain.cpp @@ -14,6 +14,6 @@ BOOL APIENTRY DllMain( HMODULE hModule, case DLL_PROCESS_DETACH: break; } - return TRUE; + return true; } diff --git a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.cpp b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.cpp index af8a245..8637c5e 100644 --- a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.cpp +++ b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.cpp @@ -43,7 +43,7 @@ BOOL CSession_DLStroage::Session_DLStroage_Init(int nMaxConnect) Session_IsErrorOccur = FALSE; m_nMaxConnect = nMaxConnect; - return TRUE; + return true; } /******************************************************************** 函数名称:Session_DLStroage_Destory @@ -61,7 +61,7 @@ BOOL CSession_DLStroage::Session_DLStroage_Destory() stl_MapStroage.clear(); st_Locker.unlock(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_DLStroage_Insert @@ -122,7 +122,7 @@ BOOL CSession_DLStroage::Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTST if ((NULL == lpszClientAddr) || (NULL == lpszFileDir)) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; return FALSE; } @@ -131,7 +131,7 @@ BOOL CSession_DLStroage::Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTST unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); if (stl_MapIterator != stl_MapStroage.end()) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_EXIST; st_Locker.unlock_shared(); return FALSE; @@ -145,7 +145,7 @@ BOOL CSession_DLStroage::Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTST int nRet = _tstat64(lpszFileDir, &st_FStat); if (-1 == nRet) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_OPENFILE; return FALSE; } @@ -169,7 +169,7 @@ BOOL CSession_DLStroage::Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTST st_Client.pSt_File = _tfopen(lpszFileDir, _T("rb")); if (NULL == st_Client.pSt_File) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_OPENFILE; return FALSE; } @@ -202,7 +202,7 @@ BOOL CSession_DLStroage::Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTST st_Locker.lock(); stl_MapStroage.insert(make_pair(lpszClientAddr, st_Client)); st_Locker.unlock(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_DLStroage_GetBuffer @@ -232,7 +232,7 @@ BOOL CSession_DLStroage::Session_DLStroage_GetBuffer(LPCTSTR lpszClientAddr, TCH if ((NULL == lpszClientAddr) || (NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; return FALSE; } @@ -241,7 +241,7 @@ BOOL CSession_DLStroage::Session_DLStroage_GetBuffer(LPCTSTR lpszClientAddr, TCH unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); if (stl_MapIterator == stl_MapStroage.end()) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); return FALSE; @@ -260,7 +260,7 @@ BOOL CSession_DLStroage::Session_DLStroage_GetBuffer(LPCTSTR lpszClientAddr, TCH stl_MapIterator->second.ullRWLen += *pInt_MsgLen; } st_Locker.unlock_shared(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_DLStroage_GetInfo @@ -286,7 +286,7 @@ BOOL CSession_DLStroage::Session_DLStroage_GetInfo(LPCTSTR lpszClientAddr, SESSI if ((NULL == pSt_StorageInfo)) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; return FALSE; } @@ -295,14 +295,14 @@ BOOL CSession_DLStroage::Session_DLStroage_GetInfo(LPCTSTR lpszClientAddr, SESSI unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); if (stl_MapIterator == stl_MapStroage.end()) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); return FALSE; } *pSt_StorageInfo = stl_MapIterator->second; st_Locker.unlock_shared(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_DLStroage_GetCount @@ -323,14 +323,14 @@ BOOL CSession_DLStroage::Session_DLStroage_GetCount(int* pInt_ListCount) if (NULL == pInt_ListCount) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; return FALSE; } st_Locker.lock_shared(); *pInt_ListCount = stl_MapStroage.size(); st_Locker.unlock_shared(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_DLStorage_SetSeek @@ -358,7 +358,7 @@ BOOL CSession_DLStroage::Session_DLStorage_SetSeek(LPCTSTR lpszClientAddr, int n unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); if (stl_MapIterator == stl_MapStroage.end()) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); return FALSE; @@ -367,7 +367,7 @@ BOOL CSession_DLStroage::Session_DLStorage_SetSeek(LPCTSTR lpszClientAddr, int n fseek(stl_MapIterator->second.pSt_File, nSeek, SEEK_CUR); stl_MapIterator->second.ullRWLen += nSeek; st_Locker.unlock_shared(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_DLStorage_GetAll @@ -393,7 +393,7 @@ BOOL CSession_DLStroage::Session_DLStorage_GetAll(SESSION_STORAGEINFO*** pppSt_S if ((NULL == pppSt_StorageInfo) || (NULL == pInt_ListCount)) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; return FALSE; } @@ -411,11 +411,11 @@ BOOL CSession_DLStroage::Session_DLStorage_GetAll(SESSION_STORAGEINFO*** pppSt_S if (*pInt_ListCount <= 0) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_EMPTY; return FALSE; } - return TRUE; + return true; } /******************************************************************** 函数名称:Session_DLStroage_Delete @@ -442,7 +442,7 @@ BOOL CSession_DLStroage::Session_DLStroage_Delete(LPCTSTR lpszClientAddr) stl_MapStroage.erase(stl_MapIterator); } st_Locker.unlock_shared(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_DLStroage_MaxConnect @@ -487,9 +487,9 @@ BOOL CSession_DLStroage::Session_DLStroage_MaxConnect(LPCTSTR lpszClientAddr) if (nExistNumber >= m_nMaxConnect) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_MAXCONNECT; return FALSE; } - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.cpp b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.cpp index 27052e7..bf51a17 100644 --- a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.cpp +++ b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.cpp @@ -44,7 +44,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Init(int nMaxConnect, BOOL bUPResume m_bResume = bUPResume; m_nMaxConnect = nMaxConnect; - return TRUE; + return true; } /******************************************************************** 函数名称:Session_UPStroage_Destory @@ -62,7 +62,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Destory() stl_MapStroage.clear(); st_Locker.unlock(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_UPStroage_Insert @@ -113,7 +113,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTST if ((NULL == lpszClientAddr) || (NULL == lpszFileDir)) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; return FALSE; } @@ -122,7 +122,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTST unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); if (stl_MapIterator != stl_MapStroage.end()) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_EXIST; st_Locker.unlock_shared(); return FALSE; @@ -149,7 +149,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTST st_Client.st_StorageInfo.pSt_File = _tfopen(lpszFileDir, _T("rb+")); if (NULL == st_Client.st_StorageInfo.pSt_File) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_OPENFILE; return FALSE; } @@ -159,12 +159,12 @@ BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTST //是否允许覆写 if (!bRewrite) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_REWRITE; fclose(st_Client.st_StorageInfo.pSt_File); return FALSE; } - st_Client.st_StorageInfo.bRewrite = TRUE; + st_Client.st_StorageInfo.bRewrite = true; st_Client.st_StorageInfo.ullRWLen -= (nPostEnd - nPosStart); } fseek(st_Client.st_StorageInfo.pSt_File, nPosStart, SEEK_SET); @@ -174,7 +174,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTST st_Client.st_StorageInfo.pSt_File = _tfopen(lpszFileDir, _T("wb")); if (NULL == st_Client.st_StorageInfo.pSt_File) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_OPENFILE; return FALSE; } @@ -182,7 +182,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTST st_Locker.lock(); stl_MapStroage.insert(make_pair(lpszClientAddr, st_Client)); st_Locker.unlock(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_UPStroage_GetInfo @@ -208,7 +208,7 @@ BOOL CSession_UPStroage::Session_UPStroage_GetInfo(LPCTSTR lpszClientAddr, SESSI if ((NULL == lpszClientAddr) || (NULL == pSt_StorageInfo)) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; return FALSE; } @@ -217,14 +217,14 @@ BOOL CSession_UPStroage::Session_UPStroage_GetInfo(LPCTSTR lpszClientAddr, SESSI unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); if (stl_MapIterator == stl_MapStroage.end()) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); return FALSE; } *pSt_StorageInfo = stl_MapIterator->second.st_StorageInfo; st_Locker.unlock_shared(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_UPStroage_Write @@ -255,7 +255,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Write(LPCTSTR lpszClientAddr, LPCTSTR if ((NULL == lpszClientAddr) || (NULL == lpszMsgBuffer)) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; return FALSE; } @@ -264,14 +264,14 @@ BOOL CSession_UPStroage::Session_UPStroage_Write(LPCTSTR lpszClientAddr, LPCTSTR unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); if (stl_MapIterator == stl_MapStroage.end()) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); return FALSE; } int nCount = nMsgLen; int nWLen = 0; - while (TRUE) + while (true) { int nRet = fwrite(lpszMsgBuffer + nWLen, 1, nCount - nWLen, stl_MapIterator->second.st_StorageInfo.pSt_File); nWLen += nRet; @@ -283,7 +283,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Write(LPCTSTR lpszClientAddr, LPCTSTR } stl_MapIterator->second.st_StorageInfo.ullRWLen += nWLen; st_Locker.unlock_shared(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_UPStroage_Exist @@ -311,7 +311,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Exist(LPCTSTR lpszClientAddr) } else { - bRet = TRUE; + bRet = true; } st_Locker.unlock(); return bRet; @@ -340,7 +340,7 @@ BOOL CSession_UPStroage::Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_S if (NULL == pInt_ListCount) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; return FALSE; } @@ -348,7 +348,7 @@ BOOL CSession_UPStroage::Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_S if (NULL == pppSt_StorageInfo) { *pInt_ListCount = stl_MapStroage.size(); - return TRUE; + return true; } st_Locker.lock_shared(); @@ -363,11 +363,11 @@ BOOL CSession_UPStroage::Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_S if (0 == *pInt_ListCount) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_EMPTY; return FALSE; } - return TRUE; + return true; } /******************************************************************** 函数名称:Session_UPStroage_Delete @@ -402,7 +402,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Delete(LPCTSTR lpszClientAddr) stl_MapStroage.erase(stl_MapIterator); } st_Locker.unlock(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_UPStroage_Close @@ -431,7 +431,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Close(LPCTSTR lpszClientAddr) } } st_Locker.unlock_shared(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_UPStroage_MaxConnect @@ -476,9 +476,9 @@ BOOL CSession_UPStroage::Session_UPStroage_MaxConnect(LPCTSTR lpszClientAddr) if (nExistNumber >= m_nMaxConnect) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_MAXCONNECT; return FALSE; } - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Session/Session_User/Session_User.cpp b/XEngine_Source/StorageModule_Session/Session_User/Session_User.cpp index eea19b7..6ab911f 100644 --- a/XEngine_Source/StorageModule_Session/Session_User/Session_User.cpp +++ b/XEngine_Source/StorageModule_Session/Session_User/Session_User.cpp @@ -40,7 +40,7 @@ BOOL CSession_User::Session_User_Init(LPCTSTR lpszUserFile) FILE* pSt_File = _tfopen(lpszUserFile, _T("rb")); if (NULL == pSt_File) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_OPENFILE; return FALSE; } @@ -48,7 +48,7 @@ BOOL CSession_User::Session_User_Init(LPCTSTR lpszUserFile) TCHAR tszMsgBuffer[4096]; memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); - while (TRUE) + while (true) { int nRet = fread(tszMsgBuffer + nCount, 1, 1024, pSt_File); if (nRet <= 0) @@ -75,7 +75,7 @@ BOOL CSession_User::Session_User_Init(LPCTSTR lpszUserFile) ptszTokStr = _tcstok(NULL, lpszLineStr); } - return TRUE; + return true; } /******************************************************************** 函数名称:Session_User_Destory @@ -93,7 +93,7 @@ BOOL CSession_User::Session_User_Destory() stl_MapUser.clear(); st_Locker.unlock(); - return TRUE; + return true; } /******************************************************************** 函数名称:Session_User_Exist @@ -126,7 +126,7 @@ BOOL CSession_User::Session_User_Exist(LPCTSTR lpszUser, LPCTSTR lpszPass, int* unordered_map::const_iterator stl_MapIterator = stl_MapUser.find(lpszUser); if (stl_MapIterator == stl_MapUser.end()) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); return FALSE; @@ -134,14 +134,14 @@ BOOL CSession_User::Session_User_Exist(LPCTSTR lpszUser, LPCTSTR lpszPass, int* if (_tcslen(lpszPass) != _tcslen(stl_MapIterator->second.tszUserPass)) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PASSWORD; st_Locker.unlock_shared(); return FALSE; } if (0 != _tcsncmp(lpszPass, stl_MapIterator->second.tszUserPass, _tcslen(lpszPass))) { - Session_IsErrorOccur = TRUE; + Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PASSWORD; st_Locker.unlock_shared(); return FALSE; @@ -151,5 +151,5 @@ BOOL CSession_User::Session_User_Exist(LPCTSTR lpszUser, LPCTSTR lpszPass, int* *pInt_Limit = _ttoi(stl_MapIterator->second.tszUserLimit); } st_Locker.unlock_shared(); - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Session/dllmain.cpp b/XEngine_Source/StorageModule_Session/dllmain.cpp index daed8c8..0745b19 100644 --- a/XEngine_Source/StorageModule_Session/dllmain.cpp +++ b/XEngine_Source/StorageModule_Session/dllmain.cpp @@ -14,6 +14,6 @@ BOOL APIENTRY DllMain( HMODULE hModule, case DLL_PROCESS_DETACH: break; } - return TRUE; + return true; } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp index 78c6df0..0488d4b 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp @@ -8,12 +8,12 @@ XHTHREAD CALLBACK XEngine_Center_HTTPThread(LPVOID lParam) while (bIsRun) { //等待指定线程事件触发 - if (RfcComponents_HttpServer_EventWaitEx(xhCenterHttp, nThreadPos)) + if (HttpProtocol_Server_EventWaitEx(xhCenterHttp, nThreadPos)) { int nListCount = 0; RFCCOMPONENTS_HTTP_PKTCLIENT** ppSt_PKTClient; //获取当前队列池中所有触发上传客户端 - RfcComponents_HttpServer_GetPoolEx(xhCenterHttp, nThreadPos, &ppSt_PKTClient, &nListCount); + HttpProtocol_Server_GetPoolEx(xhCenterHttp, nThreadPos, &ppSt_PKTClient, &nListCount); for (int i = 0; i < nListCount; i++) { for (int j = 0; j < ppSt_PKTClient[i]->nPktCount; j++) @@ -26,7 +26,7 @@ XHTHREAD CALLBACK XEngine_Center_HTTPThread(LPVOID lParam) memset(&st_HTTPParam, '\0', sizeof(RFCCOMPONENTS_HTTP_REQPARAM)); //获得指定上传客户端触发信息 - if (RfcComponents_HttpServer_GetMemoryEx(xhCenterHttp, ppSt_PKTClient[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_HTTPParam, &ppszListHdr, &nHdrCount)) + if (HttpProtocol_Server_GetMemoryEx(xhCenterHttp, ppSt_PKTClient[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_HTTPParam, &ppszListHdr, &nHdrCount)) { XEngine_Task_HttpCenter(ppSt_PKTClient[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, &st_HTTPParam, ppszListHdr, nHdrCount); } @@ -67,11 +67,11 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int memset(tszUserPass, '\0', sizeof(tszUserPass)); if (!APIHelp_Api_ProxyAuth(tszUserName, tszUserPass, pptszListHdr, nHdrCount)) { - st_HDRParam.bIsClose = TRUE; - st_HDRParam.bAuth = TRUE; + st_HDRParam.bIsClose = true; + st_HDRParam.bAuth = true; st_HDRParam.nHttpCode = 401; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); return FALSE; @@ -86,11 +86,11 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int APIClient_Http_Request(_T("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); if (200 != nResponseCode) { - st_HDRParam.bIsClose = TRUE; - st_HDRParam.bAuth = TRUE; + st_HDRParam.bIsClose = true; + st_HDRParam.bAuth = true; st_HDRParam.nHttpCode = nResponseCode; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } @@ -101,18 +101,18 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int { if (!Session_User_Exist(tszUserName, tszUserPass)) { - st_HDRParam.bIsClose = TRUE; - st_HDRParam.bAuth = TRUE; + st_HDRParam.bIsClose = true; + st_HDRParam.bAuth = true; st_HDRParam.nHttpCode = 401; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,验证用户失败,无法继续"), lpszClientAddr); return FALSE; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,本地验证用户验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); } - st_HDRParam.bAuth = TRUE; + st_HDRParam.bAuth = true; } if (0 == _tcsnicmp(lpszMethodPost, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodPost))) @@ -126,24 +126,24 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int memset(tszHdrBuffer, '\0', sizeof(tszHdrBuffer)); memset(tszStorageAddr, '\0', sizeof(tszStorageAddr)); - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 302; APIHelp_Distributed_RandomAddr(st_LoadbalanceCfg.st_LoadBalance.pStl_ListCenter, tszStorageAddr, st_LoadbalanceCfg.st_LBDistributed.nCenterMode); _stprintf(tszHdrBuffer, _T("Location: %s%s\r\n"), tszStorageAddr, pSt_HTTPParam->tszHttpUri); - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHdrBuffer); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHdrBuffer); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求的函数被要求重定向到:%s%s"), lpszClientAddr, tszStorageAddr, pSt_HTTPParam->tszHttpUri); - return TRUE; + return true; } - if (!RfcComponents_HttpHelp_GetUrlApi(pSt_HTTPParam->tszHttpUri, tszAPIVersion, tszAPIMethod, tszAPIName)) + if (!HttpProtocol_ServerHelp_GetUrlApi(pSt_HTTPParam->tszHttpUri, tszAPIVersion, tszAPIMethod, tszAPIName)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求的API不支持"), lpszClientAddr); return FALSE; @@ -161,23 +161,23 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int else if (0 == _tcsnicmp(lpszMethodOption, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodOption))) { //用于心跳 - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; LPCTSTR lpszHdrBuffer = _T("Allow: POST GET PUT OPTIONS\r\n"); - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, lpszHdrBuffer); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, lpszHdrBuffer); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求OPTIONS心跳方法成功"), lpszClientAddr); } else { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 405; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,发送的方法不支持"), lpszClientAddr); return FALSE; } - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp index 7c111f6..ab8e833 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp @@ -39,15 +39,15 @@ BOOL StorageApp_Config_Parament(int argc,char **argv) } else if (0 == _tcscmp("-r", argv[i])) { - st_ServiceCfg.st_Memory.bReload = TRUE; + st_ServiceCfg.st_Memory.bReload = true; } else if (0 == _tcscmp("-u", argv[i])) { - st_ServiceCfg.bReuseraddr = TRUE; + st_ServiceCfg.bReuseraddr = true; } } - return TRUE; + return true; } void StorageApp_Config_ParamentHelp() diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp index d4b903c..afee714 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp @@ -8,12 +8,12 @@ XHTHREAD CALLBACK XEngine_Download_HTTPThread(LPVOID lParam) while (bIsRun) { //等待指定线程事件触发 - if (RfcComponents_HttpServer_EventWaitEx(xhDLHttp, nThreadPos)) + if (HttpProtocol_Server_EventWaitEx(xhDLHttp, nThreadPos)) { int nListCount = 0; RFCCOMPONENTS_HTTP_PKTCLIENT** ppSt_PKTClient; //获取当前队列池中所有触发下载客户端 - RfcComponents_HttpServer_GetPoolEx(xhDLHttp, nThreadPos, &ppSt_PKTClient, &nListCount); + HttpProtocol_Server_GetPoolEx(xhDLHttp, nThreadPos, &ppSt_PKTClient, &nListCount); for (int i = 0; i < nListCount; i++) { for (int j = 0; j < ppSt_PKTClient[i]->nPktCount; j++) @@ -26,7 +26,7 @@ XHTHREAD CALLBACK XEngine_Download_HTTPThread(LPVOID lParam) memset(&st_HTTPParam, '\0', sizeof(RFCCOMPONENTS_HTTP_REQPARAM)); //获得指定下载客户端触发信息 - if (RfcComponents_HttpServer_GetMemoryEx(xhDLHttp, ppSt_PKTClient[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_HTTPParam, &ppszListHdr, &nHdrCount)) + if (HttpProtocol_Server_GetMemoryEx(xhDLHttp, ppSt_PKTClient[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_HTTPParam, &ppszListHdr, &nHdrCount)) { XEngine_Task_HttpDownload(ppSt_PKTClient[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, &st_HTTPParam, ppszListHdr, nHdrCount); } @@ -78,7 +78,7 @@ void CALLBACK XEngine_Download_CBSend(LPCSTR lpszClientAddr, SOCKET hSocket, LPV memset(&st_StorageInfo, '\0', sizeof(SESSION_STORAGEINFO)); Session_DLStroage_GetInfo(lpszClientAddr, &st_StorageInfo); - Protocol_StoragePacket_UPDown(tszProxyStr, &nPLen, st_StorageInfo.tszFileDir, st_StorageInfo.tszBuckKey, st_StorageInfo.tszClientAddr, st_StorageInfo.ullRWCount, TRUE, st_StorageInfo.tszFileHash); + Protocol_StoragePacket_UPDown(tszProxyStr, &nPLen, st_StorageInfo.tszFileDir, st_StorageInfo.tszBuckKey, st_StorageInfo.tszClientAddr, st_StorageInfo.ullRWCount, true, st_StorageInfo.tszFileHash); if (APIClient_Http_Request(_T("POST"), st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass, tszProxyStr, &nHttpCode)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass); @@ -133,10 +133,10 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in LPCTSTR lpszMethodGet = _T("GET"); if (0 != _tcsncmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodGet))) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 405; - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,发送的方法不支持"), lpszClientAddr); return FALSE; @@ -146,10 +146,10 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in { if (!Session_DLStroage_MaxConnect(lpszClientAddr)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 503; - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,请求失败,连接数超过限制:%d,无法继续"), lpszClientAddr, st_ServiceCfg.st_XLimit.nMaxDNConnect); return FALSE; @@ -165,11 +165,11 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in memset(tszUserPass, '\0', sizeof(tszUserPass)); if (!APIHelp_Api_ProxyAuth(tszUserName, tszUserPass, pptszListHdr, nHdrCount)) { - st_HDRParam.bIsClose = TRUE; - st_HDRParam.bAuth = TRUE; + st_HDRParam.bIsClose = true; + st_HDRParam.bAuth = true; st_HDRParam.nHttpCode = 401; - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); return FALSE; @@ -185,11 +185,11 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in APIClient_Http_Request(_T("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); if (200 != nResponseCode) { - st_HDRParam.bIsClose = TRUE; - st_HDRParam.bAuth = TRUE; + st_HDRParam.bIsClose = true; + st_HDRParam.bAuth = true; st_HDRParam.nHttpCode = nResponseCode; - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } @@ -201,18 +201,18 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in { if (!Session_User_Exist(tszUserName, tszUserPass, &nLimit)) { - st_HDRParam.bIsClose = TRUE; - st_HDRParam.bAuth = TRUE; + st_HDRParam.bIsClose = true; + st_HDRParam.bAuth = true; st_HDRParam.nHttpCode = 401; - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,验证用户失败,无法继续"), lpszClientAddr); return FALSE; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,本地验证用户验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); } - st_HDRParam.bAuth = TRUE; + st_HDRParam.bAuth = true; } //使用重定向,这是分布式重定向实现 if (st_LoadbalanceCfg.st_LBDistributed.nDownldMode > 0) @@ -223,16 +223,16 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in memset(tszHdrBuffer, '\0', sizeof(tszHdrBuffer)); memset(tszStorageAddr, '\0', sizeof(tszStorageAddr)); - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 302; APIHelp_Distributed_RandomAddr(st_LoadbalanceCfg.st_LoadBalance.pStl_ListDownload, tszStorageAddr, st_LoadbalanceCfg.st_LBDistributed.nDownldMode); _stprintf(tszHdrBuffer, _T("Location: %s%s\r\n"), tszStorageAddr, pSt_HTTPParam->tszHttpUri); - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHdrBuffer); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHdrBuffer); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,请求的文件被要求重定向到:%s%s"), lpszClientAddr, tszStorageAddr, pSt_HTTPParam->tszHttpUri); - return TRUE; + return true; } BOOL bRange = FALSE; @@ -244,7 +244,7 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in //是否启用了断点续传 if (st_ServiceCfg.st_XStorage.bResumable) { - bRange = TRUE; + bRange = true; } else { @@ -259,10 +259,10 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in //分布式存储 if (!APIHelp_Distributed_DLStorage(pSt_HTTPParam->tszHttpUri, st_LoadbalanceCfg.st_LoadBalance.pStl_ListBucket, &st_StorageBucket)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,请求文件失败,可能BUCKET:%s 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); return FALSE; @@ -280,7 +280,7 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in memset(tszFieldStr, '\0', MAX_PATH); memset(tszHashStr, '\0', sizeof(tszHashStr)); //得到文件HASH - OPenSsl_Api_Digest(tszFileDir, tszHashKey, &nHashLen, TRUE, st_ServiceCfg.st_XStorage.nHashMode); + OPenSsl_Api_Digest(tszFileDir, tszHashKey, &nHashLen, true, st_ServiceCfg.st_XStorage.nHashMode); BaseLib_OperatorString_StrToHex((char*)tszHashKey, nHashLen, tszHashStr); BaseLib_OperatorString_GetFileAndPath(tszFileDir, NULL, NULL, NULL, st_HDRParam.tszMimeType); if (nLimit > 0) @@ -290,10 +290,10 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in //插入数据 if (!Session_DLStroage_Insert(lpszClientAddr, st_StorageBucket.tszBuckKey, tszFileDir, &ullCount, &ullSize, nPosStart, nPosEnd, tszHashStr, nLimit, xhLimit)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,插入用户请求失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); return FALSE; @@ -305,7 +305,7 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in st_HDRParam.st_Range.nPosEnd = nPosEnd; st_HDRParam.st_Range.nPosCount = ullCount; st_HDRParam.nHttpCode = 206; - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; if (0 == st_HDRParam.st_Range.nPosEnd) { @@ -315,24 +315,24 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in else { st_HDRParam.nHttpCode = 200; - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; } _stprintf(tszFieldStr, _T("FileHash: %s\r\n"), tszHashStr); - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, ullSize, tszFieldStr); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, ullSize, tszFieldStr); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); //不能在send之前调用 if (!NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr, XEngine_Download_CBSend)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,设置回调下载失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); return FALSE; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,请求下载文件成功,文件名:%s,总大小:%llu,发送大小:%llu,范围:%d - %d"), lpszClientAddr, tszFileDir, ullCount, ullSize, nPosStart, nPosEnd); - return TRUE; + return true; } BOOL XEngine_Task_SendDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen) { @@ -350,5 +350,5 @@ BOOL XEngine_Task_SendDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in return FALSE; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _T("下载客户端:%s,正在发送文件数据,大小:%d"), lpszClientAddr, nMsgLen); - return TRUE; + return true; } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h index b0a5175..ac72355 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h @@ -38,8 +38,8 @@ using namespace std; #include #include #include -#include -#include +#include +#include #include #include #include @@ -67,7 +67,7 @@ using namespace std; #define STORAGE_NETTYPE_HTTPCENTER 3 extern BOOL bIsRun; -extern XLOG xhLog; +extern XHANDLE xhLog; extern XHANDLE xhHBDownload; extern XHANDLE xhHBUPLoader; @@ -113,7 +113,7 @@ extern XENGINE_LBCONFIG st_LoadbalanceCfg; #pragma comment(lib,"XEngine_Core/XEngine_OPenSsl.lib") #pragma comment(lib,"XEngine_HelpComponents/HelpComponents_XLog.lib") #pragma comment(lib,"XEngine_HelpComponents/HelpComponents_Packets.lib") -#pragma comment(lib,"XEngine_RfcComponents/RfcComponents_HttpServer.lib") +#pragma comment(lib,"XEngine_RfcComponents/RfcComponents_HttpProtocol.lib") #pragma comment(lib,"XEngine_NetHelp/NetHelp_APIClient.lib") #pragma comment(lib,"XEngine_SystemSdk/XEngine_SystemApi.lib") #ifdef _WIN64 diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp index 71959a3..d46b73f 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp @@ -1,15 +1,15 @@ #include "StorageApp_Hdr.h" -BOOL CALLBACK XEngine_Callback_DownloadLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) +bool CALLBACK XEngine_Callback_DownloadLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) { if (st_ServiceCfg.st_XCert.bDLEnable) { OPenSsl_Server_AcceptEx(xhDLSsl, hSocket, lpszClientAddr); } - RfcComponents_HttpServer_CreateClientEx(xhDLHttp, lpszClientAddr, 0); + HttpProtocol_Server_CreateClientEx(xhDLHttp, lpszClientAddr, 0); SocketOpt_HeartBeat_InsertAddrEx(xhHBDownload, lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,进入了服务器"), lpszClientAddr); - return TRUE; + return true; } void CALLBACK XEngine_Callback_DownloadRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam) { @@ -18,18 +18,18 @@ void CALLBACK XEngine_Callback_DownloadRecv(LPCTSTR lpszClientAddr, SOCKET hSock int nSLen = 0; TCHAR* ptszMsgBuffer = NULL; OPenSsl_Server_RecvMemoryEx(xhDLSsl, lpszClientAddr, &ptszMsgBuffer, &nSLen, lpszRecvMsg, nMsgLen); - if (!RfcComponents_HttpServer_InserQueueEx(xhDLHttp, lpszClientAddr, ptszMsgBuffer, nSLen)) + if (!HttpProtocol_Server_InserQueueEx(xhDLHttp, lpszClientAddr, ptszMsgBuffer, nSLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpServer_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } else { - if (!RfcComponents_HttpServer_InserQueueEx(xhDLHttp, lpszClientAddr, lpszRecvMsg, nMsgLen)) + if (!HttpProtocol_Server_InserQueueEx(xhDLHttp, lpszClientAddr, lpszRecvMsg, nMsgLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpServer_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } } @@ -41,17 +41,17 @@ void CALLBACK XEngine_Callback_DownloadLeave(LPCTSTR lpszClientAddr, SOCKET hSoc XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPDOWNLOAD); } ////////////////////////////////////////////////////////////////////////// -BOOL CALLBACK XEngine_Callback_UPLoaderLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) +bool CALLBACK XEngine_Callback_UPLoaderLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) { if (st_ServiceCfg.st_XCert.bUPEnable) { OPenSsl_Server_AcceptEx(xhUPSsl, hSocket, lpszClientAddr); } - RfcComponents_HttpServer_CreateClientEx(xhUPHttp, lpszClientAddr, 0); - RfcComponents_HttpServer_SetRecvModeEx(xhUPHttp, lpszClientAddr, 1); //设置为文件接受模式 + HttpProtocol_Server_CreateClientEx(xhUPHttp, lpszClientAddr, 0); + HttpProtocol_Server_SetRecvModeEx(xhUPHttp, lpszClientAddr, 1); //设置为文件接受模式 SocketOpt_HeartBeat_InsertAddrEx(xhHBUPLoader, lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,进入了服务器"), lpszClientAddr); - return TRUE; + return true; } void CALLBACK XEngine_Callback_UPLoaderRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam) { @@ -60,18 +60,18 @@ void CALLBACK XEngine_Callback_UPLoaderRecv(LPCTSTR lpszClientAddr, SOCKET hSock int nSLen = 0; TCHAR* ptszMsgBuffer = NULL; OPenSsl_Server_RecvMemoryEx(xhUPSsl, lpszClientAddr, &ptszMsgBuffer, &nSLen, lpszRecvMsg, nMsgLen); - if (!RfcComponents_HttpServer_InserQueueEx(xhUPHttp, lpszClientAddr, ptszMsgBuffer, nSLen)) + if (!HttpProtocol_Server_InserQueueEx(xhUPHttp, lpszClientAddr, ptszMsgBuffer, nSLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpServer_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } else { - if (!RfcComponents_HttpServer_InserQueueEx(xhUPHttp, lpszClientAddr, lpszRecvMsg, nMsgLen)) + if (!HttpProtocol_Server_InserQueueEx(xhUPHttp, lpszClientAddr, lpszRecvMsg, nMsgLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpServer_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } } @@ -89,16 +89,16 @@ void CALLBACK XEngine_Callback_UPLoaderLeave(LPCTSTR lpszClientAddr, SOCKET hSoc XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPUPLOADER); } ////////////////////////////////////////////////////////////////////////// -BOOL CALLBACK XEngine_Callback_CenterLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) +bool CALLBACK XEngine_Callback_CenterLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) { if (st_ServiceCfg.st_XCert.bCHEnable) { OPenSsl_Server_AcceptEx(xhCHSsl, hSocket, lpszClientAddr); } - RfcComponents_HttpServer_CreateClientEx(xhCenterHttp, lpszClientAddr, 0); + HttpProtocol_Server_CreateClientEx(xhCenterHttp, lpszClientAddr, 0); SocketOpt_HeartBeat_InsertAddrEx(xhHBCenter, lpszClientAddr); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,进入了服务器"), lpszClientAddr); - return TRUE; + return true; } void CALLBACK XEngine_Callback_CenterRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam) { @@ -107,18 +107,18 @@ void CALLBACK XEngine_Callback_CenterRecv(LPCTSTR lpszClientAddr, SOCKET hSocket int nSLen = 0; TCHAR* ptszMsgBuffer = NULL; OPenSsl_Server_RecvMemoryEx(xhCHSsl, lpszClientAddr, &ptszMsgBuffer, &nSLen, lpszRecvMsg, nMsgLen); - if (!RfcComponents_HttpServer_InserQueueEx(xhCenterHttp, lpszClientAddr, ptszMsgBuffer, nSLen)) + if (!HttpProtocol_Server_InserQueueEx(xhCenterHttp, lpszClientAddr, ptszMsgBuffer, nSLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpServer_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } else { - if (!RfcComponents_HttpServer_InserQueueEx(xhCenterHttp, lpszClientAddr, lpszRecvMsg, nMsgLen)) + if (!HttpProtocol_Server_InserQueueEx(xhCenterHttp, lpszClientAddr, lpszRecvMsg, nMsgLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpServer_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } } @@ -168,7 +168,7 @@ BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, int nLeaveType, int nClient SocketOpt_HeartBeat_DeleteAddrEx(xhHBUPLoader, lpszClientAddr); } Session_UPStroage_Delete(lpszClientAddr); - RfcComponents_HttpServer_CloseClinetEx(xhUPHttp, lpszClientAddr); + HttpProtocol_Server_CloseClinetEx(xhUPHttp, lpszClientAddr); OPenSsl_Server_CloseClientEx(xhUPSsl, lpszClientAddr); } else if (STORAGE_NETTYPE_HTTPDOWNLOAD == nClientType) @@ -199,7 +199,7 @@ BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, int nLeaveType, int nClient Session_DLStroage_Delete(lpszClientAddr); } - RfcComponents_HttpServer_CloseClinetEx(xhDLHttp, lpszClientAddr); + HttpProtocol_Server_CloseClinetEx(xhDLHttp, lpszClientAddr); OPenSsl_Server_CloseClientEx(xhDLSsl, lpszClientAddr); } else if (STORAGE_NETTYPE_HTTPCENTER == nClientType) @@ -222,11 +222,11 @@ BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, int nLeaveType, int nClient NetCore_TCPXCore_CloseForClientEx(xhNetCenter, lpszClientAddr); SocketOpt_HeartBeat_DeleteAddrEx(xhHBCenter, lpszClientAddr); } - RfcComponents_HttpServer_CloseClinetEx(xhCenterHttp, lpszClientAddr); + HttpProtocol_Server_CloseClinetEx(xhCenterHttp, lpszClientAddr); OPenSsl_Server_CloseClientEx(xhCHSsl, lpszClientAddr); } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("%s:%s,与服务器断开,原因:%s"), m_StrClient.c_str(), lpszClientAddr, m_StrLeaveMsg.c_str()); - return TRUE; + return true; } /////////////////////////////////////////////////////////////////////////////////// BOOL XEngine_Net_SendMsg(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, int nType) @@ -299,5 +299,5 @@ BOOL XEngine_Net_SendMsg(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsg XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("客户端:%s,网络类型:%d,发送数据失败,发送大小:%d,错误:%lX,%d"), lpszClientAddr, nType, nMsgLen, dwRet, errno); return FALSE; } - return TRUE; + return true; } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h index 4ebed7c..6886337 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h @@ -1,12 +1,12 @@ #pragma once -BOOL CALLBACK XEngine_Callback_DownloadLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); +bool CALLBACK XEngine_Callback_DownloadLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); void CALLBACK XEngine_Callback_DownloadRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam); void CALLBACK XEngine_Callback_DownloadLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); -BOOL CALLBACK XEngine_Callback_UPLoaderLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); +bool CALLBACK XEngine_Callback_UPLoaderLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); void CALLBACK XEngine_Callback_UPLoaderRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam); void CALLBACK XEngine_Callback_UPLoaderLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); -BOOL CALLBACK XEngine_Callback_CenterLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); +bool CALLBACK XEngine_Callback_CenterLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); void CALLBACK XEngine_Callback_CenterRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam); void CALLBACK XEngine_Callback_CenterLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp index 7c04995..cb09fc7 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp @@ -8,12 +8,12 @@ XHTHREAD CALLBACK XEngine_UPLoader_HTTPThread(LPVOID lParam) while (bIsRun) { //等待指定线程事件触发 - if (RfcComponents_HttpServer_EventWaitEx(xhUPHttp, nThreadPos)) + if (HttpProtocol_Server_EventWaitEx(xhUPHttp, nThreadPos)) { int nListCount = 0; RFCCOMPONENTS_HTTP_PKTCLIENT** ppSt_PKTClient; //获取当前队列池中所有触发上传客户端 - RfcComponents_HttpServer_GetPoolEx(xhUPHttp, nThreadPos, &ppSt_PKTClient, &nListCount); + HttpProtocol_Server_GetPoolEx(xhUPHttp, nThreadPos, &ppSt_PKTClient, &nListCount); for (int i = 0; i < nListCount; i++) { for (int j = 0; j < ppSt_PKTClient[i]->nPktCount; j++) @@ -26,7 +26,7 @@ XHTHREAD CALLBACK XEngine_UPLoader_HTTPThread(LPVOID lParam) memset(&st_HTTPParam, '\0', sizeof(RFCCOMPONENTS_HTTP_REQPARAM)); //获得指定上传客户端触发信息 - if (RfcComponents_HttpServer_GetMemoryEx(xhUPHttp, ppSt_PKTClient[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_HTTPParam, &ppszListHdr, &nHdrCount)) + if (HttpProtocol_Server_GetMemoryEx(xhUPHttp, ppSt_PKTClient[i]->tszClientAddr, &ptszMsgBuffer, &nMsgLen, &st_HTTPParam, &ppszListHdr, &nHdrCount)) { XEngine_Task_HttpUPLoader(ppSt_PKTClient[i]->tszClientAddr, ptszMsgBuffer, nMsgLen, &st_HTTPParam, ppszListHdr, nHdrCount); } @@ -54,10 +54,10 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in LPCTSTR lpszMethodPost = _T("POST"); if ((0 != _tcsncmp(lpszMethodPut, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodPut))) && (0 != _tcsncmp(lpszMethodPost, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodPost)))) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 405; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,发送的方法:%s 不支持"), lpszClientAddr, pSt_HTTPParam->tszHttpMethod); return FALSE; @@ -67,10 +67,10 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in { if (!Session_UPStroage_MaxConnect(lpszClientAddr)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 503; - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求失败,连接数超过限制:%d,无法继续"), lpszClientAddr, st_ServiceCfg.st_XLimit.nMaxUPConnect); return FALSE; @@ -86,11 +86,11 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in memset(tszUserPass, '\0', sizeof(tszUserPass)); if (!APIHelp_Api_ProxyAuth(tszUserName, tszUserPass, pptszListHdr, nHdrCount)) { - st_HDRParam.bIsClose = TRUE; - st_HDRParam.bAuth = TRUE; + st_HDRParam.bIsClose = true; + st_HDRParam.bAuth = true; st_HDRParam.nHttpCode = 401; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); return FALSE; @@ -105,11 +105,11 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in APIClient_Http_Request(_T("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); if (200 != nResponseCode) { - st_HDRParam.bIsClose = TRUE; - st_HDRParam.bAuth = TRUE; + st_HDRParam.bIsClose = true; + st_HDRParam.bAuth = true; st_HDRParam.nHttpCode = nResponseCode; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } @@ -120,18 +120,18 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in { if (!Session_User_Exist(tszUserName, tszUserPass)) { - st_HDRParam.bIsClose = TRUE; - st_HDRParam.bAuth = TRUE; + st_HDRParam.bIsClose = true; + st_HDRParam.bAuth = true; st_HDRParam.nHttpCode = 401; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,验证用户失败,无法继续"), lpszClientAddr); return FALSE; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,本地验证用户验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); } - st_HDRParam.bAuth = TRUE; + st_HDRParam.bAuth = true; } //使用重定向? if (st_LoadbalanceCfg.st_LBDistributed.nUPLoadMode > 0) @@ -142,16 +142,16 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in memset(tszHdrBuffer, '\0', sizeof(tszHdrBuffer)); memset(tszStorageAddr, '\0', sizeof(tszStorageAddr)); - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 302; APIHelp_Distributed_RandomAddr(st_LoadbalanceCfg.st_LoadBalance.pStl_ListUPLoader, tszStorageAddr, st_LoadbalanceCfg.st_LBDistributed.nUPLoadMode); _stprintf(tszHdrBuffer, _T("Location: %s%s\r\n"), tszStorageAddr, pSt_HTTPParam->tszHttpUri); - RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHdrBuffer); + HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHdrBuffer); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求的文件被要求重定向到:%s%s"), lpszClientAddr, tszStorageAddr, pSt_HTTPParam->tszHttpUri); - return TRUE; + return true; } int nRVMode = 0; int nRVCount = 0; @@ -164,14 +164,14 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in //解析参数 TCHAR** pptszParamList; int nParamCount = 0; - RfcComponents_HttpHelp_GetParament(pSt_HTTPParam->tszHttpUri, &pptszParamList, &nParamCount); + HttpProtocol_ServerHelp_GetParament(pSt_HTTPParam->tszHttpUri, &pptszParamList, &nParamCount); if (nParamCount < 1) { st_HDRParam.nHttpCode = 413; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); BaseLib_OperatorMemory_Free((XPPPMEM)&pptszParamList, nParamCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求上传文件失败,提供的参数:%s 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, HttpServer_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求上传文件失败,提供的参数:%s 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, HttpProtocol_GetLastError()); return FALSE; } APIHelp_Api_UrlParse(&pptszParamList, nParamCount, tszFileName, st_StorageBucket.tszBuckKey); @@ -181,10 +181,10 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in { if (!APIHelp_Distributed_UPStorage(st_LoadbalanceCfg.st_LoadBalance.pStl_ListBucket, &st_StorageBucket, 4)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 413; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求上传文件失败,可能BUCKET:% 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); return FALSE; @@ -194,10 +194,10 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in { if (!APIHelp_Distributed_UPStorage(st_LoadbalanceCfg.st_LoadBalance.pStl_ListBucket, &st_StorageBucket, st_LoadbalanceCfg.st_LBLocation.nUPLoadMode)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 413; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求上传文件失败,可能BUCKET:% 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); return FALSE; @@ -216,9 +216,9 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in //得到断点续传大小 if (!APIHelp_Api_RangeFile(&nPosStart, &nPosEnd, &nPosCount, pptszListHdr, nHdrCount)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 411; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,没有用户数据大小字段,无法继续"), lpszClientAddr); return FALSE; @@ -229,10 +229,10 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in //是否启用了断点续传 if (!st_ServiceCfg.st_XStorage.bResumable) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 416; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求断点续传上传文件失败,服务端关闭了此功能,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); return FALSE; @@ -247,10 +247,10 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in //不存在,是否允许创建? if (!st_StorageBucket.st_PermissionFlags.bCreateDir) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求上传文件失败,上传文件夹不存在,权限错误,文件:%s"), lpszClientAddr, tszFileDir); return FALSE; @@ -259,10 +259,10 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in } if (!Session_UPStroage_Insert(lpszClientAddr, st_StorageBucket.tszBuckKey, tszFileDir, nPosCount, st_StorageBucket.st_PermissionFlags.bRewrite, nPosStart, nPosEnd)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,插入用户请求失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); return FALSE; @@ -270,7 +270,7 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求设置了数据范围:%d - %d/%lld"), lpszClientAddr, nPosStart, nPosEnd, nPosCount); } Session_UPStroage_Write(lpszClientAddr, lpszMsgBuffer, nMsgLen); - RfcComponents_HttpServer_GetRecvModeEx(xhUPHttp, lpszClientAddr, &nRVMode, &nRVCount, &nHDSize); + HttpProtocol_Server_GetRecvModeEx(xhUPHttp, lpszClientAddr, &nRVMode, &nRVCount, &nHDSize); if (nHDSize >= nRVCount) { int nPLen = MAX_PATH; @@ -283,13 +283,13 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in //大小是否足够 if (st_StorageInfo.ullCount != st_StorageInfo.ullRWLen) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; Protocol_StoragePacket_UPDown(tszPassNotify, &nPLen, st_StorageInfo.tszBuckKey, st_StorageInfo.tszFileDir, st_StorageInfo.tszClientAddr, st_StorageInfo.ullRWLen, FALSE); - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("上传客户端:%s,请求上传文件成功,文件名:%s,总大小:%lld,写入大小:%lld,文件不完整,需要等待断点续传完毕"), lpszClientAddr, tszFileDir, st_StorageInfo.ullCount, st_StorageInfo.ullRWLen); - return TRUE; + return true; } int nHashLen = 0; UCHAR tszHashStr[MAX_PATH]; @@ -304,7 +304,7 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in st_ProtocolFile.st_ProtocolFile.nFileSize = st_StorageInfo.ullRWLen; //上传完毕需要关闭,否则计算HASH会不正常 Session_UPStroage_Close(lpszClientAddr); - OPenSsl_Api_Digest(tszFileDir, tszHashStr, &nHashLen, TRUE, st_ServiceCfg.st_XStorage.nHashMode); + OPenSsl_Api_Digest(tszFileDir, tszHashStr, &nHashLen, true, st_ServiceCfg.st_XStorage.nHashMode); BaseLib_OperatorString_StrToHex((char*)tszHashStr, nHashLen, st_ProtocolFile.st_ProtocolFile.tszFileHash); //处理结果 if (st_ServiceCfg.st_XStorage.bUPHash) @@ -315,10 +315,10 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in } else { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 403; _tremove(tszFileDir); - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,上传的文件信息HASH校验失败,无法继续,文件:%s 已被删除,HASH:%s,错误:%lX"), lpszClientAddr, tszFileDir, st_ProtocolFile.st_ProtocolFile.tszFileHash, StorageHelp_GetLastError()); @@ -331,26 +331,26 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in { if (Database_File_FileInsert(&st_ProtocolFile, st_StorageInfo.bRewrite)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d"), lpszClientAddr, tszFileDir, nRVCount); } else { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 403; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求上传文件失败,插入数据库失败:%s,错误:%lX"), lpszClientAddr, tszFileDir, Database_GetLastError()); } } else { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d,数据库没有启用,不插入数据库"), lpszClientAddr, tszFileDir, nRVCount); } @@ -373,5 +373,5 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _T("上传客户端:%s,请求上传文件中,文件名:%s,大小:%d"), lpszClientAddr, tszFileDir, nMsgLen); } - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp index d852ce0..52f24f5 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp @@ -12,12 +12,12 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp memset(tszRVBuffer, '\0', sizeof(tszRVBuffer)); memset(&st_HDRParam, '\0', sizeof(RFCCOMPONENTS_HTTP_HDRPARAM)); - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; if (0 == _tcsnicmp(XENGINE_STORAGE_APP_METHOD_CONFIG, lpszAPIName, _tcslen(XENGINE_STORAGE_APP_METHOD_CONFIG))) { StorageApp_Config_Parament(0, NULL); - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,处理用户重载配置文件成功"), lpszClientAddr); } @@ -49,9 +49,9 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp //查找数据库 if (!st_ServiceCfg.st_XSql.bEnable) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 501; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求查询文件失败,没有启用数据库,无法使用此功能!"), lpszClientAddr); return FALSE; @@ -59,19 +59,19 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp Database_File_FileQuery(&ppSt_ListFile, &nListCount, tszTimeStart, tszTimeEnd, tszBucketKey, NULL, tszFileName, tszFileHash); if (0 == nListCount) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求查询文件失败,没有找到文件,查找文件名:%s,文件HASH:%s!"), lpszClientAddr, tszFileName, tszFileHash); return FALSE; } Protocol_StoragePacket_QueryFile(tszMsgBuffer, &nMsgLen, &ppSt_ListFile, nListCount, tszTimeStart, tszTimeEnd); - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszMsgBuffer, nMsgLen); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszMsgBuffer, nMsgLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListFile, nListCount); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求查询文件列表成功,列表个数:%d"), lpszClientAddr, nListCount); - return TRUE; + return true; } else { @@ -83,10 +83,10 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp if (_tcslen(tszFileHash) <= 0) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 400; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,发送广播请求失败,因为查询文件HASH为空"), lpszClientAddr); return FALSE; @@ -99,10 +99,10 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp if (!NetCore_BroadCast_Send(hSDSocket, tszSDBuffer, nSDLen)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 500; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); NetCore_BroadCast_Close(hSDSocket); NetCore_BroadCast_Close(hRVSocket); @@ -142,9 +142,9 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp if (stl_ListFile.empty()) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); } else { @@ -152,7 +152,7 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp XSTORAGECORE_DBFILE** ppSt_ListPacket; APIHelp_Distributed_FileList(&stl_ListFile, &ppSt_ListPacket, &nListCount); Protocol_StoragePacket_QueryFile(tszRVBuffer, &nRVLen, &ppSt_ListPacket, nListCount); - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListPacket, nListCount); } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求局域网文件列表成功,文件分布服务器个数:%d"), lpszClientAddr, stl_ListFile.size()); @@ -178,9 +178,9 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp _stprintf(tszFileDir, _T("%s/%s"), ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); if (0 != _taccess(tszFileDir, 0)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求添加文件到数据库失败,文件不存在,文件;%s"), lpszClientAddr, tszFileDir); return FALSE; @@ -196,7 +196,7 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求添加文件到数据库失败,因为服务器没有启用此功能,文件名:%s/%s"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); } } - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_DBFile, nListCount); } @@ -215,12 +215,12 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp if (!st_ServiceCfg.st_XSql.bEnable) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 501; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求删除文件:%s HASH失败,没有启用数据库,无法使用此功能!"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFileHash); - return TRUE; + return true; } Database_File_FileQuery(&ppSt_DBQuery, &nQueryCount, NULL, NULL, NULL, NULL, NULL, ppSt_DBFile[i]->st_ProtocolFile.tszFileHash); //删除数据库与文件 @@ -250,12 +250,12 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp if (!st_ServiceCfg.st_XSql.bEnable) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 501; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求删除文件:%s 名称失败,没有启用数据库,无法使用此功能!"), lpszClientAddr, tszFileDir); - return TRUE; + return true; } Database_File_FileQuery(&ppSt_DBQuery, &nQueryCount, NULL, NULL, NULL, tszFileDir); //删除数据库与文件 @@ -271,7 +271,7 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求删除文件名称成功,文件名:%s/%s"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); } } - RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_DBFile, nListCount); } @@ -319,19 +319,19 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp _tcscat(tszRealDir, _T("/*")); } } - if (!SystemApi_File_EnumFile(tszRealDir, &ppszListDir, &nListCount, NULL, NULL, TRUE, 2)) + if (!SystemApi_File_EnumFile(tszRealDir, &ppszListDir, &nListCount, NULL, NULL, true, 2)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求查询文件夹:%s,失败,错误:%lX"), lpszClientAddr, tszRealDir, SystemApi_GetLastError()); return FALSE; } Protocol_StoragePacket_DirOperator(tszRVBuffer, &nRVLen, &ppszListDir, nListCount); BaseLib_OperatorMemory_Free((XPPPMEM)&ppszListDir, nListCount); - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求查询文件夹:%s,成功,文件夹个数:%d"), lpszClientAddr, tszRealDir, nListCount); } @@ -339,15 +339,15 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp { if (!SystemApi_File_CreateMutilFolder(tszRealDir)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求创建文件夹:%s,失败,错误:%lX"), lpszClientAddr, tszRealDir, SystemApi_GetLastError()); return FALSE; } - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求创建文件夹:%s,成功"), lpszClientAddr, tszRealDir); } @@ -355,15 +355,15 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp { if (!SystemApi_File_DeleteMutilFolder(tszRealDir)) { - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求删除文件夹:%s,失败,错误:%lX"), lpszClientAddr, tszRealDir, SystemApi_GetLastError()); return FALSE; } - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求删除文件夹:%s,成功"), lpszClientAddr, tszRealDir); } @@ -379,11 +379,11 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp Session_UPStorage_GetAll(&ppSt_UPInfo, &nUPCount); Protocol_StoragePacket_Info(tszRVBuffer, &nRVLen, &ppSt_DLInfo, &ppSt_UPInfo, nDLCount, nUPCount); - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_DLInfo, nDLCount); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_UPInfo, nUPCount); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求获取上传下载信息成功,下载个数:%d,上传个数:%d"), lpszClientAddr, nDLCount, nUPCount); } - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp index 644e578..294240a 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp @@ -9,7 +9,7 @@ BOOL XEngine_Task_Pass(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lpsz memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); memset(&st_HDRParam, '\0', sizeof(RFCCOMPONENTS_HTTP_HDRPARAM)); - st_HDRParam.bIsClose = TRUE; + st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; //下载 if (0 == _tcsnicmp(XENGINE_STORAGE_APP_METHOD_UPFILE, lpszAPIName, _tcslen(XENGINE_STORAGE_APP_METHOD_UPFILE))) @@ -38,9 +38,9 @@ BOOL XEngine_Task_Pass(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lpsz memset(tszClientAddr, '\0', sizeof(tszClientAddr)); Protocol_StorageParse_ProxyNotify(lpszMsgBuffer, nMsgLen, tszClientAddr, tszPathKey, tszFileName, tszFileHash, &nFileSize); - RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); + HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求的下载文件通知协议成功,文件:%s,大小:%lld"), lpszClientAddr, tszFileName, nFileSize); } - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp index 03fd2d1..369713b 100644 --- a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp +++ b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp @@ -1,7 +1,7 @@ #include "StorageApp_Hdr.h" BOOL bIsRun = FALSE; -XLOG xhLog = NULL; +XHANDLE xhLog = NULL; XHANDLE xhHBDownload = NULL; XHANDLE xhHBUPLoader = NULL; @@ -36,9 +36,9 @@ void ServiceApp_Stop(int signo) XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("存储中心服务器退出...")); bIsRun = FALSE; - RfcComponents_HttpServer_DestroyEx(xhUPHttp); - RfcComponents_HttpServer_DestroyEx(xhDLHttp); - RfcComponents_HttpServer_DestroyEx(xhCenterHttp); + HttpProtocol_Server_DestroyEx(xhUPHttp); + HttpProtocol_Server_DestroyEx(xhDLHttp); + HttpProtocol_Server_DestroyEx(xhCenterHttp); OPenSsl_Server_StopEx(xhDLSsl); OPenSsl_Server_StopEx(xhUPSsl); @@ -112,7 +112,7 @@ int main(int argc, char** argv) WSADATA st_WSAData; WSAStartup(MAKEWORD(2, 2), &st_WSAData); #endif - bIsRun = TRUE; + bIsRun = true; string m_StrVersion; LPCTSTR lpszHTTPMime = _T("./XEngine_Config/HttpMime.types"); LPCTSTR lpszHTTPCode = _T("./XEngine_Config/HttpCode.types"); @@ -226,10 +226,10 @@ int main(int argc, char** argv) //启动下载服务 if (st_ServiceCfg.nStorageDLPort > 0) { - xhDLHttp = RfcComponents_HttpServer_InitEx(lpszHTTPCode, lpszHTTPMime, st_ServiceCfg.st_XMax.nStorageDLThread); + xhDLHttp = HttpProtocol_Server_InitEx(lpszHTTPCode, lpszHTTPMime, st_ServiceCfg.st_XMax.nStorageDLThread); if (NULL == xhDLHttp) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化HTTP下载服务失败,错误:%lX"), HttpServer_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化HTTP下载服务失败,错误:%lX"), HttpProtocol_GetLastError()); goto XENGINE_EXITAPP; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化HTTP下载服务成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nStorageDLThread); @@ -286,10 +286,10 @@ int main(int argc, char** argv) //启动上传服务 if (st_ServiceCfg.nStorageUPPort > 0) { - xhUPHttp = RfcComponents_HttpServer_InitEx(lpszHTTPCode, lpszHTTPMime, st_ServiceCfg.st_XMax.nStorageUPThread); + xhUPHttp = HttpProtocol_Server_InitEx(lpszHTTPCode, lpszHTTPMime, st_ServiceCfg.st_XMax.nStorageUPThread); if (NULL == xhDLHttp) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化HTTP上传服务失败,错误:%lX"), HttpServer_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化HTTP上传服务失败,错误:%lX"), HttpProtocol_GetLastError()); goto XENGINE_EXITAPP; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化HTTP上传服务成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nStorageUPThread); @@ -346,10 +346,10 @@ int main(int argc, char** argv) //启动接口服务 if (st_ServiceCfg.nCenterPort > 0) { - xhCenterHttp = RfcComponents_HttpServer_InitEx(lpszHTTPCode, lpszHTTPMime, st_ServiceCfg.st_XMax.nCenterThread); + xhCenterHttp = HttpProtocol_Server_InitEx(lpszHTTPCode, lpszHTTPMime, st_ServiceCfg.st_XMax.nCenterThread); if (NULL == xhCenterHttp) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化HTTP业务服务失败,错误:%lX"), HttpServer_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化HTTP业务服务失败,错误:%lX"), HttpProtocol_GetLastError()); goto XENGINE_EXITAPP; } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化HTTP业务服务成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nCenterThread); @@ -420,7 +420,7 @@ int main(int argc, char** argv) XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("所有服务成功启动,存储中心服务运行中,发行版本次数:%d,XEngine版本:%s 当前运行版本:%s。。。"), st_ServiceCfg.st_XVer.pStl_ListStorage->size(), BaseLib_OperatorVer_XGetStr(), st_ServiceCfg.st_XVer.pStl_ListStorage->front().c_str()); - while (TRUE) + while (true) { std::this_thread::sleep_for(std::chrono::seconds(1)); } @@ -432,9 +432,9 @@ XENGINE_EXITAPP: XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("存储中心服务关闭,服务器退出...")); bIsRun = FALSE; - RfcComponents_HttpServer_DestroyEx(xhUPHttp); - RfcComponents_HttpServer_DestroyEx(xhDLHttp); - RfcComponents_HttpServer_DestroyEx(xhCenterHttp); + HttpProtocol_Server_DestroyEx(xhUPHttp); + HttpProtocol_Server_DestroyEx(xhDLHttp); + HttpProtocol_Server_DestroyEx(xhCenterHttp); OPenSsl_Server_StopEx(xhDLSsl); OPenSsl_Server_StopEx(xhUPSsl); -- Gitee From e8677215753a430d52cfdb755f6ae1ae584ca8b1 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 17 Apr 2023 15:56:15 +0800 Subject: [PATCH 02/13] fixed:linux build error --- .../APIHelp_Api/APIHelp_Api.cpp | 120 +++++++------- .../APIHelp_Api/APIHelp_Api.h | 10 +- .../StorageModule_APIHelp/APIHelp_Define.h | 24 +-- .../APIHelp_Distributed.cpp | 138 ++++++++-------- .../APIHelp_Distributed/APIHelp_Distributed.h | 14 +- XEngine_Source/StorageModule_APIHelp/Makefile | 70 ++++---- .../StorageModule_APIHelp/dllmain.cpp | 6 +- XEngine_Source/StorageModule_APIHelp/pch.cpp | 26 +-- XEngine_Source/StorageModule_APIHelp/pch.h | 4 +- .../StorageModule_Config/Config_Define.h | 68 ++++---- .../Config_Json/Config_Json.cpp | 80 ++++----- .../Config_Json/Config_Json.h | 4 +- XEngine_Source/StorageModule_Config/Makefile | 67 +++++--- .../StorageModule_Config/dllmain.cpp | 6 +- XEngine_Source/StorageModule_Config/pch.cpp | 10 +- XEngine_Source/StorageModule_Config/pch.h | 4 +- .../StorageModule_Database/Database_Define.h | 24 +-- .../Database_File/Database_File.cpp | 152 +++++++++--------- .../Database_File/Database_File.h | 20 +-- .../Database_Help/Database_Help.cpp | 100 ++++++------ .../Database_Help/Database_Help.h | 8 +- .../StorageModule_Database/Makefile | 68 ++++---- .../StorageModule_Database/dllmain.cpp | 6 +- XEngine_Source/StorageModule_Database/pch.cpp | 22 +-- XEngine_Source/StorageModule_Database/pch.h | 4 +- .../StorageModule_Protocol/Makefile | 72 +++++---- .../Protocol_StoragePacket.cpp | 48 +++--- .../Protocol_Packet/Protocol_StoragePacket.h | 12 +- .../Protocol_Parse/Protocol_StorageParse.cpp | 92 +++++------ .../Protocol_Parse/Protocol_StorageParse.h | 12 +- .../StorageProtocol_Define.h | 26 +-- .../StorageModule_Protocol/dllmain.cpp | 6 +- XEngine_Source/StorageModule_Protocol/pch.cpp | 30 ++-- XEngine_Source/StorageModule_Protocol/pch.h | 4 +- XEngine_Source/StorageModule_Session/Makefile | 71 ++++---- .../StorageModule_Session/Session_Define.h | 58 +++---- .../Session_Stroage/Session_DLStroage.cpp | 90 +++++------ .../Session_Stroage/Session_DLStroage.h | 20 +-- .../Session_Stroage/Session_UPStroage.cpp | 98 +++++------ .../Session_Stroage/Session_UPStroage.h | 22 +-- .../Session_User/Session_User.cpp | 38 ++--- .../Session_User/Session_User.h | 12 +- .../StorageModule_Session/dllmain.cpp | 6 +- XEngine_Source/StorageModule_Session/pch.cpp | 52 +++--- XEngine_Source/StorageModule_Session/pch.h | 4 +- XEngine_Source/XEngine_StorageApp/Makefile | 70 ++++---- .../XEngine_StorageApp/StorageApp_Center.cpp | 72 ++++----- .../XEngine_StorageApp/StorageApp_Center.h | 16 +- .../XEngine_StorageApp/StorageApp_Config.cpp | 46 +++--- .../XEngine_StorageApp/StorageApp_Config.h | 2 +- .../StorageApp_Download.cpp | 112 ++++++------- .../XEngine_StorageApp/StorageApp_Download.h | 8 +- .../XEngine_StorageApp/StorageApp_Hdr.h | 7 +- .../XEngine_StorageApp/StorageApp_Network.cpp | 98 +++++------ .../XEngine_StorageApp/StorageApp_Network.h | 28 ++-- .../StorageApp_UPLoader.cpp | 138 ++++++++-------- .../XEngine_StorageApp/StorageApp_UPLoader.h | 4 +- .../Storage_APPTask/Storage_TaskManage.cpp | 148 ++++++++--------- .../Storage_APPTask/Storage_TaskManage.h | 12 +- .../Storage_APPTask/Storage_TaskP2p.cpp | 20 +-- .../Storage_APPTask/Storage_TaskPass.cpp | 22 +-- .../Storage_APPTask/Storage_TaskPass.h | 2 +- .../XEngine_StorageApp/XEngine_StorageApp.cpp | 150 ++++++++--------- .../XEngine_ThirdPart/jsoncpp/Makefile | 74 +++++---- XEngine_Source/XStorage_Protocol.h | 50 +++--- 65 files changed, 1502 insertions(+), 1405 deletions(-) diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp index fbe7bb8..8be3222 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp @@ -50,15 +50,15 @@ CAPIHelp_Api::~CAPIHelp_Api() 意思:是否成功 备注: *********************************************************************/ -BOOL CAPIHelp_Api::APIHelp_Api_ProxyAuth(TCHAR* ptszUser, TCHAR* ptszPass, TCHAR** pptszListHdr, int nHdrCount) +bool CAPIHelp_Api::APIHelp_Api_ProxyAuth(XCHAR* ptszUser, XCHAR* ptszPass, XCHAR** pptszListHdr, int nHdrCount) { - APIHelp_IsErrorOccur = FALSE; + APIHelp_IsErrorOccur = false; int nAuthType = 0; int nAuthLen = MAX_PATH; - TCHAR tszAuthStr[MAX_PATH]; - TCHAR tszSDBuffer[1024]; + XCHAR tszAuthStr[MAX_PATH]; + XCHAR tszSDBuffer[1024]; memset(tszAuthStr, '\0', MAX_PATH); memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); @@ -67,14 +67,14 @@ BOOL CAPIHelp_Api::APIHelp_Api_ProxyAuth(TCHAR* ptszUser, TCHAR* ptszPass, TCHAR { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTAUTH; - return FALSE; + return false; } //是否是BASIC if (1 != nAuthType) { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTSUPPORT; - return FALSE; + return false; } OPenSsl_Help_BasicDecoder(tszAuthStr, ptszUser, ptszPass); return true; @@ -112,16 +112,16 @@ BOOL CAPIHelp_Api::APIHelp_Api_ProxyAuth(TCHAR* ptszUser, TCHAR* ptszPass, TCHAR 意思:是否成功 备注: *********************************************************************/ -BOOL CAPIHelp_Api::APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64x* pInt_Count, TCHAR** pptszListHdr, int nHdrCount) +bool CAPIHelp_Api::APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64x* pInt_Count, XCHAR** pptszListHdr, int nHdrCount) { - APIHelp_IsErrorOccur = FALSE; + APIHelp_IsErrorOccur = false; - BOOL bFound = FALSE; - LPCTSTR lpszRangeStr = _T("Range"); - LPCTSTR lpszLengthStr = _T("Content-Length"); - TCHAR tszKeyStr[128]; - TCHAR tszValueStr[128]; - TCHAR tszFieldStr[128]; + bool bFound = false; + LPCXSTR lpszRangeStr = _X("Range"); + LPCXSTR lpszLengthStr = _X("Content-Length"); + XCHAR tszKeyStr[128]; + XCHAR tszValueStr[128]; + XCHAR tszFieldStr[128]; memset(tszKeyStr, '\0', sizeof(tszKeyStr)); memset(tszValueStr, '\0', sizeof(tszValueStr)); @@ -131,7 +131,7 @@ BOOL CAPIHelp_Api::APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64 { //是否没有找到 int nBPos = 0; //某些时候有个BYTE - if (NULL != _tcsstr(tszFieldStr, _T("bytes="))) + if (NULL != _tcsxstr(tszFieldStr, _X("bytes="))) { nBPos = 6; } @@ -139,24 +139,24 @@ BOOL CAPIHelp_Api::APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64 { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARSELEN; - return FALSE; + return false; } //得到 1/2 如果有的话 - TCHAR tszRangeEnd[128]; - TCHAR tszRangeCount[128]; + XCHAR tszRangeEnd[128]; + XCHAR tszRangeCount[128]; memset(tszRangeEnd, '\0', sizeof(tszRangeEnd)); memset(tszRangeCount, '\0', sizeof(tszRangeCount)); if (BaseLib_OperatorString_GetKeyValue(tszValueStr, "/", tszRangeEnd, tszRangeCount)) { - *pInt_SPos = _ttoi(tszKeyStr); - *pInt_EPos = _ttoi(tszRangeEnd); - *pInt_Count = _ttoi64(tszRangeCount); + *pInt_SPos = _ttxoi(tszKeyStr); + *pInt_EPos = _ttxoi(tszRangeEnd); + *pInt_Count = _ttxoll(tszRangeCount); } else { - *pInt_SPos = _ttoi(tszKeyStr); - *pInt_EPos = _ttoi(tszValueStr); + *pInt_SPos = _ttxoi(tszKeyStr); + *pInt_EPos = _ttxoi(tszValueStr); } bFound = true; } @@ -165,7 +165,7 @@ BOOL CAPIHelp_Api::APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64 { if (HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, lpszLengthStr, tszFieldStr)) { - *pInt_Count = _ttoi64(tszFieldStr); + *pInt_Count = _ttxoll(tszFieldStr); bFound = true; } } @@ -174,7 +174,7 @@ BOOL CAPIHelp_Api::APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64 { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTLENGTH; - return FALSE; + return false; } return true; @@ -202,25 +202,25 @@ BOOL CAPIHelp_Api::APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64 意思:是否成功 备注: *********************************************************************/ -BOOL CAPIHelp_Api::APIHelp_Api_VerHash(LPCTSTR lpszFileHash, TCHAR** pptszListHdr, int nHdrCount) +bool CAPIHelp_Api::APIHelp_Api_VerHash(LPCXSTR lpszFileHash, XCHAR** pptszListHdr, int nHdrCount) { - APIHelp_IsErrorOccur = FALSE; + APIHelp_IsErrorOccur = false; - LPCTSTR lpszKeyStr = _T("FileHash"); - TCHAR tszValueStr[MAX_PATH]; + LPCXSTR lpszKeyStr = _X("FileHash"); + XCHAR tszValueStr[MAX_PATH]; memset(tszValueStr, '\0', MAX_PATH); if (!HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, lpszKeyStr, tszValueStr)) { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTHASH; - return FALSE; + return false; } - if (0 != _tcsnicmp(lpszFileHash, tszValueStr, _tcslen(lpszFileHash))) + if (0 != _tcsxnicmp(lpszFileHash, tszValueStr, _tcsxlen(lpszFileHash))) { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTMATCH; - return FALSE; + return false; } return true; } @@ -247,9 +247,9 @@ BOOL CAPIHelp_Api::APIHelp_Api_VerHash(LPCTSTR lpszFileHash, TCHAR** pptszListHd 意思:是否成功 备注: *********************************************************************/ -BOOL CAPIHelp_Api::APIHelp_Api_GetIPInfo(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_IPADDRINFO* pSt_IPAddrInfo) +bool CAPIHelp_Api::APIHelp_Api_GetIPInfo(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_IPADDRINFO* pSt_IPAddrInfo) { - APIHelp_IsErrorOccur = FALSE; + APIHelp_IsErrorOccur = false; Json::Value st_JsonRoot; JSONCPP_STRING st_JsonError; @@ -260,27 +260,27 @@ BOOL CAPIHelp_Api::APIHelp_Api_GetIPInfo(LPCTSTR lpszMsgBuffer, int nMsgLen, XEN { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARSE; - return FALSE; + return false; } //是否获取成功 if (0 != st_JsonRoot["code"].asInt()) { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_CODE; - return FALSE; + return false; } Json::Value st_JsonObject = st_JsonRoot["data"]; - _tcscpy(pSt_IPAddrInfo->tszIPStart, st_JsonObject["tszIPStart"].asCString()); - _tcscpy(pSt_IPAddrInfo->tszIPEnd, st_JsonObject["tszIPEnd"].asCString()); - _tcscpy(pSt_IPAddrInfo->tszIPAddress, st_JsonObject["tszIPAddress"].asCString()); - _tcscpy(pSt_IPAddrInfo->tszIPAddr, st_JsonObject["tszIPAddr"].asCString()); - _tcscpy(pSt_IPAddrInfo->tszIPCity, st_JsonObject["tszIPCity"].asCString()); - _tcscpy(pSt_IPAddrInfo->tszIPCountry, st_JsonObject["tszIPCountry"].asCString()); - _tcscpy(pSt_IPAddrInfo->tszIPCounty, st_JsonObject["tszIPCounty"].asCString()); - _tcscpy(pSt_IPAddrInfo->tszIPProvince, st_JsonObject["tszIPProvince"].asCString()); - _tcscpy(pSt_IPAddrInfo->tszIPISP, st_JsonObject["tszIPISP"].asCString()); - _tcscpy(pSt_IPAddrInfo->tszIPTime, st_JsonObject["tszIPTime"].asCString()); + _tcsxcpy(pSt_IPAddrInfo->tszIPStart, st_JsonObject["tszIPStart"].asCString()); + _tcsxcpy(pSt_IPAddrInfo->tszIPEnd, st_JsonObject["tszIPEnd"].asCString()); + _tcsxcpy(pSt_IPAddrInfo->tszIPAddress, st_JsonObject["tszIPAddress"].asCString()); + _tcsxcpy(pSt_IPAddrInfo->tszIPAddr, st_JsonObject["tszIPAddr"].asCString()); + _tcsxcpy(pSt_IPAddrInfo->tszIPCity, st_JsonObject["tszIPCity"].asCString()); + _tcsxcpy(pSt_IPAddrInfo->tszIPCountry, st_JsonObject["tszIPCountry"].asCString()); + _tcsxcpy(pSt_IPAddrInfo->tszIPCounty, st_JsonObject["tszIPCounty"].asCString()); + _tcsxcpy(pSt_IPAddrInfo->tszIPProvince, st_JsonObject["tszIPProvince"].asCString()); + _tcsxcpy(pSt_IPAddrInfo->tszIPISP, st_JsonObject["tszIPISP"].asCString()); + _tcsxcpy(pSt_IPAddrInfo->tszIPTime, st_JsonObject["tszIPTime"].asCString()); return true; } @@ -312,41 +312,41 @@ BOOL CAPIHelp_Api::APIHelp_Api_GetIPInfo(LPCTSTR lpszMsgBuffer, int nMsgLen, XEN 意思:是否成功 备注: *********************************************************************/ -BOOL CAPIHelp_Api::APIHelp_Api_UrlParse(TCHAR*** ppptszList, int nListCount, TCHAR* ptszFileName, TCHAR* ptszKeyName) +bool CAPIHelp_Api::APIHelp_Api_UrlParse(XCHAR*** ppptszList, int nListCount, XCHAR* ptszFileName, XCHAR* ptszKeyName) { - APIHelp_IsErrorOccur = FALSE; + APIHelp_IsErrorOccur = false; - LPCTSTR lpszHDRFile = _T("filename"); - LPCTSTR lpszHDRKey = _T("storeagekey"); + LPCXSTR lpszHDRFile = _X("filename"); + LPCXSTR lpszHDRKey = _X("storeagekey"); for (int i = 0; i < nListCount; i++) { - TCHAR tszKey[MAX_PATH]; - TCHAR tszValue[MAX_PATH]; + XCHAR tszKey[MAX_PATH]; + XCHAR tszValue[MAX_PATH]; memset(tszKey, '\0', MAX_PATH); memset(tszValue, '\0', MAX_PATH); - BaseLib_OperatorString_GetKeyValue((*ppptszList)[i], _T("="), tszKey, tszValue); + BaseLib_OperatorString_GetKeyValue((*ppptszList)[i], _X("="), tszKey, tszValue); - if (0 == _tcsnicmp(lpszHDRFile, tszKey, _tcslen(lpszHDRFile))) + if (0 == _tcsxnicmp(lpszHDRFile, tszKey, _tcsxlen(lpszHDRFile))) { //编码格式是utf8,需要转为ansi #ifdef _MSC_BUILD - TCHAR tszFileName[MAX_PATH]; + XCHAR tszFileName[MAX_PATH]; memset(tszFileName, '\0', MAX_PATH); - OPenSsl_Codec_UrlDeCodec(tszValue, _tcslen(tszValue), tszFileName); + OPenSsl_Codec_UrlDeCodec(tszValue, _tcsxlen(tszValue), tszFileName); - int nLen = _tcslen(tszFileName); + int nLen = _tcsxlen(tszFileName); BaseLib_OperatorCharset_UTFToAnsi(tszFileName, ptszFileName, &nLen); #else - OPenSsl_Codec_UrlDeCodec(tszValue, _tcslen(tszValue), ptszFileName); + OPenSsl_Codec_UrlDeCodec(tszValue, _tcsxlen(tszValue), ptszFileName); #endif } - else if (0 == _tcsnicmp(lpszHDRKey, tszKey, _tcslen(lpszHDRKey))) + else if (0 == _tcsxnicmp(lpszHDRKey, tszKey, _tcsxlen(lpszHDRKey))) { - _tcscpy(ptszKeyName, tszValue); + _tcsxcpy(ptszKeyName, tszValue); } } return true; diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h index d1f0799..8dc88ff 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h @@ -18,11 +18,11 @@ public: CAPIHelp_Api(); ~CAPIHelp_Api(); public: - BOOL APIHelp_Api_ProxyAuth(TCHAR* ptszUser, TCHAR* ptszPass, TCHAR** pptszListHdr, int nHdrCount); - BOOL APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64x* pInt_Count, TCHAR** pptszListHdr, int nHdrCount); - BOOL APIHelp_Api_VerHash(LPCTSTR lpszFileHash, TCHAR** pptszListHdr, int nHdrCount); - BOOL APIHelp_Api_GetIPInfo(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_IPADDRINFO* pSt_IPAddrInfo); - BOOL APIHelp_Api_UrlParse(TCHAR*** ppptszList, int nListCount, TCHAR* ptszFileName, TCHAR* ptszKeyName); + bool APIHelp_Api_ProxyAuth(XCHAR* ptszUser, XCHAR* ptszPass, XCHAR** pptszListHdr, int nHdrCount); + bool APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64x* pInt_Count, XCHAR** pptszListHdr, int nHdrCount); + bool APIHelp_Api_VerHash(LPCXSTR lpszFileHash, XCHAR** pptszListHdr, int nHdrCount); + bool APIHelp_Api_GetIPInfo(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_IPADDRINFO* pSt_IPAddrInfo); + bool APIHelp_Api_UrlParse(XCHAR*** ppptszList, int nListCount, XCHAR* ptszFileName, XCHAR* ptszKeyName); protected: private: }; \ No newline at end of file diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h b/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h index 70010c6..0be9169 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h @@ -12,13 +12,13 @@ *********************************************************************/ typedef struct { - TCHAR tszMsgBuffer[4096]; + XCHAR tszMsgBuffer[4096]; int nMsgLen; }APIHELP_LBFILEINFO; ////////////////////////////////////////////////////////////////////////// // 导出函数 ////////////////////////////////////////////////////////////////////////// -extern "C" DWORD StorageHelp_GetLastError(int* pInt_SysError = NULL); +extern "C" XLONG StorageHelp_GetLastError(int* pInt_SysError = NULL); /************************************************************************/ /* 分布式函数 */ /************************************************************************/ @@ -45,7 +45,7 @@ extern "C" DWORD StorageHelp_GetLastError(int* pInt_SysError = NULL); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL APIHelp_Distributed_RandomAddr(list* pStl_ListAddr, TCHAR* ptszAddr, int nMode); +extern "C" bool APIHelp_Distributed_RandomAddr(list* pStl_ListAddr, XCHAR* ptszAddr, int nMode); /******************************************************************** 函数名称:APIHelp_Distributed_FileList 函数功能:解析所有解析到的内容并且打包成指定结构 @@ -69,7 +69,7 @@ extern "C" BOOL APIHelp_Distributed_RandomAddr(list* pStl_ListAddr, TCHA 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL APIHelp_Distributed_FileList(list* pStl_ListParse, XSTORAGECORE_DBFILE*** pppSt_ListPacket, int* pInt_ListCount); +extern "C" bool APIHelp_Distributed_FileList(list* pStl_ListParse, XSTORAGECORE_DBFILE*** pppSt_ListPacket, int* pInt_ListCount); /******************************************************************** 函数名称:APIHelp_Distributed_DLStorage 函数功能:通过URLKEY得到一个对应下载地址 @@ -93,7 +93,7 @@ extern "C" BOOL APIHelp_Distributed_FileList(list* pStl_List 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL APIHelp_Distributed_DLStorage(LPCTSTR lpszMsgBuffer, list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket); +extern "C" bool APIHelp_Distributed_DLStorage(LPCXSTR lpszMsgBuffer, list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket); /******************************************************************** 函数名称:APIHelp_Distributed_UPStorage 函数功能:通过分布式存储列表获得一个存储地址 @@ -117,7 +117,7 @@ extern "C" BOOL APIHelp_Distributed_DLStorage(LPCTSTR lpszMsgBuffer, list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket, int nMode); +extern "C" bool APIHelp_Distributed_UPStorage(list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket, int nMode); /******************************************************************** 函数名称:APIHelp_Distributed_GetPathKey 函数功能:通过BUCKET名称查找对应路径 @@ -141,7 +141,7 @@ extern "C" BOOL APIHelp_Distributed_UPStorage(list* pStl_ 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL APIHelp_Distributed_GetPathKey(list* pStl_ListBucket, LPCTSTR lpszBuckKey, TCHAR* ptszFilePath); +extern "C" bool APIHelp_Distributed_GetPathKey(list* pStl_ListBucket, LPCXSTR lpszBuckKey, XCHAR* ptszFilePath); /************************************************************************/ /* 帮助函数 */ /************************************************************************/ @@ -173,7 +173,7 @@ extern "C" BOOL APIHelp_Distributed_GetPathKey(list* pStl 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL APIHelp_Api_ProxyAuth(TCHAR* ptszUser, TCHAR* ptszPass, TCHAR** pptszListHdr, int nHdrCount); +extern "C" bool APIHelp_Api_ProxyAuth(XCHAR* ptszUser, XCHAR* ptszPass, XCHAR** pptszListHdr, int nHdrCount); /******************************************************************** 函数名称:APIHelp_Api_RangeFile 函数功能:获取HTTP的范围 @@ -207,7 +207,7 @@ extern "C" BOOL APIHelp_Api_ProxyAuth(TCHAR* ptszUser, TCHAR* ptszPass, TCHAR** 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64x* pInt_Count, TCHAR** pptszListHdr, int nHdrCount); +extern "C" bool APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64x* pInt_Count, XCHAR** pptszListHdr, int nHdrCount); /******************************************************************** 函数名称:APIHelp_Api_VerHash 函数功能:验证HASH值 @@ -231,7 +231,7 @@ extern "C" BOOL APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64x* 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL APIHelp_Api_VerHash(LPCTSTR lpszFileHash, TCHAR** pptszListHdr, int nHdrCount); +extern "C" bool APIHelp_Api_VerHash(LPCXSTR lpszFileHash, XCHAR** pptszListHdr, int nHdrCount); /******************************************************************** 函数名称:APIHelp_Api_GetIPInfo 函数功能:获取IP信息 @@ -255,7 +255,7 @@ extern "C" BOOL APIHelp_Api_VerHash(LPCTSTR lpszFileHash, TCHAR** pptszListHdr, 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL APIHelp_Api_GetIPInfo(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_IPADDRINFO* pSt_IPAddrInfo); +extern "C" bool APIHelp_Api_GetIPInfo(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_IPADDRINFO* pSt_IPAddrInfo); /******************************************************************** 函数名称:APIHelp_Api_UrlParse 函数功能:URL参数解析函数 @@ -284,4 +284,4 @@ extern "C" BOOL APIHelp_Api_GetIPInfo(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGIN 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL APIHelp_Api_UrlParse(TCHAR*** ppptszList, int nListCount, TCHAR* ptszFileName, TCHAR* ptszKeyName); \ No newline at end of file +extern "C" bool APIHelp_Api_UrlParse(XCHAR*** ppptszList, int nListCount, XCHAR* ptszFileName, XCHAR* ptszKeyName); \ No newline at end of file diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp b/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp index 4aedacb..5e4e408 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp @@ -48,22 +48,22 @@ CAPIHelp_Distributed::~CAPIHelp_Distributed() 意思:是否成功 备注: *********************************************************************/ -BOOL CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_ListAddr, TCHAR* ptszAddr, int nMode) +bool CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_ListAddr, XCHAR* ptszAddr, int nMode) { - APIHelp_IsErrorOccur = FALSE; + APIHelp_IsErrorOccur = false; if (!pStl_ListAddr->empty()) { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARAMENT; - return FALSE; + return false; } - BOOL bFound = FALSE; + bool bFound = false; if (1 == nMode) { XNETHANDLE xhToken = 0; - BaseLib_OperatorHandle_Create(&xhToken, 0, pStl_ListAddr->size(), FALSE); + BaseLib_OperatorHandle_Create(&xhToken, 0, pStl_ListAddr->size(), false); if (xhToken == pStl_ListAddr->size()) { xhToken--; @@ -74,7 +74,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_Lis if (xhToken == i) { bFound = true; - _tcscpy(ptszAddr, stl_ListIterator->c_str()); + _tcsxcpy(ptszAddr, stl_ListIterator->c_str()); break; } } @@ -91,7 +91,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_Lis if (nRandomFront == i) { bFound = true; - _tcscpy(ptszAddr, stl_ListIterator->c_str()); + _tcsxcpy(ptszAddr, stl_ListIterator->c_str()); break; } } @@ -108,7 +108,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_Lis if (nRandomBack == i) { bFound = true; - _tcscpy(ptszAddr, stl_ListIterator->c_str()); + _tcsxcpy(ptszAddr, stl_ListIterator->c_str()); break; } } @@ -118,7 +118,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_Lis { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTFOUND; - return FALSE; + return false; } return true; } @@ -145,15 +145,15 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_RandomAddr(list* pStl_Lis 意思:是否成功 备注: *********************************************************************/ -BOOL CAPIHelp_Distributed::APIHelp_Distributed_FileList(list* pStl_ListParse, XSTORAGECORE_DBFILE*** pppSt_ListPacket, int* pInt_ListCount) +bool CAPIHelp_Distributed::APIHelp_Distributed_FileList(list* pStl_ListParse, XSTORAGECORE_DBFILE*** pppSt_ListPacket, int* pInt_ListCount) { - APIHelp_IsErrorOccur = FALSE; + APIHelp_IsErrorOccur = false; if ((NULL == pStl_ListParse) || (NULL == pppSt_ListPacket)) { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARAMENT; - return FALSE; + return false; } BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_ListPacket, pStl_ListParse->size(), sizeof(XSTORAGECORE_DBFILE)); @@ -188,22 +188,22 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_FileList(list 意思:是否成功 备注: *********************************************************************/ -BOOL CAPIHelp_Distributed::APIHelp_Distributed_DLStorage(LPCTSTR lpszMsgBuffer, list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket) +bool CAPIHelp_Distributed::APIHelp_Distributed_DLStorage(LPCXSTR lpszMsgBuffer, list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket) { - APIHelp_IsErrorOccur = FALSE; + APIHelp_IsErrorOccur = false; if ((NULL == lpszMsgBuffer) || (NULL == pSt_StorageBucket)) { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARAMENT; - return FALSE; + return false; } - BOOL bFound = FALSE; - TCHAR tszKeyStr[128]; + bool bFound = false; + XCHAR tszKeyStr[128]; memset(tszKeyStr, '\0', sizeof(tszKeyStr)); //获得key int i = 1; - int nLen = _tcslen(lpszMsgBuffer); + int nLen = _tcsxlen(lpszMsgBuffer); for (; i < nLen; i++) { if ('/' == lpszMsgBuffer[i]) @@ -217,13 +217,13 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_DLStorage(LPCTSTR lpszMsgBuffer, { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTFOUND; - return FALSE; + return false; } - bFound = FALSE; + bFound = false; //获得对应存储 for (auto stl_ListIterator = pStl_ListBucket->begin(); stl_ListIterator != pStl_ListBucket->end(); stl_ListIterator++) { - if (0 == _tcsncmp(tszKeyStr, stl_ListIterator->tszBuckKey, _tcslen(tszKeyStr))) + if (0 == _tcsxncmp(tszKeyStr, stl_ListIterator->tszBuckKey, _tcsxlen(tszKeyStr))) { bFound = true; *pSt_StorageBucket = *stl_ListIterator; @@ -234,9 +234,9 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_DLStorage(LPCTSTR lpszMsgBuffer, { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTFOUND; - return FALSE; + return false; } - _tcscpy(pSt_StorageBucket->tszFileName, lpszMsgBuffer + i); + _tcsxcpy(pSt_StorageBucket->tszFileName, lpszMsgBuffer + i); return true; } /******************************************************************** @@ -262,24 +262,24 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_DLStorage(LPCTSTR lpszMsgBuffer, 意思:是否成功 备注: *********************************************************************/ -BOOL CAPIHelp_Distributed::APIHelp_Distributed_UPStorage(list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket, int nMode) +bool CAPIHelp_Distributed::APIHelp_Distributed_UPStorage(list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket, int nMode) { - APIHelp_IsErrorOccur = FALSE; + APIHelp_IsErrorOccur = false; if ((NULL == pStl_ListBucket) || (NULL == pSt_StorageBucket)) { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARAMENT; - return FALSE; + return false; } if (4 == nMode) { - BOOL bFound = FALSE; + bool bFound = false; //上传专用,由用户指定 list::const_iterator stl_ListIterator = pStl_ListBucket->begin(); for (; stl_ListIterator != pStl_ListBucket->end(); stl_ListIterator++) { - if (0 == _tcsnicmp(pSt_StorageBucket->tszBuckKey, stl_ListIterator->tszBuckKey, _tcslen(pSt_StorageBucket->tszBuckKey))) + if (0 == _tcsxnicmp(pSt_StorageBucket->tszBuckKey, stl_ListIterator->tszBuckKey, _tcsxlen(pSt_StorageBucket->tszBuckKey))) { bFound = true; *pSt_StorageBucket = *stl_ListIterator; @@ -290,7 +290,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_UPStorage(listtszFilePath); - if (tszFilePath[_tcslen(tszFilePath) - 1] != '*') + _tcsxcpy(tszFilePath, pSt_StorageBucket->tszFilePath); + if (tszFilePath[_tcsxlen(tszFilePath) - 1] != '*') { int nPathType = 0; BaseLib_OperatorString_GetPath(tszFilePath, &nPathType); //判断是绝对路径还是相对路径 if (1 == nPathType) { - _tcscat(tszFilePath, _T("\\*")); + _tcsxcat(tszFilePath, _X("\\*")); } else if (2 == nPathType) { - _tcscat(tszFilePath, _T("/*")); + _tcsxcat(tszFilePath, _X("/*")); } } SystemApi_File_EnumFile(tszFilePath, &ppListFile, &nListCount, NULL, NULL, true, 1); for (int j = 0; j < nListCount; j++) { - struct _tstat64 st_FStat; - _tstat64(ppListFile[j], &st_FStat); + struct _xtstat st_FStat; + _xtstat(ppListFile[j], &st_FStat); nDirCount += st_FStat.st_size; } BaseLib_OperatorMemory_Free((XPPPMEM)&ppListFile, nListCount); @@ -362,14 +362,14 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_UPStorage(list* pStl_ListBucket, LPCTSTR lpszBuckKey, TCHAR* ptszFilePath) +bool CAPIHelp_Distributed::APIHelp_Distributed_GetPathKey(list* pStl_ListBucket, LPCXSTR lpszBuckKey, XCHAR* ptszFilePath) { - APIHelp_IsErrorOccur = FALSE; + APIHelp_IsErrorOccur = false; if ((NULL == pStl_ListBucket) || (NULL == lpszBuckKey) || (NULL == ptszFilePath)) { APIHelp_IsErrorOccur = true; APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARAMENT; - return FALSE; + return false; } - BOOL bFound = FALSE; + bool bFound = false; for (auto stl_ListIterator = pStl_ListBucket->begin(); stl_ListIterator != pStl_ListBucket->end(); stl_ListIterator++) { - if (0 == _tcsncmp(lpszBuckKey, stl_ListIterator->tszBuckKey, _tcslen(lpszBuckKey))) + if (0 == _tcsxncmp(lpszBuckKey, stl_ListIterator->tszBuckKey, _tcsxlen(lpszBuckKey))) { - _tcscpy(ptszFilePath, stl_ListIterator->tszFilePath); + _tcsxcpy(ptszFilePath, stl_ListIterator->tszFilePath); bFound = true; break; } @@ -477,7 +477,7 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_GetPathKey(listst_ProtocolFile.nFileSize = st_JsonArray[i]["nFileSize"].asInt64(); - _tcscpy(pSt_DBFile->tszTableName, st_JsonArray[i]["tszTableName"].asCString()); - _tcscpy(pSt_DBFile->tszBuckKey, st_JsonArray[i]["tszBuckKey"].asCString()); - _tcscpy(pSt_DBFile->st_ProtocolFile.tszFileUser, st_JsonArray[i]["tszFileUser"].asCString()); - _tcscpy(pSt_DBFile->st_ProtocolFile.tszFileHash, st_JsonArray[i]["tszFileHash"].asCString()); - _tcscpy(pSt_DBFile->st_ProtocolFile.tszFileName, st_JsonArray[i]["tszFileName"].asCString()); - _tcscpy(pSt_DBFile->st_ProtocolFile.tszFilePath, st_JsonArray[i]["tszFilePath"].asCString()); - _tcscpy(pSt_DBFile->st_ProtocolFile.tszFileTime, st_JsonArray[i]["tszFileTime"].asCString()); + _tcsxcpy(pSt_DBFile->tszTableName, st_JsonArray[i]["tszTableName"].asCString()); + _tcsxcpy(pSt_DBFile->tszBuckKey, st_JsonArray[i]["tszBuckKey"].asCString()); + _tcsxcpy(pSt_DBFile->st_ProtocolFile.tszFileUser, st_JsonArray[i]["tszFileUser"].asCString()); + _tcsxcpy(pSt_DBFile->st_ProtocolFile.tszFileHash, st_JsonArray[i]["tszFileHash"].asCString()); + _tcsxcpy(pSt_DBFile->st_ProtocolFile.tszFileName, st_JsonArray[i]["tszFileName"].asCString()); + _tcsxcpy(pSt_DBFile->st_ProtocolFile.tszFilePath, st_JsonArray[i]["tszFilePath"].asCString()); + _tcsxcpy(pSt_DBFile->st_ProtocolFile.tszFileTime, st_JsonArray[i]["tszFileTime"].asCString()); break; } @@ -554,31 +554,31 @@ BOOL CAPIHelp_Distributed::APIHelp_Distributed_FileListParse(LPCTSTR lpszMsgBuff 意思:获取到的大小字节 备注: *********************************************************************/ -__int64u CAPIHelp_Distributed::APIHelp_Distributed_GetSize(LPCTSTR lpszMsgBuffer) +__int64u CAPIHelp_Distributed::APIHelp_Distributed_GetSize(LPCXSTR lpszMsgBuffer) { - APIHelp_IsErrorOccur = FALSE; + APIHelp_IsErrorOccur = false; - TCHAR tszSizeStr[64]; - TCHAR tszUnitStr[4]; + XCHAR tszSizeStr[64]; + XCHAR tszUnitStr[4]; memset(tszSizeStr, '\0', sizeof(tszSizeStr)); memset(tszUnitStr, '\0', sizeof(tszUnitStr)); //分别得到数字和单位 - memcpy(tszSizeStr, lpszMsgBuffer, _tcslen(lpszMsgBuffer) - 2); - tszUnitStr[0] = lpszMsgBuffer[_tcslen(lpszMsgBuffer) - 2]; - tszUnitStr[1] = lpszMsgBuffer[_tcslen(lpszMsgBuffer) - 1]; + memcpy(tszSizeStr, lpszMsgBuffer, _tcsxlen(lpszMsgBuffer) - 2); + tszUnitStr[0] = lpszMsgBuffer[_tcsxlen(lpszMsgBuffer) - 2]; + tszUnitStr[1] = lpszMsgBuffer[_tcsxlen(lpszMsgBuffer) - 1]; - __int64u nllSize = _ttoi64(tszSizeStr); + __int64u nllSize = _ttxoll(tszSizeStr); //得到单位大小 - if (0 == _tcsncmp(tszUnitStr, _T("KB"), 2)) + if (0 == _tcsxncmp(tszUnitStr, _X("KB"), 2)) { nllSize = nllSize * 1024; } - else if (0 == _tcsncmp(tszUnitStr, _T("MB"), 2)) + else if (0 == _tcsxncmp(tszUnitStr, _X("MB"), 2)) { nllSize = nllSize * 1024 * 1024; } - else if (0 == _tcsncmp(tszUnitStr, _T("GB"), 2)) + else if (0 == _tcsxncmp(tszUnitStr, _X("GB"), 2)) { nllSize = nllSize * 1024 * 1024 * 1024; } diff --git a/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.h b/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.h index 7cb8338..0badcfe 100644 --- a/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.h +++ b/XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.h @@ -18,14 +18,14 @@ public: CAPIHelp_Distributed(); ~CAPIHelp_Distributed(); public: - BOOL APIHelp_Distributed_RandomAddr(list* pStl_ListAddr, TCHAR* ptszAddr, int nMode); - BOOL APIHelp_Distributed_FileList(list* pStl_ListParse, XSTORAGECORE_DBFILE*** pppSt_ListPacket, int* pInt_ListCount); - BOOL APIHelp_Distributed_DLStorage(LPCTSTR lpszMsgBuffer, list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket); - BOOL APIHelp_Distributed_UPStorage(list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket, int nMode); - BOOL APIHelp_Distributed_GetPathKey(list* pStl_ListBucket, LPCTSTR lpszBuckKey, TCHAR* ptszFilePath); + bool APIHelp_Distributed_RandomAddr(list* pStl_ListAddr, XCHAR* ptszAddr, int nMode); + bool APIHelp_Distributed_FileList(list* pStl_ListParse, XSTORAGECORE_DBFILE*** pppSt_ListPacket, int* pInt_ListCount); + bool APIHelp_Distributed_DLStorage(LPCXSTR lpszMsgBuffer, list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket); + bool APIHelp_Distributed_UPStorage(list* pStl_ListBucket, XENGINE_STORAGEBUCKET* pSt_StorageBucket, int nMode); + bool APIHelp_Distributed_GetPathKey(list* pStl_ListBucket, LPCXSTR lpszBuckKey, XCHAR* ptszFilePath); protected: - BOOL APIHelp_Distributed_FileListParse(LPCTSTR lpszMsgBuffer, int nMsgLen, XSTORAGECORE_DBFILE* pSt_DBFile); - __int64u APIHelp_Distributed_GetSize(LPCTSTR lpszMsgBuffer); + bool APIHelp_Distributed_FileListParse(LPCXSTR lpszMsgBuffer, int nMsgLen, XSTORAGECORE_DBFILE* pSt_DBFile); + __int64u APIHelp_Distributed_GetSize(LPCXSTR lpszMsgBuffer); private: unsigned int nRandomFront; unsigned int nRandomBack; diff --git a/XEngine_Source/StorageModule_APIHelp/Makefile b/XEngine_Source/StorageModule_APIHelp/Makefile index 5a1d7a2..fb3a659 100644 --- a/XEngine_Source/StorageModule_APIHelp/Makefile +++ b/XEngine_Source/StorageModule_APIHelp/Makefile @@ -1,30 +1,23 @@ CC = g++ -Wall -std=c++17 -fPIC -SHAREFLAG = -shared -SHAREDLL = so +PLATFORM = linux +PLATVER = +PLATDIR = +FILEEXT = +LIBFLAG = RELEASE = 0 UNICODE = 0 -INCLUDE = -I ./ -I ../XEngine_ThirdPart/jsoncpp -LOADBIN = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_Core -L /usr/local/lib/XEngine_Release/XEngine_RfcComponents -L /usr/local/lib/XEngine_Release/XEngine_SystemSdk -L ../XEngine_ThirdPart/jsoncpp -LIB = -lXEngine_BaseLib -lXEngine_OPenSsl -lRfcComponents_HttpServer -lXEngine_SystemApi -ljsoncpp -LIBEX = -ldl -lpthread -LOADSO = -Wl,-rpath=./,--disable-new-dtags -LIBINCLUDE = APIHelp_Distributed.o APIHelp_Api.o pch.o - -ifeq ($(shell uname),Darwin) - SHAREDLL = dylib - SHAREFLAG = -dynamiclib - LOADSO = -else - SHAREDLL = so - SHAREFLAG = -shared -endif +LOADHDR = -I ./ -I ../XEngine_ThirdPart/jsoncpp +LOADSO = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_Core -L /usr/local/lib/XEngine_Release/XEngine_RfcComponents -L /usr/local/lib/XEngine_Release/XEngine_SystemSdk -L ../XEngine_ThirdPart/jsoncpp +LIB = -lXEngine_BaseLib -lXEngine_OPenSsl -lRfcComponents_HttpProtocol -lXEngine_SystemApi -ljsoncpp +LIBEX = +OBJECTS = APIHelp_Distributed.o APIHelp_Api.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -O2 +FLAGS = -c DEBUG = else -FLAGS = -c -DEBUG = -g +FLAGS = -c -lc_p +DEBUG = -g -pg endif ifeq ($(UNICODE),1) @@ -33,26 +26,47 @@ else UNICODE = endif +ifeq ($(PLATFORM),linux) + ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) + PLATVER = -D __CENTOS__ + PLATDIR = XEngine_Linux/Centos + else + PLATVER = -D __UBUNTU__ + PLATDIR = XEngine_Linux/Ubuntu + endif + FILEEXT = so + LIBFLAG = -shared + LIBEX = -lpthread -lrt -ldl + LOADBIN = -Wl,-rpath=./,--disable-new-dtags +else ifeq ($(PLATFORM),mac) + CC += -Wno-deprecated-declarations + PLATVER = -D __MACOS__ + PLATDIR = XEngine_Mac + FILEEXT = dylib + LIBFLAG = -dynamiclib + LIBEX = -lpthread -ldl + LOADBIN = -Wl,-rpath,@loader_path/./ +endif -all:$(LIBINCLUDE) - $(CC) $(DEBUG) $(LIBINCLUDE) -o libStorageModule_APIHelp.$(SHAREDLL) $(SHAREFLAG) -fPIC $(LOADBIN) $(LIB) $(LIBEX) $(LOADSO) +all:$(OBJECTS) + $(CC) $(DEBUG) $(OBJECTS) -o libStorageModule_APIHelp.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) APIHelp_Distributed.o:./APIHelp_Distributed/APIHelp_Distributed.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./APIHelp_Distributed/APIHelp_Distributed.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./APIHelp_Distributed/APIHelp_Distributed.cpp APIHelp_Api.o:./APIHelp_Api/APIHelp_Api.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./APIHelp_Api/APIHelp_Api.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./APIHelp_Api/APIHelp_Api.cpp pch.o:./pch.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./pch.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp InstallAll:InstallSo -InstallSo:./libStorageModule_APIHelp.$(SHAREDLL) - cp ./libStorageModule_APIHelp.$(SHAREDLL) ../../XEngine_Release/libStorageModule_APIHelp.$(SHAREDLL) +InstallSo:./libStorageModule_APIHelp.$(FILEEXT) + cp ./libStorageModule_APIHelp.$(FILEEXT) ../../XEngine_Release/libStorageModule_APIHelp.$(FILEEXT) CleanAll:CleanObj CleanMk CleanObj: rm *.o CleanMk: - rm *.$(SHAREDLL) + rm *.$(FILEEXT) diff --git a/XEngine_Source/StorageModule_APIHelp/dllmain.cpp b/XEngine_Source/StorageModule_APIHelp/dllmain.cpp index 0745b19..594ff21 100644 --- a/XEngine_Source/StorageModule_APIHelp/dllmain.cpp +++ b/XEngine_Source/StorageModule_APIHelp/dllmain.cpp @@ -1,9 +1,9 @@ // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved +bool APIENTRY DllMain( HMODULE hModule, + XLONG ul_reason_for_call, + XPVOID lpReserved ) { switch (ul_reason_for_call) diff --git a/XEngine_Source/StorageModule_APIHelp/pch.cpp b/XEngine_Source/StorageModule_APIHelp/pch.cpp index 85b5414..e1529ab 100644 --- a/XEngine_Source/StorageModule_APIHelp/pch.cpp +++ b/XEngine_Source/StorageModule_APIHelp/pch.cpp @@ -12,15 +12,15 @@ // Purpose: 导出函数实现 // History: *********************************************************************/ -BOOL APIHelp_IsErrorOccur = FALSE; -DWORD APIHelp_dwErrorCode = 0; +bool APIHelp_IsErrorOccur = false; +XLONG APIHelp_dwErrorCode = 0; ////////////////////////////////////////////////////////////////////////// CAPIHelp_Distributed m_APIDistributed; CAPIHelp_Api m_APIHelp; ////////////////////////////////////////////////////////////////////////// // 导出函数 ////////////////////////////////////////////////////////////////////////// -extern "C" DWORD StorageHelp_GetLastError(int* pInt_SysError) +extern "C" XLONG StorageHelp_GetLastError(int* pInt_SysError) { if (NULL != pInt_SysError) { @@ -31,46 +31,46 @@ extern "C" DWORD StorageHelp_GetLastError(int* pInt_SysError) /************************************************************************/ /* */ /************************************************************************/ -extern "C" BOOL APIHelp_Distributed_RandomAddr(list*pStl_ListAddr, TCHAR * ptszAddr, int nMode) +extern "C" bool APIHelp_Distributed_RandomAddr(list*pStl_ListAddr, XCHAR * ptszAddr, int nMode) { return m_APIDistributed.APIHelp_Distributed_RandomAddr(pStl_ListAddr, ptszAddr, nMode); } -extern "C" BOOL APIHelp_Distributed_FileList(list*pStl_ListParse, XSTORAGECORE_DBFILE * **pppSt_ListPacket, int* pInt_ListCount) +extern "C" bool APIHelp_Distributed_FileList(list*pStl_ListParse, XSTORAGECORE_DBFILE * **pppSt_ListPacket, int* pInt_ListCount) { return m_APIDistributed.APIHelp_Distributed_FileList(pStl_ListParse, pppSt_ListPacket, pInt_ListCount); } -extern "C" BOOL APIHelp_Distributed_DLStorage(LPCTSTR lpszMsgBuffer, list*pStl_ListBucket, XENGINE_STORAGEBUCKET * pSt_StorageBucket) +extern "C" bool APIHelp_Distributed_DLStorage(LPCXSTR lpszMsgBuffer, list*pStl_ListBucket, XENGINE_STORAGEBUCKET * pSt_StorageBucket) { return m_APIDistributed.APIHelp_Distributed_DLStorage(lpszMsgBuffer, pStl_ListBucket, pSt_StorageBucket); } -extern "C" BOOL APIHelp_Distributed_UPStorage(list*pStl_ListBucket, XENGINE_STORAGEBUCKET * pSt_StorageBucket, int nMode) +extern "C" bool APIHelp_Distributed_UPStorage(list*pStl_ListBucket, XENGINE_STORAGEBUCKET * pSt_StorageBucket, int nMode) { return m_APIDistributed.APIHelp_Distributed_UPStorage(pStl_ListBucket, pSt_StorageBucket, nMode); } -extern "C" BOOL APIHelp_Distributed_GetPathKey(list*pStl_ListBucket, LPCTSTR lpszBuckKey, TCHAR * ptszFilePath) +extern "C" bool APIHelp_Distributed_GetPathKey(list*pStl_ListBucket, LPCXSTR lpszBuckKey, XCHAR * ptszFilePath) { return m_APIDistributed.APIHelp_Distributed_GetPathKey(pStl_ListBucket, lpszBuckKey, ptszFilePath); } /************************************************************************/ /* 帮助函数 */ /************************************************************************/ -extern "C" BOOL APIHelp_Api_ProxyAuth(TCHAR * ptszUser, TCHAR * ptszPass, TCHAR * *pptszListHdr, int nHdrCount) +extern "C" bool APIHelp_Api_ProxyAuth(XCHAR * ptszUser, XCHAR * ptszPass, XCHAR * *pptszListHdr, int nHdrCount) { return m_APIHelp.APIHelp_Api_ProxyAuth(ptszUser, ptszPass, pptszListHdr, nHdrCount); } -extern "C" BOOL APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64x * pInt_Count, TCHAR * *pptszListHdr, int nHdrCount) +extern "C" bool APIHelp_Api_RangeFile(int* pInt_SPos, int* pInt_EPos, __int64x * pInt_Count, XCHAR * *pptszListHdr, int nHdrCount) { return m_APIHelp.APIHelp_Api_RangeFile(pInt_SPos, pInt_EPos, pInt_Count, pptszListHdr, nHdrCount); } -extern "C" BOOL APIHelp_Api_VerHash(LPCTSTR lpszFileHash, TCHAR * *pptszListHdr, int nHdrCount) +extern "C" bool APIHelp_Api_VerHash(LPCXSTR lpszFileHash, XCHAR * *pptszListHdr, int nHdrCount) { return m_APIHelp.APIHelp_Api_VerHash(lpszFileHash, pptszListHdr, nHdrCount); } -extern "C" BOOL APIHelp_Api_GetIPInfo(LPCTSTR lpszMsgBuffer, int nMsgLen, XENGINE_IPADDRINFO * pSt_IPAddrInfo) +extern "C" bool APIHelp_Api_GetIPInfo(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_IPADDRINFO * pSt_IPAddrInfo) { return m_APIHelp.APIHelp_Api_GetIPInfo(lpszMsgBuffer, nMsgLen, pSt_IPAddrInfo); } -extern "C" BOOL APIHelp_Api_UrlParse(TCHAR * **ppptszList, int nListCount, TCHAR * ptszFileName, TCHAR * ptszKeyName) +extern "C" bool APIHelp_Api_UrlParse(XCHAR * **ppptszList, int nListCount, XCHAR * ptszFileName, XCHAR * ptszKeyName) { return m_APIHelp.APIHelp_Api_UrlParse(ppptszList, nListCount, ptszFileName, ptszKeyName); } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_APIHelp/pch.h b/XEngine_Source/StorageModule_APIHelp/pch.h index 08e564e..aebe5be 100644 --- a/XEngine_Source/StorageModule_APIHelp/pch.h +++ b/XEngine_Source/StorageModule_APIHelp/pch.h @@ -54,8 +54,8 @@ using namespace std; // Purpose: 公有头文件 // History: *********************************************************************/ -extern BOOL APIHelp_IsErrorOccur; -extern DWORD APIHelp_dwErrorCode; +extern bool APIHelp_IsErrorOccur; +extern XLONG APIHelp_dwErrorCode; #ifdef _WINDOWS #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") diff --git a/XEngine_Source/StorageModule_Config/Config_Define.h b/XEngine_Source/StorageModule_Config/Config_Define.h index cb5b7a9..7c9aa79 100644 --- a/XEngine_Source/StorageModule_Config/Config_Define.h +++ b/XEngine_Source/StorageModule_Config/Config_Define.h @@ -15,15 +15,15 @@ ////////////////////////////////////////////////////////////////////////// typedef struct tag_XEngine_ServerConfig { - TCHAR tszIPAddr[128]; - BOOL bDeamon; - BOOL bReuseraddr; + XCHAR tszIPAddr[128]; + bool bDeamon; + bool bReuseraddr; int nCenterPort; int nStorageDLPort; int nStorageUPPort; struct { - BOOL bReload; + bool bReload; }st_Memory; struct { @@ -36,7 +36,7 @@ typedef struct tag_XEngine_ServerConfig }st_XMax; struct { - BOOL bHBTime; + bool bHBTime; int nDBMonth; int nTimeCheck; int nCenterTimeOut; @@ -50,38 +50,38 @@ typedef struct tag_XEngine_ServerConfig }st_XLog; struct { - TCHAR tszSQLAddr[128]; - TCHAR tszSQLUser[128]; - TCHAR tszSQLPass[128]; - TCHAR tszDBName[128]; + XCHAR tszSQLAddr[128]; + XCHAR tszSQLUser[128]; + XCHAR tszSQLPass[128]; + XCHAR tszDBName[128]; int nSQLPort; - BOOL bEnable; + bool bEnable; }st_XSql; struct { - BOOL bResumable; - BOOL bUPHash; + bool bResumable; + bool bUPHash; int nHashMode; }st_XStorage; struct { struct { - BOOL bAuth; - TCHAR tszAuthProxy[MAX_PATH]; - TCHAR tszUserList[MAX_PATH]; + bool bAuth; + XCHAR tszAuthProxy[MAX_PATH]; + XCHAR tszUserList[MAX_PATH]; }st_XProxyAuth; struct { - BOOL bUPPass; - BOOL bDLPass; - TCHAR tszUPPass[MAX_PATH]; - TCHAR tszDLPass[MAX_PATH]; + bool bUPPass; + bool bDLPass; + XCHAR tszUPPass[MAX_PATH]; + XCHAR tszDLPass[MAX_PATH]; }st_XProxyPass; }st_XProxy; struct { - BOOL bLimitMode; + bool bLimitMode; __int64x nMaxUPLoader; __int64x nMaxDNLoader; int nMaxUPConnect; @@ -95,12 +95,12 @@ typedef struct tag_XEngine_ServerConfig }st_P2xp; struct { - TCHAR tszCertChain[MAX_PATH]; - TCHAR tszCertKey[MAX_PATH]; + XCHAR tszCertChain[MAX_PATH]; + XCHAR tszCertKey[MAX_PATH]; int nSslType; - BOOL bDLEnable; - BOOL bUPEnable; - BOOL bCHEnable; + bool bDLEnable; + bool bUPEnable; + bool bCHEnable; }st_XCert; struct { @@ -110,12 +110,12 @@ typedef struct tag_XEngine_ServerConfig typedef struct { - TCHAR tszFilePath[MAX_PATH]; - TCHAR tszFileName[MAX_PATH]; - TCHAR tszBuckKey[128]; - TCHAR tszBuckSize[64]; + XCHAR tszFilePath[MAX_PATH]; + XCHAR tszFileName[MAX_PATH]; + XCHAR tszBuckKey[128]; + XCHAR tszBuckSize[64]; int nLevel; - BOOL bEnable; + bool bEnable; struct { bool bCreateDir; @@ -124,7 +124,7 @@ typedef struct }XENGINE_STORAGEBUCKET; typedef struct { - BOOL bDistributed; + bool bDistributed; struct { int nCenterMode; @@ -150,7 +150,7 @@ typedef struct ////////////////////////////////////////////////////////////////////////// // 导出函数定义 ////////////////////////////////////////////////////////////////////////// -extern "C" DWORD Config_GetLastError(int *pInt_ErrorCode = NULL); +extern "C" XLONG Config_GetLastError(int *pInt_ErrorCode = NULL); /************************************************************************/ /* 文件配置读取 */ /************************************************************************/ @@ -172,7 +172,7 @@ extern "C" DWORD Config_GetLastError(int *pInt_ErrorCode = NULL); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG * pSt_ServerConfig); +extern "C" bool Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG * pSt_ServerConfig); /******************************************************************** 函数名称:Config_Json_LoadBalance 函数功能:读取负载均衡配置文件 @@ -191,4 +191,4 @@ extern "C" BOOL Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG * 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCONFIG * pSt_ServerConfig); \ No newline at end of file +extern "C" bool Config_Json_LoadBalance(LPCXSTR lpszConfigFile, XENGINE_LBCONFIG * pSt_ServerConfig); \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp index c8c8e63..82f30ca 100644 --- a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp +++ b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp @@ -40,29 +40,29 @@ CConfig_Json::~CConfig_Json() 意思:是否成功 备注: *********************************************************************/ -BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG* pSt_ServerConfig) +bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG* pSt_ServerConfig) { - Config_IsErrorOccur = FALSE; + Config_IsErrorOccur = false; if ((NULL == lpszConfigFile) || (NULL == pSt_ServerConfig)) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARAMENT; - return FALSE; + return false; } JSONCPP_STRING st_JsonError; Json::Value st_JsonRoot; Json::CharReaderBuilder st_JsonBuilder; - FILE* pSt_File = _tfopen(lpszConfigFile, _T("rb")); + FILE* pSt_File = _xtfopen(lpszConfigFile, _X("rb")); if (NULL == pSt_File) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARAMENT; - return FALSE; + return false; } int nCount = 0; - TCHAR tszMsgBuffer[4096]; + XCHAR tszMsgBuffer[4096]; while (1) { int nRet = fread(tszMsgBuffer + nCount, 1, 2048, pSt_File); @@ -79,9 +79,9 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARSE; - return FALSE; + return false; } - _tcscpy(pSt_ServerConfig->tszIPAddr, st_JsonRoot["tszIPAddr"].asCString()); + _tcsxcpy(pSt_ServerConfig->tszIPAddr, st_JsonRoot["tszIPAddr"].asCString()); pSt_ServerConfig->bDeamon = st_JsonRoot["bDeamon"].asInt(); pSt_ServerConfig->nCenterPort = st_JsonRoot["nCenterPort"].asInt(); pSt_ServerConfig->nStorageDLPort = st_JsonRoot["nStorageDLPort"].asInt(); @@ -91,7 +91,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XMAX; - return FALSE; + return false; } Json::Value st_JsonXMax = st_JsonRoot["XMax"]; pSt_ServerConfig->st_XMax.nMaxClient = st_JsonXMax["MaxClient"].asInt(); @@ -105,7 +105,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XTIME; - return FALSE; + return false; } Json::Value st_JsonXTime = st_JsonRoot["XTime"]; pSt_ServerConfig->st_XTime.bHBTime = st_JsonXTime["bHBTime"].asInt(); @@ -118,7 +118,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XLOG; - return FALSE; + return false; } Json::Value st_JsonXLog = st_JsonRoot["XLog"]; pSt_ServerConfig->st_XLog.nMaxSize = st_JsonXLog["MaxSize"].asInt(); @@ -129,21 +129,21 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XSQL; - return FALSE; + return false; } Json::Value st_JsonXSql = st_JsonRoot["XSql"]; pSt_ServerConfig->st_XSql.bEnable = st_JsonXSql["SQLEnable"].asBool(); pSt_ServerConfig->st_XSql.nSQLPort = st_JsonXSql["SQLPort"].asInt(); - _tcscpy(pSt_ServerConfig->st_XSql.tszSQLAddr, st_JsonXSql["SQLAddr"].asCString()); - _tcscpy(pSt_ServerConfig->st_XSql.tszSQLUser, st_JsonXSql["SQLUser"].asCString()); - _tcscpy(pSt_ServerConfig->st_XSql.tszSQLPass, st_JsonXSql["SQLPass"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XSql.tszSQLAddr, st_JsonXSql["SQLAddr"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XSql.tszSQLUser, st_JsonXSql["SQLUser"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XSql.tszSQLPass, st_JsonXSql["SQLPass"].asCString()); if (st_JsonRoot["XStorage"].empty() || (3 != st_JsonRoot["XStorage"].size())) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XSTORAGE; - return FALSE; + return false; } Json::Value st_JsonXStorage = st_JsonRoot["XStorage"]; pSt_ServerConfig->st_XStorage.nHashMode = st_JsonXStorage["nHashMode"].asInt(); @@ -154,26 +154,26 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XPROXY; - return FALSE; + return false; } Json::Value st_JsonXProxy = st_JsonRoot["XProxy"]; Json::Value st_JsonXProxyAuth = st_JsonXProxy["XProxyAuth"]; Json::Value st_JsonXProxyPass = st_JsonXProxy["XProxyPass"]; pSt_ServerConfig->st_XProxy.st_XProxyAuth.bAuth = st_JsonXProxyAuth["bAuth"].asInt(); - _tcscpy(pSt_ServerConfig->st_XProxy.st_XProxyAuth.tszAuthProxy, st_JsonXProxyAuth["tszAuthProxy"].asCString()); - _tcscpy(pSt_ServerConfig->st_XProxy.st_XProxyAuth.tszUserList, st_JsonXProxyAuth["tszUserList"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XProxy.st_XProxyAuth.tszAuthProxy, st_JsonXProxyAuth["tszAuthProxy"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XProxy.st_XProxyAuth.tszUserList, st_JsonXProxyAuth["tszUserList"].asCString()); pSt_ServerConfig->st_XProxy.st_XProxyPass.bDLPass = st_JsonXProxyPass["bDLGet"].asInt(); pSt_ServerConfig->st_XProxy.st_XProxyPass.bUPPass = st_JsonXProxyPass["bUPGet"].asInt(); - _tcscpy(pSt_ServerConfig->st_XProxy.st_XProxyPass.tszDLPass, st_JsonXProxyPass["tszDLPass"].asCString()); - _tcscpy(pSt_ServerConfig->st_XProxy.st_XProxyPass.tszUPPass, st_JsonXProxyPass["tszUPPass"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XProxy.st_XProxyPass.tszDLPass, st_JsonXProxyPass["tszDLPass"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XProxy.st_XProxyPass.tszUPPass, st_JsonXProxyPass["tszUPPass"].asCString()); if (st_JsonRoot["XLimit"].empty() || (5 != st_JsonRoot["XLimit"].size())) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XSTORAGE; - return FALSE; + return false; } Json::Value st_JsonXLimit = st_JsonRoot["XLimit"]; pSt_ServerConfig->st_XLimit.bLimitMode = st_JsonXLimit["bLimitMode"].asBool(); @@ -186,7 +186,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_P2XP; - return FALSE; + return false; } Json::Value st_JsonP2xp = st_JsonRoot["XP2xp"]; pSt_ServerConfig->st_P2xp.nTime = st_JsonP2xp["nTime"].asInt(); @@ -197,7 +197,7 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_CERT; - return FALSE; + return false; } Json::Value st_JsonCert = st_JsonRoot["XCert"]; pSt_ServerConfig->st_XCert.bDLEnable = st_JsonCert["bDLEnable"].asInt(); @@ -206,18 +206,18 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG pSt_ServerConfig->st_XCert.nSslType = st_JsonCert["nSslType"].asInt(); if (!st_JsonP2xp["tszCertChain"].isNull()) { - _tcscpy(pSt_ServerConfig->st_XCert.tszCertChain, st_JsonP2xp["tszCertChain"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertChain, st_JsonP2xp["tszCertChain"].asCString()); } if (!st_JsonP2xp["tszCertKey"].isNull()) { - _tcscpy(pSt_ServerConfig->st_XCert.tszCertKey, st_JsonP2xp["tszCertKey"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertKey, st_JsonP2xp["tszCertKey"].asCString()); } if (st_JsonRoot["XVer"].empty()) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XVER; - return FALSE; + return false; } Json::Value st_JsonXVer = st_JsonRoot["XVer"]; @@ -246,29 +246,29 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG 意思:是否成功 备注: *********************************************************************/ -BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCONFIG* pSt_ServerConfig) +bool CConfig_Json::Config_Json_LoadBalance(LPCXSTR lpszConfigFile, XENGINE_LBCONFIG* pSt_ServerConfig) { - Config_IsErrorOccur = FALSE; + Config_IsErrorOccur = false; if ((NULL == lpszConfigFile) || (NULL == pSt_ServerConfig)) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARAMENT; - return FALSE; + return false; } JSONCPP_STRING st_JsonError; Json::Value st_JsonRoot; Json::CharReaderBuilder st_JsonBuilder; - FILE* pSt_File = _tfopen(lpszConfigFile, _T("rb")); + FILE* pSt_File = _xtfopen(lpszConfigFile, _X("rb")); if (NULL == pSt_File) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARAMENT; - return FALSE; + return false; } int nCount = 0; - TCHAR tszMsgBuffer[4096]; + XCHAR tszMsgBuffer[4096]; while (1) { int nRet = fread(tszMsgBuffer + nCount, 1, 2048, pSt_File); @@ -285,7 +285,7 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_PARSE; - return FALSE; + return false; } pSt_ServerConfig->bDistributed = st_JsonRoot["bDistributed"].asInt(); @@ -293,7 +293,7 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_LBDISTRIBUTED; - return FALSE; + return false; } Json::Value st_JsonLBDistributed = st_JsonRoot["LBDistributed"]; pSt_ServerConfig->st_LBDistributed.nCenterMode = st_JsonLBDistributed["nCenterMode"].asInt(); @@ -305,7 +305,7 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_LBLOCATION; - return FALSE; + return false; } Json::Value st_JsonLBLocation = st_JsonRoot["LBLocation"]; pSt_ServerConfig->st_LBLocation.nCenterMode = st_JsonLBLocation["nCenterMode"].asInt(); @@ -317,7 +317,7 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_LAODBALANCE; - return FALSE; + return false; } Json::Value st_JsonLoadBalance = st_JsonRoot["LoadBalance"]; @@ -348,9 +348,9 @@ BOOL CConfig_Json::Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCON st_Bucket.bEnable = st_JsonBucket[i]["bEnable"].asInt(); st_Bucket.nLevel = st_JsonBucket[i]["nLevel"].asInt(); - _tcscpy(st_Bucket.tszBuckSize, st_JsonBucket[i]["Size"].asCString()); - _tcscpy(st_Bucket.tszBuckKey, st_JsonBucket[i]["XEngine_Key"].asCString()); - _tcscpy(st_Bucket.tszFilePath, st_JsonBucket[i]["XEngine_Path"].asCString()); + _tcsxcpy(st_Bucket.tszBuckSize, st_JsonBucket[i]["Size"].asCString()); + _tcsxcpy(st_Bucket.tszBuckKey, st_JsonBucket[i]["XEngine_Key"].asCString()); + _tcsxcpy(st_Bucket.tszFilePath, st_JsonBucket[i]["XEngine_Path"].asCString()); Json::Value st_JsonPermission = st_JsonBucket[i]["PermissionFlags"]; st_Bucket.st_PermissionFlags.bCreateDir = st_JsonPermission["CreateDir"].asBool(); diff --git a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.h b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.h index 431d860..2e57194 100644 --- a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.h +++ b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.h @@ -17,6 +17,6 @@ public: CConfig_Json(); ~CConfig_Json(); public: - BOOL Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG* pSt_ServerConfig); - BOOL Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCONFIG* pSt_ServerConfig); + bool Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG* pSt_ServerConfig); + bool Config_Json_LoadBalance(LPCXSTR lpszConfigFile, XENGINE_LBCONFIG* pSt_ServerConfig); }; diff --git a/XEngine_Source/StorageModule_Config/Makefile b/XEngine_Source/StorageModule_Config/Makefile index bbb64a4..4e56c8e 100644 --- a/XEngine_Source/StorageModule_Config/Makefile +++ b/XEngine_Source/StorageModule_Config/Makefile @@ -1,30 +1,23 @@ CC = g++ -Wall -std=c++17 -fPIC -SHAREFLAG = -shared -SHAREDLL = so +PLATFORM = linux +PLATVER = +PLATDIR = +FILEEXT = +LIBFLAG = RELEASE = 0 UNICODE = 0 -INCLUDE = -I ./ -I ../XEngine_ThirdPart/jsoncpp -LOADBIN = -L ../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ -I ../XEngine_ThirdPart/jsoncpp +LOADSO = -L ../XEngine_ThirdPart/jsoncpp LIB = -ljsoncpp -LIBEX = -ldl -lpthread -LOADSO = -Wl,-rpath=./,--disable-new-dtags -LIBINCLUDE = Config_Json.o pch.o - -ifeq ($(shell uname),Darwin) - SHAREDLL = dylib - SHAREFLAG = -dynamiclib - LOADSO = -else - SHAREDLL = so - SHAREFLAG = -shared -endif +LIBEX = +OBJECTS = Config_Json.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -O2 +FLAGS = -c DEBUG = else -FLAGS = -c -DEBUG = -g +FLAGS = -c -lc_p +DEBUG = -g -pg endif ifeq ($(UNICODE),1) @@ -33,24 +26,46 @@ else UNICODE = endif +ifeq ($(PLATFORM),linux) + ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) + PLATVER = -D __CENTOS__ + PLATDIR = XEngine_Linux/Centos + else + PLATVER = -D __UBUNTU__ + PLATDIR = XEngine_Linux/Ubuntu + endif + FILEEXT = so + LIBFLAG = -shared + LIBEX = -lpthread -lrt -ldl + LOADBIN = -Wl,-rpath=./,--disable-new-dtags +else ifeq ($(PLATFORM),mac) + CC += -Wno-deprecated-declarations + PLATVER = -D __MACOS__ + PLATDIR = XEngine_Mac + FILEEXT = dylib + LIBFLAG = -dynamiclib + LIBEX = -lpthread -ldl + LOADBIN = -Wl,-rpath,@loader_path/./ +endif + -all:$(LIBINCLUDE) - $(CC) $(DEBUG) $(LIBINCLUDE) -o libStorageModule_Config.$(SHAREDLL) $(SHAREFLAG) -fPIC $(LOADBIN) $(LIB) $(LIBEX) $(LOADSO) +all:$(OBJECTS) + $(CC) $(DEBUG) $(OBJECTS) -o libStorageModule_Config.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) Config_Json.o:./Config_Json/Config_Json.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./Config_Json/Config_Json.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Config_Json/Config_Json.cpp pch.o:./pch.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./pch.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp InstallAll:InstallSo -InstallSo:./libStorageModule_Config.$(SHAREDLL) - cp ./libStorageModule_Config.$(SHAREDLL) ../../XEngine_Release/libStorageModule_Config.$(SHAREDLL) +InstallSo:./libStorageModule_Config.$(FILEEXT) + cp ./libStorageModule_Config.$(FILEEXT) ../../XEngine_Release/libStorageModule_Config.$(FILEEXT) CleanAll:CleanObj CleanMk CleanObj: rm *.o CleanMk: - rm *.$(SHAREDLL) + rm *.$(FILEEXT) diff --git a/XEngine_Source/StorageModule_Config/dllmain.cpp b/XEngine_Source/StorageModule_Config/dllmain.cpp index 0745b19..594ff21 100644 --- a/XEngine_Source/StorageModule_Config/dllmain.cpp +++ b/XEngine_Source/StorageModule_Config/dllmain.cpp @@ -1,9 +1,9 @@ // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved +bool APIENTRY DllMain( HMODULE hModule, + XLONG ul_reason_for_call, + XPVOID lpReserved ) { switch (ul_reason_for_call) diff --git a/XEngine_Source/StorageModule_Config/pch.cpp b/XEngine_Source/StorageModule_Config/pch.cpp index 34a491a..ec2bcb7 100644 --- a/XEngine_Source/StorageModule_Config/pch.cpp +++ b/XEngine_Source/StorageModule_Config/pch.cpp @@ -11,14 +11,14 @@ // Purpose: 导出函数实现 // History: *********************************************************************/ -BOOL Config_IsErrorOccur = FALSE; -DWORD Config_dwErrorCode = 0; +bool Config_IsErrorOccur = false; +XLONG Config_dwErrorCode = 0; ////////////////////////////////////////////////////////////////////// CConfig_Json m_ConfigJson; ////////////////////////////////////////////////////////////////////// // 导出函数定义 ////////////////////////////////////////////////////////////////////// -extern "C" DWORD Config_GetLastError(int* pInt_ErrorCode) +extern "C" XLONG Config_GetLastError(int* pInt_ErrorCode) { if (pInt_ErrorCode != NULL) { @@ -29,11 +29,11 @@ extern "C" DWORD Config_GetLastError(int* pInt_ErrorCode) /************************************************************************/ /* 配置文件读取 */ /************************************************************************/ -extern "C" BOOL Config_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVERCONFIG * pSt_ServerConfig) +extern "C" bool Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG * pSt_ServerConfig) { return m_ConfigJson.Config_Json_File(lpszConfigFile, pSt_ServerConfig); } -extern "C" BOOL Config_Json_LoadBalance(LPCTSTR lpszConfigFile, XENGINE_LBCONFIG* pSt_ServerConfig) +extern "C" bool Config_Json_LoadBalance(LPCXSTR lpszConfigFile, XENGINE_LBCONFIG* pSt_ServerConfig) { return m_ConfigJson.Config_Json_LoadBalance(lpszConfigFile, pSt_ServerConfig); } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Config/pch.h b/XEngine_Source/StorageModule_Config/pch.h index 6e33dcf..2305a57 100644 --- a/XEngine_Source/StorageModule_Config/pch.h +++ b/XEngine_Source/StorageModule_Config/pch.h @@ -37,8 +37,8 @@ using namespace std; // Purpose: 公用头文件 // History: *********************************************************************/ -extern BOOL Config_IsErrorOccur; -extern DWORD Config_dwErrorCode; +extern bool Config_IsErrorOccur; +extern XLONG Config_dwErrorCode; #ifdef _WINDOWS #ifdef _DEBUG diff --git a/XEngine_Source/StorageModule_Database/Database_Define.h b/XEngine_Source/StorageModule_Database/Database_Define.h index 219a5af..27e14a5 100644 --- a/XEngine_Source/StorageModule_Database/Database_Define.h +++ b/XEngine_Source/StorageModule_Database/Database_Define.h @@ -16,8 +16,8 @@ typedef struct { XENGINE_PROTOCOL_FILE st_ProtocolFile; - CHAR tszBuckKey[MAX_PATH]; //路径的关键字 - CHAR tszTableName[64]; //日期表名称,插入:表示自定义插入日期表,获取:表示导出这个文件所属日期表 + XCHAR tszBuckKey[MAX_PATH]; //路径的关键字 + XCHAR tszTableName[64]; //日期表名称,插入:表示自定义插入日期表,获取:表示导出这个文件所属日期表 }XSTORAGECORE_DBFILE, *LPXSTORAGECORE_DBFILE; typedef struct { @@ -25,12 +25,12 @@ typedef struct __int64x nFileCount; //拥有的文件个数 __int64x nFileSize; //文件占用大小 XNETHANDLE xhToken; //用户临时会话句柄 - CHAR tszIPAddr[64]; //最后登录IP地址 + XCHAR tszIPAddr[64]; //最后登录IP地址 }XSTORAGECORE_USERINFO, *LPXSTORAGECORE_USERINFO; ////////////////////////////////////////////////////////////////////////// /// 导出的函数 ////////////////////////////////////////////////////////////////////////// -extern "C" DWORD Database_GetLastError(int *pInt_SysError = NULL); +extern "C" XLONG Database_GetLastError(int *pInt_SysError = NULL); /************************************************************************/ /* 导出的数据库帮助函数 */ /************************************************************************/ @@ -52,7 +52,7 @@ extern "C" DWORD Database_GetLastError(int *pInt_SysError = NULL); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Database_Help_Insert(TCHAR* ptszSQLBuffer, XSTORAGECORE_DBFILE* pSt_DBFile); +extern "C" bool Database_Help_Insert(XCHAR* ptszSQLBuffer, XSTORAGECORE_DBFILE* pSt_DBFile); /******************************************************************** 函数名称:Database_Help_Delete 函数功能:删除语句 @@ -91,7 +91,7 @@ extern "C" BOOL Database_Help_Insert(TCHAR* ptszSQLBuffer, XSTORAGECORE_DBFILE* 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Database_Help_Delete(TCHAR* ptszSQLBuffer, LPCTSTR lpszTableName, LPCTSTR lpszBuckKey = NULL, LPCTSTR lpszFilePath = NULL, LPCTSTR lpszFileName = NULL, LPCTSTR lpszFileHash = NULL); +extern "C" bool Database_Help_Delete(XCHAR* ptszSQLBuffer, LPCXSTR lpszTableName, LPCXSTR lpszBuckKey = NULL, LPCXSTR lpszFilePath = NULL, LPCXSTR lpszFileName = NULL, LPCXSTR lpszFileHash = NULL); /******************************************************************** 函数名称:Database_Help_Query 函数功能:数据库查询打包函数 @@ -145,7 +145,7 @@ extern "C" BOOL Database_Help_Delete(TCHAR* ptszSQLBuffer, LPCTSTR lpszTableName 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Database_Help_Query(TCHAR* ptszSQLBuffer, LPCTSTR lpszTableName, LPCTSTR lpszBuckKey = NULL, LPCTSTR lpszFilePath = NULL, LPCTSTR lpszFileName = NULL, LPCTSTR lpszFileHash = NULL, LPCTSTR lpszFileUser = NULL, LPCTSTR lpszTimeStart = NULL, LPCTSTR lpszTimeEnd = NULL); +extern "C" bool Database_Help_Query(XCHAR* ptszSQLBuffer, LPCXSTR lpszTableName, LPCXSTR lpszBuckKey = NULL, LPCXSTR lpszFilePath = NULL, LPCXSTR lpszFileName = NULL, LPCXSTR lpszFileHash = NULL, LPCXSTR lpszFileUser = NULL, LPCXSTR lpszTimeStart = NULL, LPCXSTR lpszTimeEnd = NULL); /************************************************************************/ /* 导出的数据库操作函数 */ /************************************************************************/ @@ -167,7 +167,7 @@ extern "C" BOOL Database_Help_Query(TCHAR* ptszSQLBuffer, LPCTSTR lpszTableName, 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Database_File_Init(DATABASE_MYSQL_CONNECTINFO * pSt_DBConnector, int nTimeMonth = 1); +extern "C" bool Database_File_Init(DATABASE_MYSQL_CONNECTINFO * pSt_DBConnector, int nTimeMonth = 1); /******************************************************************** 函数名称:Database_File_Destory 函数功能:销毁数据库管理器 @@ -176,7 +176,7 @@ extern "C" BOOL Database_File_Init(DATABASE_MYSQL_CONNECTINFO * pSt_DBConnector, 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Database_File_Destory(); +extern "C" bool Database_File_Destory(); /******************************************************************** 函数名称:Database_File_FileInsert 函数功能:插入一个文件数据到数据库中 @@ -195,7 +195,7 @@ extern "C" BOOL Database_File_Destory(); 意思:是否成功 备注:这个结构所有值都必须填充 *********************************************************************/ -extern "C" BOOL Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, BOOL bRewrite = FALSE); +extern "C" bool Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, bool bRewrite = false); /******************************************************************** 函数名称:Database_File_FileDelete 函数功能:删除一个数据库文件信息 @@ -224,7 +224,7 @@ extern "C" BOOL Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, BOOL 意思:是否成功 备注:参数不能全为空,不会删除文件 *********************************************************************/ -extern "C" BOOL Database_File_FileDelete(LPCTSTR lpszBuckKey = NULL, LPCTSTR lpszFilePath = NULL, LPCTSTR lpszFileName = NULL, LPCSTR lpszHash = NULL); +extern "C" bool Database_File_FileDelete(LPCXSTR lpszBuckKey = NULL, LPCXSTR lpszFilePath = NULL, LPCXSTR lpszFileName = NULL, LPCXSTR lpszHash = NULL); /******************************************************************** 函数名称:Database_File_FileQuery 函数功能:查询文件信息 @@ -278,4 +278,4 @@ extern "C" BOOL Database_File_FileDelete(LPCTSTR lpszBuckKey = NULL, LPCTSTR lps 意思:是否成功 备注:返回假可能没有查找到,这条记录不存在.参数lpszFile和lpszMD5不能全为空 *********************************************************************/ -extern "C" BOOL Database_File_FileQuery(XSTORAGECORE_DBFILE * **pppSt_ListFile, int* pInt_ListCount, LPCSTR lpszTimeStart = NULL, LPCSTR lpszTimeEnd = NULL, LPCTSTR lpszBuckKey = NULL, LPCTSTR lpszFilePath = NULL, LPCTSTR lpszFileName = NULL, LPCSTR lpszHash = NULL, LPCTSTR lpszTableName = NULL); \ No newline at end of file +extern "C" bool Database_File_FileQuery(XSTORAGECORE_DBFILE * **pppSt_ListFile, int* pInt_ListCount, LPCXSTR lpszTimeStart = NULL, LPCXSTR lpszTimeEnd = NULL, LPCXSTR lpszBuckKey = NULL, LPCXSTR lpszFilePath = NULL, LPCXSTR lpszFileName = NULL, LPCXSTR lpszHash = NULL, LPCXSTR lpszTableName = NULL); \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp b/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp index efb1493..194d50e 100644 --- a/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp +++ b/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp @@ -13,7 +13,7 @@ *********************************************************************/ CDatabase_File::CDatabase_File() { - bIsRun = FALSE; + bIsRun = false; m_nTimeMonth = 0; xhDBSQL = 0; } @@ -42,29 +42,29 @@ CDatabase_File::~CDatabase_File() 意思:是否成功 备注: *********************************************************************/ -BOOL CDatabase_File::Database_File_Init(DATABASE_MYSQL_CONNECTINFO *pSt_DBConnector, int nTimeDay) +bool CDatabase_File::Database_File_Init(DATABASE_MYSQL_CONNECTINFO *pSt_DBConnector, int nTimeDay) { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; if (NULL == pSt_DBConnector) { Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_INIT_PARAMENT; - return FALSE; + return false; } m_nTimeMonth = nTimeDay; #ifdef _WINDOWS - LPCTSTR lpszStrCharset = _T("gbk"); + LPCXSTR lpszStrCharset = _X("gbk"); #else - LPCTSTR lpszStrCharset = _T("utf8"); + LPCXSTR lpszStrCharset = _X("utf8"); #endif //连接数据库 - _tcscpy(pSt_DBConnector->tszDBName, _T("XEngine_Storage")); + _tcsxcpy(pSt_DBConnector->tszDBName, _X("XEngine_Storage")); if (!DataBase_MySQL_Connect(&xhDBSQL, pSt_DBConnector, 5, true, lpszStrCharset)) { Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); - return FALSE; + return false; } bIsRun = true; @@ -73,7 +73,7 @@ BOOL CDatabase_File::Database_File_Init(DATABASE_MYSQL_CONNECTINFO *pSt_DBConnec { Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_INIT_THREAD; - return FALSE; + return false; } return true; } @@ -85,15 +85,15 @@ BOOL CDatabase_File::Database_File_Init(DATABASE_MYSQL_CONNECTINFO *pSt_DBConnec 意思:是否成功 备注: *********************************************************************/ -BOOL CDatabase_File::Database_File_Destory() +bool CDatabase_File::Database_File_Destory() { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; if (!bIsRun) { return true; } - bIsRun = FALSE; + bIsRun = false; if (NULL != pSTDThread) { @@ -123,15 +123,15 @@ BOOL CDatabase_File::Database_File_Destory() 意思:是否成功 备注:这个结构所有值都必须填充 *********************************************************************/ -BOOL CDatabase_File::Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, BOOL bRewrite /* = FALSE */) +bool CDatabase_File::Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, bool bRewrite /* = false */) { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; if (NULL == pSt_DBManage) { Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_INSERTFILE_PARAMENT; - return FALSE; + return false; } int nListCount = 0; XSTORAGECORE_DBFILE **ppSt_ListFile; @@ -140,7 +140,7 @@ BOOL CDatabase_File::Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, BaseLib_OperatorMemory_Free((void***)&ppSt_ListFile, nListCount); return true; } - TCHAR tszSQLQuery[2048]; + XCHAR tszSQLQuery[2048]; memset(tszSQLQuery, '\0', sizeof(tszSQLQuery)); if (bRewrite) @@ -169,7 +169,7 @@ BOOL CDatabase_File::Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, { Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); - return FALSE; + return false; } return true; } @@ -201,26 +201,26 @@ BOOL CDatabase_File::Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, 意思:是否成功 备注:参数不能全为空,不会删除文件 *********************************************************************/ -BOOL CDatabase_File::Database_File_FileDelete(LPCTSTR lpszBuckKey /* = NULL */, LPCTSTR lpszFilePath /* = NULL */, LPCTSTR lpszFileName /* = NULL */, LPCTSTR lpszHash /* = NULL */) +bool CDatabase_File::Database_File_FileDelete(LPCXSTR lpszBuckKey /* = NULL */, LPCXSTR lpszFilePath /* = NULL */, LPCXSTR lpszFileName /* = NULL */, LPCXSTR lpszHash /* = NULL */) { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; if ((NULL == lpszFileName) && (NULL == lpszHash)) { Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_DELETEFILE_PARAMENT; - return FALSE; + return false; } int nListCount = 0; XSTORAGECORE_DBFILE **ppSt_ListFile; if (!Database_File_FileQuery(&ppSt_ListFile, &nListCount, NULL, NULL, lpszBuckKey, lpszFilePath, lpszFileName, lpszHash)) { - return FALSE; + return false; } //轮训查找删除 for (int i = 0; i < nListCount; i++) { - TCHAR tszSQLStatement[1024]; + XCHAR tszSQLStatement[1024]; memset(tszSQLStatement, '\0', sizeof(tszSQLStatement)); Database_Help_Delete(tszSQLStatement, ppSt_ListFile[i]->tszTableName, lpszBuckKey, lpszFilePath, lpszFileName, lpszHash); @@ -228,7 +228,7 @@ BOOL CDatabase_File::Database_File_FileDelete(LPCTSTR lpszBuckKey /* = NULL */, { Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); - return FALSE; + return false; } } @@ -287,15 +287,15 @@ BOOL CDatabase_File::Database_File_FileDelete(LPCTSTR lpszBuckKey /* = NULL */, 意思:是否成功 备注:返回假可能没有查找到,这条记录不存在.参数lpszFile和lpszHash不能全为空 *********************************************************************/ -BOOL CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFile, int* pInt_ListCount, LPCTSTR lpszTimeStart /* = NULL */, LPCTSTR lpszTimeEnd /* = NULL */, LPCTSTR lpszBuckKey /* = NULL */, LPCTSTR lpszFilePath /* = NULL */, LPCTSTR lpszFileName /* = NULL */, LPCTSTR lpszHash /* = NULL */, LPCTSTR lpszTableName /* = NULL */) +bool CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFile, int* pInt_ListCount, LPCXSTR lpszTimeStart /* = NULL */, LPCXSTR lpszTimeEnd /* = NULL */, LPCXSTR lpszBuckKey /* = NULL */, LPCXSTR lpszFilePath /* = NULL */, LPCXSTR lpszFileName /* = NULL */, LPCXSTR lpszHash /* = NULL */, LPCXSTR lpszTableName /* = NULL */) { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; if ((NULL == lpszHash) && (NULL == lpszFileName)) { Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_QUERYFILE_PARAMENT; - return FALSE; + return false; } //查询 XNETHANDLE xhTable = 0; @@ -303,7 +303,7 @@ BOOL CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFi __int64u nllRow = 0; list stl_ListFile; - TCHAR tszSQLStatement[1024]; + XCHAR tszSQLStatement[1024]; memset(tszSQLStatement, '\0', sizeof(tszSQLStatement)); if (NULL == lpszTableName) @@ -311,29 +311,29 @@ BOOL CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFi //检查是否时间范围检索 if ((NULL != lpszTimeStart) && (NULL != lpszTimeEnd)) { - if (_tcslen(lpszTimeStart) > 0 && _tcslen(lpszTimeEnd) > 0) + if (_tcsxlen(lpszTimeStart) > 0 && _tcsxlen(lpszTimeEnd) > 0) { - _stprintf_s(tszSQLStatement, _T("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'XEngine_Storage' AND TABLE_NAME BETWEEN '%s' AND '%s'"), lpszTimeStart, lpszTimeEnd); + _xstprintf(tszSQLStatement, _X("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'XEngine_Storage' AND TABLE_NAME BETWEEN '%s' AND '%s'"), lpszTimeStart, lpszTimeEnd); } else { - _stprintf_s(tszSQLStatement, _T("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'XEngine_Storage'")); + _xstprintf(tszSQLStatement, _X("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'XEngine_Storage'")); } } else { - _stprintf_s(tszSQLStatement, _T("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'XEngine_Storage'")); + _xstprintf(tszSQLStatement, _X("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'XEngine_Storage'")); } if (!DataBase_MySQL_ExecuteQuery(xhDBSQL, &xhTable, tszSQLStatement, &nllLine, &nllRow)) { Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); - return FALSE; + return false; } //轮训 for (__int64u i = 0; i < nllLine; i++) { - TCHAR** pptszResult = DataBase_MySQL_GetResult(xhDBSQL, xhTable); + XCHAR** pptszResult = DataBase_MySQL_GetResult(xhDBSQL, xhTable); if (NULL == pptszResult[0]) { continue; @@ -350,40 +350,40 @@ BOOL CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFi //循环获取所有查找到的文件 for (__int64u j = 0; j < dwLineResult; j++) { - TCHAR** pptszFileResult = DataBase_MySQL_GetResult(xhDBSQL, xhResult); + XCHAR** pptszFileResult = DataBase_MySQL_GetResult(xhDBSQL, xhResult); XSTORAGECORE_DBFILE st_DBFile; memset(&st_DBFile, '\0', sizeof(XSTORAGECORE_DBFILE)); - _tcscpy(st_DBFile.tszTableName, pptszResult[0]); + _tcsxcpy(st_DBFile.tszTableName, pptszResult[0]); if (NULL != pptszFileResult[1]) { - _tcscpy(st_DBFile.tszBuckKey, pptszFileResult[1]); + _tcsxcpy(st_DBFile.tszBuckKey, pptszFileResult[1]); } if (NULL != pptszFileResult[2]) { - _tcscpy(st_DBFile.st_ProtocolFile.tszFilePath, pptszFileResult[2]); + _tcsxcpy(st_DBFile.st_ProtocolFile.tszFilePath, pptszFileResult[2]); } if (NULL != pptszFileResult[3]) { - _tcscpy(st_DBFile.st_ProtocolFile.tszFileName, pptszFileResult[3]); + _tcsxcpy(st_DBFile.st_ProtocolFile.tszFileName, pptszFileResult[3]); } if (NULL != pptszFileResult[4]) { - _tcscpy(st_DBFile.st_ProtocolFile.tszFileHash, pptszFileResult[4]); + _tcsxcpy(st_DBFile.st_ProtocolFile.tszFileHash, pptszFileResult[4]); } if (NULL != pptszFileResult[5]) { - _tcscpy(st_DBFile.st_ProtocolFile.tszFileUser, pptszFileResult[5]); + _tcsxcpy(st_DBFile.st_ProtocolFile.tszFileUser, pptszFileResult[5]); } if (NULL != pptszFileResult[6]) { - st_DBFile.st_ProtocolFile.nFileSize = _ttoi64(pptszFileResult[6]); + st_DBFile.st_ProtocolFile.nFileSize = _ttxoll(pptszFileResult[6]); } if (NULL != pptszFileResult[7]) { - _tcscpy(st_DBFile.st_ProtocolFile.tszFileTime, pptszFileResult[7]); + _tcsxcpy(st_DBFile.st_ProtocolFile.tszFileTime, pptszFileResult[7]); } stl_ListFile.push_back(st_DBFile); } @@ -401,40 +401,40 @@ BOOL CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFi //循环获取所有查找到的文件 for (__int64u i = 0; i < nllLine; i++) { - TCHAR** pptszFileResult = DataBase_MySQL_GetResult(xhDBSQL, xhTable); + XCHAR** pptszFileResult = DataBase_MySQL_GetResult(xhDBSQL, xhTable); XSTORAGECORE_DBFILE st_DBFile; memset(&st_DBFile, '\0', sizeof(XSTORAGECORE_DBFILE)); - _tcscpy(st_DBFile.tszTableName, lpszTableName); + _tcsxcpy(st_DBFile.tszTableName, lpszTableName); if (NULL != pptszFileResult[1]) { - _tcscpy(st_DBFile.tszBuckKey, pptszFileResult[1]); + _tcsxcpy(st_DBFile.tszBuckKey, pptszFileResult[1]); } if (NULL != pptszFileResult[2]) { - _tcscpy(st_DBFile.st_ProtocolFile.tszFilePath, pptszFileResult[2]); + _tcsxcpy(st_DBFile.st_ProtocolFile.tszFilePath, pptszFileResult[2]); } if (NULL != pptszFileResult[3]) { - _tcscpy(st_DBFile.st_ProtocolFile.tszFileName, pptszFileResult[3]); + _tcsxcpy(st_DBFile.st_ProtocolFile.tszFileName, pptszFileResult[3]); } if (NULL != pptszFileResult[4]) { - _tcscpy(st_DBFile.st_ProtocolFile.tszFileHash, pptszFileResult[4]); + _tcsxcpy(st_DBFile.st_ProtocolFile.tszFileHash, pptszFileResult[4]); } if (NULL != pptszFileResult[5]) { - _tcscpy(st_DBFile.st_ProtocolFile.tszFileUser, pptszFileResult[5]); + _tcsxcpy(st_DBFile.st_ProtocolFile.tszFileUser, pptszFileResult[5]); } if (NULL != pptszFileResult[6]) { - st_DBFile.st_ProtocolFile.nFileSize = _ttoi64(pptszFileResult[6]); + st_DBFile.st_ProtocolFile.nFileSize = _ttxoll(pptszFileResult[6]); } if (NULL != pptszFileResult[7]) { - _tcscpy(st_DBFile.st_ProtocolFile.tszFileTime, pptszFileResult[7]); + _tcsxcpy(st_DBFile.st_ProtocolFile.tszFileTime, pptszFileResult[7]); } stl_ListFile.push_back(st_DBFile); } @@ -446,7 +446,7 @@ BOOL CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFi { Database_IsErrorOccur = true; Database_dwErrorCode = ERROR_XENGINE_XSTROGE_CORE_DB_QUERYFILE_EMPTY; - return FALSE; + return false; } BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_ListFile, stl_ListFile.size(), sizeof(XSTORAGECORE_DBFILE)); @@ -470,14 +470,14 @@ BOOL CDatabase_File::Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFi 意思:是否成功 备注: *********************************************************************/ -BOOL CDatabase_File::Database_File_CreateTable() +bool CDatabase_File::Database_File_CreateTable() { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; for (int i = 0; i < 2; i++) { - TCHAR tszTableName[64]; - TCHAR tszSQLQuery[2048]; + XCHAR tszTableName[64]; + XCHAR tszSQLQuery[2048]; memset(tszTableName, '\0', sizeof(tszTableName)); memset(tszSQLQuery, '\0', sizeof(tszSQLQuery)); @@ -489,14 +489,14 @@ BOOL CDatabase_File::Database_File_CreateTable() if (12 == st_DBTime.wMonth) { - _stprintf_s(tszTableName, _T("%04d01"), st_DBTime.wYear); + _xstprintf(tszTableName, _X("%04d01"), st_DBTime.wYear); } else { - _stprintf_s(tszTableName, _T("%04d%02d"), st_DBTime.wYear, st_DBTime.wMonth + i); + _xstprintf(tszTableName, _X("%04d%02d"), st_DBTime.wYear, st_DBTime.wMonth + i); } - _stprintf_s(tszSQLQuery, _T("CREATE TABLE IF NOT EXISTS `%s` (" + _xstprintf(tszSQLQuery, _X("CREATE TABLE IF NOT EXISTS `%s` (" "`ID` int NOT NULL AUTO_INCREMENT COMMENT 'ID序号'," "`BuckKey` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '路径KEY'," "`FilePath` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文件路径'," @@ -513,7 +513,7 @@ BOOL CDatabase_File::Database_File_CreateTable() { Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); - return FALSE; + return false; } } return true; @@ -536,21 +536,21 @@ BOOL CDatabase_File::Database_File_CreateTable() 意思:是否成功 备注: *********************************************************************/ -BOOL CDatabase_File::Database_File_TimeMonth(LPCTSTR lpszStartTime, int* pInt_Month) +bool CDatabase_File::Database_File_TimeMonth(LPCXSTR lpszStartTime, int* pInt_Month) { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; XENGINE_LIBTIMER st_EndTime; memset(&st_EndTime, '\0', sizeof(XENGINE_LIBTIMER)); BaseLib_OperatorTime_GetSysTime(&st_EndTime); - TCHAR tszTimeStr[64]; + XCHAR tszTimeStr[64]; memset(tszTimeStr, '\0', sizeof(tszTimeStr)); - _stprintf(tszTimeStr, _T("%04d%02d"), st_EndTime.wYear, st_EndTime.wMonth); - int nEndTime = _ttoi(tszTimeStr); - int nStartTime = _ttoi(lpszStartTime); + _xstprintf(tszTimeStr, _X("%04d%02d"), st_EndTime.wYear, st_EndTime.wMonth); + int nEndTime = _ttxoi(tszTimeStr); + int nStartTime = _ttxoi(lpszStartTime); if (nStartTime > 0) { *pInt_Month = nEndTime - nStartTime; @@ -566,22 +566,22 @@ BOOL CDatabase_File::Database_File_TimeMonth(LPCTSTR lpszStartTime, int* pInt_Mo 意思:是否成功 备注: *********************************************************************/ -BOOL CDatabase_File::Database_File_TimeDel() +bool CDatabase_File::Database_File_TimeDel() { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; __int64u dwLine = 0; __int64u dwField = 0; XNETHANDLE xhTableResult; - TCHAR tszSQLQuery[2048]; + XCHAR tszSQLQuery[2048]; memset(tszSQLQuery, '\0', sizeof(tszSQLQuery)); - _stprintf_s(tszSQLQuery, _T("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='XEngine_Storage' AND TABLE_TYPE='BASE TABLE'")); + _xstprintf(tszSQLQuery, _X("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='XEngine_Storage' AND TABLE_TYPE='BASE TABLE'")); if (DataBase_MySQL_ExecuteQuery(xhDBSQL, &xhTableResult, tszSQLQuery, &dwLine, &dwField)) { for (__int64u i = 0; i < dwLine; i++) { - TCHAR** pptszResult = DataBase_MySQL_GetResult(xhDBSQL, xhTableResult); + XCHAR** pptszResult = DataBase_MySQL_GetResult(xhDBSQL, xhTableResult); if (NULL == pptszResult[0]) { continue; @@ -599,15 +599,15 @@ BOOL CDatabase_File::Database_File_TimeDel() for (int i = 0; i < nListCount; i++) { //删除文件 - TCHAR tszFilePath[2048]; + XCHAR tszFilePath[2048]; memset(tszFilePath, '\0', sizeof(tszFilePath)); - _stprintf(tszFilePath, _T("%s/%s"), ppSt_ListFile[i]->st_ProtocolFile.tszFilePath, ppSt_ListFile[i]->st_ProtocolFile.tszFileName); - _tremove(tszFilePath); + _xstprintf(tszFilePath, _X("%s/%s"), ppSt_ListFile[i]->st_ProtocolFile.tszFilePath, ppSt_ListFile[i]->st_ProtocolFile.tszFileName); + _xtremove(tszFilePath); } //删除数据库 memset(tszSQLQuery, '\0', sizeof(tszSQLQuery)); - _stprintf_s(tszSQLQuery, _T("DROP TABLE `%s`"), pptszResult[0]); + _xstprintf(tszSQLQuery, _X("DROP TABLE `%s`"), pptszResult[0]); DataBase_MySQL_Execute(xhDBSQL, tszSQLQuery); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListFile, nListCount); } @@ -620,7 +620,7 @@ BOOL CDatabase_File::Database_File_TimeDel() ////////////////////////////////////////////////////////////////////////// // 线程函数 ////////////////////////////////////////////////////////////////////////// -XHTHREAD CDatabase_File::Database_File_Thread(LPVOID lParam) +XHTHREAD CDatabase_File::Database_File_Thread(XPVOID lParam) { CDatabase_File *pClass_This = (CDatabase_File *)lParam; time_t nTimeStart = time(NULL); diff --git a/XEngine_Source/StorageModule_Database/Database_File/Database_File.h b/XEngine_Source/StorageModule_Database/Database_File/Database_File.h index 953eb2b..5330cab 100644 --- a/XEngine_Source/StorageModule_Database/Database_File/Database_File.h +++ b/XEngine_Source/StorageModule_Database/Database_File/Database_File.h @@ -17,19 +17,19 @@ public: CDatabase_File(); ~CDatabase_File(); public: - BOOL Database_File_Init(DATABASE_MYSQL_CONNECTINFO* pSt_DBConnector, int nTimeMonth = 1); - BOOL Database_File_Destory(); - BOOL Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, BOOL bRewrite = FALSE); - BOOL Database_File_FileDelete(LPCTSTR lpszBuckKey = NULL, LPCTSTR lpszFilePath = NULL, LPCTSTR lpszFileName = NULL, LPCTSTR lpszHash = NULL); - BOOL Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFile, int* pInt_ListCount, LPCTSTR lpszTimeStart = NULL, LPCTSTR lpszTimeEnd = NULL, LPCTSTR lpszBuckKey = NULL, LPCTSTR lpszFilePath = NULL, LPCTSTR lpszFileName = NULL, LPCTSTR lpszHash = NULL, LPCTSTR lpszTableName = NULL); + bool Database_File_Init(DATABASE_MYSQL_CONNECTINFO* pSt_DBConnector, int nTimeMonth = 1); + bool Database_File_Destory(); + bool Database_File_FileInsert(XSTORAGECORE_DBFILE *pSt_DBManage, bool bRewrite = false); + bool Database_File_FileDelete(LPCXSTR lpszBuckKey = NULL, LPCXSTR lpszFilePath = NULL, LPCXSTR lpszFileName = NULL, LPCXSTR lpszHash = NULL); + bool Database_File_FileQuery(XSTORAGECORE_DBFILE*** pppSt_ListFile, int* pInt_ListCount, LPCXSTR lpszTimeStart = NULL, LPCXSTR lpszTimeEnd = NULL, LPCXSTR lpszBuckKey = NULL, LPCXSTR lpszFilePath = NULL, LPCXSTR lpszFileName = NULL, LPCXSTR lpszHash = NULL, LPCXSTR lpszTableName = NULL); protected: - BOOL Database_File_CreateTable(); - BOOL Database_File_TimeMonth(LPCTSTR lpszStartTime, int* pInt_Month); - BOOL Database_File_TimeDel(); + bool Database_File_CreateTable(); + bool Database_File_TimeMonth(LPCXSTR lpszStartTime, int* pInt_Month); + bool Database_File_TimeDel(); protected: - static XHTHREAD Database_File_Thread(LPVOID lParam); + static XHTHREAD Database_File_Thread(XPVOID lParam); private: - BOOL bIsRun; + bool bIsRun; int m_nTimeMonth; XNETHANDLE xhDBSQL; private: diff --git a/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp b/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp index 3337387..7bcaef0 100644 --- a/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp +++ b/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.cpp @@ -38,11 +38,11 @@ CDatabase_Help::~CDatabase_Help() 意思:是否成功 备注: *********************************************************************/ -BOOL CDatabase_Help::Database_Help_Insert(TCHAR* ptszSQLBuffer, XSTORAGECORE_DBFILE* pSt_DBFile) +bool CDatabase_Help::Database_Help_Insert(XCHAR* ptszSQLBuffer, XSTORAGECORE_DBFILE* pSt_DBFile) { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; - TCHAR tszTableName[64]; + XCHAR tszTableName[64]; XENGINE_LIBTIMER st_LibTimer; memset(tszTableName, '\0', sizeof(tszTableName)); @@ -50,16 +50,16 @@ BOOL CDatabase_Help::Database_Help_Insert(TCHAR* ptszSQLBuffer, XSTORAGECORE_DBF //获得插入日期表 BaseLib_OperatorTime_GetSysTime(&st_LibTimer); - if (_tcslen(pSt_DBFile->tszTableName) > 0) + if (_tcsxlen(pSt_DBFile->tszTableName) > 0) { - _tcscpy(tszTableName, pSt_DBFile->tszTableName); + _tcsxcpy(tszTableName, pSt_DBFile->tszTableName); } else { - _stprintf(tszTableName, _T("%04d%02d"), st_LibTimer.wYear, st_LibTimer.wMonth); + _xstprintf(tszTableName, _X("%04d%02d"), st_LibTimer.wYear, st_LibTimer.wMonth); } - _stprintf(ptszSQLBuffer, _T("INSERT INTO `%s` (BuckKey,FilePath,FileName,FileHash,FileUser,FileSize,FileTime) VALUES('%s','%s','%s','%s','%s',%lld,'%04d-%02d-%02d %02d:%02d:%02d')"), tszTableName, pSt_DBFile->tszBuckKey, pSt_DBFile->st_ProtocolFile.tszFilePath, pSt_DBFile->st_ProtocolFile.tszFileName, pSt_DBFile->st_ProtocolFile.tszFileHash, pSt_DBFile->st_ProtocolFile.tszFileUser, pSt_DBFile->st_ProtocolFile.nFileSize, st_LibTimer.wYear, st_LibTimer.wMonth, st_LibTimer.wDay, st_LibTimer.wHour, st_LibTimer.wMinute, st_LibTimer.wSecond); + _xstprintf(ptszSQLBuffer, _X("INSERT INTO `%s` (BuckKey,FilePath,FileName,FileHash,FileUser,FileSize,FileTime) VALUES('%s','%s','%s','%s','%s',%lld,'%04d-%02d-%02d %02d:%02d:%02d')"), tszTableName, pSt_DBFile->tszBuckKey, pSt_DBFile->st_ProtocolFile.tszFilePath, pSt_DBFile->st_ProtocolFile.tszFileName, pSt_DBFile->st_ProtocolFile.tszFileHash, pSt_DBFile->st_ProtocolFile.tszFileUser, pSt_DBFile->st_ProtocolFile.nFileSize, st_LibTimer.wYear, st_LibTimer.wMonth, st_LibTimer.wDay, st_LibTimer.wHour, st_LibTimer.wMinute, st_LibTimer.wSecond); return true; } /******************************************************************** @@ -100,15 +100,15 @@ BOOL CDatabase_Help::Database_Help_Insert(TCHAR* ptszSQLBuffer, XSTORAGECORE_DBF 意思:是否成功 备注: *********************************************************************/ -BOOL CDatabase_Help::Database_Help_Delete(TCHAR* ptszSQLBuffer, LPCTSTR lpszTableName, LPCTSTR lpszBuckKey /* = NULL */, LPCTSTR lpszFilePath /* = NULL */, LPCTSTR lpszFileName /* = NULL */, LPCTSTR lpszFileHash /* = NULL */) +bool CDatabase_Help::Database_Help_Delete(XCHAR* ptszSQLBuffer, LPCXSTR lpszTableName, LPCXSTR lpszBuckKey /* = NULL */, LPCXSTR lpszFilePath /* = NULL */, LPCXSTR lpszFileName /* = NULL */, LPCXSTR lpszFileHash /* = NULL */) { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; - TCHAR tszSQLQuery[1024]; + XCHAR tszSQLQuery[1024]; memset(tszSQLQuery, '\0', sizeof(tszSQLQuery)); Database_Help_Packet(tszSQLQuery, lpszBuckKey, lpszFilePath, lpszFileName, lpszFileHash); - _stprintf(ptszSQLBuffer, _T("DELETE FROM `%s` %s"), lpszTableName, tszSQLQuery); + _xstprintf(ptszSQLBuffer, _X("DELETE FROM `%s` %s"), lpszTableName, tszSQLQuery); return true; } /******************************************************************** @@ -164,16 +164,16 @@ BOOL CDatabase_Help::Database_Help_Delete(TCHAR* ptszSQLBuffer, LPCTSTR lpszTabl 意思:是否成功 备注: *********************************************************************/ -BOOL CDatabase_Help::Database_Help_Query(TCHAR* ptszSQLBuffer, LPCTSTR lpszTableName, LPCTSTR lpszBuckKey /* = NULL */, LPCTSTR lpszFilePath /* = NULL */, LPCTSTR lpszFileName /* = NULL */, LPCTSTR lpszFileHash /* = NULL */, LPCTSTR lpszFileUser /* = NULL */, LPCTSTR lpszTimeStart /* = NULL */, LPCTSTR lpszTimeEnd /* = NULL */) +bool CDatabase_Help::Database_Help_Query(XCHAR* ptszSQLBuffer, LPCXSTR lpszTableName, LPCXSTR lpszBuckKey /* = NULL */, LPCXSTR lpszFilePath /* = NULL */, LPCXSTR lpszFileName /* = NULL */, LPCXSTR lpszFileHash /* = NULL */, LPCXSTR lpszFileUser /* = NULL */, LPCXSTR lpszTimeStart /* = NULL */, LPCXSTR lpszTimeEnd /* = NULL */) { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; - TCHAR tszSQLQuery[1024]; + XCHAR tszSQLQuery[1024]; memset(tszSQLQuery, '\0', sizeof(tszSQLQuery)); - _stprintf(ptszSQLBuffer, _T("SELECT * FROM `%s`"), lpszTableName); + _xstprintf(ptszSQLBuffer, _X("SELECT * FROM `%s`"), lpszTableName); Database_Help_Packet(tszSQLQuery, lpszBuckKey, lpszFilePath, lpszFileName, lpszFileHash, lpszFileUser, lpszTimeStart, lpszTimeEnd); - _tcscat(ptszSQLBuffer, tszSQLQuery); + _tcsxcat(ptszSQLBuffer, tszSQLQuery); return true; } ////////////////////////////////////////////////////////////////////////// @@ -227,124 +227,124 @@ BOOL CDatabase_Help::Database_Help_Query(TCHAR* ptszSQLBuffer, LPCTSTR lpszTable 意思:是否成功 备注: *********************************************************************/ -BOOL CDatabase_Help::Database_Help_Packet(TCHAR* ptszSQLBuffer, LPCTSTR lpszBuckKey /* = NULL */, LPCTSTR lpszFilePath /* = NULL */, LPCTSTR lpszFileName /* = NULL */, LPCTSTR lpszFileHash /* = NULL */, LPCTSTR lpszFileUser /* = NULL */, LPCTSTR lpszTimeStart /* = NULL */, LPCTSTR lpszTimeEnd /* = NULL */) +bool CDatabase_Help::Database_Help_Packet(XCHAR* ptszSQLBuffer, LPCXSTR lpszBuckKey /* = NULL */, LPCXSTR lpszFilePath /* = NULL */, LPCXSTR lpszFileName /* = NULL */, LPCXSTR lpszFileHash /* = NULL */, LPCXSTR lpszFileUser /* = NULL */, LPCXSTR lpszTimeStart /* = NULL */, LPCXSTR lpszTimeEnd /* = NULL */) { - Database_IsErrorOccur = FALSE; + Database_IsErrorOccur = false; - BOOL bInit = FALSE; - TCHAR tszSQLQuery[MAX_PATH]; + bool bInit = false; + XCHAR tszSQLQuery[MAX_PATH]; memset(tszSQLQuery, '\0', MAX_PATH); //文件所属BUCKET if (NULL != lpszBuckKey) { - if (_tcslen(lpszBuckKey) > 0) + if (_tcsxlen(lpszBuckKey) > 0) { if (bInit) { - _tcscat(ptszSQLBuffer, _T(" AND ")); + _tcsxcat(ptszSQLBuffer, _X(" AND ")); } else { - _tcscat(ptszSQLBuffer, _T(" WHERE ")); + _tcsxcat(ptszSQLBuffer, _X(" WHERE ")); } memset(tszSQLQuery, '\0', MAX_PATH); - _stprintf(tszSQLQuery, _T("BuckKey = '%s'"), lpszBuckKey); - _tcscat(ptszSQLBuffer, tszSQLQuery); + _xstprintf(tszSQLQuery, _X("BuckKey = '%s'"), lpszBuckKey); + _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; } } //文件路径 if (NULL != lpszFilePath) { - if (_tcslen(lpszFilePath) > 0) + if (_tcsxlen(lpszFilePath) > 0) { if (bInit) { - _tcscat(ptszSQLBuffer, _T(" AND ")); + _tcsxcat(ptszSQLBuffer, _X(" AND ")); } else { - _tcscat(ptszSQLBuffer, _T("WHERE ")); + _tcsxcat(ptszSQLBuffer, _X("WHERE ")); } memset(tszSQLQuery, '\0', MAX_PATH); - _stprintf(tszSQLQuery, _T("FilePath = '%s'"), lpszFilePath); - _tcscat(ptszSQLBuffer, tszSQLQuery); + _xstprintf(tszSQLQuery, _X("FilePath = '%s'"), lpszFilePath); + _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; } } //文件名称 if (NULL != lpszFileName) { - if (_tcslen(lpszFileName) > 0) + if (_tcsxlen(lpszFileName) > 0) { if (bInit) { - _tcscat(ptszSQLBuffer, _T(" AND ")); + _tcsxcat(ptszSQLBuffer, _X(" AND ")); } else { - _tcscat(ptszSQLBuffer, _T("WHERE ")); + _tcsxcat(ptszSQLBuffer, _X("WHERE ")); } memset(tszSQLQuery, '\0', MAX_PATH); - _stprintf(tszSQLQuery, _T("FileName = '%s'"), lpszFileName); - _tcscat(ptszSQLBuffer, tszSQLQuery); + _xstprintf(tszSQLQuery, _X("FileName = '%s'"), lpszFileName); + _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; } } //文件HASH if (NULL != lpszFileHash) { - if (_tcslen(lpszFileHash) > 0) + if (_tcsxlen(lpszFileHash) > 0) { if (bInit) { - _tcscat(ptszSQLBuffer, _T(" AND ")); + _tcsxcat(ptszSQLBuffer, _X(" AND ")); } else { - _tcscat(ptszSQLBuffer, _T("WHERE ")); + _tcsxcat(ptszSQLBuffer, _X("WHERE ")); } memset(tszSQLQuery, '\0', MAX_PATH); - _stprintf(tszSQLQuery, _T("FileHash = '%s'"), lpszFileHash); - _tcscat(ptszSQLBuffer, tszSQLQuery); + _xstprintf(tszSQLQuery, _X("FileHash = '%s'"), lpszFileHash); + _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; } } //文件所属用户 if (NULL != lpszFileUser) { - if (_tcslen(lpszFileUser) > 0) + if (_tcsxlen(lpszFileUser) > 0) { if (bInit) { - _tcscat(ptszSQLBuffer, _T(" AND ")); + _tcsxcat(ptszSQLBuffer, _X(" AND ")); } else { - _tcscat(ptszSQLBuffer, _T("WHERE ")); + _tcsxcat(ptszSQLBuffer, _X("WHERE ")); } memset(tszSQLQuery, '\0', MAX_PATH); - _stprintf(tszSQLQuery, _T("FileUser = '%s'"), lpszFileUser); - _tcscat(ptszSQLBuffer, tszSQLQuery); + _xstprintf(tszSQLQuery, _X("FileUser = '%s'"), lpszFileUser); + _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; } } //时间范围 if ((NULL != lpszTimeStart) && (NULL != lpszTimeEnd)) { - if ((_tcslen(lpszTimeStart) > 0) && (_tcslen(lpszTimeEnd) > 0)) + if ((_tcsxlen(lpszTimeStart) > 0) && (_tcsxlen(lpszTimeEnd) > 0)) { if (bInit) { - _tcscat(ptszSQLBuffer, _T(" AND ")); + _tcsxcat(ptszSQLBuffer, _X(" AND ")); } else { - _tcscat(ptszSQLBuffer, _T("WHERE ")); + _tcsxcat(ptszSQLBuffer, _X("WHERE ")); } memset(tszSQLQuery, '\0', MAX_PATH); - _stprintf(tszSQLQuery, _T("BETWEEN '%s' AND '%s'"), lpszTimeStart, lpszTimeEnd); - _tcscat(ptszSQLBuffer, tszSQLQuery); + _xstprintf(tszSQLQuery, _X("BETWEEN '%s' AND '%s'"), lpszTimeStart, lpszTimeEnd); + _tcsxcat(ptszSQLBuffer, tszSQLQuery); bInit = true; } } diff --git a/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.h b/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.h index 3d281d2..c01e9d2 100644 --- a/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.h +++ b/XEngine_Source/StorageModule_Database/Database_Help/Database_Help.h @@ -17,9 +17,9 @@ public: CDatabase_Help(); ~CDatabase_Help(); public: - BOOL Database_Help_Insert(TCHAR* ptszSQLBuffer, XSTORAGECORE_DBFILE* pSt_DBFile); - BOOL Database_Help_Delete(TCHAR* ptszSQLBuffer, LPCTSTR lpszTableName, LPCTSTR lpszBuckKey = NULL, LPCTSTR lpszFilePath = NULL, LPCTSTR lpszFileName = NULL, LPCTSTR lpszFileHash = NULL); - BOOL Database_Help_Query(TCHAR* ptszSQLBuffer, LPCTSTR lpszTableName, LPCTSTR lpszBuckKey = NULL, LPCTSTR lpszFilePath = NULL, LPCTSTR lpszFileName = NULL, LPCTSTR lpszFileHash = NULL, LPCTSTR lpszFileUser = NULL, LPCTSTR lpszTimeStart = NULL, LPCTSTR lpszTimeEnd = NULL); + bool Database_Help_Insert(XCHAR* ptszSQLBuffer, XSTORAGECORE_DBFILE* pSt_DBFile); + bool Database_Help_Delete(XCHAR* ptszSQLBuffer, LPCXSTR lpszTableName, LPCXSTR lpszBuckKey = NULL, LPCXSTR lpszFilePath = NULL, LPCXSTR lpszFileName = NULL, LPCXSTR lpszFileHash = NULL); + bool Database_Help_Query(XCHAR* ptszSQLBuffer, LPCXSTR lpszTableName, LPCXSTR lpszBuckKey = NULL, LPCXSTR lpszFilePath = NULL, LPCXSTR lpszFileName = NULL, LPCXSTR lpszFileHash = NULL, LPCXSTR lpszFileUser = NULL, LPCXSTR lpszTimeStart = NULL, LPCXSTR lpszTimeEnd = NULL); protected: - BOOL Database_Help_Packet(TCHAR* ptszSQLBuffer, LPCTSTR lpszBuckKey = NULL, LPCTSTR lpszFilePath = NULL, LPCTSTR lpszFileName = NULL, LPCTSTR lpszFileHash = NULL, LPCTSTR lpszFileUser = NULL, LPCTSTR lpszTimeStart = NULL, LPCTSTR lpszTimeEnd = NULL); + bool Database_Help_Packet(XCHAR* ptszSQLBuffer, LPCXSTR lpszBuckKey = NULL, LPCXSTR lpszFilePath = NULL, LPCXSTR lpszFileName = NULL, LPCXSTR lpszFileHash = NULL, LPCXSTR lpszFileUser = NULL, LPCXSTR lpszTimeStart = NULL, LPCXSTR lpszTimeEnd = NULL); }; diff --git a/XEngine_Source/StorageModule_Database/Makefile b/XEngine_Source/StorageModule_Database/Makefile index 6df217f..dc651e8 100644 --- a/XEngine_Source/StorageModule_Database/Makefile +++ b/XEngine_Source/StorageModule_Database/Makefile @@ -1,31 +1,23 @@ CC = g++ -Wall -std=c++17 -fPIC -SHAREFLAG = -shared -SHAREDLL = so +PLATFORM = linux +PLATVER = +PLATDIR = +FILEEXT = +LIBFLAG = RELEASE = 0 UNICODE = 0 -INCLUDE = -I ./ -FILECENTOS = /etc/redhat-release -LOADBIN = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_HelpComponents +LOADHDR = -I ./ -I ../XEngine_ThirdPart/jsoncpp +LOADSO = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_HelpComponents LIB = -lXEngine_BaseLib -lHelpComponents_DataBase -LIBEX = -ldl -LOADSO = -Wl,-rpath=./,--disable-new-dtags -LIBINCLUDE = Database_File.o Database_Help.o pch.o - -ifeq ($(shell uname),Darwin) - SHAREDLL = dylib - SHAREFLAG = -dynamiclib - LOADSO = -else - SHAREDLL = so - SHAREFLAG = -shared -endif +LIBEX = +OBJECTS = Database_File.o Database_Help.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -O2 +FLAGS = -c DEBUG = else -FLAGS = -c -DEBUG = -g +FLAGS = -c -lc_p +DEBUG = -g -pg endif ifeq ($(UNICODE),1) @@ -34,25 +26,47 @@ else UNICODE = endif -all:$(LIBINCLUDE) - $(CC) $(DEBUG) $(LIBINCLUDE) -o libStorageModule_Database.$(SHAREDLL) $(SHAREFLAG) $(LOADBIN) $(LIB) $(LIBEX) $(LOADSO) +ifeq ($(PLATFORM),linux) + ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) + PLATVER = -D __CENTOS__ + PLATDIR = XEngine_Linux/Centos + else + PLATVER = -D __UBUNTU__ + PLATDIR = XEngine_Linux/Ubuntu + endif + FILEEXT = so + LIBFLAG = -shared + LIBEX = -lpthread -lrt -ldl + LOADBIN = -Wl,-rpath=./,--disable-new-dtags +else ifeq ($(PLATFORM),mac) + CC += -Wno-deprecated-declarations + PLATVER = -D __MACOS__ + PLATDIR = XEngine_Mac + FILEEXT = dylib + LIBFLAG = -dynamiclib + LIBEX = -lpthread -ldl + LOADBIN = -Wl,-rpath,@loader_path/./ +endif + +all:$(OBJECTS) + $(CC) $(DEBUG) $(OBJECTS) -o libStorageModule_Database.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) Database_File.o:./Database_File/Database_File.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./Database_File/Database_File.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Database_File/Database_File.cpp Database_Help.o:./Database_Help/Database_Help.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./Database_Help/Database_Help.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Database_Help/Database_Help.cpp pch.o:pch.cpp $(CC) $(DEBUG) $(FLAGS) $(UNICODE) pch.cpp InstallAll:InstallSo -InstallSo:./libStorageModule_Database.$(SHAREDLL) - cp ./libStorageModule_Database.$(SHAREDLL) ../../XEngine_Release/libStorageModule_Database.$(SHAREDLL) +InstallSo:./libStorageModule_Database.$(FILEEXT) + cp ./libStorageModule_Database.$(FILEEXT) ../../XEngine_Release/libStorageModule_Database.$(FILEEXT) CleanAll:CleanObj CleanMk CleanObj: rm *.o CleanMk: - rm *.$(SHAREDLL) + rm *.$(FILEEXT) diff --git a/XEngine_Source/StorageModule_Database/dllmain.cpp b/XEngine_Source/StorageModule_Database/dllmain.cpp index 0745b19..594ff21 100644 --- a/XEngine_Source/StorageModule_Database/dllmain.cpp +++ b/XEngine_Source/StorageModule_Database/dllmain.cpp @@ -1,9 +1,9 @@ // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved +bool APIENTRY DllMain( HMODULE hModule, + XLONG ul_reason_for_call, + XPVOID lpReserved ) { switch (ul_reason_for_call) diff --git a/XEngine_Source/StorageModule_Database/pch.cpp b/XEngine_Source/StorageModule_Database/pch.cpp index 0553107..2d97e0a 100644 --- a/XEngine_Source/StorageModule_Database/pch.cpp +++ b/XEngine_Source/StorageModule_Database/pch.cpp @@ -12,15 +12,15 @@ // Purpose: 导出函数实现 // History: *********************************************************************/ -BOOL Database_IsErrorOccur = FALSE; -DWORD Database_dwErrorCode = 0; +bool Database_IsErrorOccur = false; +XLONG Database_dwErrorCode = 0; ////////////////////////////////////////////////////////////////////////// CDatabase_Help m_SQLHelp; CDatabase_File m_SQLFile; ////////////////////////////////////////////////////////////////////////// /// 导出的函数 ////////////////////////////////////////////////////////////////////////// -extern "C" DWORD Database_GetLastError(int* pInt_SysError) +extern "C" XLONG Database_GetLastError(int* pInt_SysError) { if (NULL != pInt_SysError) { @@ -31,38 +31,38 @@ extern "C" DWORD Database_GetLastError(int* pInt_SysError) /************************************************************************/ /* 导出的数据库帮助函数 */ /************************************************************************/ -extern "C" BOOL Database_Help_Insert(TCHAR * ptszSQLBuffer, XSTORAGECORE_DBFILE * pSt_DBFile) +extern "C" bool Database_Help_Insert(XCHAR * ptszSQLBuffer, XSTORAGECORE_DBFILE * pSt_DBFile) { return m_SQLHelp.Database_Help_Insert(ptszSQLBuffer, pSt_DBFile); } -extern "C" BOOL Database_Help_Delete(TCHAR * ptszSQLBuffer, LPCTSTR lpszTableName, LPCTSTR lpszBuckKey, LPCTSTR lpszFilePath, LPCTSTR lpszFileName, LPCTSTR lpszFileHash) +extern "C" bool Database_Help_Delete(XCHAR * ptszSQLBuffer, LPCXSTR lpszTableName, LPCXSTR lpszBuckKey, LPCXSTR lpszFilePath, LPCXSTR lpszFileName, LPCXSTR lpszFileHash) { return m_SQLHelp.Database_Help_Delete(ptszSQLBuffer, lpszTableName, lpszBuckKey, lpszFilePath, lpszFileName, lpszFileHash); } -extern "C" BOOL Database_Help_Query(TCHAR * ptszSQLBuffer, LPCTSTR lpszTableName, LPCTSTR lpszBuckKey, LPCTSTR lpszFilePath, LPCTSTR lpszFileName, LPCTSTR lpszFileHash, LPCTSTR lpszFileUser, LPCTSTR lpszTimeStart, LPCTSTR lpszTimeEnd) +extern "C" bool Database_Help_Query(XCHAR * ptszSQLBuffer, LPCXSTR lpszTableName, LPCXSTR lpszBuckKey, LPCXSTR lpszFilePath, LPCXSTR lpszFileName, LPCXSTR lpszFileHash, LPCXSTR lpszFileUser, LPCXSTR lpszTimeStart, LPCXSTR lpszTimeEnd) { return m_SQLHelp.Database_Help_Query(ptszSQLBuffer, lpszTableName, lpszBuckKey, lpszFilePath, lpszFileName, lpszFileHash, lpszFileUser, lpszTimeStart, lpszTimeEnd); } /************************************************************************/ /* 导出的数据库操作函数 */ /************************************************************************/ -extern "C" BOOL Database_File_Init(DATABASE_MYSQL_CONNECTINFO * pSt_DBConnector, int nTimeMonth) +extern "C" bool Database_File_Init(DATABASE_MYSQL_CONNECTINFO * pSt_DBConnector, int nTimeMonth) { return m_SQLFile.Database_File_Init(pSt_DBConnector, nTimeMonth); } -extern "C" BOOL Database_File_Destory() +extern "C" bool Database_File_Destory() { return m_SQLFile.Database_File_Destory(); } -extern "C" BOOL Database_File_FileInsert(XSTORAGECORE_DBFILE * pSt_DBManage, BOOL bRewrite) +extern "C" bool Database_File_FileInsert(XSTORAGECORE_DBFILE * pSt_DBManage, bool bRewrite) { return m_SQLFile.Database_File_FileInsert(pSt_DBManage, bRewrite); } -extern "C" BOOL Database_File_FileDelete(LPCTSTR lpszBuckKey, LPCTSTR lpszFilePath, LPCTSTR lpszFileName, LPCTSTR lpszHash) +extern "C" bool Database_File_FileDelete(LPCXSTR lpszBuckKey, LPCXSTR lpszFilePath, LPCXSTR lpszFileName, LPCXSTR lpszHash) { return m_SQLFile.Database_File_FileDelete(lpszBuckKey, lpszFilePath, lpszFileName, lpszHash); } -extern "C" BOOL Database_File_FileQuery(XSTORAGECORE_DBFILE * **pppSt_ListFile, int* pInt_ListCount, LPCTSTR lpszTimeStart, LPCTSTR lpszTimeEnd, LPCTSTR lpszBuckKey, LPCTSTR lpszFilePath, LPCTSTR lpszFileName, LPCTSTR lpszHash, LPCTSTR lpszTableName) +extern "C" bool Database_File_FileQuery(XSTORAGECORE_DBFILE * **pppSt_ListFile, int* pInt_ListCount, LPCXSTR lpszTimeStart, LPCXSTR lpszTimeEnd, LPCXSTR lpszBuckKey, LPCXSTR lpszFilePath, LPCXSTR lpszFileName, LPCXSTR lpszHash, LPCXSTR lpszTableName) { return m_SQLFile.Database_File_FileQuery(pppSt_ListFile, pInt_ListCount, lpszTimeStart, lpszTimeEnd, lpszBuckKey, lpszFilePath, lpszFileName, lpszHash, lpszTableName); } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Database/pch.h b/XEngine_Source/StorageModule_Database/pch.h index e892df9..ebc1754 100644 --- a/XEngine_Source/StorageModule_Database/pch.h +++ b/XEngine_Source/StorageModule_Database/pch.h @@ -52,8 +52,8 @@ using namespace std; // Purpose: 公用头文件 // History: *********************************************************************/ -extern BOOL Database_IsErrorOccur; -extern DWORD Database_dwErrorCode; +extern bool Database_IsErrorOccur; +extern XLONG Database_dwErrorCode; #ifdef _WINDOWS #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib.lib") diff --git a/XEngine_Source/StorageModule_Protocol/Makefile b/XEngine_Source/StorageModule_Protocol/Makefile index 87b4647..6e218f6 100644 --- a/XEngine_Source/StorageModule_Protocol/Makefile +++ b/XEngine_Source/StorageModule_Protocol/Makefile @@ -1,31 +1,23 @@ CC = g++ -Wall -std=c++17 -fPIC -SHAREFLAG = -shared -SHAREDLL = so +PLATFORM = linux +PLATVER = +PLATDIR = +FILEEXT = +LIBFLAG = RELEASE = 0 UNICODE = 0 -INCLUDE = -I ./ -I ../XEngine_ThirdPart/jsoncpp -FILECENTOS = /etc/redhat-release -LOADBIN = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L ../XEngine_ThirdPart/jsoncpp +LOADHDR = -I ./ -I ../XEngine_ThirdPart/jsoncpp +LOADSO = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L ../XEngine_ThirdPart/jsoncpp LIB = -lXEngine_BaseLib -ljsoncpp -LIBEX = -ldl -LOADSO = -Wl,-rpath=./,--disable-new-dtags -LIBINCLUDE = Protocol_StoragePacket.o Protocol_StorageParse.o pch.o - -ifeq ($(shell uname),Darwin) - SHAREDLL = dylib - SHAREFLAG = -dynamiclib - LOADSO = -else - SHAREDLL = so - SHAREFLAG = -shared -endif +LIBEX = +OBJECTS = Protocol_StoragePacket.o Protocol_StorageParse.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -O2 +FLAGS = -c DEBUG = else -FLAGS = -c -DEBUG = -g +FLAGS = -c -lc_p +DEBUG = -g -pg endif ifeq ($(UNICODE),1) @@ -34,31 +26,47 @@ else UNICODE = endif -ifeq ($(FILECENTOS), $(wildcard $(FILECENTOS))) - UNICODE = -D _CENTOS -else - UNICODE = -D _UBUNTU +ifeq ($(PLATFORM),linux) + ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) + PLATVER = -D __CENTOS__ + PLATDIR = XEngine_Linux/Centos + else + PLATVER = -D __UBUNTU__ + PLATDIR = XEngine_Linux/Ubuntu + endif + FILEEXT = so + LIBFLAG = -shared + LIBEX = -lpthread -lrt -ldl + LOADBIN = -Wl,-rpath=./,--disable-new-dtags +else ifeq ($(PLATFORM),mac) + CC += -Wno-deprecated-declarations + PLATVER = -D __MACOS__ + PLATDIR = XEngine_Mac + FILEEXT = dylib + LIBFLAG = -dynamiclib + LIBEX = -lpthread -ldl + LOADBIN = -Wl,-rpath,@loader_path/./ endif -all:$(LIBINCLUDE) - $(CC) $(DEBUG) $(LIBINCLUDE) -o libStorageModule_Protocol.$(SHAREDLL) $(SHAREFLAG) $(LOADBIN) $(LIB) $(LIBEX) $(LOADSO) +all:$(OBJECTS) + $(CC) $(DEBUG) $(OBJECTS) -o libStorageModule_Protocol.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) Protocol_StoragePacket.o:./Protocol_Packet/Protocol_StoragePacket.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./Protocol_Packet/Protocol_StoragePacket.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Protocol_Packet/Protocol_StoragePacket.cpp Protocol_StorageParse.o:./Protocol_Parse/Protocol_StorageParse.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./Protocol_Parse/Protocol_StorageParse.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Protocol_Parse/Protocol_StorageParse.cpp pch.o:pch.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) pch.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) pch.cpp InstallAll:InstallSo -InstallSo:./libStorageModule_Protocol.$(SHAREDLL) - cp ./libStorageModule_Protocol.$(SHAREDLL) ../../XEngine_Release/libStorageModule_Protocol.$(SHAREDLL) +InstallSo:./libStorageModule_Protocol.$(FILEEXT) + cp ./libStorageModule_Protocol.$(FILEEXT) ../../XEngine_Release/libStorageModule_Protocol.$(FILEEXT) CleanAll:CleanObj CleanMk CleanObj: rm *.o CleanMk: - rm *.$(SHAREDLL) + rm *.$(FILEEXT) diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp index 3f25d68..7aa3fda 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp @@ -65,15 +65,15 @@ CProtocol_StoragePacket::~CProtocol_StoragePacket() 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StoragePacket::Protocol_StoragePacket_QueryFile(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XSTORAGECORE_DBFILE*** pppSt_DBFile, int nListCount, LPCTSTR lpszTimeStart /* = NULL */, LPCTSTR lpszTimeEnd /* = NULL */, XNETHANDLE xhToken /* = 0 */) +bool CProtocol_StoragePacket::Protocol_StoragePacket_QueryFile(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XSTORAGECORE_DBFILE*** pppSt_DBFile, int nListCount, LPCXSTR lpszTimeStart /* = NULL */, LPCXSTR lpszTimeEnd /* = NULL */, XNETHANDLE xhToken /* = 0 */) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen) || (NULL == pppSt_DBFile)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; + return false; } Json::Value st_JsonRoot; Json::Value st_JsonArray; @@ -90,7 +90,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_QueryFile(TCHAR* ptszMsgBuf st_JsonObject["tszFileTime"] = (*pppSt_DBFile)[i]->st_ProtocolFile.tszFileTime; st_JsonObject["nFileSize"] = (Json::Value::Int64)(*pppSt_DBFile)[i]->st_ProtocolFile.nFileSize; //只有在P2P下取文件列表才有效 - if (_tcslen((*pppSt_DBFile)[i]->tszTableName) > 0) + if (_tcsxlen((*pppSt_DBFile)[i]->tszTableName) > 0) { st_JsonObject["tszTableName"] = (*pppSt_DBFile)[i]->tszTableName; } @@ -111,7 +111,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_QueryFile(TCHAR* ptszMsgBuf st_JsonRoot["xhToken"] = (Json::Value::UInt64)xhToken; } st_JsonRoot["Code"] = 0; - st_JsonRoot["Msg"] = _T("ok"); + st_JsonRoot["Msg"] = _X("ok"); //打包输出信息 *pInt_MsgLen = st_JsonRoot.toStyledString().length(); memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); @@ -155,15 +155,15 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_QueryFile(TCHAR* ptszMsgBuf 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StoragePacket::Protocol_StoragePacket_Info(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, SESSION_STORAGEINFO*** pppSt_DLInfo, SESSION_STORAGEINFO*** pppSt_UPInfo, int nDLCount, int nUPCount) +bool CProtocol_StoragePacket::Protocol_StoragePacket_Info(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, SESSION_STORAGEINFO*** pppSt_DLInfo, SESSION_STORAGEINFO*** pppSt_UPInfo, int nDLCount, int nUPCount) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; if ((NULL == pppSt_DLInfo) || (NULL == pppSt_UPInfo)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; + return false; } Json::Value st_JsonRoot; Json::Value st_JsonDLArray; @@ -202,7 +202,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_Info(TCHAR* ptszMsgBuffer, st_JsonRoot["UPList"] = st_JsonUPArray; st_JsonRoot["Code"] = 0; - st_JsonRoot["Msg"] = _T("ok"); + st_JsonRoot["Msg"] = _X("ok"); //打包输出信息 *pInt_MsgLen = st_JsonRoot.toStyledString().length(); memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); @@ -236,15 +236,15 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_Info(TCHAR* ptszMsgBuffer, 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StoragePacket::Protocol_StoragePacket_DirOperator(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, TCHAR*** pppszListEnum, int nListCount) +bool CProtocol_StoragePacket::Protocol_StoragePacket_DirOperator(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** pppszListEnum, int nListCount) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; + return false; } Json::Value st_JsonRoot; Json::Value st_JsonArray; @@ -258,7 +258,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_DirOperator(TCHAR* ptszMsgB st_JsonRoot["Count"] = st_JsonArray.size(); st_JsonRoot["List"] = st_JsonArray; st_JsonRoot["Code"] = 0; - st_JsonRoot["Msg"] = _T("ok"); + st_JsonRoot["Msg"] = _X("ok"); //打包输出信息 *pInt_MsgLen = st_JsonRoot.toStyledString().length(); memcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str(), *pInt_MsgLen); @@ -307,15 +307,15 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_DirOperator(TCHAR* ptszMsgB 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StoragePacket::Protocol_StoragePacket_BasicAuth(LPCTSTR lpszMethod, LPCTSTR lpszPostUrl, LPCTSTR lpszClientAddr, LPCTSTR lpszUser, LPCTSTR lpszPass, TCHAR* ptszMsgBuffer, int* pInt_MsgLen) +bool CProtocol_StoragePacket::Protocol_StoragePacket_BasicAuth(LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR* ptszMsgBuffer, int* pInt_MsgLen) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; if ((NULL == lpszUser) || (NULL == lpszPass)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; + return false; } Json::Value st_JsonRoot; @@ -326,7 +326,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_BasicAuth(LPCTSTR lpszMetho st_JsonRoot["lpszPass"] = lpszPass; *pInt_MsgLen = st_JsonRoot.toStyledString().length(); - _tcscpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str()); + _tcsxcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str()); return true; } /******************************************************************** @@ -377,15 +377,15 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_BasicAuth(LPCTSTR lpszMetho 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StoragePacket::Protocol_StoragePacket_UPDown(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCTSTR lpszBuckKey, LPCTSTR lpszFileName, LPCTSTR lpszClientAddr, __int64x nFileSize, BOOL bDown, LPCTSTR lpszFileHash /* = NULL */) +bool CProtocol_StoragePacket::Protocol_StoragePacket_UPDown(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszBuckKey, LPCXSTR lpszFileName, LPCXSTR lpszClientAddr, __int64x nFileSize, bool bDown, LPCXSTR lpszFileHash /* = NULL */) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; if ((NULL == lpszFileName) || (NULL == lpszClientAddr)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; + return false; } Json::Value st_JsonRoot; @@ -404,7 +404,7 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_UPDown(TCHAR* ptszMsgBuffer } *pInt_MsgLen = st_JsonRoot.toStyledString().length(); - _tcscpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str()); + _tcsxcpy(ptszMsgBuffer, st_JsonRoot.toStyledString().c_str()); return true; } /******************************************************************** @@ -440,15 +440,15 @@ BOOL CProtocol_StoragePacket::Protocol_StoragePacket_UPDown(TCHAR* ptszMsgBuffer 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StoragePacket::Protocol_StoragePacket_REQFile(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCTSTR lpszFileName /* = NULL */, LPCTSTR lpszFileHash /* = NULL */, XNETHANDLE xhToken /* = 0 */) +bool CProtocol_StoragePacket::Protocol_StoragePacket_REQFile(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName /* = NULL */, LPCXSTR lpszFileHash /* = NULL */, XNETHANDLE xhToken /* = 0 */) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; + return false; } Json::Value st_JsonRoot; if (NULL != lpszFileName) diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h index 05cb630..879d1b2 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h @@ -17,10 +17,10 @@ public: CProtocol_StoragePacket(); ~CProtocol_StoragePacket(); public: - BOOL Protocol_StoragePacket_QueryFile(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, XSTORAGECORE_DBFILE*** pppSt_DBFile, int nListCount, LPCTSTR lpszTimeStart = NULL, LPCTSTR lpszTimeEnd = NULL, XNETHANDLE xhToken = 0); - BOOL Protocol_StoragePacket_Info(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, SESSION_STORAGEINFO*** pppSt_DLInfo, SESSION_STORAGEINFO*** pppSt_UPInfo, int nDLCount, int nUPCount); - BOOL Protocol_StoragePacket_DirOperator(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, TCHAR*** pppszListEnum, int nListCount); - BOOL Protocol_StoragePacket_BasicAuth(LPCTSTR lpszMethod, LPCTSTR lpszPostUrl, LPCTSTR lpszClientAddr, LPCTSTR lpszUser, LPCTSTR lpszPass, TCHAR* ptszMsgBuffer, int* pInt_MsgLen); - BOOL Protocol_StoragePacket_UPDown(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCTSTR lpszBuckKey, LPCTSTR lpszFileName, LPCTSTR lpszClientAddr, __int64x nFileSize, BOOL bDown, LPCTSTR lpszFileHash = NULL); - BOOL Protocol_StoragePacket_REQFile(TCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCTSTR lpszFileName = NULL, LPCTSTR lpszFileHash = NULL, XNETHANDLE xhToken = 0); + bool Protocol_StoragePacket_QueryFile(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XSTORAGECORE_DBFILE*** pppSt_DBFile, int nListCount, LPCXSTR lpszTimeStart = NULL, LPCXSTR lpszTimeEnd = NULL, XNETHANDLE xhToken = 0); + bool Protocol_StoragePacket_Info(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, SESSION_STORAGEINFO*** pppSt_DLInfo, SESSION_STORAGEINFO*** pppSt_UPInfo, int nDLCount, int nUPCount); + bool Protocol_StoragePacket_DirOperator(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** pppszListEnum, int nListCount); + bool Protocol_StoragePacket_BasicAuth(LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR* ptszMsgBuffer, int* pInt_MsgLen); + bool Protocol_StoragePacket_UPDown(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszBuckKey, LPCXSTR lpszFileName, LPCXSTR lpszClientAddr, __int64x nFileSize, bool bDown, LPCXSTR lpszFileHash = NULL); + bool Protocol_StoragePacket_REQFile(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName = NULL, LPCXSTR lpszFileHash = NULL, XNETHANDLE xhToken = 0); }; diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.cpp b/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.cpp index 73401dd..722f90d 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.cpp +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.cpp @@ -70,15 +70,15 @@ CProtocol_StorageParse::~CProtocol_StorageParse() 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StorageParse::Protocol_StorageParse_QueryFile(LPCTSTR lpszMsgBuffer, TCHAR* ptszTimeStart, TCHAR* ptszTimeEnd, TCHAR* ptszBuckKey /* = NULL */, TCHAR* ptszFileName /* = NULL */, TCHAR* ptszFileHash /* = NULL */, int* pInt_Mode /* = NULL */, XNETHANDLE* pxhToken /* = NULL */) +bool CProtocol_StorageParse::Protocol_StorageParse_QueryFile(LPCXSTR lpszMsgBuffer, XCHAR* ptszTimeStart, XCHAR* ptszTimeEnd, XCHAR* ptszBuckKey /* = NULL */, XCHAR* ptszFileName /* = NULL */, XCHAR* ptszFileHash /* = NULL */, int* pInt_Mode /* = NULL */, XNETHANDLE* pxhToken /* = NULL */) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; if (NULL == lpszMsgBuffer) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; + return false; } Json::Value st_JsonRoot; Json::CharReaderBuilder st_JsonBuild; @@ -86,11 +86,11 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_QueryFile(LPCTSTR lpszMsgBuff JSONCPP_STRING st_JsonError; //解析JSON - if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcslen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcsxlen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; - return FALSE; + return false; } delete pSt_JsonReader; pSt_JsonReader = NULL; @@ -99,35 +99,35 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_QueryFile(LPCTSTR lpszMsgBuff { if (!st_JsonRoot["lpszTimeStart"].isNull()) { - _tcscpy(ptszTimeStart, st_JsonRoot["lpszTimeStart"].asCString()); + _tcsxcpy(ptszTimeStart, st_JsonRoot["lpszTimeStart"].asCString()); } } if (NULL != ptszTimeEnd) { if (!st_JsonRoot["lpszTimeEnd"].isNull()) { - _tcscpy(ptszTimeEnd, st_JsonRoot["lpszTimeEnd"].asCString()); + _tcsxcpy(ptszTimeEnd, st_JsonRoot["lpszTimeEnd"].asCString()); } } if (NULL != ptszFileName) { if (!st_JsonRoot["lpszFileName"].isNull()) { - _tcscpy(ptszFileName, st_JsonRoot["lpszFileName"].asCString()); + _tcsxcpy(ptszFileName, st_JsonRoot["lpszFileName"].asCString()); } } if (NULL != ptszFileHash) { if (!st_JsonRoot["lpszFileHash"].isNull()) { - _tcscpy(ptszFileHash, st_JsonRoot["lpszFileHash"].asCString()); + _tcsxcpy(ptszFileHash, st_JsonRoot["lpszFileHash"].asCString()); } } if (NULL != ptszBuckKey) { if (!st_JsonRoot["lpszBuckKey"].isNull()) { - _tcscpy(ptszBuckKey, st_JsonRoot["lpszBuckKey"].asCString()); + _tcsxcpy(ptszBuckKey, st_JsonRoot["lpszBuckKey"].asCString()); } } if (NULL != pInt_Mode) @@ -174,9 +174,9 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_QueryFile(LPCTSTR lpszMsgBuff 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StorageParse::Protocol_StorageParse_ReportFile(LPCTSTR lpszMsgBuffer, int nMsgLen, XSTORAGECORE_DBFILE*** pppSt_DBFile, int *pInt_ListCount) +bool CProtocol_StorageParse::Protocol_StorageParse_ReportFile(LPCXSTR lpszMsgBuffer, int nMsgLen, XSTORAGECORE_DBFILE*** pppSt_DBFile, int *pInt_ListCount) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; Json::Value st_JsonRoot; Json::CharReaderBuilder st_JsonBuild; @@ -188,7 +188,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_ReportFile(LPCTSTR lpszMsgBuf { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; - return FALSE; + return false; } delete pSt_JsonReader; pSt_JsonReader = NULL; @@ -210,27 +210,27 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_ReportFile(LPCTSTR lpszMsgBuf if (!st_JsonArray[i]["tszBuckKey"].isNull()) { - _tcscpy((*pppSt_DBFile)[i]->tszBuckKey, st_JsonArray[i]["tszBuckKey"].asCString()); + _tcsxcpy((*pppSt_DBFile)[i]->tszBuckKey, st_JsonArray[i]["tszBuckKey"].asCString()); } if (!st_JsonArray[i]["tszFileName"].isNull()) { - _tcscpy((*pppSt_DBFile)[i]->st_ProtocolFile.tszFileName, st_JsonArray[i]["tszFileName"].asCString()); + _tcsxcpy((*pppSt_DBFile)[i]->st_ProtocolFile.tszFileName, st_JsonArray[i]["tszFileName"].asCString()); } if (!st_JsonArray[i]["tszFilePath"].isNull()) { - _tcscpy((*pppSt_DBFile)[i]->st_ProtocolFile.tszFilePath, st_JsonArray[i]["tszFilePath"].asCString()); + _tcsxcpy((*pppSt_DBFile)[i]->st_ProtocolFile.tszFilePath, st_JsonArray[i]["tszFilePath"].asCString()); } if (!st_JsonArray[i]["tszFileHash"].isNull()) { - _tcscpy((*pppSt_DBFile)[i]->st_ProtocolFile.tszFileHash, st_JsonArray[i]["tszFileHash"].asCString()); + _tcsxcpy((*pppSt_DBFile)[i]->st_ProtocolFile.tszFileHash, st_JsonArray[i]["tszFileHash"].asCString()); } if (!st_JsonArray[i]["tszFileTime"].isNull()) { - _tcscpy((*pppSt_DBFile)[i]->st_ProtocolFile.tszFileTime, st_JsonArray[i]["tszFileTime"].asCString()); + _tcsxcpy((*pppSt_DBFile)[i]->st_ProtocolFile.tszFileTime, st_JsonArray[i]["tszFileTime"].asCString()); } if (!st_JsonArray[i]["tszFileUser"].isNull()) { - _tcscpy((*pppSt_DBFile)[i]->st_ProtocolFile.tszFileUser, st_JsonArray[i]["tszFileUser"].asCString()); + _tcsxcpy((*pppSt_DBFile)[i]->st_ProtocolFile.tszFileUser, st_JsonArray[i]["tszFileUser"].asCString()); } } *pInt_ListCount = nCount; @@ -264,15 +264,15 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_ReportFile(LPCTSTR lpszMsgBuf 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StorageParse::Protocol_StorageParse_DirOperator(LPCTSTR lpszMsgBuffer, TCHAR* ptszUserDir, TCHAR* ptszBuckKey, int* pInt_Operator) +bool CProtocol_StorageParse::Protocol_StorageParse_DirOperator(LPCXSTR lpszMsgBuffer, XCHAR* ptszUserDir, XCHAR* ptszBuckKey, int* pInt_Operator) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; if ((NULL == lpszMsgBuffer) || (NULL == ptszUserDir)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; + return false; } Json::Value st_JsonRoot; Json::CharReaderBuilder st_JsonBuild; @@ -280,20 +280,20 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_DirOperator(LPCTSTR lpszMsgBu JSONCPP_STRING st_JsonError; //解析JSON - if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcslen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcsxlen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; - return FALSE; + return false; } delete pSt_JsonReader; pSt_JsonReader = NULL; *pInt_Operator = st_JsonRoot["nOPerator"].asInt(); - _tcscpy(ptszBuckKey, st_JsonRoot["lpszBuckKey"].asCString()); + _tcsxcpy(ptszBuckKey, st_JsonRoot["lpszBuckKey"].asCString()); if (!st_JsonRoot["lpszUserDir"].isNull()) { - _tcscpy(ptszUserDir, st_JsonRoot["lpszUserDir"].asCString()); + _tcsxcpy(ptszUserDir, st_JsonRoot["lpszUserDir"].asCString()); } return true; } @@ -340,15 +340,15 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_DirOperator(LPCTSTR lpszMsgBu 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StorageParse::Protocol_StorageParse_ProxyNotify(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR* ptszClientAddr, TCHAR* ptszBuckKey, TCHAR* ptszFileName, TCHAR* ptszFileHash, __int64x* pInt_FileSize) +bool CProtocol_StorageParse::Protocol_StorageParse_ProxyNotify(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszClientAddr, XCHAR* ptszBuckKey, XCHAR* ptszFileName, XCHAR* ptszFileHash, __int64x* pInt_FileSize) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; if ((NULL == lpszMsgBuffer) || (NULL == ptszClientAddr)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; + return false; } Json::Value st_JsonRoot; Json::CharReaderBuilder st_JsonBuild; @@ -356,19 +356,19 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_ProxyNotify(LPCTSTR lpszMsgBu JSONCPP_STRING st_JsonError; //解析JSON - if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcslen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcsxlen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; - return FALSE; + return false; } delete pSt_JsonReader; pSt_JsonReader = NULL; - _tcscpy(ptszClientAddr, st_JsonRoot["lpszClientAddr"].asCString()); - _tcscpy(ptszFileName, st_JsonRoot["lpszFileName"].asCString()); - _tcscpy(ptszFileHash, st_JsonRoot["lpszFileHash"].asCString()); - _tcscpy(ptszBuckKey, st_JsonRoot["lpszBuckKey"].asCString()); + _tcsxcpy(ptszClientAddr, st_JsonRoot["lpszClientAddr"].asCString()); + _tcsxcpy(ptszFileName, st_JsonRoot["lpszFileName"].asCString()); + _tcsxcpy(ptszFileHash, st_JsonRoot["lpszFileHash"].asCString()); + _tcsxcpy(ptszBuckKey, st_JsonRoot["lpszBuckKey"].asCString()); *pInt_FileSize = st_JsonRoot["nFileSize"].asInt64(); return true; @@ -401,15 +401,15 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_ProxyNotify(LPCTSTR lpszMsgBu 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StorageParse::Protocol_StorageParse_SpeedLimit(LPCTSTR lpszMsgBuffer, int nMsgLen, int* pInt_Code, int* pInt_Limit) +bool CProtocol_StorageParse::Protocol_StorageParse_SpeedLimit(LPCXSTR lpszMsgBuffer, int nMsgLen, int* pInt_Code, int* pInt_Limit) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; if ((NULL == lpszMsgBuffer) || (NULL == pInt_Limit)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; + return false; } Json::Value st_JsonRoot; Json::CharReaderBuilder st_JsonBuild; @@ -417,11 +417,11 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_SpeedLimit(LPCTSTR lpszMsgBuf JSONCPP_STRING st_JsonError; //解析JSON - if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcslen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcsxlen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; - return FALSE; + return false; } delete pSt_JsonReader; pSt_JsonReader = NULL; @@ -453,15 +453,15 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_SpeedLimit(LPCTSTR lpszMsgBuf 意思:是否成功 备注: *********************************************************************/ -BOOL CProtocol_StorageParse::Protocol_StorageParse_P2PToken(LPCTSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE *pxhToken) +bool CProtocol_StorageParse::Protocol_StorageParse_P2PToken(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE *pxhToken) { - Protocol_IsErrorOccur = FALSE; + Protocol_IsErrorOccur = false; if ((NULL == lpszMsgBuffer)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT; - return FALSE; + return false; } Json::Value st_JsonRoot; Json::CharReaderBuilder st_JsonBuild; @@ -469,11 +469,11 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_P2PToken(LPCTSTR lpszMsgBuffe JSONCPP_STRING st_JsonError; //解析JSON - if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcslen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) + if (!pSt_JsonReader->parse(lpszMsgBuffer, lpszMsgBuffer + _tcsxlen(lpszMsgBuffer), &st_JsonRoot, &st_JsonError)) { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE; - return FALSE; + return false; } delete pSt_JsonReader; pSt_JsonReader = NULL; @@ -482,7 +482,7 @@ BOOL CProtocol_StorageParse::Protocol_StorageParse_P2PToken(LPCTSTR lpszMsgBuffe { Protocol_IsErrorOccur = true; Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_TOKEN; - return FALSE; + return false; } *pxhToken = st_JsonRoot["xhToken"].asUInt64(); return true; diff --git a/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.h b/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.h index 765a70f..76bcd46 100644 --- a/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.h +++ b/XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.h @@ -17,10 +17,10 @@ public: CProtocol_StorageParse(); ~CProtocol_StorageParse(); public: - BOOL Protocol_StorageParse_QueryFile(LPCTSTR lpszMsgBuffer, TCHAR* ptszTimeStart, TCHAR* ptszTimeEnd, TCHAR* ptszBuckKey = NULL, TCHAR* ptszFileName = NULL, TCHAR* ptszFileHash = NULL, int* pInt_Mode = NULL, XNETHANDLE* pxhToken = NULL); - BOOL Protocol_StorageParse_ReportFile(LPCTSTR lpszMsgBuffer, int nMsgLen, XSTORAGECORE_DBFILE*** pppSt_DBFile, int* pInt_ListCount); - BOOL Protocol_StorageParse_DirOperator(LPCTSTR lpszMsgBuffer, TCHAR* ptszUserDir, TCHAR* ptszBuckKey, int* pInt_Operator); - BOOL Protocol_StorageParse_ProxyNotify(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR* ptszClientAddr, TCHAR* ptszBuckKey, TCHAR* ptszFileName, TCHAR* ptszFileHash, __int64x* pInt_FileSize); - BOOL Protocol_StorageParse_SpeedLimit(LPCTSTR lpszMsgBuffer, int nMsgLen, int* pInt_Code, int* pInt_Limit); - BOOL Protocol_StorageParse_P2PToken(LPCTSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken); + bool Protocol_StorageParse_QueryFile(LPCXSTR lpszMsgBuffer, XCHAR* ptszTimeStart, XCHAR* ptszTimeEnd, XCHAR* ptszBuckKey = NULL, XCHAR* ptszFileName = NULL, XCHAR* ptszFileHash = NULL, int* pInt_Mode = NULL, XNETHANDLE* pxhToken = NULL); + bool Protocol_StorageParse_ReportFile(LPCXSTR lpszMsgBuffer, int nMsgLen, XSTORAGECORE_DBFILE*** pppSt_DBFile, int* pInt_ListCount); + bool Protocol_StorageParse_DirOperator(LPCXSTR lpszMsgBuffer, XCHAR* ptszUserDir, XCHAR* ptszBuckKey, int* pInt_Operator); + bool Protocol_StorageParse_ProxyNotify(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR* ptszClientAddr, XCHAR* ptszBuckKey, XCHAR* ptszFileName, XCHAR* ptszFileHash, __int64x* pInt_FileSize); + bool Protocol_StorageParse_SpeedLimit(LPCXSTR lpszMsgBuffer, int nMsgLen, int* pInt_Code, int* pInt_Limit); + bool Protocol_StorageParse_P2PToken(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken); }; diff --git a/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h b/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h index c4e7c45..eacfe05 100644 --- a/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h +++ b/XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h @@ -13,7 +13,7 @@ ////////////////////////////////////////////////////////////////////////// // 导出函数 ////////////////////////////////////////////////////////////////////////// -extern "C" DWORD Protocol_GetLastError(int *pInt_ErrorCode = NULL); +extern "C" XLONG Protocol_GetLastError(int *pInt_ErrorCode = NULL); /************************************************************************/ /* 解析协议导出 */ /************************************************************************/ @@ -60,7 +60,7 @@ extern "C" DWORD Protocol_GetLastError(int *pInt_ErrorCode = NULL); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StorageParse_ProxyNotify(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR * ptszClientAddr, TCHAR * ptszBuckKey, TCHAR * ptszFileName, TCHAR * ptszFileHash, __int64x * pInt_FileSize); +extern "C" bool Protocol_StorageParse_ProxyNotify(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR * ptszClientAddr, XCHAR * ptszBuckKey, XCHAR * ptszFileName, XCHAR * ptszFileHash, __int64x * pInt_FileSize); /******************************************************************** 函数名称:Protocol_StorageParse_QueryFile 函数功能:文件查询请求解析函数 @@ -109,7 +109,7 @@ extern "C" BOOL Protocol_StorageParse_ProxyNotify(LPCTSTR lpszMsgBuffer, int nMs 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StorageParse_QueryFile(LPCSTR lpszMsgBuffer, CHAR * ptszTimeStart, CHAR * ptszTimeEnd, CHAR * ptszBuckKey = NULL, CHAR * ptszFileName = NULL, CHAR * ptszFileHash = NULL, int* pInt_Mode = NULL, XNETHANDLE * pxhToken = NULL); +extern "C" bool Protocol_StorageParse_QueryFile(LPCXSTR lpszMsgBuffer, XCHAR * ptszTimeStart, XCHAR * ptszTimeEnd, XCHAR * ptszBuckKey = NULL, XCHAR * ptszFileName = NULL, XCHAR * ptszFileHash = NULL, int* pInt_Mode = NULL, XNETHANDLE * pxhToken = NULL); /******************************************************************** 函数名称:Protocol_StorageParse_ReportFile 函数功能:解析文件报告协议 @@ -138,7 +138,7 @@ extern "C" BOOL Protocol_StorageParse_QueryFile(LPCSTR lpszMsgBuffer, CHAR * pts 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StorageParse_ReportFile(LPCTSTR lpszMsgBuffer, int nMsgLen, XSTORAGECORE_DBFILE * **pppSt_DBFile, int* pInt_ListCount); +extern "C" bool Protocol_StorageParse_ReportFile(LPCXSTR lpszMsgBuffer, int nMsgLen, XSTORAGECORE_DBFILE * **pppSt_DBFile, int* pInt_ListCount); /******************************************************************** 函数名称:Protocol_StorageParse_DirOperator 函数功能:文件夹操作协议 @@ -167,7 +167,7 @@ extern "C" BOOL Protocol_StorageParse_ReportFile(LPCTSTR lpszMsgBuffer, int nMsg 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StorageParse_DirOperator(LPCSTR lpszMsgBuffer, CHAR * ptszUserDir, TCHAR * ptszBuckKey, int* pInt_Operator); +extern "C" bool Protocol_StorageParse_DirOperator(LPCXSTR lpszMsgBuffer, XCHAR * ptszUserDir, XCHAR * ptszBuckKey, int* pInt_Operator); /******************************************************************** 函数名称:Protocol_StorageParse_SpeedLimit 函数功能:速度限制请求解析函数 @@ -196,7 +196,7 @@ extern "C" BOOL Protocol_StorageParse_DirOperator(LPCSTR lpszMsgBuffer, CHAR * p 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StorageParse_SpeedLimit(LPCTSTR lpszMsgBuffer, int nMsgLen, int* pInt_Code, int* pInt_Limit); +extern "C" bool Protocol_StorageParse_SpeedLimit(LPCXSTR lpszMsgBuffer, int nMsgLen, int* pInt_Code, int* pInt_Limit); /******************************************************************** 函数名称:Protocol_StorageParse_P2PToken 函数功能:P2P查找文件TOKEN匹配函数 @@ -220,7 +220,7 @@ extern "C" BOOL Protocol_StorageParse_SpeedLimit(LPCTSTR lpszMsgBuffer, int nMsg 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StorageParse_P2PToken(LPCTSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken); +extern "C" bool Protocol_StorageParse_P2PToken(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE* pxhToken); /************************************************************************/ /* 打包协议导出 */ /************************************************************************/ @@ -267,7 +267,7 @@ extern "C" BOOL Protocol_StorageParse_P2PToken(LPCTSTR lpszMsgBuffer, int nMsgLe 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StoragePacket_BasicAuth(LPCTSTR lpszMethod, LPCTSTR lpszPostUrl, LPCTSTR lpszClientAddr, LPCTSTR lpszUser, LPCTSTR lpszPass, TCHAR * ptszMsgBuffer, int* pInt_MsgLen); +extern "C" bool Protocol_StoragePacket_BasicAuth(LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR * ptszMsgBuffer, int* pInt_MsgLen); /******************************************************************** 函数名称:Protocol_StoragePacket_UPDown 函数功能:上传下载完成代理通知协议 @@ -316,7 +316,7 @@ extern "C" BOOL Protocol_StoragePacket_BasicAuth(LPCTSTR lpszMethod, LPCTSTR lps 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StoragePacket_UPDown(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, LPCTSTR lpszBuckKey, LPCTSTR lpszFileName, LPCTSTR lpszClientAddr, __int64x nFileSize, BOOL bDown, LPCTSTR lpszFileHash = NULL); +extern "C" bool Protocol_StoragePacket_UPDown(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszBuckKey, LPCXSTR lpszFileName, LPCXSTR lpszClientAddr, __int64x nFileSize, bool bDown, LPCXSTR lpszFileHash = NULL); /******************************************************************** 函数名称:Protocol_StorageParse_QueryFile 函数功能:查询回复打包协议 @@ -360,7 +360,7 @@ extern "C" BOOL Protocol_StoragePacket_UPDown(TCHAR * ptszMsgBuffer, int* pInt_M 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StoragePacket_QueryFile(CHAR * ptszMsgBuffer, int* pInt_MsgLen, XSTORAGECORE_DBFILE * **pppSt_DBFile, int nListCount, LPCSTR lpszTimeStart = NULL, LPCSTR lpszTimeEnd = NULL, XNETHANDLE xhToken = 0); +extern "C" bool Protocol_StoragePacket_QueryFile(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, XSTORAGECORE_DBFILE * **pppSt_DBFile, int nListCount, LPCXSTR lpszTimeStart = NULL, LPCXSTR lpszTimeEnd = NULL, XNETHANDLE xhToken = 0); /******************************************************************** 函数名称:Protocol_StoragePacket_Info 函数功能:返回信息获取请求打包函数 @@ -399,7 +399,7 @@ extern "C" BOOL Protocol_StoragePacket_QueryFile(CHAR * ptszMsgBuffer, int* pInt 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StoragePacket_Info(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, SESSION_STORAGEINFO * **pppSt_DLInfo, SESSION_STORAGEINFO * **pppSt_UPInfo, int nDLCount, int nUPCount); +extern "C" bool Protocol_StoragePacket_Info(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, SESSION_STORAGEINFO * **pppSt_DLInfo, SESSION_STORAGEINFO * **pppSt_UPInfo, int nDLCount, int nUPCount); /******************************************************************** 函数名称:Protocol_StoragePacket_DirOperator 函数功能:查询用户目录 @@ -428,7 +428,7 @@ extern "C" BOOL Protocol_StoragePacket_Info(TCHAR * ptszMsgBuffer, int* pInt_Msg 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StoragePacket_DirOperator(CHAR * ptszMsgBuffer, int* pInt_MsgLen, CHAR * **pppszListEnum, int nListCount); +extern "C" bool Protocol_StoragePacket_DirOperator(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, XCHAR * **pppszListEnum, int nListCount); /******************************************************************** 函数名称:Protocol_StoragePacket_REQFile 函数功能:查询文件请求函数 @@ -462,4 +462,4 @@ extern "C" BOOL Protocol_StoragePacket_DirOperator(CHAR * ptszMsgBuffer, int* pI 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Protocol_StoragePacket_REQFile(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, LPCTSTR lpszFileName = NULL, LPCTSTR lpszFileHash = NULL, XNETHANDLE xhToken = 0); \ No newline at end of file +extern "C" bool Protocol_StoragePacket_REQFile(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName = NULL, LPCXSTR lpszFileHash = NULL, XNETHANDLE xhToken = 0); \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Protocol/dllmain.cpp b/XEngine_Source/StorageModule_Protocol/dllmain.cpp index 0745b19..594ff21 100644 --- a/XEngine_Source/StorageModule_Protocol/dllmain.cpp +++ b/XEngine_Source/StorageModule_Protocol/dllmain.cpp @@ -1,9 +1,9 @@ // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved +bool APIENTRY DllMain( HMODULE hModule, + XLONG ul_reason_for_call, + XPVOID lpReserved ) { switch (ul_reason_for_call) diff --git a/XEngine_Source/StorageModule_Protocol/pch.cpp b/XEngine_Source/StorageModule_Protocol/pch.cpp index 946981e..54e6f5b 100644 --- a/XEngine_Source/StorageModule_Protocol/pch.cpp +++ b/XEngine_Source/StorageModule_Protocol/pch.cpp @@ -12,13 +12,13 @@ // Purpose: 导出函数实现 // History: *********************************************************************/ -BOOL Protocol_IsErrorOccur = FALSE; -DWORD Protocol_dwErrorCode = 0; +bool Protocol_IsErrorOccur = false; +XLONG Protocol_dwErrorCode = 0; ////////////////////////////////////////////////////////////////////////// CProtocol_StoragePacket m_StoragePacket; CProtocol_StorageParse m_StorageParse; ////////////////////////////////////////////////////////////////////////// -extern "C" DWORD Protocol_GetLastError(int* pInt_ErrorCode) +extern "C" XLONG Protocol_GetLastError(int* pInt_ErrorCode) { if (NULL != pInt_ErrorCode) { @@ -29,54 +29,54 @@ extern "C" DWORD Protocol_GetLastError(int* pInt_ErrorCode) /************************************************************************/ /* 解析协议导出 */ /************************************************************************/ -extern "C" BOOL Protocol_StorageParse_ProxyNotify(LPCTSTR lpszMsgBuffer, int nMsgLen, TCHAR * ptszClientAddr, TCHAR * ptszBuckKey, TCHAR * ptszFileName, TCHAR * ptszFileHash, __int64x * pInt_FileSize) +extern "C" bool Protocol_StorageParse_ProxyNotify(LPCXSTR lpszMsgBuffer, int nMsgLen, XCHAR * ptszClientAddr, XCHAR * ptszBuckKey, XCHAR * ptszFileName, XCHAR * ptszFileHash, __int64x * pInt_FileSize) { return m_StorageParse.Protocol_StorageParse_ProxyNotify(lpszMsgBuffer, nMsgLen, ptszClientAddr, ptszBuckKey, ptszFileName, ptszFileHash, pInt_FileSize); } -extern "C" BOOL Protocol_StorageParse_QueryFile(LPCTSTR lpszMsgBuffer, TCHAR * ptszTimeStart, TCHAR * ptszTimeEnd, CHAR * ptszBuckKey, TCHAR * ptszFileName, TCHAR * ptszFileHash, int* pInt_Mode, XNETHANDLE * pxhToken) +extern "C" bool Protocol_StorageParse_QueryFile(LPCXSTR lpszMsgBuffer, XCHAR * ptszTimeStart, XCHAR * ptszTimeEnd, XCHAR * ptszBuckKey, XCHAR * ptszFileName, XCHAR * ptszFileHash, int* pInt_Mode, XNETHANDLE * pxhToken) { return m_StorageParse.Protocol_StorageParse_QueryFile(lpszMsgBuffer, ptszTimeStart, ptszTimeEnd, ptszBuckKey, ptszFileName, ptszFileHash, pInt_Mode, pxhToken); } -extern "C" BOOL Protocol_StorageParse_ReportFile(LPCTSTR lpszMsgBuffer, int nMsgLen, XSTORAGECORE_DBFILE * **pppSt_DBFile, int* pInt_ListCount) +extern "C" bool Protocol_StorageParse_ReportFile(LPCXSTR lpszMsgBuffer, int nMsgLen, XSTORAGECORE_DBFILE * **pppSt_DBFile, int* pInt_ListCount) { return m_StorageParse.Protocol_StorageParse_ReportFile(lpszMsgBuffer, nMsgLen, pppSt_DBFile, pInt_ListCount); } -extern "C" BOOL Protocol_StorageParse_DirOperator(LPCTSTR lpszMsgBuffer, TCHAR * ptszUserDir, TCHAR * ptszBuckKey, int* pInt_Operator) +extern "C" bool Protocol_StorageParse_DirOperator(LPCXSTR lpszMsgBuffer, XCHAR * ptszUserDir, XCHAR * ptszBuckKey, int* pInt_Operator) { return m_StorageParse.Protocol_StorageParse_DirOperator(lpszMsgBuffer, ptszUserDir, ptszBuckKey, pInt_Operator); } -extern "C" BOOL Protocol_StorageParse_SpeedLimit(LPCTSTR lpszMsgBuffer, int nMsgLen, int* pInt_Code, int* pInt_Limit) +extern "C" bool Protocol_StorageParse_SpeedLimit(LPCXSTR lpszMsgBuffer, int nMsgLen, int* pInt_Code, int* pInt_Limit) { return m_StorageParse.Protocol_StorageParse_SpeedLimit(lpszMsgBuffer, nMsgLen, pInt_Code, pInt_Limit); } -extern "C" BOOL Protocol_StorageParse_P2PToken(LPCTSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE * pxhToken) +extern "C" bool Protocol_StorageParse_P2PToken(LPCXSTR lpszMsgBuffer, int nMsgLen, XNETHANDLE * pxhToken) { return m_StorageParse.Protocol_StorageParse_P2PToken(lpszMsgBuffer, nMsgLen, pxhToken); } /************************************************************************/ /* 打包协议导出 */ /************************************************************************/ -extern "C" BOOL Protocol_StoragePacket_BasicAuth(LPCTSTR lpszMethod, LPCTSTR lpszPostUrl, LPCTSTR lpszClientAddr, LPCTSTR lpszUser, LPCTSTR lpszPass, TCHAR * ptszMsgBuffer, int* pInt_MsgLen) +extern "C" bool Protocol_StoragePacket_BasicAuth(LPCXSTR lpszMethod, LPCXSTR lpszPostUrl, LPCXSTR lpszClientAddr, LPCXSTR lpszUser, LPCXSTR lpszPass, XCHAR * ptszMsgBuffer, int* pInt_MsgLen) { return m_StoragePacket.Protocol_StoragePacket_BasicAuth(lpszMethod, lpszPostUrl, lpszClientAddr, lpszUser, lpszPass, ptszMsgBuffer, pInt_MsgLen); } -extern "C" BOOL Protocol_StoragePacket_UPDown(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, LPCTSTR lpszBuckKey, LPCTSTR lpszFileName, LPCTSTR lpszClientAddr, __int64x nFileSize, BOOL bDown, LPCTSTR lpszFileHash) +extern "C" bool Protocol_StoragePacket_UPDown(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszBuckKey, LPCXSTR lpszFileName, LPCXSTR lpszClientAddr, __int64x nFileSize, bool bDown, LPCXSTR lpszFileHash) { return m_StoragePacket.Protocol_StoragePacket_UPDown(ptszMsgBuffer, pInt_MsgLen, lpszBuckKey, lpszFileName, lpszClientAddr, nFileSize, bDown, lpszFileHash); } -extern "C" BOOL Protocol_StoragePacket_QueryFile(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, XSTORAGECORE_DBFILE * **pppSt_DBFile, int nListCount, LPCTSTR lpszTimeStart, LPCTSTR lpszTimeEnd, XNETHANDLE xhToken) +extern "C" bool Protocol_StoragePacket_QueryFile(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, XSTORAGECORE_DBFILE * **pppSt_DBFile, int nListCount, LPCXSTR lpszTimeStart, LPCXSTR lpszTimeEnd, XNETHANDLE xhToken) { return m_StoragePacket.Protocol_StoragePacket_QueryFile(ptszMsgBuffer, pInt_MsgLen, pppSt_DBFile, nListCount, lpszTimeStart, lpszTimeEnd, xhToken); } -extern "C" BOOL Protocol_StoragePacket_Info(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, SESSION_STORAGEINFO * **pppSt_DLInfo, SESSION_STORAGEINFO * **pppSt_UPInfo, int nDLCount, int nUPCount) +extern "C" bool Protocol_StoragePacket_Info(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, SESSION_STORAGEINFO * **pppSt_DLInfo, SESSION_STORAGEINFO * **pppSt_UPInfo, int nDLCount, int nUPCount) { return m_StoragePacket.Protocol_StoragePacket_Info(ptszMsgBuffer, pInt_MsgLen, pppSt_DLInfo, pppSt_UPInfo, nDLCount, nUPCount); } -extern "C" BOOL Protocol_StoragePacket_DirOperator(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, TCHAR * **pppszListEnum, int nListCount) +extern "C" bool Protocol_StoragePacket_DirOperator(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, XCHAR * **pppszListEnum, int nListCount) { return m_StoragePacket.Protocol_StoragePacket_DirOperator(ptszMsgBuffer, pInt_MsgLen, pppszListEnum, nListCount); } -extern "C" BOOL Protocol_StoragePacket_REQFile(TCHAR * ptszMsgBuffer, int* pInt_MsgLen, LPCTSTR lpszFileName, LPCTSTR lpszFileHash, XNETHANDLE xhToken) +extern "C" bool Protocol_StoragePacket_REQFile(XCHAR * ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName, LPCXSTR lpszFileHash, XNETHANDLE xhToken) { return m_StoragePacket.Protocol_StoragePacket_REQFile(ptszMsgBuffer, pInt_MsgLen, lpszFileName, lpszFileHash, xhToken); } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Protocol/pch.h b/XEngine_Source/StorageModule_Protocol/pch.h index c3a3ae1..4f07d69 100644 --- a/XEngine_Source/StorageModule_Protocol/pch.h +++ b/XEngine_Source/StorageModule_Protocol/pch.h @@ -51,8 +51,8 @@ using namespace std; // Purpose: 协议模块公用头 // History: *********************************************************************/ -extern BOOL Protocol_IsErrorOccur; -extern DWORD Protocol_dwErrorCode; +extern bool Protocol_IsErrorOccur; +extern XLONG Protocol_dwErrorCode; #ifdef _WINDOWS #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib.lib") diff --git a/XEngine_Source/StorageModule_Session/Makefile b/XEngine_Source/StorageModule_Session/Makefile index a525508..f5de865 100644 --- a/XEngine_Source/StorageModule_Session/Makefile +++ b/XEngine_Source/StorageModule_Session/Makefile @@ -1,30 +1,23 @@ CC = g++ -Wall -std=c++17 -fPIC -SHAREFLAG = -shared -SHAREDLL = so +PLATFORM = linux +PLATVER = +PLATDIR = +FILEEXT = +LIBFLAG = RELEASE = 0 UNICODE = 0 -INCLUDE = -I ./ -LOADBIN = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib +LOADHDR = -I ./ -I ../XEngine_ThirdPart/jsoncpp +LOADSO = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib LIB = -lXEngine_BaseLib -LIBEX = -ldl -lpthread -LOADSO = -Wl,-rpath= -LIBINCLUDE = Session_DLStroage.o Session_UPStroage.o Session_User.o pch.o - -ifeq ($(shell uname),Darwin) - SHAREDLL = dylib - SHAREFLAG = -dynamiclib - LOADSO = -else - SHAREDLL = so - SHAREFLAG = -shared -endif +LIBEX = +OBJECTS = Session_DLStroage.o Session_UPStroage.o Session_User.o pch.o ifeq ($(RELEASE),1) -FLAGS = -c -O2 +FLAGS = -c DEBUG = else -FLAGS = -c -DEBUG = -g +FLAGS = -c -lc_p +DEBUG = -g -pg endif ifeq ($(UNICODE),1) @@ -33,28 +26,50 @@ else UNICODE = endif +ifeq ($(PLATFORM),linux) + ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) + PLATVER = -D __CENTOS__ + PLATDIR = XEngine_Linux/Centos + else + PLATVER = -D __UBUNTU__ + PLATDIR = XEngine_Linux/Ubuntu + endif + FILEEXT = so + LIBFLAG = -shared + LIBEX = -lpthread -lrt -ldl + LOADBIN = -Wl,-rpath=./,--disable-new-dtags +else ifeq ($(PLATFORM),mac) + CC += -Wno-deprecated-declarations + PLATVER = -D __MACOS__ + PLATDIR = XEngine_Mac + FILEEXT = dylib + LIBFLAG = -dynamiclib + LIBEX = -lpthread -ldl + LOADBIN = -Wl,-rpath,@loader_path/./ +endif + -all:$(LIBINCLUDE) - $(CC) $(DEBUG) $(LIBINCLUDE) -o libStorageModule_Session.$(SHAREDLL) $(SHAREFLAG) -fPIC $(LOADBIN) $(LIB) $(LIBEX) $(LOADSO) +all:$(OBJECTS) + $(CC) $(DEBUG) $(OBJECTS) -o libStorageModule_Session.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) Session_DLStroage.o:./Session_Stroage/Session_DLStroage.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./Session_Stroage/Session_DLStroage.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Session_Stroage/Session_DLStroage.cpp Session_UPStroage.o:./Session_Stroage/Session_UPStroage.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./Session_Stroage/Session_UPStroage.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Session_Stroage/Session_UPStroage.cpp Session_User.o:./Session_User/Session_User.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./Session_User/Session_User.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Session_User/Session_User.cpp pch.o:./pch.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) ./pch.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp InstallAll:InstallSo -InstallSo:./libStorageModule_Session.$(SHAREDLL) - cp ./libStorageModule_Session.$(SHAREDLL) ../../XEngine_Release/libStorageModule_Session.$(SHAREDLL) +InstallSo:./libStorageModule_Session.$(FILEEXT) + cp ./libStorageModule_Session.$(FILEEXT) ../../XEngine_Release/libStorageModule_Session.$(FILEEXT) CleanAll:CleanObj CleanMk CleanObj: rm *.o CleanMk: - rm *.$(SHAREDLL) + rm *.$(FILEEXT) diff --git a/XEngine_Source/StorageModule_Session/Session_Define.h b/XEngine_Source/StorageModule_Session/Session_Define.h index 01ce820..a83a1fa 100644 --- a/XEngine_Source/StorageModule_Session/Session_Define.h +++ b/XEngine_Source/StorageModule_Session/Session_Define.h @@ -15,16 +15,16 @@ ////////////////////////////////////////////////////////////////////////// typedef struct { - TCHAR tszFileDir[MAX_PATH]; //文件地址 - TCHAR tszClientAddr[128]; //操作的用户地址 - TCHAR tszFileHash[128]; //文件HASH值 - TCHAR tszBuckKey[128]; //BUCKKey + XCHAR tszFileDir[MAX_PATH]; //文件地址 + XCHAR tszClientAddr[128]; //操作的用户地址 + XCHAR tszFileHash[128]; //文件HASH值 + XCHAR tszBuckKey[128]; //BUCKKey __int64x ullCount; //总大小 __int64x ullRWCount; //需要读取(写入)总大小 __int64x ullRWLen; //已经读取(写入)的大小 __int64x ullPosStart; //开始位置 __int64x ullPosEnd; //结束位置 - BOOL bRewrite; //是否为覆写 + bool bRewrite; //是否为覆写 int nLimit; //限制工具 XHANDLE xhToken; @@ -33,7 +33,7 @@ typedef struct ////////////////////////////////////////////////////////////////////////// // 导出函数定义 ////////////////////////////////////////////////////////////////////////// -extern "C" DWORD Session_GetLastError(int *pInt_SysError = NULL); +extern "C" XLONG Session_GetLastError(int *pInt_SysError = NULL); /************************************************************************/ /* 用户管理导出的函数 */ /************************************************************************/ @@ -50,7 +50,7 @@ extern "C" DWORD Session_GetLastError(int *pInt_SysError = NULL); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_User_Init(LPCTSTR lpszUserFile); +extern "C" bool Session_User_Init(LPCXSTR lpszUserFile); /******************************************************************** 函数名称:Session_User_Destory 函数功能:销毁管理器 @@ -59,7 +59,7 @@ extern "C" BOOL Session_User_Init(LPCTSTR lpszUserFile); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_User_Destory(); +extern "C" bool Session_User_Destory(); /******************************************************************** 函数名称:Session_User_Exist 函数功能:用户名和密码是否存在 @@ -83,7 +83,7 @@ extern "C" BOOL Session_User_Destory(); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_User_Exist(LPCTSTR lpszUser, LPCTSTR lpszPass, int* pInt_Limit = NULL); +extern "C" bool Session_User_Exist(LPCXSTR lpszUser, LPCXSTR lpszPass, int* pInt_Limit = NULL); /************************************************************************/ /* 存储会话导出的函数 */ /************************************************************************/ @@ -95,7 +95,7 @@ extern "C" BOOL Session_User_Exist(LPCTSTR lpszUser, LPCTSTR lpszPass, int* pInt 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_DLStroage_Init(int nMaxConnect); +extern "C" bool Session_DLStroage_Init(int nMaxConnect); /******************************************************************** 函数名称:Session_DLStroage_Destory 函数功能:销毁下载管理器 @@ -104,7 +104,7 @@ extern "C" BOOL Session_DLStroage_Init(int nMaxConnect); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_DLStroage_Destory(); +extern "C" bool Session_DLStroage_Destory(); /******************************************************************** 函数名称:Session_DLStroage_Insert 函数功能:插入一个会话到下载器 @@ -158,7 +158,7 @@ extern "C" BOOL Session_DLStroage_Destory(); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTSTR lpszBuckKey, LPCTSTR lpszFileDir, __int64x * pInt_Count, __int64x * pInt_LeftCount, int nPosStart = 0, int nPostEnd = 0, LPCTSTR lpszFileHash = NULL, int nLimit = 0, XHANDLE xhToken = NULL); +extern "C" bool Session_DLStroage_Insert(LPCXSTR lpszClientAddr, LPCXSTR lpszBuckKey, LPCXSTR lpszFileDir, __int64x * pInt_Count, __int64x * pInt_LeftCount, int nPosStart = 0, int nPostEnd = 0, LPCXSTR lpszFileHash = NULL, int nLimit = 0, XHANDLE xhToken = NULL); /******************************************************************** 函数名称:Session_DLStroage_GetBuffer 函数功能:获得下载器中指定缓冲区 @@ -181,7 +181,7 @@ extern "C" BOOL Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTSTR lpszBuc 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_DLStroage_GetBuffer(LPCTSTR lpszClientAddr, TCHAR * ptszMsgBuffer, int* pInt_MsgLen); +extern "C" bool Session_DLStroage_GetBuffer(LPCXSTR lpszClientAddr, XCHAR * ptszMsgBuffer, int* pInt_MsgLen); /******************************************************************** 函数名称:Session_DLStroage_GetInfo 函数功能:获取下载信息 @@ -200,7 +200,7 @@ extern "C" BOOL Session_DLStroage_GetBuffer(LPCTSTR lpszClientAddr, TCHAR * ptsz 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_DLStroage_GetInfo(LPCTSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo); +extern "C" bool Session_DLStroage_GetInfo(LPCXSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo); /******************************************************************** 函数名称:Session_DLStroage_GetCount 函数功能:获取队列拥有的个数 @@ -214,7 +214,7 @@ extern "C" BOOL Session_DLStroage_GetInfo(LPCTSTR lpszClientAddr, SESSION_STORAG 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_DLStroage_GetCount(int* pInt_ListCount); +extern "C" bool Session_DLStroage_GetCount(int* pInt_ListCount); /******************************************************************** 函数名称:Session_DLStorage_SetSeek 函数功能:移动文件指针 @@ -233,7 +233,7 @@ extern "C" BOOL Session_DLStroage_GetCount(int* pInt_ListCount); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_DLStorage_SetSeek(LPCTSTR lpszClientAddr, int nSeek); +extern "C" bool Session_DLStorage_SetSeek(LPCXSTR lpszClientAddr, int nSeek); /******************************************************************** 函数名称:Session_DLStorage_GetAll 函数功能:获取下载池的任务列表 @@ -252,7 +252,7 @@ extern "C" BOOL Session_DLStorage_SetSeek(LPCTSTR lpszClientAddr, int nSeek); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_DLStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount); +extern "C" bool Session_DLStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount); /******************************************************************** 函数名称:Session_DLStroage_Delete 函数功能:删除一个队列 @@ -266,7 +266,7 @@ extern "C" BOOL Session_DLStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInf 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_DLStroage_Delete(LPCTSTR lpszClientAddr); +extern "C" bool Session_DLStroage_Delete(LPCXSTR lpszClientAddr); /******************************************************************** 函数名称:Session_DLStroage_MaxConnect 函数功能:判断一个地址是否超过连接数限制 @@ -280,7 +280,7 @@ extern "C" BOOL Session_DLStroage_Delete(LPCTSTR lpszClientAddr); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_DLStroage_MaxConnect(LPCTSTR lpszClientAddr); +extern "C" bool Session_DLStroage_MaxConnect(LPCXSTR lpszClientAddr); /******************************************************************** 函数名称:Session_UPStroage_Init 函数功能:初始化上传会话管理器 @@ -299,7 +299,7 @@ extern "C" BOOL Session_DLStroage_MaxConnect(LPCTSTR lpszClientAddr); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_UPStroage_Init(int nMaxConnect, BOOL bUPResume = FALSE); +extern "C" bool Session_UPStroage_Init(int nMaxConnect, bool bUPResume = false); /******************************************************************** 函数名称:Session_UPStroage_Destory 函数功能:销毁下载管理器 @@ -308,7 +308,7 @@ extern "C" BOOL Session_UPStroage_Init(int nMaxConnect, BOOL bUPResume = FALSE); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_UPStroage_Destory(); +extern "C" bool Session_UPStroage_Destory(); /******************************************************************** 函数名称:Session_UPStroage_Insert 函数功能:插入一个会话到下载器 @@ -352,7 +352,7 @@ extern "C" BOOL Session_UPStroage_Destory(); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTSTR lpszBuckKey, LPCTSTR lpszFileDir, __int64x nFileSize, BOOL bRewrite, int nPosStart = 0, int nPostEnd = 0); +extern "C" bool Session_UPStroage_Insert(LPCXSTR lpszClientAddr, LPCXSTR lpszBuckKey, LPCXSTR lpszFileDir, __int64x nFileSize, bool bRewrite, int nPosStart = 0, int nPostEnd = 0); /******************************************************************** 函数名称:Session_UPStroage_GetInfo 函数功能:获取上传客户端信息 @@ -371,7 +371,7 @@ extern "C" BOOL Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTSTR lpszBuc 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_UPStroage_GetInfo(LPCTSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo); +extern "C" bool Session_UPStroage_GetInfo(LPCXSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo); /******************************************************************** 函数名称:Session_UPStroage_Write 函数功能:写入数据到文件 @@ -395,7 +395,7 @@ extern "C" BOOL Session_UPStroage_GetInfo(LPCTSTR lpszClientAddr, SESSION_STORAG 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_UPStroage_Write(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen); +extern "C" bool Session_UPStroage_Write(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen); /******************************************************************** 函数名称:Session_UPStroage_Exist 函数功能:客户端是否存在 @@ -409,7 +409,7 @@ extern "C" BOOL Session_UPStroage_Write(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgB 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_UPStroage_Exist(LPCTSTR lpszClientAddr); +extern "C" bool Session_UPStroage_Exist(LPCXSTR lpszClientAddr); /******************************************************************** 函数名称:Session_UPStorage_GetAll 函数功能:获取所有上传信息 @@ -428,7 +428,7 @@ extern "C" BOOL Session_UPStroage_Exist(LPCTSTR lpszClientAddr); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount); +extern "C" bool Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount); /******************************************************************** 函数名称:Session_UPStroage_Delete 函数功能:删除上传会话 @@ -442,7 +442,7 @@ extern "C" BOOL Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInf 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_UPStroage_Delete(LPCTSTR lpszClientAddr); +extern "C" bool Session_UPStroage_Delete(LPCXSTR lpszClientAddr); /******************************************************************** 函数名称:Session_UPStroage_Close 函数功能:关闭读写文件句柄 @@ -456,7 +456,7 @@ extern "C" BOOL Session_UPStroage_Delete(LPCTSTR lpszClientAddr); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_UPStroage_Close(LPCTSTR lpszClientAddr); +extern "C" bool Session_UPStroage_Close(LPCXSTR lpszClientAddr); /******************************************************************** 函数名称:Session_UPStroage_MaxConnect 函数功能:判断一个地址是否超过连接数限制 @@ -470,4 +470,4 @@ extern "C" BOOL Session_UPStroage_Close(LPCTSTR lpszClientAddr); 意思:是否成功 备注: *********************************************************************/ -extern "C" BOOL Session_UPStroage_MaxConnect(LPCTSTR lpszClientAddr); \ No newline at end of file +extern "C" bool Session_UPStroage_MaxConnect(LPCXSTR lpszClientAddr); \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.cpp b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.cpp index 8637c5e..a5ccea5 100644 --- a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.cpp +++ b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.cpp @@ -38,9 +38,9 @@ CSession_DLStroage::~CSession_DLStroage() 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_DLStroage::Session_DLStroage_Init(int nMaxConnect) +bool CSession_DLStroage::Session_DLStroage_Init(int nMaxConnect) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; m_nMaxConnect = nMaxConnect; return true; @@ -53,9 +53,9 @@ BOOL CSession_DLStroage::Session_DLStroage_Init(int nMaxConnect) 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_DLStroage::Session_DLStroage_Destory() +bool CSession_DLStroage::Session_DLStroage_Destory() { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; st_Locker.lock(); stl_MapStroage.clear(); @@ -116,15 +116,15 @@ BOOL CSession_DLStroage::Session_DLStroage_Destory() 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_DLStroage::Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTSTR lpszBuckKey, LPCTSTR lpszFileDir, __int64x* pInt_Count, __int64x* pInt_LeftCount, int nPosStart /* = 0 */, int nPostEnd /* = 0 */, LPCTSTR lpszFileHash /* = NULL */, int nLimit /* = 0 */, XHANDLE xhToken /* = NULL */) +bool CSession_DLStroage::Session_DLStroage_Insert(LPCXSTR lpszClientAddr, LPCXSTR lpszBuckKey, LPCXSTR lpszFileDir, __int64x* pInt_Count, __int64x* pInt_LeftCount, int nPosStart /* = 0 */, int nPostEnd /* = 0 */, LPCXSTR lpszFileHash /* = NULL */, int nLimit /* = 0 */, XHANDLE xhToken /* = NULL */) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; if ((NULL == lpszClientAddr) || (NULL == lpszFileDir)) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; - return FALSE; + return false; } //禁止一个客户端启动多个下载会话 st_Locker.lock_shared(); @@ -134,30 +134,30 @@ BOOL CSession_DLStroage::Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTST Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_EXIST; st_Locker.unlock_shared(); - return FALSE; + return false; } st_Locker.unlock_shared(); SESSION_STORAGEINFO st_Client; - struct _tstat64 st_FStat; + struct _xtstat st_FStat; memset(&st_Client, '\0', sizeof(SESSION_STORAGEINFO)); - int nRet = _tstat64(lpszFileDir, &st_FStat); + int nRet = _xtstat(lpszFileDir, &st_FStat); if (-1 == nRet) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_OPENFILE; - return FALSE; + return false; } st_Client.ullPosStart = nPosStart; st_Client.ullPosEnd = nPostEnd; st_Client.ullCount = st_FStat.st_size; - _tcscpy(st_Client.tszFileDir, lpszFileDir); - _tcscpy(st_Client.tszClientAddr, lpszClientAddr); - _tcscpy(st_Client.tszBuckKey, lpszBuckKey); + _tcsxcpy(st_Client.tszFileDir, lpszFileDir); + _tcsxcpy(st_Client.tszClientAddr, lpszClientAddr); + _tcsxcpy(st_Client.tszBuckKey, lpszBuckKey); if (NULL != lpszFileHash) { - _tcscpy(st_Client.tszFileHash, lpszFileHash); + _tcsxcpy(st_Client.tszFileHash, lpszFileHash); } //设置限制 if (nLimit > 0) @@ -166,12 +166,12 @@ BOOL CSession_DLStroage::Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTST st_Client.xhToken = xhToken; } //填充下载信息 - st_Client.pSt_File = _tfopen(lpszFileDir, _T("rb")); + st_Client.pSt_File = _xtfopen(lpszFileDir, _X("rb")); if (NULL == st_Client.pSt_File) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_OPENFILE; - return FALSE; + return false; } //是否有范围 if ((nPosStart > 0) || (nPostEnd > 0)) @@ -226,15 +226,15 @@ BOOL CSession_DLStroage::Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTST 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_DLStroage::Session_DLStroage_GetBuffer(LPCTSTR lpszClientAddr, TCHAR* ptszMsgBuffer, int* pInt_MsgLen) +bool CSession_DLStroage::Session_DLStroage_GetBuffer(LPCXSTR lpszClientAddr, XCHAR* ptszMsgBuffer, int* pInt_MsgLen) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; if ((NULL == lpszClientAddr) || (NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen)) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; - return FALSE; + return false; } st_Locker.lock_shared(); @@ -244,7 +244,7 @@ BOOL CSession_DLStroage::Session_DLStroage_GetBuffer(LPCTSTR lpszClientAddr, TCH Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); - return FALSE; + return false; } if (stl_MapIterator->second.ullRWLen >= stl_MapIterator->second.ullRWCount) { @@ -280,15 +280,15 @@ BOOL CSession_DLStroage::Session_DLStroage_GetBuffer(LPCTSTR lpszClientAddr, TCH 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_DLStroage::Session_DLStroage_GetInfo(LPCTSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo) +bool CSession_DLStroage::Session_DLStroage_GetInfo(LPCXSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; if ((NULL == pSt_StorageInfo)) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; - return FALSE; + return false; } st_Locker.lock_shared(); @@ -298,7 +298,7 @@ BOOL CSession_DLStroage::Session_DLStroage_GetInfo(LPCTSTR lpszClientAddr, SESSI Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); - return FALSE; + return false; } *pSt_StorageInfo = stl_MapIterator->second; st_Locker.unlock_shared(); @@ -317,15 +317,15 @@ BOOL CSession_DLStroage::Session_DLStroage_GetInfo(LPCTSTR lpszClientAddr, SESSI 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_DLStroage::Session_DLStroage_GetCount(int* pInt_ListCount) +bool CSession_DLStroage::Session_DLStroage_GetCount(int* pInt_ListCount) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; if (NULL == pInt_ListCount) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; - return FALSE; + return false; } st_Locker.lock_shared(); *pInt_ListCount = stl_MapStroage.size(); @@ -350,9 +350,9 @@ BOOL CSession_DLStroage::Session_DLStroage_GetCount(int* pInt_ListCount) 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_DLStroage::Session_DLStorage_SetSeek(LPCTSTR lpszClientAddr, int nSeek) +bool CSession_DLStroage::Session_DLStorage_SetSeek(LPCXSTR lpszClientAddr, int nSeek) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; st_Locker.lock_shared(); unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); @@ -361,7 +361,7 @@ BOOL CSession_DLStroage::Session_DLStorage_SetSeek(LPCTSTR lpszClientAddr, int n Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); - return FALSE; + return false; } //移动文件指针 fseek(stl_MapIterator->second.pSt_File, nSeek, SEEK_CUR); @@ -387,15 +387,15 @@ BOOL CSession_DLStroage::Session_DLStorage_SetSeek(LPCTSTR lpszClientAddr, int n 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_DLStroage::Session_DLStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount) +bool CSession_DLStroage::Session_DLStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; if ((NULL == pppSt_StorageInfo) || (NULL == pInt_ListCount)) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; - return FALSE; + return false; } st_Locker.lock_shared(); @@ -413,7 +413,7 @@ BOOL CSession_DLStroage::Session_DLStorage_GetAll(SESSION_STORAGEINFO*** pppSt_S { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_EMPTY; - return FALSE; + return false; } return true; } @@ -430,9 +430,9 @@ BOOL CSession_DLStroage::Session_DLStorage_GetAll(SESSION_STORAGEINFO*** pppSt_S 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_DLStroage::Session_DLStroage_Delete(LPCTSTR lpszClientAddr) +bool CSession_DLStroage::Session_DLStroage_Delete(LPCXSTR lpszClientAddr) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; st_Locker.lock_shared(); unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); @@ -457,28 +457,28 @@ BOOL CSession_DLStroage::Session_DLStroage_Delete(LPCTSTR lpszClientAddr) 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_DLStroage::Session_DLStroage_MaxConnect(LPCTSTR lpszClientAddr) +bool CSession_DLStroage::Session_DLStroage_MaxConnect(LPCXSTR lpszClientAddr) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; int nExistNumber = 0; st_Locker.lock_shared(); unordered_map::iterator stl_MapIterator = stl_MapStroage.begin(); for (; stl_MapIterator != stl_MapStroage.end(); stl_MapIterator++) { - TCHAR tszIPSource[128]; - TCHAR tszIPDest[128]; + XCHAR tszIPSource[128]; + XCHAR tszIPDest[128]; memset(tszIPSource, '\0', sizeof(tszIPSource)); memset(tszIPDest, '\0', sizeof(tszIPDest)); - _tcscpy(tszIPSource, stl_MapIterator->first.c_str()); - _tcscpy(tszIPDest, lpszClientAddr); + _tcsxcpy(tszIPSource, stl_MapIterator->first.c_str()); + _tcsxcpy(tszIPDest, lpszClientAddr); BaseLib_OperatorIPAddr_SegAddr(tszIPSource); BaseLib_OperatorIPAddr_SegAddr(tszIPDest); - if (0 == _tcscmp(tszIPSource, tszIPDest)) + if (0 == _tcsxcmp(tszIPSource, tszIPDest)) { nExistNumber++; } @@ -489,7 +489,7 @@ BOOL CSession_DLStroage::Session_DLStroage_MaxConnect(LPCTSTR lpszClientAddr) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_MAXCONNECT; - return FALSE; + return false; } return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.h b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.h index 5d1aac9..281c4e6 100644 --- a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.h +++ b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.h @@ -17,16 +17,16 @@ public: CSession_DLStroage(); ~CSession_DLStroage(); public: - BOOL Session_DLStroage_Init(int nMaxConnect); - BOOL Session_DLStroage_Destory(); - BOOL Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTSTR lpszBuckKey, LPCTSTR lpszFileDir, __int64x* pInt_Count, __int64x* pInt_LeftCount, int nPosStart = 0, int nPostEnd = 0, LPCTSTR lpszFileHash = NULL, int nLimit = 0, XHANDLE xhToken = NULL); - BOOL Session_DLStroage_GetBuffer(LPCTSTR lpszClientAddr, TCHAR* ptszMsgBuffer, int* pInt_MsgLen); - BOOL Session_DLStroage_GetInfo(LPCTSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo); - BOOL Session_DLStroage_GetCount(int* pInt_ListCount); - BOOL Session_DLStorage_SetSeek(LPCTSTR lpszClientAddr, int nSeek); - BOOL Session_DLStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount); - BOOL Session_DLStroage_Delete(LPCTSTR lpszClientAddr); - BOOL Session_DLStroage_MaxConnect(LPCTSTR lpszClientAddr); + bool Session_DLStroage_Init(int nMaxConnect); + bool Session_DLStroage_Destory(); + bool Session_DLStroage_Insert(LPCXSTR lpszClientAddr, LPCXSTR lpszBuckKey, LPCXSTR lpszFileDir, __int64x* pInt_Count, __int64x* pInt_LeftCount, int nPosStart = 0, int nPostEnd = 0, LPCXSTR lpszFileHash = NULL, int nLimit = 0, XHANDLE xhToken = NULL); + bool Session_DLStroage_GetBuffer(LPCXSTR lpszClientAddr, XCHAR* ptszMsgBuffer, int* pInt_MsgLen); + bool Session_DLStroage_GetInfo(LPCXSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo); + bool Session_DLStroage_GetCount(int* pInt_ListCount); + bool Session_DLStorage_SetSeek(LPCXSTR lpszClientAddr, int nSeek); + bool Session_DLStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount); + bool Session_DLStroage_Delete(LPCXSTR lpszClientAddr); + bool Session_DLStroage_MaxConnect(LPCXSTR lpszClientAddr); private: int m_nMaxConnect; shared_mutex st_Locker; diff --git a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.cpp b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.cpp index bf51a17..3ab9ca3 100644 --- a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.cpp +++ b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.cpp @@ -38,9 +38,9 @@ CSession_UPStroage::~CSession_UPStroage() 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_UPStroage::Session_UPStroage_Init(int nMaxConnect, BOOL bUPResume /* = FALSE */) +bool CSession_UPStroage::Session_UPStroage_Init(int nMaxConnect, bool bUPResume /* = false */) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; m_bResume = bUPResume; m_nMaxConnect = nMaxConnect; @@ -54,9 +54,9 @@ BOOL CSession_UPStroage::Session_UPStroage_Init(int nMaxConnect, BOOL bUPResume 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_UPStroage::Session_UPStroage_Destory() +bool CSession_UPStroage::Session_UPStroage_Destory() { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; st_Locker.lock(); stl_MapStroage.clear(); @@ -107,15 +107,15 @@ BOOL CSession_UPStroage::Session_UPStroage_Destory() 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTSTR lpszBuckKey, LPCTSTR lpszFileDir, __int64x nFileSize, BOOL bRewrite, int nPosStart /* = 0 */, int nPostEnd /* = 0 */) +bool CSession_UPStroage::Session_UPStroage_Insert(LPCXSTR lpszClientAddr, LPCXSTR lpszBuckKey, LPCXSTR lpszFileDir, __int64x nFileSize, bool bRewrite, int nPosStart /* = 0 */, int nPostEnd /* = 0 */) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; if ((NULL == lpszClientAddr) || (NULL == lpszFileDir)) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; - return FALSE; + return false; } //禁止一个客户端启动多个下载会话 st_Locker.lock_shared(); @@ -125,7 +125,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTST Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_EXIST; st_Locker.unlock_shared(); - return FALSE; + return false; } st_Locker.unlock_shared(); @@ -135,23 +135,23 @@ BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTST st_Client.st_StorageInfo.ullPosStart = nPosStart; st_Client.st_StorageInfo.ullPosEnd = nPostEnd; st_Client.st_StorageInfo.ullCount = nFileSize; - _tcscpy(st_Client.st_StorageInfo.tszBuckKey, lpszBuckKey); - _tcscpy(st_Client.st_StorageInfo.tszFileDir, lpszFileDir); - _tcscpy(st_Client.st_StorageInfo.tszClientAddr, lpszClientAddr); + _tcsxcpy(st_Client.st_StorageInfo.tszBuckKey, lpszBuckKey); + _tcsxcpy(st_Client.st_StorageInfo.tszFileDir, lpszFileDir); + _tcsxcpy(st_Client.st_StorageInfo.tszClientAddr, lpszClientAddr); //文件是否存在 - if ((m_bResume) && ((0 != nPosStart) || (0 != nPostEnd)) && (0 == _taccess(lpszFileDir, 0))) + if ((m_bResume) && ((0 != nPosStart) || (0 != nPostEnd)) && (0 == _xtaccess(lpszFileDir, 0))) { - struct _tstat64 st_FStat; - memset(&st_FStat, '\0', sizeof(struct _tstat64)); - _tstat64(st_Client.st_StorageInfo.tszFileDir, &st_FStat); + struct _xtstat st_FStat; + memset(&st_FStat, '\0', sizeof(struct _xtstat)); + _xtstat(st_Client.st_StorageInfo.tszFileDir, &st_FStat); st_Client.st_StorageInfo.ullRWLen = st_FStat.st_size; //追加打开 - st_Client.st_StorageInfo.pSt_File = _tfopen(lpszFileDir, _T("rb+")); + st_Client.st_StorageInfo.pSt_File = _xtfopen(lpszFileDir, _X("rb+")); if (NULL == st_Client.st_StorageInfo.pSt_File) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_OPENFILE; - return FALSE; + return false; } //是不是覆写? if (st_Client.st_StorageInfo.ullRWLen > nPosStart) @@ -162,7 +162,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTST Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_REWRITE; fclose(st_Client.st_StorageInfo.pSt_File); - return FALSE; + return false; } st_Client.st_StorageInfo.bRewrite = true; st_Client.st_StorageInfo.ullRWLen -= (nPostEnd - nPosStart); @@ -171,12 +171,12 @@ BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTST } else { - st_Client.st_StorageInfo.pSt_File = _tfopen(lpszFileDir, _T("wb")); + st_Client.st_StorageInfo.pSt_File = _xtfopen(lpszFileDir, _X("wb")); if (NULL == st_Client.st_StorageInfo.pSt_File) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_OPENFILE; - return FALSE; + return false; } } st_Locker.lock(); @@ -202,15 +202,15 @@ BOOL CSession_UPStroage::Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTST 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_UPStroage::Session_UPStroage_GetInfo(LPCTSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo) +bool CSession_UPStroage::Session_UPStroage_GetInfo(LPCXSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; if ((NULL == lpszClientAddr) || (NULL == pSt_StorageInfo)) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; - return FALSE; + return false; } st_Locker.lock_shared(); @@ -220,7 +220,7 @@ BOOL CSession_UPStroage::Session_UPStroage_GetInfo(LPCTSTR lpszClientAddr, SESSI Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); - return FALSE; + return false; } *pSt_StorageInfo = stl_MapIterator->second.st_StorageInfo; st_Locker.unlock_shared(); @@ -249,15 +249,15 @@ BOOL CSession_UPStroage::Session_UPStroage_GetInfo(LPCTSTR lpszClientAddr, SESSI 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_UPStroage::Session_UPStroage_Write(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen) +bool CSession_UPStroage::Session_UPStroage_Write(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; if ((NULL == lpszClientAddr) || (NULL == lpszMsgBuffer)) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; - return FALSE; + return false; } st_Locker.lock_shared(); @@ -267,7 +267,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Write(LPCTSTR lpszClientAddr, LPCTSTR Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); - return FALSE; + return false; } int nCount = nMsgLen; int nWLen = 0; @@ -298,16 +298,16 @@ BOOL CSession_UPStroage::Session_UPStroage_Write(LPCTSTR lpszClientAddr, LPCTSTR 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_UPStroage::Session_UPStroage_Exist(LPCTSTR lpszClientAddr) +bool CSession_UPStroage::Session_UPStroage_Exist(LPCXSTR lpszClientAddr) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; - BOOL bRet = FALSE; + bool bRet = false; st_Locker.lock(); unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); if (stl_MapIterator == stl_MapStroage.end()) { - bRet = FALSE; + bRet = false; } else { @@ -334,15 +334,15 @@ BOOL CSession_UPStroage::Session_UPStroage_Exist(LPCTSTR lpszClientAddr) 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_UPStroage::Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount) +bool CSession_UPStroage::Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; if (NULL == pInt_ListCount) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PARAMENT; - return FALSE; + return false; } if (NULL == pppSt_StorageInfo) @@ -365,7 +365,7 @@ BOOL CSession_UPStroage::Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_S { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_EMPTY; - return FALSE; + return false; } return true; } @@ -382,9 +382,9 @@ BOOL CSession_UPStroage::Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_S 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_UPStroage::Session_UPStroage_Delete(LPCTSTR lpszClientAddr) +bool CSession_UPStroage::Session_UPStroage_Delete(LPCXSTR lpszClientAddr) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; st_Locker.lock(); unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); @@ -397,7 +397,7 @@ BOOL CSession_UPStroage::Session_UPStroage_Delete(LPCTSTR lpszClientAddr) //大小是否足够 if ((stl_MapIterator->second.st_StorageInfo.ullCount != stl_MapIterator->second.st_StorageInfo.ullRWLen) && !m_bResume) { - _tremove(stl_MapIterator->second.st_StorageInfo.tszFileDir); + _xtremove(stl_MapIterator->second.st_StorageInfo.tszFileDir); } stl_MapStroage.erase(stl_MapIterator); } @@ -417,9 +417,9 @@ BOOL CSession_UPStroage::Session_UPStroage_Delete(LPCTSTR lpszClientAddr) 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_UPStroage::Session_UPStroage_Close(LPCTSTR lpszClientAddr) +bool CSession_UPStroage::Session_UPStroage_Close(LPCXSTR lpszClientAddr) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; st_Locker.lock_shared(); unordered_map::iterator stl_MapIterator = stl_MapStroage.find(lpszClientAddr); @@ -446,28 +446,28 @@ BOOL CSession_UPStroage::Session_UPStroage_Close(LPCTSTR lpszClientAddr) 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_UPStroage::Session_UPStroage_MaxConnect(LPCTSTR lpszClientAddr) +bool CSession_UPStroage::Session_UPStroage_MaxConnect(LPCXSTR lpszClientAddr) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; int nExistNumber = 0; st_Locker.lock_shared(); unordered_map::iterator stl_MapIterator = stl_MapStroage.begin(); for (; stl_MapIterator != stl_MapStroage.end(); stl_MapIterator++) { - TCHAR tszIPSource[128]; - TCHAR tszIPDest[128]; + XCHAR tszIPSource[128]; + XCHAR tszIPDest[128]; memset(tszIPSource, '\0', sizeof(tszIPSource)); memset(tszIPDest, '\0', sizeof(tszIPDest)); - _tcscpy(tszIPSource, stl_MapIterator->first.c_str()); - _tcscpy(tszIPDest, lpszClientAddr); + _tcsxcpy(tszIPSource, stl_MapIterator->first.c_str()); + _tcsxcpy(tszIPDest, lpszClientAddr); BaseLib_OperatorIPAddr_SegAddr(tszIPSource); BaseLib_OperatorIPAddr_SegAddr(tszIPDest); - if (0 == _tcscmp(tszIPSource, tszIPDest)) + if (0 == _tcsxcmp(tszIPSource, tszIPDest)) { nExistNumber++; } @@ -478,7 +478,7 @@ BOOL CSession_UPStroage::Session_UPStroage_MaxConnect(LPCTSTR lpszClientAddr) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_MAXCONNECT; - return FALSE; + return false; } return true; } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.h b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.h index 26e7e0a..ca1c781 100644 --- a/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.h +++ b/XEngine_Source/StorageModule_Session/Session_Stroage/Session_UPStroage.h @@ -22,18 +22,18 @@ public: CSession_UPStroage(); ~CSession_UPStroage(); public: - BOOL Session_UPStroage_Init(int nMaxConnect, BOOL bUPResume = FALSE); - BOOL Session_UPStroage_Destory(); - BOOL Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTSTR lpszBuckKey, LPCTSTR lpszFileDir, __int64x nFileSize, BOOL bRewrite, int nPosStart = 0, int nPostEnd = 0); - BOOL Session_UPStroage_GetInfo(LPCTSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo); - BOOL Session_UPStroage_Write(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen); - BOOL Session_UPStroage_Exist(LPCTSTR lpszClientAddr); - BOOL Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount); - BOOL Session_UPStroage_Delete(LPCTSTR lpszClientAddr); - BOOL Session_UPStroage_Close(LPCTSTR lpszClientAddr); - BOOL Session_UPStroage_MaxConnect(LPCTSTR lpszClientAddr); + bool Session_UPStroage_Init(int nMaxConnect, bool bUPResume = false); + bool Session_UPStroage_Destory(); + bool Session_UPStroage_Insert(LPCXSTR lpszClientAddr, LPCXSTR lpszBuckKey, LPCXSTR lpszFileDir, __int64x nFileSize, bool bRewrite, int nPosStart = 0, int nPostEnd = 0); + bool Session_UPStroage_GetInfo(LPCXSTR lpszClientAddr, SESSION_STORAGEINFO* pSt_StorageInfo); + bool Session_UPStroage_Write(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen); + bool Session_UPStroage_Exist(LPCXSTR lpszClientAddr); + bool Session_UPStorage_GetAll(SESSION_STORAGEINFO*** pppSt_StorageInfo, int* pInt_ListCount); + bool Session_UPStroage_Delete(LPCXSTR lpszClientAddr); + bool Session_UPStroage_Close(LPCXSTR lpszClientAddr); + bool Session_UPStroage_MaxConnect(LPCXSTR lpszClientAddr); private: - BOOL m_bResume; + bool m_bResume; int m_nMaxConnect; private: shared_mutex st_Locker; diff --git a/XEngine_Source/StorageModule_Session/Session_User/Session_User.cpp b/XEngine_Source/StorageModule_Session/Session_User/Session_User.cpp index 6ab911f..acfa388 100644 --- a/XEngine_Source/StorageModule_Session/Session_User/Session_User.cpp +++ b/XEngine_Source/StorageModule_Session/Session_User/Session_User.cpp @@ -33,19 +33,19 @@ CSession_User::~CSession_User() 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_User::Session_User_Init(LPCTSTR lpszUserFile) +bool CSession_User::Session_User_Init(LPCXSTR lpszUserFile) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; - FILE* pSt_File = _tfopen(lpszUserFile, _T("rb")); + FILE* pSt_File = _xtfopen(lpszUserFile, _X("rb")); if (NULL == pSt_File) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_OPENFILE; - return FALSE; + return false; } int nCount = 0; - TCHAR tszMsgBuffer[4096]; + XCHAR tszMsgBuffer[4096]; memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); while (true) @@ -59,8 +59,8 @@ BOOL CSession_User::Session_User_Init(LPCTSTR lpszUserFile) } fclose(pSt_File); - LPCTSTR lpszLineStr = _T("\r\n"); - TCHAR* ptszTokStr = _tcstok(tszMsgBuffer, lpszLineStr); + LPCXSTR lpszLineStr = _X("\r\n"); + XCHAR* ptszTokStr = _tcsxtok(tszMsgBuffer, lpszLineStr); while (1) { if (NULL == ptszTokStr) @@ -70,10 +70,10 @@ BOOL CSession_User::Session_User_Init(LPCTSTR lpszUserFile) SESSION_USERINFO st_UserInfo; memset(&st_UserInfo, '\0', sizeof(SESSION_USERINFO)); - _stscanf(ptszTokStr, _T("%s %s %s"), st_UserInfo.tszUserName, st_UserInfo.tszUserPass, st_UserInfo.tszUserLimit); + _stxscanf(ptszTokStr, _X("%s %s %s"), st_UserInfo.tszUserName, st_UserInfo.tszUserPass, st_UserInfo.tszUserLimit); stl_MapUser.insert(make_pair(st_UserInfo.tszUserName, st_UserInfo)); - ptszTokStr = _tcstok(NULL, lpszLineStr); + ptszTokStr = _tcsxtok(NULL, lpszLineStr); } return true; } @@ -85,9 +85,9 @@ BOOL CSession_User::Session_User_Init(LPCTSTR lpszUserFile) 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_User::Session_User_Destory() +bool CSession_User::Session_User_Destory() { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; st_Locker.lock(); stl_MapUser.clear(); @@ -118,9 +118,9 @@ BOOL CSession_User::Session_User_Destory() 意思:是否成功 备注: *********************************************************************/ -BOOL CSession_User::Session_User_Exist(LPCTSTR lpszUser, LPCTSTR lpszPass, int* pInt_Limit /* = NULL */) +bool CSession_User::Session_User_Exist(LPCXSTR lpszUser, LPCXSTR lpszPass, int* pInt_Limit /* = NULL */) { - Session_IsErrorOccur = FALSE; + Session_IsErrorOccur = false; st_Locker.lock_shared(); unordered_map::const_iterator stl_MapIterator = stl_MapUser.find(lpszUser); @@ -129,26 +129,26 @@ BOOL CSession_User::Session_User_Exist(LPCTSTR lpszUser, LPCTSTR lpszPass, int* Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_NOTFOUND; st_Locker.unlock_shared(); - return FALSE; + return false; } - if (_tcslen(lpszPass) != _tcslen(stl_MapIterator->second.tszUserPass)) + if (_tcsxlen(lpszPass) != _tcsxlen(stl_MapIterator->second.tszUserPass)) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PASSWORD; st_Locker.unlock_shared(); - return FALSE; + return false; } - if (0 != _tcsncmp(lpszPass, stl_MapIterator->second.tszUserPass, _tcslen(lpszPass))) + if (0 != _tcsxncmp(lpszPass, stl_MapIterator->second.tszUserPass, _tcsxlen(lpszPass))) { Session_IsErrorOccur = true; Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_PASSWORD; st_Locker.unlock_shared(); - return FALSE; + return false; } if (NULL != pInt_Limit) { - *pInt_Limit = _ttoi(stl_MapIterator->second.tszUserLimit); + *pInt_Limit = _ttxoi(stl_MapIterator->second.tszUserLimit); } st_Locker.unlock_shared(); return true; diff --git a/XEngine_Source/StorageModule_Session/Session_User/Session_User.h b/XEngine_Source/StorageModule_Session/Session_User/Session_User.h index 36ebad9..56e3b6f 100644 --- a/XEngine_Source/StorageModule_Session/Session_User/Session_User.h +++ b/XEngine_Source/StorageModule_Session/Session_User/Session_User.h @@ -13,9 +13,9 @@ typedef struct { - TCHAR tszUserName[128]; - TCHAR tszUserPass[128]; - TCHAR tszUserLimit[128]; + XCHAR tszUserName[128]; + XCHAR tszUserPass[128]; + XCHAR tszUserLimit[128]; }SESSION_USERINFO; class CSession_User @@ -24,9 +24,9 @@ public: CSession_User(); ~CSession_User(); public: - BOOL Session_User_Init(LPCTSTR lpszUserFile); - BOOL Session_User_Destory(); - BOOL Session_User_Exist(LPCTSTR lpszUser, LPCTSTR lpszPass, int* pInt_Limit = NULL); + bool Session_User_Init(LPCXSTR lpszUserFile); + bool Session_User_Destory(); + bool Session_User_Exist(LPCXSTR lpszUser, LPCXSTR lpszPass, int* pInt_Limit = NULL); private: shared_mutex st_Locker; private: diff --git a/XEngine_Source/StorageModule_Session/dllmain.cpp b/XEngine_Source/StorageModule_Session/dllmain.cpp index 0745b19..594ff21 100644 --- a/XEngine_Source/StorageModule_Session/dllmain.cpp +++ b/XEngine_Source/StorageModule_Session/dllmain.cpp @@ -1,9 +1,9 @@ // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved +bool APIENTRY DllMain( HMODULE hModule, + XLONG ul_reason_for_call, + XPVOID lpReserved ) { switch (ul_reason_for_call) diff --git a/XEngine_Source/StorageModule_Session/pch.cpp b/XEngine_Source/StorageModule_Session/pch.cpp index 8b6680d..9d98696 100644 --- a/XEngine_Source/StorageModule_Session/pch.cpp +++ b/XEngine_Source/StorageModule_Session/pch.cpp @@ -13,8 +13,8 @@ // Purpose: 会话导出实现 // History: *********************************************************************/ -BOOL Session_IsErrorOccur = FALSE; -DWORD Session_dwErrorCode = 0; +bool Session_IsErrorOccur = false; +XLONG Session_dwErrorCode = 0; ////////////////////////////////////////////////////////////////////////// CSession_DLStroage m_DLStorage; CSession_UPStroage m_UPStorage; @@ -22,7 +22,7 @@ CSession_User m_User; ////////////////////////////////////////////////////////////////////////// // 导出函数定义机器 ////////////////////////////////////////////////////////////////////////// -extern "C" DWORD Session_GetLastError(int* pInt_SysError) +extern "C" XLONG Session_GetLastError(int* pInt_SysError) { if (NULL != pInt_SysError) { @@ -33,98 +33,98 @@ extern "C" DWORD Session_GetLastError(int* pInt_SysError) /************************************************************************/ /* 用户管理导出的函数 */ /************************************************************************/ -extern "C" BOOL Session_User_Init(LPCTSTR lpszUserFile) +extern "C" bool Session_User_Init(LPCXSTR lpszUserFile) { return m_User.Session_User_Init(lpszUserFile); } -extern "C" BOOL Session_User_Destory() +extern "C" bool Session_User_Destory() { return m_User.Session_User_Destory(); } -extern "C" BOOL Session_User_Exist(LPCTSTR lpszUser, LPCTSTR lpszPass, int* pInt_Limit) +extern "C" bool Session_User_Exist(LPCXSTR lpszUser, LPCXSTR lpszPass, int* pInt_Limit) { return m_User.Session_User_Exist(lpszUser, lpszPass, pInt_Limit); } /************************************************************************/ /* 存储会话导出的函数 */ /************************************************************************/ -extern "C" BOOL Session_DLStroage_Init(int nMaxConnect) +extern "C" bool Session_DLStroage_Init(int nMaxConnect) { return m_DLStorage.Session_DLStroage_Init(nMaxConnect); } -extern "C" BOOL Session_DLStroage_Destory() +extern "C" bool Session_DLStroage_Destory() { return m_DLStorage.Session_DLStroage_Destory(); } -extern "C" BOOL Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTSTR lpszBuckKey, LPCTSTR lpszFileDir, __int64x * pInt_Count, __int64x * pInt_LeftCount, int nPosStart, int nPostEnd, LPCTSTR lpszFileHash, int nLimit, XHANDLE xhToken) +extern "C" bool Session_DLStroage_Insert(LPCXSTR lpszClientAddr, LPCXSTR lpszBuckKey, LPCXSTR lpszFileDir, __int64x * pInt_Count, __int64x * pInt_LeftCount, int nPosStart, int nPostEnd, LPCXSTR lpszFileHash, int nLimit, XHANDLE xhToken) { return m_DLStorage.Session_DLStroage_Insert(lpszClientAddr, lpszBuckKey, lpszFileDir, pInt_Count, pInt_LeftCount, nPosStart, nPostEnd, lpszFileHash, nLimit, xhToken); } -extern "C" BOOL Session_DLStroage_GetBuffer(LPCTSTR lpszClientAddr, TCHAR * ptszMsgBuffer, int* pInt_MsgLen) +extern "C" bool Session_DLStroage_GetBuffer(LPCXSTR lpszClientAddr, XCHAR * ptszMsgBuffer, int* pInt_MsgLen) { return m_DLStorage.Session_DLStroage_GetBuffer(lpszClientAddr, ptszMsgBuffer, pInt_MsgLen); } -extern "C" BOOL Session_DLStroage_GetInfo(LPCTSTR lpszClientAddr, SESSION_STORAGEINFO * pSt_StorageInfo) +extern "C" bool Session_DLStroage_GetInfo(LPCXSTR lpszClientAddr, SESSION_STORAGEINFO * pSt_StorageInfo) { return m_DLStorage.Session_DLStroage_GetInfo(lpszClientAddr, pSt_StorageInfo); } -extern "C" BOOL Session_DLStroage_GetCount(int* pInt_ListCount) +extern "C" bool Session_DLStroage_GetCount(int* pInt_ListCount) { return m_DLStorage.Session_DLStroage_GetCount(pInt_ListCount); } -extern "C" BOOL Session_DLStorage_SetSeek(LPCTSTR lpszClientAddr, int nSeek) +extern "C" bool Session_DLStorage_SetSeek(LPCXSTR lpszClientAddr, int nSeek) { return m_DLStorage.Session_DLStorage_SetSeek(lpszClientAddr, nSeek); } -extern "C" BOOL Session_DLStorage_GetAll(SESSION_STORAGEINFO * **pppSt_StorageInfo, int* pInt_ListCount) +extern "C" bool Session_DLStorage_GetAll(SESSION_STORAGEINFO * **pppSt_StorageInfo, int* pInt_ListCount) { return m_DLStorage.Session_DLStorage_GetAll(pppSt_StorageInfo, pInt_ListCount); } -extern "C" BOOL Session_DLStroage_Delete(LPCTSTR lpszClientAddr) +extern "C" bool Session_DLStroage_Delete(LPCXSTR lpszClientAddr) { return m_DLStorage.Session_DLStroage_Delete(lpszClientAddr); } -extern "C" BOOL Session_DLStroage_MaxConnect(LPCTSTR lpszClientAddr) +extern "C" bool Session_DLStroage_MaxConnect(LPCXSTR lpszClientAddr) { return m_DLStorage.Session_DLStroage_MaxConnect(lpszClientAddr); } -extern "C" BOOL Session_UPStroage_Init(int nMaxConnect, BOOL bUPResume) +extern "C" bool Session_UPStroage_Init(int nMaxConnect, bool bUPResume) { return m_UPStorage.Session_UPStroage_Init(nMaxConnect, bUPResume); } -extern "C" BOOL Session_UPStroage_Destory() +extern "C" bool Session_UPStroage_Destory() { return m_UPStorage.Session_UPStroage_Destory(); } -extern "C" BOOL Session_UPStroage_Insert(LPCTSTR lpszClientAddr, LPCTSTR lpszBuckKey, LPCTSTR lpszFileDir, __int64x nFileSize, BOOL bRewrite, int nPosStart, int nPostEnd) +extern "C" bool Session_UPStroage_Insert(LPCXSTR lpszClientAddr, LPCXSTR lpszBuckKey, LPCXSTR lpszFileDir, __int64x nFileSize, bool bRewrite, int nPosStart, int nPostEnd) { return m_UPStorage.Session_UPStroage_Insert(lpszClientAddr, lpszBuckKey, lpszFileDir, nFileSize, bRewrite, nPosStart, nPostEnd); } -extern "C" BOOL Session_UPStroage_GetInfo(LPCTSTR lpszClientAddr, SESSION_STORAGEINFO * pSt_StorageInfo) +extern "C" bool Session_UPStroage_GetInfo(LPCXSTR lpszClientAddr, SESSION_STORAGEINFO * pSt_StorageInfo) { return m_UPStorage.Session_UPStroage_GetInfo(lpszClientAddr, pSt_StorageInfo); } -extern "C" BOOL Session_UPStroage_Write(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen) +extern "C" bool Session_UPStroage_Write(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen) { return m_UPStorage.Session_UPStroage_Write(lpszClientAddr, lpszMsgBuffer, nMsgLen); } -extern "C" BOOL Session_UPStroage_Exist(LPCTSTR lpszClientAddr) +extern "C" bool Session_UPStroage_Exist(LPCXSTR lpszClientAddr) { return m_UPStorage.Session_UPStroage_Exist(lpszClientAddr); } -extern "C" BOOL Session_UPStorage_GetAll(SESSION_STORAGEINFO * **pppSt_StorageInfo, int* pInt_ListCount) +extern "C" bool Session_UPStorage_GetAll(SESSION_STORAGEINFO * **pppSt_StorageInfo, int* pInt_ListCount) { return m_UPStorage.Session_UPStorage_GetAll(pppSt_StorageInfo, pInt_ListCount); } -extern "C" BOOL Session_UPStroage_Delete(LPCTSTR lpszClientAddr) +extern "C" bool Session_UPStroage_Delete(LPCXSTR lpszClientAddr) { return m_UPStorage.Session_UPStroage_Delete(lpszClientAddr); } -extern "C" BOOL Session_UPStroage_Close(LPCTSTR lpszClientAddr) +extern "C" bool Session_UPStroage_Close(LPCXSTR lpszClientAddr) { return m_UPStorage.Session_UPStroage_Close(lpszClientAddr); } -extern "C" BOOL Session_UPStroage_MaxConnect(LPCTSTR lpszClientAddr) +extern "C" bool Session_UPStroage_MaxConnect(LPCXSTR lpszClientAddr) { return m_UPStorage.Session_UPStroage_MaxConnect(lpszClientAddr); } \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Session/pch.h b/XEngine_Source/StorageModule_Session/pch.h index 25d2634..11a2aec 100644 --- a/XEngine_Source/StorageModule_Session/pch.h +++ b/XEngine_Source/StorageModule_Session/pch.h @@ -46,8 +46,8 @@ using namespace std; // Purpose: 会话公用头文件 // History: *********************************************************************/ -extern BOOL Session_IsErrorOccur; -extern DWORD Session_dwErrorCode; +extern bool Session_IsErrorOccur; +extern XLONG Session_dwErrorCode; #ifdef _WINDOWS #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib.lib") diff --git a/XEngine_Source/XEngine_StorageApp/Makefile b/XEngine_Source/XEngine_StorageApp/Makefile index a945cf3..17478fd 100644 --- a/XEngine_Source/XEngine_StorageApp/Makefile +++ b/XEngine_Source/XEngine_StorageApp/Makefile @@ -1,26 +1,24 @@ -CC = g++ -Wall -std=c++17 +CC = g++ -Wall -std=c++17 -fPIC -Wformat-overflow=0 +PLATFORM = linux +PLATVER = +PLATDIR = RELEASE = 0 -UNICODE = 0 -LOADBIN = -L ../StorageModule_Database -L ../StorageModule_Config -L ../StorageModule_Session -L ../StorageModule_APIHelp -L ../StorageModule_Protocol -L ../XEngine_ThirdPart/jsoncpp -LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXEngine_OPenSsl -lXEngine_ProcFile -lXEngine_SystemApi -lHelpComponents_XLog -lHelpComponents_Packets -lRfcComponents_HttpServer -lNetHelp_APIClient \ +UNICODE = 0 +LOADHDR = -I ./ -I ../XEngine_ThirdPart/jsoncpp +LOADSO = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_Core -L /usr/local/lib/XEngine_Release/XEngine_SystemSdk -L /usr/local/lib/XEngine_Release/XEngine_HelpComponents -L /usr/local/lib/XEngine_Release/XEngine_RfcComponents -L /usr/local/lib/XEngine_Release/XEngine_NetHelp \ + -L ../StorageModule_Database -L ../StorageModule_Config -L ../StorageModule_Session -L ../StorageModule_APIHelp -L ../StorageModule_Protocol -L ../XEngine_ThirdPart/jsoncpp +LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXEngine_OPenSsl -lXEngine_ProcFile -lXEngine_SystemApi -lHelpComponents_XLog -lHelpComponents_Packets -lRfcComponents_HttpProtocol -lNetHelp_APIClient \ -lStorageModule_Database -lStorageModule_Config -lStorageModule_Session -lStorageModule_APIHelp -lStorageModule_Protocol \ -ljsoncpp -LIBEX = -ldl -lpthread -LOADSO = -Wl,-rpath=./,--disable-new-dtags -LIBINCLUDE = StorageApp_Config.o StorageApp_Download.o StorageApp_Network.o StorageApp_Center.o StorageApp_UPLoader.o Storage_TaskPass.o Storage_TaskManage.o Storage_TaskP2p.o XEngine_StorageApp.o - -ifeq ($(shell uname),Darwin) - LOADSO = -else - LOADBIN += -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_Core -L /usr/local/lib/XEngine_Release/XEngine_SystemSdk -L /usr/local/lib/XEngine_Release/XEngine_HelpComponents -L /usr/local/lib/XEngine_Release/XEngine_RfcComponents -L /usr/local/lib/XEngine_Release/XEngine_NetHelp -endif +LIBEX = +OBJECTS = StorageApp_Config.o StorageApp_Download.o StorageApp_Network.o StorageApp_Center.o StorageApp_UPLoader.o Storage_TaskPass.o Storage_TaskManage.o Storage_TaskP2p.o XEngine_StorageApp.o ifeq ($(RELEASE),1) -FLAGS = -c -O2 +FLAGS = -c DEBUG = else -FLAGS = -c -DEBUG = -g +FLAGS = -c -lc_p +DEBUG = -g -pg endif ifeq ($(UNICODE),1) @@ -29,29 +27,47 @@ else UNICODE = endif -all:$(LIBINCLUDE) - $(CC) $(DEBUG) $(LIBINCLUDE) -o XEngine_XStorageApp $(LOADBIN) $(LIB) $(LIBEX) $(LOADSO) +ifeq ($(PLATFORM),linux) + ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) + PLATVER = -D __CENTOS__ + PLATDIR = XEngine_Linux/Centos + else + PLATVER = -D __UBUNTU__ + PLATDIR = XEngine_Linux/Ubuntu + endif + LIBEX = -lpthread -lrt -ldl + LOADBIN = -Wl,-rpath=./,--disable-new-dtags +else ifeq ($(PLATFORM),mac) + CC += -Wno-deprecated-declarations + PLATVER = -D __MACOS__ + PLATDIR = XEngine_Mac + LIBEX = -lpthread -ldl + LOADBIN = -Wl,-rpath,@loader_path/./ +endif + +all:$(OBJECTS) + $(CC) $(DEBUG) $(OBJECTS) -o XEngine_XStorageApp $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) StorageApp_Config.o:./StorageApp_Config.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./StorageApp_Config.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./StorageApp_Config.cpp StorageApp_Download.o:./StorageApp_Download.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./StorageApp_Download.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./StorageApp_Download.cpp StorageApp_Network.o:./StorageApp_Network.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./StorageApp_Network.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./StorageApp_Network.cpp StorageApp_Center.o:./StorageApp_Center.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./StorageApp_Center.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./StorageApp_Center.cpp StorageApp_UPLoader.o:./StorageApp_UPLoader.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./StorageApp_UPLoader.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./StorageApp_UPLoader.cpp Storage_TaskPass.o:./Storage_APPTask/Storage_TaskPass.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./Storage_APPTask/Storage_TaskPass.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Storage_APPTask/Storage_TaskPass.cpp Storage_TaskManage.o:./Storage_APPTask/Storage_TaskManage.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./Storage_APPTask/Storage_TaskManage.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Storage_APPTask/Storage_TaskManage.cpp Storage_TaskP2p.o:./Storage_APPTask/Storage_TaskP2p.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./Storage_APPTask/Storage_TaskP2p.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./Storage_APPTask/Storage_TaskP2p.cpp XEngine_StorageApp.o:./XEngine_StorageApp.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./XEngine_StorageApp.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./XEngine_StorageApp.cpp InstallAll:InstallApp diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp index 0488d4b..a5ac9c7 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp @@ -1,6 +1,6 @@ #include "StorageApp_Hdr.h" -XHTHREAD CALLBACK XEngine_Center_HTTPThread(LPVOID lParam) +XHTHREAD CALLBACK XEngine_Center_HTTPThread(XPVOID lParam) { int nThreadPos = *(int*)lParam; nThreadPos++; @@ -20,8 +20,8 @@ XHTHREAD CALLBACK XEngine_Center_HTTPThread(LPVOID lParam) { int nMsgLen = 0; int nHdrCount = 0; - CHAR* ptszMsgBuffer = NULL; - CHAR** ppszListHdr = NULL; + XCHAR* ptszMsgBuffer = NULL; + XCHAR** ppszListHdr = NULL; RFCCOMPONENTS_HTTP_REQPARAM st_HTTPParam; memset(&st_HTTPParam, '\0', sizeof(RFCCOMPONENTS_HTTP_REQPARAM)); @@ -40,13 +40,13 @@ XHTHREAD CALLBACK XEngine_Center_HTTPThread(LPVOID lParam) return 0; } //POST /api/query/file -BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount) +bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount) { int nSDLen = 2048; - TCHAR tszSDBuffer[2048]; - TCHAR tszAPIVersion[64]; - TCHAR tszAPIMethod[64]; - TCHAR tszAPIName[64]; + XCHAR tszSDBuffer[2048]; + XCHAR tszAPIVersion[64]; + XCHAR tszAPIMethod[64]; + XCHAR tszAPIName[64]; RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); @@ -55,13 +55,13 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int memset(tszAPIName, '\0', sizeof(tszAPIName)); memset(&st_HDRParam, '\0', sizeof(RFCCOMPONENTS_HTTP_HDRPARAM)); - LPCTSTR lpszMethodPost = _T("POST"); - LPCTSTR lpszMethodOption = _T("OPTIONS"); + LPCXSTR lpszMethodPost = _X("POST"); + LPCXSTR lpszMethodOption = _X("OPTIONS"); if (st_ServiceCfg.st_XProxy.st_XProxyAuth.bAuth) { - TCHAR tszUserName[64]; - TCHAR tszUserPass[64]; + XCHAR tszUserName[64]; + XCHAR tszUserPass[64]; memset(tszUserName, '\0', sizeof(tszUserName)); memset(tszUserPass, '\0', sizeof(tszUserPass)); @@ -73,17 +73,17 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); + return false; } - if (_tcslen(st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy) > 0) + if (_tcsxlen(st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy) > 0) { int nBLen = 0; int nResponseCode = 0; - TCHAR* ptszBody = NULL; + XCHAR* ptszBody = NULL; Protocol_StoragePacket_BasicAuth(pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); - APIClient_Http_Request(_T("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); + APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); if (200 != nResponseCode) { st_HDRParam.bIsClose = true; @@ -92,10 +92,10 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } BaseLib_OperatorMemory_FreeCStyle((VOID**)&ptszBody); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s"), lpszClientAddr, st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszUserName, tszUserPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s"), lpszClientAddr, st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszUserName, tszUserPass); } else { @@ -107,21 +107,21 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,验证用户失败,无法继续"), lpszClientAddr); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,验证用户失败,无法继续"), lpszClientAddr); + return false; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,本地验证用户验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,本地验证用户验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); } st_HDRParam.bAuth = true; } - if (0 == _tcsnicmp(lpszMethodPost, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodPost))) + if (0 == _tcsxnicmp(lpszMethodPost, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodPost))) { //使用重定向? if (st_LoadbalanceCfg.st_LBDistributed.nCenterMode > 0) { - TCHAR tszHdrBuffer[1024]; - TCHAR tszStorageAddr[128]; + XCHAR tszHdrBuffer[1024]; + XCHAR tszStorageAddr[128]; memset(tszHdrBuffer, '\0', sizeof(tszHdrBuffer)); memset(tszStorageAddr, '\0', sizeof(tszStorageAddr)); @@ -130,11 +130,11 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int st_HDRParam.nHttpCode = 302; APIHelp_Distributed_RandomAddr(st_LoadbalanceCfg.st_LoadBalance.pStl_ListCenter, tszStorageAddr, st_LoadbalanceCfg.st_LBDistributed.nCenterMode); - _stprintf(tszHdrBuffer, _T("Location: %s%s\r\n"), tszStorageAddr, pSt_HTTPParam->tszHttpUri); + _xstprintf(tszHdrBuffer, _X("Location: %s%s\r\n"), tszStorageAddr, pSt_HTTPParam->tszHttpUri); HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHdrBuffer); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求的函数被要求重定向到:%s%s"), lpszClientAddr, tszStorageAddr, pSt_HTTPParam->tszHttpUri); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求的函数被要求重定向到:%s%s"), lpszClientAddr, tszStorageAddr, pSt_HTTPParam->tszHttpUri); return true; } @@ -145,28 +145,28 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求的API不支持"), lpszClientAddr); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,请求的API不支持"), lpszClientAddr); + return false; } //通知类型.用于多服务器 - if (0 == _tcsnicmp(XENGINE_STORAGE_APP_TASK_PASS, tszAPIMethod, _tcslen(XENGINE_STORAGE_APP_TASK_PASS))) + if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_TASK_PASS, tszAPIMethod, _tcsxlen(XENGINE_STORAGE_APP_TASK_PASS))) { XEngine_Task_Pass(tszAPIName, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); } - else if (0 == _tcsnicmp(XENGINE_STORAGE_APP_TASK_MANAGE, tszAPIMethod, _tcslen(XENGINE_STORAGE_APP_TASK_MANAGE))) + else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_TASK_MANAGE, tszAPIMethod, _tcsxlen(XENGINE_STORAGE_APP_TASK_MANAGE))) { XEngine_Task_Manage(tszAPIName, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); } } - else if (0 == _tcsnicmp(lpszMethodOption, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodOption))) + else if (0 == _tcsxnicmp(lpszMethodOption, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodOption))) { //用于心跳 st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; - LPCTSTR lpszHdrBuffer = _T("Allow: POST GET PUT OPTIONS\r\n"); + LPCXSTR lpszHdrBuffer = _X("Allow: POST GET PUT OPTIONS\r\n"); HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, lpszHdrBuffer); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求OPTIONS心跳方法成功"), lpszClientAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求OPTIONS心跳方法成功"), lpszClientAddr); } else { @@ -175,8 +175,8 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,发送的方法不支持"), lpszClientAddr); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,发送的方法不支持"), lpszClientAddr); + return false; } return true; diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h index 59ad8a1..e1bd7fd 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h @@ -1,11 +1,11 @@ #pragma once -#define XENGINE_STORAGE_APP_TASK_PASS _T("Pass") -#define XENGINE_STORAGE_APP_TASK_MANAGE _T("Manage") +#define XENGINE_STORAGE_APP_TASK_PASS _X("Pass") +#define XENGINE_STORAGE_APP_TASK_MANAGE _X("Manage") -#define XENGINE_STORAGE_APP_METHOD_CONFIG _T("Config") -#define XENGINE_STORAGE_APP_METHOD_UPFILE _T("UPFile") -#define XENGINE_STORAGE_APP_METHOD_DLFILE _T("DLFile") +#define XENGINE_STORAGE_APP_METHOD_CONFIG _X("Config") +#define XENGINE_STORAGE_APP_METHOD_UPFILE _X("UPFile") +#define XENGINE_STORAGE_APP_METHOD_DLFILE _X("DLFile") -XHTHREAD CALLBACK XEngine_Center_HTTPThread(LPVOID lParam); -BOOL XEngine_Task_HttpCenter_APIList(LPCTSTR lpszUrlName, TCHAR* ptszAPIVersion, TCHAR* ptszAPIMethod, TCHAR* ptszAPIName); -BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file +XHTHREAD CALLBACK XEngine_Center_HTTPThread(XPVOID lParam); +bool XEngine_Task_HttpCenter_APIList(LPCXSTR lpszUrlName, XCHAR* ptszAPIVersion, XCHAR* ptszAPIMethod, XCHAR* ptszAPIName); +bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp index ab8e833..6418856 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.cpp @@ -1,47 +1,47 @@ #include "StorageApp_Hdr.h" -BOOL StorageApp_Config_Parament(int argc,char **argv) +bool StorageApp_Config_Parament(int argc,char **argv) { - LPCTSTR lpszBaseCfg = _T("./XEngine_Config/XEngine_Config.json"); - LPCTSTR lpszLoadCfg = _T("./XEngine_Config/XEngine_LBConfig.json"); + LPCXSTR lpszBaseCfg = _X("./XEngine_Config/XEngine_Config.json"); + LPCXSTR lpszLoadCfg = _X("./XEngine_Config/XEngine_LBConfig.json"); if (!Config_Json_File(lpszBaseCfg, &st_ServiceCfg)) { printf("解析配置文件失败,Config_Json_File:%lX\n",Config_GetLastError()); - return FALSE; + return false; } if (!Config_Json_LoadBalance(lpszLoadCfg, &st_LoadbalanceCfg)) { printf("解析配置文件失败,Config_Json_LoadBalance:%lX\n", Config_GetLastError()); - return FALSE; + return false; } for (int i = 0;i < argc;i++) { - if ((0 == _tcscmp("-h",argv[i])) || (0 == _tcscmp("-H",argv[i]))) + if ((0 == _tcsxcmp("-h",argv[i])) || (0 == _tcsxcmp("-H",argv[i]))) { StorageApp_Config_ParamentHelp(); - return FALSE; + return false; } - if ((0 == _tcscmp("-v",argv[i])) || (0 == _tcscmp("-V",argv[i]))) + if ((0 == _tcsxcmp("-v",argv[i])) || (0 == _tcsxcmp("-V",argv[i]))) { string m_StrVersion = st_ServiceCfg.st_XVer.pStl_ListStorage->front(); printf("Version:%s\n", m_StrVersion.c_str()); - return FALSE; + return false; } - else if (0 == _tcscmp("-l",argv[i])) + else if (0 == _tcsxcmp("-l",argv[i])) { - st_ServiceCfg.st_XLog.nLogLeave = _ttoi(argv[i + 1]); + st_ServiceCfg.st_XLog.nLogLeave = _ttxoi(argv[i + 1]); } - else if (0 == _tcscmp("-d",argv[i])) + else if (0 == _tcsxcmp("-d",argv[i])) { - st_ServiceCfg.bDeamon = _ttoi(argv[i + 1]); + st_ServiceCfg.bDeamon = _ttxoi(argv[i + 1]); } - else if (0 == _tcscmp("-r", argv[i])) + else if (0 == _tcsxcmp("-r", argv[i])) { st_ServiceCfg.st_Memory.bReload = true; } - else if (0 == _tcscmp("-u", argv[i])) + else if (0 == _tcsxcmp("-u", argv[i])) { st_ServiceCfg.bReuseraddr = true; } @@ -52,12 +52,12 @@ BOOL StorageApp_Config_Parament(int argc,char **argv) void StorageApp_Config_ParamentHelp() { - printf(_T("--------------------------启动参数帮助开始--------------------------\n")); - printf(_T("服务启动参数:程序 参数 参数值,参数是区分大小写的。如果不指定将会加载默认的./XEngine_Config/XEngine_Config.json配置文件里面的参数\n")); - printf(_T("-h or -H:启动参数帮助提示信息\n")); - printf(_T("-v or -V:输出版本号\n")); - printf(_T("-l:设置日志输出级别\n")); - printf(_T("-d:1 启用守护进程,2不启用\n")); - printf(_T("-r:无重启,重载配置文件\n")); - printf(_T("--------------------------启动参数帮助结束--------------------------\n")); + printf(_X("--------------------------启动参数帮助开始--------------------------\n")); + printf(_X("服务启动参数:程序 参数 参数值,参数是区分大小写的。如果不指定将会加载默认的./XEngine_Config/XEngine_Config.json配置文件里面的参数\n")); + printf(_X("-h or -H:启动参数帮助提示信息\n")); + printf(_X("-v or -V:输出版本号\n")); + printf(_X("-l:设置日志输出级别\n")); + printf(_X("-d:1 启用守护进程,2不启用\n")); + printf(_X("-r:无重启,重载配置文件\n")); + printf(_X("--------------------------启动参数帮助结束--------------------------\n")); } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.h index 30b1872..a61af3d 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Config.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Config.h @@ -1,4 +1,4 @@ #pragma once -BOOL StorageApp_Config_Parament(int argc,char **argv); +bool StorageApp_Config_Parament(int argc,char **argv); void StorageApp_Config_ParamentHelp(); diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp index afee714..a8596ad 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp @@ -1,6 +1,6 @@ #include "StorageApp_Hdr.h" -XHTHREAD CALLBACK XEngine_Download_HTTPThread(LPVOID lParam) +XHTHREAD CALLBACK XEngine_Download_HTTPThread(XPVOID lParam) { int nThreadPos = *(int*)lParam; nThreadPos++; @@ -20,8 +20,8 @@ XHTHREAD CALLBACK XEngine_Download_HTTPThread(LPVOID lParam) { int nMsgLen = 0; int nHdrCount = 0; - CHAR* ptszMsgBuffer = NULL; - CHAR** ppszListHdr = NULL; + XCHAR* ptszMsgBuffer = NULL; + XCHAR** ppszListHdr = NULL; RFCCOMPONENTS_HTTP_REQPARAM st_HTTPParam; memset(&st_HTTPParam, '\0', sizeof(RFCCOMPONENTS_HTTP_REQPARAM)); @@ -40,12 +40,12 @@ XHTHREAD CALLBACK XEngine_Download_HTTPThread(LPVOID lParam) return 0; } -void CALLBACK XEngine_Download_CBSend(LPCSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) +void CALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { int nMsgLen = 4096; int nListCount = 0; __int64u nTimeWait = 0; - TCHAR tszMsgBuffer[4096]; + XCHAR tszMsgBuffer[4096]; SESSION_STORAGEINFO st_StorageInfo; memset(tszMsgBuffer, '\0', sizeof(tszMsgBuffer)); @@ -71,7 +71,7 @@ void CALLBACK XEngine_Download_CBSend(LPCSTR lpszClientAddr, SOCKET hSocket, LPV { int nPLen = MAX_PATH; int nHttpCode = 0; - TCHAR tszProxyStr[MAX_PATH]; + XCHAR tszProxyStr[MAX_PATH]; SESSION_STORAGEINFO st_StorageInfo; memset(tszProxyStr, '\0', MAX_PATH); @@ -79,18 +79,18 @@ void CALLBACK XEngine_Download_CBSend(LPCSTR lpszClientAddr, SOCKET hSocket, LPV Session_DLStroage_GetInfo(lpszClientAddr, &st_StorageInfo); Protocol_StoragePacket_UPDown(tszProxyStr, &nPLen, st_StorageInfo.tszFileDir, st_StorageInfo.tszBuckKey, st_StorageInfo.tszClientAddr, st_StorageInfo.ullRWCount, true, st_StorageInfo.tszFileHash); - if (APIClient_Http_Request(_T("POST"), st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass, tszProxyStr, &nHttpCode)) + if (APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass, tszProxyStr, &nHttpCode)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,请求完成通知失败,可能对方服务没有开启,文件:%s,地址:%s"), lpszClientAddr, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,请求完成通知失败,可能对方服务没有开启,文件:%s,地址:%s"), lpszClientAddr, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass); } } NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr); Session_DLStroage_Delete(lpszClientAddr); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,文件已经发送完毕,用户已经被移除发送列表"), lpszClientAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,文件已经发送完毕,用户已经被移除发送列表"), lpszClientAddr); } else { @@ -103,7 +103,7 @@ void CALLBACK XEngine_Download_CBSend(LPCSTR lpszClientAddr, SOCKET hSocket, LPV } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,获取用户对应文件内容失败,错误:%lX"), lpszClientAddr, Session_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,获取用户对应文件内容失败,错误:%lX"), lpszClientAddr, Session_GetLastError()); } //限速,如果没有单独限速,默认全局限速 if (st_ServiceCfg.st_XLimit.bLimitMode && (0 == st_StorageInfo.nLimit)) @@ -115,31 +115,31 @@ void CALLBACK XEngine_Download_CBSend(LPCSTR lpszClientAddr, SOCKET hSocket, LPV } } -BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount) +bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount) { int nSDLen = 2048; int nLimit = 0; XHANDLE xhLimit = NULL; __int64x ullCount = 0; //总大小 __int64x ullSize = 0; //需要下载大小 - TCHAR tszSDBuffer[2048]; - TCHAR tszFileDir[1024]; + XCHAR tszSDBuffer[2048]; + XCHAR tszFileDir[1024]; RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); memset(tszFileDir, '\0', sizeof(tszFileDir)); memset(&st_HDRParam, '\0', sizeof(RFCCOMPONENTS_HTTP_HDRPARAM)); - LPCTSTR lpszMethodGet = _T("GET"); - if (0 != _tcsncmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodGet))) + LPCXSTR lpszMethodGet = _X("GET"); + if (0 != _tcsxncmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodGet))) { st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 405; HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,发送的方法不支持"), lpszClientAddr); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,发送的方法不支持"), lpszClientAddr); + return false; } //连接数限制处理 if (st_ServiceCfg.st_XLimit.nMaxDNConnect > 0) @@ -151,15 +151,15 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,请求失败,连接数超过限制:%d,无法继续"), lpszClientAddr, st_ServiceCfg.st_XLimit.nMaxDNConnect); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,请求失败,连接数超过限制:%d,无法继续"), lpszClientAddr, st_ServiceCfg.st_XLimit.nMaxDNConnect); + return false; } } //验证用户 if (st_ServiceCfg.st_XProxy.st_XProxyAuth.bAuth) { - TCHAR tszUserName[64]; - TCHAR tszUserPass[64]; + XCHAR tszUserName[64]; + XCHAR tszUserPass[64]; memset(tszUserName, '\0', sizeof(tszUserName)); memset(tszUserPass, '\0', sizeof(tszUserPass)); @@ -171,18 +171,18 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); + return false; } - if (_tcslen(st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy) > 0) + if (_tcsxlen(st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy) > 0) { int nBLen = 0; int nCode = 0; int nResponseCode = 0; - TCHAR* ptszBody = NULL; + XCHAR* ptszBody = NULL; Protocol_StoragePacket_BasicAuth(pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); - APIClient_Http_Request(_T("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); + APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); if (200 != nResponseCode) { st_HDRParam.bIsClose = true; @@ -191,11 +191,11 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } Protocol_StorageParse_SpeedLimit(ptszBody, nSDLen, &nCode, &nLimit); BaseLib_OperatorMemory_FreeCStyle((VOID**)&ptszBody); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s,值:%d"), lpszClientAddr, st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszUserName, tszUserPass, nCode); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s,值:%d"), lpszClientAddr, st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszUserName, tszUserPass, nCode); } else { @@ -207,18 +207,18 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,验证用户失败,无法继续"), lpszClientAddr); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,验证用户失败,无法继续"), lpszClientAddr); + return false; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,本地验证用户验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,本地验证用户验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); } st_HDRParam.bAuth = true; } //使用重定向,这是分布式重定向实现 if (st_LoadbalanceCfg.st_LBDistributed.nDownldMode > 0) { - TCHAR tszHdrBuffer[1024]; - TCHAR tszStorageAddr[128]; + XCHAR tszHdrBuffer[1024]; + XCHAR tszStorageAddr[128]; memset(tszHdrBuffer, '\0', sizeof(tszHdrBuffer)); memset(tszStorageAddr, '\0', sizeof(tszStorageAddr)); @@ -227,15 +227,15 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 302; APIHelp_Distributed_RandomAddr(st_LoadbalanceCfg.st_LoadBalance.pStl_ListDownload, tszStorageAddr, st_LoadbalanceCfg.st_LBDistributed.nDownldMode); - _stprintf(tszHdrBuffer, _T("Location: %s%s\r\n"), tszStorageAddr, pSt_HTTPParam->tszHttpUri); + _xstprintf(tszHdrBuffer, _X("Location: %s%s\r\n"), tszStorageAddr, pSt_HTTPParam->tszHttpUri); HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHdrBuffer); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,请求的文件被要求重定向到:%s%s"), lpszClientAddr, tszStorageAddr, pSt_HTTPParam->tszHttpUri); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,请求的文件被要求重定向到:%s%s"), lpszClientAddr, tszStorageAddr, pSt_HTTPParam->tszHttpUri); return true; } - BOOL bRange = FALSE; + bool bRange = false; int nPosStart = 0; int nPosEnd = 0; __int64x nPosCount = 0; @@ -248,11 +248,11 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in } else { - bRange = FALSE; + bRange = false; nPosStart = 0; nPosEnd = 0; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,客户端的请求设置了数据范围:%d - %d/%lld"), lpszClientAddr, nPosStart, nPosEnd, nPosCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,客户端的请求设置了数据范围:%d - %d/%lld"), lpszClientAddr, nPosStart, nPosEnd, nPosCount); } XENGINE_STORAGEBUCKET st_StorageBucket; memset(&st_StorageBucket, '\0', sizeof(XENGINE_STORAGEBUCKET)); @@ -264,18 +264,18 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,请求文件失败,可能BUCKET:%s 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,请求文件失败,可能BUCKET:%s 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); + return false; } int nPathType = 0; - _stprintf(tszFileDir, _T("%s%s"), st_StorageBucket.tszFilePath, st_StorageBucket.tszFileName); + _xstprintf(tszFileDir, _X("%s%s"), st_StorageBucket.tszFilePath, st_StorageBucket.tszFileName); BaseLib_OperatorString_GetPath(tszFileDir, &nPathType); BaseLib_OperatorString_FixPath(tszFileDir, nPathType); int nHashLen = 0; - UCHAR tszHashKey[MAX_PATH]; - TCHAR tszFieldStr[MAX_PATH]; - TCHAR tszHashStr[128]; + XBYTE tszHashKey[MAX_PATH]; + XCHAR tszFieldStr[MAX_PATH]; + XCHAR tszHashStr[128]; memset(tszHashKey, '\0', MAX_PATH); memset(tszFieldStr, '\0', MAX_PATH); memset(tszHashStr, '\0', sizeof(tszHashStr)); @@ -295,8 +295,8 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,插入用户请求失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,插入用户请求失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); + return false; } //是否续传 if (bRange) @@ -317,7 +317,7 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 200; st_HDRParam.bIsClose = true; } - _stprintf(tszFieldStr, _T("FileHash: %s\r\n"), tszHashStr); + _xstprintf(tszFieldStr, _X("FileHash: %s\r\n"), tszHashStr); HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, ullSize, tszFieldStr); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); //不能在send之前调用 @@ -328,27 +328,27 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,设置回调下载失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,设置回调下载失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); + return false; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,请求下载文件成功,文件名:%s,总大小:%llu,发送大小:%llu,范围:%d - %d"), lpszClientAddr, tszFileDir, ullCount, ullSize, nPosStart, nPosEnd); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,请求下载文件成功,文件名:%s,总大小:%llu,发送大小:%llu,范围:%d - %d"), lpszClientAddr, tszFileDir, ullCount, ullSize, nPosStart, nPosEnd); return true; } -BOOL XEngine_Task_SendDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen) +bool XEngine_Task_SendDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen) { if (!XEngine_Net_SendMsg(lpszClientAddr, lpszMsgBuffer, nMsgLen, STORAGE_NETTYPE_HTTPDOWNLOAD)) { if (Session_DLStorage_SetSeek(lpszClientAddr, -nMsgLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("下载客户端:%s,正在发送文件数据,发送失败,移动指针:%d"), lpszClientAddr, -nMsgLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("下载客户端:%s,正在发送文件数据,发送失败,移动指针:%d"), lpszClientAddr, -nMsgLen); } else { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_CLOSE, STORAGE_NETTYPE_HTTPDOWNLOAD); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,正在发送文件数据,大小:%d,发送超过重试次数,无法继续,移除发送队列"), lpszClientAddr, nMsgLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,正在发送文件数据,大小:%d,发送超过重试次数,无法继续,移除发送队列"), lpszClientAddr, nMsgLen); } - return FALSE; + return false; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _T("下载客户端:%s,正在发送文件数据,大小:%d"), lpszClientAddr, nMsgLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("下载客户端:%s,正在发送文件数据,大小:%d"), lpszClientAddr, nMsgLen); return true; } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h index 0cc27a1..5f989e7 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.h @@ -1,7 +1,7 @@ #pragma once -XHTHREAD CALLBACK XEngine_Download_HTTPThread(LPVOID lParam); -void CALLBACK XEngine_Download_CBSend(LPCSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); +XHTHREAD CALLBACK XEngine_Download_HTTPThread(XPVOID lParam); +void CALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount); -BOOL XEngine_Task_SendDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen); \ No newline at end of file +bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); +bool XEngine_Task_SendDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h index ac72355..ec5307a 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h @@ -6,11 +6,12 @@ #include #include #include +#include #include #include #include #include -#ifdef _WINDOWS +#ifdef _MSC_BUILD #include #include #include @@ -66,7 +67,7 @@ using namespace std; #define STORAGE_NETTYPE_HTTPDOWNLOAD 2 #define STORAGE_NETTYPE_HTTPCENTER 3 -extern BOOL bIsRun; +extern bool bIsRun; extern XHANDLE xhLog; extern XHANDLE xhHBDownload; @@ -89,7 +90,7 @@ extern XHANDLE xhUPHttp; extern XHANDLE xhDLHttp; extern XHANDLE xhCenterHttp; -extern SOCKET hBroadSocket; +extern XSOCKET hBroadSocket; extern shared_ptr pSTDThread; extern XENGINE_SERVERCONFIG st_ServiceCfg; diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp index d46b73f..2079cd5 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp @@ -1,6 +1,6 @@ #include "StorageApp_Hdr.h" -bool CALLBACK XEngine_Callback_DownloadLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) +bool CALLBACK XEngine_Callback_DownloadLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bDLEnable) { @@ -8,19 +8,19 @@ bool CALLBACK XEngine_Callback_DownloadLogin(LPCTSTR lpszClientAddr, SOCKET hSoc } HttpProtocol_Server_CreateClientEx(xhDLHttp, lpszClientAddr, 0); SocketOpt_HeartBeat_InsertAddrEx(xhHBDownload, lpszClientAddr); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,进入了服务器"), lpszClientAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,进入了服务器"), lpszClientAddr); return true; } -void CALLBACK XEngine_Callback_DownloadRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam) +void CALLBACK XEngine_Callback_DownloadRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bDLEnable) { int nSLen = 0; - TCHAR* ptszMsgBuffer = NULL; + XCHAR* ptszMsgBuffer = NULL; OPenSsl_Server_RecvMemoryEx(xhDLSsl, lpszClientAddr, &ptszMsgBuffer, &nSLen, lpszRecvMsg, nMsgLen); if (!HttpProtocol_Server_InserQueueEx(xhDLHttp, lpszClientAddr, ptszMsgBuffer, nSLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); @@ -29,19 +29,19 @@ void CALLBACK XEngine_Callback_DownloadRecv(LPCTSTR lpszClientAddr, SOCKET hSock { if (!HttpProtocol_Server_InserQueueEx(xhDLHttp, lpszClientAddr, lpszRecvMsg, nMsgLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } } SocketOpt_HeartBeat_ActiveAddrEx(xhHBDownload, lpszClientAddr); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _T("下载客户端:%s,投递包成功,大小:%d"), lpszClientAddr, nMsgLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("下载客户端:%s,投递包成功,大小:%d"), lpszClientAddr, nMsgLen); } -void CALLBACK XEngine_Callback_DownloadLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) +void CALLBACK XEngine_Callback_DownloadLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPDOWNLOAD); } ////////////////////////////////////////////////////////////////////////// -bool CALLBACK XEngine_Callback_UPLoaderLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) +bool CALLBACK XEngine_Callback_UPLoaderLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bUPEnable) { @@ -50,19 +50,19 @@ bool CALLBACK XEngine_Callback_UPLoaderLogin(LPCTSTR lpszClientAddr, SOCKET hSoc HttpProtocol_Server_CreateClientEx(xhUPHttp, lpszClientAddr, 0); HttpProtocol_Server_SetRecvModeEx(xhUPHttp, lpszClientAddr, 1); //设置为文件接受模式 SocketOpt_HeartBeat_InsertAddrEx(xhHBUPLoader, lpszClientAddr); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,进入了服务器"), lpszClientAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,进入了服务器"), lpszClientAddr); return true; } -void CALLBACK XEngine_Callback_UPLoaderRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam) +void CALLBACK XEngine_Callback_UPLoaderRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bUPEnable) { int nSLen = 0; - TCHAR* ptszMsgBuffer = NULL; + XCHAR* ptszMsgBuffer = NULL; OPenSsl_Server_RecvMemoryEx(xhUPSsl, lpszClientAddr, &ptszMsgBuffer, &nSLen, lpszRecvMsg, nMsgLen); if (!HttpProtocol_Server_InserQueueEx(xhUPHttp, lpszClientAddr, ptszMsgBuffer, nSLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); @@ -71,7 +71,7 @@ void CALLBACK XEngine_Callback_UPLoaderRecv(LPCTSTR lpszClientAddr, SOCKET hSock { if (!HttpProtocol_Server_InserQueueEx(xhUPHttp, lpszClientAddr, lpszRecvMsg, nMsgLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } } @@ -82,14 +82,14 @@ void CALLBACK XEngine_Callback_UPLoaderRecv(LPCTSTR lpszClientAddr, SOCKET hSock Session_UPStorage_GetAll(NULL, &nCount); Algorithm_Calculation_SleepFlow(xhLimit, &nTimeWait, st_ServiceCfg.st_XLimit.nMaxUPLoader, nCount, nMsgLen); std::this_thread::sleep_for(std::chrono::microseconds(nTimeWait)); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _T("上传客户端:%s,投递包成功,大小:%d"), lpszClientAddr, nMsgLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("上传客户端:%s,投递包成功,大小:%d"), lpszClientAddr, nMsgLen); } -void CALLBACK XEngine_Callback_UPLoaderLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) +void CALLBACK XEngine_Callback_UPLoaderLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPUPLOADER); } ////////////////////////////////////////////////////////////////////////// -bool CALLBACK XEngine_Callback_CenterLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) +bool CALLBACK XEngine_Callback_CenterLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bCHEnable) { @@ -97,19 +97,19 @@ bool CALLBACK XEngine_Callback_CenterLogin(LPCTSTR lpszClientAddr, SOCKET hSocke } HttpProtocol_Server_CreateClientEx(xhCenterHttp, lpszClientAddr, 0); SocketOpt_HeartBeat_InsertAddrEx(xhHBCenter, lpszClientAddr); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,进入了服务器"), lpszClientAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,进入了服务器"), lpszClientAddr); return true; } -void CALLBACK XEngine_Callback_CenterRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam) +void CALLBACK XEngine_Callback_CenterRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam) { if (st_ServiceCfg.st_XCert.bCHEnable) { int nSLen = 0; - TCHAR* ptszMsgBuffer = NULL; + XCHAR* ptszMsgBuffer = NULL; OPenSsl_Server_RecvMemoryEx(xhCHSsl, lpszClientAddr, &ptszMsgBuffer, &nSLen, lpszRecvMsg, nMsgLen); if (!HttpProtocol_Server_InserQueueEx(xhCenterHttp, lpszClientAddr, ptszMsgBuffer, nSLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); @@ -118,52 +118,52 @@ void CALLBACK XEngine_Callback_CenterRecv(LPCTSTR lpszClientAddr, SOCKET hSocket { if (!HttpProtocol_Server_InserQueueEx(xhCenterHttp, lpszClientAddr, lpszRecvMsg, nMsgLen)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,投递数据失败,大小:%d,错误;%lX"), lpszClientAddr, nMsgLen, HttpProtocol_GetLastError()); return; } } SocketOpt_HeartBeat_ActiveAddrEx(xhHBCenter, lpszClientAddr); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _T("业务客户端:%s,投递包成功,大小:%d"), lpszClientAddr, nMsgLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("业务客户端:%s,投递包成功,大小:%d"), lpszClientAddr, nMsgLen); } -void CALLBACK XEngine_Callback_CenterLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam) +void CALLBACK XEngine_Callback_CenterLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPCENTER); } ////////////////////////////////////////////////////////////////////////// -void CALLBACK XEngine_Callback_HBDownload(LPCTSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam) +void CALLBACK XEngine_Callback_HBDownload(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_HEARTBEAT, STORAGE_NETTYPE_HTTPDOWNLOAD); } -void CALLBACK XEngine_Callback_HBUPLoader(LPCTSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam) +void CALLBACK XEngine_Callback_HBUPLoader(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_HEARTBEAT, STORAGE_NETTYPE_HTTPUPLOADER); } -void CALLBACK XEngine_Callback_HBCenter(LPCTSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam) +void CALLBACK XEngine_Callback_HBCenter(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam) { XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_HEARTBEAT, STORAGE_NETTYPE_HTTPCENTER); } ////////////////////////////////////////////////////////////////////////// -BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, int nLeaveType, int nClientType) +bool XEngine_Net_CloseClient(LPCXSTR lpszClientAddr, int nLeaveType, int nClientType) { string m_StrLeaveMsg; string m_StrClient; if (STORAGE_NETTYPE_HTTPUPLOADER == nClientType) { - m_StrClient = _T("上传客户端"); + m_StrClient = _X("上传客户端"); if (STORAGE_LEAVETYPE_HEARTBEAT == nLeaveType) { - m_StrLeaveMsg = _T("心跳超时"); + m_StrLeaveMsg = _X("心跳超时"); NetCore_TCPXCore_CloseForClientEx(xhNetUPLoader, lpszClientAddr); } else if (STORAGE_LEAVETYPE_BYSELF == nLeaveType) { - m_StrLeaveMsg = _T("被动断开"); + m_StrLeaveMsg = _X("被动断开"); SocketOpt_HeartBeat_DeleteAddrEx(xhHBUPLoader, lpszClientAddr); } else { - m_StrLeaveMsg = _T("主动关闭"); + m_StrLeaveMsg = _X("主动关闭"); NetCore_TCPXCore_CloseForClientEx(xhNetUPLoader, lpszClientAddr); SocketOpt_HeartBeat_DeleteAddrEx(xhHBUPLoader, lpszClientAddr); } @@ -173,20 +173,20 @@ BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, int nLeaveType, int nClient } else if (STORAGE_NETTYPE_HTTPDOWNLOAD == nClientType) { - m_StrClient = _T("下载客户端"); + m_StrClient = _X("下载客户端"); if (STORAGE_LEAVETYPE_HEARTBEAT == nLeaveType) { - m_StrLeaveMsg = _T("心跳超时"); + m_StrLeaveMsg = _X("心跳超时"); NetCore_TCPXCore_CloseForClientEx(xhNetDownload, lpszClientAddr); } else if (STORAGE_LEAVETYPE_BYSELF == nLeaveType) { - m_StrLeaveMsg = _T("被动断开"); + m_StrLeaveMsg = _X("被动断开"); SocketOpt_HeartBeat_DeleteAddrEx(xhHBDownload, lpszClientAddr); } else { - m_StrLeaveMsg = _T("主动关闭"); + m_StrLeaveMsg = _X("主动关闭"); NetCore_TCPXCore_CloseForClientEx(xhNetDownload, lpszClientAddr); SocketOpt_HeartBeat_DeleteAddrEx(xhHBDownload, lpszClientAddr); } @@ -204,20 +204,20 @@ BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, int nLeaveType, int nClient } else if (STORAGE_NETTYPE_HTTPCENTER == nClientType) { - m_StrClient = _T("业务客户端"); + m_StrClient = _X("业务客户端"); if (STORAGE_LEAVETYPE_HEARTBEAT == nLeaveType) { - m_StrLeaveMsg = _T("心跳超时"); + m_StrLeaveMsg = _X("心跳超时"); NetCore_TCPXCore_CloseForClientEx(xhNetCenter, lpszClientAddr); } else if (STORAGE_LEAVETYPE_BYSELF == nLeaveType) { - m_StrLeaveMsg = _T("被动断开"); + m_StrLeaveMsg = _X("被动断开"); SocketOpt_HeartBeat_DeleteAddrEx(xhHBCenter, lpszClientAddr); } else { - m_StrLeaveMsg = _T("主动关闭"); + m_StrLeaveMsg = _X("主动关闭"); NetCore_TCPXCore_CloseForClientEx(xhNetCenter, lpszClientAddr); SocketOpt_HeartBeat_DeleteAddrEx(xhHBCenter, lpszClientAddr); @@ -225,20 +225,20 @@ BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, int nLeaveType, int nClient HttpProtocol_Server_CloseClinetEx(xhCenterHttp, lpszClientAddr); OPenSsl_Server_CloseClientEx(xhCHSsl, lpszClientAddr); } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("%s:%s,与服务器断开,原因:%s"), m_StrClient.c_str(), lpszClientAddr, m_StrLeaveMsg.c_str()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("%s:%s,与服务器断开,原因:%s"), m_StrClient.c_str(), lpszClientAddr, m_StrLeaveMsg.c_str()); return true; } /////////////////////////////////////////////////////////////////////////////////// -BOOL XEngine_Net_SendMsg(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, int nType) +bool XEngine_Net_SendMsg(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, int nType) { - BOOL bRet = FALSE; + bool bRet = false; if (STORAGE_NETTYPE_HTTPDOWNLOAD == nType) { if (st_ServiceCfg.st_XCert.bDLEnable) { int nSLen = 0; - TCHAR *ptszMsgBuffer = NULL; + XCHAR *ptszMsgBuffer = NULL; OPenSsl_Server_SendMemoryEx(xhDLSsl, lpszClientAddr, lpszMsgBuffer, nMsgLen, &ptszMsgBuffer, &nSLen); bRet = NetCore_TCPXCore_SendEx(xhNetDownload, lpszClientAddr, ptszMsgBuffer, nSLen); @@ -258,7 +258,7 @@ BOOL XEngine_Net_SendMsg(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsg if (st_ServiceCfg.st_XCert.bUPEnable) { int nSLen = 0; - TCHAR* ptszMsgBuffer = NULL; + XCHAR* ptszMsgBuffer = NULL; OPenSsl_Server_SendMemoryEx(xhUPSsl, lpszClientAddr, lpszMsgBuffer, nMsgLen, &ptszMsgBuffer, &nSLen); bRet = NetCore_TCPXCore_SendEx(xhNetUPLoader, lpszClientAddr, ptszMsgBuffer, nSLen); @@ -278,7 +278,7 @@ BOOL XEngine_Net_SendMsg(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsg if (st_ServiceCfg.st_XCert.bCHEnable) { int nSLen = 0; - TCHAR* ptszMsgBuffer = NULL; + XCHAR* ptszMsgBuffer = NULL; OPenSsl_Server_SendMemoryEx(xhCHSsl, lpszClientAddr, lpszMsgBuffer, nMsgLen, &ptszMsgBuffer, &nSLen); bRet = NetCore_TCPXCore_SendEx(xhNetCenter, lpszClientAddr, ptszMsgBuffer, nSLen); @@ -295,9 +295,9 @@ BOOL XEngine_Net_SendMsg(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsg } if (!bRet) { - DWORD dwRet = NetCore_GetLastError(); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("客户端:%s,网络类型:%d,发送数据失败,发送大小:%d,错误:%lX,%d"), lpszClientAddr, nType, nMsgLen, dwRet, errno); - return FALSE; + XLONG dwRet = NetCore_GetLastError(); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("客户端:%s,网络类型:%d,发送数据失败,发送大小:%d,错误:%lX,%d"), lpszClientAddr, nType, nMsgLen, dwRet, errno); + return false; } return true; } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h index 6886337..5126a08 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Network.h @@ -1,18 +1,18 @@ #pragma once -bool CALLBACK XEngine_Callback_DownloadLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); -void CALLBACK XEngine_Callback_DownloadRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam); -void CALLBACK XEngine_Callback_DownloadLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); -bool CALLBACK XEngine_Callback_UPLoaderLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); -void CALLBACK XEngine_Callback_UPLoaderRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam); -void CALLBACK XEngine_Callback_UPLoaderLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); -bool CALLBACK XEngine_Callback_CenterLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); -void CALLBACK XEngine_Callback_CenterRecv(LPCTSTR lpszClientAddr, SOCKET hSocket, LPCTSTR lpszRecvMsg, int nMsgLen, LPVOID lParam); -void CALLBACK XEngine_Callback_CenterLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam); +bool CALLBACK XEngine_Callback_DownloadLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void CALLBACK XEngine_Callback_DownloadRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); +void CALLBACK XEngine_Callback_DownloadLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +bool CALLBACK XEngine_Callback_UPLoaderLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void CALLBACK XEngine_Callback_UPLoaderRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); +void CALLBACK XEngine_Callback_UPLoaderLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +bool CALLBACK XEngine_Callback_CenterLogin(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); +void CALLBACK XEngine_Callback_CenterRecv(LPCXSTR lpszClientAddr, XSOCKET hSocket, LPCXSTR lpszRecvMsg, int nMsgLen, XPVOID lParam); +void CALLBACK XEngine_Callback_CenterLeave(LPCXSTR lpszClientAddr, XSOCKET hSocket, XPVOID lParam); -void CALLBACK XEngine_Callback_HBDownload(LPCTSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam); -void CALLBACK XEngine_Callback_HBUPLoader(LPCTSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam); -void CALLBACK XEngine_Callback_HBCenter(LPCTSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam); +void CALLBACK XEngine_Callback_HBDownload(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); +void CALLBACK XEngine_Callback_HBUPLoader(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); +void CALLBACK XEngine_Callback_HBCenter(LPCXSTR lpszClientAddr, XSOCKET hSocket, int nStatus, XPVOID lParam); -BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, int nLeaveType, int nClientType = STORAGE_NETTYPE_HTTPDOWNLOAD); -BOOL XEngine_Net_SendMsg(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, int nType = STORAGE_NETTYPE_HTTPDOWNLOAD); \ No newline at end of file +bool XEngine_Net_CloseClient(LPCXSTR lpszClientAddr, int nLeaveType, int nClientType = STORAGE_NETTYPE_HTTPDOWNLOAD); +bool XEngine_Net_SendMsg(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, int nType = STORAGE_NETTYPE_HTTPDOWNLOAD); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp index cb09fc7..b7efdc9 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp @@ -1,6 +1,6 @@ #include "StorageApp_Hdr.h" -XHTHREAD CALLBACK XEngine_UPLoader_HTTPThread(LPVOID lParam) +XHTHREAD CALLBACK XEngine_UPLoader_HTTPThread(XPVOID lParam) { int nThreadPos = *(int*)lParam; nThreadPos++; @@ -20,8 +20,8 @@ XHTHREAD CALLBACK XEngine_UPLoader_HTTPThread(LPVOID lParam) { int nMsgLen = 0; int nHdrCount = 0; - CHAR* ptszMsgBuffer = NULL; - CHAR** ppszListHdr = NULL; + XCHAR* ptszMsgBuffer = NULL; + XCHAR** ppszListHdr = NULL; RFCCOMPONENTS_HTTP_REQPARAM st_HTTPParam; memset(&st_HTTPParam, '\0', sizeof(RFCCOMPONENTS_HTTP_REQPARAM)); @@ -39,28 +39,28 @@ XHTHREAD CALLBACK XEngine_UPLoader_HTTPThread(LPVOID lParam) } return 0; } -BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount) +bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount) { int nSDLen = 2048; - TCHAR tszSDBuffer[2048]; - TCHAR tszFileDir[1024]; + XCHAR tszSDBuffer[2048]; + XCHAR tszFileDir[1024]; RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); memset(tszFileDir, '\0', sizeof(tszFileDir)); memset(&st_HDRParam, '\0', sizeof(RFCCOMPONENTS_HTTP_HDRPARAM)); - LPCTSTR lpszMethodPut = _T("PUT"); - LPCTSTR lpszMethodPost = _T("POST"); - if ((0 != _tcsncmp(lpszMethodPut, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodPut))) && (0 != _tcsncmp(lpszMethodPost, pSt_HTTPParam->tszHttpMethod, _tcslen(lpszMethodPost)))) + LPCXSTR lpszMethodPut = _X("PUT"); + LPCXSTR lpszMethodPost = _X("POST"); + if ((0 != _tcsxncmp(lpszMethodPut, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodPut))) && (0 != _tcsxncmp(lpszMethodPost, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodPost)))) { st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 405; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,发送的方法:%s 不支持"), lpszClientAddr, pSt_HTTPParam->tszHttpMethod); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,发送的方法:%s 不支持"), lpszClientAddr, pSt_HTTPParam->tszHttpMethod); + return false; } //连接数限制处理 if (st_ServiceCfg.st_XLimit.nMaxUPConnect > 0) @@ -72,15 +72,15 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求失败,连接数超过限制:%d,无法继续"), lpszClientAddr, st_ServiceCfg.st_XLimit.nMaxUPConnect); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求失败,连接数超过限制:%d,无法继续"), lpszClientAddr, st_ServiceCfg.st_XLimit.nMaxUPConnect); + return false; } } //用户验证 if (st_ServiceCfg.st_XProxy.st_XProxyAuth.bAuth) { - TCHAR tszUserName[64]; - TCHAR tszUserPass[64]; + XCHAR tszUserName[64]; + XCHAR tszUserPass[64]; memset(tszUserName, '\0', sizeof(tszUserName)); memset(tszUserPass, '\0', sizeof(tszUserPass)); @@ -92,17 +92,17 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); + return false; } - if (_tcslen(st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy) > 0) + if (_tcsxlen(st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy) > 0) { int nBLen = 0; int nResponseCode = 0; - TCHAR* ptszBody = NULL; + XCHAR* ptszBody = NULL; Protocol_StoragePacket_BasicAuth(pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); - APIClient_Http_Request(_T("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); + APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); if (200 != nResponseCode) { st_HDRParam.bIsClose = true; @@ -111,10 +111,10 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } BaseLib_OperatorMemory_FreeCStyle((VOID**)&ptszBody); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s"), lpszClientAddr, st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszUserName, tszUserPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s"), lpszClientAddr, st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszUserName, tszUserPass); } else { @@ -126,18 +126,18 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,验证用户失败,无法继续"), lpszClientAddr); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,验证用户失败,无法继续"), lpszClientAddr); + return false; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,本地验证用户验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,本地验证用户验证通过,用户名:%s,密码:%s"), lpszClientAddr, tszUserName, tszUserPass); } st_HDRParam.bAuth = true; } //使用重定向? if (st_LoadbalanceCfg.st_LBDistributed.nUPLoadMode > 0) { - TCHAR tszHdrBuffer[1024]; - TCHAR tszStorageAddr[128]; + XCHAR tszHdrBuffer[1024]; + XCHAR tszStorageAddr[128]; memset(tszHdrBuffer, '\0', sizeof(tszHdrBuffer)); memset(tszStorageAddr, '\0', sizeof(tszStorageAddr)); @@ -146,23 +146,23 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 302; APIHelp_Distributed_RandomAddr(st_LoadbalanceCfg.st_LoadBalance.pStl_ListUPLoader, tszStorageAddr, st_LoadbalanceCfg.st_LBDistributed.nUPLoadMode); - _stprintf(tszHdrBuffer, _T("Location: %s%s\r\n"), tszStorageAddr, pSt_HTTPParam->tszHttpUri); + _xstprintf(tszHdrBuffer, _X("Location: %s%s\r\n"), tszStorageAddr, pSt_HTTPParam->tszHttpUri); HttpProtocol_Server_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, 0, tszHdrBuffer); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求的文件被要求重定向到:%s%s"), lpszClientAddr, tszStorageAddr, pSt_HTTPParam->tszHttpUri); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,请求的文件被要求重定向到:%s%s"), lpszClientAddr, tszStorageAddr, pSt_HTTPParam->tszHttpUri); return true; } int nRVMode = 0; int nRVCount = 0; int nHDSize = 0; - TCHAR tszFileName[MAX_PATH]; + XCHAR tszFileName[MAX_PATH]; XENGINE_STORAGEBUCKET st_StorageBucket; memset(tszFileName, '\0', MAX_PATH); memset(&st_StorageBucket, '\0', sizeof(XENGINE_STORAGEBUCKET)); //解析参数 - TCHAR** pptszParamList; + XCHAR** pptszParamList; int nParamCount = 0; HttpProtocol_ServerHelp_GetParament(pSt_HTTPParam->tszHttpUri, &pptszParamList, &nParamCount); if (nParamCount < 1) @@ -171,13 +171,13 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); BaseLib_OperatorMemory_Free((XPPPMEM)&pptszParamList, nParamCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求上传文件失败,提供的参数:%s 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, HttpProtocol_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求上传文件失败,提供的参数:%s 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, HttpProtocol_GetLastError()); + return false; } APIHelp_Api_UrlParse(&pptszParamList, nParamCount, tszFileName, st_StorageBucket.tszBuckKey); //是否指定了bucket //http://127.0.0.1:5102/api?filename=1.txt&storeagekey=storagekey1 - if (_tcslen(st_StorageBucket.tszBuckKey) > 0) + if (_tcsxlen(st_StorageBucket.tszBuckKey) > 0) { if (!APIHelp_Distributed_UPStorage(st_LoadbalanceCfg.st_LoadBalance.pStl_ListBucket, &st_StorageBucket, 4)) { @@ -186,8 +186,8 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求上传文件失败,可能BUCKET:% 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求上传文件失败,可能BUCKET:% 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); + return false; } } else @@ -199,12 +199,12 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求上传文件失败,可能BUCKET:% 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求上传文件失败,可能BUCKET:% 不正确,错误:%lX"), lpszClientAddr, pSt_HTTPParam->tszHttpUri, StorageHelp_GetLastError()); + return false; } } int nPathType = 0; - _stprintf(tszFileDir, _T("%s/%s"), st_StorageBucket.tszFilePath, tszFileName); + _xstprintf(tszFileDir, _X("%s/%s"), st_StorageBucket.tszFilePath, tszFileName); BaseLib_OperatorString_GetPath(tszFileDir, &nPathType); BaseLib_OperatorString_FixPath(tszFileDir, nPathType); @@ -220,8 +220,8 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 411; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,没有用户数据大小字段,无法继续"), lpszClientAddr); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,没有用户数据大小字段,无法继续"), lpszClientAddr); + return false; } //是新的还是断点续传的 if ((0 != nPosStart) || (0 != nPosEnd)) @@ -234,15 +234,15 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求断点续传上传文件失败,服务端关闭了此功能,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求断点续传上传文件失败,服务端关闭了此功能,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); + return false; } } - TCHAR tszTmpPath[MAX_PATH]; + XCHAR tszTmpPath[MAX_PATH]; memset(tszTmpPath, '\0', MAX_PATH); BaseLib_OperatorString_GetFileAndPath(tszFileDir, tszTmpPath); - if (0 != _taccess(tszTmpPath, 0)) + if (0 != _xtaccess(tszTmpPath, 0)) { //不存在,是否允许创建? if (!st_StorageBucket.st_PermissionFlags.bCreateDir) @@ -252,8 +252,8 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求上传文件失败,上传文件夹不存在,权限错误,文件:%s"), lpszClientAddr, tszFileDir); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求上传文件失败,上传文件夹不存在,权限错误,文件:%s"), lpszClientAddr, tszFileDir); + return false; } SystemApi_File_CreateMutilFolder(tszTmpPath); } @@ -264,17 +264,17 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,插入用户请求失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,插入用户请求失败,文件:%s,错误:%lX"), lpszClientAddr, tszFileDir, Session_GetLastError()); + return false; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求设置了数据范围:%d - %d/%lld"), lpszClientAddr, nPosStart, nPosEnd, nPosCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,请求设置了数据范围:%d - %d/%lld"), lpszClientAddr, nPosStart, nPosEnd, nPosCount); } Session_UPStroage_Write(lpszClientAddr, lpszMsgBuffer, nMsgLen); HttpProtocol_Server_GetRecvModeEx(xhUPHttp, lpszClientAddr, &nRVMode, &nRVCount, &nHDSize); if (nHDSize >= nRVCount) { int nPLen = MAX_PATH; - TCHAR tszPassNotify[MAX_PATH]; + XCHAR tszPassNotify[MAX_PATH]; SESSION_STORAGEINFO st_StorageInfo; memset(tszPassNotify, '\0', MAX_PATH); @@ -285,22 +285,22 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in { st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; - Protocol_StoragePacket_UPDown(tszPassNotify, &nPLen, st_StorageInfo.tszBuckKey, st_StorageInfo.tszFileDir, st_StorageInfo.tszClientAddr, st_StorageInfo.ullRWLen, FALSE); + Protocol_StoragePacket_UPDown(tszPassNotify, &nPLen, st_StorageInfo.tszBuckKey, st_StorageInfo.tszFileDir, st_StorageInfo.tszClientAddr, st_StorageInfo.ullRWLen, false); HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("上传客户端:%s,请求上传文件成功,文件名:%s,总大小:%lld,写入大小:%lld,文件不完整,需要等待断点续传完毕"), lpszClientAddr, tszFileDir, st_StorageInfo.ullCount, st_StorageInfo.ullRWLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("上传客户端:%s,请求上传文件成功,文件名:%s,总大小:%lld,写入大小:%lld,文件不完整,需要等待断点续传完毕"), lpszClientAddr, tszFileDir, st_StorageInfo.ullCount, st_StorageInfo.ullRWLen); return true; } int nHashLen = 0; - UCHAR tszHashStr[MAX_PATH]; + XBYTE tszHashStr[MAX_PATH]; XSTORAGECORE_DBFILE st_ProtocolFile; memset(tszHashStr, '\0', MAX_PATH); memset(&st_ProtocolFile, '\0', sizeof(XSTORAGECORE_DBFILE)); - _tcscpy(st_ProtocolFile.st_ProtocolFile.tszFilePath, st_StorageBucket.tszFilePath); - _tcscpy(st_ProtocolFile.st_ProtocolFile.tszFileName, tszFileName); - _tcscpy(st_ProtocolFile.tszBuckKey, st_StorageBucket.tszBuckKey); + _tcsxcpy(st_ProtocolFile.st_ProtocolFile.tszFilePath, st_StorageBucket.tszFilePath); + _tcsxcpy(st_ProtocolFile.st_ProtocolFile.tszFileName, tszFileName); + _tcsxcpy(st_ProtocolFile.tszBuckKey, st_StorageBucket.tszBuckKey); st_ProtocolFile.st_ProtocolFile.nFileSize = st_StorageInfo.ullRWLen; //上传完毕需要关闭,否则计算HASH会不正常 Session_UPStroage_Close(lpszClientAddr); @@ -311,22 +311,22 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in { if (APIHelp_Api_VerHash(st_ProtocolFile.st_ProtocolFile.tszFileHash, pptszListHdr, nHdrCount)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,上传的文件信息HASH效验成功,文件:%s HASH:%s"), lpszClientAddr, tszFileDir, st_ProtocolFile.st_ProtocolFile.tszFileHash); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,上传的文件信息HASH效验成功,文件:%s HASH:%s"), lpszClientAddr, tszFileDir, st_ProtocolFile.st_ProtocolFile.tszFileHash); } else { st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 403; - _tremove(tszFileDir); + _xtremove(tszFileDir); HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,上传的文件信息HASH校验失败,无法继续,文件:%s 已被删除,HASH:%s,错误:%lX"), lpszClientAddr, tszFileDir, st_ProtocolFile.st_ProtocolFile.tszFileHash, StorageHelp_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,上传的文件信息HASH校验失败,无法继续,文件:%s 已被删除,HASH:%s,错误:%lX"), lpszClientAddr, tszFileDir, st_ProtocolFile.st_ProtocolFile.tszFileHash, StorageHelp_GetLastError()); + return false; } } - Protocol_StoragePacket_UPDown(tszPassNotify, &nPLen, st_StorageInfo.tszBuckKey, st_StorageInfo.tszFileDir, st_StorageInfo.tszClientAddr, st_StorageInfo.ullCount, FALSE, st_ProtocolFile.st_ProtocolFile.tszFileHash); + Protocol_StoragePacket_UPDown(tszPassNotify, &nPLen, st_StorageInfo.tszBuckKey, st_StorageInfo.tszFileDir, st_StorageInfo.tszClientAddr, st_StorageInfo.ullCount, false, st_ProtocolFile.st_ProtocolFile.tszFileHash); if (st_ServiceCfg.st_XSql.bEnable) { if (Database_File_FileInsert(&st_ProtocolFile, st_StorageInfo.bRewrite)) @@ -335,7 +335,7 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 200; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d"), lpszClientAddr, tszFileDir, nRVCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d"), lpszClientAddr, tszFileDir, nRVCount); } else { @@ -343,7 +343,7 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 403; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求上传文件失败,插入数据库失败:%s,错误:%lX"), lpszClientAddr, tszFileDir, Database_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,请求上传文件失败,插入数据库失败:%s,错误:%lX"), lpszClientAddr, tszFileDir, Database_GetLastError()); } } else @@ -352,25 +352,25 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in st_HDRParam.nHttpCode = 200; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszPassNotify, nPLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d,数据库没有启用,不插入数据库"), lpszClientAddr, tszFileDir, nRVCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d,数据库没有启用,不插入数据库"), lpszClientAddr, tszFileDir, nRVCount); } //PASS代理 if (st_ServiceCfg.st_XProxy.st_XProxyPass.bUPPass) { int nHttpCode = 0; - if (APIClient_Http_Request(_T("POST"), st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass, tszPassNotify, &nHttpCode)) + if (APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass, tszPassNotify, &nHttpCode)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,请求完成通知失败,可能服务器不正确:文件:%s,地址:%s"), lpszClientAddr, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求完成通知失败,可能服务器不正确:文件:%s,地址:%s"), lpszClientAddr, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass); } } } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _T("上传客户端:%s,请求上传文件中,文件名:%s,大小:%d"), lpszClientAddr, tszFileDir, nMsgLen); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("上传客户端:%s,请求上传文件中,文件名:%s,大小:%d"), lpszClientAddr, tszFileDir, nMsgLen); } return true; diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h index b839fe9..49d0617 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.h @@ -1,4 +1,4 @@ #pragma once -XHTHREAD CALLBACK XEngine_UPLoader_HTTPThread(LPVOID lParam); -BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file +XHTHREAD CALLBACK XEngine_UPLoader_HTTPThread(XPVOID lParam); +bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp index 52f24f5..b7af165 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp @@ -1,11 +1,11 @@ #include "../StorageApp_Hdr.h" -BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount) +bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount) { int nSDLen = 10240; int nRVLen = 10240; - TCHAR tszSDBuffer[10240]; - TCHAR tszRVBuffer[10240]; + XCHAR tszSDBuffer[10240]; + XCHAR tszRVBuffer[10240]; RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); @@ -14,25 +14,25 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; - if (0 == _tcsnicmp(XENGINE_STORAGE_APP_METHOD_CONFIG, lpszAPIName, _tcslen(XENGINE_STORAGE_APP_METHOD_CONFIG))) + if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_CONFIG, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_CONFIG))) { StorageApp_Config_Parament(0, NULL); HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,处理用户重载配置文件成功"), lpszClientAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,处理用户重载配置文件成功"), lpszClientAddr); } - else if (0 == _tcsnicmp(XENGINE_STORAGE_APP_METHOD_QUERY, lpszAPIName, _tcslen(XENGINE_STORAGE_APP_METHOD_QUERY))) + else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_QUERY, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_QUERY))) { //查询文件列表 int nMode = 0; int nListCount = 0; int nMsgLen = 10240; - TCHAR tszFileName[MAX_PATH]; - TCHAR tszFileHash[MAX_PATH]; - TCHAR tszBucketKey[128]; - TCHAR tszTimeStart[128]; - TCHAR tszTimeEnd[128]; - TCHAR tszMsgBuffer[10240]; + XCHAR tszFileName[MAX_PATH]; + XCHAR tszFileHash[MAX_PATH]; + XCHAR tszBucketKey[128]; + XCHAR tszTimeStart[128]; + XCHAR tszTimeEnd[128]; + XCHAR tszMsgBuffer[10240]; XSTORAGECORE_DBFILE** ppSt_ListFile; memset(tszFileName, '\0', MAX_PATH); @@ -53,8 +53,8 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp st_HDRParam.nHttpCode = 501; HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求查询文件失败,没有启用数据库,无法使用此功能!"), lpszClientAddr); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,请求查询文件失败,没有启用数据库,无法使用此功能!"), lpszClientAddr); + return false; } Database_File_FileQuery(&ppSt_ListFile, &nListCount, tszTimeStart, tszTimeEnd, tszBucketKey, NULL, tszFileName, tszFileHash); if (0 == nListCount) @@ -63,33 +63,33 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp st_HDRParam.nHttpCode = 404; HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求查询文件失败,没有找到文件,查找文件名:%s,文件HASH:%s!"), lpszClientAddr, tszFileName, tszFileHash); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,请求查询文件失败,没有找到文件,查找文件名:%s,文件HASH:%s!"), lpszClientAddr, tszFileName, tszFileHash); + return false; } Protocol_StoragePacket_QueryFile(tszMsgBuffer, &nMsgLen, &ppSt_ListFile, nListCount, tszTimeStart, tszTimeEnd); HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszMsgBuffer, nMsgLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListFile, nListCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求查询文件列表成功,列表个数:%d"), lpszClientAddr, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求查询文件列表成功,列表个数:%d"), lpszClientAddr, nListCount); return true; } else { //开始广播请求文件 - SOCKET hRVSocket; - SOCKET hSDSocket; + XSOCKET hRVSocket; + XSOCKET hSDSocket; XNETHANDLE xhToken = 0; list stl_ListFile; - if (_tcslen(tszFileHash) <= 0) + if (_tcsxlen(tszFileHash) <= 0) { st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 400; HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,发送广播请求失败,因为查询文件HASH为空"), lpszClientAddr); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,发送广播请求失败,因为查询文件HASH为空"), lpszClientAddr); + return false; } BaseLib_OperatorHandle_Create(&xhToken); Protocol_StoragePacket_REQFile(tszSDBuffer, &nSDLen, NULL, tszFileHash, xhToken); @@ -106,8 +106,8 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); NetCore_BroadCast_Close(hSDSocket); NetCore_BroadCast_Close(hRVSocket); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,发送广播请求失败,错误:%lX"), lpszClientAddr, NetCore_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,发送广播请求失败,错误:%lX"), lpszClientAddr, NetCore_GetLastError()); + return false; } time_t nTimeStart = time(NULL); while (1) @@ -123,11 +123,11 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp if (xhToken == xhP2PToken) { stl_ListFile.push_back(st_FileInfo); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,接受到P2P文件查询回复,TOKEN:%llu 一致"), lpszClientAddr, xhToken); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,接受到P2P文件查询回复,TOKEN:%llu 一致"), lpszClientAddr, xhToken); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("业务客户端:%s,接受到P2P文件查询回复,请求TOKEN:%llu,回复TOKEN:%llu 不一致"), lpszClientAddr, xhToken, xhP2PToken); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("业务客户端:%s,接受到P2P文件查询回复,请求TOKEN:%llu,回复TOKEN:%llu 不一致"), lpszClientAddr, xhToken, xhP2PToken); } } time_t nTimeEnd = time(NULL); @@ -155,12 +155,12 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListPacket, nListCount); } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求局域网文件列表成功,文件分布服务器个数:%d"), lpszClientAddr, stl_ListFile.size()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求局域网文件列表成功,文件分布服务器个数:%d"), lpszClientAddr, stl_ListFile.size()); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); stl_ListFile.clear(); } } - else if (0 == _tcsnicmp(XENGINE_STORAGE_APP_METHOD_INSERT, lpszAPIName, _tcslen(XENGINE_STORAGE_APP_METHOD_INSERT))) + else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_INSERT, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_INSERT))) { int nListCount = 0; XSTORAGECORE_DBFILE** ppSt_DBFile; @@ -168,39 +168,39 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp Protocol_StorageParse_ReportFile(lpszMsgBuffer, nMsgLen, &ppSt_DBFile, &nListCount); for (int i = 0; i < nListCount; i++) { - TCHAR tszFileDir[1024]; + XCHAR tszFileDir[1024]; memset(tszFileDir, '\0', sizeof(tszFileDir)); //判断下文件是否存在就行了 - if (_tcslen(ppSt_DBFile[i]->tszBuckKey) > 0) + if (_tcsxlen(ppSt_DBFile[i]->tszBuckKey) > 0) { APIHelp_Distributed_GetPathKey(st_LoadbalanceCfg.st_LoadBalance.pStl_ListBucket, ppSt_DBFile[i]->tszBuckKey, ppSt_DBFile[i]->st_ProtocolFile.tszFilePath); } - _stprintf(tszFileDir, _T("%s/%s"), ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); - if (0 != _taccess(tszFileDir, 0)) + _xstprintf(tszFileDir, _X("%s/%s"), ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); + if (0 != _xtaccess(tszFileDir, 0)) { st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 404; HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求添加文件到数据库失败,文件不存在,文件;%s"), lpszClientAddr, tszFileDir); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,请求添加文件到数据库失败,文件不存在,文件;%s"), lpszClientAddr, tszFileDir); + return false; } if (st_ServiceCfg.st_XSql.bEnable) { Database_File_FileInsert(ppSt_DBFile[i]); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求添加文件到数据库成功,文件名:%s/%s"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求添加文件到数据库成功,文件名:%s/%s"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); } else { st_HDRParam.nHttpCode = 501; - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求添加文件到数据库失败,因为服务器没有启用此功能,文件名:%s/%s"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,请求添加文件到数据库失败,因为服务器没有启用此功能,文件名:%s/%s"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); } } HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_DBFile, nListCount); } - else if (0 == _tcsnicmp(XENGINE_STORAGE_APP_METHOD_DELETE, lpszAPIName, _tcslen(XENGINE_STORAGE_APP_METHOD_DELETE))) + else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_DELETE, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_DELETE))) { int nListCount = 0; XSTORAGECORE_DBFILE** ppSt_DBFile; @@ -208,7 +208,7 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp Protocol_StorageParse_ReportFile(lpszMsgBuffer, nMsgLen, &ppSt_DBFile, &nListCount); for (int i = 0; i < nListCount; i++) { - if (_tcslen(ppSt_DBFile[i]->st_ProtocolFile.tszFileHash) > 0) + if (_tcsxlen(ppSt_DBFile[i]->st_ProtocolFile.tszFileHash) > 0) { int nQueryCount = 0; XSTORAGECORE_DBFILE** ppSt_DBQuery; @@ -219,34 +219,34 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp st_HDRParam.nHttpCode = 501; HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求删除文件:%s HASH失败,没有启用数据库,无法使用此功能!"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFileHash); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,请求删除文件:%s HASH失败,没有启用数据库,无法使用此功能!"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFileHash); return true; } Database_File_FileQuery(&ppSt_DBQuery, &nQueryCount, NULL, NULL, NULL, NULL, NULL, ppSt_DBFile[i]->st_ProtocolFile.tszFileHash); //删除数据库与文件 for (int i = 0; i < nQueryCount; i++) { - TCHAR tszFilePath[1024]; + XCHAR tszFilePath[1024]; memset(tszFilePath, '\0', sizeof(tszFilePath)); - _stprintf(tszFilePath, _T("%s/%s"), ppSt_DBQuery[i]->st_ProtocolFile.tszFilePath, ppSt_DBQuery[i]->st_ProtocolFile.tszFileName); + _xstprintf(tszFilePath, _X("%s/%s"), ppSt_DBQuery[i]->st_ProtocolFile.tszFilePath, ppSt_DBQuery[i]->st_ProtocolFile.tszFileName); Database_File_FileDelete(NULL, NULL, NULL, ppSt_DBQuery[i]->st_ProtocolFile.tszFileHash); - _tremove(tszFilePath); + _xtremove(tszFilePath); } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求删除文件HASH成功,文件名:%s"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFileHash); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求删除文件HASH成功,文件名:%s"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFileHash); } else { int nQueryCount = 0; - TCHAR tszFileDir[1024]; + XCHAR tszFileDir[1024]; XSTORAGECORE_DBFILE** ppSt_DBQuery; memset(tszFileDir, '\0', sizeof(tszFileDir)); - if (_tcslen(ppSt_DBFile[i]->tszBuckKey) > 0) + if (_tcsxlen(ppSt_DBFile[i]->tszBuckKey) > 0) { APIHelp_Distributed_GetPathKey(st_LoadbalanceCfg.st_LoadBalance.pStl_ListBucket, ppSt_DBFile[i]->tszBuckKey, ppSt_DBFile[i]->st_ProtocolFile.tszFilePath); } - _stprintf(tszFileDir, _T("%s/%s"), ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); + _xstprintf(tszFileDir, _X("%s/%s"), ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); if (!st_ServiceCfg.st_XSql.bEnable) { @@ -254,36 +254,36 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp st_HDRParam.nHttpCode = 501; HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求删除文件:%s 名称失败,没有启用数据库,无法使用此功能!"), lpszClientAddr, tszFileDir); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,请求删除文件:%s 名称失败,没有启用数据库,无法使用此功能!"), lpszClientAddr, tszFileDir); return true; } Database_File_FileQuery(&ppSt_DBQuery, &nQueryCount, NULL, NULL, NULL, tszFileDir); //删除数据库与文件 for (int i = 0; i < nQueryCount; i++) { - TCHAR tszFilePath[1024]; + XCHAR tszFilePath[1024]; memset(tszFilePath, '\0', sizeof(tszFilePath)); - _stprintf(tszFilePath, _T("%s/%s"), ppSt_DBQuery[i]->st_ProtocolFile.tszFilePath, ppSt_DBQuery[i]->st_ProtocolFile.tszFileName); + _xstprintf(tszFilePath, _X("%s/%s"), ppSt_DBQuery[i]->st_ProtocolFile.tszFilePath, ppSt_DBQuery[i]->st_ProtocolFile.tszFileName); Database_File_FileDelete(NULL, NULL, NULL, ppSt_DBQuery[i]->st_ProtocolFile.tszFileHash); - _tremove(tszFilePath); + _xtremove(tszFilePath); } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求删除文件名称成功,文件名:%s/%s"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求删除文件名称成功,文件名:%s/%s"), lpszClientAddr, ppSt_DBFile[i]->st_ProtocolFile.tszFilePath, ppSt_DBFile[i]->st_ProtocolFile.tszFileName); } } HttpProtocol_Server_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_DBFile, nListCount); } - else if (0 == _tcsnicmp(XENGINE_STORAGE_APP_METHOD_DIR, lpszAPIName, _tcslen(XENGINE_STORAGE_APP_METHOD_DIR))) + else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_DIR, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_DIR))) { int nOPCode = 0; int nListCount = 0; - CHAR** ppszListDir = NULL; - TCHAR tszUserDir[MAX_PATH]; - TCHAR tszBuckKey[MAX_PATH]; - TCHAR tszBuckPath[MAX_PATH]; - TCHAR tszRealDir[1024]; + XCHAR** ppszListDir = NULL; + XCHAR tszUserDir[MAX_PATH]; + XCHAR tszBuckKey[MAX_PATH]; + XCHAR tszBuckPath[MAX_PATH]; + XCHAR tszRealDir[1024]; memset(tszUserDir, '\0', MAX_PATH); memset(tszBuckKey, '\0', MAX_PATH); @@ -293,30 +293,30 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp Protocol_StorageParse_DirOperator(lpszMsgBuffer, tszUserDir, tszBuckKey, &nOPCode); APIHelp_Distributed_GetPathKey(st_LoadbalanceCfg.st_LoadBalance.pStl_ListBucket, tszBuckKey, tszBuckPath); - if (_tcslen(tszUserDir) > 0) + if (_tcsxlen(tszUserDir) > 0) { - _stprintf(tszRealDir, _T("%s/%s"), tszBuckPath, tszUserDir); + _xstprintf(tszRealDir, _X("%s/%s"), tszBuckPath, tszUserDir); } else { - _stprintf(tszRealDir, _T("%s"), tszBuckPath); + _xstprintf(tszRealDir, _X("%s"), tszBuckPath); } if (0 == nOPCode) { //处理路径格式 - if (tszRealDir[_tcslen(tszRealDir) - 1] != '*') + if (tszRealDir[_tcsxlen(tszRealDir) - 1] != '*') { int nPathType = 0; BaseLib_OperatorString_GetPath(tszRealDir, &nPathType); //判断是绝对路径还是相对路径 if (1 == nPathType) { - _tcscat(tszRealDir, _T("\\*")); + _tcsxcat(tszRealDir, _X("\\*")); } else if (2 == nPathType) { - _tcscat(tszRealDir, _T("/*")); + _tcsxcat(tszRealDir, _X("/*")); } } if (!SystemApi_File_EnumFile(tszRealDir, &ppszListDir, &nListCount, NULL, NULL, true, 2)) @@ -326,14 +326,14 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求查询文件夹:%s,失败,错误:%lX"), lpszClientAddr, tszRealDir, SystemApi_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,请求查询文件夹:%s,失败,错误:%lX"), lpszClientAddr, tszRealDir, SystemApi_GetLastError()); + return false; } Protocol_StoragePacket_DirOperator(tszRVBuffer, &nRVLen, &ppszListDir, nListCount); BaseLib_OperatorMemory_Free((XPPPMEM)&ppszListDir, nListCount); HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求查询文件夹:%s,成功,文件夹个数:%d"), lpszClientAddr, tszRealDir, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求查询文件夹:%s,成功,文件夹个数:%d"), lpszClientAddr, tszRealDir, nListCount); } else if (1 == nOPCode) { @@ -344,12 +344,12 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求创建文件夹:%s,失败,错误:%lX"), lpszClientAddr, tszRealDir, SystemApi_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,请求创建文件夹:%s,失败,错误:%lX"), lpszClientAddr, tszRealDir, SystemApi_GetLastError()); + return false; } HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求创建文件夹:%s,成功"), lpszClientAddr, tszRealDir); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求创建文件夹:%s,成功"), lpszClientAddr, tszRealDir); } else if (2 == nOPCode) { @@ -360,15 +360,15 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求删除文件夹:%s,失败,错误:%lX"), lpszClientAddr, tszRealDir, SystemApi_GetLastError()); - return FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,请求删除文件夹:%s,失败,错误:%lX"), lpszClientAddr, tszRealDir, SystemApi_GetLastError()); + return false; } HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求删除文件夹:%s,成功"), lpszClientAddr, tszRealDir); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求删除文件夹:%s,成功"), lpszClientAddr, tszRealDir); } } - else if (0 == _tcsnicmp(XENGINE_STORAGE_APP_METHOD_TASK, lpszAPIName, _tcslen(XENGINE_STORAGE_APP_METHOD_TASK))) + else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_TASK, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_TASK))) { int nDLCount = 0; int nUPCount = 0; @@ -383,7 +383,7 @@ BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lp XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_DLInfo, nDLCount); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_UPInfo, nUPCount); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求获取上传下载信息成功,下载个数:%d,上传个数:%d"), lpszClientAddr, nDLCount, nUPCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求获取上传下载信息成功,下载个数:%d,上传个数:%d"), lpszClientAddr, nDLCount, nUPCount); } return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h index 8ff768f..99d9f05 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h @@ -1,9 +1,9 @@ #pragma once -#define XENGINE_STORAGE_APP_METHOD_INSERT _T("Insert") -#define XENGINE_STORAGE_APP_METHOD_DELETE _T("Delete") -#define XENGINE_STORAGE_APP_METHOD_QUERY _T("Query") -#define XENGINE_STORAGE_APP_METHOD_DIR _T("Dir") -#define XENGINE_STORAGE_APP_METHOD_TASK _T("Task") +#define XENGINE_STORAGE_APP_METHOD_INSERT _X("Insert") +#define XENGINE_STORAGE_APP_METHOD_DELETE _X("Delete") +#define XENGINE_STORAGE_APP_METHOD_QUERY _X("Query") +#define XENGINE_STORAGE_APP_METHOD_DIR _X("Dir") +#define XENGINE_STORAGE_APP_METHOD_TASK _X("Task") -BOOL XEngine_Task_Manage(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file +bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskP2p.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskP2p.cpp index 5d628ea..0fb967f 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskP2p.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskP2p.cpp @@ -2,13 +2,13 @@ XHTHREAD XEngine_Task_P2PThread() { - TCHAR tszMsgBuffer[2048]; - TCHAR tszIPAddr[128]; - TCHAR tszTimeStart[64]; - TCHAR tszTimeEnd[64]; - TCHAR tszBuckKey[MAX_PATH]; - TCHAR tszFileName[MAX_PATH]; - TCHAR tszFileHash[MAX_PATH]; + XCHAR tszMsgBuffer[2048]; + XCHAR tszIPAddr[128]; + XCHAR tszTimeStart[64]; + XCHAR tszTimeEnd[64]; + XCHAR tszBuckKey[MAX_PATH]; + XCHAR tszFileName[MAX_PATH]; + XCHAR tszFileHash[MAX_PATH]; while (bIsRun) { @@ -33,15 +33,15 @@ XHTHREAD XEngine_Task_P2PThread() Database_File_FileQuery(&pppSt_ListFile, &nListCount, tszTimeStart, tszTimeEnd, tszBuckKey, NULL, tszFileName, tszFileHash); if (nListCount > 0) { - _stprintf(pppSt_ListFile[0]->tszTableName, _T("%s:%d"), st_ServiceCfg.tszIPAddr, st_ServiceCfg.nStorageDLPort); + _xstprintf(pppSt_ListFile[0]->tszTableName, _X("%s:%d"), st_ServiceCfg.tszIPAddr, st_ServiceCfg.nStorageDLPort); Protocol_StoragePacket_QueryFile(tszMsgBuffer, &nMsgLen, &pppSt_ListFile, nListCount, tszTimeStart, tszTimeEnd, xhToken); BaseLib_OperatorMemory_Free((XPPPMEM)&pppSt_ListFile, nListCount); - SOCKET hSocket; + XSOCKET hSocket; NetCore_BroadCast_Create(&hSocket, st_ServiceCfg.st_P2xp.nSDPort, st_ServiceCfg.tszIPAddr); NetCore_BroadCast_Send(hSocket, tszMsgBuffer, nMsgLen); NetCore_BroadCast_Close(hSocket); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("广播端:%s,请求查询文件成功,Token:%llu,列表个数:%d"), tszIPAddr, xhToken, nListCount); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("广播端:%s,请求查询文件成功,Token:%llu,列表个数:%d"), tszIPAddr, xhToken, nListCount); } } } diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp index 294240a..7049266 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp @@ -1,9 +1,9 @@ #include "../StorageApp_Hdr.h" -BOOL XEngine_Task_Pass(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount) +bool XEngine_Task_Pass(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount) { int nSDLen = 2048; - TCHAR tszSDBuffer[2048]; + XCHAR tszSDBuffer[2048]; RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); @@ -12,9 +12,9 @@ BOOL XEngine_Task_Pass(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lpsz st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; //下载 - if (0 == _tcsnicmp(XENGINE_STORAGE_APP_METHOD_UPFILE, lpszAPIName, _tcslen(XENGINE_STORAGE_APP_METHOD_UPFILE))) + if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_UPFILE, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_UPFILE))) { - TCHAR tszClientAddr[128]; + XCHAR tszClientAddr[128]; XSTORAGECORE_DBFILE st_DBFile; memset(tszClientAddr, '\0', sizeof(tszClientAddr)); @@ -22,15 +22,15 @@ BOOL XEngine_Task_Pass(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lpsz Protocol_StorageParse_ProxyNotify(lpszMsgBuffer, nMsgLen, tszClientAddr, st_DBFile.tszBuckKey, st_DBFile.st_ProtocolFile.tszFileName, st_DBFile.st_ProtocolFile.tszFileHash, &st_DBFile.st_ProtocolFile.nFileSize); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求的上传文件通知协议成功,Bucket:%s,文件名:%s,大小:%d"), lpszClientAddr, st_DBFile.tszBuckKey, st_DBFile.st_ProtocolFile.tszFileName, st_DBFile.st_ProtocolFile.nFileSize); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求的上传文件通知协议成功,Bucket:%s,文件名:%s,大小:%d"), lpszClientAddr, st_DBFile.tszBuckKey, st_DBFile.st_ProtocolFile.tszFileName, st_DBFile.st_ProtocolFile.nFileSize); } - else if (0 == _tcsnicmp(XENGINE_STORAGE_APP_METHOD_DLFILE, lpszAPIName, _tcslen(XENGINE_STORAGE_APP_METHOD_DLFILE))) + else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_DLFILE, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_DLFILE))) { __int64x nFileSize = 0; - TCHAR tszPathKey[MAX_PATH]; - TCHAR tszFileName[MAX_PATH]; - TCHAR tszFileHash[MAX_PATH]; - TCHAR tszClientAddr[128]; + XCHAR tszPathKey[MAX_PATH]; + XCHAR tszFileName[MAX_PATH]; + XCHAR tszFileHash[MAX_PATH]; + XCHAR tszClientAddr[128]; memset(tszPathKey, '\0', MAX_PATH); memset(tszFileName, '\0', MAX_PATH); @@ -40,7 +40,7 @@ BOOL XEngine_Task_Pass(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lpsz Protocol_StorageParse_ProxyNotify(lpszMsgBuffer, nMsgLen, tszClientAddr, tszPathKey, tszFileName, tszFileHash, &nFileSize); HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam); XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,请求的下载文件通知协议成功,文件:%s,大小:%lld"), lpszClientAddr, tszFileName, nFileSize); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求的下载文件通知协议成功,文件:%s,大小:%lld"), lpszClientAddr, tszFileName, nFileSize); } return true; } \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.h b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.h index 3ee9a4c..9fb3a73 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.h +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.h @@ -1,3 +1,3 @@ #pragma once -BOOL XEngine_Task_Pass(LPCTSTR lpszAPIName, LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file +bool XEngine_Task_Pass(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, XCHAR** pptszListHdr, int nHdrCount); \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp index 369713b..5d1516c 100644 --- a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp +++ b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp @@ -1,6 +1,6 @@ #include "StorageApp_Hdr.h" -BOOL bIsRun = FALSE; +bool bIsRun = false; XHANDLE xhLog = NULL; XHANDLE xhHBDownload = NULL; @@ -23,7 +23,7 @@ XHANDLE xhUPHttp = NULL; XHANDLE xhDLHttp = NULL; XHANDLE xhCenterHttp = NULL; -SOCKET hBroadSocket = 0; +XSOCKET hBroadSocket = 0; shared_ptr pSTDThread = NULL; XENGINE_SERVERCONFIG st_ServiceCfg; @@ -33,8 +33,8 @@ void ServiceApp_Stop(int signo) { if (bIsRun) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("存储中心服务器退出...")); - bIsRun = FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("存储中心服务器退出...")); + bIsRun = false; HttpProtocol_Server_DestroyEx(xhUPHttp); HttpProtocol_Server_DestroyEx(xhDLHttp); @@ -114,8 +114,8 @@ int main(int argc, char** argv) #endif bIsRun = true; string m_StrVersion; - LPCTSTR lpszHTTPMime = _T("./XEngine_Config/HttpMime.types"); - LPCTSTR lpszHTTPCode = _T("./XEngine_Config/HttpCode.types"); + LPCXSTR lpszHTTPMime = _X("./XEngine_Config/HttpMime.types"); + LPCXSTR lpszHTTPCode = _X("./XEngine_Config/HttpCode.types"); HELPCOMPONENTS_XLOG_CONFIGURE st_XLogConfig; THREADPOOL_PARAMENT** ppSt_ListUPThread; THREADPOOL_PARAMENT** ppSt_ListDLThread; @@ -133,16 +133,16 @@ int main(int argc, char** argv) if (st_ServiceCfg.st_Memory.bReload) { //重载配置文件后退出 - TCHAR tszAddr[128]; + XCHAR tszAddr[128]; memset(tszAddr, '\0', sizeof(tszAddr)); - _stprintf(tszAddr, _T("Http://127.0.0.1:%d/Api/Manage/Config"), st_ServiceCfg.nCenterPort); - APIClient_Http_Request(_T("POST"), tszAddr); + _xstprintf(tszAddr, _X("Http://127.0.0.1:%d/Api/Manage/Config"), st_ServiceCfg.nCenterPort); + APIClient_Http_Request(_X("POST"), tszAddr); return 0; } st_XLogConfig.XLog_MaxBackupFile = st_ServiceCfg.st_XLog.nMaxCount; st_XLogConfig.XLog_MaxSize = st_ServiceCfg.st_XLog.nMaxSize; - _tcscpy(st_XLogConfig.tszFileName, _T("./XEngine_XLog/XEngine_StorageApp.log")); + _tcsxcpy(st_XLogConfig.tszFileName, _X("./XEngine_XLog/XEngine_StorageApp.log")); xhLog = HelpComponents_XLog_Init(HELPCOMPONENTS_XLOG_OUTTYPE_FILE | HELPCOMPONENTS_XLOG_OUTTYPE_STD, &st_XLogConfig); if (NULL == xhLog) @@ -152,119 +152,119 @@ int main(int argc, char** argv) } HelpComponents_XLog_SetLogPriority(xhLog, st_ServiceCfg.st_XLog.nLogLeave); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化日志系统成功")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化日志系统成功")); if (st_ServiceCfg.bDeamon) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,使用守护进程启动服务...")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,使用守护进程启动服务...")); ServiceApp_Deamon(1); } signal(SIGINT, ServiceApp_Stop); signal(SIGTERM, ServiceApp_Stop); signal(SIGABRT, ServiceApp_Stop); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化服务器信号管理成功")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化服务器信号管理成功")); xhLimit = Algorithm_Calculation_Create(); if (NULL == xhLimit) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,创建流量限速对象模式失败,错误:%lX"), Algorithm_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,创建流量限速对象模式失败,错误:%lX"), Algorithm_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,创建流量限速对象模式成功")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,创建流量限速对象模式成功")); if (st_ServiceCfg.st_XTime.bHBTime) { xhHBDownload = SocketOpt_HeartBeat_InitEx(st_ServiceCfg.st_XTime.nStorageTimeOut, st_ServiceCfg.st_XTime.nTimeCheck, XEngine_Callback_HBDownload); if (NULL == xhHBDownload) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化下载心跳管理服务失败,错误:%lX"), NetCore_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化下载心跳管理服务失败,错误:%lX"), NetCore_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化下载心跳管理服务成功,时间:%d,次数:%d"), st_ServiceCfg.st_XTime.nStorageTimeOut, st_ServiceCfg.st_XTime.nTimeCheck); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化下载心跳管理服务成功,时间:%d,次数:%d"), st_ServiceCfg.st_XTime.nStorageTimeOut, st_ServiceCfg.st_XTime.nTimeCheck); xhHBUPLoader = SocketOpt_HeartBeat_InitEx(st_ServiceCfg.st_XTime.nStorageTimeOut, st_ServiceCfg.st_XTime.nTimeCheck, XEngine_Callback_HBUPLoader); if (NULL == xhHBUPLoader) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化上传心跳管理服务失败,错误:%lX"), NetCore_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化上传心跳管理服务失败,错误:%lX"), NetCore_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化上传心跳管理服务成功,时间:%d,次数:%d"), st_ServiceCfg.st_XTime.nStorageTimeOut, st_ServiceCfg.st_XTime.nTimeCheck); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化上传心跳管理服务成功,时间:%d,次数:%d"), st_ServiceCfg.st_XTime.nStorageTimeOut, st_ServiceCfg.st_XTime.nTimeCheck); xhHBCenter = SocketOpt_HeartBeat_InitEx(st_ServiceCfg.st_XTime.nCenterTimeOut, st_ServiceCfg.st_XTime.nTimeCheck, XEngine_Callback_HBCenter); if (NULL == xhHBCenter) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化业务管理服务失败,错误:%lX"), NetCore_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化业务管理服务失败,错误:%lX"), NetCore_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化业务管理服务成功,时间:%d,次数:%d"), st_ServiceCfg.st_XTime.nCenterTimeOut, st_ServiceCfg.st_XTime.nTimeCheck); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化业务管理服务成功,时间:%d,次数:%d"), st_ServiceCfg.st_XTime.nCenterTimeOut, st_ServiceCfg.st_XTime.nTimeCheck); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("启动服务中,心跳管理服务配置为不启用...")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,心跳管理服务配置为不启用...")); } if (st_ServiceCfg.st_XSql.bEnable) { if (!Database_File_Init((DATABASE_MYSQL_CONNECTINFO*)&st_ServiceCfg.st_XSql, st_ServiceCfg.st_XTime.nDBMonth)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化MYSQL数据库服务失败,错误:%lX"), Database_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化MYSQL数据库服务失败,错误:%lX"), Database_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化MYSQL数据库服务成功,数据库地址:%s"), st_ServiceCfg.st_XSql.tszSQLAddr); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化MYSQL数据库服务成功,数据库地址:%s"), st_ServiceCfg.st_XSql.tszSQLAddr); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("启动服务中,初始化数据库失败,数据库被设置为禁用,相关功能已经被禁止使用!")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,初始化数据库失败,数据库被设置为禁用,相关功能已经被禁止使用!")); } if (!Session_User_Init(st_ServiceCfg.st_XProxy.st_XProxyAuth.tszUserList)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动用户管理服务失败,错误:%lX"), Session_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动用户管理服务失败,错误:%lX"), Session_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动用户管理服务成功")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动用户管理服务成功")); //启动下载服务 if (st_ServiceCfg.nStorageDLPort > 0) { xhDLHttp = HttpProtocol_Server_InitEx(lpszHTTPCode, lpszHTTPMime, st_ServiceCfg.st_XMax.nStorageDLThread); if (NULL == xhDLHttp) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化HTTP下载服务失败,错误:%lX"), HttpProtocol_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化HTTP下载服务失败,错误:%lX"), HttpProtocol_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化HTTP下载服务成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nStorageDLThread); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化HTTP下载服务成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nStorageDLThread); if (!Session_DLStroage_Init(st_ServiceCfg.st_XLimit.nMaxDNConnect)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动下载会话服务失败,错误:%lX"), Session_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动下载会话服务失败,错误:%lX"), Session_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动下载会话服务成功,下载限速模式:%s,连接数限制;%d"), st_ServiceCfg.st_XLimit.bLimitMode ? "开" : "关", st_ServiceCfg.st_XLimit.nMaxDNConnect); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动下载会话服务成功,下载限速模式:%s,连接数限制;%d"), st_ServiceCfg.st_XLimit.bLimitMode ? "开" : "关", st_ServiceCfg.st_XLimit.nMaxDNConnect); if (st_ServiceCfg.st_XCert.bDLEnable) { - xhDLSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, NULL, st_ServiceCfg.st_XCert.tszCertKey, FALSE, FALSE, (ENUM_XENGINE_OPENSSL_PROTOCOL)st_ServiceCfg.st_XCert.nSslType); + xhDLSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, NULL, st_ServiceCfg.st_XCert.tszCertKey, false, false, (ENUM_XENGINE_OPENSSL_PROTOCOL)st_ServiceCfg.st_XCert.nSslType); if (NULL == xhDLSsl) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动下载SSL服务失败,错误:%lX"), Session_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动下载SSL服务失败,错误:%lX"), Session_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动下载SSL服务成功,证书链:%s,证书Key:%s,验证模式:%d"), st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertKey, st_ServiceCfg.st_XCert.nSslType); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动下载SSL服务成功,证书链:%s,证书Key:%s,验证模式:%d"), st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertKey, st_ServiceCfg.st_XCert.nSslType); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("启动服务中,检测到没有启用下载SSL服务")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,检测到没有启用下载SSL服务")); } - xhNetDownload = NetCore_TCPXCore_StartEx(st_ServiceCfg.nStorageDLPort, st_ServiceCfg.st_XMax.nMaxClient, st_ServiceCfg.st_XMax.nIOThread, FALSE, st_ServiceCfg.bReuseraddr); + xhNetDownload = NetCore_TCPXCore_StartEx(st_ServiceCfg.nStorageDLPort, st_ServiceCfg.st_XMax.nMaxClient, st_ServiceCfg.st_XMax.nIOThread, false, st_ServiceCfg.bReuseraddr); if (NULL == xhNetDownload) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动下载存储网络服务失败,端口:%d,错误:%lX,%d"), st_ServiceCfg.nStorageDLPort, NetCore_GetLastError(), errno); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动下载存储网络服务失败,端口:%d,错误:%lX,%d"), st_ServiceCfg.nStorageDLPort, NetCore_GetLastError(), errno); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动下载存储网络服务成功,端口:%d,IO线程个数:%d"), st_ServiceCfg.nStorageDLPort, st_ServiceCfg.st_XMax.nIOThread); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动下载存储网络服务成功,端口:%d,IO线程个数:%d"), st_ServiceCfg.nStorageDLPort, st_ServiceCfg.st_XMax.nIOThread); NetCore_TCPXCore_RegisterCallBackEx(xhNetDownload, XEngine_Callback_DownloadLogin, XEngine_Callback_DownloadRecv, XEngine_Callback_DownloadLeave); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,注册下载存储网络服务事件成功!")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,注册下载存储网络服务事件成功!")); BaseLib_OperatorMemory_Malloc((XPPPMEM)&ppSt_ListDLThread, st_ServiceCfg.st_XMax.nStorageDLThread, sizeof(THREADPOOL_PARAMENT)); for (int i = 0; i < st_ServiceCfg.st_XMax.nStorageDLThread; i++) @@ -278,10 +278,10 @@ int main(int argc, char** argv) xhDLPool = ManagePool_Thread_NQCreate(&ppSt_ListDLThread, st_ServiceCfg.st_XMax.nStorageDLThread); if (NULL == xhDLPool) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动HTTP下载处理线程池失败,错误:%d"), errno); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动HTTP下载处理线程池失败,错误:%d"), errno); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动HTTP下载任务处理线程池成功,线程池个数:%d"), st_ServiceCfg.st_XMax.nStorageDLThread); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动HTTP下载任务处理线程池成功,线程池个数:%d"), st_ServiceCfg.st_XMax.nStorageDLThread); } //启动上传服务 if (st_ServiceCfg.nStorageUPPort > 0) @@ -289,42 +289,42 @@ int main(int argc, char** argv) xhUPHttp = HttpProtocol_Server_InitEx(lpszHTTPCode, lpszHTTPMime, st_ServiceCfg.st_XMax.nStorageUPThread); if (NULL == xhDLHttp) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化HTTP上传服务失败,错误:%lX"), HttpProtocol_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化HTTP上传服务失败,错误:%lX"), HttpProtocol_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化HTTP上传服务成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nStorageUPThread); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化HTTP上传服务成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nStorageUPThread); if (!Session_UPStroage_Init(st_ServiceCfg.st_XLimit.nMaxUPConnect, st_ServiceCfg.st_XStorage.bResumable)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动上传会话服务失败,错误:%lX"), Session_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动上传会话服务失败,错误:%lX"), Session_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动上传会话服务成功,连接数限制;%d"), st_ServiceCfg.st_XLimit.nMaxUPConnect); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动上传会话服务成功,连接数限制;%d"), st_ServiceCfg.st_XLimit.nMaxUPConnect); if (st_ServiceCfg.st_XCert.bUPEnable) { - xhUPSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, NULL, st_ServiceCfg.st_XCert.tszCertKey, FALSE, FALSE, (ENUM_XENGINE_OPENSSL_PROTOCOL)st_ServiceCfg.st_XCert.nSslType); + xhUPSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, NULL, st_ServiceCfg.st_XCert.tszCertKey, false, false, (ENUM_XENGINE_OPENSSL_PROTOCOL)st_ServiceCfg.st_XCert.nSslType); if (NULL == xhUPSsl) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动上传SSL服务失败,错误:%lX"), Session_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动上传SSL服务失败,错误:%lX"), Session_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动上传SSL服务成功,证书链:%s,证书Key:%s,验证模式:%d"), st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertKey, st_ServiceCfg.st_XCert.nSslType); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动上传SSL服务成功,证书链:%s,证书Key:%s,验证模式:%d"), st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertKey, st_ServiceCfg.st_XCert.nSslType); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("启动服务中,检测到没有启用上传SSL服务")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,检测到没有启用上传SSL服务")); } - xhNetUPLoader = NetCore_TCPXCore_StartEx(st_ServiceCfg.nStorageUPPort, st_ServiceCfg.st_XMax.nMaxClient, st_ServiceCfg.st_XMax.nIOThread, FALSE, st_ServiceCfg.bReuseraddr); + xhNetUPLoader = NetCore_TCPXCore_StartEx(st_ServiceCfg.nStorageUPPort, st_ServiceCfg.st_XMax.nMaxClient, st_ServiceCfg.st_XMax.nIOThread, false, st_ServiceCfg.bReuseraddr); if (NULL == xhNetUPLoader) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动上传存储网络服务失败,端口:%d,错误:%lX"), st_ServiceCfg.nStorageUPPort, NetCore_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动上传存储网络服务失败,端口:%d,错误:%lX"), st_ServiceCfg.nStorageUPPort, NetCore_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动上传存储网络服务成功,端口:%d,IO线程个数:%d"), st_ServiceCfg.nStorageUPPort, st_ServiceCfg.st_XMax.nIOThread); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动上传存储网络服务成功,端口:%d,IO线程个数:%d"), st_ServiceCfg.nStorageUPPort, st_ServiceCfg.st_XMax.nIOThread); NetCore_TCPXCore_RegisterCallBackEx(xhNetUPLoader, XEngine_Callback_UPLoaderLogin, XEngine_Callback_UPLoaderRecv, XEngine_Callback_UPLoaderLeave); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,注册上传存储网络服务事件成功!")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,注册上传存储网络服务事件成功!")); BaseLib_OperatorMemory_Malloc((XPPPMEM)&ppSt_ListUPThread, st_ServiceCfg.st_XMax.nStorageUPThread, sizeof(THREADPOOL_PARAMENT)); for (int i = 0; i < st_ServiceCfg.st_XMax.nStorageUPThread; i++) @@ -338,10 +338,10 @@ int main(int argc, char** argv) xhUPPool = ManagePool_Thread_NQCreate(&ppSt_ListUPThread, st_ServiceCfg.st_XMax.nStorageDLThread); if (NULL == xhUPPool) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动HTTP上传处理线程池失败,错误:%d"), errno); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动HTTP上传处理线程池失败,错误:%d"), errno); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动HTTP上传任务处理线程池成功,线程池个数:%d"), st_ServiceCfg.st_XMax.nStorageDLThread); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动HTTP上传任务处理线程池成功,线程池个数:%d"), st_ServiceCfg.st_XMax.nStorageDLThread); } //启动接口服务 if (st_ServiceCfg.nCenterPort > 0) @@ -349,35 +349,35 @@ int main(int argc, char** argv) xhCenterHttp = HttpProtocol_Server_InitEx(lpszHTTPCode, lpszHTTPMime, st_ServiceCfg.st_XMax.nCenterThread); if (NULL == xhCenterHttp) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,初始化HTTP业务服务失败,错误:%lX"), HttpProtocol_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,初始化HTTP业务服务失败,错误:%lX"), HttpProtocol_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,初始化HTTP业务服务成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nCenterThread); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,初始化HTTP业务服务成功,IO线程个数:%d"), st_ServiceCfg.st_XMax.nCenterThread); if (st_ServiceCfg.st_XCert.bCHEnable) { - xhCHSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, NULL, st_ServiceCfg.st_XCert.tszCertKey, FALSE, FALSE, (ENUM_XENGINE_OPENSSL_PROTOCOL)st_ServiceCfg.st_XCert.nSslType); + xhCHSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, NULL, st_ServiceCfg.st_XCert.tszCertKey, false, false, (ENUM_XENGINE_OPENSSL_PROTOCOL)st_ServiceCfg.st_XCert.nSslType); if (NULL == xhCHSsl) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动业务SSL服务失败,错误:%lX"), Session_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动业务SSL服务失败,错误:%lX"), Session_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动业务SSL服务成功,证书链:%s,证书Key:%s,验证模式:%d"), st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertKey, st_ServiceCfg.st_XCert.nSslType); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动业务SSL服务成功,证书链:%s,证书Key:%s,验证模式:%d"), st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertKey, st_ServiceCfg.st_XCert.nSslType); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("启动服务中,检测到没有启用业务SSL服务")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,检测到没有启用业务SSL服务")); } - xhNetCenter = NetCore_TCPXCore_StartEx(st_ServiceCfg.nCenterPort, st_ServiceCfg.st_XMax.nMaxClient, st_ServiceCfg.st_XMax.nIOThread, FALSE, st_ServiceCfg.bReuseraddr); + xhNetCenter = NetCore_TCPXCore_StartEx(st_ServiceCfg.nCenterPort, st_ServiceCfg.st_XMax.nMaxClient, st_ServiceCfg.st_XMax.nIOThread, false, st_ServiceCfg.bReuseraddr); if (NULL == xhNetCenter) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动业务控制存储网络服务失败,端口:%d,错误:%lX"), st_ServiceCfg.nCenterPort, NetCore_GetLastError()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动业务控制存储网络服务失败,端口:%d,错误:%lX"), st_ServiceCfg.nCenterPort, NetCore_GetLastError()); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动业务控制存储网络服务成功,端口:%d,IO线程个数:%d"), st_ServiceCfg.nCenterPort, st_ServiceCfg.st_XMax.nIOThread); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动业务控制存储网络服务成功,端口:%d,IO线程个数:%d"), st_ServiceCfg.nCenterPort, st_ServiceCfg.st_XMax.nIOThread); NetCore_TCPXCore_RegisterCallBackEx(xhNetCenter, XEngine_Callback_CenterLogin, XEngine_Callback_CenterRecv, XEngine_Callback_CenterLeave); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,注册业务控制存储存储网络服务事件成功!")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,注册业务控制存储存储网络服务事件成功!")); BaseLib_OperatorMemory_Malloc((XPPPMEM)&ppSt_ListCTThread, st_ServiceCfg.st_XMax.nCenterThread, sizeof(THREADPOOL_PARAMENT)); for (int i = 0; i < st_ServiceCfg.st_XMax.nCenterThread; i++) @@ -391,34 +391,34 @@ int main(int argc, char** argv) xhCTPool = ManagePool_Thread_NQCreate(&ppSt_ListCTThread, st_ServiceCfg.st_XMax.nCenterThread); if (NULL == xhCTPool) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动HTTP业务处理线程池失败,错误:%d"), errno); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动HTTP业务处理线程池失败,错误:%d"), errno); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动HTTP业务任务处理线程池成功,线程池个数:%d"), st_ServiceCfg.st_XMax.nCenterThread); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动HTTP业务任务处理线程池成功,线程池个数:%d"), st_ServiceCfg.st_XMax.nCenterThread); } //只有使用了数据库,才启用P2P if (st_ServiceCfg.st_XSql.bEnable) { if (!NetCore_BroadCast_Create(&hBroadSocket, st_ServiceCfg.st_P2xp.nRVPort)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动P2P存储广播服务失败,错误:%d"), errno); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动P2P存储广播服务失败,错误:%d"), errno); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动P2P存储广播服务成功,端口:%d"), st_ServiceCfg.st_P2xp.nRVPort); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动P2P存储广播服务成功,端口:%d"), st_ServiceCfg.st_P2xp.nRVPort); pSTDThread = make_shared(XEngine_Task_P2PThread); if (!pSTDThread->joinable()) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("启动服务中,启动P2P存储广播服务线程失败,错误:%d"), errno); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动P2P存储广播服务线程失败,错误:%d"), errno); goto XENGINE_EXITAPP; } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("启动服务中,启动P2P存储广播服务线程成功")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动P2P存储广播服务线程成功")); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("启动服务中,P2P存储服务配置为不启动")); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,P2P存储服务配置为不启动")); } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("所有服务成功启动,存储中心服务运行中,发行版本次数:%d,XEngine版本:%s 当前运行版本:%s。。。"), st_ServiceCfg.st_XVer.pStl_ListStorage->size(), BaseLib_OperatorVer_XGetStr(), st_ServiceCfg.st_XVer.pStl_ListStorage->front().c_str()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("所有服务成功启动,存储中心服务运行中,发行版本次数:%d,XEngine版本:%s 当前运行版本:%s。。。"), st_ServiceCfg.st_XVer.pStl_ListStorage->size(), BaseLib_OperatorVer_XGetStr(), st_ServiceCfg.st_XVer.pStl_ListStorage->front().c_str()); while (true) { @@ -429,8 +429,8 @@ XENGINE_EXITAPP: if (bIsRun) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("存储中心服务关闭,服务器退出...")); - bIsRun = FALSE; + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("存储中心服务关闭,服务器退出...")); + bIsRun = false; HttpProtocol_Server_DestroyEx(xhUPHttp); HttpProtocol_Server_DestroyEx(xhDLHttp); diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile b/XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile index 9302ec2..39af933 100644 --- a/XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile @@ -1,52 +1,66 @@ CC = g++ -Wall -std=c++17 -fPIC -SHAREFLAG = -shared -SHAREDLL = so +PLATFORM = linux +PLATVER = +PLATDIR = +FILEEXT = +LIBFLAG = RELEASE = 0 UNICODE = 0 -INCLUDE = -I ./ -FILECENTOS = /etc/redhat-release -LOADBIN = +LOADHDR = -I ./ +LOADSO = -L LIB = -LIBEX = -ldl -lpthread -LOADSO = -Wl,-rpath= -LIBINCLUDE = json_reader.o json_value.o json_writer.o - -ifeq ($(shell uname),Darwin) - SHAREDLL = dylib - SHAREFLAG = -dynamiclib - LOADSO = -else - SHAREDLL = so - SHAREFLAG = -shared -endif +LIBEX = +OBJECTS = json_reader.o json_value.o json_writer.o ifeq ($(RELEASE),1) -FLAGS = -c -O2 -DEBUG = +FLAGS = -c +DEBUG = else -FLAGS = -c -DEBUG = -g +FLAGS = -c -lc_p +DEBUG = -g -pg endif ifeq ($(UNICODE),1) UNICODE = -D _UNICODE else -UNICODE = +UNICODE = +endif + +ifeq ($(PLATFORM),linux) + ifeq (/etc/redhat-release,$(wildcard /etc/redhat-release)) + PLATVER = -D __CENTOS__ + PLATDIR = XEngine_Linux/Centos + else + PLATVER = -D __UBUNTU__ + PLATDIR = XEngine_Linux/Ubuntu + endif + FILEEXT = so + LIBFLAG = -shared + LIBEX = -lpthread -lrt -ldl + LOADBIN = -Wl,-rpath=./,--disable-new-dtags +else ifeq ($(PLATFORM),mac) + CC += -Wno-deprecated-declarations + PLATVER = -D __MACOS__ + PLATDIR = XEngine_Mac + FILEEXT = dylib + LIBFLAG = -dynamiclib + LIBEX = -lpthread -ldl + LOADBIN = -Wl,-rpath,@loader_path/./ endif -all:$(LIBINCLUDE) - $(CC) $(DEBUG) $(LIBINCLUDE) -o libjsoncpp.$(SHAREDLL) $(SHAREFLAG) -fPIC $(LOADBIN) $(LIB) $(LIBEX) $(LOADSO) +all:$(OBJECTS) + $(CC) $(DEBUG) $(OBJECTS) -o libjsoncpp.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) json_reader.o:json_reader.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) json_reader.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) json_reader.cpp json_value.o:json_value.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) json_value.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) json_value.cpp json_writer.o:json_writer.cpp - $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) json_writer.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) json_writer.cpp InstallAll:InstallSo -InstallSo:./libjsoncpp.$(SHAREDLL) - cp ./libjsoncpp.$(SHAREDLL) ../../../XEngine_Release/libjsoncpp.$(SHAREDLL) +InstallSo:./libjsoncpp.$(FILEEXT) + cp ./libjsoncpp.$(FILEEXT) ../../../XEngine_Release/libjsoncpp.$(FILEEXT) @@ -54,4 +68,4 @@ CleanAll:CleanObj CleanMk CleanObj: rm *.o CleanMk: - rm *.$(SHAREDLL) + rm *.$(FILEEXT) diff --git a/XEngine_Source/XStorage_Protocol.h b/XEngine_Source/XStorage_Protocol.h index 6ef5661..7e4fb7d 100644 --- a/XEngine_Source/XStorage_Protocol.h +++ b/XEngine_Source/XStorage_Protocol.h @@ -26,44 +26,44 @@ //文件传输头文件,可用于P2XP文件传输和组包管理模块文件传输 typedef struct tag_XEngine_Protocol_File { - CHAR tszFilePath[MAX_PATH]; //文件路径 - CHAR tszFileName[MAX_PATH]; //文件名称,文件传输的时候才需要,其他时候不需要 - CHAR tszFileHash[MAX_PATH]; //文件HASH值,MD5或者HASH1 256等...不能超过260字节大小 - CHAR tszFileUser[128]; //文件所属用户 - CHAR tszFileTime[64]; //文件创建时间,如果这个参数不填,那么服务器将会设置为接受到的文件时间 + XCHAR tszFilePath[MAX_PATH]; //文件路径 + XCHAR tszFileName[MAX_PATH]; //文件名称,文件传输的时候才需要,其他时候不需要 + XCHAR tszFileHash[MAX_PATH]; //文件HASH值,MD5或者HASH1 256等...不能超过260字节大小 + XCHAR tszFileUser[128]; //文件所属用户 + XCHAR tszFileTime[64]; //文件创建时间,如果这个参数不填,那么服务器将会设置为接受到的文件时间 __int64x nFileSize; //文件大小 }XENGINE_PROTOCOL_FILE, * LPXENGINE_PROTOCOL_FILE; //连接信息 typedef struct tag_XEngine_P2XPPeer_Protocol { - CHAR tszUserName[64]; //用户信息 - CHAR tszPrivateAddr[32]; //私有本地地址,内网地址 - CHAR tszPublicAddr[32]; //外网地址 - CHAR tszConnectAddr[32]; //链接地址 - WORD dwConnectType; //连接类型 - WORD dwPeerType; //节点类型 + XCHAR tszUserName[64]; //用户信息 + XCHAR tszPrivateAddr[32]; //私有本地地址,内网地址 + XCHAR tszPublicAddr[32]; //外网地址 + XCHAR tszConnectAddr[32]; //链接地址 + XSHOT dwConnectType; //连接类型 + XSHOT dwPeerType; //节点类型 }XENGINE_P2XPPEER_PROTOCOL, * LPXENGINE_P2XPPEER_PROTOCOL; //P2XP通道连接命令 typedef struct tag_XEngine_P2XPIO_Protocol { - CHAR tszSourceUser[32]; //请求连接的用户 - CHAR tszDestUser[32]; //要连接的用户 - CHAR tszConnectAddr[32]; //连接的IP地址 + XCHAR tszSourceUser[32]; //请求连接的用户 + XCHAR tszDestUser[32]; //要连接的用户 + XCHAR tszConnectAddr[32]; //连接的IP地址 int nDestPort; //要连接的端口 - BOOL bIsTcp; //连接类型TCP,否则为UDP + bool bIsTcp; //连接类型TCP,否则为UDP }XENGINE_P2XPIO_PROTOCOL, * LPXENGINE_P2XPIO_PROTOCOL; //IP地址信息 typedef struct { - TCHAR tszIPStart[128]; - TCHAR tszIPEnd[128]; - TCHAR tszIPAddr[128]; //IP地址 - TCHAR tszIPCountry[128]; //国家/地区 - TCHAR tszIPProvince[128]; //省/自治区 - TCHAR tszIPCity[128]; //市 - TCHAR tszIPCounty[128]; //县 - TCHAR tszIPAddress[128]; //详细地址 - TCHAR tszIPISP[128]; //运营商 - TCHAR tszIPTime[128]; //数据库日期 + XCHAR tszIPStart[128]; + XCHAR tszIPEnd[128]; + XCHAR tszIPAddr[128]; //IP地址 + XCHAR tszIPCountry[128]; //国家/地区 + XCHAR tszIPProvince[128]; //省/自治区 + XCHAR tszIPCity[128]; //市 + XCHAR tszIPCounty[128]; //县 + XCHAR tszIPAddress[128]; //详细地址 + XCHAR tszIPISP[128]; //运营商 + XCHAR tszIPTime[128]; //数据库日期 }XENGINE_IPADDRINFO; #pragma pack(pop) \ No newline at end of file -- Gitee From 55cb8785194dd6d643943b43003abfb9507812a7 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 18 Apr 2023 11:11:22 +0800 Subject: [PATCH 03/13] modify:database used to utf charset --- .../StorageModule_Database/Database_File/Database_File.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp b/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp index 194d50e..317003d 100644 --- a/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp +++ b/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp @@ -53,14 +53,9 @@ bool CDatabase_File::Database_File_Init(DATABASE_MYSQL_CONNECTINFO *pSt_DBConnec return false; } m_nTimeMonth = nTimeDay; -#ifdef _WINDOWS - LPCXSTR lpszStrCharset = _X("gbk"); -#else - LPCXSTR lpszStrCharset = _X("utf8"); -#endif //连接数据库 _tcsxcpy(pSt_DBConnector->tszDBName, _X("XEngine_Storage")); - if (!DataBase_MySQL_Connect(&xhDBSQL, pSt_DBConnector, 5, true, lpszStrCharset)) + if (!DataBase_MySQL_Connect(&xhDBSQL, pSt_DBConnector, 5, true, _X("utf8"))) { Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); -- Gitee From f36763a7a297c0665dbc550f9bfd12009fe381d4 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 19 Apr 2023 09:12:29 +0800 Subject: [PATCH 04/13] update:exmaple --- .../APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp b/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp index 385eac7..6ef6b2b 100644 --- a/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp +++ b/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp @@ -144,7 +144,7 @@ BOOL HelpModule_Api_BuildVer(TCHAR* ptszLocalBuffer, TCHAR* ptszRemoteBuffer, in _tcscpy(tszSubPath, stl_ListIterator->tszFilePath); tszDelPath[_tcslen(tszDelPath) - 2] = '\0'; - BaseLib_OperatorString_DelLastForChar(tszDelPath, '\\'); + BaseLib_OperatorString_DelSub(tszDelPath, "\\"); _tcscat(tszDelPath, "\\"); BaseLib_OperatorString_DelSub(tszSubPath, tszDelPath); -- Gitee From ff4f1d05f04bb2e1df19a0bc9249c79c02310516 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 19 Apr 2023 09:35:49 +0800 Subject: [PATCH 05/13] update:support x64 build for example --- .../APPClient_Download/APPClient_Download.cpp | 62 ++++++++-------- .../APPClient_Download.vcxproj | 6 +- .../APPClient_RestApi/APPClient_RestApi.cpp | 70 ++++++++++--------- .../APPClient_RestApi.vcxproj | 2 + .../APPClient_UPFile/APPClient_UPFile.cpp | 40 +++++------ .../APPClient_UPFile/APPClient_UPFile.vcxproj | 6 +- .../APPClient_UPFile/APPClient_UPHdr.h | 22 +++--- .../APPClient_UPFile/APPClient_UPInstall.h | 40 +++++------ .../APPClient_UPFile/APPClient_UPTask.h | 68 +++++++++--------- .../APPClient_UPMaker/APPClient_UPMaker.cpp | 64 +++++++++-------- .../APPClient_UPMaker.vcxproj | 6 +- .../APPClient_UPDownload.cpp | 66 +++++++++-------- .../APPClient_UPDownload.vcxproj | 4 +- XEngine_APPClient/VSCopy_x64.bat | 11 +++ 14 files changed, 256 insertions(+), 211 deletions(-) create mode 100644 XEngine_APPClient/VSCopy_x64.bat diff --git a/XEngine_APPClient/APPClient_Download/APPClient_Download.cpp b/XEngine_APPClient/APPClient_Download/APPClient_Download.cpp index 252a609..dbbb47e 100644 --- a/XEngine_APPClient/APPClient_Download/APPClient_Download.cpp +++ b/XEngine_APPClient/APPClient_Download/APPClient_Download.cpp @@ -5,11 +5,15 @@ #ifdef _MSC_BUILD #include #include -#pragma comment(lib,"x86/XEngine_BaseLib/XEngine_BaseLib") -#pragma comment(lib,"x86/XEngine_NetHelp/NetHelp_APIClient") -#pragma comment(lib,"x86/XEngine_SystemSdk/XEngine_SystemApi") +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") +#pragma comment(lib,"XEngine_NetHelp/NetHelp_APIClient") +#pragma comment(lib,"XEngine_SystemSdk/XEngine_SystemApi") #pragma comment(lib,"Ws2_32") +#ifdef _WIN64 +#pragma comment(lib,"../../XEngine_Source/x64/Debug/jsoncpp") +#else #pragma comment(lib,"../../XEngine_Source/Debug/jsoncpp") +#endif #else #endif #include @@ -29,19 +33,19 @@ using namespace std; //需要优先配置XEngine -//WINDOWS使用VS2022 x86 debug 编译 +//WINDOWS使用VS2022 x86 或者 x64 debug 编译 //linux::g++ -std=c++17 -Wall -g APPClient_Download.cpp -o APPClient_Download.exe -I ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_NetHelp -L /usr/local/lib/XEngine_Release/XEngine_SystemSdk -L ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -lXEngine_BaseLib -lNetHelp_APIClient -lXEngine_SystemApi -ljsoncpp //macos::g++ -std=c++17 -Wall -g APPClient_Download.cpp -o APPClient_Download.exe -I ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -L ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -lXEngine_BaseLib -lNetHelp_APIClient -lXEngine_SystemApi -ljsoncpp typedef struct { XENGINE_PROTOCOL_FILE st_ProtocolFile; - CHAR tszBuckKey[128]; - CHAR tszIPAddr[64]; + XCHAR tszBuckKey[128]; + XCHAR tszIPAddr[64]; }P2PFILE_INFO; //解析局域网中所有文件 -void P2PParse_List(LPCTSTR lpszMsgBuffer, int nMsgLen, list* pStl_ListFile) +void P2PParse_List(LPCXSTR lpszMsgBuffer, int nMsgLen, list* pStl_ListFile) { Json::Value st_JsonRoot; Json::CharReaderBuilder st_JsonBuild; @@ -64,13 +68,13 @@ void P2PParse_List(LPCTSTR lpszMsgBuffer, int nMsgLen, list* pStl_ memset(&st_P2PFile, '\0', sizeof(P2PFILE_INFO)); st_P2PFile.st_ProtocolFile.nFileSize = st_JsonArray[i]["nFileSize"].asInt(); - _tcscpy(st_P2PFile.st_ProtocolFile.tszFileHash, st_JsonArray[i]["tszFileHash"].asCString()); - _tcscpy(st_P2PFile.st_ProtocolFile.tszFileName, st_JsonArray[i]["tszFileName"].asCString()); - _tcscpy(st_P2PFile.st_ProtocolFile.tszFilePath, st_JsonArray[i]["tszFilePath"].asCString()); - _tcscpy(st_P2PFile.st_ProtocolFile.tszFileTime, st_JsonArray[i]["tszFileTime"].asCString()); - _tcscpy(st_P2PFile.st_ProtocolFile.tszFileUser, st_JsonArray[i]["tszFileUser"].asCString()); - _tcscpy(st_P2PFile.tszIPAddr, st_JsonArray[i]["tszTableName"].asCString()); - _tcscpy(st_P2PFile.tszBuckKey, st_JsonArray[i]["tszBuckKey"].asCString()); + _tcsxcpy(st_P2PFile.st_ProtocolFile.tszFileHash, st_JsonArray[i]["tszFileHash"].asCString()); + _tcsxcpy(st_P2PFile.st_ProtocolFile.tszFileName, st_JsonArray[i]["tszFileName"].asCString()); + _tcsxcpy(st_P2PFile.st_ProtocolFile.tszFilePath, st_JsonArray[i]["tszFilePath"].asCString()); + _tcsxcpy(st_P2PFile.st_ProtocolFile.tszFileTime, st_JsonArray[i]["tszFileTime"].asCString()); + _tcsxcpy(st_P2PFile.st_ProtocolFile.tszFileUser, st_JsonArray[i]["tszFileUser"].asCString()); + _tcsxcpy(st_P2PFile.tszIPAddr, st_JsonArray[i]["tszTableName"].asCString()); + _tcsxcpy(st_P2PFile.tszBuckKey, st_JsonArray[i]["tszBuckKey"].asCString()); pStl_ListFile->push_back(st_P2PFile); } @@ -82,7 +86,7 @@ typedef struct __int64x nPosStart; __int64x nPosEnd; }P2PFILE_PIECE; -void P2PFile_Create(list* pStl_ListFile, LPCTSTR lpszFile) +void P2PFile_Create(list* pStl_ListFile, LPCXSTR lpszFile) { P2PFILE_PIECE* pSt_P2PFile = new P2PFILE_PIECE[pStl_ListFile->size()]; @@ -93,38 +97,38 @@ void P2PFile_Create(list* pStl_ListFile, LPCTSTR lpszFile) list::const_iterator stl_ListIterator = pStl_ListFile->begin(); for (int i = 0; stl_ListIterator != pStl_ListFile->end(); stl_ListIterator++, i++) { - TCHAR tszDLUrl[1024]; - TCHAR tszRange[128]; + XCHAR tszDLUrl[1024]; + XCHAR tszRange[128]; memset(tszDLUrl, '\0', sizeof(tszDLUrl)); memset(tszRange, '\0', sizeof(tszRange)); - _stprintf(tszDLUrl, _T("%s/%s/%s"), stl_ListIterator->tszIPAddr, stl_ListIterator->tszBuckKey, stl_ListIterator->st_ProtocolFile.tszFileName); + _xstprintf(tszDLUrl, _X("%s/%s/%s"), stl_ListIterator->tszIPAddr, stl_ListIterator->tszBuckKey, stl_ListIterator->st_ProtocolFile.tszFileName); //是否是最后一块 if ((int)pStl_ListFile->size() == (i + 1)) { pSt_P2PFile[i].nPosStart = nPos; pSt_P2PFile[i].nPosEnd = 0; - _stprintf(tszRange, _T("%lld-"), pSt_P2PFile[i].nPosStart); + _xstprintf(tszRange, _X("%lld-"), pSt_P2PFile[i].nPosStart); } else { pSt_P2PFile[i].nPosStart = nPos; pSt_P2PFile[i].nPosEnd = nPiece; nPos += nPiece; - _stprintf(tszRange, _T("%lld-%lld"), pSt_P2PFile[i].nPosStart, pSt_P2PFile[i].nPosEnd); + _xstprintf(tszRange, _X("%lld-%lld"), pSt_P2PFile[i].nPosStart, pSt_P2PFile[i].nPosEnd); } - pSt_P2PFile[i].xhToken = APIClient_File_Create(tszDLUrl, lpszFile, TRUE, tszRange); + pSt_P2PFile[i].xhToken = APIClient_File_Create(tszDLUrl, lpszFile, true, tszRange); if (NULL == pSt_P2PFile[i].xhToken) { - printf("create download task is failed:%X\n", APIClient_GetLastError()); + _xtprintf("create download task is failed:%X\n", APIClient_GetLastError()); } APIClient_File_Start(pSt_P2PFile[i].xhToken); } //直到所有完成 while (1) { - BOOL bComplete = TRUE; + bool bComplete = true; for (unsigned int i = 0; i < pStl_ListFile->size(); i++) { NETHELP_FILEINFO st_TaskInfo; @@ -135,7 +139,7 @@ void P2PFile_Create(list* pStl_ListFile, LPCTSTR lpszFile) { bComplete = FALSE; } - printf("DLToken:%p DLTotal:%lf DLNow:%lf DLStatus:%d\n", pSt_P2PFile[i].xhToken, st_TaskInfo.dlTotal, st_TaskInfo.dlNow, st_TaskInfo.en_DownStatus); + _xtprintf("DLToken:%p DLTotal:%lf DLNow:%lf DLStatus:%d\n", pSt_P2PFile[i].xhToken, st_TaskInfo.dlTotal, st_TaskInfo.dlNow, st_TaskInfo.en_DownStatus); } if (bComplete) { @@ -161,10 +165,10 @@ int main() int nHTTPCode = 0; int nBodyLen = 0; - TCHAR *ptszMsgBody = NULL; + XCHAR *ptszMsgBody = NULL; //请求分布式存储文件所有位置 - LPCTSTR lpszUrl = _T("http://127.0.0.1:5100/Api/Manage/Query"); - LPCTSTR lpszFile = _T("D:\\XEngine_Storage\\XEngine_APPClient\\Debug\\qq.exe"); + LPCXSTR lpszUrl = _X("http://127.0.0.1:5100/Api/Manage/Query"); + LPCXSTR lpszFile = _X("D:\\XEngine_Storage\\XEngine_APPClient\\Debug\\qq.exe"); Json::Value st_JsonRoot; st_JsonRoot["nMode"] = 1; //使用P2P下载 @@ -172,11 +176,11 @@ int main() //st_JsonRoot["lpszFileName"] = "qq.exe"; st_JsonRoot["lpszFileHash"] = "781E5E245D69B566979B86E28D23F2C7"; - if (!APIClient_Http_Request(_T("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nHTTPCode, &ptszMsgBody, &nBodyLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nHTTPCode, &ptszMsgBody, &nBodyLen)) { return -1; } - printf("%s\n", ptszMsgBody); + _xtprintf("%s\n", ptszMsgBody); list stl_ListFile; P2PParse_List(ptszMsgBody, nBodyLen, &stl_ListFile); diff --git a/XEngine_APPClient/APPClient_Download/APPClient_Download.vcxproj b/XEngine_APPClient/APPClient_Download/APPClient_Download.vcxproj index 77aeac9..88a09fb 100644 --- a/XEngine_APPClient/APPClient_Download/APPClient_Download.vcxproj +++ b/XEngine_APPClient/APPClient_Download/APPClient_Download.vcxproj @@ -73,13 +73,15 @@ true $(XEngine_Include);../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) - $(XEngine_Library);$(LibraryPath) + $(XEngine_Lib32);$(LibraryPath) false true + $(XEngine_Include);../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) false @@ -116,7 +118,7 @@ Level3 true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true diff --git a/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.cpp b/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.cpp index 61b0891..cf14cb3 100644 --- a/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.cpp +++ b/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.cpp @@ -1,10 +1,14 @@ #ifdef _MSC_BUILD #include #include -#pragma comment(lib,"../../XEngine_Source/Debug/jsoncpp") #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") #pragma comment(lib,"XEngine_NetHelp/NetHelp_APIClient") #pragma comment(lib,"Ws2_32") +#ifdef _WIN64 +#pragma comment(lib,"../../XEngine_Source/x64/Debug/jsoncpp") +#else +#pragma comment(lib,"../../XEngine_Source/Debug/jsoncpp") +#endif #endif #include #include @@ -22,37 +26,37 @@ using namespace std; //g++ -std=c++17 -Wall -g APPClient_RestApi.cpp -o APPClient_RestApi.exe -L ../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_BaseLib -L ../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_NetHelp -lXEngine_BaseLib -lNetHelp_APIClient -ljsoncpp -Wl,-rpath=../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_BaseLib:../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_NetHelp,--disable-new-dtags //需要优先配置XEngine -//WINDOWS使用VS2022 x86 debug 编译 +//WINDOWS使用VS2022 x86 或者 x64 debug 编译 //linux使用下面的命令编译 //g++ -std=c++17 -Wall -g APPClient_RestApi.cpp -o APPClient_RestApi.exe -I ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_NetHelp -L ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -lXEngine_BaseLib -lNetHelp_APIClient -ljsoncpp //查询 void API_Manage_Query() { - LPCTSTR lpszUrl = _T("http://192.168.1.8:5100/Api/Manage/QueryFile"); + LPCXSTR lpszUrl = _X("http://192.168.1.8:5100/Api/Manage/QueryFile"); int nLen = 0; int nCode = 0; - TCHAR* ptszMsgBuffer = NULL; + XCHAR* ptszMsgBuffer = NULL; Json::Value st_JsonRoot; st_JsonRoot["lpszTimeStart"]; st_JsonRoot["lpszTimeEnd"]; st_JsonRoot["lpszBuckKey"] = "storagekey2"; - if (!APIClient_Http_Request(_T("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) { - printf("API_Manage_Query:%lX\n", APIClient_GetLastError()); + _xtprintf("API_Manage_Query:%lX\n", APIClient_GetLastError()); return; } - printf("API_Manage_Query:%d,%s\n", nCode, ptszMsgBuffer); + _xtprintf("API_Manage_Query:%d,%s\n", nCode, ptszMsgBuffer); BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } //插入 void API_Manage_Insert() { - LPCTSTR lpszUrl = _T("http://192.168.1.8:5100/Api/Manage/Insert"); + LPCXSTR lpszUrl = _X("http://192.168.1.8:5100/Api/Manage/Insert"); int nLen = 0; int nCode = 0; - TCHAR* ptszMsgBuffer = NULL; + XCHAR* ptszMsgBuffer = NULL; Json::Value st_JsonRoot; Json::Value st_JsonArray; Json::Value st_JsonObject; @@ -66,21 +70,21 @@ void API_Manage_Insert() st_JsonRoot["List"] = st_JsonArray; st_JsonRoot["Count"] = 1; - if (!APIClient_Http_Request(_T("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) { - printf("API_Manage_Insert:%lX\n", APIClient_GetLastError()); + _xtprintf("API_Manage_Insert:%lX\n", APIClient_GetLastError()); return; } - printf("API_Manage_Insert:%d,%s\n", nCode, ptszMsgBuffer); + _xtprintf("API_Manage_Insert:%d,%s\n", nCode, ptszMsgBuffer); BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } //删除 void API_Manage_Delete() { - LPCTSTR lpszUrl = _T("http://192.168.1.8:5100/Api/Manage/Delete"); + LPCXSTR lpszUrl = _X("http://192.168.1.8:5100/Api/Manage/Delete"); int nLen = 0; int nCode = 0; - TCHAR* ptszMsgBuffer = NULL; + XCHAR* ptszMsgBuffer = NULL; Json::Value st_JsonRoot; Json::Value st_JsonArray; Json::Value st_JsonObject; @@ -91,71 +95,71 @@ void API_Manage_Delete() st_JsonRoot["List"] = st_JsonArray; st_JsonRoot["Count"] = 1; - if (!APIClient_Http_Request(_T("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) { - printf("API_Manage_Delete:%lX\n", APIClient_GetLastError()); + _xtprintf("API_Manage_Delete:%lX\n", APIClient_GetLastError()); return; } - printf("API_Manage_Delete:%d,%s\n", nCode, ptszMsgBuffer); + _xtprintf("API_Manage_Delete:%d,%s\n", nCode, ptszMsgBuffer); BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } //文件夹 void API_Manage_Dir() { - LPCTSTR lpszUrl = _T("http://192.168.1.8:5100/Api/Manage/Dir"); + LPCXSTR lpszUrl = _X("http://192.168.1.8:5100/Api/Manage/Dir"); int nLen = 0; int nCode = 0; - TCHAR* ptszMsgBuffer = NULL; + XCHAR* ptszMsgBuffer = NULL; Json::Value st_JsonRoot; //创建 st_JsonRoot["lpszBuckKey"] = "storagekey1"; st_JsonRoot["lpszUserDir"] = "user"; st_JsonRoot["nOPerator"] = 1; - if (!APIClient_Http_Request(_T("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) { - printf("API_Manage_Dir:%lX\n", APIClient_GetLastError()); + _xtprintf("API_Manage_Dir:%lX\n", APIClient_GetLastError()); return; } - printf("API_Manage_Dir:%d,%s\n", nCode, ptszMsgBuffer); + _xtprintf("API_Manage_Dir:%d,%s\n", nCode, ptszMsgBuffer); BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); //查询 st_JsonRoot.clear(); st_JsonRoot["lpszBuckKey"] = "storagekey1"; st_JsonRoot["lpszUserDir"]; st_JsonRoot["nOPerator"] = 0; - if (!APIClient_Http_Request(_T("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) { - printf("API_Manage_Dir:%lX\n", APIClient_GetLastError()); + _xtprintf("API_Manage_Dir:%lX\n", APIClient_GetLastError()); return; } - printf("API_Manage_Dir:%d,%s\n", nCode, ptszMsgBuffer); + _xtprintf("API_Manage_Dir:%d,%s\n", nCode, ptszMsgBuffer); BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); //删除 st_JsonRoot.clear(); st_JsonRoot["lpszBuckKey"] = "storagekey1"; st_JsonRoot["lpszUserDir"] = "user"; st_JsonRoot["nOPerator"] = 2; - if (!APIClient_Http_Request(_T("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) { - printf("API_Manage_Dir:%lX\n", APIClient_GetLastError()); + _xtprintf("API_Manage_Dir:%lX\n", APIClient_GetLastError()); return; } - printf("API_Manage_Dir:%d,%s\n", nCode, ptszMsgBuffer); + _xtprintf("API_Manage_Dir:%d,%s\n", nCode, ptszMsgBuffer); BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } //任务管理 void API_Manage_Task() { - LPCTSTR lpszUrl = _T("http://192.168.1.8:5100/Api/Manage/Task"); + LPCXSTR lpszUrl = _X("http://192.168.1.8:5100/Api/Manage/Task"); int nLen = 0; int nCode = 0; - TCHAR* ptszMsgBuffer = NULL; - if (!APIClient_Http_Request(_T("POST"), lpszUrl, NULL, &nCode, &ptszMsgBuffer, &nLen)) + XCHAR* ptszMsgBuffer = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszUrl, NULL, &nCode, &ptszMsgBuffer, &nLen)) { - printf("API_Manage_Task:%lX\n", APIClient_GetLastError()); + _xtprintf("API_Manage_Task:%lX\n", APIClient_GetLastError()); return; } - printf("API_Manage_Task:%d,%s\n", nCode, ptszMsgBuffer); + _xtprintf("API_Manage_Task:%d,%s\n", nCode, ptszMsgBuffer); BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } diff --git a/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.vcxproj b/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.vcxproj index 7caa462..7c6e622 100644 --- a/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.vcxproj +++ b/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.vcxproj @@ -80,6 +80,8 @@ true + $(XEngine_Include);../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) false diff --git a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.cpp b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.cpp index 145cee9..4311730 100644 --- a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.cpp +++ b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.cpp @@ -8,14 +8,14 @@ int main(int argc, char** argv) WSADATA st_WSAData; WSAStartup(MAKEWORD(2, 2), &st_WSAData); #endif - LPCTSTR lpszLocalFile = _T("D:\\XEngine_Storage\\XEngine_APPClient\\Debug\\LocalFile.txt"); - LPCTSTR lpszDownload = _T("http://192.168.1.8:5101/storagekey1/xengine/upfile.txt"); - TCHAR* ptszMsgBuffer = NULL; + LPCXSTR lpszLocalFile = _X("D:\\XEngine_Storage\\XEngine_APPClient\\Debug\\LocalFile.txt"); + LPCXSTR lpszDownload = _X("http://192.168.1.8:5101/storagekey1/xengine/upfile.txt"); + XCHAR* ptszMsgBuffer = NULL; int nMsgLen = 0; - if (!APIClient_Http_Request(_T("GET"), lpszDownload, NULL, NULL, &ptszMsgBuffer, &nMsgLen)) + if (!APIClient_Http_Request(_X("GET"), lpszDownload, NULL, NULL, &ptszMsgBuffer, &nMsgLen)) { - printf("APIHelp_HttpRequest_Custom:%lX\n", APIClient_GetLastError()); + _xtprintf("APIHelp_HttpRequest_Custom:%lX\n", APIClient_GetLastError()); return 0; } string m_StrDes; @@ -27,24 +27,24 @@ int main(int argc, char** argv) FILEPARSER_VERSIONINFO** ppSt_RemoteList; if (!FileParser_ReadVer_GetRemote(ptszMsgBuffer, nMsgLen, &ppSt_RemoteList, &nRemoteCount, &nRemoteVer, &m_StrDes)) { - printf("FileParser_ReadVer_GetRemote error\n"); + _xtprintf("FileParser_ReadVer_GetRemote error\n"); return 0; } if (!FileParser_ReadVer_GetLocal(lpszLocalFile, &ppSt_LocalList, &nLocalCount, &nLocalVer)) { - printf("FileParser_ReadVer_GetLocal error\n"); + _xtprintf("FileParser_ReadVer_GetLocal error\n"); return 0; } if (nLocalVer >= nRemoteVer) { - printf("没有新版本可以使用\n"); + _xtprintf("没有新版本可以使用\n"); return 0; } list stl_ListUPDate; if (!FileParser_Match_Start(&ppSt_RemoteList, nRemoteCount, &ppSt_LocalList, nLocalCount, &stl_ListUPDate)) { - printf("FileParser_ReadVer_GetLocal error\n"); + _xtprintf("FileParser_ReadVer_GetLocal error\n"); return 0; } BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_LocalList, nLocalCount); @@ -52,7 +52,7 @@ int main(int argc, char** argv) if (stl_ListUPDate.empty()) { - printf("有更新,但是更新列表为空,无法继续\n"); + _xtprintf("有更新,但是更新列表为空,无法继续\n"); return 0; } list::const_iterator stl_ListIterator = stl_ListUPDate.begin(); @@ -60,28 +60,28 @@ int main(int argc, char** argv) { if (0 == stl_ListIterator->st_LocalVersion.nModuleVersion) { - printf(_T("增加一个模块,模块名称:%s,老模块版本:%lld,新模块版本:%lld\n"), stl_ListIterator->tszModuleName, stl_ListIterator->st_LocalVersion.nModuleVersion, stl_ListIterator->nModuleVersion); + _xtprintf(_X("增加一个模块,模块名称:%s,老模块版本:%lld,新模块版本:%lld\n"), stl_ListIterator->tszModuleName, stl_ListIterator->st_LocalVersion.nModuleVersion, stl_ListIterator->nModuleVersion); } else { - printf(_T("更新一个模块,模块名称:%s,老模块版本:%lld,新模块版本:%lld\n"), stl_ListIterator->tszModuleName, stl_ListIterator->st_LocalVersion.nModuleVersion, stl_ListIterator->nModuleVersion); + _xtprintf(_X("更新一个模块,模块名称:%s,老模块版本:%lld,新模块版本:%lld\n"), stl_ListIterator->tszModuleName, stl_ListIterator->st_LocalVersion.nModuleVersion, stl_ListIterator->nModuleVersion); } } stl_ListIterator = stl_ListUPDate.begin(); for (; stl_ListIterator != stl_ListUPDate.end(); stl_ListIterator++) { - TCHAR tszPathFile[1024]; + XCHAR tszPathFile[1024]; NETHELP_FILEINFO st_TaskInfo; memset(tszPathFile, '\0', sizeof(tszPathFile)); memset(&st_TaskInfo, '\0', sizeof(NETHELP_FILEINFO)); - _stprintf_s(tszPathFile, _T("%s%s"), stl_ListIterator->tszModulePath, stl_ListIterator->tszModuleName); - _tremove(tszPathFile); + _xstprintf(tszPathFile, _X("%s%s"), stl_ListIterator->tszModulePath, stl_ListIterator->tszModuleName); + _xtremove(tszPathFile); XHANDLE xhDown = APIClient_File_Create(stl_ListIterator->tszModuleDownload, tszPathFile); APIClient_File_Start(xhDown); - while (TRUE) + while (true) { if (!APIClient_File_Query(xhDown, &st_TaskInfo)) { @@ -97,25 +97,25 @@ int main(int argc, char** argv) if (!HelpModule_Api_Copy(&stl_ListUPDate)) { - printf("HelpModule_Api_Copy error\n"); + _xtprintf("HelpModule_Api_Copy error\n"); return 0; } if (!HelpModule_Api_SetVersion(lpszLocalFile, ptszMsgBuffer, nMsgLen)) { - printf("HelpModule_Api_Copy error\n"); + _xtprintf("HelpModule_Api_Copy error\n"); return 0; } if (!HelpModule_Api_RunExec(&stl_ListUPDate)) { - printf("HelpModule_Api_Copy error\n"); + _xtprintf("HelpModule_Api_Copy error\n"); return 0; } if (!HelpModule_Api_Clear(ptszMsgBuffer, nMsgLen)) { - printf("HelpModule_Api_Copy error\n"); + _xtprintf("HelpModule_Api_Copy error\n"); return 0; } diff --git a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.vcxproj b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.vcxproj index 2e835ae..d570fc0 100644 --- a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.vcxproj +++ b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.vcxproj @@ -74,6 +74,10 @@ $(XEngine_Include);../../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) + + $(XEngine_Include);../../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) + Level3 @@ -106,7 +110,7 @@ Level3 true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true diff --git a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPHdr.h b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPHdr.h index 5db48fb..8c2aab6 100644 --- a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPHdr.h +++ b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPHdr.h @@ -2,10 +2,14 @@ #include #include #pragma comment(lib,"Ws2_32.lib") -#pragma comment(lib,"../../../XEngine_Source/Debug/jsoncpp") #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib.lib") #pragma comment(lib,"XEngine_NetHelp/NetHelp_APIClient.lib") #pragma comment(lib,"XEngine_SystemSdk/XEngine_SystemApi.lib") +#ifdef _WIN64 +#pragma comment(lib,"../../../XEngine_Source/x64/Debug/jsoncpp") +#else +#pragma comment(lib,"../../../XEngine_Source/Debug/jsoncpp") +#endif #endif #include #include @@ -28,17 +32,17 @@ using namespace std; typedef struct { - CHAR tszModulePath[MAX_PATH]; //模块路径,新增加的必须拥有此值 - CHAR tszModuleName[MAX_PATH]; //模块名称 - CHAR tszModuleDownload[MAX_PATH]; //模块下载地址 - CHAR tszModuleCode[MAX_PATH]; //远程模块标识符 + XCHAR tszModulePath[MAX_PATH]; //模块路径,新增加的必须拥有此值 + XCHAR tszModuleName[MAX_PATH]; //模块名称 + XCHAR tszModuleDownload[MAX_PATH]; //模块下载地址 + XCHAR tszModuleCode[MAX_PATH]; //远程模块标识符 __int64x nModuleVersion; //文件版本号 - BOOL bIsRun; //安装完成是否运行 + bool bIsRun; //安装完成是否运行 struct { __int64x nModuleVersion; - CHAR tszMoudelPath[MAX_PATH]; - CHAR tszMoudelName[MAX_PATH]; - CHAR tszMoudelCode[MAX_PATH]; + XCHAR tszMoudelPath[MAX_PATH]; + XCHAR tszMoudelName[MAX_PATH]; + XCHAR tszMoudelCode[MAX_PATH]; }st_LocalVersion; }FILEPARSER_VERSIONINFO, * LPFILEPARSER_VERSIONINFO; \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPInstall.h b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPInstall.h index c14eff0..8ecb29e 100644 --- a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPInstall.h +++ b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPInstall.h @@ -37,7 +37,7 @@ 意思:是否获取成功 备注: *********************************************************************/ -BOOL FileParser_ReadVer_GetRemote(LPCTSTR lpszJsonMsg, int nMsgLen, FILEPARSER_VERSIONINFO*** pppSt_FileList, int* pInt_Count, __int64x* pInt_Version, string* pStrDes) +bool FileParser_ReadVer_GetRemote(LPCXSTR lpszJsonMsg, int nMsgLen, FILEPARSER_VERSIONINFO*** pppSt_FileList, int* pInt_Count, __int64x* pInt_Version, string* pStrDes) { Json::Value st_JsonRoot; Json::Value st_JsonArray; @@ -76,15 +76,15 @@ BOOL FileParser_ReadVer_GetRemote(LPCTSTR lpszJsonMsg, int nMsgLen, FILEPARSER_V //开始读取文件列表内容 (*pppSt_FileList)[i]->bIsRun = st_JsonArray[i]["ModuleRun"].asBool(); (*pppSt_FileList)[i]->nModuleVersion = st_JsonArray[i]["ModuleVersion"].asInt64(); - _tcscpy((*pppSt_FileList)[i]->tszModuleCode, st_JsonArray[i]["ModuleCode"].asCString()); + _tcsxcpy((*pppSt_FileList)[i]->tszModuleCode, st_JsonArray[i]["ModuleCode"].asCString()); if (!st_JsonArray[i]["ModulePath"].isNull()) { - _tcscpy((*pppSt_FileList)[i]->tszModulePath, st_JsonArray[i]["ModulePath"].asCString()); + _tcsxcpy((*pppSt_FileList)[i]->tszModulePath, st_JsonArray[i]["ModulePath"].asCString()); } - _tcscpy((*pppSt_FileList)[i]->tszModuleName, st_JsonArray[i]["ModuleName"].asCString()); - _tcscpy((*pppSt_FileList)[i]->tszModuleDownload, st_JsonArray[i]["ModuleDownload"].asCString()); + _tcsxcpy((*pppSt_FileList)[i]->tszModuleName, st_JsonArray[i]["ModuleName"].asCString()); + _tcsxcpy((*pppSt_FileList)[i]->tszModuleDownload, st_JsonArray[i]["ModuleDownload"].asCString()); } - return TRUE; + return true; } /******************************************************************** 函数名称:FileParser_ReadVer_GetLocal @@ -114,33 +114,33 @@ BOOL FileParser_ReadVer_GetRemote(LPCTSTR lpszJsonMsg, int nMsgLen, FILEPARSER_V 意思:是否获取成功 备注: *********************************************************************/ -BOOL FileParser_ReadVer_GetLocal(LPCTSTR lpszFileList, FILEPARSER_VERSIONINFO*** pppSt_FileList, int* pInt_Count, __int64x* pInt_Version /* = NULL */) +bool FileParser_ReadVer_GetLocal(LPCXSTR lpszFileList, FILEPARSER_VERSIONINFO*** pppSt_FileList, int* pInt_Count, __int64x* pInt_Version /* = NULL */) { int nCount = 0; - TCHAR* ptszJsonFile = (TCHAR*)malloc(1024 * 1024 * 10); + XCHAR* ptszJsonFile = (XCHAR*)malloc(1024 * 1024 * 10); if (NULL == ptszJsonFile) { return FALSE; } memset(ptszJsonFile, '\0', 1024 * 1024 * 10); - FILE* pSt_File = _tfopen(lpszFileList, _T("rb")); + FILE* pSt_File = _xtfopen(lpszFileList, _X("rb")); if (NULL == pSt_File) { free(ptszJsonFile); ptszJsonFile = NULL; return FALSE; } - while (TRUE) + while (true) { - TCHAR tszJsonMsg[2048]; + XCHAR tszJsonMsg[2048]; memset(tszJsonMsg, '\0', sizeof(tszJsonMsg)); - int nRet = fread(tszJsonMsg, sizeof(TCHAR), sizeof(tszJsonMsg), pSt_File); + size_t nRet = fread(tszJsonMsg, sizeof(XCHAR), sizeof(tszJsonMsg), pSt_File); if (nRet <= 0) { break; } memcpy(ptszJsonFile + nCount, tszJsonMsg, nRet); - nCount += nRet; + nCount += (int)nRet; } fclose(pSt_File); @@ -173,11 +173,11 @@ BOOL FileParser_ReadVer_GetLocal(LPCTSTR lpszFileList, FILEPARSER_VERSIONINFO*** for (unsigned int i = 0; i < st_JsonArray.size(); i++) { (*pppSt_FileList)[i]->st_LocalVersion.nModuleVersion = st_JsonArray[i]["ModuleVersion"].asInt64(); - _tcscpy((*pppSt_FileList)[i]->st_LocalVersion.tszMoudelCode, st_JsonArray[i]["ModuleCode"].asCString()); - _tcscpy((*pppSt_FileList)[i]->st_LocalVersion.tszMoudelName, st_JsonArray[i]["ModuleName"].asCString()); - _tcscpy((*pppSt_FileList)[i]->st_LocalVersion.tszMoudelPath, st_JsonArray[i]["ModulePath"].asCString()); + _tcsxcpy((*pppSt_FileList)[i]->st_LocalVersion.tszMoudelCode, st_JsonArray[i]["ModuleCode"].asCString()); + _tcsxcpy((*pppSt_FileList)[i]->st_LocalVersion.tszMoudelName, st_JsonArray[i]["ModuleName"].asCString()); + _tcsxcpy((*pppSt_FileList)[i]->st_LocalVersion.tszMoudelPath, st_JsonArray[i]["ModulePath"].asCString()); } - return TRUE; + return true; } /******************************************************************** 函数名称:FileParser_Match_Start @@ -212,14 +212,14 @@ BOOL FileParser_ReadVer_GetLocal(LPCTSTR lpszFileList, FILEPARSER_VERSIONINFO*** 意思:是否有新版本 备注: *********************************************************************/ -BOOL FileParser_Match_Start(FILEPARSER_VERSIONINFO*** pppSt_ListRemote, int nRemoteCount, FILEPARSER_VERSIONINFO*** pppSt_ListLocal, int nLocalCount, list* pStl_ListUPDate) +bool FileParser_Match_Start(FILEPARSER_VERSIONINFO*** pppSt_ListRemote, int nRemoteCount, FILEPARSER_VERSIONINFO*** pppSt_ListLocal, int nLocalCount, list* pStl_ListUPDate) { for (int i = 0; i < nRemoteCount; i++) { //版本比较 for (int j = 0; j < nLocalCount; j++) { - if (0 == _tcsncmp((*pppSt_ListLocal)[j]->st_LocalVersion.tszMoudelCode, (*pppSt_ListRemote)[i]->tszModuleCode, _tcslen((*pppSt_ListRemote)[i]->tszModuleCode))) + if (0 == _tcsxncmp((*pppSt_ListLocal)[j]->st_LocalVersion.tszMoudelCode, (*pppSt_ListRemote)[i]->tszModuleCode, _tcsxlen((*pppSt_ListRemote)[i]->tszModuleCode))) { if ((*pppSt_ListRemote)[i]->nModuleVersion > (*pppSt_ListLocal)[j]->st_LocalVersion.nModuleVersion) { @@ -234,5 +234,5 @@ BOOL FileParser_Match_Start(FILEPARSER_VERSIONINFO*** pppSt_ListRemote, int nRem } } } - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPTask.h b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPTask.h index 888bc14..e2918b8 100644 --- a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPTask.h +++ b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPTask.h @@ -22,10 +22,10 @@ 意思:是否拷贝成功 备注: *********************************************************************/ -BOOL HelpModule_Api_Copy(list* pStl_ListUPDate, LPCTSTR lpszDlPath = NULL, BOOL bDelFile = TRUE) +bool HelpModule_Api_Copy(list* pStl_ListUPDate, LPCXSTR lpszDlPath = NULL, bool bDelFile = true) { - TCHAR tszDlPath[1024]; - TCHAR tszCpPath[1024]; + XCHAR tszDlPath[1024]; + XCHAR tszCpPath[1024]; if ((NULL == pStl_ListUPDate)) { return FALSE; @@ -38,19 +38,19 @@ BOOL HelpModule_Api_Copy(list* pStl_ListUPDate, LPCTSTR //获取下载的文件路径和名称 组合成可以拷贝的路径地址 if (NULL != lpszDlPath) { - _stprintf_s(tszDlPath, _T("%s%s"), lpszDlPath, stl_ListIterator->tszModuleName); + _xstprintf(tszDlPath, _X("%s%s"), lpszDlPath, stl_ListIterator->tszModuleName); } else { - _tcscpy(tszDlPath, stl_ListIterator->tszModuleName); + _tcsxcpy(tszDlPath, stl_ListIterator->tszModuleName); } if (0 == stl_ListIterator->st_LocalVersion.nModuleVersion) { - _stprintf_s(tszCpPath, _T("%s%s"), stl_ListIterator->tszModulePath, stl_ListIterator->tszModuleName); + _xstprintf(tszCpPath, _X("%s%s"), stl_ListIterator->tszModulePath, stl_ListIterator->tszModuleName); } else { - _stprintf_s(tszCpPath, _T("%s%s"), stl_ListIterator->st_LocalVersion.tszMoudelPath, stl_ListIterator->st_LocalVersion.tszMoudelName); + _xstprintf(tszCpPath, _X("%s%s"), stl_ListIterator->st_LocalVersion.tszMoudelPath, stl_ListIterator->st_LocalVersion.tszMoudelName); } if (!SystemApi_File_CreateMutilFolder(stl_ListIterator->st_LocalVersion.tszMoudelPath)) { @@ -63,13 +63,13 @@ BOOL HelpModule_Api_Copy(list* pStl_ListUPDate, LPCTSTR if (bDelFile) { //删除原始下载的文件 - if (0 != _tremove(tszDlPath)) + if (0 != _xtremove(tszDlPath)) { return FALSE; } } } - return TRUE; + return true; } /******************************************************************** 函数名称:HelpModule_Api_SetVersion @@ -94,7 +94,7 @@ BOOL HelpModule_Api_Copy(list* pStl_ListUPDate, LPCTSTR 意思:是否设置成功 备注: *********************************************************************/ -BOOL HelpModule_Api_SetVersion(LPCTSTR lpszLocalFile, LPCTSTR lpszMsgBuffer, int nMsgLen) +bool HelpModule_Api_SetVersion(LPCXSTR lpszLocalFile, LPCXSTR lpszMsgBuffer, int nMsgLen) { //文件JSON Json::Value st_JsonRoot; @@ -119,25 +119,25 @@ BOOL HelpModule_Api_SetVersion(LPCTSTR lpszLocalFile, LPCTSTR lpszMsgBuffer, int delete pSt_JsonRemoteReader; pSt_JsonRemoteReader = NULL; - int nCount = 0; - TCHAR* ptszJsonFile = new TCHAR[1024 * 1024 * 10]; + size_t nCount = 0; + XCHAR* ptszJsonFile = new XCHAR[1024 * 1024 * 10]; if (NULL == ptszJsonFile) { return FALSE; } memset(ptszJsonFile, '\0', 1024 * 1024 * 10); - FILE* pSt_File = _tfopen(lpszLocalFile, _T("rb")); + FILE* pSt_File = _xtfopen(lpszLocalFile, _X("rb")); if (NULL == pSt_File) { delete[]ptszJsonFile; ptszJsonFile = NULL; return FALSE; } - while (TRUE) + while (true) { - TCHAR tszJsonMsg[2048]; + XCHAR tszJsonMsg[2048]; memset(tszJsonMsg, '\0', sizeof(tszJsonMsg)); - int nRet = fread(tszJsonMsg, sizeof(TCHAR), 2048, pSt_File); + size_t nRet = fread(tszJsonMsg, sizeof(XCHAR), 2048, pSt_File); if (nRet <= 0) { break; @@ -161,11 +161,11 @@ BOOL HelpModule_Api_SetVersion(LPCTSTR lpszLocalFile, LPCTSTR lpszMsgBuffer, int st_JsonLocalArray = st_JsonLocalRoot["FileList"]; for (unsigned int i = 0; i < st_JsonLocalArray.size(); i++) { - BOOL bIsFound = FALSE; + bool bIsFound = FALSE; Json::Value st_JsonRemoteArray = st_JsonRemoteRoot["UPList"]; for (unsigned int j = 0; j < st_JsonRemoteArray.size(); j++) { - if (0 == _tcscmp(st_JsonLocalArray[i]["ModuleCode"].asCString(), st_JsonRemoteArray[j]["ModuleCode"].asCString())) + if (0 == _tcsxcmp(st_JsonLocalArray[i]["ModuleCode"].asCString(), st_JsonRemoteArray[j]["ModuleCode"].asCString())) { Json::Value st_JsonObject; st_JsonObject["ModuleVersion"] = st_JsonRemoteArray[j]["ModuleVersion"].asUInt64(); @@ -173,22 +173,22 @@ BOOL HelpModule_Api_SetVersion(LPCTSTR lpszLocalFile, LPCTSTR lpszMsgBuffer, int st_JsonObject["ModuleName"] = st_JsonLocalArray[i]["ModuleName"].asCString(); st_JsonObject["ModulePath"] = st_JsonLocalArray[i]["ModulePath"].asCString(); st_JsonArray.append(st_JsonObject); - bIsFound = TRUE; + bIsFound = true; break; } } if (!bIsFound) { //没有找到更新的文件 - BOOL bIsDelFound = FALSE; + bool bIsDelFound = FALSE; Json::Value st_JsonDelArray; st_JsonDelArray = st_JsonRemoteRoot["DelList"]; //查找是否有删除的文件内容 for (unsigned int k = 0; k < st_JsonDelArray.size(); k++) { - if (0 == _tcscmp(st_JsonLocalArray[i]["ModuleName"].asCString(), st_JsonDelArray[k]["ModuleName"].asCString())) + if (0 == _tcsxcmp(st_JsonLocalArray[i]["ModuleName"].asCString(), st_JsonDelArray[k]["ModuleName"].asCString())) { - bIsDelFound = TRUE; + bIsDelFound = true; break; } } @@ -208,14 +208,14 @@ BOOL HelpModule_Api_SetVersion(LPCTSTR lpszLocalFile, LPCTSTR lpszMsgBuffer, int st_JsonRemoteArray = st_JsonRemoteRoot["UPList"]; for (unsigned int i = 0; i < st_JsonRemoteArray.size(); i++) { - BOOL bIsFound = FALSE; + bool bIsFound = FALSE; Json::Value st_JsonLocalArray = st_JsonLocalRoot["FileList"]; //查找远程元素是否在本地存在 for (unsigned int j = 0; j < st_JsonLocalArray.size(); j++) { - if (0 == _tcscmp(st_JsonRemoteArray[i]["ModuleCode"].asCString(), st_JsonLocalArray[j]["ModuleCode"].asCString())) + if (0 == _tcsxcmp(st_JsonRemoteArray[i]["ModuleCode"].asCString(), st_JsonLocalArray[j]["ModuleCode"].asCString())) { - bIsFound = TRUE; + bIsFound = true; break; } } @@ -233,7 +233,7 @@ BOOL HelpModule_Api_SetVersion(LPCTSTR lpszLocalFile, LPCTSTR lpszMsgBuffer, int st_JsonRoot["MainVersion"] = st_JsonRemoteRoot["MainVersion"].asInt64(); st_JsonRoot["FileList"] = st_JsonArray; - if (0 != _tremove(lpszLocalFile)) + if (0 != _xtremove(lpszLocalFile)) { return FALSE; } @@ -242,7 +242,7 @@ BOOL HelpModule_Api_SetVersion(LPCTSTR lpszLocalFile, LPCTSTR lpszMsgBuffer, int return FALSE; } - return TRUE; + return true; } /******************************************************************** 函数名称:HelpModule_Api_RunExec @@ -257,7 +257,7 @@ BOOL HelpModule_Api_SetVersion(LPCTSTR lpszLocalFile, LPCTSTR lpszMsgBuffer, int 意思:是否执行成功 备注: *********************************************************************/ -BOOL HelpModule_Api_RunExec(list* pStl_ListUPDate) +bool HelpModule_Api_RunExec(list* pStl_ListUPDate) { list::const_iterator stl_ListIterator = pStl_ListUPDate->begin(); for (; stl_ListIterator != pStl_ListUPDate->end(); stl_ListIterator++) @@ -266,17 +266,17 @@ BOOL HelpModule_Api_RunExec(list* pStl_ListUPDate) if (stl_ListIterator->bIsRun) { DWORD dwProcessID = 0; - TCHAR tszPath[1024]; + XCHAR tszPath[1024]; memset(tszPath, '\0', sizeof(tszPath)); //判断目录时候需要改变 - _stprintf_s(tszPath, _T("%s%s"), stl_ListIterator->st_LocalVersion.tszMoudelPath, stl_ListIterator->st_LocalVersion.tszMoudelName); + _xstprintf(tszPath, _X("%s%s"), stl_ListIterator->st_LocalVersion.tszMoudelPath, stl_ListIterator->st_LocalVersion.tszMoudelName); if (!SystemApi_Process_CreateProcess(&dwProcessID, tszPath)) { return FALSE; } } } - return TRUE; + return true; } /******************************************************************** 函数名称:HelpModule_Api_Clear @@ -296,7 +296,7 @@ BOOL HelpModule_Api_RunExec(list* pStl_ListUPDate) 意思:是否成功 备注: *********************************************************************/ -BOOL HelpModule_Api_Clear(LPCTSTR lpszRemoteJson, int nMsgLen) +bool HelpModule_Api_Clear(LPCXSTR lpszRemoteJson, int nMsgLen) { Json::Value st_JsonRoot; Json::Value st_JsonArray; @@ -315,10 +315,10 @@ BOOL HelpModule_Api_Clear(LPCTSTR lpszRemoteJson, int nMsgLen) st_JsonArray = st_JsonRoot["DelList"]; for (unsigned int i = 0; i < st_JsonArray.size(); i++) { - if (0 != _tremove(st_JsonArray[i].asCString())) + if (0 != _xtremove(st_JsonArray[i].asCString())) { return FALSE; } } - return TRUE; + return true; } \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp b/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp index 6ef6b2b..176d076 100644 --- a/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp +++ b/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp @@ -3,10 +3,14 @@ #include #include #pragma comment(lib,"Ws2_32.lib") -#pragma comment(lib,"../../../XEngine_Source/Debug/jsoncpp") #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib.lib") #pragma comment(lib,"XEngine_SystemSdk/XEngine_SystemApi.lib") #pragma comment(lib,"XEngine_NetHelp/NetHelp_APIClient.lib") +#ifdef _WIN64 +#pragma comment(lib,"../../../XEngine_Source/x64/Debug/jsoncpp") +#else +#pragma comment(lib,"../../../XEngine_Source/Debug/jsoncpp") +#endif #endif #include #include @@ -29,8 +33,8 @@ using namespace std; typedef struct { - TCHAR tszFilePath[MAX_PATH]; - TCHAR tszFileName[MAX_PATH]; + XCHAR tszFilePath[MAX_PATH]; + XCHAR tszFileName[MAX_PATH]; }HELPMODULE_FILELIST, * LPHELPMODULE_FILELIST; /******************************************************************** 函数名称:HelpModule_Api_BuildVer @@ -65,10 +69,10 @@ typedef struct 意思:是否构建成功 备注:次函数可以帮助你快速构建一个可更新的文件列表,方便你快速使用我们的更新SDK *********************************************************************/ -BOOL HelpModule_Api_BuildVer(TCHAR* ptszLocalBuffer, TCHAR* ptszRemoteBuffer, int* pInt_LocalLen, int* pInt_RemoteLen, LPCTSTR lpszPath, LPCTSTR lpszDlUrl, BOOL bSubDir = TRUE) +bool HelpModule_Api_BuildVer(XCHAR* ptszLocalBuffer, XCHAR* ptszRemoteBuffer, int* pInt_LocalLen, int* pInt_RemoteLen, LPCXSTR lpszPath, LPCXSTR lpszDlUrl, bool bSubDir = true) { int nListCount; - CHAR** ppszListDir; + XCHAR** ppszListDir; list stl_ListFile; //枚举文件 if (!SystemApi_File_EnumFile(lpszPath, &ppszListDir, &nListCount, NULL, NULL, bSubDir, 1)) @@ -98,62 +102,62 @@ BOOL HelpModule_Api_BuildVer(TCHAR* ptszLocalBuffer, TCHAR* ptszRemoteBuffer, in Json::Value st_JsonRemoteOPtion; Json::StreamWriterBuilder st_JsonBuilder; //判断是否是自定义版本 - TCHAR tszTimer[64]; + XCHAR tszTimer[64]; XENGINE_LIBTIMER st_Timer; memset(tszTimer, '\0', sizeof(tszTimer)); memset(&st_Timer, '\0', sizeof(XENGINE_LIBTIMER)); BaseLib_OperatorTime_GetSysTime(&st_Timer); - _stprintf_s(tszTimer, _T("%04d%02d%02d%02d%02d%02d"), st_Timer.wYear, st_Timer.wMonth, st_Timer.wDay, st_Timer.wHour, st_Timer.wMinute, st_Timer.wSecond); - __int64x m_nFileVer = _ttoi64(tszTimer); + _xstprintf(tszTimer, _X("%04d%02d%02d%02d%02d%02d"), st_Timer.wYear, st_Timer.wMonth, st_Timer.wDay, st_Timer.wHour, st_Timer.wMinute, st_Timer.wSecond); + __int64x m_nFileVer = _ttxoll(tszTimer); st_JsonLocalRoot["MainVersion"] = (Json::UInt64)m_nFileVer; st_JsonRemoteOPtion["st_JsonRemoteOPtion"] = 0; st_JsonRemoteRoot["MainVersion"] = (Json::UInt64)m_nFileVer; - st_JsonRemoteRoot["MainDescription"] = _T("File UPData Des!"); + st_JsonRemoteRoot["MainDescription"] = _X("File UPData Des!"); st_JsonRemoteRoot["FileVerOPtion"] = st_JsonRemoteOPtion; //开始构架JSON文件列表 list::const_iterator stl_ListIterator = stl_ListFile.begin(); for (unsigned int i = 1; stl_ListIterator != stl_ListFile.end(); stl_ListIterator++, i++) { - TCHAR tszFileCode[64]; + XCHAR tszFileCode[64]; memset(tszFileCode, '\0', sizeof(tszFileCode)); - _stprintf_s(tszFileCode, _T("XYRYUPVERCODE%d"), i); + _xstprintf(tszFileCode, _X("XYRYUPVERCODE%d"), i); st_JsonLocalObject["ModuleVersion"] = (Json::UInt64)m_nFileVer; st_JsonLocalObject["ModuleCode"] = tszFileCode; st_JsonLocalObject["ModuleName"] = stl_ListIterator->tszFileName; st_JsonLocalObject["ModulePath"] = stl_ListIterator->tszFilePath; - TCHAR tszDlPath[1024]; + XCHAR tszDlPath[1024]; memset(tszDlPath, '\0', sizeof(tszDlPath)); //删除指定字符串 int nPathType = 0; BaseLib_OperatorString_GetPath(stl_ListIterator->tszFilePath, &nPathType); if (1 == nPathType) { - TCHAR tszDelPath[MAX_PATH]; - TCHAR tszSubPath[MAX_PATH]; + XCHAR tszDelPath[MAX_PATH]; + XCHAR tszSubPath[MAX_PATH]; memset(tszDelPath, '\0', MAX_PATH); memset(tszSubPath, '\0', MAX_PATH); - _tcscpy(tszDelPath, lpszPath); - _tcscpy(tszSubPath, stl_ListIterator->tszFilePath); + _tcsxcpy(tszDelPath, lpszPath); + _tcsxcpy(tszSubPath, stl_ListIterator->tszFilePath); - tszDelPath[_tcslen(tszDelPath) - 2] = '\0'; + tszDelPath[_tcsxlen(tszDelPath) - 2] = '\0'; BaseLib_OperatorString_DelSub(tszDelPath, "\\"); - _tcscat(tszDelPath, "\\"); + _tcsxcat(tszDelPath, "\\"); BaseLib_OperatorString_DelSub(tszSubPath, tszDelPath); BaseLib_OperatorString_FixPath(tszSubPath, 2); - _stprintf_s(tszDlPath, _T("%s%s%s"), lpszDlUrl, tszSubPath, stl_ListIterator->tszFileName); + _xstprintf(tszDlPath, _X("%s%s%s"), lpszDlUrl, tszSubPath, stl_ListIterator->tszFileName); } else { - _stprintf_s(tszDlPath, _T("%s%s%s"), lpszDlUrl, stl_ListIterator->tszFilePath + 2, stl_ListIterator->tszFileName); + _xstprintf(tszDlPath, _X("%s%s%s"), lpszDlUrl, stl_ListIterator->tszFilePath + 2, stl_ListIterator->tszFileName); } st_JsonRemoteObject["ModuleRun"] = false; st_JsonRemoteObject["ModuleVersion"] = (Json::UInt64)m_nFileVer; @@ -175,7 +179,7 @@ BOOL HelpModule_Api_BuildVer(TCHAR* ptszLocalBuffer, TCHAR* ptszRemoteBuffer, in memcpy(ptszLocalBuffer, Json::writeString(st_JsonBuilder, st_JsonLocalRoot).c_str(), *pInt_LocalLen); memcpy(ptszRemoteBuffer, Json::writeString(st_JsonBuilder, st_JsonRemoteRoot).c_str(), *pInt_RemoteLen); - return TRUE; + return true; } int main(int argc, char** argv) @@ -184,28 +188,28 @@ int main(int argc, char** argv) WSADATA st_WSAData; WSAStartup(MAKEWORD(2, 2), &st_WSAData); #endif - LPCTSTR lpszPath = _T("D:\\libxengine\\*"); - LPCTSTR lpszLocalFile = _T("D:\\XEngine_Storage\\XEngine_APPClient\\Debug\\LocalFile.txt"); - LPCTSTR lpszPostFile = _T("http://192.168.1.8:5102/api?filename=xengine/upfile.txt&storeagekey=storagekey1"); - LPCTSTR lpszDownload = _T("http://192.168.1.8:5101/storagekey1/xengine/"); + LPCXSTR lpszPath = _X("D:\\libxengine\\*"); + LPCXSTR lpszLocalFile = _X("D:\\XEngine_Storage\\XEngine_APPClient\\Debug\\LocalFile.txt"); + LPCXSTR lpszPostFile = _X("http://192.168.1.8:5102/api?filename=xengine/upfile.txt&storeagekey=storagekey1"); + LPCXSTR lpszDownload = _X("http://192.168.1.8:5101/storagekey1/xengine/"); int nLocalLen = 1024 * 1024 * 10; int nRemoteLen = 1024 * 1024 * 10; - TCHAR* ptszLocalBuffer = (TCHAR*)malloc(nLocalLen); - TCHAR* ptszRemoteBuffer = (TCHAR*)malloc(nRemoteLen); + XCHAR* ptszLocalBuffer = (XCHAR*)malloc(nLocalLen); + XCHAR* ptszRemoteBuffer = (XCHAR*)malloc(nRemoteLen); memset(ptszLocalBuffer, '\0', nLocalLen); memset(ptszRemoteBuffer, '\0', nRemoteLen); if (!HelpModule_Api_BuildVer(ptszLocalBuffer, ptszRemoteBuffer, &nLocalLen, &nRemoteLen, lpszPath, lpszDownload)) { - printf("erron\n"); + _xtprintf("erron\n"); return 0; } SystemApi_File_SaveBuffToFile(lpszLocalFile, ptszLocalBuffer, nLocalLen); //如果服务器支持,可以直接把更新数据提交到服务器 - if (!APIClient_Http_Request(_T("POST"), lpszPostFile, ptszRemoteBuffer, NULL, NULL, &nRemoteLen)) + if (!APIClient_Http_Request(_X("POST"), lpszPostFile, ptszRemoteBuffer, NULL, NULL, &nRemoteLen)) { - printf("erron\n"); + _xtprintf("erron\n"); } #ifdef _MSC_BUILD WSACleanup(); diff --git a/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.vcxproj b/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.vcxproj index 00f34fe..e8598f0 100644 --- a/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.vcxproj +++ b/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.vcxproj @@ -74,6 +74,10 @@ $(XEngine_Include);../../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) + + $(XEngine_Include);../../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) + Level3 @@ -106,7 +110,7 @@ Level3 true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true diff --git a/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.cpp b/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.cpp index 1207262..0142994 100644 --- a/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.cpp +++ b/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.cpp @@ -1,4 +1,4 @@ -#ifdef _WINDOWS +#ifdef _MSC_BUILD #include #include #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") @@ -6,7 +6,11 @@ #pragma comment(lib,"XEngine_NetHelp/NetHelp_APIClient") #pragma comment(lib,"Ws2_32") #pragma comment(lib,"../../XEngine_Source/Debug/jsoncpp") +#ifdef _WIN64 +#pragma comment(lib,"../../XEngine_Source/x64/Debug/jsoncpp") #else +#pragma comment(lib,"../../XEngine_Source/Debug/jsoncpp") +#endif #endif #include #include @@ -25,32 +29,32 @@ using namespace std; //需要优先配置XEngine -//WINDOWS使用VS2022 x86 debug 编译 +//WINDOWS使用VS2022 x86 或者 x64 debug 编译 //linux::g++ -std=c++17 -Wall -g APPClient_UPDownload.cpp -o APPClient_UPDownload.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 -L ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -lXEngine_BaseLib -lXEngine_OPenSsl -lNetHelp_APIClient -ljsoncpp //macos::g++ -std=c++17 -Wall -g APPClient_UPDownload.cpp -o APPClient_UPDownload.exe -I ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -L ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -lXEngine_BaseLib -lXEngine_OPenSsl -lNetHelp_APIClient -ljsoncpp //上传文件 void File_UPLoad() { - LPCTSTR lpszUrl = _T("http://127.0.0.1:5102/api?filename=newfile4.txt&storeagekey=storagekey2"); + LPCXSTR lpszUrl = _X("http://127.0.0.1:5102/api?filename=newfile4.txt&storeagekey=storagekey2"); int nLen = 0; int nCode = 0; - TCHAR* ptszMsgBuffer = NULL; - TCHAR tszBaseBuffer[128]; - TCHAR tszHdrBuffer[MAX_PATH]; - TCHAR tszKeyBuffer[MAX_PATH]; - LPCTSTR lpszMsgBuffer = _T("01234"); - LPCTSTR lpszMsgBuffer2 = _T("56789"); + XCHAR* ptszMsgBuffer = NULL; + XCHAR tszBaseBuffer[128]; + XCHAR tszHdrBuffer[MAX_PATH]; + XCHAR tszKeyBuffer[MAX_PATH]; + LPCXSTR lpszMsgBuffer = _X("01234"); + LPCXSTR lpszMsgBuffer2 = _X("56789"); memset(tszBaseBuffer, '\0', sizeof(tszBaseBuffer)); memset(tszHdrBuffer, '\0', MAX_PATH); memset(tszKeyBuffer, '\0', MAX_PATH); OPenSsl_Help_BasicEncoder("123123aa", "123123", tszBaseBuffer); - _stprintf(tszHdrBuffer, _T("Range: bytes=0-5/10\r\nAuthorization: %s\r\n"), tszBaseBuffer); - if (!APIClient_Http_Request(_T("POST"), lpszUrl, lpszMsgBuffer, &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) + _xtprintf(tszHdrBuffer, _X("Range: bytes=0-5/10\r\nAuthorization: %s\r\n"), tszBaseBuffer); + if (!APIClient_Http_Request(_X("POST"), lpszUrl, lpszMsgBuffer, &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { - printf("upload failed:%lX\n", APIClient_GetLastError()); + _xtprintf("upload failed:%lX\n", APIClient_GetLastError()); return; } JSONCPP_STRING st_JsonError; @@ -61,59 +65,59 @@ void File_UPLoad() { return; } - _tcscpy(tszKeyBuffer, st_JsonRoot["lpszBuckKey"].asCString()); + _tcsxcpy(tszKeyBuffer, st_JsonRoot["lpszBuckKey"].asCString()); - printf("upload:%d\n", nCode); + _xtprintf("upload:%d\n", nCode); BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); //断点续传必须指定storagekey nLen = 0; memset(tszHdrBuffer, '\0', MAX_PATH); - _stprintf(tszHdrBuffer, _T("Range: bytes=5-10/10\r\nAuthorization: %s\r\nStorageKey: %s\r\n"), tszBaseBuffer, tszKeyBuffer); - if (!APIClient_Http_Request(_T("POST"), lpszUrl, lpszMsgBuffer2, &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) + _xstprintf(tszHdrBuffer, _X("Range: bytes=5-10/10\r\nAuthorization: %s\r\nStorageKey: %s\r\n"), tszBaseBuffer, tszKeyBuffer); + if (!APIClient_Http_Request(_X("POST"), lpszUrl, lpszMsgBuffer2, &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { - printf("upload failed:%lX\n", APIClient_GetLastError()); + _xtprintf("upload failed:%lX\n", APIClient_GetLastError()); return; } - printf("upload:%d\n%s\n", nCode, ptszMsgBuffer); + _xtprintf("upload:%d\n%s\n", nCode, ptszMsgBuffer); BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } //下载文件 void File_Download() { - LPCTSTR lpszUrl = _T("http://192.168.1.8:5101/storagekey2/newfile4.txt"); + LPCXSTR lpszUrl = _X("http://192.168.1.8:5101/storagekey2/newfile4.txt"); int nLen = 0; - TCHAR* ptszMsgBuffer = NULL; - TCHAR tszBaseBuffer[128]; - TCHAR tszHdrBuffer[MAX_PATH]; + XCHAR* ptszMsgBuffer = NULL; + XCHAR tszBaseBuffer[128]; + XCHAR tszHdrBuffer[MAX_PATH]; memset(tszBaseBuffer, '\0', sizeof(tszBaseBuffer)); memset(tszHdrBuffer, '\0', MAX_PATH); OPenSsl_Help_BasicEncoder("123123aa", "123123", tszBaseBuffer); - _stprintf(tszHdrBuffer, _T("Range: bytes=0-5\r\nAuthorization: %s\r\n"), tszBaseBuffer); - if (!APIClient_Http_Request(_T("GET"), lpszUrl, NULL, NULL, &ptszMsgBuffer, &nLen, tszHdrBuffer)) + _xstprintf(tszHdrBuffer, _X("Range: bytes=0-5\r\nAuthorization: %s\r\n"), tszBaseBuffer); + if (!APIClient_Http_Request(_X("GET"), lpszUrl, NULL, NULL, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { - printf("download failed:%lX\n", APIClient_GetLastError()); + _xtprintf("download failed:%lX\n", APIClient_GetLastError()); return; } - printf("download:%d,%s\n", nLen, ptszMsgBuffer); + _xtprintf("download:%d,%s\n", nLen, ptszMsgBuffer); BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); memset(tszHdrBuffer, '\0', MAX_PATH); - _stprintf(tszHdrBuffer, _T("Range: bytes=5-10\r\nAuthorization: %s\r\n"), tszBaseBuffer); - if (!APIClient_Http_Request(_T("GET"), lpszUrl, NULL, NULL, &ptszMsgBuffer, &nLen, tszHdrBuffer)) + _xstprintf(tszHdrBuffer, _X("Range: bytes=5-10\r\nAuthorization: %s\r\n"), tszBaseBuffer); + if (!APIClient_Http_Request(_X("GET"), lpszUrl, NULL, NULL, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { - printf("download failed:%lX\n", APIClient_GetLastError()); + _xtprintf("download failed:%lX\n", APIClient_GetLastError()); return; } - printf("download:%d,%s\n", nLen, ptszMsgBuffer); + _xtprintf("download:%d,%s\n", nLen, ptszMsgBuffer); BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); } int main() { -#ifdef _WINDOWS +#ifdef _MSC_BUILD WSADATA st_WSAData; WSAStartup(MAKEWORD(2, 2), &st_WSAData); #endif diff --git a/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.vcxproj b/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.vcxproj index 28146c5..df6aa9b 100644 --- a/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.vcxproj +++ b/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.vcxproj @@ -80,6 +80,8 @@ true + $(XEngine_Include);../../XEngine_Source/XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) false @@ -116,7 +118,7 @@ Level3 true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true diff --git a/XEngine_APPClient/VSCopy_x64.bat b/XEngine_APPClient/VSCopy_x64.bat new file mode 100644 index 0000000..9d38da4 --- /dev/null +++ b/XEngine_APPClient/VSCopy_x64.bat @@ -0,0 +1,11 @@ +copy /y "%XEngine_Lib64%\XEngine_BaseLib\XEngine_BaseLib.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_BaseLib\XEngine_Algorithm.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_Core\XEngine_OPenSsl.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_NetHelp\NetHelp_APIClient.dll" "./" + +copy /y "%XEngine_Lib64%\XEngine_HelpComponents\zlib1.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_LibEx\libcrypto-3-x64.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_LibEx\libssl-3.dll-x64" "./" +copy /y "%XEngine_Lib64%\XEngine_LibEx\libcurl.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_LibEx\nghttp2.dll" "./" \ No newline at end of file -- Gitee From 40bdbf3bca8d5d096c59b203c32fafb81d881f34 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 19 Apr 2023 09:36:17 +0800 Subject: [PATCH 06/13] update:main Makefile --- XEngine_Source/Makefile | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index b3216cc..19e269b 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -1,7 +1,7 @@ RELEASE = 0 UNICODE = 0 - -FLAGS = RELEASE=$(RELEASE) +PLATFORM=linux +FLAGS= THIRD_JSONCPP_PATH = ./XEngine_ThirdPart/jsoncpp @@ -13,35 +13,26 @@ BASE_PROTOCOL_PATH = ./StorageModule_Protocol APPSERVICE_STORAGE_PATH = ./XEngine_StorageApp -NETENGINE_LIB = libjsoncpp.so \ +XENGINE_MODULES = libjsoncpp.so \ libStorageModule_Database.so libStorageModule_Config.so libStorageModule_Session.so libStorageModule_APIHelp.so libStorageModule_Protocol.so \ XEngine_StorageApp.exe .PHONY:MakeAll -MakeAll:$(NETENGINE_LIB) +MakeAll:$(XENGINE_MODULES) libjsoncpp.so: - make -C $(THIRD_JSONCPP_PATH) $(FLAGS) + make -C $(THIRD_JSONCPP_PATH) PLATFORM=$(PLATFORM) $(FLAGS) libStorageModule_Database.so: - make -C $(BASE_SQL_PATH) $(FLAGS) + make -C $(BASE_SQL_PATH) PLATFORM=$(PLATFORM) $(FLAGS) libStorageModule_Config.so: - make -C $(BASE_CONFIG_PATH) $(FLAGS) + make -C $(BASE_CONFIG_PATH) PLATFORM=$(PLATFORM) $(FLAGS) libStorageModule_Session.so: - make -C $(BASE_SESSION_PATH) $(FLAGS) + make -C $(BASE_SESSION_PATH) PLATFORM=$(PLATFORM) $(FLAGS) libStorageModule_APIHelp.so: - make -C $(BASE_APIHELP_PATH) $(FLAGS) + make -C $(BASE_APIHELP_PATH) PLATFORM=$(PLATFORM) $(FLAGS) libStorageModule_Protocol.so: - make -C $(BASE_PROTOCOL_PATH) $(FLAGS) + make -C $(BASE_PROTOCOL_PATH) PLATFORM=$(PLATFORM) $(FLAGS) XEngine_StorageApp.exe: - make -C $(APPSERVICE_STORAGE_PATH) $(FLAGS) - - -SetFlags_Install: - export FLAGS=InstallAll -InstallAll:SetFlags_Install $(NETENGINE_LIB) - -SetFlags_Clean: - export FLAGS=CleanAll -CleanAll:SetFlags_Clean $(NETENGINE_LIB) + make -C $(APPSERVICE_STORAGE_PATH) PLATFORM=$(PLATFORM) $(FLAGS) -- Gitee From f1de661c91a6ced951db8246b68b19d31eb14c6b Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 19 Apr 2023 13:41:59 +0800 Subject: [PATCH 07/13] update:vscopy --- XEngine_Source/VSCopy_Debug.bat | 2 +- XEngine_Source/VSCopy_x64.bat | 2 +- XEngine_Source/VSCopy_x86.bat | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/XEngine_Source/VSCopy_Debug.bat b/XEngine_Source/VSCopy_Debug.bat index 0acd9dd..bcf1298 100644 --- a/XEngine_Source/VSCopy_Debug.bat +++ b/XEngine_Source/VSCopy_Debug.bat @@ -9,4 +9,4 @@ copy /y "D:\XEngine\XEngine_SourceCode\Debug\NetHelp_APIClient.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\HelpComponents_DataBase.dll" "./" copy /y "D:\XEngine\XEngine_SourceCode\Debug\HelpComponents_XLog.dll" "./" -copy /y "D:\XEngine\XEngine_SourceCode\Debug\RfcComponents_HttpServer.dll" "./" \ No newline at end of file +copy /y "D:\XEngine\XEngine_SourceCode\Debug\RfcComponents_HttpProtocol.dll" "./" \ No newline at end of file diff --git a/XEngine_Source/VSCopy_x64.bat b/XEngine_Source/VSCopy_x64.bat index cd0fcf8..ba0a306 100644 --- a/XEngine_Source/VSCopy_x64.bat +++ b/XEngine_Source/VSCopy_x64.bat @@ -9,7 +9,7 @@ copy /y "%XEngine_Lib64%\XEngine_NetHelp\NetHelp_APIClient.dll" "./" copy /y "%XEngine_Lib64%\XEngine_HelpComponents\HelpComponents_DataBase.dll" "./" copy /y "%XEngine_Lib64%\XEngine_HelpComponents\HelpComponents_XLog.dll" "./" -copy /y "%XEngine_Lib64%\XEngine_RfcComponents\RfcComponents_HttpServer.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_RfcComponents\RfcComponents_HttpProtocol.dll" "./" copy /y "%XEngine_Lib64%\XEngine_HelpComponents\bson-1.0.dll" "./" copy /y "%XEngine_Lib64%\XEngine_HelpComponents\mongoc-1.0.dll" "./" diff --git a/XEngine_Source/VSCopy_x86.bat b/XEngine_Source/VSCopy_x86.bat index 90c09f5..d754d3d 100644 --- a/XEngine_Source/VSCopy_x86.bat +++ b/XEngine_Source/VSCopy_x86.bat @@ -9,7 +9,7 @@ copy /y "%XEngine_Lib32%\XEngine_NetHelp\NetHelp_APIClient.dll" "./" copy /y "%XEngine_Lib32%\XEngine_HelpComponents\HelpComponents_DataBase.dll" "./" copy /y "%XEngine_Lib32%\XEngine_HelpComponents\HelpComponents_XLog.dll" "./" -copy /y "%XEngine_Lib32%\XEngine_RfcComponents\RfcComponents_HttpServer.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_RfcComponents\RfcComponents_HttpProtocol.dll" "./" copy /y "%XEngine_Lib32%\XEngine_HelpComponents\bson-1.0.dll" "./" copy /y "%XEngine_Lib32%\XEngine_HelpComponents\mongoc-1.0.dll" "./" -- Gitee From b402bf4994b3352beb6e12d285964a80efe74b21 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 19 Apr 2023 14:14:06 +0800 Subject: [PATCH 08/13] fixed:can't create table of file modify:charset to utf8mb4_unicode_ci --- XEngine_SQLFile/XEngine_Storage.sql | 24 +++++++++--------- XEngine_SQLFile/XStorage_Create.sql | 2 +- .../Database_File/Database_File.cpp | 25 ++++++++++++------- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/XEngine_SQLFile/XEngine_Storage.sql b/XEngine_SQLFile/XEngine_Storage.sql index fb6fded..8a0e238 100644 --- a/XEngine_SQLFile/XEngine_Storage.sql +++ b/XEngine_SQLFile/XEngine_Storage.sql @@ -1,17 +1,17 @@ /* Navicat Premium Data Transfer - Source Server : 192.168.1.12 + Source Server : QCloud Source Server Type : MySQL - Source Server Version : 80027 - Source Host : 192.168.1.12:3306 + Source Server Version : 80032 (8.0.32-0ubuntu0.22.04.2) + Source Host : 42.194.178.57:3306 Source Schema : XEngine_Storage Target Server Type : MySQL - Target Server Version : 80027 + Target Server Version : 80032 (8.0.32-0ubuntu0.22.04.2) File Encoding : 65001 - Date: 06/01/2022 10:45:33 + Date: 19/04/2023 13:46:21 */ SET NAMES utf8mb4; @@ -23,14 +23,14 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `XStorage_File`; CREATE TABLE `XStorage_File` ( `ID` int NOT NULL AUTO_INCREMENT COMMENT 'ID序号', - `BuckKey` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '路径KEY', - `FilePath` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文件路径', - `FileName` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文件名称', - `FileHash` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件HASH', - `FileUser` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件所属用户', + `BuckKey` varchar(260) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '路径KEY', + `FilePath` varchar(260) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件路径', + `FileName` varchar(260) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件名称', + `FileHash` varchar(260) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件HASH', + `FileUser` varchar(260) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件所属用户', `FileSize` bigint NOT NULL COMMENT '文件大小', `FileTime` datetime NOT NULL COMMENT '插入时间', PRIMARY KEY (`ID`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC; +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; -SET FOREIGN_KEY_CHECKS = 1; +SET FOREIGN_KEY_CHECKS = 1; \ No newline at end of file diff --git a/XEngine_SQLFile/XStorage_Create.sql b/XEngine_SQLFile/XStorage_Create.sql index 7d488f9..79e9aa1 100644 --- a/XEngine_SQLFile/XStorage_Create.sql +++ b/XEngine_SQLFile/XStorage_Create.sql @@ -3,4 +3,4 @@ */ -CREATE DATABASE `XEngine_Storage` DEFAULT CHARACTER SET UTF8MB4 COLLATE utf8mb4_general_ci; \ No newline at end of file +CREATE DATABASE `XEngine_Storage` DEFAULT CHARACTER SET UTF8MB4 COLLATE utf8mb4_unicode_ci; \ No newline at end of file diff --git a/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp b/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp index 317003d..326f6be 100644 --- a/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp +++ b/XEngine_Source/StorageModule_Database/Database_File/Database_File.cpp @@ -55,7 +55,7 @@ bool CDatabase_File::Database_File_Init(DATABASE_MYSQL_CONNECTINFO *pSt_DBConnec m_nTimeMonth = nTimeDay; //连接数据库 _tcsxcpy(pSt_DBConnector->tszDBName, _X("XEngine_Storage")); - if (!DataBase_MySQL_Connect(&xhDBSQL, pSt_DBConnector, 5, true, _X("utf8"))) + if (!DataBase_MySQL_Connect(&xhDBSQL, pSt_DBConnector)) { Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); @@ -493,18 +493,25 @@ bool CDatabase_File::Database_File_CreateTable() _xstprintf(tszSQLQuery, _X("CREATE TABLE IF NOT EXISTS `%s` (" "`ID` int NOT NULL AUTO_INCREMENT COMMENT 'ID序号'," - "`BuckKey` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '路径KEY'," - "`FilePath` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文件路径'," - "`FileName` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文件名称'," - "`FileHash` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件HASH'," - "`FileUser` varchar(260) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件所属用户'," + "`BuckKey` varchar(260) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '路径KEY'," + "`FilePath` varchar(260) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件路径'," + "`FileName` varchar(260) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件名称'," + "`FileHash` varchar(260) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件HASH'," + "`FileUser` varchar(260) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件所属用户'," "`FileSize` bigint NOT NULL COMMENT '文件大小'," "`FileTime` datetime NOT NULL COMMENT '插入时间'," "PRIMARY KEY (`ID`) USING BTREE" - ") ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;" + ") ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;" ), tszTableName); - - if (!DataBase_MySQL_Execute(xhDBSQL, tszSQLQuery)) +#ifdef _MSC_BUILD + int nUTFLen = 0; + XCHAR tszUTFBuffer[2048]; + memset(tszUTFBuffer, '\0', sizeof(tszUTFBuffer)); + BaseLib_OperatorCharset_AnsiToUTF(tszSQLQuery, tszUTFBuffer, &nUTFLen); + if (!DataBase_MySQL_Execute(xhDBSQL, tszUTFBuffer)) +#else + if (!DataBase_MySQL_Execute(xhDBSQL, tszSQLQuery)) +#endif { Database_IsErrorOccur = true; Database_dwErrorCode = DataBase_GetLastError(); -- Gitee From f6bc5541189b43949a01fe2b2b66e16f03f6a6b0 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 19 Apr 2023 15:28:50 +0800 Subject: [PATCH 09/13] modify:printf xengine type str --- XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp index 5d1516c..94d76c0 100644 --- a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp +++ b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp @@ -418,7 +418,7 @@ int main(int argc, char** argv) XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,P2P存储服务配置为不启动")); } - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("所有服务成功启动,存储中心服务运行中,发行版本次数:%d,XEngine版本:%s 当前运行版本:%s。。。"), st_ServiceCfg.st_XVer.pStl_ListStorage->size(), BaseLib_OperatorVer_XGetStr(), st_ServiceCfg.st_XVer.pStl_ListStorage->front().c_str()); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("所有服务成功启动,存储中心服务运行中,发行版本次数:%d,XEngine版本:%s%s 当前运行版本:%s。。。"), st_ServiceCfg.st_XVer.pStl_ListStorage->size(), BaseLib_OperatorVer_XNumberStr(), BaseLib_OperatorVer_XTypeStr(), st_ServiceCfg.st_XVer.pStl_ListStorage->front().c_str()); while (true) { -- Gitee From 03d8209694cd230b3451c95b67eec2d38e803014 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 19 Apr 2023 16:12:51 +0800 Subject: [PATCH 10/13] modify:detach auth and proxy configure modify:download and upload and center support both verification switch --- .../StorageModule_Config/Config_Define.h | 26 ++++++++-------- .../StorageModule_Config/Config_Error.h | 1 + .../Config_Json/Config_Json.cpp | 31 ++++++++++++------- .../XEngine_StorageApp/StorageApp_Center.cpp | 8 ++--- .../StorageApp_Download.cpp | 16 +++++----- .../StorageApp_UPLoader.cpp | 16 +++++----- .../XEngine_StorageApp/XEngine_StorageApp.cpp | 2 +- 7 files changed, 54 insertions(+), 46 deletions(-) diff --git a/XEngine_Source/StorageModule_Config/Config_Define.h b/XEngine_Source/StorageModule_Config/Config_Define.h index 7c9aa79..4825011 100644 --- a/XEngine_Source/StorageModule_Config/Config_Define.h +++ b/XEngine_Source/StorageModule_Config/Config_Define.h @@ -63,21 +63,21 @@ typedef struct tag_XEngine_ServerConfig bool bUPHash; int nHashMode; }st_XStorage; + struct + { + bool bUPAuth; + bool bDLAuth; + bool bCHAuth; + XCHAR tszUserList[MAX_PATH]; + }st_XAuth; struct { - struct - { - bool bAuth; - XCHAR tszAuthProxy[MAX_PATH]; - XCHAR tszUserList[MAX_PATH]; - }st_XProxyAuth; - struct - { - bool bUPPass; - bool bDLPass; - XCHAR tszUPPass[MAX_PATH]; - XCHAR tszDLPass[MAX_PATH]; - }st_XProxyPass; + bool bUPPass; + bool bDLPass; + bool bAuthPass; + XCHAR tszUPPass[MAX_PATH]; + XCHAR tszDLPass[MAX_PATH]; + XCHAR tszAuthPass[MAX_PATH]; }st_XProxy; struct { diff --git a/XEngine_Source/StorageModule_Config/Config_Error.h b/XEngine_Source/StorageModule_Config/Config_Error.h index 556dabb..0c5ec43 100644 --- a/XEngine_Source/StorageModule_Config/Config_Error.h +++ b/XEngine_Source/StorageModule_Config/Config_Error.h @@ -24,6 +24,7 @@ #define ERROR_XENGINE_BLOGIC_CONFIG_JSON_XPROXY 0x0020009 #define ERROR_XENGINE_BLOGIC_CONFIG_JSON_P2XP 0x002000A #define ERROR_XENGINE_BLOGIC_CONFIG_JSON_CERT 0x002000B +#define ERROR_XENGINE_BLOGIC_CONFIG_JSON_XAUTH 0x002000C #define ERROR_XENGINE_BLOGIC_CONFIG_JSON_LBDISTRIBUTED 0x0020010 #define ERROR_XENGINE_BLOGIC_CONFIG_JSON_LBLOCATION 0x0020011 diff --git a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp index 82f30ca..b788020 100644 --- a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp +++ b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp @@ -150,24 +150,31 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG pSt_ServerConfig->st_XStorage.bUPHash = st_JsonXStorage["bUPHash"].asInt(); pSt_ServerConfig->st_XStorage.bResumable = st_JsonXStorage["bResumable"].asInt(); - if (st_JsonRoot["XProxy"].empty() || (2 != st_JsonRoot["XProxy"].size())) + if (st_JsonRoot["XProxy"].empty() || (6 != st_JsonRoot["XProxy"].size())) { Config_IsErrorOccur = true; Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XPROXY; return false; } Json::Value st_JsonXProxy = st_JsonRoot["XProxy"]; - Json::Value st_JsonXProxyAuth = st_JsonXProxy["XProxyAuth"]; - Json::Value st_JsonXProxyPass = st_JsonXProxy["XProxyPass"]; - - pSt_ServerConfig->st_XProxy.st_XProxyAuth.bAuth = st_JsonXProxyAuth["bAuth"].asInt(); - _tcsxcpy(pSt_ServerConfig->st_XProxy.st_XProxyAuth.tszAuthProxy, st_JsonXProxyAuth["tszAuthProxy"].asCString()); - _tcsxcpy(pSt_ServerConfig->st_XProxy.st_XProxyAuth.tszUserList, st_JsonXProxyAuth["tszUserList"].asCString()); - - pSt_ServerConfig->st_XProxy.st_XProxyPass.bDLPass = st_JsonXProxyPass["bDLGet"].asInt(); - pSt_ServerConfig->st_XProxy.st_XProxyPass.bUPPass = st_JsonXProxyPass["bUPGet"].asInt(); - _tcsxcpy(pSt_ServerConfig->st_XProxy.st_XProxyPass.tszDLPass, st_JsonXProxyPass["tszDLPass"].asCString()); - _tcsxcpy(pSt_ServerConfig->st_XProxy.st_XProxyPass.tszUPPass, st_JsonXProxyPass["tszUPPass"].asCString()); + pSt_ServerConfig->st_XProxy.bDLPass = st_JsonXProxy["bDLPass"].asBool(); + pSt_ServerConfig->st_XProxy.bUPPass = st_JsonXProxy["bUPPass"].asBool(); + pSt_ServerConfig->st_XProxy.bAuthPass = st_JsonXProxy["bAuthPass"].asBool(); + _tcsxcpy(pSt_ServerConfig->st_XProxy.tszDLPass, st_JsonXProxy["tszDLPass"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XProxy.tszUPPass, st_JsonXProxy["tszUPPass"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XProxy.tszAuthPass, st_JsonXProxy["tszAuthPass"].asCString()); + + if (st_JsonRoot["XAuth"].empty() || (4 != st_JsonRoot["XAuth"].size())) + { + Config_IsErrorOccur = true; + Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XAUTH; + return false; + } + Json::Value st_JsonXAuth = st_JsonRoot["XAuth"]; + pSt_ServerConfig->st_XAuth.bUPAuth = st_JsonXAuth["bUPAuth"].asInt(); + pSt_ServerConfig->st_XAuth.bDLAuth = st_JsonXAuth["bDLAuth"].asInt(); + pSt_ServerConfig->st_XAuth.bCHAuth = st_JsonXAuth["bCHAuth"].asInt(); + _tcsxcpy(pSt_ServerConfig->st_XAuth.tszUserList, st_JsonXAuth["tszUserList"].asCString()); if (st_JsonRoot["XLimit"].empty() || (5 != st_JsonRoot["XLimit"].size())) { diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp index a5ac9c7..4e5509e 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp @@ -58,7 +58,7 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int LPCXSTR lpszMethodPost = _X("POST"); LPCXSTR lpszMethodOption = _X("OPTIONS"); - if (st_ServiceCfg.st_XProxy.st_XProxyAuth.bAuth) + if (st_ServiceCfg.st_XAuth.bCHAuth) { XCHAR tszUserName[64]; XCHAR tszUserPass[64]; @@ -76,14 +76,14 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); return false; } - if (_tcsxlen(st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy) > 0) + if (st_ServiceCfg.st_XProxy.bAuthPass) { int nBLen = 0; int nResponseCode = 0; XCHAR* ptszBody = NULL; Protocol_StoragePacket_BasicAuth(pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); - APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); + APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.tszAuthPass, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); if (200 != nResponseCode) { st_HDRParam.bIsClose = true; @@ -95,7 +95,7 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } BaseLib_OperatorMemory_FreeCStyle((VOID**)&ptszBody); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s"), lpszClientAddr, st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszUserName, tszUserPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s"), lpszClientAddr, st_ServiceCfg.st_XProxy.tszAuthPass, tszUserName, tszUserPass); } else { diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp index a8596ad..f0d1572 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp @@ -67,7 +67,7 @@ void CALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, X { if (nMsgLen <= 0) { - if (st_ServiceCfg.st_XProxy.st_XProxyPass.bDLPass) + if (st_ServiceCfg.st_XProxy.bDLPass) { int nPLen = MAX_PATH; int nHttpCode = 0; @@ -79,13 +79,13 @@ void CALLBACK XEngine_Download_CBSend(LPCXSTR lpszClientAddr, XSOCKET hSocket, X Session_DLStroage_GetInfo(lpszClientAddr, &st_StorageInfo); Protocol_StoragePacket_UPDown(tszProxyStr, &nPLen, st_StorageInfo.tszFileDir, st_StorageInfo.tszBuckKey, st_StorageInfo.tszClientAddr, st_StorageInfo.ullRWCount, true, st_StorageInfo.tszFileHash); - if (APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass, tszProxyStr, &nHttpCode)) + if (APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.tszDLPass, tszProxyStr, &nHttpCode)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.tszDLPass); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,请求完成通知失败,可能对方服务没有开启,文件:%s,地址:%s"), lpszClientAddr, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszDLPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,请求完成通知失败,可能对方服务没有开启,文件:%s,地址:%s"), lpszClientAddr, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.tszDLPass); } } NetCore_TCPXCore_CBSendEx(xhNetDownload, lpszClientAddr); @@ -156,7 +156,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in } } //验证用户 - if (st_ServiceCfg.st_XProxy.st_XProxyAuth.bAuth) + if (st_ServiceCfg.st_XAuth.bDLAuth) { XCHAR tszUserName[64]; XCHAR tszUserPass[64]; @@ -174,7 +174,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("下载客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); return false; } - if (_tcsxlen(st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy) > 0) + if (st_ServiceCfg.st_XProxy.bAuthPass) { int nBLen = 0; int nCode = 0; @@ -182,7 +182,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in XCHAR* ptszBody = NULL; Protocol_StoragePacket_BasicAuth(pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); - APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); + APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.tszAuthPass, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); if (200 != nResponseCode) { st_HDRParam.bIsClose = true; @@ -195,7 +195,7 @@ bool XEngine_Task_HttpDownload(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in } Protocol_StorageParse_SpeedLimit(ptszBody, nSDLen, &nCode, &nLimit); BaseLib_OperatorMemory_FreeCStyle((VOID**)&ptszBody); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s,值:%d"), lpszClientAddr, st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszUserName, tszUserPass, nCode); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("下载客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s,值:%d"), lpszClientAddr, st_ServiceCfg.st_XProxy.tszAuthPass, tszUserName, tszUserPass, nCode); } else { diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp index b7efdc9..a5bd9c8 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp @@ -77,7 +77,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in } } //用户验证 - if (st_ServiceCfg.st_XProxy.st_XProxyAuth.bAuth) + if (st_ServiceCfg.st_XAuth.bUPAuth) { XCHAR tszUserName[64]; XCHAR tszUserPass[64]; @@ -95,14 +95,14 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,用户验证失败,错误:%lX"), lpszClientAddr, StorageHelp_GetLastError()); return false; } - if (_tcsxlen(st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy) > 0) + if (st_ServiceCfg.st_XProxy.bAuthPass) { int nBLen = 0; int nResponseCode = 0; XCHAR* ptszBody = NULL; Protocol_StoragePacket_BasicAuth(pSt_HTTPParam->tszHttpMethod, pSt_HTTPParam->tszHttpUri, lpszClientAddr, tszUserName, tszUserPass, tszSDBuffer, &nSDLen); - APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); + APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.tszAuthPass, tszSDBuffer, &nResponseCode, &ptszBody, &nBLen); if (200 != nResponseCode) { st_HDRParam.bIsClose = true; @@ -114,7 +114,7 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,用户验证失败,用户名:%s,密码:%s,错误码:%d,错误内容:%s"), tszUserName, tszUserPass, tszUserPass, nResponseCode, ptszBody); } BaseLib_OperatorMemory_FreeCStyle((VOID**)&ptszBody); - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s"), lpszClientAddr, st_ServiceCfg.st_XProxy.st_XProxyAuth.tszAuthProxy, tszUserName, tszUserPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,代理服务:%s 验证通过,用户名:%s,密码:%s"), lpszClientAddr, st_ServiceCfg.st_XProxy.tszAuthPass, tszUserName, tszUserPass); } else { @@ -355,16 +355,16 @@ bool XEngine_Task_HttpUPLoader(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, in XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d,数据库没有启用,不插入数据库"), lpszClientAddr, tszFileDir, nRVCount); } //PASS代理 - if (st_ServiceCfg.st_XProxy.st_XProxyPass.bUPPass) + if (st_ServiceCfg.st_XProxy.bUPPass) { int nHttpCode = 0; - if (APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass, tszPassNotify, &nHttpCode)) + if (APIClient_Http_Request(_X("POST"), st_ServiceCfg.st_XProxy.tszUPPass, tszPassNotify, &nHttpCode)) { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("上传客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.tszUPPass); } else { - XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求完成通知失败,可能服务器不正确:文件:%s,地址:%s"), lpszClientAddr, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass); + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("上传客户端:%s,请求完成通知失败,可能服务器不正确:文件:%s,地址:%s"), lpszClientAddr, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.tszUPPass); } } } diff --git a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp index 94d76c0..cc080fe 100644 --- a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp +++ b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp @@ -217,7 +217,7 @@ int main(int argc, char** argv) XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,初始化数据库失败,数据库被设置为禁用,相关功能已经被禁止使用!")); } - if (!Session_User_Init(st_ServiceCfg.st_XProxy.st_XProxyAuth.tszUserList)) + if (!Session_User_Init(st_ServiceCfg.st_XAuth.tszUserList)) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动用户管理服务失败,错误:%lX"), Session_GetLastError()); goto XENGINE_EXITAPP; -- Gitee From 7c6798854e2808d234d4d090dbcc611e60228ac4 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 20 Apr 2023 13:36:22 +0800 Subject: [PATCH 11/13] update:example --- .../APPClient_RestApi/APPClient_RestApi.cpp | 38 ++++++++++++------- .../APPClient_RestApi.vcxproj | 2 +- .../APPClient_UPFile/APPClient_UPFile.cpp | 4 +- .../APPClient_UPMaker/APPClient_UPMaker.cpp | 17 +++++---- XEngine_APPClient/APPClient_UPDate/README.md | 13 +++++++ .../APPClient_UPDownload.cpp | 4 +- 6 files changed, 52 insertions(+), 26 deletions(-) create mode 100644 XEngine_APPClient/APPClient_UPDate/README.md diff --git a/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.cpp b/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.cpp index cf14cb3..bddbb1e 100644 --- a/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.cpp +++ b/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.cpp @@ -2,6 +2,7 @@ #include #include #pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") +#pragma comment(lib,"XEngine_Core/XEngine_OPenSsl") #pragma comment(lib,"XEngine_NetHelp/NetHelp_APIClient") #pragma comment(lib,"Ws2_32") #ifdef _WIN64 @@ -20,29 +21,34 @@ #include #include #include +#include +#include #include #include using namespace std; -//g++ -std=c++17 -Wall -g APPClient_RestApi.cpp -o APPClient_RestApi.exe -L ../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_BaseLib -L ../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_NetHelp -lXEngine_BaseLib -lNetHelp_APIClient -ljsoncpp -Wl,-rpath=../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_BaseLib:../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_NetHelp,--disable-new-dtags +//g++ -std=c++17 -Wall -g APPClient_RestApi.cpp -o APPClient_RestApi.exe -L ../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_Core -L ../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_NetHelp -lXEngine_BaseLib -lNetHelp_APIClient -ljsoncpp -Wl,-rpath=../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_BaseLib:../../../XEngine/XEngine_Release/XEngine_Linux/Ubuntu/XEngine_NetHelp,--disable-new-dtags //需要优先配置XEngine //WINDOWS使用VS2022 x86 或者 x64 debug 编译 //linux使用下面的命令编译 -//g++ -std=c++17 -Wall -g APPClient_RestApi.cpp -o APPClient_RestApi.exe -I ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_NetHelp -L ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -lXEngine_BaseLib -lNetHelp_APIClient -ljsoncpp +//g++ -std=c++17 -Wall -g APPClient_RestApi.cpp -o APPClient_RestApi.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 -L ../../XEngine_Source/XEngine_ThirdPart/jsoncpp -lXEngine_BaseLib -lNetHelp_APIClient -ljsoncpp +XCHAR tszBaseBuffer[MAX_PATH]; +XCHAR tszHdrBuffer[MAX_PATH]; //查询 void API_Manage_Query() { - LPCXSTR lpszUrl = _X("http://192.168.1.8:5100/Api/Manage/QueryFile"); + LPCXSTR lpszUrl = _X("http://127.0.0.1:5100/Api/Manage/QueryFile"); int nLen = 0; int nCode = 0; XCHAR* ptszMsgBuffer = NULL; Json::Value st_JsonRoot; + st_JsonRoot["lpszTimeStart"]; st_JsonRoot["lpszTimeEnd"]; st_JsonRoot["lpszBuckKey"] = "storagekey2"; - if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { _xtprintf("API_Manage_Query:%lX\n", APIClient_GetLastError()); return; @@ -53,7 +59,7 @@ void API_Manage_Query() //插入 void API_Manage_Insert() { - LPCXSTR lpszUrl = _X("http://192.168.1.8:5100/Api/Manage/Insert"); + LPCXSTR lpszUrl = _X("http://127.0.0.1:5100/Api/Manage/Insert"); int nLen = 0; int nCode = 0; XCHAR* ptszMsgBuffer = NULL; @@ -70,7 +76,7 @@ void API_Manage_Insert() st_JsonRoot["List"] = st_JsonArray; st_JsonRoot["Count"] = 1; - if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { _xtprintf("API_Manage_Insert:%lX\n", APIClient_GetLastError()); return; @@ -81,7 +87,7 @@ void API_Manage_Insert() //删除 void API_Manage_Delete() { - LPCXSTR lpszUrl = _X("http://192.168.1.8:5100/Api/Manage/Delete"); + LPCXSTR lpszUrl = _X("http://127.0.0.1:5100/Api/Manage/Delete"); int nLen = 0; int nCode = 0; XCHAR* ptszMsgBuffer = NULL; @@ -95,7 +101,7 @@ void API_Manage_Delete() st_JsonRoot["List"] = st_JsonArray; st_JsonRoot["Count"] = 1; - if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { _xtprintf("API_Manage_Delete:%lX\n", APIClient_GetLastError()); return; @@ -106,7 +112,7 @@ void API_Manage_Delete() //文件夹 void API_Manage_Dir() { - LPCXSTR lpszUrl = _X("http://192.168.1.8:5100/Api/Manage/Dir"); + LPCXSTR lpszUrl = _X("http://127.0.0.1:5100/Api/Manage/Dir"); int nLen = 0; int nCode = 0; XCHAR* ptszMsgBuffer = NULL; @@ -115,7 +121,7 @@ void API_Manage_Dir() st_JsonRoot["lpszBuckKey"] = "storagekey1"; st_JsonRoot["lpszUserDir"] = "user"; st_JsonRoot["nOPerator"] = 1; - if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { _xtprintf("API_Manage_Dir:%lX\n", APIClient_GetLastError()); return; @@ -127,7 +133,7 @@ void API_Manage_Dir() st_JsonRoot["lpszBuckKey"] = "storagekey1"; st_JsonRoot["lpszUserDir"]; st_JsonRoot["nOPerator"] = 0; - if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { _xtprintf("API_Manage_Dir:%lX\n", APIClient_GetLastError()); return; @@ -139,7 +145,7 @@ void API_Manage_Dir() st_JsonRoot["lpszBuckKey"] = "storagekey1"; st_JsonRoot["lpszUserDir"] = "user"; st_JsonRoot["nOPerator"] = 2; - if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, st_JsonRoot.toStyledString().c_str(), &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { _xtprintf("API_Manage_Dir:%lX\n", APIClient_GetLastError()); return; @@ -150,11 +156,11 @@ void API_Manage_Dir() //任务管理 void API_Manage_Task() { - LPCXSTR lpszUrl = _X("http://192.168.1.8:5100/Api/Manage/Task"); + LPCXSTR lpszUrl = _X("http://127.0.0.1:5100/Api/Manage/Task"); int nLen = 0; int nCode = 0; XCHAR* ptszMsgBuffer = NULL; - if (!APIClient_Http_Request(_X("POST"), lpszUrl, NULL, &nCode, &ptszMsgBuffer, &nLen)) + if (!APIClient_Http_Request(_X("POST"), lpszUrl, NULL, &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { _xtprintf("API_Manage_Task:%lX\n", APIClient_GetLastError()); return; @@ -169,6 +175,10 @@ int main() WSADATA st_WSAData; WSAStartup(MAKEWORD(2, 2), &st_WSAData); #endif + memset(tszBaseBuffer, '\0', MAX_PATH); + memset(tszHdrBuffer, '\0', MAX_PATH); + OPenSsl_Help_BasicEncoder("123123aa", "123123", tszBaseBuffer); + _xstprintf(tszHdrBuffer, _X("Authorization: %s\r\n"), tszBaseBuffer); API_Manage_Query(); API_Manage_Insert(); diff --git a/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.vcxproj b/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.vcxproj index 7c6e622..c87ce2e 100644 --- a/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.vcxproj +++ b/XEngine_APPClient/APPClient_RestApi/APPClient_RestApi.vcxproj @@ -90,7 +90,7 @@ Level3 true - WIN32;_DEBUG;_CONSOLE;_WINDOWS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;_WINDOWS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true diff --git a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.cpp b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.cpp index 4311730..72de648 100644 --- a/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.cpp +++ b/XEngine_APPClient/APPClient_UPDate/APPClient_UPFile/APPClient_UPFile.cpp @@ -8,8 +8,8 @@ int main(int argc, char** argv) WSADATA st_WSAData; WSAStartup(MAKEWORD(2, 2), &st_WSAData); #endif - LPCXSTR lpszLocalFile = _X("D:\\XEngine_Storage\\XEngine_APPClient\\Debug\\LocalFile.txt"); - LPCXSTR lpszDownload = _X("http://192.168.1.8:5101/storagekey1/xengine/upfile.txt"); + LPCXSTR lpszLocalFile = _X("D:\\XEngine_Storage\\XEngine_APPClient\\Debug\\LocalFile.json"); + LPCXSTR lpszDownload = _X("http://127.0.0.1:5101/storagekey1/xengine/upfile.json"); XCHAR* ptszMsgBuffer = NULL; int nMsgLen = 0; diff --git a/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp b/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp index 176d076..aa1e449 100644 --- a/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp +++ b/XEngine_APPClient/APPClient_UPDate/APPClient_UPMaker/APPClient_UPMaker.cpp @@ -147,9 +147,7 @@ bool HelpModule_Api_BuildVer(XCHAR* ptszLocalBuffer, XCHAR* ptszRemoteBuffer, in _tcsxcpy(tszDelPath, lpszPath); _tcsxcpy(tszSubPath, stl_ListIterator->tszFilePath); - tszDelPath[_tcsxlen(tszDelPath) - 2] = '\0'; - BaseLib_OperatorString_DelSub(tszDelPath, "\\"); - _tcsxcat(tszDelPath, "\\"); + tszDelPath[_tcsxlen(tszDelPath) - 1] = '\0'; BaseLib_OperatorString_DelSub(tszSubPath, tszDelPath); BaseLib_OperatorString_FixPath(tszSubPath, 2); @@ -188,10 +186,15 @@ int main(int argc, char** argv) WSADATA st_WSAData; WSAStartup(MAKEWORD(2, 2), &st_WSAData); #endif - LPCXSTR lpszPath = _X("D:\\libxengine\\*"); - LPCXSTR lpszLocalFile = _X("D:\\XEngine_Storage\\XEngine_APPClient\\Debug\\LocalFile.txt"); - LPCXSTR lpszPostFile = _X("http://192.168.1.8:5102/api?filename=xengine/upfile.txt&storeagekey=storagekey1"); - LPCXSTR lpszDownload = _X("http://192.168.1.8:5101/storagekey1/xengine/"); + //要更新的目录 + LPCXSTR lpszPath = _X("D:\\libxengine\\*"); + //更新列表 + LPCXSTR lpszLocalFile = _X("D:\\XEngine_Storage\\XEngine_APPClient\\Debug\\LocalFile.json"); + //更新文件下载地址 + LPCXSTR lpszDownload = _X("http://127.0.0.1:5101/storagekey1/xengine/"); + //自动提交到我们的服务器 + LPCXSTR lpszPostFile = _X("http://127.0.0.1:5102/api?filename=xengine/xengine.json&storeagekey=storagekey1"); + int nLocalLen = 1024 * 1024 * 10; int nRemoteLen = 1024 * 1024 * 10; XCHAR* ptszLocalBuffer = (XCHAR*)malloc(nLocalLen); diff --git a/XEngine_APPClient/APPClient_UPDate/README.md b/XEngine_APPClient/APPClient_UPDate/README.md new file mode 100644 index 0000000..b87c5f8 --- /dev/null +++ b/XEngine_APPClient/APPClient_UPDate/README.md @@ -0,0 +1,13 @@ +# APPClient_UPDate +此例子演示了如何使用软件更新程序 +This example demonstrates how to use the software updater + + +## APPClient_UPMaker +更新列表生成器,你应该先生成更新列表,修改main函数里面的变量值,然后运行程序即可 +update list create program.you have to build update list first,Modify the variable value in the main function,and then running the program + + +## APPClient_UPFile +更新工具,此软件可以更新的列表进行分析需要更新的文件 +update program,the software can be update file throught update list \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.cpp b/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.cpp index 0142994..caad7f8 100644 --- a/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.cpp +++ b/XEngine_APPClient/APPClient_UPDownload/APPClient_UPDownload.cpp @@ -51,7 +51,7 @@ void File_UPLoad() memset(tszKeyBuffer, '\0', MAX_PATH); OPenSsl_Help_BasicEncoder("123123aa", "123123", tszBaseBuffer); - _xtprintf(tszHdrBuffer, _X("Range: bytes=0-5/10\r\nAuthorization: %s\r\n"), tszBaseBuffer); + _xstprintf(tszHdrBuffer, _X("Range: bytes=0-5/10\r\nAuthorization: %s\r\n"), tszBaseBuffer); if (!APIClient_Http_Request(_X("POST"), lpszUrl, lpszMsgBuffer, &nCode, &ptszMsgBuffer, &nLen, tszHdrBuffer)) { _xtprintf("upload failed:%lX\n", APIClient_GetLastError()); @@ -84,7 +84,7 @@ void File_UPLoad() //下载文件 void File_Download() { - LPCXSTR lpszUrl = _X("http://192.168.1.8:5101/storagekey2/newfile4.txt"); + LPCXSTR lpszUrl = _X("http://127.0.0.1:5101/storagekey2/newfile4.txt"); int nLen = 0; XCHAR* ptszMsgBuffer = NULL; -- Gitee From 65377f3966b6f313249288b4fc2c9f48feaf27dc Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 21 Apr 2023 09:59:16 +0800 Subject: [PATCH 12/13] update:readme and docment --- README.en.md | 10 +++++----- README.md | 10 +++++----- XEngine_APPClient/APPClient_UPDate/README.md | 2 ++ XEngine_Docment/Docment_en.docx | Bin 127197 -> 127400 bytes XEngine_Docment/Docment_zh.docx | Bin 127020 -> 127105 bytes 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/README.en.md b/README.en.md index 1506fec..768dcae 100644 --- a/README.en.md +++ b/README.en.md @@ -8,7 +8,7 @@ c c++ 存储服务 c c++ 文件存储服务 c c++ file storage service This is an api gateway for uploading and downloading. The service is for users who have business needs for upload and download services (such as developers who need to upload and download servers). -This server is more inclined to storestorage transfer and API Manage interface +This server is more inclined to storestorage transfer and API Manage interface,the service can be used upload and download management and network file shared and software update service. best storage service for http,batter than nginx and more convenient to manage,more concise code. On going maintenance ## Software feature @@ -36,7 +36,7 @@ feature list: ## install #### XEngine Evn -you must install XEngine,need V7.38 or above,install XEngine can be refer to xengine Readme docment +you must install XEngine,need V8.10 or above,install XEngine can be refer to xengine Readme docment GITEE:https://gitee.com/xyry/libxengine GITHUB:https://github.com/libxengine/xengine @@ -51,11 +51,11 @@ use vs open and compile,suport windows 7sp1 and above Just Run it,use XEngine_AuthorizeApp #### Linux -use makefile compile,UBUNTU20.04 x64 or CENTOS8 x64 +use makefile compile,UBUNTU22.04 x64 or RockyLinux9 x64 Run it on the terminal #### Macos -use makefile compile,mac 12 and above +use makefile compile,mac 13 and above Run it on the terminal ##### complie @@ -86,7 +86,7 @@ P2P distributed download is the same as the hyper-threaded download of other dow - XEngine_Docment docment directory - XEngine_Release install directory - XEngine_Source code directory -- XEngine_APPClient client code dir +- XEngine_APPClient client code dir(APPClient_UPDate is software update example of client) - XEngine_SQLFile database sql file ## Example diff --git a/README.md b/README.md index c07ded0..cd0f8b4 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ c c++ 存储服务 c c++ 文件存储服务 c c++ file storage service 这是一个上传下载服务API网关,不是文件同步服务,也不是云存储. 这个服务的主要目的是为了给有上传下载服务业务需求的用户使用(比如需要开发上传下载服务的开发人员). -此服务器更偏向于存储传输与API接口管理. +此服务器更偏向于存储传输与API接口管理,此服务可以用于上传下载的管理,网络文件共享或者软件更新服务. 目前最好的HTTP存储服务,比NGINX更优秀,更方便管理,代码更简洁.持续维护中... ## 软件特性 @@ -35,7 +35,7 @@ c c++ file storage service ## 安装教程 #### XEngine环境 -必须安装XEngine,版本需要V7.38或者以上版本,安装XEngine可以参考其Readme文档 +必须安装XEngine,版本需要V8.10或者以上版本,安装XEngine可以参考其Readme文档 GITEE:https://gitee.com/xyry/libxengine GITHUB:https://github.com/libxengine/xengine @@ -50,11 +50,11 @@ macos执行:./XEngine_LINEnv.sh -i 3 直接运行即可,使用XEngine_AuthorizeApp #### Linux -Linux使用Makefile编译,UBUNTU20.04 x64或者CENTOS8 x64 +Linux使用Makefile编译,UBUNTU22.04 x64或者RockyLinux x64 在控制台运行 #### Macos -使用makefile编译,控制台运行,需要mac 12以及以上版本 +使用makefile编译,控制台运行,需要mac 13以及以上版本 在控制台运行 ##### 编译命令 @@ -76,7 +76,7 @@ make FLAGS=CleanAll 清理编译 - XEngine_Docment 文档目录结构 - XEngine_Release 安装目录结构 - XEngine_Source 源代目录结构 -- XEngine_APPClient 客户端演示代码 +- XEngine_APPClient 客户端演示代码(APPClient_UPDate为软件更新演示客户端) - XEngine_SQLFile 数据库脚本文件 ## 示例 diff --git a/XEngine_APPClient/APPClient_UPDate/README.md b/XEngine_APPClient/APPClient_UPDate/README.md index b87c5f8..a3ee78a 100644 --- a/XEngine_APPClient/APPClient_UPDate/README.md +++ b/XEngine_APPClient/APPClient_UPDate/README.md @@ -1,6 +1,8 @@ # APPClient_UPDate 此例子演示了如何使用软件更新程序 +此软件更新代码支持更新列表,更新说明,文件同步,更新完毕执行指定操作(删除,执行) This example demonstrates how to use the software updater +the software update code support update list,update note,After the update is complete, perform the specified operation(delete,execution) ## APPClient_UPMaker diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index 6286e4c264c9303875c58180c1b36a3a80624011..703d40c2d4df6f9510d83679606e06fabdca6191 100644 GIT binary patch delta 112304 zcmX_nXIN8R(>2&oQ4z7BKyCySlp-j-L`6Wli1a4XL`tNWkQ@OOlwPD46)6G|dQXCY zv;d)pnn(>0Lg;~nBrnhR@floK;3X6clWzU;=8fZAQ=)lgMe(S-V@GQ(RY@eb#8v4T;IyJ%m>4EYGvKB#v zvfL~aoK%@raOSP+jeM!hod$TXsq0+$K+JM zVOhTrayOQqJ3y4V<5>c0zCjL8xE!ZjA6pOj)SmFp{O4#rAM_Y^@4q_UVp9b{_2w%s zi|$uGcb|fb@n7jlWN(Nu8vY!`Q@a~tbD>q}!{mv<(PAxwyeRG#qc0aqma~9d4I+0J z?see5QSj8{S_EJ2A$75RPW$8Dn~!`iB$j1P(PflpU%7Y`{ybd)hb!?V6#`d~_ftC2 z@m0JM*QDasTr9+amlhS~W)r1Z@)NOrQPKS+2hnAs62<)Szb>`M#)%TL&f)~;E_dig z>u;l<>mEOGnT?I@G+Tth+@n~aFZ<<7b~ZNXF*Y{tqsNXAhv(jqcRo@M5N{{RKo56V zqLE?v{mUN-`iERUDFatKMou+8?aQ%#Jr~_kSAd*~9C&TjxlcXjppdt@xt9f}R#Tm$ z)J;x7%ggR7X+69p$|ezWcSlYOOL7W~IY#_w`s3jZ?~yQdPIyp4cZN3LFguuWqg1Np zB)_)uZ4w{38Nu6Ou>S3mz|Ye4?YoMl%)#YsLMna(SL-#=Wd=lHby^r_H` z?lTs^q&J)B=kFiRRtKbMUIw75<2{TZ`{(^xCbLtG(BbRUtltYpS<@V5dL0F>KW_8B z_B{}T+o-CXH$2Zd!}@xn9e5xT;jd?TQQ+kO`*_8Sc98b^I!?FU;mL5kb%by2ZRse) zbwLQPT0;k2b)!or1*k^J>-mABUnrngmukfx&D2__I~&((y6o4KMQC79}VlL#a`S=GClquV5r-6 z|9S)^j3Bs>b6cNP%J0!R-!3D!oPT%P)jP1< z-}1HlTk_c(t=1F4SHu*Aq)1gdpJ4k+=z{*8dN*^)M}N7$W`J{t>G zpqjzF-?QPjNy1a{8Xpo)I%!`{>COIm4qo+#SS$&$2w{uAQB{57(WSFj@0imwkMdXQ zVG{G|4PaQd+i!-7r$jRNuh*y6_m_OJpET0au6;Ij%ju&Z?nK6us2Iif%0RXLvgl;}ui$gKj zi3HYMCWSei%UmO{77wHfav6hhVA$@A6bhj2(J82-CB_U6%v=L#AQqaH%bKkNw&rnQ z#sU_8C=|E9-U&V!#j(1$C9cC2m?YcmeaTEwAgtDV3B1A%77ZX(dESu;Dv0_$)V z%-BSrXtNObHVN3=rU1Jn1e~^nKppI5<}%mgAgLIV3mWL99{C6m4mW0U51HJoIWxlH zVFU#@WFmkY`pgA7nn{AdnY$Dg8eF|U%j%~v%NCgoEU;aIK+{(+Qp`;*JD`M%08r

mHI3C`KEBu@`(mVJuSYsC5L^Mid&d2^2!}{vd#T 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

+}^Z^MCbkJ%k`= zEA$t&f25i*fhT-tf)^9!{pZdu@xj78gkPNL-mO_EJC~~3GcigL#hhQyxjGtsX*>Mv z1z_qeC5semopZDLLUh`_%<`lB&d$_v^lb z?8mInEepC^gZZ>mY2RpaGwheAZqXBYpYXoG)n*}kVoH&8!$3dY@DTeAv1l7urd{gT zsYKJ02i@7Pc~3`LbACEyk_UGYJddM?=D~p#<4?~}f-EYAyQMcP)UhTIs z3lGU&{V5F1_~?^P&&)e`Humv%;#2!|xFs+UoHB3NDp? zG)u~UVm%9A$PpdZbo^#|b(7tqC+l;2b=(didHj?*VmD9aJLS3jnG~)bDTCmUW`Iu~ z{lvQ`~f@N zy-EE?^Lc9WGsyYpg6i8*NBkP&`q@mzL$8iz{CHbc<7TnO;i49E*X3^1dxf^xg}X+srhL^oOFI9#C13qpv1^@O`ZTyu{l>?C-3&%OR~W)bIXl<^(^vTuaT&3^D>vpmXV@G`u(@b@LT&z>*Z zw?tr7hpxp%;z=Vft-TYn8??br9=4n8S}=Tm7A(-8NuO@iv=}?55zQb zYl7JVrfQUh8-<0oG5kY?Gj5YL!h%Ql05$!+sOBKjmqD$YqIyKvn41_6jGlCi{QY!G z&ZGsgU{7YhFUeAE*a_x~*qoV;cN?XDE!i%GM@%&l?+aFIKSG7C*gXmyl~*2p;8T_ys`d(fyO{g8Xe_5!szoos;^&$hVe|a-&ZKt>Wx-tc zfvSw8Gwx4gQD%wy(pHa;K^C`EwduwOo#Ds}=g8C)bDJ83$Q3uVa|5{2Ih@W!9#jty zba+Qx<%}AWScrxptdPqddyjtJ&J*BK`<6cA@l%%;Ai8)5{b76OqI+o}67X2)z8D_6u(McJ zIwJ8}PfcG%t%AE;|EX;MTOl!T?c_|w-{tS%4Xz`(7?cs^U;7xPcPo5lTmOMZiVDf( zo#`(TYJ2((Z7l!k(~sI$L-Us>Q?9x(!!^np1I9J#WgTRB81m1T4*B=nn<0kP4^EIu z&cD7ZQdO<;jl7-tB?*A228{7{i)gvz$K_ad|C8K`S@9V7^WM1xrS0aK-kCP?`6ngK zW7%Nu>?aWUZC%pCB%Qar52fdvBlQytTh>QU{nPrqQ!PG{x0P9Z;zycQoe|-nZP+?} zD^ozZyjwQ67E`;prg}fimM)>X|-KWvg3b&Lcd+u^Gx2cWr(i@Ah4u?FE+v({4=8|vU7{5P{6!uN+c(k8uUpW>`zc&OyB$WzA- z?rSxKf6+4G3JlLK%x<`#LU(Fjm`%}H)FEg5gRY9P) z2fdd$%XqC^j?OQk>8gN)`4^tSPZqP;6uQ~6D_3pxiua6Bhj}XwQ{abs zU*6_m)Ydo8IjI7w@kzEcpa`2dPRL>0&x~)udS^X zfJF8B=lP%H;!uhe(SAYUtIe;WqtSLxpIbYxx~@7rvai;NmxID)lHI#d75`wwVSlp% zns*duuvxq{@Jz~QljN%2Db6rbsB|O7TUeXZT;GhQBdr(OQ`_Mc)3xh2RYvYrtUnx7 z*g9A|4Sd%c&BO<+{j{9oZ27eTuaQ2Jk|WqtRC9Oo*pyQK+d9kmoy%L8L1mS)3AfEk z-QcR$V+$rh);iVY6p<4+ZN4r(7|D4uH32r7}20nE+)oCS&a>D^V=5eW!rvTMKb`i}9tKM3?s9f}OavuH+sZBvzd-)xs02 zjlKvImn&86U@79`%OJRx-{c6<%9O2}>#97m{Sxr58DU$C*V3L5qwHcDZ5C6jVrV|9 z0h-ma6N#AM{YMR;@-+}VqSYBN_MWSZ7_IYSbiYv;%I#IJ^SUd18xx`a3eyn2g_|sj zdihsY7P>L~ex;IwzNY{s@S4m_Azq9kxoOO=$&YC!!h`Ym-cJ7vCm`<#M1{P7D<=(9CFL<+FP!l(3V1RmFpX;!l2; zPU+p!+r45sNuH~lkoRiKf^4LNlIf=RE5!gG<9kL~X0PM^IusclefWIo7q66I^r5*M z6j^MYNyO@43QNjfxxFau_u@Ide701b%If7c1a0^`s-?ZpJA1B1XKXgcc`YTjukS_~ z<-z!}E;t6|ymZZU;B*8`H6|qG=3C3tN(<{!lgd9;s$wh$c|kUm4c^Zg=GqE5pA~^C zCht1Cc#pAH+z#^_kyW&7SZY_Xym|U+k!`wZtJ>1=uKOA0^NJIi1162? zSyC>DEse2Zpxx^JekSd!SnPJN1X%_H?E7!iG!#siUzorI3b2jhYycT^* z6O=!oS7EiAS5|XsJY_)0)w*trL=wmPUK_J^vrgv5_nc3?HtUz^CvS+lNa>orWmjjn z!9sM*QZE?AutyeId05m7dOvba2RwgUqn`K{2 z!oCOJ7w69}n7HdZY3P%xE!n!1;$jexvb1wN85 z-gA}V9IabxjH(zrHn$OBA-k7Srr+M`(RhAKE6P~coU{mU@5ipr1+pt(Y9gX#u} zJ5c%Mb6($X@Yh=@;HzKV`uVzFZdPo^?4nf!xWBNQTyPDk=(v8QR02h+V-Mci(3m&h zov14aW-H`1U2CVfR3;I>|J2=IVZNyGMB>+mb+K*5$<2 zbNH^!02_@~hqM1JsIcY3olR{u7vRn(-Wjt~^qjb_%3KeUNw}g2Ee$Hx>d4s$F(GvG z8tyl2|H&-oHr~Q#pE(2ur`6@y2+_%+_sLh&=4;jAixLreJsK-=)r(W=6Qfev!n~IY zl;ji%{uPO~e?rE~>>If2e1DEvj#v0hg*i6X0{0K`wtqOjH#IvHN&8ZuS2-J)JA4-` zopcXyH^p}&yp&t8GKRXXX`GqLgfoGeMgf;PJSh{$pDme+Zy8; zmCdR7y8rkU2L5vx!C?31gZ0W^=Lf9?zC>wO2a{z!u3Nh>){X0OvKvFqu4Sh|9=#k{ zCbhp3G_xSM1QdEQ?v`o=vttkW>pw)>@#J=JcgfwFqCBM;?L6?DkoUWH^p9;5X!e;I zp=ed<{m_roFT8I7RFV#(V2K?StHf198R$Qmg{X3jSh}5Sr25F`t#u54J6RPytv@2< zu&-Qkr-*!*eUg4#OY3m@uv_k?(~J^(K*F0$jT+v+B1zf051*}M@*NKaLEY8J%r#^H zvC+I};#7e&Rxvt?81XeCVQ;o&AKoNpX8;HkKr~j zb&I!$H+_Z2H2RIc-&w8?o;22xV8qXyT+=fUmK78cM;ufe%@#Dj7xYnbk`+|q!i^o+ zd$EqrL^8*MhJE^JKUGgX+}SRTutRQYlVGQ!q#H2F{7zSVKApZ-Cn>uZ$LCZAy7Z_x z-IQx%;G8R9nR8Vgtp8I5+0P%b(S|P>|0H6KZX0^Wd3N)ug*R6y&y#}gLcuUUL}4~K zgWg}=^w5cL(V{=vi(GVP>B;UZYobhLdEPPKKBcSmg(11TJQ5Xl%I13yD9dy`zk5c| zwp)=oNVSG`MZ}-ccZJ30k;`1r(I?9f6%(3nrr9n4!RUFf_Z>g)W}Sw0IdntMtr zJEUM{#$6}Q?aoWF?#@=S?S*=y-GyU9uSv2KolnA z5aUio0_LO6Kzd%oy{cF0E}7|~mi_YHms~oA{L?vlqe5;-x2p|O`ETA*jhIXB-C z>SgBj$xR~!8wC4zxO+}Vf#k%A9NG;$1BZJNC>y9pHuN)J3emhlI!F>@_)cQVsO{Zqn)Q zdGGg{j+vx-6C(YUSal=rv6vHSklWJL!~mZ5_S){13-uq|f}e04-u*uShd_A0N@9&0 zO}|&JtOEw*$n*5LQF8mxW}@Cvt6n|M`;s2MT*Yn4*(;+*S}NzkU5%T>7U9*s?&(|l z{o9&|0TwfUf3MMzUub1tzB;Y`+AR-=;8!Ayg^_Ij{%jJWmgKuD($o ziaNDgv%1DA=G3bHVoB5lE*@Q+>@^VYlo3q~4!RmS4!e_5w6q~M5bx0KNnP)=1sK;)~rBu%x-## zwioM#^+?ZQp-Yfi5%(Bbk=&Kt%@lE|5e2t@f279RAqNJLT5Y6~fR)m69ar(RU^etB zA>OfMR-PJ*9CGe1q?_Hf4SnXV ze~l{7hdPlguQTu4hwBuWX1xzbe#@IUatHiddJcewYN_SZ2BS7lXUp--Xx^bn*P2Sj z2c4fI^B62BfDN`$;O>DZhH z{JQ2ZXhRXK-^cgvwSZ-Wp_{#Snq^k;m?M)4D*f5;rs**Vvz zCIKF9Qubgdg5{|RB;+byZ3v)tOz1@JYjhJOZD&dP2ZKD2w}O+}(sRqNy^fMfZIMmN zTMl*$k2uE-VEH_Ah5!Y3ycbMJ1%~VaK&Ma?nr=XjchJ+$0n+*tS&wOg`)1r)!LWxJlWCl1T= zUa>)zaRS6y>uiVpEJPq`M;aD^f4&?Ym4RNxU!By|SQ3=Zbo0gC$pNJQi!a-)B@HDi7bfy1rEBuF-*Rl5R^2 zZR7I&J&m?WolGoFjLLWp%QN{ua%KaSoNF5lpQ=*z&F4w}wx=czVB7c^Jah`N`mh5=9!V9h;#em+0!%Dm3h-$4K# z_{5xV%Rs?r->^usDuJhs)Ktz<7MJw;3S@aw1Y=IfP;ow%Co$lh*C?|e)&ll)axXn?89E{LJ}cFr%A;Q| zTym25)n=Qy(K(_>0&qvw2Gm?EI4ut@dCnb*p#mS-23PXK@6e>INQv@PJfvQ8qSPP8 z8XqGoAzsJz3(T$h#)TE%Pm5!wFj<~PwV`*hL)@~*e?YhuTd{tJ<~(;SEsn;zXW@yc zI@x~WX&Y;w;uHm~n2<8?cV%#EW!bRb*F0s$rik|!y&j7JT|O;v8x+h5b95%BbLly_8Hy}af9{oj?|BBpT2e5{y%+f>W4C&6KE&o~ z9;kPC7B7^%jY?RRFX14WjFo$5!JaFI*s!=)XAcC-+)S!(hx}acy?{0CU!yPrS?3C- zcE0AVT8TLs!rT)jG44IqL+m^wCAf`lfBbo3&_Yb5NC!IQyi${6p}UfPuT7NVRP~x{ z9@W&ERpLv^x7WNLDc4*2JFs*ZZ~Zi-Z_-<*+$3GmzXOAje(w-HNkwG;E`OUo60d<~ zPkn8ff-53$%&JkA?vghnqJkX4TBq=g)Ng9`k_(0P$TvkfzvpdtNQ^>^Ro`x_e-M71 z!J}G%saS2WCCL<~MJ3V7JBzhqd*v#@_`dbN!y=!RBZ{`wo&)gPlh#A^O)hpV1S=O7 z&MxoUGW^dyeOSkZ$CXdcLUplDjB&)s_hsLpk1IE&Zz>NIZev)U&x{cd`JKJ09;<^T zrrR?SA26$eYJ+H${*GS}T+f+Ee^*`+v3k>&YAlsu7oHX0uiPPvDr&`9Wf_(B@+-i+ zCifB<#6Hn$TRAYEeD!*w&swN)PaBo(^Gzojc%{gq%|VnVd(G$L{8tY!1=rGQ0TvLY zuBv$~Lvgo%XK>-N*EGPhZl9;Ew1IMTly|ZFX0OfoYwj+ys7qmj{SFL7e_IyNugV=F zR@h#OMbGkpyvn{&2Ny-DUSse*(i6I|?3sD6i2}&?({`kX+$|Tujf}@DR!vYwAsD2g+loMSacm#cnI!V|q1;*MEqU4+v9gj$o;)d)d3#hTNCY zV-u81n(ret$>*x~+0OS_e>r4zi71?xBM`#f!UH%jM?#U;mw)IgEX~k+yKd7JJUi-Cq31h>WS-`UxC`6D|bBY z4k4NP@xn+WoVaJ32Y0kqi3<~jnd-Hpc{uF(H2Zil@AZJrX~ro?e}59BEN|m3=FTUr z-+^hA%_$2vnl5x&=n`bs7Z;shlW*!k&C1W>k1EcmCxn6f*z&H);p5-d3{jZ-#(Sw= zGwqqV6962+!E7_6T5{Y>gIC6P#G6HR^D7MIaw#i<^kbIy47scLn9(nBh09!ss6h~* zdXnE1Tp0?m-jpkre^^jaSYhS#l|}i~*y*PszhoZpjti%1LiS+fByy}}sF3u&a zc1r;Vnv~r)@zKnz-rY{mjF{cuBD5JtVtLZXtM?HfRr5D3fAY?~Q;btPBaH;2+#B;v zN6p8KXu|clxaN$1qr~@2bY#wXo`N>fn9ldX5L0iq-V}1N?-+MEWRiN>hFn0#6KTT| zj>!E@>^2p}B`d@*s?N};t3uu~SJsR@T`UD{-tT1evMg`c-FhD?*K}>mvQYBOybQ>; zs6)Q#@&+2uf76)~;nZ_f5tr1Z9^6xio9wkh52}t-uUGksyy;2ukax+mUbJ;B-F=Cn zRpck%M}t(%(Z(L1H3Sbbr%N%asGrJRW;E}vYtY!-E6$%iobOX)F#1JSC3$+RpPHsZpL#HgUnc@W z{z=t{?Db8WsW8EGXE+rZ#X&cCZpC@fW@*h4svb{?xSR)wJl?g&n%`>zw*}@W$IYip zRds8Wx@GSERxhM#&R#)SAg1a80LGS)9~mBaf5)7?53#3=%snJ4vhpUC?}<85?f#<5 z_bJh}k5SjLIBK3Y;uJX#fEi4LdQ+*`HDma|sP|h&S43TIl=t&#qOIw1(UPMvo%7(W z-vfPD5C26v`>#pXL~FR6ne3mx8I++>Y5@JXbxi=n`cu1S-pM)VNW3>u4VBgK-7Re>Tp> z;(Y6Y-7WEN0!$-2R8JGWm=gW`AP!{GXPe38C}-j^V@2k?KBN&cN{vDy7MyJ$EmB!g zc2F$3w6%ssyeQxFv`SvNR~a_Z?RrzB3*@o1Q2K5U|C~h!`*$`gEB762ucOaX@%XG5 z=S>e1COJb+m$MIViv54qSW{B4e_hw^FVOfnO3MHO1K&FRQ5G|##_f55!p|ER%Pni7 z`JJJZU;7RW7w^C3D9bym^LZLXecsWrOQ1As?%+mIj?Lcz)>XVVW(aX({r+IFE0>Ri zu;aVd$^rnyMawp>&T}FP)mifKY9_)>qU4{|YnClz4hZbhjrl%qM(Qx-f79qDC6h){ zQ<1DX8=?8smdrVNqxzU$4Q@NV+nl|07H9xf-|jbuN%ndajLVbuDT#gSnRs^*&x{S! z264I^xBDWWmAxLpw7l2TguW}dk?$iyn{i8;MTWa}3a}dNzPcT<47Pmz4up)dscBj7 z5NK%`MU->)4v+kiPow8ee{Qy(M$=DdAuS)&7=gKgF!Cnxd@fdFexE04-=4j2LaEdR z8g7g4c|d6#`=xsQa&zvl01f1r$u=r2_1BixJQMfiP@v?Q^Nm0t|2BVzLSSh`c~d8F zscx}=uuQWK zA?X_^_>AteK=kGM!Qh*c`ACF`>{s>;3O;MEDL^h~)bn6N5lBpl*ukK2)EI0OJ`({! z^jK^z#~P)1PLwr4*K2dF91EiExf*xZ)1C*4P+-efuN5U&f7-JH9wpP8Z7?-5a*D1) z3^-@}0YX~ZKo-IX>ZbPup}*v97nlMLq<`lv9+JI2Mkp)ykYgY^at}FnC85&`KvSoO zRiks9G+lEhVk9aQTy4&wfROJa?Yt)zhb%TWct4Hfn>Z9Q6R+ZL^S(% zkcwY54``}iUwfSkEN@ye*#qUpa`z|J`KFv&ZN6aVYreV7wX&jn-uZ0YpsLT$B|Q`l z-#CV=2Y{Vw+ouIPII-?RMQE=16%gy_u-4PujA)Ogf5oYt`GpsD{jx6EW_Tzy)B%>UW*p(OMz(z=pqNJqIs|P^DmyD&ohOS568|}%Kcg`yN_@0=0iX+$}Iie#> zklro0KY^ESa|fKr_ZiYNxmywf8JWNu1G*l_v2AIsFkaBe6xW_eZ;F$YGlUb;XX7Zk zoRuc%f2IrFW;TicdUKtrUQ_zs^9-i0jKu!xHW&=qYtoVm1ZEppljMB!PpsiOv(yp2 zH6r&#y~FV2@0=g7IEYrS#x#DhWZd$l1Z>tS6E=lR=zWJaH|g-|+jKk$*QMnogOOwH zR)BI)ZDx1S(i=3P29kNpHY%GWdh_L0AYhbjf8^Tw%$fmS5;YD2?YVJi12^rz}qBCiH92pp)MrUH?2=WP*0$=zjS$1+~^S`h^^ z!ldx0gkyf~RaxCWgVzPxFuyjY?VgDC*Q!>_tA9r#qtCffR6TEpFXhSm9!vzCluV8& zf9W&DW@|(TTsiMDz+$Kpd6odb5lPRd8J%8P@^h&^eI*$L*V0eh-!d8XI|^SaG?W(T zqTZGF$;~Lwg?&_z%s1V|{S)v1f`3~x^I$3RqH|Z??MQhCMBcV3=bI`3MB=jElz<~+ zT7;NVZONAW%1Vet8`NPxa)wX{lsKbvTp*XT)1i@RAW;}3+?GOeZJFeD$&o# z!4lkcHVWB+L6#Ry7aKIK=FXd%wlW9Nw>Mff9hbDY@@LHZ4VRW$<2ZUJ^h|wi(ppl* zH9ATpiul%ux|yMd)>j}1b3aoL#fc@_S!>}91-YjZA=l+D^ipFWS@B36j8Reje@NEF z`^FE+y-HaIx-|Vevh{hB@NIZP`Q>i1*txb{0BxnUPT!P)rpy$Z1tSesV*s>`Pns4C zzC@C}@8W#PzTw_;$MTy#)WXXB4cUy$LC$zv%bdQyfHS#(+WFk`y6&<>0rXi_7+?{! zOEiN_#fRK3I>>t|?OGeW9VFu+e+uJ)^_PDD{-8QV&I7}VXjI>4APJH=Oo8IHXAarn z!|BZ55wsMxtKT8NgSwj*n`Pbs-;+ugTdsQ5NB8swm9o1Lkjme&$M-6kkbU!>^`^<( zxllr{ZtuBQiQ$va$R5C=_U{myKv$_YJ}GEVT3{KHkN%!1v8NxeprH53e-(@c3?N>= zgAL&(oECZP^dL=YP|)l(*GU0{e40^91cY!i_E?>bC^i?hR_ke?t*t_#91J=_x8d2P z!kM%;A0cPrN*B9lmDqYJ6<;YW+5FDxwQ8Nfd1-;;%9sO}^U1ZVHk?tx&b06>GfF)G z^<4aHBlpp#CPxgws@f-(rJf2Jl{o!g@ESCWG@ zI%KL~VbXHQQRe%M9X`F=p@_NV?$7eF{nqag&j7GZ%M7BDedF=%nO&X)Q1CzNY4`gF zzq4c#7YBY4-WBzfBbTGkU2e73J|JS)yXu`X5BJU&x8G-y2Zk+II3?hlv&NeO@_*L zsscEB?n}=^L7^ifX6{9PCuhiuAD<`sq)L}NOZD0n=bBMNgadq{d{Zv*nsEv~%?C^) zrLueLx=(LasWWCrwZa$5Hys;X=J=pV2wScfg;49m#&Y9d36*EHE&o&!|R(^$b$13Yy z%VB3$WE#~5fAc0mMpIHG_g=z0q9xTgprdPh4lK?4z)E%2=RUfP`eyw*hrsp+i+gB} z_2%x}Uyk2<=Dl&+)yKH!PL6Sa4qjt`{tC^U7TR%1o-YC5Fld*?ei zNjnV^{-;U`+zEK977}P7<$i8Hxe!>LU^1dK$e=Fmeqodm3oVNlzD_N2Bch1>{ z&`+CfiTQn$(zzy24?_;zKSu}r;YcLrWa1EAtkF5CM`bKpa?G(%efyF&O9i?aCvnf5 zD+|oRax&F1b zF$l%Kf9h+`Hx!q|5xbQ<8<~I=Dr#6eEDPbF`ljcWw>fbC>>G=GMU6EoXEV`MzD9k|Z>pZ2kC#v5zvZ0?gAfxsdkvYrrTR3b zaVXwe+io)V&SF#19Gh?TO?~t!Zyz(zg3q08f2{euxy}@3UKwGUg>Wc;<GoHHSnXL1fJJ@^mK zf7Qv6-l`38<1O##N}i}ik~5y83*-mBy(%= z&aTIZEcrC6vBym*VjqN_CuZB=Mf<<(H2xNys3+{B?NXw~;& z;a}GrrDH?Prse_m9I3|a0Wsna<0i+Cu2OxwiTw14l9E<1I@{12Otd2e{B1vLR?(@X zK~y{Wf~(kAUAIX^vdSM7_2($fELd zXJ2Huky-O;EN7lSqi`)Rsd|7$LQpO($3=Q7ErZRPa|hfWu)o^8Xbq*et`LYjOMX+n zGR^9I8hT;onHE7D0>{~AQVBla^d*;){?0<9N@47LnjJRT9d3YDQ0^{3e?N`VLC@lK z=2!!Wtckdx_4fgtu@H=F)khYQ`tF-7OJXz^5{XK$)EG!sXLVRAHv4PI$f+ubNQ^l{ zl$*u8^ok?pPQiygdS1KoOUu{qNY|{1j9Zjqq!5v9aP>3CvPg{);m$Vd zZYFYGi1^)+EFj*?kvP@Ge`dAi9b+Nq3Qbl$Slp23Tnos?tvm)2><*S|0jvflseXs% z;*=5Rg%JF`XBBj9>w;pT(ZT2*a3P;L4+dtT+ia#m=1=885e#!Ra+Q^~uQ%O>%p(dHmhn1Yg%^YfAn(iRqO9qvv0@E zIg{f?`Gq50zeDx0@f5C1H!<{V14@=kP|G1d)~k^hy=4x0p`ET-{?7V=OS&8iq$lQd zIgSs?9!vzbe`X@Y>)l1Go+cHGdYBevXmcLOS-GFq>}7#W=%?95GfTQ&_vfBy z25OyG^_8=4>fol9sGi+g?LxJA`Ug2W!;+d7t0gC+RXuQRZEYau)kw@#n{hwx8R7uE zC%)HiOsj8-GNp&$e|ncWOoTBD2x)l%axz%w z-D~-c^aknAiImj-2E`2HoGZ&Ui=a@A4pA~;!?YZuOydX3GxuvzVE#ew2dZN4XO0^d z*pxV8^~mV_jp)>b^`tQz^S8aatl zNc8}u{oPMfe~+@`iGvTa_ctAWeBO{%%eif-G(=t5&9P1ldX!W~bKg zRjV7Nc1MoE1nQAlo^_I!$!IHfn3TjVdjO%IzL=thLrA9DplP&5`wGzkH<4}RB$6$; z&RqOt(y$0R?J zZI|-Rh-KB&fP@-d%O%JD%+q<5sm&~@DDa0`+NZpdS3#6Nj>@=6z(Ic14bAhW|<+aL(+DTR63)T#a0H$;j&U zF^`a0S{7{9+$og!fxOK&qpnrX_!BT8b5rXHd)6lt3`V1CSNe%v!;%GTyL^i6LeM*r zBkHTElw6~;>De{kXOrcZl!!6d#I>n-rG>wqe>eUirPG{z8LRi2(Fm#$1dVECZR$~; z$&#a*Bp_3(UY!`_F=}OPvKb&3Scr^vpM9b04WR~+y4NKKb>rJ2Z-n-XB!!mEkm{!E( ze`;m1@UQbtU-BrK;Sd>of0(^$E6>U95JkEyx$n3WU{dCrLLPSp7mj%p7OByZt9a*) zpS~J0QUA{QUXtCuk+yFgbPS(c^PO3S&}j7yF5s5;IYmkodCPfC89|kUdfKc)eCD$@ zD&%s~*~S@@`MGT#45aL}QZ=9n^|S?oe<`_r+cNf@oY#wr5}9Y(7W&(nKUK5*+0i0` z)gLMyIqK-#uQ*0{Sbd|=9@3LpKXxmj^OD}C3zDr`5FlME?ay1G-BE{F6?oQ3je{XNQ z3SJrG+IDKDi2!GTrpq}>Sbk3&F~<&grrV54EqS6NiX44vk`FnFp{w69oKwar6!?VB%Xxje z=47sVBh%G&mp9dSh=N5A;I0_ze|PM>gq*w0K+rk^zXwA@=Wxlc(069QJ?^qiN8*f6b>E?L;%E zGfvGqXO%_z%$zGNVmSQTk<{iRLYHrB#rFoZv{rIFJ&7V$wy_;;xhFaR;Rd^n zoub!|IP9KvUv_etN8V-de_Irg&)G}5@0n3Uf}vLmA~n`8RVNc`$n$?Z*Zii?qY`BK zv{f)VSINj~_N?Ltb-Ze)LV?~9}(pCf-~!HUdTg+>ny zT5XU*k@C}W8}q6yl*@B13|c|&J1#ko-d*TLQ!mfov0o++j2CoYfAUs9SL^*@=bM$w zNyZLQCwNtNM@?kyWhzkEOgkfc{(q=r_6j) z#=Bng#=@fFZ>}GS=Q;g&@&~Uaqip*K?_~amFN#W&`wkTfx(zjMs>gS2h+Xu!V>K+) zKlA*dPtls@yChR1f4p|V+s-rX!jn>j+3Q09p?h$W9myFo(v9tLZ8AoQ35L4Djm;4i zsM(WopjtM5d!Fd7Q>~7-<0^J#Zt5~0Zm#?OB4L$duv2wP>@n?8`svxX{ZwYIpLW`i z@+-K@bZr$X?Dtp3ktiHcmd`y=nb%g~b7{NI89!i=QOlL(e}f*0WZqB8ioL%n%e`cb zYd_bw-J)jV$xH0jc=F2o`$*2AoaNIF)z;JFI**5pR0`G+_n{e`(PR6(y9kk*_taNCqo=HM@M;^M`o=KWnaMe^LJDv zOPr9rgJ?v~9YsYRc{@DZjNml$cdW&{W5@y`+2r@Re-G*Z^1KC$cy>8%poWc*JV1fE zvdIAjPeiMF4F^M7q%H1dZFvj`c($R8ogNB(O~p-ehG0NRpytzrX#2~_E_8<7y@+mU zu5CA?DRW?ei-0h>zp-o?X*}GfIy#BdOfWj%bf_9;yz0ZEQSiTX|Z~?oIBRlk@sMk(ASba#bKj56VY+tQIhYd9t?(M)({if zR}?45P1>1sQa%mSD)lM&2G(4i!7M1nIR;2eujD`-BMh6Wb)c=zg`95`tG6C&c^RLs z-bd2R3{H#h-7_BErE3n;BydA6Z{vW3*-|fne{PdVW6mmqV9&%o9o+j@=4qYg%Jk+; zTuC&gw|;tI;VFS7aX8`n#xTXb5I%f0Y;T=)Y!>e8zccAvQAo-4^>;m=|?$* z`kgCGZnCub{qG}v7mOiGtGpPOs#f0m~Rmta8kfXu2;V_PJkYQ~>8r)lmXEbopZ z$x9(nbPwRnleILi!Cm$ER3~!IS*41bSago{K-Hx741Jk939A}|5yMaH{)w#LyaM0g z4ewY_Q*i_iF)gtBc`nd{v9`O-@o4?gQ}uc*<@%kMSX%C|xVcaA4A}-?Ix)^Cf3_s- zQ??rs2}=z>lfNV9n~_s(-n_AF zvw{ugDw(a)WC5S^m%~1v1}B?Hi<8U&-Rx?Ed)Z14C%S$|-A|WbHC^**(0qMjETSQO zo+1FL6j@Jm1?&ppviCqUoS=jk@n0?A%)6hnI#+hzFsJcWyHd@t2YwL9`Gfi1!! zuQwH3Ka;O1gN>4sy%s@#&*iNH7)$y->vyCvT5*@!`=fcTpvMBf`Q===l}OLu!D7!S z^(h|Tx@^=6fckTEsPHvHfB)nP$yZko;IA8LK~Y06FGt6AfPRxtgW2m79h39S*pu(6 z`apUpHf&4tU{LX3b%k@K2Q2M`~ zrarn$Mp{tE`dlEQB9@hHwu|FFEkb~W4aXC)g6hW4!c(n#FbkEPLQLO)c%d}&eK_9f zUuz@9QaEB3f0dT%j?UtCShxU|nO1VH;B9zz*|!~oy)xfUGRd)0Qez=HU-xk6$dC@F`ahCJ?+@3TT@^{b_%J22GQS7hAe?S!hT=hMk#zxNYS1UH{e5`; z&%Bp7NFd{K+~@$lD>A1CyqezMYx?<0nf_MH|kU*4H`6!5*} zTe6r3xx0w_FQw3=*NVJVbcN+atj^tqYboGcy&iG@o>kOH901uyCDA-JuViqy^z5z* zf4FQPdf;p?7Hgkq35YjgmX-%s0`Q>J{&nk!Pcf`s2YtMkhl~vS6 zJ)>S(L)y18#S)Ych>r4iu8XP&y@xDIYX^Fodg4{@g9RtQ$4#i_QK;7&*)O;1oV_3m z!kslk6ib`?1cYcu2FNy3>&WQAsxD9Nf4$J@sgtD*TtG&P#*ujza&bgslxNCS&#}9= zx3RsR%751TC>@^~9e!uM%!Otc7Ww-0P|#Ul6{VKSath}yhs2r;d!918YFNF)?rJl< z(--5%CwuLt`YLu|j)6G&nO-!9yxBLNwt<*s4@9nQ4e|mR; zPWK`5X?UFNrJYh;8M`&vNEFsyHG-gh`w%*nOsYGRkQpDlb}{a#3vbOG0TEtwjgD)m zx=FQyU8h`;v)A0)_8p7|oWzssc91K?)XZbs;D0S@=HU!|! znxhub5ERO%!LAe=9Lig8rBDVef8z?2Ph+C!UBBa&wd9Ro!0tj&DBGy8S(!V(;*L={ zWR{b+Q7cQ(-P+Dxt8kM#r?k!o(!6#{ucOk@TD>+4_R4D-8fBylcgw;dt*rd8+_s(} z!f$GyWe?u3HCH_%+)$s%Hv1^bSr*cgQ=yw~w5Lfc<_aFU|Lz-gONoU1e;qf?ygSQb zUqKzJ%}Yi)ZxTad=g7#mT3pmF`e{Odd1~HX3k*}fsf6pZv?k!Lt|VBu>h+teTG&Z# zl#wZ101HKyUiA>uJnZ@%@Ex+UX?e-% zIvVkNjGg>Gle#a3xEZzDe-snSSw&&y==nB_eq~PYM$_+|K9T}RE+73nw0YKCKWI)I zwHi_G{nl+bAuht%2HwB-1O9a?Xx)YjuoUBZSb$r*Z%>s2^DF^9&Kf(OhT)Qt;M<~> zTt*gdP}cW7-;@aYl0Ny3Q2){A+zQK<_idNC5834#($w5LIl(kIe~|hLENda-ZZ}bP zB@?<0c440Agb42$*(M_MK+nymNzC*&-4KL(S9XvjA0044ZHT;q-OvG({i)3h4=elT zFr^bxy;i6>8RVYkR-HH3acNZPE}w=yozX8Fuj;VrBS~&6cw0|H8#Wixf{)(2nEL2j zsef`qkS;P0cpG}&f9*YytCr`f9)OZ%#U8)2DyNtJ4rotmSr1(i;IA4T!4QP_8UvS8 zX~kRgjit3-{SGEt#%>3y1~apsHqaUAbyAH0Ov@h7(k60NPcyB_cBe&EkvwVdc+kqN zXB%gI=AC)>w%%-mBE9T6*7t$DsxK!PE?H1sv>4x&I79Ufe|EFc45U>|gIbM4bOrk) zpQf%!qG#?yGrJfE(yA0GGY6*1o<3x+sgK$&s|OEtN^(aUbu*^IWVts>MW%o4H(pNE z{2kfY{yq{ME*aJ4OEf%ZuP$euyPNpdKzirXrk8YeT4t%koI6h`_QG5Gos9s)nom>x zEl*l&5y>;>e}ULK;8Q(KiJc|mE-G$`FqNN(8vE`W3(+9Nt^S?o^SZT#2zaR}So6-G z++p2hu8-39*M@gnENvFMe@4*nFMP?uTWT}JUUO};;7QkrN^j2@e^Vqy*e<`ReQ)jk z8slNkOg^43rutDm5LQU8ym96yZsnyZ9|>6679M%;e_}ju;(^rz*l--WwD2g>Q+3M9 zCS@Ba>vy7o2AJ<&2uUFq%RW(5cO{4tQ?Cu>jGpm}@Nv%rrCQd~suXg7!RS*4a6eT6 zv^f=N%)M%Z@k-xCc{2qhbKGzUksInO0N_#EYYXIH&Vx;Tj#uuzIE1Mm56-TtRG-^J zE;IeNfBO*V%ZS-X2Uw`pYjBD!(M>YTq!4pN1xnQU$)~B@*Xz{B*?UJK1C<=s(0l62rEgXZN~f1D4eW4+Ibev@$* z`G^;aWwuehuy+^QCVQ_euyOgzc-jLv5O5LMy5FPfI_!ez_nM|;9VH9*CW`OD3F0U!ilfG5lZez zf4yDjnanz2WeAmG3bMe9rLR2P)b}S#bK$tQ+bb0hSyUG88PD?vA*we;ynp05_ps}% znd1j1luFN4!duUZegf#Dd{ynrSb}!3+IM7W?eW=bwcD?GGTHX-uH5ye1XzLA(y~iE z*IxC&!FpsCfn);($6Q(B*I9qtHtv1;e|J=!%*vbEEI0S5>b1KrMnqaT#2IO%ee?Lx z1IX4?_LUU^ZB4(5lmdWLuDSOotReg?ut|Q?iR65Gkfe#;?~E%yCI@3~*IR!mQo zG=yto&fbaAcjmX@+@D!tT3SY#u0-}o*ua?8sYx)D+m~xW%o|m`zA4L+@v4V{f3}nj zv(46;WO}_@S$Y0oOD_0#x#iHnw)a+u|a9vFAWE8kR6^^8g>Yl4-ZZG`=SSL$h? zhI5bTDejS&pT}vHOnJ_Md1K1u@5p@g{&rG%JG#wuTQVO1z=^zMZufCge;mmu4$$j+ z$yvpv7z%LFYf*)+8ZmUWU;~zH1D#Qo5VhG{Woo|$HIb62xg$zqVrLswU-;hD1H1fs++k5N+Z!BY&Ar#$xE1XA<;2!I z`#-k+IT_dLp}n8!f8jqdEIIi#1{juEncJ<1M0%dV&t=?<^81jq1x%~oS+>><_d6$- zFP{dYLt(6*hH6YBDJ^52=5DDFR;sTF=(_PI)&p!rN~`-O_mZBs4N=4@&&GA*isfol z_DoDB-{<&rHf}(oc@KW#YtE&5&xIb!ec3n25fI<%fvEe`f4dk=$&_eEg)W|3X`7ht z6K#_`F~)u2oo6uaCB#eh%@y$0r_6B?Mah|XV4@`+Nh%a>BS(ktFI}EJ5C_hf1Fr#c zuX}ARB%0xQIAo;Cn3$OiAK4pjV$AC3vC^D4h3`jton8nRm~_4^+u$-ZsWF_w@};xWX|rJ zwBoIH<#7YdikP7B@Gcos^+oyXA}X`ke=jH$Ae9;&|4fLlEi&n~^AYHv z6P#o4FmC-m4>!Gxzr9fC8&OCXPTJ_KzFG8YeWyimz3L{ZpG?>=?@VgxL3q{KC?*DN zo-6pNR%arJU|K#z^IoIYQ)Z-DWMgw}3&ScvT5pQ*rhHXeFjDgFEaHGolyelC`;i`( z7&Yyte_SOmLRlH#0lPwM&RGQosSHN-noL&bK8P{82G^OzqEvIP1sS6?qj{2zt~0sA zLVrgp8%nr&%0R-XaZ_(P(CNt&w;i== zD$0XBvFFaLh)Z&8Udu+tEBD03S)b9#7g>Z>f^u=C^quos*CajbO-H0Y5m87NAGj|H z8$Vn_^Jx>_N4^iyNvOtbvk0BGWhE$)yO@&ZbmQu2E=(OgHgoS9WgDs0%(=cK$Fd$W zf3U#oJ|)&;SoVw(s6nWtY>o~E?yXM@1-G`mQOdlawdJ_&LuMdPXO`4YM5j_0AsO+n zowuGiA#+WFEKiJmx_+1kip!)LupX%Aok)uzMUu4#v>8QHb3|#vq+T>!I2oDLAbLsc zw$c#PFK=+ExkD-+c0MiCX4~Hxa_1Rge?kg{uFVxZN}2Xat7?%tOw|J-l0HOO97{u8 zD=jX&Iilcqu6q46URvIe-=w;D%lSLAfOzd8?}4ezbxN~H61#RW!4Nq7?3-huqik;? zVn^mnkjnT%*=xbPIkBx${62PlIqbRDnkx(b;!bU%M(3(daiXl>u1w9#(crZue*$6% zS6njx!{Hm@B=zxhf2lJo3$t`lr!-@30ajFASdr$(iY&! zTv-(ThHOv0>D_AV`F5v$mf1dFVeU(8cB}o0nFZ-szGlT%15eLS_k6S zIc^U=O>*JfO1OME-^dIJ?^oXhe?6xDozb<#=Hb`8RJYHk(F03OKlf&o@7xbq)U(T{ zssEEc`5S-SM6EVMdnWIIZXQA<`Q_Z1XiDVMCbyaF8@CgYG27V1GT%6^CHM5JSl(x^ ztRWYjcP8avylQ?^*rGFIHEusd=yHY(68(qY!JtU?z?)A4u2o~;#?p98f80X;PPTCc zeU}0^La$Rh(R6QFgiG(eWdB|4t8X6F+$3-TB&1xy)2PpsV~q^H^oSC^ME9y53`xw) z3;`0LCf%zI%+H5;K&Y#gQm~KSC?@$d(sVsK!-eg=cd^Iztdik?5X|3M?rYx7h`*`6 zR-PSfFZNijtf4)Vkw*Cye`jEM#8jY0F0%S2Kzn9>;f;T)_Di;*2bMQV@!{)U^;nb+ zksM1EG4V&7&F&k2r^js@RcOm6SKJInCdU9Xb;+XuDv)SK?li#vZ>)K$z|!CNs? z%E#445Qi#RT802Z?#hJNx$D^ms-?$Gfu`%0BWepf@<#bScEs5ne}m(oTa@!a;fy0S zB%veKe_N~9P&$I>X`$ZHD~r11qfePr&4|Q{!Mp;J)wuZ;!OnWq32m#h2vin)pL!pj zKL@2|;=rP2ogps#+m2K_#dMV!N-ZiD*OG1nBbuscGyp#^omj>Z7+-IQP3jiD73xWfz>x5 zAtHroK{w8fn(!zg^6r~RR?i*xl~(rU)R^%36-4mS!K-h4a=i1j(0@72JkvyJ+)`G&-dY}foeLh*fP#;x{6+8QGo|z0R8+3v5w- zQ|UB1xpT!pj>_39>b|CG1B}B%F28!PLQ*F-Vltes#Gp^>PBuID z5OO)^nr})ZzBLLbN`&WB{?4?Ck7ksb#g>#_0Pl87^x4EyC4b~!W3bWRP6VqDxJlf@?6pEmHsZ^#pTyoyuVX6c%#5U=CY)mNA=7<3$MEc4z4<8LT z+qmUCve#Jr`zzbrWWW*)q}Fa%$dyCirFZ*xP6*Z4l%hP3~1uOF7y4;egwIT2AT5?VQKXqk;Phf-2wrrX%v zGU{R1xtxiZW|3si`KI)mL|~1m!a!$#AISMN^K&zC$*czk_}mtP?4gC=1uK3eWXia_%Vl)wj@@_~;|^nlslftJ&RVM=ee9 z`U+gWRuG;^Rqj1|XSb|GuqyERL~PFAnV#?Tm49b7MrDn%&E~7-j-)X7zW4hak5)>7 zqjnX~*~@Jp(@{MT^Trf!i+PZ5x~PJY(G_+6M8@)cpl7C@qYglz_UZxXm$6HWNK)ns z=5+;7%(Ga=LsGVV7i6z3TA%qMPP}Ds=lUhuc)fL$r}=%N>dOjeo>U_2A@2C!)i)^Ck?CZEmU!9%(^_X#bjM zYu~`;bAEx&=hJYPGef90-w>mUHVfBf%~e8e3Mr*l77GGsc@B%TL)X__F1VNJE3*)< zt$k;?oNTq~S%~P@P7VVP-dpn;0{y;a1Y@}_Dl*p!rtzahRLu}NARlT&EUt!Gg@5+8 z+)mY-a@_6%@Si#UP!ZL4`k)DHlFc( z5|7O`A~G36Sp;{8mscB+PQ@nDfv!Oo?-`j};PBzL zvyFL`zB0{L6$@$wV|3yAW)GlEj(_wZ<#;6Qvj-;5ncnR}HmUK~3t{0Ul?WHPF~?)Q zsTQqAyzt{q`D!B-yC(f0jv=`hU!YVn*Ft z-(?XLYR!bjHB|bg-iJtUv(6V+i6fC@%S<&W<6?_VULv7>XK~NV{HbvK-6mIUMBV$w zPYx14D_54wf*RBLGzpu`|17I=PnjiMRzfoA*|C5^mL~-6f7$YmzHE-B_5vJoq&%zF zR3Cv#(t;C{dR!EP+@14W0Dm)wozJJO*P}fLpvoihmZUeKvvW1_m8XmVA~t|E=1!rK zDE@TyZCBSf@klh7fPr%Eh}6To=hM~?N*oK^I!8L&K&PkgzwA3gc)t(aNbd(q{B+F* z)d{ha@}w1(6Jn~q;l`@kP?l59^_n9(lp>RDydW;0d2?M(S_v*XZ@Ge3wJ9DsuPKQVyQsZNeo#%$T61){m3hb>(D7{S zzWcrcWAzn4*<8f?X#*BYUKfDOTtEJYYvMyS&O>a!9KO!et-6sbT@@=T@7id62q! z_Sb7iL0RY|=1ioN-1WeyzYztf{Y{KO&^yn5eK- zKy}KjBFp>e`Su#T>Kp@1`Q{MHX*##N&58MuZ%V67K(EFCH};lDC8!?LEyvpFbLm;7 z;xMjL{?2Nd_R|1JdnSShQW&eJfy_0-Wu1`MdViZXsg#O2tP>1+X4K>(a6+=zGyg4b z66lR0S-Fo&?tku?Ul_2B4_{82N7ksuK#fra!O~)mW+d3X`97^V1~Zp9xqT}on>E=G z>r7)Ov%V{2&)G9xm_UHEdcD|0`gaycuJn~vC*&yR=qyA>GFGz^k-4SHH48|2erp!!atCU8io2iED# zLa3@{uPi>*t(u7&wT;dLvValio2tfw3sCQKSATdWks~7!3C)&mKmhZOv5Au-cx0PN zoz;9FEK|}A*#=BB^@!C@B)e6+zpB`f7CCqBxCj~d-)P)iGfs{tcsmjq#}~A;veyqt zrGB5MJYdH8Hb@wNh8hFqWq4L;al^%4*M1ms*0v^*bt-!q=t+*rP{uJzQyX_Xla|3J{x;U#*tO;-Je_qJOw% z-}D9$28yYAy{X8Yk?jqPtdTvN$F=_3wsCL!3?}2;b%wSbpDAwzpg1s0IjeSjuZ$79 z?aN>0tYUEv*BDp`dwuTvNqvD5mU!{PYM*?Ww%Z>}uy_$}{^u5$ue zxw~*&`i8unRCba{vq7gT(q6rGUw>#k#pYHZjFN5k+mz=i-m;)!_1gZbP3={3bE45{ zkwGR%53%q~b&%~5q3 z_!Rl3#`B)&86MvQd%4~RZ&s?dE#lYR198b7t*>tU06$Rf@}59 z{YhW5XFNY1Y9OC>`q;Jis(%WkK1Q}7blScp)jT}yT&J{I)fBHDh-)j8m=;LP{ytFa zmPxe%K_?^DmghYcb9RXKu7WWvDr4u$bT8HP>h6qjR9Jj zcyw8W?9RlYz+XU{r!A{0S^1`L>mA+4BbAHH z9`J78nL{S&=k}iKbfdqP`7E$#N!R=x`v{-z6T@`N=(= ze+{&qJwUL}?D7sHBe9rmL^?B4a=0FMbpII9kURm!yWdMG|=;w)s=Daj6t1%haDcst9o$T zZwh~#Lx15_}8t#a4255By#b9>Li&{Jy34< zNJTxAl*>C~kSug*>O?Dl;B(ynmpp^2SeM05d4Rf<@n&vUU&@ z*xcXLKNY#Gz739c`q$P0>B(FRZNT~P zj+7h|_*+IN4`oeS|BXh;wRvq4>>p4qEO?YTcV^i1L`@v1sh}J6KD5(6oF(XmANG)0 z*7=_M8-Gd&7DfGze{Kf(fkM&BNe37_@JK!lk0!A=m>rihm19{*Rpu$P5Ge0?pmNik zKHsrm!X@HHI1$(**TSIwXYDmeIxOHEQANX*v#T)x+iQ0FvC?8}pJH|U=(B#MwvmW| z1N_aYUOgZcBQ5{IvZVI&A>G$?eOZ*3?5FY8Gk^DfY_6esFBulJ;_Mq%XreO?$a%8E z)keU|v6+_V+Z8n}w*N#S9jyE%%CkshlSL3eTDPluABE@5jz2d z?i+G!M)ya?)w-`9h~eCFA2q3Tt-c&-AQ$BNJ}#7)G}$+h*VfsFvQv$?q7mYMguim! z-+pXvKAIj zo7hI3=;!@>b*IhBw%?m8Z{xcgyZjx_e?~#^Dqf9D5P#1U zyX{_YG?n^y9JQ$s=;loJF=q(e6+PhUwHp|&Mq55a0PQWPaQU^>WNY0OIRrj=t}N%0 znsM0!q9ga*4-{j>wyicmE%ZCuf~TE3k`O*=#cZQ?VIsUnmg$wTP8b6^wD}cAq^9># zejU$zHGju7Cu5!G70o(Ie(I#2L`lp zD5vY(GjoRk5D#&-dLLp>ji#dyC0&tygL`rY)zi=z)rw5ZNXF)lL?lFlIor5>WcCIA zoTO{cDj;W^-g+7}A9TF5*kTiPbZ%5A+8+frbTH)8s08PI?%bTSy%v;2yY!4#qiRhR zKD&gNYVOx8q<*Szk{{~hm48Jz{KMQi6wK-Ujkwp+D_9t(qXZ{#2#Kcb0X@6C%TN(O zcTNw5lXSEnauPewJJYESuH<3$VB|}ZCvid@HD>NSho)c7YqzOeVld8ADl&69!vdz0 zeN$<6&6Rb^31pn&Jh4BkLZO4q(OCX9i|c7IQ&|wmYjlRi%8C(XnSb9oZm0`Gb1}}j zVR>YIbe4r^LbkzwJqvGncL|k8h#5aDD*A{&JT4Xj za24lcfi5Z!l12WdPCypRq_BBJWUwL1OJmWblo43A$6TvqT+B#O#qK{Wz{0V%S@^I$ zchuQiDif&c`91II&!kJIQ`7WH0Hi{&c z5){i$i798|b62D{M^u>aS=meREjRJPp^V7a?d;VkM7)&#+i1fl&NmgZ zk;TrHH3%+sYlF;_f~qrXSmcm%bVf0(+Wob`6)6;m3&us!pnvR}VhS)(^*$sdx5Dar z+Dr~VybTsL>R&lWWgh5E*YC_YY862ztc4F>%1J|VOMEBJ`Y&Q!c9HrWuwRkgv~tenpkUP2w7C)s`HcuTfVGG9b3^2}16 zed%3nb!#k)vws@65O{@=8J0$yu)Ocd=w&hC3g<8^M9p))tzw21>(oY+{6nv0U+Q)U z1>mO^lHNbWt=KrB=?iNy<5Jn?=Jq_*tqn+h31 zt)+!3PUST{jRZuo@mL@VKlDKSc&*WKEGf=cXFbJ{cSa**J0I6M_e5XRxmkWMp}hyV zeY~j>S${U)8Uxr(n5f!ADA7}TsJWw{ES>l|HQk$US;+tzmnux%#D_&Ktn7hLs(bZ5 zlzEi(NQ)ZvAD%{0BG-?6>ma1p)9yoLG<$G&*Q~oUw&*}5*I5D-4V#@`fs;7r?SmpS z*`m1D`yB^rVZQ)pR=2a9iLgcQJQuE`Qf5V4Wq-;MLvz1oxo4C>8)sSW{u~PXXsuH@ zQmXSgZX(XFLNfcEk?-p^r%PylQ>A-h#_DUU+_Cgpfb2Bx})l)g??_{v+O#J<3ew7*7r<=#qqNBI~)`+jI=Du%4gpc zCx6PUuO5h!S0;Z@Z|pAJgYEw4Rj){}>ZsMX8OE%4OFsGKLmMg~RqKzE9C^Mx>*;{V z2;^Qh51qH1iQI$4oZb;H?{l$lSP)(FR&eF_s?k(q!0%1Onh+cAa^AqM{9ZJHeA*%$x%H5@pbY(f#JTb(36MvD5ECXI!xIvb?;;7j-{8M$m>U~su;-#cz zaXrg*x-G^aM~8PS!;nuqpV+=-*=b&-PtK?EiSlc!9hI4H2mRfakn7Y&u~)uc8%p`b z_F|D==r<+pC48LkGmi>^X;HACcRn6*>NyO@B9=KiBdnZZ?G_x#}J$q?##Fti!D3fl;11;Qol1MRpo>I4itR*2k0R5 zKl5p_+ZiJs1p$ZzMjJ$ViMx6lNC|*QtvR3Iu@?3VR(SxqYBk=tk8`fm+x15AyjGS| zLCw_cwJPlQTnoSQ=ixZn)+Q1g&8GKWbbMMh{{;e7LkzVk;+J8e-ihe0M zQs0M|g1TF2A?8zAE13eAxn3n$v%SY-f?L|PlXGoF>$?ZL-7?qQ(}`7#H-cnJ?DX1( z_*ruAm3$$oRA)VlJZ;^xSddBceMsLV>rdZ+PSYEdL%0b?*H>W4T1zSb-d`Ao)kZpP zD{h50@+Fl!92WB6IR-ca9e?)+x_!-sPxLf5%Ew-P8wI#Ck~NZMD0JC|@_+B6plqVs z*+y;d-u;D}mk)iT!c?j>>X4`>QQ7}tah~Q3QP=7ybz}axG*j`JSZw6Iwq2ap%xh}% z!HdR`png_oy`o!=lDad|Lb3DYOq5^93LSb4SCg5pn;T1F0KuWu+kd#`nWfxsM}AzG z6o<_h687SAYDK%mz;r4KLMU78S0GW8;Iq9%r9sirl^X+#WZH z%#Pj2ASrNMGoAzxOl(>xh8BiN-v<9Q&-&r}7q39}X%>~L8w=u?%-shIHISTDg9hB+ zhZg+WGlYmG<)C^~u74$jRa)SY@;(Q}40)SlAQnv?sGbJ2P2IjNcGC2bXwIYAWE*<# zJwr~4EP3DdGJ?+KZ2(lr6xW_8{ZI0@-c)+*(or1gmx0NRUQ0com(=;g^7QSp4YY3N z0R?=YsSW{sfF+mNWp^A^IqNG3ywK&W(`5AM(6{HmUuX%u-i$I+g`fC|Ic8$2UCv;bkY|8kKX!DRStlt5G{BZuP z>-#Kjg?~$lYEPxE&$5fvPP0SKyg55k2+DvX_&WN1OeBAe%dLvkzWDy z7|g7CK%kb_mlh>pGj{u+!MA?+9og7i^?!;7OFieCI%4`Du%hVC*mf@=e8}Z@rTv8Gk8^ zkiWA&Q;A)#y=mt7S!icu57czx+tu$7r=aJS77IV`KdzeYb9w$CU5@@i&LC!2xLqdsmI^A)2y!dSz(0} znebRAeDvJK@EfzP)m_08aF6UY<$ssdnAT?ffH{3^yO>D6>4xE-c_slnu;?6XGRp5n zJ3ee;9TOswrD$FDK=61j6@L>7OT3gTSX4;Q_yNoN=zUcE(?_DHfQV@_zv`QkE0~k1 zVM7E0&+j8dK$@qXCcVwY|6pn4)i_S4jIJO@fk)&HOXiI;mcIkOnFtl(GJiDzas?kM z%V!K9REuy@_h6M7%DJQBRo_b$S32#Io8VV^oUBR7&W~ z<(snLYu5X)yoiBhujOSjV}FCS3usYu2f`YUa?7Xj)pIR?RN^9Z-;8LoJH&lx6xOU_ zv6a@`0nQL6uQS-!am%Uwz$(3fa@G6Xa1}GADp>XG$SLXc=QBN37UipICOR%4jB7`t z;{3?^=x!dSXlaG944_~B4wpjEuHFH!yjN^j$-axLNRY9qGZnW3j4?Z`IERoo+==3{4c#U%%(v34XDX~6EA z$Y8QAjKBw^#q-JKN>6B5+V@v^?cpw-??Vx#`^LS-D5^HX2Xpd+72*~1&Mybq<4%`P zn?(1sZ!egMQooTD8GkikbH=~jL3{STg+Xt*>cIu(j6pu%Zq=EIB!U5am9uvu2U)sO zHV_n>#8=VFel!bcjeVP#e&9?xkH=V>qt-NxqmFG!{$s}NoTx1Snz3c z9$>Sk<{}j}dq}d*6{e#ampcV{3TVUnrcnKG25E6$$(!pFu4XT_W_@$R$Ve7Ip-W4y zpG|xz5$#lPpL~bv8`)S6LRt1p*Q62H*Cg>(&)vzCNMUHm5?#Wg*&d6Q_=+2`4&F z>&zOKS0eDF#6>jAKafkJ@!7va&owz+aCu_Hwd$SBPk#qP^_m5kEG@tciI{%LA`pho zHUngxV}NviFNJhUh^j_phGQrtr{dw=K%+@y4+Kz@ORK&anknN4YQNDR?KYUPnMrv; zlpyWo@9eKFXFQ&UtVG?6Sa>Me133wIqxv1VYzqHrfeuVR9{2N^RT_a*#SfB2!hO3t z&hmHEtba>91;{HPRqZac6bKd9+NLfx*bVhNuKbV8QA(P$SNU<<>Q`eRfN@VRfPbPAHhA_xDMQ-2=(STVm$kJaS=&e1F>UxF+V5!{zdxZN@U`9+;%5o(noNWRGi4!~%Ob zGOBN)tyvk>(?+l}$L-B|Nqjs`8GV;rbC{2F`mkI8i!SFI913zp^%{xs%t#h)mitHU zd=tiXvKZesojrGQw3A!k+E{oFIik~g?O56<(=sIzlc*t?#2h!ll|3=&1b^e+BC$0( z6j_>+|K_DR>8gznH>JNbsIj+FS(;UOBRvs-gjtbD-o5yGh%kR zD}(*cnYrT*W3%R(<0w0Z>vu$g-Ot+cfm_bicu(mG37?~U=lh^1-(J}RLvSfgb6Gnu z+TQtwI9_T4$@E>eL~jnq1%I5n-jpw98)=Ksf43nR-D7}ZnU$yj(_N7BW&{WdE1R=- z=SF9YOPOLhu-wG}n1ns*ebhfaQ=3kSw@0I&S)h2cZ=*O~dXVpfj#*~ZEMJ0cIiePJ zR@=BMAtQc}-XMKGfYf?Z!p~DiTi++|ws&&eOB(6_foiH50UQbtgq`wfLM4f_n;t9Pd#&y1alY4Q z&R(D&JgEAeCq1s*LsVl{b2w)rjUBkteA>f}p}aKyJ+gea0e^wW*zHgj1`p5Qp&>p$_zaPF&KTT#gb+RVD#@_3PR!ghj!1Yjz$z4qDvehoA zS}Dj>SOP{kR!w% z>S-I9lFZLd#5P)oc94Lv#PVrWuKWCT_w+Vqk-7hrOF5$Os}dR215}Mmo~NWH z#D6yOcd+L=-#EK3oEfj8IAYN+*#mxE-U>)sh~k&eH@`5^63sAU43X%o-?0)Do-7Ll z1YB@i?(W=aF?lmi?k(w*?NUIwvK-EYG^=kQh;%yAGRh|9js&W8N#^6ci+^@z z9%IJ6Z0(Gh*SYoR9JJvwmxGh@a;dCd(+`nWOp9!6dnk^Q#_G;PhBk9;_8f;}e!26M z&#E2i%k3vmbm=UrXmy&YO>wa$#QU%~Yimbhc?ij88<&h^L+~g_uhiETeyd151<72+a|{4S8h?F8vvmk=)SD8j?-&YpBg{hn4)C=ju%70Y)%)9W z6JtsrX`!Ef1p#JCu$2IYv70+}+>D0~3aku&5zD;iOr-2zv7W;9R4 z;oY@-22K{+s@{|W_mYZ-X#CJKwTrpu3H{{yL9Fgvn=I1@MZIOjVKaZaV1L$SrEy{P zk$gYueR#dfz?Owjaqo%vuf*~4%W)~z^tkA-gM#+&nAVA@=TT4}$aVUXl+T+U_kf5> zoeS7hWTJ8{0DpDGtA(S8e zc#>1qgH8M^z4e7<$r?KgF^4%Z^~;V?e9OI8?VBy*{tLM0`;qeip;un7dd(xA6Xy*y zE_Ilvrphy0uWicMt$$_h{Z;+SZ+hr;GEaEWIFWf~QQ>PI@*<{+Vp(qraHA4bT2`Et zGcDVtzYh(*p`ROVSX7OuuYh^^?9lwFrzTjzG+Kz~slvJFe;8;2$U#q}Bk z>Ui!mX>tA}5@zKh0qJKO8S#t}^BO1`)r|kbX}%u$v_;6FdwmGn)y{`-Z3X8Hp&+^B zIX7yL5~`{mAR>2+7|#4fIknmh-!ii=)HQ*0YGsWA#^BHSGzpGGz4C0aE^>~(L=^i? zUn6ywqx0H?0)M)1?z9;TFsH>WbKH0?D17xk@A(CU*OvF05t;Q(DKfS8#*JyqOv*Zu z)5&vTr5Sf7kAIc=w!Ku}rrAu)-36JJB4oBX$j0S21;ptXq<0lPIm4p!;Z#YPovG?f`6D6g@%qCH_87Gy9*(K&frq) z#!brKk!tITn4Bk(|J+B%CX!y-s?ImTrFx$)QP7<6fIZZgvkm7dHN5=HkRHo6GC-M| zT4l?H_p^;&=Y4K9&{OI#t(*8x@5&qIec~X&m7mT3A!YsO7%^mq`(f@#JiB*B^Qek^ zP?%Y1#(!xc-sru#bXlRs}0m^?r+L6e3(_T^3Cy7O_oGb&Vys5t@6up`6$5E zH$6m!()V9o^JGJ-%{jOtIparCBz;&Q5L;62*We+~^kKEZ9nSYrYQ0&R6kyG&8l7$M zpr17c&awwKO}r_~YtNl;Gt#ZIy%Lv}x<^Mn@j0k^Ku2NG_DYO^?-jZ%U>2zUHquF44IC!+%IdgVx$`ZI%=-0_0JbzDTt4DmNpN9F;J1jCBOh=8|m)LE-DNF0F zh?=SxnqPaGt^1>XXOf}o`6j(SCvIb##PTv$!}9D3MB6NSocP{tM)J&P>xQ~^BvWIP z;O>fk#IUY=vYLrup}ggc7p8VWtkGHK3nwxyi%UU{C{1RmyKHk%9L(=yi+^V3TYs_~ zh^qWiu{X%|wjAnj=UPy|1~5<%Gv{NY~pX-1JRnieQ?RI5H!`dQS)TZUgN^u6M?s>Lnx@4 zPZN*G497;T`JFt8LHZ+eP)}13?SI4mrU(@Ypb1Yns%qp_nK71cJ>}N&*skKQ~=leYAW2A3MgAZ$|-^Y=WF+1MMOZBeCbxRDnJ7To_7f=^yN3>t~-?(;^Sp zecR}z<=mM>SN1w-_lc8~dFOpP`O3Lp+mKp8O9=8w9JR&((xU4~@AIfvoxMi8Z*>(F z7F59NHfllkIX92m5P#h_buTlMg4IC0uzv?jE^kK4ecbon4?xK}7Oi?D&S?4v(w*Y_ zHKM>PbI&)5A69ijl~1+268$r-;c1Vr*pS3L2ay+Xmf zm+FD~GR?l(H=Ot*XYaTc^hvwfUD`|AuTHaEbGvOcvsOauFMm=g)oadRBeQq64~KoW zdEXkhzVGXm{ByRU#M^$N`Z8NaWOnH1RyW?UTlm1nYvw)0 zMV49%EUE?6JYXSmonwus_ej--!<~uyQtxwn4j6n|W`7%8t+~UQNlZH1KmcYGhwckq z(44*F2A209Kr)EW>>CSjwR+&z);DqbGUTvwR^jV32IJt@(J{{7c`L@1-{(Fg&T3CQ zMm^cwd+D)Yd6rMXf((&sTPg`&xcVmG(C8*%r1z3JO4~J9bgnEl;+wx9|K!uBJ{H^lSucT}p( z%!7pVs5De<%)>P+bYQ(-ffuvQ^D$-K>>%LP^|vWlx@vY0_UDvwKDxfrKl!Gvb94GT zqwKQOYW13=_?fq636#wSOV-32mO12Qh_QKZuX5Q;(Mfgpq53 zWLu-p+%y48^L^g->tu``1V{kO{Vxui3^uxc37Yn|t0d z4u8j7YZMY~pe&NB#FA5tw|XGUqZ(pbNPeWxcdS%T^2RcP?nGhgX#%H>l(n-!QRP?* zW8pC5(^MAjc>rn7y{tAuKV9>l3I}b3ZsX#ZS-4||c|Fo|;MNdMtsWe9-u9JIE1L7I zNaID~ET1+C#^u*O7Lod#Z--Iq-SSX7H-8y#hmYF)5*GVQt~rQy9%1$RG}Or=IRr@=b?aK;~sg7^{1k^WEImy9Q#+eLkhT-)0ya-C}qzN&Ft zr)-5cs(G+Y&nY8w>K589muzFylKH59<*m_Y?mm=?^D7AE?ODZ){2NuY9P5G5Poz1- zgoTxJ2PK9caJ|nlz1KuD;6K6Yb{nO1G8%Ep6~H0p?}(JAD%yEMUVmiFC0Tagl$Wk{6g??8ta>Qx(K zU6~Y?T^c<+2gkWqwI{MzCAE*T@Sciu$MSf9168lNTT^+E+Ti9EvyNrt&0;mOh}xAG zAPQ^eElwoMcwjzF?SI6z&PHvdpbAgH=e#4H#C&7n9#q{57Il6qFEcEn;W?`y-3jp2 zi1K=6w9+D*RW~rdBY;rn&lk(y-;@jo#o78D^C}TuuuZrfg;ZkU4;P-C#ndS;jYYib z$hAOGZ>fxcHg4z@Z5C(AKr?+uFeG6{6#JmcmyJ%kx%B zLo90WbsPTZrE*}v>?6jNUtyv{*xzSTNwnW|f~Wc|>Osbt#UgTA9zKg}R;k~x zxUdvgWLRLy@_)-g=^VXZgIHh7OY<}svpVZppfq2(yUa4&buZDzjjsH7aA}vR?lobY zx$=MmV*MidUh{g{T4_idSj?Uwixa(Kc8?2ZJ@eZvFOKg~JrEwv`?fapbL(C|EZ4Ko z`qh2E_t8~Wrnsb@b_gxxYDA#pc2=*&qRCjMMXibUYJbp3+>x^lY-^#8tVH_t6)Aa; z{KeqQS+%1I_6|!a1=qHEAPAdSP`_gV6>^bfm4V8$aTiA_?LckzOI9&sIS7j9xd2#W z;a9IMAJoIN2*VbS1&edg3i5XlPo5Qb(MIyH;%|c!`t+{Z14?^^rPf9r>B_7QX2+e- zPd&}Get+qw!PQVr$Tn(F^l9cAy7jqmZa68q_bQ!uX)l^371F(r3`cQNMrDeZO(}Y9 zcNO2MRRSWTetq2+SYYaF3;;czXae~=LuIGNnih&oe*X^EVMTtt&mm#c?;~DSIdPS= z73<8o^Tm?4oGUEOTx?@cgX_sNn8k5cJH_=%f`6gM&06f;lHxoiz*=)G%6aFPg9dt) znw(yruO;_hU#;uQ;AYwRa)(v-4D~VJRKy`QR6I>Rl*+8K%pJ*Mv9=4d&0>|L=Y74q znB;BBns3$N2g~zOSOOO6iFuwXOhm=LRxqrKTU+f_EVPB|G{c0G`^YvAwN-kK4h~~w zV}E4|z-KBR&jMrctdogFJ-u9w>V-bjdm?LPx@E8ZzCcCo2SRD!_G#h0GuM zp}Ym7CY~)zcveyO12SG zEqn-c6^>0Q=CFV!R4i>+?qK8fJ7~!FynlrfEEsWzY%{2RIS(e4pz^MHbq!xi+Y#&+ z7a{%Lt6NS-vaaYL$)Fe@VrZ%EHQ&EbEeM{&b;7-80^(;> z>gxXEm9mXz6*?WK0GPU0@Fwh1s8?-l^W8T^-N_184*47KF^azpXG zS3Q9>(vvv`lt4-+SZL+qgXc~mh=ajUPZO9+^)*j>z0b--vb?X>a6XN2L`FR%s^P10 z+ztx4Rgco|K&%z_g$2{Ka(Z}U7fRpxJEurrpG>svX*AXQ3{Xj-)BO&y@qgaMO1}vp=kMSN7C%cZ zBWu1iAXq31r)MY3Xra`utX?XuuYZr5s!P2f7 zPZy4FS>Nvv4vck$6>UVJ1Q+Zh%5?-0@Vz1^-v9!S>;ll*hNDUB%GRaz!R&}$b1nNVvs#|?juS;C^8 z<~AjSkd_x!!CKpteB?NC##5aHfX=5;P00JHZ2cQlDBIu}^;(dedt}tZ6cwS(wQU5l z2H%5lAT{3Fm06$}a(AJpdVc7^N%bmwK(5-}Q*Vl8G-uq>;qx*}vJD(pzp0Jy$Qu|> zkgi64Q`+`0<@Gxl*CgM|qF#UKo>3{D-~~7$+qmiFS#p~vse)Xmu=}ZDjJl25omn21 zD-o^i0mbU{2JuL5)>gKWM)=S-b<6W6K8gsuN=bkcBVB@wFx{4M)64ba+PdVO$vBJV zL#+7_6B++A?7_tFx549eZRcO*A38(jSk5hP*Iw(x(Va~`;X?S&`T zgP|zVzq5iR=bBsbrV4pQCSQ@CK1)dV!8%m01*zAJMU$v9205bG;2kl;WWCIJYrAc; zk^ucQs?-@LN1b+V<``_}3v;*LXSafTZM%fN3(tpHNQa{8Ym_}(C@-Bb*G>+<#@g0{_o>1)} zEYevut32$!=N>QAYN6JCFv3{$%CgtAGcv;tAOlZP=K>nq>&R$0jcs0M`AA;J-kY-* zDHCk2`u3oKntm1OLe&3k<5_!pPc&SFBZrhT5*2BMM$jA+LH3)h~ye7I%!j zc9*+o;+8oUWSM`bDq{JxQ+2W2DL^m)MXSvlyFN1yclk~M3BAC?!Ib$w9Mwx8x(GYTbhnJWY#Sa~m92q61~0@Q{xh0|B9| zF7_boD1?w>uk|qup9ZOvnPRADFurH`ZX*&B)JRI+G%GC#qZXfJJTaS_^;tN0-3t+XywLM{F&kruNf@Tv^R) z7dpE|w-I5=7^L8}JtV&ztrlf|>MMvR3ZtaORXj5`w!SNnakY_}YA=mJqAPpw@HTmy z5(>xc&RK=K=4hxMxa&%GrG-HJV^l6%GPW%3zX#Oz*BHIvdvBp zzuO%5IrG7fxBV@%qz`b4MkTYz6xV+J81*$1!}K7~1n6D8CU-lhSEG&Key(7UZ6f;l zw2=nOz1ILp_hlPVzPz!J%ekVEXPb>0Repa3b(8LyfdUG+yD`+$#+LY@%_KnEZPW?N zyXHfg#zu`l7GJw}3MD<}-YpTNv(~I62GUUGLf!HNs>>4^B1oy*>S@4q$!8+WKqw_w z{d!*1y{{2n;T+EF0sVOHShYd=P~RmjPa@#i1I3Jv^eq)Y!qCe3rZf_P<@_D`2Z?{u zc~Cte$D3_v-uFqnVIgO(099YAI!{{OEwDxX4y1W1SAc{mG~PSxF2#`%zz1b{ft>uE z14KXfYmyCFfk+RW+nHk#3diBdFNZ8iB&vD<8xHxJ7E$HQ2p~t{mE}4;DBNUZj+g^1 zPR=(kD#1`aI4Lam*FGt|W==x+JD-23-c-&P(4kfd3%9RkFAJfpI?-9)suxDDaf8jo zdQ&Z$!NEX)7s^{vBRbw{bK#msE}kAFx*autlE%+ z!ajconjlrGAc6_dU28vJu_g7>E>;?5k>degz9$^F1NFYKOQfhl#i zA6!AP!JP3=YJYj#RT;_ASgW2BEgGHcRN=raV*$#ho4vJ*f&C(C=h}XqvhO+8ZyGnx zIp%?BIjHGc2h@INCT&a;&Gf8ol|o1zlvjYD6cFZ{{QrPjz4w9_f0%DW?Yz$tQQhXXA-#(<=8WGkW_k}9-g=M0$d+fEg7@gG%`xC# zlNzcq;6;BpX)y||2v3BsDbwNBjtn@@>|lJX$r#1Wbt}lRzTUay*=q#p zX0wXrK@;RxfEd^^YXxK{I9clyoX|AL5goUJ%&c==&GV5fi947sTfm>6_HKHhTe2Q1Hf@|k4U{Zg&QFIC6#4*0T%$yZe0z=s}* z3WI;>DyI*YcXJ{M!kF;2$G@bLTwSXNJj>qs+;m6iC)>c?_8jG(fM!=4k`{_bwdHkB ztcNH`YlXpCzG(tE-H`yL~Z3;NZ?(Y_f-B z+#mUrZg}qT19zKu423R0KJ%2BW&1M9_JX@5uv}v>)4T0nqwg*0TfXK^C6Im^T1=mF zID}_rQeJt!NY2A+m9I(71VLDW)w#oNlCg;& zuR&h9A-8NBL<2o=jaaY zn7jh8xa-m`Tq-!DecX=Ueq)n^lb48>UiKvb10mWuyf4hJ<7HZSym25sOZxF6FLhmS*3?qB~~i zmiK>wse%8hcy67+kh)yr?3*a{dau%|Dg4`;fIVbNC1OK0?HMB8&wZq2Tk&saQJaJy@5W!8zkqk!eH} zVFU#>bH>9Dskl*N@L0t|@+-h#v~T%V$6$X=Mj{HN$*w4GqqCJdlpd4 zNF$3hW&aMG`6E}!GBBFiW*Ic7T-&aVj*NOAWli?XJHJ=F=44&`PF!WHrwt|PM5n)3 zN;bVGt{Zwq?qVbkq{s4ia4$37%ddYFcF3oB7!*-GZNp#4IQe^%3r&Su7Q0C9*Bh15 zy#E+zdI32Tcj(?Vzv=LZ(_1IX35Rml`zTIvO`m)eVQQrz7WdE`9qcIgjQpKbqAAzu zm!L=P2UM&C!XX z-kf~13BWmZ-5+vr*VfIOt_WutkzsNE)ZL7z6JlNMmTDQ18p>Xi@Df0d?=u-`0`6&< zU4zS0#aNP!t#K0vhD513$^w6h*%tb5nFpMP2HuBWLm4DT8u#YD=AFroEH+p38UoNY ztLB>k(@3$`=n%K;SQ<>Sq;HN6-s75UZiK7mj77V9JeozX#*f1}=fOY{WaMXZ!{{ir zQ$fN$=K*|3Rw#T>cr!`6%^MW6_QdHi(W2@$G@W{7J+}MW-v?kJD;a+{{HPOEO|${K z1)5&!n}VRDrKAP3Eq5f0F7U6MRpPx_>rW3p-N2|$KGcz^9^eVydu6@A+|sw4ES@7d zcXW>E(B>R{W5ab1$k@^1+Iu15XN z1mk?>*B)h{5+gI2*nNM>h|>sn=J%OaxXv6MdJcfR*|&iS&i7Hi9;vI^%+OznSesbT z<+Ba_(bUMDfI3kHtIcvF5S}a8bzkMlY;%90inm3Qw13BoCO%}s;Jbh5fh$wySX2mx zWX>^I+-Wm{fv1S6kzZjE)lEeSZ8+FH2GHrfhpe~P-ZN3)2{eDL#!ae^P;gpQv+FTX z(p?GrZsWd?XYdNG+`GRUi~6wnw2kI^{?1UkOHXy$$ed=Rak5!vjkgDek6D!~Sjgj= z@kAOj0y%kZZ!{7UUo~wi-DO0E<#|i&%EWadHc_J^?C&a(7XC)>z5Dth12rinB!`+$ z8!^?~`F1(^yf=SB`ywtP>f`gAB!*ylF3LA)ejyd0U{EU*+$^r_?L2fBRqO#h&Lh%p`mwcM@ ze934L!QFpLdyx1#s4unZRnYu^l%3_|r#u091Y2m0b7*O-{cN9Yr zsm~cQ=2T{+XNqmu_w_rjn#v@m1?DGjp|pu)y#_dWl0J?)9N6 zj#}cx5wh1a#h#4jA^nli$~Cv}$umkYFLI&j;m>~yc46|JXC3QWB=gYL%Cm9)h;x|L zNdcg#@3YR_&io21*{$Tg&m$6?QIB~gOpt!B2&e^=d#_@|o!eE9hTvbWZGP37`QUlO ze@)~(i?n#oUdbPIscUq0G~~oe&4j+GvSb?|z>NH;X~o0O`G#15Qj||~W+eB2-Ur{g z{GERpCfI3GPeY$u^2Rbd8t=(30d*%SlzTk=-mLumn2)#QP=4)W@M&}3QO=uBoV|vm z?%h%$=`(Mkih_R7MpbGF)hWNi2_M*_BY^(lO^L`HnJu3cKvnuB-bWUlJVTAaqLiBw zP1!~YH)BtWxb~hHjD;tJf0Iu;u6CueK;(Z?P)v)9QQpmLi3(xVnFW>hVJ)yo=GP2y z10+V$eUqQdQ-+ouFm>&3EN=x1>V0^CYT1m-r^y}m``ql~ z>Bldl;z+V3S*U5(>=oCB0;&CAM7)>GRxEb6DOoWrPe|f=AA)InM&=gyUgZa}4Rn8a z?np>6()Bqe`+IY&g1Cz0Zc&o%e-hv$Wdd+GK_v zIjgpHlyJ=7*`8b8Se8v5Jv9m!3C~tjU~vTII^AW4GRn3X>OF5$%l^hi%daprM=~R@ zkj}+$tT$y@w+|L5!2G5=AGW=KT|B;h<^6npn4@UOYsSUko8Qp7)oXtQ=?`l`C=E$0 z+l(MVzNyrEYsM{-W@}~$SeRmMe^dzyE`I(FCm{JH%PCHs2(RU|#r7PfH`tkC^ldAv&a9Qf^OCqH78l2E z11p^T1)@&FQ;auVuaJL2Id?|=F0N{}0hY=rj;doQjx~F2*Ep~>)-3$a>>E}ldDiLy zj7;a9RdJL3uYFXVJt^0;_!R?Jzr%vD(w6r#`Hj-2%3{|ZA~t#H3Ipr?q>zzs%IyXe zsvdC3m32=Gy^Z8etx(SX%QmwL5ZPw15BEUI1f`y50I&gz@H z4CF>y_}53RdYLwSj2s=FGG=u?Z8JW(vYrQhq8yz;y-!}KieErk`97eVUC9lb>H@4= zeRKVp_Bu~RP1Rq>F?bEZsqO*fQ=aJS3)CWgJ{GGa*TQS{O>;!uaunLG_jvC^hZl%sDEtIc0Q3O@zTnulJdimCyU>>L%f4pKZ=Nd_-ALqu#xfyB;fx%Z|T)Y%g_PLl{NHGdXB2NXj80lqm;tCOUvNgS%-|XX~q7Y=d2y5`R7Jc}lHD4_Mwu>XhI% zs<>FaW>FZYz7Na&%oC910YsENSQIs^eaF8_pw@pL?~EDn=Xx5-gY;!uh`=VUa}#`f z?X~8%D~;UDDsCg+nQI%mSh%Y85O@WxYF2GG-zQllR0&)pY7g0Nt5kliId$AV)Epj3 zY?p}|9k8b@F(rfgf9>BHIqa?0+;+#te&pAtQUdFcJ&-R+o`g83D}O#s=5R|to@(r+ zE1Q3?+#eZnR;T6O^-pYa~5%nm4XIPGmeu-iUIpmikeF^kg zJs8Zf%rk8iz~$Jp%|QSzpXLfkI-=URei2+xi@KZ1zS-mh=)`9mJ8X}r8Tv@h5KSqN zpZq?&^-E?IH)L$GJ=Fuq<7@AuZ#a~U5^R5}M2cnQ)70KMazx))jG1GR>%$$(v6c|{ z@U^Kvsy|RYm>?&6Wf4l5m)v1>tWR{1U_sDajcU;&5oQkt)I4{Jf!*J7El3>RGfuIo zq;q+0^*a#yBwf=o)C{r*g!UQ%z5!wIitA~>5tztrp;?e$PUvgTy9~Ux0!{riRWyGy zzr9J_T{2=On`WqUCJHEC`^@61-!po=tvD&Eq_(XyKQZ5Q#ga%5pL*l7DpcZiMmMq6Be+SKVO22p8)#Oa%uk(rk zLhkWO`G9HG`y8Tq83oQ2+JPbLUhR zw9mN{{yQ^J+qpg6#p8Xz-!4<$nRXc#8LeuA7ut2Pcf8PB#scKOD6^HH$O3uWzk|Jy zIr05^yKz;sZwwzS9IHh7A%kC+M4Q0y;xqN{kS9vaHhvmzY|S0XvD=Y1S2}-p(6zO) zhNW|^$Q?o$M~%TK9Gh|2eUyhyHpEV3`;mUtKFSRqwXz`H`A@a7zUb{{R0@e+s~jC6 zyJoz>j6*8r?@`m9=u;K48|#lh}c1RZFhXS&-ZN#IS$4K!au*xY9f| z_hq@bzh@ga*Ss(6Qr|+c*+$*K^!auP)HQJ^$ZN_{=RBZ{jZRd*vjXV%I$dRddcF-Y zg+5D!L%R0B4h7OWB|9227Hsv+Rl;tSmi4~pt!>{Z!#(pWkdxr9*VEuOB+}F3VCcO{ z>~`v}z_a7=cN#hka*E2-?P^%H2hLw5z)BBR-l)3y^x;m-LYidXSm5+G(47 z*b|Rkb~(?vz8NdDLN0e7)m);UKrd`OVSn;xht%ieu+E@ZUzxNLv$qczsY#n_~#1%Au@ zp3xOlQs-HXwdr<4zpP#>pCxFQ7TNN=GmR-q#;e-EIVg*kmT_Upal6fg@B3-8=s6Sl zwig)i`W>;(CA~o>Fh#wbZ+F+M+z$?SL#lrHJ7TAa3Ogt-D=u7ZU~=#2yTIC`Hssua zf^60W!B7{+>>Gbk02^ub;HknvW?u%D0iq(?Y#%BMgJcO$=I@Y&+cHuw?lWZY>UY#T z?5rY$^TqnkHq_HIS|n%ndZ*{DTH6H>F`wo@&0G#H6FgGx2M*xYkx`%H)_6-6N-6o} zXpV@UR^M<7+ebRcatgp@8%V$0@}7-TEiP@aYZ z$!|)!VoC1*F|9)N*+!)n1#fE%Sdf&{f;Zc{7`NJ zR7PavpIn2_>cPNSWHf?~^i^Iy+aTv=wvQ?s*_Heqw}OtysD4KoJ4fd(-G2qU{K_$ zA37Wvsh1&j%jq{&x;7auywNKyfqGNnM4+{_2>c{Y^&}b&Ql4$#XU_aS7(;H3+2*i| zl@~2aF={Ghn*lP*9@q{V)qjeh<1p0ISQ>A6zDDFU#|=&iDL(QE9-ZBoz^uxg&cT_*+y^g12+#z|M&nN#0l#f8+P&=!ou5J>P~jT;dN-madj|l4s&7 z)>oL$7r(D8vw~B7GKuaB9A=xD1DAjABOEg&hmcANrN|u7*=e7VIj04$GkZ;1SdzW^ zMi-~~3zFE7%(=2qV4-#MX>@RV?;SL`M0lOz=z~MK!FtYi)9nvi5*sfx5@X;nFt-C$aIaht0B#rw8%x) zsp)sn^?PLvT0y_5f^At-9YtZlLvqF|VMaEg`u0}qudrX9hLm4X&|#t4z2wtQ<%4q! z-m0mtN41#{1&Y1h)Hcq;EHcABdmv100zcB4{QcUn&yvZ=YY zRc`v!#+R%5nx1BCDgy;VEVR*Y%2~e`x=9;Qi}unaX>aZCxXU2<*O%MZ_f`xSzati0 z3>S5YF4y~K3B*Nu|p?R|1YZSn8opN=+kwz~(SV%MB+=OJ8GZ6r7-1lEiPXh*Hs;%i@r=TceU z0o+%cHJ=72v=$oZNuInJAuP`3;u*0ZR#&WsMfS8JnooK;ms_r23r>01I7+DEb8X&4qQRxdQl` zyFcg`J?(r`SL(!v$ox~dsTeT}wsE1gSd^{EQ*&69MyRot#@Kt@9uqW9oiYl0aVhFt z03^6ixg)W(y8h6KlmN=_BeIc9L2Xv3mRyYlZXSP?MbPF@jlB`F+IjlP96g1})XUbIPRTi1NHM2FangK{96#9AyIXH3mXl0=pk9Gy>Ct9922j zr`dlFpx;jesxNGwHW+G!20|Dzt<$r+!Y~mBs=gtCY1o$ATG3;FPLZY9L@YG$dX>J0dV3z}?Bg?Kz5jnY=@7)-NEy8UvB~qvz=5ix#d15@>=nXy61i2c3D~NAJBqN9SpxC z<5|qDVZolx`F2r@$-CL@qF>+s4!r+fO8M^eqSWa{L-UCW)fl*BA(^&?XO|HSH3&sJ zYxWKc%x8Q#b=(GLG%YK>bL~~5m>z!^NVVZu9qFkKAwme!Y-8umXpy_&LvXIz+|jc> zv>A>~MWyc0AuuobG~s1fjv20(h1s1`twhV>z?7?GFe=d71xG#-Rz2^7w z9m+Csyfaeby3mzC$RZe@jJnhDwEfo}uVc?t?e?@&2rhdq&yy-|d|QQ+az}r<)47{- zA62~M3!AgX;5mX0Io3~GU&hklsMU4PH>JwVPu36kPzflSE#+I8|SSW;~u=lSbx;Rd|Y@|NVU9TuR3j#=(5 zvp{U`Vy^hKKXsc%gHl~!l><_pQb8xW*+F!SmckGO8W&+r9vWdRI)Siuh{I{<(h1BrsHAFKzfa!<8evLM~% zJb(!Up3L8|T_zI7XLFv`e(<;-cOasAnu)MxTv?HyAq1Fh1cHC_UTmhZOqlT>HXe&Eey+tzRg|X zb5wkk_RX(ywNQYLN5t!>9Z0coq4>pr0{X|Z$lEc}zZMi>tC#N%a7P9my9}a$<<3`I`cq8BE zx_$5|Bv=&bs5Uz?QNQWFsJpyno8{e+EINBw0{P{nLRD_9r=dz(j%gWDl$;?pWjZ_A z26m<2^q7AKPcGZgIn8Lq;-e7UwnNV2HRoqN3O|K2CYNo>4l zmB^_nS8sYP_tb)a5~sM`^S-St9Y?5qSO>ZjqjpOc9%1zW4b1GVFUNu@*lpl2uUc7j zaD{x=cvHDp4odc#e@!8&+DPFFucSpGgUo9}dWe6s)!kWLyk}Nv9OwB+ao6wMpHBsn z(jteQ`TCLJKQl%QAmc>MzENIQY$AVWGdgWKAH1Y&Ly0O+Gh&@~ms<5KPyC8{+K9DQ z9VohRZj{9{8WuqFx`9nYG$?((35wSRD0?7p);+)lw~tjD3GuJYW0+G)xpf<#r@x%2 z7;1k*{*K^ae^dNM7~gEOxtq0xiezRUCdavf%cq_4!EM0=tEwLSR6xIs4FW~K=Kc!9 zA59N(1TB|a_5iFTcBc0E*O8J>Vfo+5Kmi(sN_Bh^_rTCmVwI8nFE`E z5L366_S*|jA>T)+C{-VaUL3Wu98o~f_TRu$U|aJ|W!TU3qDh*6eQ2Zb8tiS2+cq$o zue7XR?T=1~6=z0*m8E-qIDa_AOEKb~N)kMuRWXhQ%q=~9sT}OswR*iPg0$s6N?Csd z+bY|rxLevydccw>Q5H%=>1_Z%yU*0`kPHPuNQ<*EQR6O}{N8Ls_$#@wE~l!g_U?Z= z8PmU>PQF<33drOG#^w7Es91}~5B?`8RXPhSh=Qd)z=BwvjH+o=0!dDaG9a#Vx$0R` zAIa~iDOC!>EJR20R-lBL8W6Qg5Kn((aBGJ(3q&q!jv{`5Fx7s*0jbiSw zK)|)d{WSe5ff`GzW)<-9TU0ZDM{Uc*BaP!!KD650>{aO>fEfT$)t8fsq&l2W<69ni z+kFE3WYr?WISYIHWg)S|$j&l8sYs8UzmEf%oPI5W>4Q4D`EI-l8Q zwI^n;9|*$5VSl3UxzcqH=t5^MR5S!PDCaec=z8{zPH<*pUFaTJr3AFswJ|wr+_bK} zrj6?Hnf)IDVwKsdZ__2-dbUMT=g|4R!Y(m~K9CGihJj3u(BP74J zOK9U=Jk0GddrhSz^Ey=`2M(Vl3{O zc}HgfK*(Mzm~C!X-)7Xh(p2(0G>9^?O=$eC;6^?TKe&H~kPUinwGn?#Z044fyc*ZJ z8W;D7-eDJ_7I|w!;)hVl886Iu!GXh_Smj#-4stJ<(+Jw1-? z8=@n>Df|KD$9$T>&MYZW_dyBCHqct7T>f-Dweyun%<{f6PT|19q{&{h92t*C3dO}v ze@6)w0zB1gNwXz6-^71VzDUDW8+y?SL8S#!>Ybx=04HP~<4N+pnW+GC&sX9Cq%I#< zdYw;-5~@CC-zb^&xCxhCsY{@2EWNb+3g->cDMts{`F!SAfTxh;ufCn)6qzl55-EHn z@|Q>n9kE%mFxZ0mRTe?*Y>6QL1KRip2S*&;A#x8z4k=T zKdjk)bEHLcPxM|oh|XGHa6wPd83qpN^RL@ z$Y|#1@X1pj7L$L-@tnKZ>*35wUiGMEBm|c|*i~_^_49JeN>yk*pb3-bf;w{dtSfJc zx|;Qyaw&vCt8bhTNY%7ZANcUJ6%Q=usE`>FVLok>7s>BK>A@CPZCtA*L)!wS@FowaQ$7PSp2)nhbw>x75vu+2q$A!Q;g9(P!toAyYWZ?}Le!)#Kf7bJ~SI|YlyU2AS|=wG>l z#SBL%t9mfNjy(ppYw4+MGsx=MH{^vaW8Qy~!ES9i20#J#{yuiz>qFn@S0!^xg(~^~ z?ltao=D?_If7mGon*5a+T!r>-twF?s-H~HW6oBx3ji}H{*3UwS!A#BA6HLqF$k-DL ztb49G0_|6#QAbJWB_s7LDtu!y$>A9k^Dvql0%QN+F<>?6P1j+Fn!ov+|GZv zvH7$G6FSF0NYiyQ+icUBc%=7W119^EoP#iR&THq=l}IxF-n)Hr^klT%T-(5JXRmr& zQY$?G5l&eu|vl0EI90$W}h zi~T=m$a=@{&(T3q%Zl00H(~oF`OXU4tCNx|7+rKv{F~kA{^6Uhn-!chWc7ay&RpAa zA5skUivdDbr9NlEpsyc<7nQ9mPO?NQjL`-ui?#)P)u|mPkebnuchDp7t+o7vO zTfo-0wAd4q#pr{+wq#hMIl+HZW`xEox|bZDk{QfTW%(MnrxDodq!qcnK~!WL_}-p7enlPUY-3MMR`N33;BPH+$jbYr@!_!i$>>&Uh3?n z=E$r7dE2H`o@@=!}Qh zLtVn^T;PAJ6QJ&=QLf0-nWEFzJ2Q7=vLIo~7gHtW@wMgez?oy=)>x0a^0)jxEXqe^ z8`UT?SFrGh+gD~ml*=BBtY)I=mPu9WX6w%DFMmupksy44t%q~|w zeEyQr2s-&zaQ2$Uw0mIwjsR`q92WUb(gfK?UF?jZh)F$YWK^3`4>P?DQDqdM{60eU zZ27dq7N7f$i=%8owINmc%IrUQhii(akCi^oUPFraIr*0EsL;ApG-t(8{xHxlfQdqEl}f$ji8=I zE;;AHh+k*!Z~^CgXWVi@htDd(xPZ9JJrg%E??mw~8~Af#epsALId{}AffTB-cF`kI zkrq*c-pLUK=fsanBFL%b(>RvTp794jUw?lEx_Pn^)i>fHt>Uss6v*Lbn-hP#d@=Im zk7r^d)N(}*NZAo4btefTr7@f&8lyf#D1+`?!g(SV3|~&%-?}q&l@uTo&Z~YQx;&d`lf&4 zf2sx4?xOO*{Y>7}s;A1X{K;Bc$;sj0RNr7Dggw$C&X*n}1|v{?j?N@NnlYhO9)DTu{9#em zy;jybLFpv(WX0=72(Mm)1%O_q1?PVvvmz^xtE<0Zz02h1e0yFWl>0mjdL-w8P?0!W z^$i*P+4CA4RjJ}^1CE+EiB)Wn>z!?O@(j5j01CA}g`EocEO&}w$%=97d(^S1JzhLh za5CrHz#rtjekI-1DoBoCIx^Weg^rHIvaL$D6DFw9Au9FG`_DT3s^kYN$gF?1SI$J& z>PKQ*wV9U061aItzvTCUC0G&%Da?0U6Zvblj}5!tl#6nF_#Jy!WLlzlJ3+LExz zuV68B?n7ZZ(vCR~Ot>}CCL-aZh-AHw0iftz76G%4rP*`nhvev>L8~j3PaD!exr=Si z^YnYkMT?8&3?USzm|Xsj`&@r!eT8oCc&62cxQf7kS|0bVhO+J>_LJ)rmfDRWpLX1c zO0)&iulsg>K=H1$pK-+MX$NJ}%<=$qK&NL94w5~IZCwvrY(}LZsK9=5+>RNzr!6N% zmbR#0pWHskjF;NN^`;8K;7g`uel^c^J>_|lUAXd8=Zu`LCvbSixLAMaFy;GPc91@0 zgpT)&oUYdf+?p$kg&J?YDev}7Jkoku*@?GYN0sf2U$c<-uN5q^es81_l^^*1>YIAm z0GG8&HgQWrJMlj1vvc}t3^tYNS|fM6UG|;qflaLSxHg3m)?AGn!P2kHJkV#NAX2-S zEfM7Ns`sI2fj;oTvZQ}Ppr^rL)PBGMqFCqLHZ(^*^Z)`py=dDtG2DI{I8v&SsG{a- zl;2e3wAH8SQIhrOHU~GLJYxEu)P1vW;$=(vJ8G^xfER15iFl#OrA7Up%t&v9rMA2` zLfrx)*1iL=a90kpen%C)R$>QbvtQ?%x?;?kN0&oDN62xb64HNBf}zd2CN^SIf_Bc` z1&$ieG~dUu&}u%~_+R!7&_fO58XXnz){NCaX1Jf$Suf^pj^=8l_|dpqx+1hub9a%U z+%uL&JQtfae+MdAlCa*#5J2#xMg8yIccea)w5v9NHA~*n0T(I1bJlB5@l@QV|`8%rVWdsA`V(N;1Lv(o0{2Y?pL@%sE&$0u}eI~ zwhkUi&I4#+!n*Y|Zh)*rT4rmjEr8ycvDr3E>|Q^jxRx8OT^i^L zPiEito3l25XCIX~a<4+`UeZt8hVP#_qm9t(tL#%rqiSpRnuovj zNqbN-GHNyB zS;T6(Zx?P|_uvA9ua#vxm>k{lO(`L|z1L38GHQR*Wt;VNWHuH;hd-F_bJOdLJq^W# zcg}d0_mvqNXTsN(kp&effKh8TIx&SxYGtWv#lg?7P4k}KYmI>&@t&9xbr}R5YW;|$ z;cMns;O?}R0VXNmyUtVUnqOOHeN|LPh|d`^`8w%2?1a!8TZED?mETXB9kn^u(_*hG z4`qK>kL8h?ab}L%5cxYILalAGJ7Wao>-!9ez*HXF@ea2{KeJGL&-ZzXlV|pSr)4dF znLR*>&&-4L>B|XJZNyegg|uM#Ew~jd{WRE!=F?JzbD_*{O2w?J zQoCPFu6p%8DrVo(gOt^T0?82_(fz~`(;0u4u*tPO3kD>jP_)@jp6>(XrkH8F|{vE`>jNz+-NX{X@oU{nZ_3X7O9Ep(JSF<#u?)yqgI#p9y#?Di}BW>2`j9q^r z1v^=`S>(-fHM+Jbsh4e5HOcZ#$y%-HJ?-uoG&1sOSj~x?*XBd*DC|lB#r$&a7|o5{ zX(2XSlI0E1SABELwARFqr`H;vyPO1kcs>nkFK;`WRR4~9QSQB?()pQOxI?lY38~&kC15;% z+_YTe#%rwAV@AxWZ>mZd*@zs2ft*Y~{(vZ<%~m~74N?h}vW%jFdHWDPpzo5s7O59h z&8Jba$(V!vU35R+bQ+L_d{Ys~GjEh`bN3~2-eS7%W|`V{-nZmHx#iuK^z0CaAu4kA zij%hn1ocF+m^nIX$M<=9kY@tut`Qx7FvvVH)cU}n$hBZ|^SFE(zGmLQ4mr|hkh4&9 z&6NcLf*4c3^L{7|lwX^7+XychM0%?EK4RgpLis!385ys_X){afR((*^>$Un2GS zrt^J5kg6UaleU5*$zN&;TecCWPbADSi;DG#x?(irTC#jvdWRJ!rwm;^K)dLFShQds zP4k@bL+v8(v`JaYF5sP`mOX&-&fEu588Uczc6bQ1 zo3d|+oMvPFjsQY)ppIR!qr}XAajTv<@%c2-{ZxJt7X-b^Z@SC!r(bm(QY@Lt$FCWs zfvN|>Wm}?-z@mlFv)Ae>_6_W??1h~3cW8m6`VGAvdu;Bbhv-w{900S?0n59Ed2-t4 z3Z? zut0sD(v9dCt3-{#h{vFeW*acXjPIOk29bEl zHhlFQgQ30l=-;{Btj5}Z-yr6|4{Ftu>m*>+7KG9CkxonzDAww=gq{)*ZNW3j5v4}_ zPRx%AKOZ!vjm>+_{He+zG$eCG1*y5~)i-L8N1of#b0D-itDHXWdigX(fAc0`{Z3!G z$IC|BmTT3YLb~_^^*b800uYs8zDthv!#Z8_%c+6H=gHr3tJ7&(-KcxuybxXy&W+?66L3Z@IF@N62_Q?U3n~ zeie%X_BnUxUM}gapV$K!x-|xB5_Fd59OCvF+hBoC&mKr3ti4wa)<@>5X>v|;?;%j$ zeQ$($vWw(S0mIY=b%s=vAV`<(6#*uHHMx9K+Uc!BdjiOOYJ*Ffx5H6-x|y~o>dTRs zQ@aE|Bu5k_Qx>=0)a2DHEwkF#xr>qG|H`|}2}LDipHDmPAI>aX(yps`&Zjs<_JFu@ zv*=F@iam3olykqZgQ{;797%AeMJyl@MCU^NEitFVV%_J{_7C@MEAiP3%X3kG^*G}p zCrnmz)K0h1Bjd^^VUa5pHq|k8;m$q8ivoYu`=ALnM&?8VJ2K`yELMI#4Z|g)1U#qP zk=$hEL3MKx{NhS%3?8(ItVFxzmw`!uszf}2#E!NJL)#$TBkI^Dp0p?KOiW$s)HYSr+6ylbpQV@T^B z^)y=WpjT~yYpFLKiJ?A!plTj8X7Xt?=#r@pZ8?EnRU72BW*n&9$hpm46BxLi{j@

Rc%+G7n|&G)$5V)OhpL_tSVaM=nzulb zBi90!LdT-*RB)YjufKc*m)hzzQA45sw7_~K@>lIQsEOQ>=#vwF$*89RY)ek1MM5jJ zKrVDzQpMQ@dn|KC*Sx)MxnEziRgyWqYZi6LSTxIP&&&fKaoj(uZmjoLroEDF z1|}=NwoFRjoiBmTuB*u6W9L@@j(;a&T4|LJ(TGb8B>z{vUdJArW3UR4CW7eN1PSsC zMpab3Fn?#mc}Sms??T7BCy$@SSm(Zj@<#Tt-e((9N4e@1c04jFb!}K>={>0(EOPnE z-%%YY^CeVC(xTj09 zV9p3Siwe0p6Mcd;Zpn{rmhpnI^#Ps*hAj9-Un5`vsSdPA4F=i4X3peUm^b{-7~^$(M8;>1!~Q@A*C#FR73)l)*=_&N$76W;j{sSdA=bl*Qp- zk-aQd3=8IeNyUU%4gyx$1MC5%pa0`nQxtqo@EK`=SF7Dp8#(dvdxu4v_@*qf<#j)0 z!J94Lg+)}X;>yGF&Zq~=p?+hWjfA7u%M5@JCm@TXw(fu|YU&pHjAd8;I(8%|Aql8|(o|wmO1mOvENZWHudQE<)|xvH zESAc-dfFTEH)qIDzO0*sHkdgTC15#jbM3G!!@JFSjlFP`m!{2yPn+W=xQ{+iZz{M? zGbb(N2p)E&ODAa~7c2zB6xm4@SF|hTj6j^VI3-MK6jp+I09^6lp zQmc4~HnfxKbY?N9dPE0fwG@D~an=`VT;?B9qjEVcQV&~xAELTk(i(#|woGLNJniJx z^wTca(EM`T9aEuxM@}MZ%>qV{8Y(UV3k}%9#}A9Of12NC-eG=novILpbXR>NB9q#i ziaKJdmsi6=qp&z?EGY548r|B?@;bFaV5m%&+m`|Zg=8N0G8w`gYqvHGk9t#NrlU`@ zQMsw`Vt$88N97w?mi3yd|I-kszy|1l|>3_%^A-! zS5ADif8jjkxsCLpqELf1AxRqhFpzFSBCN!}7{1W-NyYV4mAD z0?Dk?2DYan3rG?!1?dg4++KN;7@UhO$3XPpE0uZt4n%w9j95k*uI?p}I1jo2F`^O@ zPoUhgfMlt9l@_AVxgQu!T+VKTAXb{@;(~~W#WMY7nbW%+ZMKRlYa<3(I4+*c;MnAw zf5J*BB~Wi_L*gf;Wr5JI)yP8{i!R%!CtD~)p;qz4irKMPr-g1B7R4#*+`d7E!?0El zuzy_B(?S)xV(Tx5>9qBi!(w?$Wp*AAum4RZBtEenCHT)5z&c40wHn<#7+!w_I>wV-{_Cnha)qSG(UU&$uF5<6IzE4}`W$8Jp!$RkwVk z+f00>l;K_iW@2->=9G=KR%_h8-AnR!7Vx+9o`&Gnl2H%0A~cB{H$t>7d)0$g!X)q8 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 delta 112085 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 F{{V+p<*on# diff --git a/XEngine_Docment/Docment_zh.docx b/XEngine_Docment/Docment_zh.docx index ef8972affba67c2876f6c816132e97964f523f70..1c58545f12c75478a4620444e02aea4ccdf8d4b3 100644 GIT binary patch delta 111053 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 -- Gitee From 690fcf854400d261b47d99bc7baf8ab0c7212950 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Fri, 21 Apr 2023 10:00:19 +0800 Subject: [PATCH 13/13] update:CHANGELOG and configure --- CHANGELOG | 18 ++++++++++++ .../XEngine_Config/XEngine_Config.json | 28 ++++++++++--------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index c9d61b0..fa8291c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,21 @@ +XEngine_Storage V3.11.0.1001 + +更新:匹配XEngine V8.x版本 +更新:linux和macos的编译脚本 +修改:现在数据库连接都使用utf8版本字符集了 +修改:数据库字符集使用utf8mb4_unicode_ci +修改:分离了验证和代理配置 +修改:下载和上传以及验证支持单独验证开关了 +修正:无法创建数据库表的问题 + +update:match xengine v8.10 +update:linux and macos build makefile +modify:database connect used to utf charset +modify:charset to utf8mb4_unicode_ci +modify:detach auth and proxy configure +modify:download and upload and center support both verification switch +fixed:can't create table of file +====================================================================================== XEngine_Storage V3.10.0.1001 增加:上传文件覆写功能 diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index 3409d8b..0f4a323 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -36,25 +36,26 @@ "bUPHash":0, "nHashMode":2 }, + "XAuth":{ + "bUPAuth":false, + "bDLAuth":false, + "bCHAuth":true, + "tszUserList":"./XEngine_Config/UserList.txt" + }, "XProxy":{ - "XProxyAuth":{ - "bAuth":false, - "tszUserList":"./XEngine_Config/UserList.txt", - "tszAuthProxy":"" - }, - "XProxyPass":{ - "bUPGet":0, - "bDLGet":0, - "tszUPPass":"http://192.168.1.7:5200/Api/Pass/UPFile", - "tszDLPass":"http://192.168.1.7:5200/Api/Pass/UPFile" - } + "bUPPass":false, + "bDLPass":false, + "bAuthPass":false, + "tszUPPass":"http://192.168.1.7:5200/Api/Pass/UPFile", + "tszDLPass":"http://192.168.1.7:5200/Api/Pass/UPFile", + "tszAuthPass":"" }, "XLimit":{ "bLimitMode":true, "nMaxUPLoad":4096000, "nMaxDNLoad":4096000, - "nMaxUPConnect":1, - "nMaxDNConnect":1 + "nMaxUPConnect":2, + "nMaxDNConnect":2 }, "XP2xp":{ "nTime":2, @@ -70,6 +71,7 @@ "tszCertKey":"./XEngine_Cert/2_www.xyry.org.key" }, "XVer":[ + "3.11.0.1001 Build20230421", "3.10.0.1001 Build20230210", "3.9.1.1001 Build20221227", "3.9.0.1001 Build20221028", -- Gitee