From 95cf742e11bebfa1ccda774ddb8183ad9eef7dc2 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 13 Mar 2024 15:17:02 +0800 Subject: [PATCH 01/20] added:bt protocol module --- XEngine_Source/Makefile | 5 +- .../BTorrent_Creator/BTorrent_Creator.cpp | 452 +++++++++++++ .../BTorrent_Creator/BTorrent_Creator.h | 44 ++ .../BTorrent_DLoader/BTorrent_DLoader.cpp | 429 +++++++++++++ .../BTorrent_DLoader/BTorrent_DLoader.h | 47 ++ .../StorageModule_BTorrent/BTorrent_Define.h | 594 ++++++++++++++++++ .../StorageModule_BTorrent/BTorrent_Error.h | 53 ++ .../BTorrent_Parse/BTorrent_Parse.cpp | 542 ++++++++++++++++ .../BTorrent_Parse/BTorrent_Parse.h | 41 ++ .../StorageModule_BTorrent/Makefile | 78 +++ .../StorageModule_BTorrent.def | 30 + .../StorageModule_BTorrent.vcxproj | 176 ++++++ .../StorageModule_BTorrent.vcxproj.filters | 80 +++ .../StorageModule_BTorrent.vcxproj.user | 4 + .../StorageModule_BTorrent/dllmain.cpp | 19 + .../StorageModule_BTorrent/framework.h | 5 + XEngine_Source/StorageModule_BTorrent/pch.cpp | 133 ++++ XEngine_Source/StorageModule_BTorrent/pch.h | 60 ++ XEngine_Source/XEngine_StorageApp.sln | 11 + XEngine_Source/XStorage_BuildSwitch.h | 13 + 20 files changed, 2815 insertions(+), 1 deletion(-) create mode 100644 XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.cpp create mode 100644 XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.h create mode 100644 XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.cpp create mode 100644 XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.h create mode 100644 XEngine_Source/StorageModule_BTorrent/BTorrent_Define.h create mode 100644 XEngine_Source/StorageModule_BTorrent/BTorrent_Error.h create mode 100644 XEngine_Source/StorageModule_BTorrent/BTorrent_Parse/BTorrent_Parse.cpp create mode 100644 XEngine_Source/StorageModule_BTorrent/BTorrent_Parse/BTorrent_Parse.h create mode 100644 XEngine_Source/StorageModule_BTorrent/Makefile create mode 100644 XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.def create mode 100644 XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj create mode 100644 XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj.filters create mode 100644 XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj.user create mode 100644 XEngine_Source/StorageModule_BTorrent/dllmain.cpp create mode 100644 XEngine_Source/StorageModule_BTorrent/framework.h create mode 100644 XEngine_Source/StorageModule_BTorrent/pch.cpp create mode 100644 XEngine_Source/StorageModule_BTorrent/pch.h create mode 100644 XEngine_Source/XStorage_BuildSwitch.h diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index 19e269b..403da09 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -10,11 +10,12 @@ BASE_CONFIG_PATH = ./StorageModule_Config BASE_SESSION_PATH = ./StorageModule_Session BASE_APIHELP_PATH = ./StorageModule_APIHelp BASE_PROTOCOL_PATH = ./StorageModule_Protocol +BASE_BTORRENT_PATH = ./StorageModule_BTorrent APPSERVICE_STORAGE_PATH = ./XEngine_StorageApp XENGINE_MODULES = libjsoncpp.so \ - libStorageModule_Database.so libStorageModule_Config.so libStorageModule_Session.so libStorageModule_APIHelp.so libStorageModule_Protocol.so \ + libStorageModule_Database.so libStorageModule_Config.so libStorageModule_Session.so libStorageModule_APIHelp.so libStorageModule_Protocol.so libStorageModule_BTorrent.so \ XEngine_StorageApp.exe .PHONY:MakeAll @@ -33,6 +34,8 @@ libStorageModule_APIHelp.so: make -C $(BASE_APIHELP_PATH) PLATFORM=$(PLATFORM) $(FLAGS) libStorageModule_Protocol.so: make -C $(BASE_PROTOCOL_PATH) PLATFORM=$(PLATFORM) $(FLAGS) +libStorageModule_BTorrent.so: + make -C $(BASE_BTORRENT_PATH) PLATFORM=$(PLATFORM) $(FLAGS) XEngine_StorageApp.exe: make -C $(APPSERVICE_STORAGE_PATH) PLATFORM=$(PLATFORM) $(FLAGS) diff --git a/XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.cpp b/XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.cpp new file mode 100644 index 0000000..aa694db --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.cpp @@ -0,0 +1,452 @@ +#include "pch.h" +#include "BTorrent_Creator.h" +/******************************************************************** +// Created: 2023/02/02 16:26:25 +// File Name: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_Creator\BTorrent_Creator.cpp +// File Path: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_Creator +// File Base: BTorrent_Creator +// File Ext: cpp +// Project: XEngine +// Author: qyt +// Purpose: BT创建器 +// History: +*********************************************************************/ +CBTorrent_Creator::CBTorrent_Creator() +{ +} +CBTorrent_Creator::~CBTorrent_Creator() +{ +} +////////////////////////////////////////////////////////////////////////// +// 公有函数 +////////////////////////////////////////////////////////////////////////// +/******************************************************************** +函数名称:BTorrent_Creator_Init +函数功能:初始化一个制作工具 + 参数.一:pxhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:导出一个句柄 + 参数.二:lpszBTPath + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要制作的文件地址路径 + 参数.三:nPieceSize + In/Out:In + 类型:整数型 + 可空:N + 意思:块大小,默认16K +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Creator::BTorrent_Creator_Init(XNETHANDLE* pxhToken, LPCXSTR lpszBTPath, int nPieceSize) +{ + BTDload_IsErrorOccur = false; + + if ((NULL == pxhToken) || (NULL == lpszBTPath)) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_INIT_PARAMENT; + return false; + } + //申请空间 + BTORRENT_CREATORINFO st_BTCreator; + memset(&st_BTCreator, '\0', sizeof(BTORRENT_CREATORINFO)); + + //申请内存 + st_BTCreator.pStl_ListNode = new list; + st_BTCreator.pStl_ListSeeds = new list; + st_BTCreator.pStl_ListTracker = new list; + + if ((NULL == st_BTCreator.pStl_ListNode) || (NULL == st_BTCreator.pStl_ListSeeds) || (NULL == st_BTCreator.pStl_ListTracker)) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_INIT_MALLOC; + return false; + } + + st_BTCreator.m_nPieceSize = nPieceSize; + _tcsxcpy(st_BTCreator.tszBTPath, lpszBTPath); + + BaseLib_OperatorHandle_Create(pxhToken); + st_Locker.lock(); + stl_MapBTCreator.insert(make_pair(*pxhToken, st_BTCreator)); + st_Locker.unlock(); + return true; +} +/******************************************************************** +函数名称:BTorrent_Creator_AddNode +函数功能:添加种子DHT节点地址 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:lpszAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入节点地址 + 参数.三:nIndex + In/Out:In + 类型:整数型 + 可空:N + 意思:当前索引 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Creator::BTorrent_Creator_AddNode(XNETHANDLE xhToken, LPCXSTR lpszAddr, int nIndex) +{ + BTDload_IsErrorOccur = false; + + if (NULL == lpszAddr) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_NODE_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapBTCreator.find(xhToken); + if (stl_MapIterator == stl_MapBTCreator.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_NODE_NOTFOUND; + st_Locker.unlock_shared(); + return false; + } + BTORRENT_PARSEMAP st_BTInfo; + memset(&st_BTInfo, '\0', sizeof(BTORRENT_PARSEMAP)); + + st_BTInfo.nValue = nIndex; + _tcsxcpy(st_BTInfo.tszValue, lpszAddr); + stl_MapIterator->second.pStl_ListNode->push_back(st_BTInfo); + st_Locker.unlock_shared(); + return true; +} +/******************************************************************** +函数名称:BTorrent_Creator_AddTracker +函数功能:设置TRACKER服务器地址 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:lpszAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入地址 + 参数.三:nIndex + In/Out:In + 类型:整数型 + 可空:Y + 意思:输入服务器索引 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Creator::BTorrent_Creator_AddTracker(XNETHANDLE xhToken, LPCXSTR lpszAddr, int nIndex) +{ + BTDload_IsErrorOccur = false; + + if (NULL == lpszAddr) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_TRACKER_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapBTCreator.find(xhToken); + if (stl_MapIterator == stl_MapBTCreator.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_TRACKER_NOTFOUND; + st_Locker.unlock_shared(); + return false; + } + BTORRENT_PARSEMAP st_BTInfo; + memset(&st_BTInfo, '\0', sizeof(BTORRENT_PARSEMAP)); + + st_BTInfo.nValue = nIndex; + _tcsxcpy(st_BTInfo.tszValue, lpszAddr); + stl_MapIterator->second.pStl_ListTracker->push_back(st_BTInfo); + st_Locker.unlock_shared(); + return true; +} +/******************************************************************** +函数名称:BTorrent_Creator_AddSeeds +函数功能:添加URL种子到制作器 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:lpszAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入地址 + 参数.三:bSingle + In/Out:In + 类型:逻辑型 + 可空:N + 意思:多种子文件还是单种子文件 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Creator::BTorrent_Creator_AddSeeds(XNETHANDLE xhToken, LPCXSTR lpszAddr, bool bSingle) +{ + BTDload_IsErrorOccur = false; + + if (NULL == lpszAddr) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_SEEDS_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapBTCreator.find(xhToken); + if (stl_MapIterator == stl_MapBTCreator.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_SEEDS_NOTFOUND; + st_Locker.unlock_shared(); + return false; + } + BTORRENT_PARSEMAP st_BTInfo; + memset(&st_BTInfo, '\0', sizeof(BTORRENT_PARSEMAP)); + + st_BTInfo.nValue = bSingle; + _tcsxcpy(st_BTInfo.tszValue, lpszAddr); + stl_MapIterator->second.pStl_ListSeeds->push_back(st_BTInfo); + st_Locker.unlock_shared(); + return true; +} +/******************************************************************** +函数名称:BTorrent_Creator_SetInfo +函数功能:设置种子信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:lpszCreator + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入制作器名称 + 参数.三:lpszComment + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输入附加信息 + 参数.四:lpszCertBuffer + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输入PEM证书缓冲区 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Creator::BTorrent_Creator_SetInfo(XNETHANDLE xhToken, LPCXSTR lpszCreator, LPCXSTR lpszComment /* = NULL */, LPCXSTR lpszCertBuffer /* = NULL */) +{ + BTDload_IsErrorOccur = false; + + if (NULL == lpszCreator) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_INFO_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::iterator stl_MapIterator = stl_MapBTCreator.find(xhToken); + if (stl_MapIterator == stl_MapBTCreator.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_INFO_NOTFOUND; + st_Locker.unlock_shared(); + return false; + } + _tcsxcpy(stl_MapIterator->second.tszCreate, lpszCreator); + if (NULL != lpszComment) + { + _tcsxcpy(stl_MapIterator->second.tszComment, lpszComment); + } + if (NULL != lpszCertBuffer) + { + _tcsxcpy(stl_MapIterator->second.tszPEMCert, lpszCertBuffer); + } + st_Locker.unlock_shared(); + return true; +} +/******************************************************************** +函数名称:BTorrent_Creator_GetTorrent +函数功能:获取中心信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:lpszBTFile + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输出种子文件地址 + 参数.三:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:Y + 意思:输出种子信息到内存 + 参数.四:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:Y + 意思:输出内存大小 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Creator::BTorrent_Creator_GetTorrent(XNETHANDLE xhToken, LPCXSTR lpszBTFile /* = NULL */, XCHAR* ptszMsgBuffer /* = NULL */, int* pInt_MsgLen /* = NULL */) +{ + BTDload_IsErrorOccur = false; + + if ((NULL == lpszBTFile) && (NULL == ptszMsgBuffer)) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_FILE_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::iterator stl_MapIterator = stl_MapBTCreator.find(xhToken); + if (stl_MapIterator == stl_MapBTCreator.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_FILE_NOTFOUND; + st_Locker.unlock_shared(); + return false; + } +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + lt::file_storage m_BTFile; + lt::create_flags_t m_BTFlags; + //种子的标示 + m_BTFlags |= lt::create_torrent::modification_time; + //解析文件 + lt::add_files(m_BTFile, stl_MapIterator->second.tszBTPath, m_BTFlags); + if (m_BTFile.num_files() <= 0) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_FILE_PARSE; + return false; + } + //创建BT种子,种子文件解析的数据,块大小,附加信息,种子标志 + lt::create_torrent m_BTCreator(m_BTFile, stl_MapIterator->second.m_nPieceSize, m_BTFlags); + //给创建起赋值 + m_BTCreator.set_creator(stl_MapIterator->second.tszCreate); + m_BTCreator.set_comment(stl_MapIterator->second.tszComment); + m_BTCreator.set_root_cert(stl_MapIterator->second.tszPEMCert); + //节点添加 + list::const_iterator stl_ListNodeIterator = stl_MapIterator->second.pStl_ListNode->begin(); + for (; stl_ListNodeIterator != stl_MapIterator->second.pStl_ListNode->end(); stl_MapIterator++) + { + m_BTCreator.add_node(make_pair(stl_ListNodeIterator->tszValue, stl_ListNodeIterator->nValue)); + } + //添加服务 + list::const_iterator stl_ListTrackerIterator = stl_MapIterator->second.pStl_ListTracker->begin(); + for (; stl_ListTrackerIterator != stl_MapIterator->second.pStl_ListTracker->end(); stl_ListTrackerIterator++) + { + m_BTCreator.add_tracker(stl_ListTrackerIterator->tszValue, stl_ListTrackerIterator->nValue); + } + //添加SEED服务 + list::const_iterator stl_ListSeedIterator = stl_MapIterator->second.pStl_ListSeeds->begin(); + for (; stl_ListSeedIterator != stl_MapIterator->second.pStl_ListSeeds->end(); stl_ListSeedIterator++) + { + //添加URL种子,单文件为HTTP的URL,多文件为SEED + if (stl_ListSeedIterator->nValue) + { + m_BTCreator.add_http_seed(stl_ListTrackerIterator->tszValue); + } + else + { + m_BTCreator.add_url_seed(stl_ListTrackerIterator->tszValue); + } + } + //开始打包 + std::vector stl_ListTorrent; + lt::bencode(back_inserter(stl_ListTorrent), m_BTCreator.generate()); + //写到文件 + if (NULL != lpszBTFile) + { + std::fstream m_FStream; + m_FStream.exceptions(std::ifstream::failbit); + m_FStream.open(lpszBTFile, std::ios_base::out | std::ios_base::binary); + if (!m_FStream) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_CREATOR_FILE_FAILED; + st_Locker.unlock_shared(); + return false; + } + m_FStream.write(stl_ListTorrent.data(), stl_ListTorrent.size()); + m_FStream.close(); + } + //输出到内存 + if (NULL != ptszMsgBuffer) + { + *pInt_MsgLen = stl_ListTorrent.size(); + memcpy(ptszMsgBuffer, stl_ListTorrent.data(), *pInt_MsgLen); + } +#endif + st_Locker.unlock_shared(); + + return true; +} +/******************************************************************** +函数名称:BTorrent_Creator_Destory +函数功能:销毁 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Creator::BTorrent_Creator_Destory(XNETHANDLE xhToken) +{ + BTDload_IsErrorOccur = false; + + st_Locker.lock(); + unordered_map::iterator stl_MapIterator = stl_MapBTCreator.find(xhToken); + if (stl_MapIterator != stl_MapBTCreator.end()) + { + stl_MapIterator->second.pStl_ListNode->clear(); + stl_MapIterator->second.pStl_ListSeeds->clear(); + stl_MapIterator->second.pStl_ListTracker->clear(); + + delete stl_MapIterator->second.pStl_ListNode; + delete stl_MapIterator->second.pStl_ListSeeds; + delete stl_MapIterator->second.pStl_ListTracker; + + stl_MapIterator->second.pStl_ListNode = NULL; + stl_MapIterator->second.pStl_ListSeeds = NULL; + stl_MapIterator->second.pStl_ListTracker = NULL; + + stl_MapBTCreator.erase(stl_MapIterator); + } + st_Locker.unlock(); + return true; +} \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.h b/XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.h new file mode 100644 index 0000000..7a6c4ec --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/BTorrent_Creator/BTorrent_Creator.h @@ -0,0 +1,44 @@ +#pragma once +/******************************************************************** +// Created: 2023/02/02 16:25:43 +// File Name: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_Creator\BTorrent_Creator.h +// File Path: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_Creator +// File Base: BTorrent_Creator +// File Ext: h +// Project: XEngine +// Author: qyt +// Purpose: BT创建器 +// History: +*********************************************************************/ +typedef struct +{ + XCHAR tszComment[4096]; + XCHAR tszPEMCert[4096]; + XCHAR tszBTPath[MAX_PATH]; + XCHAR tszCreate[MAX_PATH]; + int m_nPieceSize; + + list* pStl_ListNode; + list* pStl_ListTracker; + list* pStl_ListSeeds; +}BTORRENT_CREATORINFO; + +class CBTorrent_Creator +{ +public: + CBTorrent_Creator(); + ~CBTorrent_Creator(); +public: + bool BTorrent_Creator_Init(XNETHANDLE* pxhToken, LPCXSTR lpszBTPath, int nPieceSize = 0); + bool BTorrent_Creator_AddNode(XNETHANDLE xhToken, LPCXSTR lpszAddr, int nIndex); + bool BTorrent_Creator_AddTracker(XNETHANDLE xhToken, LPCXSTR lpszAddr, int nIndex = 0); + bool BTorrent_Creator_AddSeeds(XNETHANDLE xhToken, LPCXSTR lpszAddr, bool bSingle = false); + bool BTorrent_Creator_SetInfo(XNETHANDLE xhToken, LPCXSTR lpszCreator, LPCXSTR lpszComment = NULL, LPCXSTR lpszCertBuffer = NULL); + bool BTorrent_Creator_GetTorrent(XNETHANDLE xhToken, LPCXSTR lpszBTFile = NULL, XCHAR* ptszMsgBuffer = NULL, int* pInt_MsgLen = NULL); + bool BTorrent_Creator_Destory(XNETHANDLE xhToken); +protected: +private: + shared_mutex st_Locker; +private: + unordered_map stl_MapBTCreator; +}; \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.cpp b/XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.cpp new file mode 100644 index 0000000..86f380e --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.cpp @@ -0,0 +1,429 @@ +#include "pch.h" +#include "BTorrent_DLoader.h" +/******************************************************************** +// Created: 2023/02/02 16:26:33 +// File Name: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_DLoader\BTorrent_DLoader.cpp +// File Path: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_DLoader +// File Base: BTorrent_DLoader +// File Ext: cpp +// Project: XEngine +// Author: qyt +// Purpose: BT下载器 +// History: +*********************************************************************/ +CBTorrent_DLoader::CBTorrent_DLoader() +{ +} +CBTorrent_DLoader::~CBTorrent_DLoader() +{ +} +////////////////////////////////////////////////////////////////////////// +// 公有函数 +////////////////////////////////////////////////////////////////////////// +/******************************************************************** +函数名称:BTorrent_DLoader_Create +函数功能:创建一个BT下载 + 参数.一:pxhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:导出一个下载句柄 + 参数.二:lpszAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:下载的地址,可以是本地种子文件路径或者磁力链接 + 参数.三:lpszSavePath + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要保存的地址,这个地址是一个本地文件夹.而不是文件名. + 参数.四:lpszTempFile + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:断点续传临时文件路径 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_DLoader::BTorrent_DLoader_Create(XNETHANDLE* pxhToken, LPCXSTR lpszAddr, LPCXSTR lpszSavePath, LPCXSTR lpszTempFile /* = NULL */) +{ + BTDload_IsErrorOccur = false; + + if ((NULL == pxhToken) || (NULL == lpszAddr) || (NULL == lpszSavePath)) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_DLOAD_CREATE_PARAMENT; + return false; + } +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + //申请空间 + BTORRENT_DLOADINFO* pSt_BTDLoader = new BTORRENT_DLOADINFO; + if (NULL == pSt_BTDLoader) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_DLOAD_CREATE_MALLOC; + return false; + } + //初始化要查询的事件 + pSt_BTDLoader->m_BTSetPack.set_int(lt::settings_pack::alert_mask, lt::alert_category::error | lt::alert_category::storage | lt::alert_category::status | lt::alert_category::port_mapping); + pSt_BTDLoader->m_BTSession = std::make_shared(pSt_BTDLoader->m_BTSetPack); + + lt::add_torrent_params m_TorrentParam; + //是磁力链接还是BT种子 + LPCXSTR lpszBTType = _X("magnet:?xt=urn:"); + if (NULL == _tcsxstr(lpszAddr, lpszBTType)) + { + pSt_BTDLoader->m_BTParam.ti = std::make_shared(std::string(lpszAddr)); + } + else + { + pSt_BTDLoader->m_BTParam = lt::parse_magnet_uri(lpszAddr); + } + //如果是续传,那么判断文件是否存在! + if (NULL != lpszTempFile) + { + pSt_BTDLoader->bIsResume = true; + std::ifstream m_IFStream(lpszTempFile, std::ios_base::binary); + m_IFStream.unsetf(std::ios_base::skipws); + + std::vector stl_VecFile; + stl_VecFile = { std::istream_iterator(m_IFStream), std::istream_iterator() }; + if (stl_VecFile.size() > 0) + { + m_TorrentParam = lt::read_resume_data(stl_VecFile); + if (m_TorrentParam.info_hashes == pSt_BTDLoader->m_BTParam.info_hashes) + { + pSt_BTDLoader->m_BTParam = std::move(m_TorrentParam); + } + } + } + pSt_BTDLoader->m_BTParam.save_path = lpszSavePath; + pSt_BTDLoader->m_BTSession->async_add_torrent(std::move(pSt_BTDLoader->m_BTParam)); + //设置选项 + pSt_BTDLoader->lPClass = this; + _tcsxcpy(pSt_BTDLoader->tszAddr, lpszAddr); + _tcsxcpy(pSt_BTDLoader->tszFile, lpszSavePath); + //生成句柄 + BaseLib_OperatorHandle_Create(pxhToken); + + st_Locker.lock(); + stl_MapDLoader.insert(make_pair(*pxhToken, pSt_BTDLoader)); + st_Locker.unlock(); +#endif + return true; +} +/******************************************************************** +函数名称:BTorrent_DLoader_Query +函数功能:查询下载状态 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pppenEventList + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出事件列表 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_DLoader::BTorrent_DLoader_Query(XNETHANDLE xhToken, ENUM_BTORRENT_EVENT_TYPE*** pppenEventList, int* pInt_ListCount) +{ + BTDload_IsErrorOccur = false; + + if ((NULL == pppenEventList) || (NULL == pInt_ListCount)) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_DLOAD_QUERY_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapDLoader.find(xhToken); + if (stl_MapIterator == stl_MapDLoader.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_DLOAD_QUERY_NOTFOUND; + st_Locker.unlock_shared(); + return false; + } +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + //投教一个状态更新请求,才能触发信号 + stl_MapIterator->second->m_BTSession->post_torrent_updates(); + //得到信号 + std::vector stl_VectorAlerts; + stl_MapIterator->second->m_BTSession->pop_alerts(&stl_VectorAlerts); + if (stl_VectorAlerts.empty()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_DLOAD_QUERY_NONE; + st_Locker.unlock_shared(); + return false; + } + *pInt_ListCount = stl_VectorAlerts.size(); + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppenEventList, stl_VectorAlerts.size(), sizeof(ENUM_BTORRENT_EVENT_TYPE)); + //轮训元素 + int i = 0; + for (lt::alert const* stl_ListElement : stl_VectorAlerts) + { + //是否接受到完成的信号 + if (lt::alert_cast(stl_ListElement)) + { + *((*pppenEventList)[i]) = ENUM_BTORRENT_EVENT_TYPE_COMPLETE; + } + //是否接受到错误的信号 + if (lt::alert_cast(stl_ListElement)) + { + //std::cout << stl_ListElement->message() << std::endl; + *((*pppenEventList)[i]) = ENUM_BTORRENT_EVENT_TYPE_ERROR; + } + //接受到临时文件保存请求,需要保存他 + if (auto m_BTDLoader = lt::alert_cast(stl_ListElement)) + { + *((*pppenEventList)[i]) = ENUM_BTORRENT_EVENT_TYPE_WRITETMP; + std::ofstream m_OSFile(stl_MapIterator->second->tszTemp, std::ios_base::binary); + m_OSFile.unsetf(std::ios_base::skipws); + auto const m_BTData = write_resume_data_buf(m_BTDLoader->params); + m_OSFile.write(m_BTData.data(), int(m_BTData.size())); + } + //接受到数据写入错误 + if (lt::alert_cast(stl_ListElement)) + { + *((*pppenEventList)[i]) = ENUM_BTORRENT_EVENT_TYPE_DATAERROR; + } + //UPNP信息 + if (lt::alert_cast(stl_ListElement)) + { + //stl_ListElement->message().c_str(); + *((*pppenEventList)[i]) = ENUM_BTORRENT_EVENT_TYPE_UPNPERROR; + } + else if (lt::alert_cast(stl_ListElement)) + { + *((*pppenEventList)[i]) = ENUM_BTORRENT_EVENT_TYPE_UPNPCOMPLETE; + } + //下载状态通知 + if (auto stl_VectorUPDate = lt::alert_cast(stl_ListElement)) + { + if (stl_VectorUPDate->status.empty()) + { + continue; + } + *((*pppenEventList)[i]) = ENUM_BTORRENT_EVENT_TYPE_STATUS; + //更新通知,查询状态 + std::vector::const_iterator stl_VectorIterator = stl_VectorUPDate->status.begin(); + for (int i = 0; stl_VectorIterator != stl_VectorUPDate->status.end(); stl_VectorIterator++, i++) + { +#if _MSC_BUILD + int nUTFLen = stl_VectorIterator->name.length(); + BaseLib_OperatorCharset_UTFToAnsi(stl_VectorIterator->name.c_str(), stl_MapIterator->second->st_DLStatus.tszFileName, &nUTFLen); + stl_MapIterator->second->st_DLStatus.nDLoadTotal = stl_VectorIterator->total; +#else + _tcsxcpy(stl_MapIterator->second->st_DLStatus.tszFileName, stl_VectorIterator->name.c_str()); + stl_MapIterator->second->st_DLStatus.nDLoadTotal = stl_VectorIterator->total_wanted; +#endif + stl_MapIterator->second->st_DLStatus.nDLCount = stl_VectorIterator->total_done; + stl_MapIterator->second->st_DLStatus.nUPCount = stl_VectorIterator->total_upload; + stl_MapIterator->second->st_DLStatus.nDLStatus = stl_VectorIterator->state; + stl_MapIterator->second->st_DLStatus.nDLoadRate = stl_VectorIterator->download_payload_rate; + stl_MapIterator->second->st_DLStatus.nDLPeers = stl_VectorIterator->num_peers; + stl_MapIterator->second->st_DLStatus.nUPPeers = stl_VectorIterator->num_seeds; + stl_MapIterator->second->st_DLStatus.nDLoadProcess = stl_VectorIterator->progress_ppm / 10000; + } + } + i++; + } +#endif + st_Locker.unlock_shared(); + return true; +} +/******************************************************************** +函数名称:BTorrent_DLoader_GetStatus +函数功能:获取下载状态 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pSt_DLStatus + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出查到的下载情况 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_DLoader::BTorrent_DLoader_GetStatus(XNETHANDLE xhToken, BTORRENT_DLOADER* pSt_DLStatus) +{ + BTDload_IsErrorOccur = false; + + if (NULL == pSt_DLStatus) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_DLOAD_GETSTATUS_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapDLoader.find(xhToken); + if (stl_MapIterator == stl_MapDLoader.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_DLOAD_GETSTATUS_NOTFOUND; + st_Locker.unlock_shared(); + return false; + } + *pSt_DLStatus = stl_MapIterator->second->st_DLStatus; + st_Locker.unlock_shared(); + + return true; +} +/******************************************************************** +函数名称:BTorrent_DLoader_SaveResume +函数功能:触发一次临时文件保存操作 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:每调用一次,将会触发一次事件信号,通知系统保存一次临时文件 +*********************************************************************/ +bool CBTorrent_DLoader::BTorrent_DLoader_SaveResume(XNETHANDLE xhToken) +{ + BTDload_IsErrorOccur = false; + +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapDLoader.find(xhToken); + if (stl_MapIterator != stl_MapDLoader.end()) + { + std::vector stl_VectorAlerts; + stl_MapIterator->second->m_BTSession->pop_alerts(&stl_VectorAlerts); + //轮训元素 + for (lt::alert const* stl_ListElement : stl_VectorAlerts) + { + //获得元素内容 + auto stl_ListIterator = lt::alert_cast(stl_ListElement); + stl_ListIterator->handle.save_resume_data(lt::torrent_handle::save_info_dict); + } + } + st_Locker.unlock_shared(); +#endif + return true; +} +/******************************************************************** +函数名称:BTorrent_DLoader_Close +函数功能:关闭一个种子下载器 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_DLoader::BTorrent_DLoader_Close(XNETHANDLE xhToken) +{ + BTDload_IsErrorOccur = false; + +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + st_Locker.lock(); + unordered_map::const_iterator stl_MapIterator = stl_MapDLoader.find(xhToken); + if (stl_MapIterator != stl_MapDLoader.end()) + { + stl_MapIterator->second->m_BTSession->abort(); + } + st_Locker.unlock(); +#endif + return true; +} +/******************************************************************** +函数名称:BTorrent_DLoader_SetPause +函数功能:设置暂停或者恢复 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的 + 参数.二:bPause + In/Out:In + 类型:逻辑型 + 可空:N + 意思:假为暂停,真为恢复下载 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_DLoader::BTorrent_DLoader_SetPause(XNETHANDLE xhToken, bool bPause) +{ + BTDload_IsErrorOccur = false; + +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapDLoader.find(xhToken); + if (stl_MapIterator != stl_MapDLoader.end()) + { + if (bPause) + { + stl_MapIterator->second->m_BTSession->pause(); + } + else + { + stl_MapIterator->second->m_BTSession->resume(); + } + } + st_Locker.unlock_shared(); +#endif + return true; +} +/******************************************************************** +函数名称:BTorrent_DLoader_UPNPEnable +函数功能:启用或者关闭UPNP + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的 + 参数.二:bEnable + In/Out:In + 类型:逻辑型 + 可空:N + 意思:输入启用还是关闭UPNP +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_DLoader::BTorrent_DLoader_UPNPEnable(XNETHANDLE xhToken, bool bEnable /* = false */) +{ + BTDload_IsErrorOccur = false; + +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapDLoader.find(xhToken); + if (stl_MapIterator != stl_MapDLoader.end()) + { + stl_MapIterator->second->m_BTSetPack.set_bool(lt::settings_pack::enable_upnp, bEnable); + stl_MapIterator->second->m_BTSetPack.set_bool(lt::settings_pack::enable_natpmp, bEnable); + stl_MapIterator->second->m_BTSession->apply_settings(stl_MapIterator->second->m_BTSetPack); + } + st_Locker.unlock_shared(); +#endif + return true; +} \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.h b/XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.h new file mode 100644 index 0000000..17d742c --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/BTorrent_DLoader/BTorrent_DLoader.h @@ -0,0 +1,47 @@ +#pragma once +/******************************************************************** +// Created: 2023/02/02 16:25:51 +// File Name: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_DLoader\BTorrent_DLoader.h +// File Path: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_DLoader +// File Base: BTorrent_DLoader +// File Ext: h +// Project: XEngine +// Author: qyt +// Purpose: BT下载器 +// History: +*********************************************************************/ +typedef struct +{ +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + lt::settings_pack m_BTSetPack; + lt::add_torrent_params m_BTParam; + std::shared_ptr m_BTSession; +#endif + BTORRENT_DLOADER st_DLStatus; //下载状态 + + XCHAR tszAddr[MAX_PATH]; //下载地址 + XCHAR tszFile[MAX_PATH]; //保存地址 + XCHAR tszTemp[MAX_PATH]; //临时文件 + bool bIsResume; //是否续传 + XPVOID lPClass; //指向类的指针 +}BTORRENT_DLOADINFO, * LPBTORRENT_DLOADINFO; +////////////////////////////////////////////////////////////////////////// +class CBTorrent_DLoader +{ +public: + CBTorrent_DLoader(); + ~CBTorrent_DLoader(); +public: + bool BTorrent_DLoader_Create(XNETHANDLE* pxhToken, LPCXSTR lpszAddr, LPCXSTR lpszSavePath, LPCXSTR lpszTempFile = NULL); + bool BTorrent_DLoader_Query(XNETHANDLE xhToken, ENUM_BTORRENT_EVENT_TYPE*** pppenEventList, int* pInt_ListCount); + bool BTorrent_DLoader_GetStatus(XNETHANDLE xhToken, BTORRENT_DLOADER* pSt_DLStatus); + bool BTorrent_DLoader_SaveResume(XNETHANDLE xhToken); + bool BTorrent_DLoader_Close(XNETHANDLE xhToken); +public: + bool BTorrent_DLoader_SetPause(XNETHANDLE xhToken, bool bPause); + bool BTorrent_DLoader_UPNPEnable(XNETHANDLE xhToken, bool bEnable = false); +private: + shared_mutex st_Locker; +private: + unordered_map stl_MapDLoader; +}; diff --git a/XEngine_Source/StorageModule_BTorrent/BTorrent_Define.h b/XEngine_Source/StorageModule_BTorrent/BTorrent_Define.h new file mode 100644 index 0000000..8a128bb --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/BTorrent_Define.h @@ -0,0 +1,594 @@ +#pragma once +/******************************************************************** +// Created: 2024/03/13 14:35:22 +// File Name: D:\XEngine_Storage\XEngine_Source\StorageModule_BTorrent\BTorrent_Define.h +// File Path: D:\XEngine_Storage\XEngine_Source\StorageModule_BTorrent +// File Base: BTorrent_Define +// File Ext: h +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: BT下载导出 +// History: +*********************************************************************/ +////////////////////////////////////////////////////////////////////////// +// 导出枚举型 +////////////////////////////////////////////////////////////////////////// +typedef enum +{ + ENUM_BTORRENT_EVENT_TYPE_OTHER = 0, //其他 + ENUM_BTORRENT_EVENT_TYPE_COMPLETE = 1, //下载完成 + ENUM_BTORRENT_EVENT_TYPE_ERROR = 2, //下载错误 + ENUM_BTORRENT_EVENT_TYPE_DATAERROR = 3, //数据写入错误 + ENUM_BTORRENT_EVENT_TYPE_WRITETMP = 4, //正在写入临时文件 + ENUM_BTORRENT_EVENT_TYPE_UPNPERROR = 5, //UPNP错误信息通知 + ENUM_BTORRENT_EVENT_TYPE_UPNPCOMPLETE = 6, //UPNP端口映射完成通知 + ENUM_BTORRENT_EVENT_TYPE_STATUS = 10 //下载状态 +}ENUM_BTORRENT_EVENT_TYPE; +typedef enum +{ + ENUM_BTORRENT_DOWNLOAD_STATUS_OTHER = 0, //内部状态 + ENUM_BTORRENT_DOWNLOAD_STATUS_CHECKFILE = 1, //检查文件状态中 + ENUM_BTORRENT_DOWNLOAD_STATUS_DLMETADATA = 2, //从节点下载媒体数据中 + ENUM_BTORRENT_DOWNLOAD_STATUS_LOADING = 3, //下载中... + ENUM_BTORRENT_DOWNLOAD_STATUS_FINISH = 4, //下载完成 + ENUM_BTORRENT_DOWNLOAD_STATUS_SEEDING = 5, //做种中,下载以完成. + ENUM_BTORRENT_DOWNLOAD_STATUS_CHECKRESUME = 7 //正在进行断点续传文件检查 +}ENUM_BTORRENT_DOWNLOAD_STATUS; +////////////////////////////////////////////////////////////////////////// +// 导出数据结构 +////////////////////////////////////////////////////////////////////////// +typedef struct +{ + XCHAR tszFileName[MAX_PATH]; //文件名 + __int64x nDLoadTotal; //总大小 + __int64x nDLCount; //已下载大小 + __int64x nUPCount; //已上传大小 + int nDLStatus; //状态 = ENUM_BTORRENT_DOWNLOAD_STATUS + int nDLoadRate; //下载平均速度,字节 + int nDLoadProcess; //下载进度. % + int nDLPeers; //连接的下载节点个数 + int nUPPeers; //上传的节点个数 +}BTORRENT_DLOADER; +typedef struct +{ + XCHAR tszValue[MAX_PATH]; + int nValue; +}BTORRENT_PARSEMAP; +typedef struct +{ + XCHAR tszFileHash[MAX_PATH]; //文件HASH + XCHAR tszFilePath[MAX_PATH]; //文件路径 + XCHAR tszFileName[MAX_PATH]; //文件名称 + XCHAR tszFileLink[MAX_PATH]; //文件连接,如果有的话 + __int64x nFileOffset; //文件偏移 + __int64x nFileSize; //文件大小 + time_t nFileTime; //文件时间戳 + int nFileStart; //块索引范围 + int nFileEnd; //块索引范围 + XSHOT wFileAttr; //文件属性 +}BTORRENT_FILEINFO; +////////////////////////////////////////////////////////////////////////// +// 导出函数 +////////////////////////////////////////////////////////////////////////// +extern "C" XLONG BTorrent_GetLastError(int *pInt_SysError = NULL); +/************************************************************************/ +/* BT下载器导出函数 */ +/************************************************************************/ +/******************************************************************** +函数名称:BTorrent_DLoader_Create +函数功能:创建一个BT下载 + 参数.一:pxhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:导出一个下载句柄 + 参数.二:lpszAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:下载的地址,可以是本地种子文件路径或者磁力链接 + 参数.三:lpszSavePath + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要保存的地址,这个地址是一个本地文件夹.而不是文件名. + 参数.四:lpszTempFile + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:断点续传临时文件路径 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_DLoader_Create(XNETHANDLE* pxhToken, LPCXSTR lpszAddr, LPCXSTR lpszSavePath, LPCXSTR lpszTempFile = NULL); +/******************************************************************** +函数名称:BTorrent_DLoader_Query +函数功能:查询下载状态 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pppenEventList + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出事件列表 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_DLoader_Query(XNETHANDLE xhToken, ENUM_BTORRENT_EVENT_TYPE*** pppenEventList, int* pInt_ListCount); +/******************************************************************** +函数名称:BTorrent_DLoader_GetStatus +函数功能:获取下载状态 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pSt_DLStatus + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出查到的下载情况 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_DLoader_GetStatus(XNETHANDLE xhToken, BTORRENT_DLOADER * pSt_DLStatus); +/******************************************************************** +函数名称:BTorrent_DLoader_SaveResume +函数功能:触发一次临时文件保存操作 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:每调用一次,将会触发一次事件信号,通知系统保存一次临时文件 +*********************************************************************/ +extern "C" bool BTorrent_DLoader_SaveResume(XNETHANDLE xhToken); +/******************************************************************** +函数名称:BTorrent_DLoader_Close +函数功能:关闭一个种子下载器 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_DLoader_Close(XNETHANDLE xhToken); +/******************************************************************** +函数名称:BTorrent_DLoader_SetPause +函数功能:设置暂停或者恢复 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的 + 参数.二:bPause + In/Out:In + 类型:逻辑型 + 可空:N + 意思:假为暂停,真为恢复下载 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_DLoader_SetPause(XNETHANDLE xhToken, bool bPause); +/******************************************************************** +函数名称:BTorrent_DLoader_UPNPEnable +函数功能:启用或者关闭UPNP + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的 + 参数.二:bEnable + In/Out:In + 类型:逻辑型 + 可空:N + 意思:输入启用还是关闭UPNP +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_DLoader_UPNPEnable(XNETHANDLE xhToken, bool bEnable = false); +/************************************************************************/ +/* BT解析器导出函数 */ +/************************************************************************/ +/******************************************************************** +函数名称:BTorrent_Parse_Init +函数功能:初始化一个解析器 + 参数.一:pxhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:导出一个下载句柄 + 参数.二:lpszAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:种子地址,可以是本地种子文件路径或者磁力链接 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Parse_Init(XNETHANDLE* pxhToken, LPCXSTR lpszAddr); +/******************************************************************** +函数名称:BTorrent_Parse_GetNode +函数功能:获取节点信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pppSt_Parse + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出解析到的节点列表,此参数需要BaseLib_OperatorMemory_Free释放内存 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Parse_GetNode(XNETHANDLE xhToken, BTORRENT_PARSEMAP*** pppSt_Parse, int* pInt_ListCount); +/******************************************************************** +函数名称:BTorrent_Parse_GetTracker +函数功能:获取TRACKER服务器列表 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pppSt_Parse + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出解析到的列表,此参数需要BaseLib_OperatorMemory_Free释放内存 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Parse_GetTracker(XNETHANDLE xhToken, BTORRENT_PARSEMAP*** pppSt_Parse, int* pInt_ListCount); +/******************************************************************** +函数名称:BTorrent_Parse_GetSeeds +函数功能:获取种子列表 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pppSt_Parse + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出解析到的列表,此参数需要BaseLib_OperatorMemory_Free释放内存 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Parse_GetSeeds(XNETHANDLE xhToken, BTORRENT_PARSEMAP*** pppSt_Parse, int* pInt_ListCount); +/******************************************************************** +函数名称:BTorrent_Parse_GetPiece +函数功能:获取块信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pInt_PieceLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出块大小 + 参数.三:pInt_PieceCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出块个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Parse_GetPiece(XNETHANDLE xhToken, int* pInt_PieceLen, int* pInt_PieceCount); +/******************************************************************** +函数名称:BTorrent_Parse_GetInfo +函数功能:获取块信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:ptszHash + In/Out:Out + 类型:字符指针 + 可空:Y + 意思:输出HASH值 + 参数.三:ptszCreator + In/Out:Out + 类型:字符指针 + 可空:Y + 意思:输出创建者 + 参数.四:ptszComment + In/Out:Out + 类型:字符指针 + 可空:Y + 意思:输出种子的注释信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Parse_GetInfo(XNETHANDLE xhToken, XCHAR* ptszHash = NULL, XCHAR* ptszCreator = NULL, XCHAR* ptszComment = NULL); +/******************************************************************** +函数名称:BTorrent_Parse_GetMagnet +函数功能:获取种子文件的磁力链接 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:ptszMagnet + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出种子文件的磁力链接 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Parse_GetMagnet(XNETHANDLE xhToken, XCHAR* ptszMagnet); +/******************************************************************** +函数名称:BTorrent_Parse_GetFile +函数功能:获取文件信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:ptszFilePath + In/Out:Out + 类型:字符指针 + 可空:N + 意思:获得保存文件路径 + 参数.三:pppSt_FileList + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出文件列表 + 参数.四:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:获取列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Parse_GetFile(XNETHANDLE xhToken, XCHAR* pszFilePath, BTORRENT_FILEINFO*** pppSt_FileList, int* pInt_ListCount); +/******************************************************************** +函数名称:BTorrent_Parse_Destory +函数功能:销毁种子解析器 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Parse_Destory(XNETHANDLE xhToken); +/************************************************************************/ +/* BT种子制作导出函数 */ +/************************************************************************/ +/******************************************************************** +函数名称:BTorrent_Creator_Init +函数功能:初始化一个制作工具 + 参数.一:pxhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:导出一个句柄 + 参数.二:lpszBTPath + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:要制作的文件地址路径 + 参数.三:nPieceSize + In/Out:In + 类型:整数型 + 可空:N + 意思:块大小,默认16K +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Creator_Init(XNETHANDLE* pxhToken, LPCXSTR lpszBTPath, int nPieceSize = 0); +/******************************************************************** +函数名称:BTorrent_Creator_AddNode +函数功能:添加种子DHT节点地址 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:lpszAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入节点地址 + 参数.三:nIndex + In/Out:In + 类型:整数型 + 可空:N + 意思:当前索引 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Creator_AddNode(XNETHANDLE xhToken, LPCXSTR lpszAddr, int nIndex); +/******************************************************************** +函数名称:BTorrent_Creator_AddTracker +函数功能:设置TRACKER服务器地址 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:lpszAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入地址 + 参数.三:nIndex + In/Out:In + 类型:整数型 + 可空:Y + 意思:输入服务器索引 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Creator_AddTracker(XNETHANDLE xhToken, LPCXSTR lpszAddr, int nIndex = 0); +/******************************************************************** +函数名称:BTorrent_Creator_AddSeeds +函数功能:添加URL种子到制作器 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:lpszAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入地址 + 参数.三:bSingle + In/Out:In + 类型:逻辑型 + 可空:N + 意思:多种子文件还是单种子文件 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Creator_AddSeeds(XNETHANDLE xhToken, LPCXSTR lpszAddr, bool bSingle = false); +/******************************************************************** +函数名称:BTorrent_Creator_SetInfo +函数功能:设置种子信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:lpszCreator + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入制作器名称 + 参数.三:lpszComment + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输入附加信息 + 参数.四:lpszCertBuffer + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输入PEM证书缓冲区 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Creator_SetInfo(XNETHANDLE xhToken, LPCXSTR lpszCreator, LPCXSTR lpszComment = NULL, LPCXSTR lpszCertBuffer = NULL); +/******************************************************************** +函数名称:BTorrent_Creator_GetTorrent +函数功能:获取中心信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:lpszBTFile + In/Out:In + 类型:常量字符指针 + 可空:Y + 意思:输出种子文件地址 + 参数.三:ptszMsgBuffer + In/Out:Out + 类型:字符指针 + 可空:Y + 意思:输出种子信息到内存 + 参数.四:pInt_MsgLen + In/Out:Out + 类型:整数型指针 + 可空:Y + 意思:输出内存大小 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Creator_GetTorrent(XNETHANDLE xhToken, LPCXSTR lpszBTFile = NULL, XCHAR * ptszMsgBuffer = NULL, int* pInt_MsgLen = NULL); +/******************************************************************** +函数名称:BTorrent_Creator_Destory +函数功能:销毁 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool BTorrent_Creator_Destory(XNETHANDLE xhToken); \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/BTorrent_Error.h b/XEngine_Source/StorageModule_BTorrent/BTorrent_Error.h new file mode 100644 index 0000000..73bcc22 --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/BTorrent_Error.h @@ -0,0 +1,53 @@ +#pragma once +/******************************************************************** +// Created: 2023/02/02 16:32:18 +// File Name: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_Error.h +// File Path: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent +// File Base: BTorrent_Error +// File Ext: h +// Project: XEngine +// Author: qyt +// Purpose: BT下载错误导出 +// History: +*********************************************************************/ +////////////////////////////////////////////////////////////////////////// +// BT下载器错误 +////////////////////////////////////////////////////////////////////////// +#define ERROR_STORAGE_MODULE_BTORRENT_DLOAD_CREATE_PARAMENT 0x0060001 //创建下载参数错误 +#define ERROR_STORAGE_MODULE_BTORRENT_DLOAD_CREATE_MALLOC 0x0060002 //创建内存失败 +#define ERROR_STORAGE_MODULE_BTORRENT_DLOAD_UPEVENT_NOTFOUND 0x0060010 //没有找到 +#define ERROR_STORAGE_MODULE_BTORRENT_DLOAD_QUERY_PARAMENT 0x0060020 //参数错误 +#define ERROR_STORAGE_MODULE_BTORRENT_DLOAD_QUERY_NOTFOUND 0x0060021 //没有找到句柄 +#define ERROR_STORAGE_MODULE_BTORRENT_DLOAD_QUERY_NONE 0x0060022 //没有事件 +#define ERROR_STORAGE_MODULE_BTORRENT_DLOAD_GETSTATUS_PARAMENT 0x0060030 //参数错误 +#define ERROR_STORAGE_MODULE_BTORRENT_DLOAD_GETSTATUS_NOTFOUND 0x0060031 //没有找到 +////////////////////////////////////////////////////////////////////////// +// BT解析器错误 +////////////////////////////////////////////////////////////////////////// +#define ERROR_STORAGE_MODULE_BTORRENT_PARSE_INIT_PARAMENT 0x0061001 //参数错误 +#define ERROR_STORAGE_MODULE_BTORRENT_PARSE_INIT_MALLOC 0x0061002 //申请内存失败 +#define ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETNODE_PARAMENT 0x0061010 //参数错误 +#define ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETNODE_NOTFOUND 0x0061011 //没有找到 +#define ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETTRACKER_PARAMENT 0x0061020 +#define ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETTRACKER_NOTFOUND 0x0061021 +#define ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETSEED_PARAMENT 0x0061030 +#define ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETSEED_NOTFOUND 0x0061031 +#define ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETFILE_PARAMENT 0x0061040 +#define ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETFILE_NOTFOUND 0x0061041 +////////////////////////////////////////////////////////////////////////// +// BT解析器错误 +////////////////////////////////////////////////////////////////////////// +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_INIT_PARAMENT 0x0062001 //参数错误,初始化失败 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_INIT_MALLOC 0x0062002 //申请内存失败 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_NODE_PARAMENT 0x0062010 //参数错误 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_NODE_NOTFOUND 0x0062011 //没有找到指定句柄 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_TRACKER_PARAMENT 0x0062020 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_TRACKER_NOTFOUND 0x0062021 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_SEEDS_PARAMENT 0x0062030 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_SEEDS_NOTFOUND 0x0062031 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_INFO_PARAMENT 0x0062040 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_INFO_NOTFOUND 0x0062041 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_FILE_PARAMENT 0x0062050 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_FILE_NOTFOUND 0x0062051 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_FILE_FAILED 0x0062052 +#define ERROR_STORAGE_MODULE_BTORRENT_CREATOR_FILE_PARSE 0x0062003 //解析文件失败,无法继续 \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/BTorrent_Parse/BTorrent_Parse.cpp b/XEngine_Source/StorageModule_BTorrent/BTorrent_Parse/BTorrent_Parse.cpp new file mode 100644 index 0000000..bda5cc9 --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/BTorrent_Parse/BTorrent_Parse.cpp @@ -0,0 +1,542 @@ +#include "pch.h" +#include "BTorrent_Parse.h" +/******************************************************************** +// Created: 2023/02/02 16:26:41 +// File Name: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_Parse\BTorrent_Parse.cpp +// File Path: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_Parse +// File Base: BTorrent_Parse +// File Ext: cpp +// Project: XEngine +// Author: qyt +// Purpose: 种子解析工具 +// History: +*********************************************************************/ +CBTorrent_Parse::CBTorrent_Parse() +{ +} +CBTorrent_Parse::~CBTorrent_Parse() +{ +} +////////////////////////////////////////////////////////////////////////// +// 公有函数 +////////////////////////////////////////////////////////////////////////// +/******************************************************************** +函数名称:BTorrent_Parse_Init +函数功能:初始化一个解析器 + 参数.一:pxhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:导出一个下载句柄 + 参数.二:lpszAddr + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:种子地址,可以是本地种子文件路径或者磁力链接 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Parse::BTorrent_Parse_Init(XNETHANDLE* pxhToken, LPCXSTR lpszAddr) +{ + BTDload_IsErrorOccur = false; + + if ((NULL == pxhToken) || (NULL == lpszAddr)) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_INIT_PARAMENT; + return false; + } +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + //申请空间 + BTORRENT_PARSEINFO* pSt_BTParse = new BTORRENT_PARSEINFO; + if (NULL == pSt_BTParse) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_INIT_MALLOC; + return false; + } + memset(pSt_BTParse,'\0',sizeof(BTORRENT_PARSEINFO)); + + LPCXSTR lpszFindStr = _X("magnet:?xt=urn:"); + if (NULL == _tcsxstr(lpszAddr, lpszFindStr)) + { + std::fstream m_FStream; + m_FStream.exceptions(std::ifstream::failbit); + m_FStream.open(lpszAddr, std::ios_base::in | std::ios_base::binary); + if (!m_FStream) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_INIT_MALLOC; + delete pSt_BTParse; + pSt_BTParse = NULL; + return false; + } + m_FStream.seekg(0, std::ios_base::end); + size_t nSize = size_t(m_FStream.tellg()); + m_FStream.seekg(0, std::ios_base::beg); + std::vector stl_ListBuffer(nSize); + m_FStream.read(stl_ListBuffer.data(), nSize); + + int nPos = -1; + lt::error_code m_BTError; + lt::load_torrent_limits st_BTLimits; + pSt_BTParse->m_BTBNode = lt::bdecode(stl_ListBuffer, m_BTError, &nPos, st_BTLimits.max_decode_depth, st_BTLimits.max_decode_tokens); + pSt_BTParse->m_BTInfo = std::make_shared(std::move(pSt_BTParse->m_BTBNode), st_BTLimits); + } + else + { + //如果是磁力 + } + + BaseLib_OperatorHandle_Create(pxhToken); + st_Locker.lock(); + stl_MapBTParse.insert(make_pair(*pxhToken, pSt_BTParse)); + st_Locker.unlock(); +#endif + return true; +} +/******************************************************************** +函数名称:BTorrent_Parse_GetNode +函数功能:获取节点信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pppSt_Parse + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出解析到的节点列表,此参数需要BaseLib_OperatorMemory_Free释放内存 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Parse::BTorrent_Parse_GetNode(XNETHANDLE xhToken, BTORRENT_PARSEMAP*** pppSt_Parse, int* pInt_ListCount) +{ + BTDload_IsErrorOccur = false; + + if ((NULL == pppSt_Parse) || (NULL == pInt_ListCount)) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETNODE_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapBTParse.find(xhToken); + if (stl_MapIterator == stl_MapBTParse.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETNODE_NOTFOUND; + st_Locker.unlock_shared(); + return false; + } +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + *pInt_ListCount = stl_MapIterator->second->m_BTInfo->nodes().size(); + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_Parse, stl_MapIterator->second->m_BTInfo->nodes().size(), sizeof(BTORRENT_PARSEMAP)); + std::vector>::const_iterator stl_ListIterator = stl_MapIterator->second->m_BTInfo->nodes().begin(); + for (int i = 0; stl_ListIterator != stl_MapIterator->second->m_BTInfo->nodes().end(); stl_ListIterator++, i++) + { + (*pppSt_Parse)[i]->nValue = stl_ListIterator->second; + _tcsxcpy((*pppSt_Parse)[i]->tszValue, stl_ListIterator->first.c_str()); + } +#endif + st_Locker.unlock_shared(); + return true; +} +/******************************************************************** +函数名称:BTorrent_Parse_GetTracker +函数功能:获取TRACKER服务器列表 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pppSt_Parse + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出解析到的列表,此参数需要BaseLib_OperatorMemory_Free释放内存 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Parse::BTorrent_Parse_GetTracker(XNETHANDLE xhToken, BTORRENT_PARSEMAP*** pppSt_Parse, int* pInt_ListCount) +{ + BTDload_IsErrorOccur = false; + + if ((NULL == pppSt_Parse) || (NULL == pInt_ListCount)) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETTRACKER_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapBTParse.find(xhToken); + if (stl_MapIterator == stl_MapBTParse.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETTRACKER_NOTFOUND; + st_Locker.unlock_shared(); + return false; + } +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + int i = 0; + *pInt_ListCount = stl_MapIterator->second->m_BTInfo->trackers().size(); + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_Parse, stl_MapIterator->second->m_BTInfo->trackers().size(), sizeof(BTORRENT_PARSEMAP)); + + for (auto const& stl_ListIterator : stl_MapIterator->second->m_BTInfo->trackers()) + { + (*pppSt_Parse)[i]->nValue = stl_ListIterator.tier; + _tcsxcpy((*pppSt_Parse)[i]->tszValue, stl_ListIterator.url.c_str()); + i++; + } +#endif + st_Locker.unlock_shared(); + return true; +} +/******************************************************************** +函数名称:BTorrent_Parse_GetSeeds +函数功能:获取种子列表 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pppSt_Parse + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出解析到的列表,此参数需要BaseLib_OperatorMemory_Free释放内存 + 参数.三:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Parse::BTorrent_Parse_GetSeeds(XNETHANDLE xhToken, BTORRENT_PARSEMAP*** pppSt_Parse, int* pInt_ListCount) +{ + BTDload_IsErrorOccur = false; + + if ((NULL == pppSt_Parse) || (NULL == pInt_ListCount)) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETSEED_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapBTParse.find(xhToken); + if (stl_MapIterator == stl_MapBTParse.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETSEED_NOTFOUND; + st_Locker.unlock_shared(); + return false; + } +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + int i = 0; + *pInt_ListCount = stl_MapIterator->second->m_BTInfo->web_seeds().size(); + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_Parse, stl_MapIterator->second->m_BTInfo->web_seeds().size(), sizeof(BTORRENT_PARSEMAP)); + + for (auto const& stl_ListIterator : stl_MapIterator->second->m_BTInfo->web_seeds()) + { + (*pppSt_Parse)[i]->nValue = stl_ListIterator.type; + _tcsxcpy((*pppSt_Parse)[i]->tszValue, stl_ListIterator.url.c_str()); + i++; + } +#endif + st_Locker.unlock_shared(); + return true; +} +/******************************************************************** +函数名称:BTorrent_Parse_GetPiece +函数功能:获取块信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:pInt_PieceLen + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出块大小 + 参数.三:pInt_PieceCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出块个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Parse::BTorrent_Parse_GetPiece(XNETHANDLE xhToken, int* pInt_PieceLen, int* pInt_PieceCount) +{ + BTDload_IsErrorOccur = false; + + if ((NULL == pInt_PieceLen) || (NULL == pInt_PieceCount)) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETSEED_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapBTParse.find(xhToken); + if (stl_MapIterator == stl_MapBTParse.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETSEED_PARAMENT; + st_Locker.unlock_shared(); + return false; + } +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + *pInt_PieceLen = stl_MapIterator->second->m_BTInfo->piece_length(); + *pInt_PieceCount = stl_MapIterator->second->m_BTInfo->num_pieces(); +#endif + st_Locker.unlock_shared(); + return true; +} +/******************************************************************** +函数名称:BTorrent_Parse_GetInfo +函数功能:获取块信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:ptszHash + In/Out:Out + 类型:字符指针 + 可空:Y + 意思:输出HASH值 + 参数.三:ptszCreator + In/Out:Out + 类型:字符指针 + 可空:Y + 意思:输出创建者 + 参数.四:ptszComment + In/Out:Out + 类型:字符指针 + 可空:Y + 意思:输出种子的注释信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Parse::BTorrent_Parse_GetInfo(XNETHANDLE xhToken, XCHAR* ptszHash /* = NULL */, XCHAR* ptszCreator /* = NULL */, XCHAR* ptszComment /* = NULL */) +{ + BTDload_IsErrorOccur = false; + +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapBTParse.find(xhToken); + if (stl_MapIterator != stl_MapBTParse.end()) + { + if (NULL != ptszHash) + { + _tcsxcpy(ptszHash, stl_MapIterator->second->m_BTInfo->info_hash().to_string().c_str()); + } + if (NULL != ptszCreator) + { + _tcsxcpy(ptszCreator, stl_MapIterator->second->m_BTInfo->creator().c_str()); + } + if (NULL != ptszComment) + { + _tcsxcpy(ptszComment, stl_MapIterator->second->m_BTInfo->comment().c_str()); + } + } + st_Locker.unlock_shared(); +#endif + return true; +} +/******************************************************************** +函数名称:BTorrent_Parse_GetMagnet +函数功能:获取种子文件的磁力链接 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:ptszMagnet + In/Out:Out + 类型:字符指针 + 可空:N + 意思:输出种子文件的磁力链接 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Parse::BTorrent_Parse_GetMagnet(XNETHANDLE xhToken, XCHAR* ptszMagnet) +{ + BTDload_IsErrorOccur = false; + +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapBTParse.find(xhToken); + if (stl_MapIterator != stl_MapBTParse.end()) + { + _tcsxcpy(ptszMagnet, make_magnet_uri(*stl_MapIterator->second->m_BTInfo).c_str()); + } + st_Locker.unlock_shared(); +#endif + return true; +} +/******************************************************************** +函数名称:BTorrent_Parse_GetFile +函数功能:获取文件信息 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 + 参数.二:ptszFilePath + In/Out:Out + 类型:字符指针 + 可空:N + 意思:获得保存文件路径 + 参数.三:pppSt_FileList + In/Out:Out + 类型:三级指针 + 可空:N + 意思:输出文件列表 + 参数.四:pInt_ListCount + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:获取列表个数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Parse::BTorrent_Parse_GetFile(XNETHANDLE xhToken, XCHAR* ptszFilePath, BTORRENT_FILEINFO*** pppSt_FileList, int* pInt_ListCount) +{ + BTDload_IsErrorOccur = false; + + if ((NULL == ptszFilePath) || (NULL == pppSt_FileList) || (NULL == pInt_ListCount)) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETFILE_PARAMENT; + return false; + } + st_Locker.lock_shared(); + unordered_map::const_iterator stl_MapIterator = stl_MapBTParse.find(xhToken); + if (stl_MapIterator == stl_MapBTParse.end()) + { + BTDload_IsErrorOccur = true; + BTDload_dwErrorCode = ERROR_STORAGE_MODULE_BTORRENT_PARSE_GETFILE_NOTFOUND; + st_Locker.unlock_shared(); + return false; + } +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + int nUTFLen = stl_MapIterator->second->m_BTInfo->name().length(); + BaseLib_OperatorCharset_UTFToAnsi(stl_MapIterator->second->m_BTInfo->name().c_str(), ptszFilePath, &nUTFLen); + + *pInt_ListCount = stl_MapIterator->second->m_BTInfo->num_files(); + BaseLib_OperatorMemory_Malloc((XPPPMEM)pppSt_FileList, stl_MapIterator->second->m_BTInfo->num_files(), sizeof(BTORRENT_FILEINFO)); + + lt::file_storage const& m_FileStorage = stl_MapIterator->second->m_BTInfo->files(); + int i = 0; + for (auto const stl_ListIterator : m_FileStorage.file_range()) + { + auto const nPieceStart = m_FileStorage.map_file(stl_ListIterator, 0, 0).piece; + auto const nPieceEnd = m_FileStorage.map_file(stl_ListIterator, max(int64_t(m_FileStorage.file_size(stl_ListIterator)) - 1, int64_t(0)), 0).piece; + auto const nFileFlags = m_FileStorage.file_flags(stl_ListIterator); + //判断是否有HASH值 + if (!m_FileStorage.hash(stl_ListIterator).is_all_zeros()) + { + _tcsxcpy((*pppSt_FileList)[i]->tszFileHash, m_FileStorage.hash(stl_ListIterator).to_string().c_str()); + } +#ifdef _MSC_BUILD + nUTFLen = m_FileStorage.file_path(stl_ListIterator).length(); + BaseLib_OperatorCharset_UTFToAnsi(m_FileStorage.file_path(stl_ListIterator).c_str(), (*pppSt_FileList)[i]->tszFilePath, &nUTFLen); + nUTFLen = m_FileStorage.file_name(stl_ListIterator).size(); + BaseLib_OperatorCharset_UTFToAnsi(m_FileStorage.file_name(stl_ListIterator).data(), (*pppSt_FileList)[i]->tszFileName, &nUTFLen); +#else + _tcsxcpy((*pppSt_FileList)[i]->tszFilePath, m_FileStorage.file_path(stl_ListIterator).c_str()); + _tcsxcpy((*pppSt_FileList)[i]->tszFileName, m_FileStorage.file_name(stl_ListIterator).data()); +#endif + (*pppSt_FileList)[i]->nFileOffset = m_FileStorage.file_offset(stl_ListIterator); + (*pppSt_FileList)[i]->nFileSize = m_FileStorage.file_size(stl_ListIterator); + (*pppSt_FileList)[i]->nFileTime = m_FileStorage.mtime(stl_ListIterator); + (*pppSt_FileList)[i]->nFileStart = static_cast(nPieceStart); + (*pppSt_FileList)[i]->nFileEnd = static_cast(nPieceEnd); + + if (nFileFlags & lt::file_storage::flag_pad_file) + { + (*pppSt_FileList)[i]->wFileAttr = (*pppSt_FileList)[i]->wFileAttr | (1 << 3); + } + if (nFileFlags & lt::file_storage::flag_executable) + { + (*pppSt_FileList)[i]->wFileAttr = (*pppSt_FileList)[i]->wFileAttr | (1 << 2); + } + if (nFileFlags & lt::file_storage::flag_hidden) + { + (*pppSt_FileList)[i]->wFileAttr = (*pppSt_FileList)[i]->wFileAttr | (1 << 1); + } + if (nFileFlags & lt::file_storage::flag_symlink) + { + (*pppSt_FileList)[i]->wFileAttr = (*pppSt_FileList)[i]->wFileAttr | (1 << 0); + } + if (nFileFlags & lt::file_storage::flag_symlink) + { + _tcsxcpy((*pppSt_FileList)[i]->tszFileLink, m_FileStorage.symlink(stl_ListIterator).c_str()); + } + i++; + } +#endif + st_Locker.unlock_shared(); + return true; +} +/******************************************************************** +函数名称:BTorrent_Parse_Destory +函数功能:销毁种子解析器 + 参数.一:xhToken + In/Out:In + 类型:句柄 + 可空:N + 意思:输入要操作的句柄 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CBTorrent_Parse::BTorrent_Parse_Destory(XNETHANDLE xhToken) +{ + BTDload_IsErrorOccur = false; + + st_Locker.lock(); + unordered_map::iterator stl_MapIterator = stl_MapBTParse.find(xhToken); + if (stl_MapIterator != stl_MapBTParse.end()) + { + delete stl_MapIterator->second; + stl_MapIterator->second = NULL; + stl_MapBTParse.erase(stl_MapIterator); + } + st_Locker.unlock(); + return true; +} +////////////////////////////////////////////////////////////////////////// +// 保护函数 +////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/BTorrent_Parse/BTorrent_Parse.h b/XEngine_Source/StorageModule_BTorrent/BTorrent_Parse/BTorrent_Parse.h new file mode 100644 index 0000000..1542dc8 --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/BTorrent_Parse/BTorrent_Parse.h @@ -0,0 +1,41 @@ +#pragma once +/******************************************************************** +// Created: 2023/02/02 16:25:58 +// File Name: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_Parse\BTorrent_Parse.h +// File Path: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\BTorrent_Parse +// File Base: BTorrent_Parse +// File Ext: h +// Project: XEngine +// Author: qyt +// Purpose: 种子解析工具 +// History: +*********************************************************************/ +typedef struct +{ +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT + lt::bdecode_node m_BTBNode; + shared_ptr m_BTInfo; +#endif +}BTORRENT_PARSEINFO; + +class CBTorrent_Parse +{ +public: + CBTorrent_Parse(); + ~CBTorrent_Parse(); +public: + bool BTorrent_Parse_Init(XNETHANDLE* pxhToken, LPCXSTR lpszAddr); + bool BTorrent_Parse_GetNode(XNETHANDLE xhToken, BTORRENT_PARSEMAP*** pppSt_Parse, int* pInt_ListCount); + bool BTorrent_Parse_GetTracker(XNETHANDLE xhToken, BTORRENT_PARSEMAP*** pppSt_Parse, int* pInt_ListCount); + bool BTorrent_Parse_GetSeeds(XNETHANDLE xhToken, BTORRENT_PARSEMAP*** pppSt_Parse, int* pInt_ListCount); + bool BTorrent_Parse_GetPiece(XNETHANDLE xhToken, int* pInt_PieceLen, int* pInt_PieceCount); + bool BTorrent_Parse_GetInfo(XNETHANDLE xhToken, XCHAR* ptszHash = NULL, XCHAR* ptszCreator = NULL, XCHAR* ptszComment = NULL); + bool BTorrent_Parse_GetMagnet(XNETHANDLE xhToken, XCHAR* ptszMagnet); + bool BTorrent_Parse_GetFile(XNETHANDLE xhToken, XCHAR* ptszFilePath, BTORRENT_FILEINFO*** pppSt_FileList, int* pInt_ListCount); + bool BTorrent_Parse_Destory(XNETHANDLE xhToken); +protected: +private: + shared_mutex st_Locker; +private: + unordered_map stl_MapBTParse; +}; \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/Makefile b/XEngine_Source/StorageModule_BTorrent/Makefile new file mode 100644 index 0000000..cd7f043 --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/Makefile @@ -0,0 +1,78 @@ +CC = g++ -Wall -std=c++17 -fPIC +PLATFORM = linux +PLATVER = +PLATDIR = +FILEEXT = +LIBFLAG = +RELEASE = 0 +UNICODE = 0 +LOADHDR = -I ./ +LIB = -lXEngine_BaseLib +LIBEX = +LOADSO = +OBJECTS = BTorrent_Creator.o BTorrent_DLoader.o BTorrent_Parse.o pch.o + +MACRO_VALUE := $(shell gcc -E -dM ../XStorage_BuildSwitch.h | grep _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT | cut -d ' ' -f 3) + +ifeq ($(MACRO_VALUE),1) + LIB += -ltorrent-rasterbar +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=../XEngine_BaseLib,--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/../XEngine_BaseLib/ +endif + +ifeq ($(RELEASE),1) +FLAGS = -c +DEBUG = +else +FLAGS = -c -lc_p +DEBUG = -g -pg +endif + +ifeq ($(UNICODE),1) +UNICODE = -D _UNICODE +else +UNICODE = +endif + +all:$(OBJECTS) + $(CC) $(DEBUG) $(OBJECTS) -o libStorageModule_BTorrent.$(FILEEXT) $(LIBFLAG) $(LIB) $(LIBEX) $(LOADSO) $(LOADBIN) + +BTorrent_Creator.o:./BTorrent_Creator/BTorrent_Creator.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./BTorrent_Creator/BTorrent_Creator.cpp +BTorrent_DLoader.o:./BTorrent_DLoader/BTorrent_DLoader.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./BTorrent_DLoader/BTorrent_DLoader.cpp +BTorrent_Parse.o:./BTorrent_Parse/BTorrent_Parse.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./BTorrent_Parse/BTorrent_Parse.cpp + +pch.o:./pch.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(PLATVER) $(LOADHDR) ./pch.cpp + +InstallAll:InstallSo +InstallSo:./libStorageModule_BTorrent.$(FILEEXT) + cp ./libStorageModule_BTorrent.$(FILEEXT) ../../XEngine_Release/libStorageModule_BTorrent.$(FILEEXT) + +CleanAll:CleanObj CleanMk +CleanObj: + rm *.o +CleanMk: + rm *.$(FILEEXT) diff --git a/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.def b/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.def new file mode 100644 index 0000000..446ead2 --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.def @@ -0,0 +1,30 @@ +LIBRARY + +EXPORTS + BTorrent_GetLastError + + BTorrent_DLoader_Create + BTorrent_DLoader_Query + BTorrent_DLoader_GetStatus + BTorrent_DLoader_SaveResume + BTorrent_DLoader_Close + BTorrent_DLoader_SetPause + BTorrent_DLoader_UPNPEnable + + BTorrent_Parse_Init + BTorrent_Parse_GetNode + BTorrent_Parse_GetTracker + BTorrent_Parse_GetSeeds + BTorrent_Parse_GetPiece + BTorrent_Parse_GetInfo + BTorrent_Parse_GetMagnet + BTorrent_Parse_GetFile + BTorrent_Parse_Destory + + BTorrent_Creator_Init + BTorrent_Creator_AddNode + BTorrent_Creator_AddTracker + BTorrent_Creator_AddSeeds + BTorrent_Creator_SetInfo + BTorrent_Creator_GetTorrent + BTorrent_Creator_Destory \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj b/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj new file mode 100644 index 0000000..52a1425 --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj @@ -0,0 +1,176 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {ffbc453d-b12c-4c3f-86ea-fc569e0566e7} + StorageModuleBTorrent + 10.0 + + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + $(XEngine_Include);$(IncludePath) + $(XEngine_Lib32);$(LibraryPath) + + + + Level3 + true + WIN32;_DEBUG;STORAGEMODULEBTORRENT_EXPORTS;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Use + pch.h + + + Windows + true + false + StorageModule_BTorrent.def + + + + + Level3 + true + true + true + WIN32;NDEBUG;STORAGEMODULEBTORRENT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + pch.h + + + Windows + true + true + true + false + StorageModule_BTorrent.def + + + + + Level3 + true + _DEBUG;STORAGEMODULEBTORRENT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + pch.h + + + Windows + true + false + StorageModule_BTorrent.def + + + + + Level3 + true + true + true + NDEBUG;STORAGEMODULEBTORRENT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + pch.h + + + Windows + true + true + true + false + StorageModule_BTorrent.def + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj.filters b/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj.filters new file mode 100644 index 0000000..7e4bc42 --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj.filters @@ -0,0 +1,80 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {79772978-bcff-43f0-94d7-b50cf592615b} + + + {4a4a894a-459f-4e57-9c90-f47ea334bd37} + + + {3426ff10-d6f5-43bc-a29c-b13cc5c4123d} + + + {29ee657e-c097-4d3f-8ee9-4ef8f42cd864} + + + {2580a750-e481-481a-8ed0-9e30298d1c9f} + + + {bdb070b4-b17a-4323-8b70-7108dd30b967} + + + + + 头文件 + + + 头文件 + + + 头文件\BTorrent_Creator + + + 头文件\BTorrent_DLoader + + + 头文件\BTorrent_Parse + + + 头文件 + + + 头文件 + + + + + 源文件 + + + 源文件 + + + 源文件\BTorrent_Creator + + + 源文件\BTorrent_DLoader + + + 源文件\BTorrent_Parse + + + + + 源文件 + + + \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj.user b/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/dllmain.cpp b/XEngine_Source/StorageModule_BTorrent/dllmain.cpp new file mode 100644 index 0000000..0745b19 --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/dllmain.cpp @@ -0,0 +1,19 @@ +// dllmain.cpp : 定义 DLL 应用程序的入口点。 +#include "pch.h" + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return true; +} + diff --git a/XEngine_Source/StorageModule_BTorrent/framework.h b/XEngine_Source/StorageModule_BTorrent/framework.h new file mode 100644 index 0000000..80cbbc9 --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/framework.h @@ -0,0 +1,5 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容 +// Windows 头文件 +#include diff --git a/XEngine_Source/StorageModule_BTorrent/pch.cpp b/XEngine_Source/StorageModule_BTorrent/pch.cpp new file mode 100644 index 0000000..c20cc31 --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/pch.cpp @@ -0,0 +1,133 @@ +#include "pch.h" +#include "BTorrent_DLoader/BTorrent_DLoader.h" +#include "BTorrent_Parse/BTorrent_Parse.h" +#include "BTorrent_Creator/BTorrent_Creator.h" +/******************************************************************** +// Created: 2023/02/02 16:28:57 +// File Name: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent\pch.cpp +// File Path: D:\XEngine\XEngine_SourceCode\XEngine_NetHelp\NetHelp_BTorrent +// File Base: pch +// File Ext: cpp +// Project: XEngine +// Author: qyt +// Purpose: 导出实现 +// History: +*********************************************************************/ +bool BTDload_IsErrorOccur = false; +XLONG BTDload_dwErrorCode = 0; +////////////////////////////////////////////////////////////////////////// +CBTorrent_DLoader m_BTDLoader; +CBTorrent_Parse m_BTParse; +CBTorrent_Creator m_BTCreator; +////////////////////////////////////////////////////////////////////////// +// 导出函数实现 +////////////////////////////////////////////////////////////////////////// +extern "C" XLONG BTorrent_GetLastError(int* pInt_SysError) +{ + if (NULL != pInt_SysError) + { + *pInt_SysError = errno; + } + return BTDload_dwErrorCode; +} +/************************************************************************/ +/* BT下载器导出函数 */ +/************************************************************************/ +extern "C" bool BTorrent_DLoader_Create(XNETHANDLE * pxhToken, LPCXSTR lpszAddr, LPCXSTR lpszSavePath, LPCXSTR lpszTempFile) +{ + return m_BTDLoader.BTorrent_DLoader_Create(pxhToken, lpszAddr, lpszSavePath, lpszTempFile); +} +extern "C" bool BTorrent_DLoader_Query(XNETHANDLE xhToken, ENUM_BTORRENT_EVENT_TYPE * **pppenEventList, int* pInt_ListCount) +{ + return m_BTDLoader.BTorrent_DLoader_Query(xhToken, pppenEventList, pInt_ListCount); +} +extern "C" bool BTorrent_DLoader_GetStatus(XNETHANDLE xhToken, BTORRENT_DLOADER * pSt_DLStatus) +{ + return m_BTDLoader.BTorrent_DLoader_GetStatus(xhToken, pSt_DLStatus); +} +extern "C" bool BTorrent_DLoader_SaveResume(XNETHANDLE xhToken) +{ + return m_BTDLoader.BTorrent_DLoader_SaveResume(xhToken); +} +extern "C" bool BTorrent_DLoader_Close(XNETHANDLE xhToken) +{ + return m_BTDLoader.BTorrent_DLoader_Close(xhToken); +} +extern "C" bool BTorrent_DLoader_SetPause(XNETHANDLE xhToken, bool bPause) +{ + return m_BTDLoader.BTorrent_DLoader_SetPause(xhToken, bPause); +} +extern "C" bool BTorrent_DLoader_UPNPEnable(XNETHANDLE xhToken, bool bEnable) +{ + return m_BTDLoader.BTorrent_DLoader_UPNPEnable(xhToken, bEnable); +} +/************************************************************************/ +/* BT解析器导出函数 */ +/************************************************************************/ +extern "C" bool BTorrent_Parse_Init(XNETHANDLE * pxhToken, LPCXSTR lpszAddr) +{ + return m_BTParse.BTorrent_Parse_Init(pxhToken, lpszAddr); +} +extern "C" bool BTorrent_Parse_GetNode(XNETHANDLE xhToken, BTORRENT_PARSEMAP * **pppSt_Parse, int* pInt_ListCount) +{ + return m_BTParse.BTorrent_Parse_GetNode(xhToken, pppSt_Parse, pInt_ListCount); +} +extern "C" bool BTorrent_Parse_GetTracker(XNETHANDLE xhToken, BTORRENT_PARSEMAP * **pppSt_Parse, int* pInt_ListCount) +{ + return m_BTParse.BTorrent_Parse_GetTracker(xhToken, pppSt_Parse, pInt_ListCount); +} +extern "C" bool BTorrent_Parse_GetSeeds(XNETHANDLE xhToken, BTORRENT_PARSEMAP * **pppSt_Parse, int* pInt_ListCount) +{ + return m_BTParse.BTorrent_Parse_GetSeeds(xhToken, pppSt_Parse, pInt_ListCount); +} +extern "C" bool BTorrent_Parse_GetPiece(XNETHANDLE xhToken, int* pInt_PieceLen, int* pInt_PieceCount) +{ + return m_BTParse.BTorrent_Parse_GetPiece(xhToken, pInt_PieceLen, pInt_PieceCount); +} +extern "C" bool BTorrent_Parse_GetInfo(XNETHANDLE xhToken, XCHAR * ptszHash, XCHAR * ptszCreator, XCHAR * ptszComment) +{ + return m_BTParse.BTorrent_Parse_GetInfo(xhToken, ptszHash, ptszCreator, ptszComment); +} +extern "C" bool BTorrent_Parse_GetMagnet(XNETHANDLE xhToken, XCHAR * ptszMagnet) +{ + return m_BTParse.BTorrent_Parse_GetMagnet(xhToken, ptszMagnet); +} +extern "C" bool BTorrent_Parse_GetFile(XNETHANDLE xhToken, XCHAR * pszFilePath, BTORRENT_FILEINFO * **pppSt_FileList, int* pInt_ListCount) +{ + return m_BTParse.BTorrent_Parse_GetFile(xhToken, pszFilePath, pppSt_FileList, pInt_ListCount); +} +extern "C" bool BTorrent_Parse_Destory(XNETHANDLE xhToken) +{ + return m_BTParse.BTorrent_Parse_Destory(xhToken); +} +/************************************************************************/ +/* BT种子制作导出函数 */ +/************************************************************************/ +extern "C" bool BTorrent_Creator_Init(XNETHANDLE * pxhToken, LPCXSTR lpszBTPath, int nPieceSize) +{ + return m_BTCreator.BTorrent_Creator_Init(pxhToken, lpszBTPath, nPieceSize); +} +extern "C" bool BTorrent_Creator_AddNode(XNETHANDLE xhToken, LPCXSTR lpszAddr, int nIndex) +{ + return m_BTCreator.BTorrent_Creator_AddNode(xhToken, lpszAddr, nIndex); +} +extern "C" bool BTorrent_Creator_AddTracker(XNETHANDLE xhToken, LPCXSTR lpszAddr, int nIndex) +{ + return m_BTCreator.BTorrent_Creator_AddTracker(xhToken, lpszAddr, nIndex); +} +extern "C" bool BTorrent_Creator_AddSeeds(XNETHANDLE xhToken, LPCXSTR lpszAddr, bool bSingle) +{ + return m_BTCreator.BTorrent_Creator_AddSeeds(xhToken, lpszAddr, bSingle); +} +extern "C" bool BTorrent_Creator_SetInfo(XNETHANDLE xhToken, LPCXSTR lpszCreator, LPCXSTR lpszComment, LPCXSTR lpszCertBuffer) +{ + return m_BTCreator.BTorrent_Creator_SetInfo(xhToken, lpszCreator, lpszComment, lpszCertBuffer); +} +extern "C" bool BTorrent_Creator_GetTorrent(XNETHANDLE xhToken, LPCXSTR lpszBTFile, XCHAR * ptszMsgBuffer, int* pInt_MsgLen) +{ + return m_BTCreator.BTorrent_Creator_GetTorrent(xhToken, lpszBTFile, ptszMsgBuffer, pInt_MsgLen); +} +extern "C" bool BTorrent_Creator_Destory(XNETHANDLE xhToken) +{ + return m_BTCreator.BTorrent_Creator_Destory(xhToken); +} \ No newline at end of file diff --git a/XEngine_Source/StorageModule_BTorrent/pch.h b/XEngine_Source/StorageModule_BTorrent/pch.h new file mode 100644 index 0000000..c41045f --- /dev/null +++ b/XEngine_Source/StorageModule_BTorrent/pch.h @@ -0,0 +1,60 @@ +// pch.h: 这是预编译标头文件。 +// 下方列出的文件仅编译一次,提高了将来生成的生成性能。 +// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 +// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 +// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 + +#ifndef PCH_H +#define PCH_H + +#ifdef _MSC_BUILD +// 添加要在此处预编译的标头 +#include "framework.h" +#include +#endif +#endif //PCH_H +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if 1 == _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#endif +using namespace std; +#include +#include +#include +#include +#include "BTorrent_Define.h" +#include "BTorrent_Error.h" +////////////////////////////////////////////////////////////////////////// +// 用户不用关心的数据 +////////////////////////////////////////////////////////////////////////// +extern bool BTDload_IsErrorOccur; +extern XLONG BTDload_dwErrorCode; + + +#ifdef _MSC_BUILD +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib.lib") +#endif \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp.sln b/XEngine_Source/XEngine_StorageApp.sln index e860b62..d4db869 100644 --- a/XEngine_Source/XEngine_StorageApp.sln +++ b/XEngine_Source/XEngine_StorageApp.sln @@ -13,6 +13,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StorageModule_APIHelp", "St EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XStorage_Include", "XStorage_Include", "{B8417D60-3B19-45BC-8D8B-173E24E32B35}" ProjectSection(SolutionItems) = preProject + XStorage_BuildSwitch.h = XStorage_BuildSwitch.h XStorage_Protocol.h = XStorage_Protocol.h EndProjectSection EndProject @@ -24,6 +25,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jsoncpp", "XEngine_ThirdPar EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StorageModule_Database", "StorageModule_Database\StorageModule_Database.vcxproj", "{8B90FA35-1D93-4174-BF1C-926D52F0C67F}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StorageModule_BTorrent", "StorageModule_BTorrent\StorageModule_BTorrent.vcxproj", "{FFBC453D-B12C-4C3F-86EA-FC569E0566E7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -88,6 +91,14 @@ Global {8B90FA35-1D93-4174-BF1C-926D52F0C67F}.Release|x64.Build.0 = Release|x64 {8B90FA35-1D93-4174-BF1C-926D52F0C67F}.Release|x86.ActiveCfg = Release|Win32 {8B90FA35-1D93-4174-BF1C-926D52F0C67F}.Release|x86.Build.0 = Release|Win32 + {FFBC453D-B12C-4C3F-86EA-FC569E0566E7}.Debug|x64.ActiveCfg = Debug|x64 + {FFBC453D-B12C-4C3F-86EA-FC569E0566E7}.Debug|x64.Build.0 = Debug|x64 + {FFBC453D-B12C-4C3F-86EA-FC569E0566E7}.Debug|x86.ActiveCfg = Debug|Win32 + {FFBC453D-B12C-4C3F-86EA-FC569E0566E7}.Debug|x86.Build.0 = Debug|Win32 + {FFBC453D-B12C-4C3F-86EA-FC569E0566E7}.Release|x64.ActiveCfg = Release|x64 + {FFBC453D-B12C-4C3F-86EA-FC569E0566E7}.Release|x64.Build.0 = Release|x64 + {FFBC453D-B12C-4C3F-86EA-FC569E0566E7}.Release|x86.ActiveCfg = Release|Win32 + {FFBC453D-B12C-4C3F-86EA-FC569E0566E7}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/XEngine_Source/XStorage_BuildSwitch.h b/XEngine_Source/XStorage_BuildSwitch.h new file mode 100644 index 0000000..fecb0d4 --- /dev/null +++ b/XEngine_Source/XStorage_BuildSwitch.h @@ -0,0 +1,13 @@ +#pragma once +/******************************************************************** +// Created: 2024/03/13 14:31:44 +// File Name: D:\XEngine_Storage\XEngine_Source\XStorage_BuildSwitch.h +// File Path: D:\XEngine_Storage\XEngine_Source +// File Base: XStorage_BuildSwitch +// File Ext: h +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: 存储服务开关编译选项 +// History: +*********************************************************************/ +#define _XENGIEN_STORAGE_BUILDSWITCH_BTORRENT 0 //BT支持 \ No newline at end of file From 3033d1c8dd9c4fe81b0731acdc65523634c23c5b Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 13 Mar 2024 15:22:34 +0800 Subject: [PATCH 02/20] added:bt example --- .../APPClient_BTorrent/APPClient_BTorrent.cpp | 200 ++++++++++++++++++ .../APPClient_BTorrent.vcxproj | 139 ++++++++++++ .../APPClient_BTorrent.vcxproj.filters | 22 ++ .../APPClient_BTorrent.vcxproj.user | 4 + XEngine_APPClient/XEngine_APPClient.sln | 10 + 5 files changed, 375 insertions(+) create mode 100644 XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.cpp create mode 100644 XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj create mode 100644 XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj.filters create mode 100644 XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj.user diff --git a/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.cpp b/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.cpp new file mode 100644 index 0000000..151fdf0 --- /dev/null +++ b/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.cpp @@ -0,0 +1,200 @@ +#ifdef _MSC_BUILD +#include +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include "../../XEngine_Source/StorageModule_BTorrent/BTorrent_Define.h" +#include "../../XEngine_Source/StorageModule_BTorrent/BTorrent_Error.h" + +#ifdef _MSC_BUILD +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib.lib") +#pragma comment(lib,"../../XEngine_Source/Debug/StorageModule_BTorrent.lib") +#endif + +//g++ -std=c++17 -Wall -g NetHelp_APPBTorrent.cpp -o AVCodec_APPPlayer.exe -L ../../XEngine_Source/StorageModule_BTorrent -lXEngine_BaseLib -lStorageModule_BTorrent + + +int BTorrent_Parse(LPCXSTR lpszFile) +{ + XNETHANDLE xhToken; + + if (!BTorrent_Parse_Init(&xhToken, lpszFile)) + { + printf("BTorrent_Parse_Init:%lX\n", BTorrent_GetLastError()); + return -1; + } + int nListCount = 0; + BTORRENT_PARSEMAP** ppSt_ParseNode; + if (!BTorrent_Parse_GetNode(xhToken, &ppSt_ParseNode, &nListCount)) + { + printf("BTorrent_Parse_GetNode:%lX\n", BTorrent_GetLastError()); + return -1; + } + for (int i = 0; i < nListCount; i++) + { + printf("BTorrent_Parse_GetNode:%d = %s\n", ppSt_ParseNode[i]->nValue, ppSt_ParseNode[i]->tszValue); + } + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ParseNode, nListCount); + nListCount = 0; + + if (!BTorrent_Parse_GetTracker(xhToken, &ppSt_ParseNode, &nListCount)) + { + printf("BTorrent_Parse_GetTracker:%lX\n", BTorrent_GetLastError()); + return -1; + } + for (int i = 0; i < nListCount; i++) + { + printf("BTorrent_Parse_GetTracker:%d = %s\n", ppSt_ParseNode[i]->nValue, ppSt_ParseNode[i]->tszValue); + } + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ParseNode, nListCount); + nListCount = 0; + + if (!BTorrent_Parse_GetSeeds(xhToken, &ppSt_ParseNode, &nListCount)) + { + printf("BTorrent_Parse_GetSeeds:%lX\n", BTorrent_GetLastError()); + return -1; + } + for (int i = 0; i < nListCount; i++) + { + printf("BTorrent_Parse_GetSeeds:%d = %s\n", ppSt_ParseNode[i]->nValue, ppSt_ParseNode[i]->tszValue); + } + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ParseNode, nListCount); + nListCount = 0; + + int nPieceLen = 0; + int nPieceCount = 0; + if (!BTorrent_Parse_GetPiece(xhToken, &nPieceLen, &nPieceCount)) + { + printf("BTorrent_Parse_GetPiece:%lX\n", BTorrent_GetLastError()); + return -1; + } + printf("BTorrent_Parse_GetPiece:%d %d\n", nPieceLen, nPieceCount); + + XCHAR tszHash[4196]; + XCHAR tszCreator[4196]; + XCHAR tszComment[4196]; + + memset(tszHash, '\0', sizeof(tszHash)); + memset(tszCreator, '\0', sizeof(tszCreator)); + memset(tszComment, '\0', sizeof(tszComment)); + + if (!BTorrent_Parse_GetInfo(xhToken, tszHash, tszCreator, tszComment)) + { + printf("BTorrent_Parse_GetPiece:%lX\n", BTorrent_GetLastError()); + return -1; + } + printf("BTorrent_Parse_GetInfo:%s\n%s\n%s\n", tszHash, tszCreator, tszComment); + + XCHAR tszFile[MAX_PATH]; + memset(tszFile, '\0', MAX_PATH); + BTORRENT_FILEINFO** ppSt_FileList; + if (!BTorrent_Parse_GetFile(xhToken, tszFile, &ppSt_FileList, &nListCount)) + { + printf("BTorrent_Parse_GetFile:%lX\n", BTorrent_GetLastError()); + return -1; + } + for (int i = 0; i < nListCount; i++) + { + printf("BTorrent_Parse_GetFile:%s %s %s %s %lld %lld %lld %d %d\n", ppSt_FileList[i]->tszFileHash, ppSt_FileList[i]->tszFilePath, ppSt_FileList[i]->tszFileName, ppSt_FileList[i]->tszFileLink, ppSt_FileList[i]->nFileOffset, ppSt_FileList[i]->nFileSize, ppSt_FileList[i]->nFileTime, ppSt_FileList[i]->nFileStart, ppSt_FileList[i]->nFileEnd); + } + BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_FileList, nListCount); + + BTorrent_Parse_Destory(xhToken); + return 0; +} +int BTorrent_Creator(LPCXSTR lpszFile) +{ + XNETHANDLE xhToken; +#ifdef _MSC_BUILD + LPCXSTR lpszFileDir = _X("D:\\321"); +#else + LPCXSTR lpszFileDir = _X("./321"); +#endif + + if (!BTorrent_Creator_Init(&xhToken, lpszFileDir)) + { + printf("BTorrent_Creator_Init:%lX\n", BTorrent_GetLastError()); + return -1; + } + + BTorrent_Creator_AddTracker(xhToken, "http://wwww.xyry.org/anno"); + BTorrent_Creator_SetInfo(xhToken, "xengine", "xengine btorrent V7.11"); + + if (!BTorrent_Creator_GetTorrent(xhToken, lpszFile)) + { + printf("BTorrent_Creator_GetTorrent:%lX\n", BTorrent_GetLastError()); + return -1; + } + BTorrent_Creator_Destory(xhToken); + return 0; +} +int BTorrent_Download() +{ + XNETHANDLE xhToken; +#ifdef _MSC_BUILD + LPCXSTR lpszBTFile = _X("D:\\123.torrent"); + LPCXSTR lpszFileDir = _X("D:\\321"); +#else + LPCXSTR lpszBTFile = _X("./123.torrent"); + LPCXSTR lpszFileDir = _X("./321"); +#endif + + if (!BTorrent_DLoader_Create(&xhToken, lpszBTFile, lpszFileDir)) + { + printf("BTorrent_Creator_Init:%lX\n", BTorrent_GetLastError()); + return -1; + } + bool bRun = TRUE; + + while (1) + { + int nListCount = 0; + ENUM_BTORRENT_EVENT_TYPE** ppenEventList; + BTorrent_DLoader_Query(xhToken, &ppenEventList, &nListCount); + for (int i = 0; i < nListCount; i++) + { + if (ENUM_BTORRENT_EVENT_TYPE_STATUS == *(ppenEventList[i])) + { + BTORRENT_DLOADER st_DLStatus; + BTorrent_DLoader_GetStatus(xhToken, &st_DLStatus); + + printf("%s-%d:%lld,%lld\n", st_DLStatus.tszFileName, st_DLStatus.nDLStatus, st_DLStatus.nDLoadTotal, st_DLStatus.nDLCount); + } + else if (ENUM_BTORRENT_EVENT_TYPE_COMPLETE == *(ppenEventList[i])) + { + bRun = FALSE; + break; + } + printf("%d\n", *(ppenEventList[i])); + } + if (!bRun) + { + break; + } + std::this_thread::sleep_for(std::chrono::seconds(1)); + BaseLib_OperatorMemory_Free((XPPPMEM)&ppenEventList, nListCount); + } + + BTorrent_DLoader_Close(xhToken); + return 0; +} +int main() +{ +#ifdef _MSC_BUILD + LPCXSTR lpszFile = _X("D:\\321.torrent"); +#else + LPCXSTR lpszFile = _X("./321.torrent"); +#endif + + BTorrent_Download(); + BTorrent_Creator(lpszFile); + BTorrent_Parse(lpszFile); + + return 0; +} \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj b/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj new file mode 100644 index 0000000..26703be --- /dev/null +++ b/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj @@ -0,0 +1,139 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {cd6abe42-badf-4cc9-bfcf-225f922040ca} + APPClientBTorrent + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + $(XEngine_Include);$(IncludePath) + $(XEngine_Lib32);$(LibraryPath) + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj.filters b/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj.filters new file mode 100644 index 0000000..e64d755 --- /dev/null +++ b/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + \ No newline at end of file diff --git a/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj.user b/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/XEngine_APPClient/APPClient_BTorrent/APPClient_BTorrent.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/XEngine_APPClient/XEngine_APPClient.sln b/XEngine_APPClient/XEngine_APPClient.sln index ce78eac..792d142 100644 --- a/XEngine_APPClient/XEngine_APPClient.sln +++ b/XEngine_APPClient/XEngine_APPClient.sln @@ -15,6 +15,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_UPMaker", "APPCli EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_UPFile", "APPClient_UPDate\APPClient_UPFile\APPClient_UPFile.vcxproj", "{D2B84345-CE80-4E29-8A3E-6ACE68EB7ADF}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "APPClient_BTorrent", "APPClient_BTorrent\APPClient_BTorrent.vcxproj", "{CD6ABE42-BADF-4CC9-BFCF-225F922040CA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -63,6 +65,14 @@ Global {D2B84345-CE80-4E29-8A3E-6ACE68EB7ADF}.Release|x64.Build.0 = Release|x64 {D2B84345-CE80-4E29-8A3E-6ACE68EB7ADF}.Release|x86.ActiveCfg = Release|Win32 {D2B84345-CE80-4E29-8A3E-6ACE68EB7ADF}.Release|x86.Build.0 = Release|Win32 + {CD6ABE42-BADF-4CC9-BFCF-225F922040CA}.Debug|x64.ActiveCfg = Debug|x64 + {CD6ABE42-BADF-4CC9-BFCF-225F922040CA}.Debug|x64.Build.0 = Debug|x64 + {CD6ABE42-BADF-4CC9-BFCF-225F922040CA}.Debug|x86.ActiveCfg = Debug|Win32 + {CD6ABE42-BADF-4CC9-BFCF-225F922040CA}.Debug|x86.Build.0 = Debug|Win32 + {CD6ABE42-BADF-4CC9-BFCF-225F922040CA}.Release|x64.ActiveCfg = Release|x64 + {CD6ABE42-BADF-4CC9-BFCF-225F922040CA}.Release|x64.Build.0 = Release|x64 + {CD6ABE42-BADF-4CC9-BFCF-225F922040CA}.Release|x86.ActiveCfg = Release|Win32 + {CD6ABE42-BADF-4CC9-BFCF-225F922040CA}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From bd02f89d1dddf361534956daf8ec03ad6313e2f5 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 13 Mar 2024 15:22:54 +0800 Subject: [PATCH 03/20] update:readme about bt note --- README.en.md | 11 +++++++---- README.md | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/README.en.md b/README.en.md index cc9cfb2..e1605cf 100644 --- a/README.en.md +++ b/README.en.md @@ -25,7 +25,7 @@ feature list: 8. supprot speeds contral 9. supprot task start and end proxy forwarding 10. support p2p -11. bt(planning) +11. bt protocol 12. data distributed 13. support second pass and Resumable 14. support upload and download Redirect @@ -49,15 +49,18 @@ Macos Exection:./XEngine_LINEnv.sh -i 3 #### Windows use vs open and compile,suport windows 7sp1 and above -Just Run it,use XEngine_AuthorizeApp +Just Run it,use XEngine_AuthorizeApp +if you need bt protocol support,you must install bt library by vcpkg:./vcpkg.exe install libtorrent #### Linux use makefile compile,UBUNTU22.04 x64 or RockyLinux9 x64 -Run it on the terminal +Run it on the terminal +if you need bt protocol support,you must install bt library:sudo apt install libtorrent-rasterbar-dev -y #### Macos use makefile compile,mac 13 and above -Run it on the terminal +Run it on the terminal +if you need bt protocol support,you must install bt library:brew install libtorrent-rasterbar ##### complie execute command in XEngine_Source path diff --git a/README.md b/README.md index a9993a0..52fdb73 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ c c++ file storage service 8. 支持传输速率控制 9. 支持任务开始结束代理转发 10. 支持P2P -11. BT(规划中) +11. BT协议 12. 数据分发 13. 支持秒传和断点续传 14. 支持上传和下载重定向 @@ -48,15 +48,18 @@ macos执行:./XEngine_LINEnv.sh -i 3 #### Windows 使用VS打开并且编译,支持WINDOWS 7SP1以上系统 -直接运行即可,使用XEngine_AuthorizeApp +直接运行即可,使用XEngine_AuthorizeApp +如果需要bt协议支持,需要通过vcpkg安装bt支持库:./vcpkg.exe install libtorrent #### Linux Linux使用Makefile编译,UBUNTU22.04 x64或者RockyLinux x64 -在控制台运行 +在控制台运行 +如果需要bt协议支持,需要安装bt库,比如,在ubuntu下面安装:sudo apt install libtorrent-rasterbar-dev -y #### Macos 使用makefile编译,控制台运行,需要mac 13以及以上版本 -在控制台运行 +在控制台运行 +如果需要bt协议支持,需要安装bt库,通过brew安装:brew install libtorrent-rasterbar ##### 编译命令 在XEngine_Source目录下执行命令 From 0cfeefa2b71f9a493f405bd706f73fbf4692381e Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 15 Apr 2024 17:04:03 +0800 Subject: [PATCH 04/20] added:info report module --- .../StorageModule_Config/Config_Define.h | 5 + .../StorageModule_Config/Config_Error.h | 1 + .../Config_Json/Config_Json.cpp | 10 + .../InfoReport_APIMachine.cpp | 126 +++++++++++++ .../InfoReport_APIMachine.h | 23 +++ .../InfoReport_Define.h | 33 ++++ .../InfoReport_Error.h | 13 ++ .../StorageModule_InfoReport.def | 6 + .../StorageModule_InfoReport.vcxproj | 172 ++++++++++++++++++ .../StorageModule_InfoReport.vcxproj.filters | 56 ++++++ .../StorageModule_InfoReport.vcxproj.user | 4 + .../StorageModule_InfoReport/dllmain.cpp | 19 ++ .../StorageModule_InfoReport/framework.h | 5 + .../StorageModule_InfoReport/pch.cpp | 35 ++++ XEngine_Source/StorageModule_InfoReport/pch.h | 69 +++++++ XEngine_Source/XEngine_StorageApp.sln | 10 + .../XEngine_StorageApp/StorageApp_Hdr.h | 6 + .../XEngine_StorageApp/XEngine_StorageApp.cpp | 16 ++ 18 files changed, 609 insertions(+) create mode 100644 XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp create mode 100644 XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.h create mode 100644 XEngine_Source/StorageModule_InfoReport/InfoReport_Define.h create mode 100644 XEngine_Source/StorageModule_InfoReport/InfoReport_Error.h create mode 100644 XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.def create mode 100644 XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj create mode 100644 XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj.filters create mode 100644 XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj.user create mode 100644 XEngine_Source/StorageModule_InfoReport/dllmain.cpp create mode 100644 XEngine_Source/StorageModule_InfoReport/framework.h create mode 100644 XEngine_Source/StorageModule_InfoReport/pch.cpp create mode 100644 XEngine_Source/StorageModule_InfoReport/pch.h diff --git a/XEngine_Source/StorageModule_Config/Config_Define.h b/XEngine_Source/StorageModule_Config/Config_Define.h index 97fbf5a..afab724 100644 --- a/XEngine_Source/StorageModule_Config/Config_Define.h +++ b/XEngine_Source/StorageModule_Config/Config_Define.h @@ -103,6 +103,11 @@ typedef struct tag_XEngine_ServerConfig bool bUPEnable; bool bCHEnable; }st_XCert; + struct + { + XCHAR tszAPIUrl[MAX_PATH]; + bool bEnable; + }st_XReport; struct { list *pStl_ListStorage; diff --git a/XEngine_Source/StorageModule_Config/Config_Error.h b/XEngine_Source/StorageModule_Config/Config_Error.h index 0c5ec43..7c0b4f1 100644 --- a/XEngine_Source/StorageModule_Config/Config_Error.h +++ b/XEngine_Source/StorageModule_Config/Config_Error.h @@ -25,6 +25,7 @@ #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_CREPORT 0x002000D #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 3ea9ffa..caf9cf2 100644 --- a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp +++ b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp @@ -222,6 +222,16 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertKey, st_JsonP2xp["tszCertKey"].asCString()); } + if (st_JsonRoot["XReport"].empty() || (2 != st_JsonRoot["XReport"].size())) + { + Config_IsErrorOccur = true; + Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_CREPORT; + return false; + } + Json::Value st_JsonReport = st_JsonRoot["XReport"]; + pSt_ServerConfig->st_XReport.bEnable = st_JsonReport["bEnable"].asBool(); + _tcsxcpy(pSt_ServerConfig->st_XReport.tszAPIUrl, st_JsonReport["tszAPIUrl"].asCString()); + if (st_JsonRoot["XVer"].empty()) { Config_IsErrorOccur = true; diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp new file mode 100644 index 0000000..d95e94a --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp @@ -0,0 +1,126 @@ +#include "pch.h" +#include "InfoReport_APIMachine.h" +/******************************************************************** +// Created: 2024/04/15 14:54:19 +// File Name: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport\InfoReport_APIMachine\InfoReport_APIMachine.cpp +// File Path: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport\InfoReport_APIMachine +// File Base: InfoReport_APIMachine +// File Ext: cpp +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: 信息收集报告类 +// History: +*********************************************************************/ +CInfoReport_APIMachine::CInfoReport_APIMachine() +{ + +} +CInfoReport_APIMachine::~CInfoReport_APIMachine() +{ + +} +////////////////////////////////////////////////////////////////////////// +// 公有函数 +////////////////////////////////////////////////////////////////////////// +/******************************************************************** +函数名称:InfoReport_APIMachine_Send +函数功能:发送一条信息报告给API服务器 + 参数.一:lpszAPIUrl + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入请求地址 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:lpszAPIUrl = _X("http://127.0.0.1:5501/api?function=machine¶ms1=0"); +*********************************************************************/ +bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) +{ + InfoReport_IsErrorOccur = false; + + if (NULL == lpszAPIUrl) + { + InfoReport_IsErrorOccur = true; + InfoReport_dwErrorCode = ERROR_XENGINE_STORAGE_INFOREPORT_PARAMENT; + return false; + } + int nLen = 0; + int nCode = 0; + + XCHAR tszOSName[128] = {}; + XCHAR tszOSVersion[128] = {}; + XCHAR tszOSBuild[128] = {}; + XCHAR tszComputerName[128] = {}; + XLONG nOSArch = 0; + SYSTEMAPI_SERIAL_INFOMATION st_SDKSerial = {}; + SystemApi_System_GetSystemVer(tszOSName, tszOSVersion, tszOSBuild, &nOSArch); + SystemApi_System_GetSysName(NULL, tszComputerName); + SystemApi_HardWare_GetSerial(&st_SDKSerial); + + Json::Value st_JsonRoot; + Json::StreamWriterBuilder st_JsonBuilder; + + XCHAR tszMachineText[1024] = {}; + InfoReport_APIMachine_GetText(tszMachineText); + + st_JsonRoot["tszMachineName"] = tszOSName; + st_JsonRoot["tszMachineCode"] = st_SDKSerial.tszSystemSerial; + st_JsonRoot["tszMachineSystem"] = tszComputerName; + st_JsonRoot["tszMachineText"] = tszMachineText; + + st_JsonBuilder["emitUTF8"] = true; + + XCHAR* ptszMsgBuffer = NULL; + if (!APIClient_Http_Request(_X("POST"), lpszAPIUrl, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), &nCode, &ptszMsgBuffer, &nLen)) + { + InfoReport_IsErrorOccur = true; + InfoReport_dwErrorCode = APIClient_GetLastError(); + return false; + } + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + + return true; +} +bool CInfoReport_APIMachine::InfoReport_APIMachine_GetText(XCHAR* ptszMSGBuffer) +{ + InfoReport_IsErrorOccur = false; + + XCHAR tszOSName[128] = {}; + XCHAR tszOSVersion[128] = {}; + XCHAR tszOSBuild[128] = {}; + XLONG nOSArch = 0; + int nProcessCount = 0; + SYSTEMAPI_CPU_INFOMATION st_CPUInfo = {}; + SYSTEMAPI_MEMORY_INFOMATION st_MemoryInfo = {}; + + Json::Value st_JsonRoot; + Json::Value st_JsonCPUObject; + Json::Value st_JsonOSObject; + Json::Value st_JsonMEMObject; + Json::StreamWriterBuilder st_JsonBuilder; + + SystemApi_System_GetSystemVer(tszOSName, tszOSVersion, tszOSBuild, &nOSArch); + SystemApi_HardWare_GetCpuInfomation(&st_CPUInfo); + SystemApi_System_GetMemoryUsage(&st_MemoryInfo, XENGINE_SYSTEMSDK_API_SYSTEM_SIZE_MB); + SystemApi_System_GetProcessCount(&nProcessCount); + + st_JsonCPUObject["nCPUNumber"] = st_CPUInfo.nCpuNumber; + st_JsonCPUObject["nCPUSpeed"] = st_CPUInfo.nCpuSpeed; + + st_JsonOSObject["OSArch"] = (Json::Value::Int)nOSArch; + st_JsonOSObject["OSVersion"] = tszOSVersion; + st_JsonOSObject["tszOSBuild"] = tszOSBuild; + + st_JsonMEMObject["nTotal"] = st_MemoryInfo.dwMemory_Total; + st_JsonMEMObject["nFree"] = st_MemoryInfo.dwMemory_Free; + + st_JsonRoot["bAdmin"] = SystemApi_Process_IsAdmin(); + st_JsonRoot["nProcessCount"] = nProcessCount; + st_JsonRoot["st_CPUObject"] = st_JsonCPUObject; + st_JsonRoot["st_OSObject"] = st_JsonOSObject; + st_JsonRoot["st_MEMObject"] = st_JsonMEMObject; + + _tcsxcpy(ptszMSGBuffer, st_JsonRoot.toStyledString().c_str()); + return true; +} \ No newline at end of file diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.h b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.h new file mode 100644 index 0000000..dbf7bfe --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.h @@ -0,0 +1,23 @@ +#pragma once +/******************************************************************** +// Created: 2024/04/15 14:54:08 +// File Name: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport\InfoReport_APIMachine\InfoReport_APIMachine.h +// File Path: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport\InfoReport_APIMachine +// File Base: InfoReport_APIMachine +// File Ext: h +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: 信息收集报告类 +// History: +*********************************************************************/ + +class CInfoReport_APIMachine +{ +public: + CInfoReport_APIMachine(); + ~CInfoReport_APIMachine(); +public: + bool InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl); +protected: + bool InfoReport_APIMachine_GetText(XCHAR *ptszMSGBuffer); +}; diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_Define.h b/XEngine_Source/StorageModule_InfoReport/InfoReport_Define.h new file mode 100644 index 0000000..2bce384 --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_Define.h @@ -0,0 +1,33 @@ +#pragma once +/******************************************************************** +// Created: 2024/04/15 15:39:50 +// File Name: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport\InfoReport_Define.h +// File Path: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport +// File Base: InfoReport_Define +// File Ext: h +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: 信息报告导出定义 +// History: +*********************************************************************/ +////////////////////////////////////////////////////////////////////////// +// 导出函数 +////////////////////////////////////////////////////////////////////////// +extern "C" XLONG InfoReport_GetLastError(int *pInt_ErrorCode = NULL); +/************************************************************************/ +/* APIMachine报告 */ +/************************************************************************/ +/******************************************************************** +函数名称:InfoReport_APIMachine_Send +函数功能:发送一条信息报告给API服务器 + 参数.一:lpszAPIUrl + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入请求地址 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注:lpszAPIUrl = _X("http://127.0.0.1:5501/api?function=machine¶ms1=0"); +*********************************************************************/ +extern "C" bool InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl); \ No newline at end of file diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_Error.h b/XEngine_Source/StorageModule_InfoReport/InfoReport_Error.h new file mode 100644 index 0000000..b6e9d42 --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_Error.h @@ -0,0 +1,13 @@ +#pragma once +/******************************************************************** +// Created: 2024/04/15 15:41:43 +// File Name: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport\InfoReport_Error.h +// File Path: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport +// File Base: InfoReport_Error +// File Ext: h +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: 信息报告错误码 +// History: +*********************************************************************/ +#define ERROR_XENGINE_STORAGE_INFOREPORT_PARAMENT 0x01A0001 \ No newline at end of file diff --git a/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.def b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.def new file mode 100644 index 0000000..48e608d --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.def @@ -0,0 +1,6 @@ +LIBRARY + +EXPORTS + InfoReport_GetLastError + + InfoReport_APIMachine_Send \ No newline at end of file diff --git a/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj new file mode 100644 index 0000000..4ba0f54 --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj @@ -0,0 +1,172 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {6754838e-7dc4-4c57-8c80-522da04e9284} + StorageModuleInfoReport + 10.0 + + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib32);$(LibraryPath) + + + + Level3 + true + WIN32;_DEBUG;STORAGEMODULEINFOREPORT_EXPORTS;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Use + pch.h + + + Windows + true + false + StorageModule_InfoReport.def + + + + + Level3 + true + true + true + WIN32;NDEBUG;STORAGEMODULEINFOREPORT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + pch.h + + + Windows + true + true + true + false + StorageModule_InfoReport.def + + + + + Level3 + true + _DEBUG;STORAGEMODULEINFOREPORT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + pch.h + + + Windows + true + false + StorageModule_InfoReport.def + + + + + Level3 + true + true + true + NDEBUG;STORAGEMODULEINFOREPORT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + Use + pch.h + + + Windows + true + true + true + false + StorageModule_InfoReport.def + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + \ No newline at end of file diff --git a/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj.filters b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj.filters new file mode 100644 index 0000000..e184052 --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj.filters @@ -0,0 +1,56 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {05d03df8-14e3-492d-8776-bac05f15c5f7} + + + {c45d0b60-0d3e-4575-9143-a77f9ff0b539} + + + + + 头文件 + + + 头文件 + + + 头文件\InfoReport_APIMachine + + + 头文件 + + + 头文件 + + + + + 源文件 + + + 源文件 + + + 源文件\InfoReport_APIMachine + + + + + 源文件 + + + \ No newline at end of file diff --git a/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj.user b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/XEngine_Source/StorageModule_InfoReport/dllmain.cpp b/XEngine_Source/StorageModule_InfoReport/dllmain.cpp new file mode 100644 index 0000000..daed8c8 --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/dllmain.cpp @@ -0,0 +1,19 @@ +// dllmain.cpp : 定义 DLL 应用程序的入口点。 +#include "pch.h" + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + diff --git a/XEngine_Source/StorageModule_InfoReport/framework.h b/XEngine_Source/StorageModule_InfoReport/framework.h new file mode 100644 index 0000000..80cbbc9 --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/framework.h @@ -0,0 +1,5 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容 +// Windows 头文件 +#include diff --git a/XEngine_Source/StorageModule_InfoReport/pch.cpp b/XEngine_Source/StorageModule_InfoReport/pch.cpp new file mode 100644 index 0000000..c37cdfa --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/pch.cpp @@ -0,0 +1,35 @@ +#include "pch.h" +#include "InfoReport_APIMachine/InfoReport_APIMachine.h" +/******************************************************************** +// Created: 2024/04/15 15:40:22 +// File Name: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport\pch.cpp +// File Path: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport +// File Base: pch +// File Ext: cpp +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: 信息报告导出实现 +// History: +*********************************************************************/ +bool InfoReport_IsErrorOccur = false; +XLONG InfoReport_dwErrorCode = 0; +////////////////////////////////////////////////////////////////////////// +CInfoReport_APIMachine m_APIMachine; +////////////////////////////////////////////////////////////////////////// +// 导出函数 +////////////////////////////////////////////////////////////////////////// +extern "C" XLONG InfoReport_GetLastError(int* pInt_ErrorCode) +{ + if (NULL != pInt_ErrorCode) + { + *pInt_ErrorCode = errno; + } + return InfoReport_dwErrorCode; +} +/************************************************************************/ +/* APIMachine报告 */ +/************************************************************************/ +extern "C" bool InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) +{ + return m_APIMachine.InfoReport_APIMachine_Send(lpszAPIUrl); +} \ No newline at end of file diff --git a/XEngine_Source/StorageModule_InfoReport/pch.h b/XEngine_Source/StorageModule_InfoReport/pch.h new file mode 100644 index 0000000..f21626a --- /dev/null +++ b/XEngine_Source/StorageModule_InfoReport/pch.h @@ -0,0 +1,69 @@ +// pch.h: 这是预编译标头文件。 +// 下方列出的文件仅编译一次,提高了将来生成的生成性能。 +// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 +// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 +// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 + +#ifndef PCH_H +#define PCH_H + +// 添加要在此处预编译的标头 +#ifdef _MSC_BUILD +#include "framework.h" +#include +#else +#include +#include +#include +#endif +#endif //PCH_H +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "InfoReport_Define.h" +#include "InfoReport_Error.h" +/******************************************************************** +// Created: 2024/04/15 14:57:19 +// File Name: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport\pch.h +// File Path: D:\XEngine_Storage\XEngine_Source\StorageModule_InfoReport +// File Base: pch +// File Ext: h +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: 公用头 +// History: +*********************************************************************/ +extern bool InfoReport_IsErrorOccur; +extern XLONG InfoReport_dwErrorCode; + +#ifdef _MSC_BUILD +#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib") +#pragma comment(lib,"XEngine_SystemSdk/XEngine_SystemApi") +#pragma comment(lib,"XEngine_Client/XClient_APIHelp") +#ifdef _DEBUG +#ifdef _WIN64 +#pragma comment(lib,"../x64/Debug/jsoncpp") +#else +#pragma comment(lib,"../Debug/jsoncpp") +#endif +#else +#ifdef _WIN64 +#pragma comment(lib,"../x64/Release/jsoncpp") +#else +#pragma comment(lib,"../Release/jsoncpp") +#endif +#endif +#endif \ No newline at end of file diff --git a/XEngine_Source/XEngine_StorageApp.sln b/XEngine_Source/XEngine_StorageApp.sln index d4db869..5de2fa3 100644 --- a/XEngine_Source/XEngine_StorageApp.sln +++ b/XEngine_Source/XEngine_StorageApp.sln @@ -27,6 +27,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StorageModule_Database", "S EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StorageModule_BTorrent", "StorageModule_BTorrent\StorageModule_BTorrent.vcxproj", "{FFBC453D-B12C-4C3F-86EA-FC569E0566E7}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StorageModule_InfoReport", "StorageModule_InfoReport\StorageModule_InfoReport.vcxproj", "{6754838E-7DC4-4C57-8C80-522DA04E9284}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -99,6 +101,14 @@ Global {FFBC453D-B12C-4C3F-86EA-FC569E0566E7}.Release|x64.Build.0 = Release|x64 {FFBC453D-B12C-4C3F-86EA-FC569E0566E7}.Release|x86.ActiveCfg = Release|Win32 {FFBC453D-B12C-4C3F-86EA-FC569E0566E7}.Release|x86.Build.0 = Release|Win32 + {6754838E-7DC4-4C57-8C80-522DA04E9284}.Debug|x64.ActiveCfg = Debug|x64 + {6754838E-7DC4-4C57-8C80-522DA04E9284}.Debug|x64.Build.0 = Debug|x64 + {6754838E-7DC4-4C57-8C80-522DA04E9284}.Debug|x86.ActiveCfg = Debug|Win32 + {6754838E-7DC4-4C57-8C80-522DA04E9284}.Debug|x86.Build.0 = Debug|Win32 + {6754838E-7DC4-4C57-8C80-522DA04E9284}.Release|x64.ActiveCfg = Release|x64 + {6754838E-7DC4-4C57-8C80-522DA04E9284}.Release|x64.Build.0 = Release|x64 + {6754838E-7DC4-4C57-8C80-522DA04E9284}.Release|x86.ActiveCfg = Release|Win32 + {6754838E-7DC4-4C57-8C80-522DA04E9284}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h index 74f2655..c5f7a56 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h @@ -60,6 +60,8 @@ using namespace std; #include "../StorageModule_Protocol/StorageProtocol_Error.h" #include "../StorageModule_APIHelp/APIHelp_Define.h" #include "../StorageModule_APIHelp/APIHelp_Error.h" +#include "../StorageModule_InfoReport/InfoReport_Define.h" +#include "../StorageModule_InfoReport/InfoReport_Error.h" #define STORAGE_LEAVETYPE_HEARTBEAT 1 #define STORAGE_LEAVETYPE_BYSELF 2 @@ -126,12 +128,14 @@ extern XENGINE_LBCONFIG st_LoadbalanceCfg; #pragma comment(lib,"../x64/Debug/StorageModule_APIHelp.lib") #pragma comment(lib,"../x64/Debug/StorageModule_Protocol.lib") #pragma comment(lib,"../x64/Debug/StorageModule_Database.lib") +#pragma comment(lib,"../x64/Debug/StorageModule_InfoReport.lib") #else #pragma comment(lib,"../x64/Release/StorageModule_Session.lib") #pragma comment(lib,"../x64/Release/StorageModule_Config.lib") #pragma comment(lib,"../x64/Release/StorageModule_APIHelp.lib") #pragma comment(lib,"../x64/Release/StorageModule_Protocol.lib") #pragma comment(lib,"../x64/Release/StorageModule_Database.lib") +#pragma comment(lib,"../x64/Release/StorageModule_InfoReport.lib") #endif #else #ifdef _DEBUG @@ -140,12 +144,14 @@ extern XENGINE_LBCONFIG st_LoadbalanceCfg; #pragma comment(lib,"../Debug/StorageModule_APIHelp.lib") #pragma comment(lib,"../Debug/StorageModule_Protocol.lib") #pragma comment(lib,"../Debug/StorageModule_Database.lib") +#pragma comment(lib,"../Debug/StorageModule_InfoReport.lib") #else #pragma comment(lib,"../Release/StorageModule_Session.lib") #pragma comment(lib,"../Release/StorageModule_Config.lib") #pragma comment(lib,"../Release/StorageModule_APIHelp.lib") #pragma comment(lib,"../Release/StorageModule_Protocol.lib") #pragma comment(lib,"../Release/StorageModule_Database.lib") +#pragma comment(lib,"../Release/StorageModule_InfoReport.lib") #endif #endif #endif \ 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 05a2c47..a452222 100644 --- a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp +++ b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp @@ -422,6 +422,22 @@ int main(int argc, char** argv) { XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,P2P存储服务配置为不启动")); } + //发送信息报告 + if (st_ServiceCfg.st_XReport.bEnable) + { + if (InfoReport_APIMachine_Send(st_ServiceCfg.st_XReport.tszAPIUrl)) + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("启动服务中,启动信息报告给API服务器:%s 成功"), st_ServiceCfg.st_XReport.tszAPIUrl); + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("启动服务中,启动信息报告给API服务器:%s 失败,错误:%lX"), st_ServiceCfg.st_XReport.tszAPIUrl, InfoReport_GetLastError()); + } + } + else + { + XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _X("启动服务中,信息报告给API服务器没有启用")); + } XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("所有服务成功启动,存储中心服务运行中,发行版本次数:%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()); From f5a855ac7c83734db0f93951845b6b2d1596ed6f Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 15 Apr 2024 17:29:07 +0800 Subject: [PATCH 05/20] fixed:build error and delete isadmin json for inforeport module --- XEngine_Source/Makefile | 7 +++++-- .../InfoReport_APIMachine.cpp | 5 ++--- .../StorageModule_InfoReport.vcxproj | 18 +++++++++++++++--- XEngine_Source/XEngine_StorageApp/Makefile | 4 ++-- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index 403da09..66ff408 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -11,11 +11,12 @@ BASE_SESSION_PATH = ./StorageModule_Session BASE_APIHELP_PATH = ./StorageModule_APIHelp BASE_PROTOCOL_PATH = ./StorageModule_Protocol BASE_BTORRENT_PATH = ./StorageModule_BTorrent +BASE_INFOREPORT_PATH = ./StorageModule_InfoReport APPSERVICE_STORAGE_PATH = ./XEngine_StorageApp XENGINE_MODULES = libjsoncpp.so \ - libStorageModule_Database.so libStorageModule_Config.so libStorageModule_Session.so libStorageModule_APIHelp.so libStorageModule_Protocol.so libStorageModule_BTorrent.so \ + libStorageModule_Database.so libStorageModule_Config.so libStorageModule_Session.so libStorageModule_APIHelp.so libStorageModule_Protocol.so libStorageModule_BTorrent.so libStorageModule_InfoReport.so \ XEngine_StorageApp.exe .PHONY:MakeAll @@ -36,6 +37,8 @@ libStorageModule_Protocol.so: make -C $(BASE_PROTOCOL_PATH) PLATFORM=$(PLATFORM) $(FLAGS) libStorageModule_BTorrent.so: make -C $(BASE_BTORRENT_PATH) PLATFORM=$(PLATFORM) $(FLAGS) - +libStorageModule_InfoReport.so: + make -C $(BASE_INFOREPORT_PATH) PLATFORM=$(PLATFORM) $(FLAGS) + XEngine_StorageApp.exe: make -C $(APPSERVICE_STORAGE_PATH) PLATFORM=$(PLATFORM) $(FLAGS) diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp index d95e94a..70f18fe 100644 --- a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp @@ -112,10 +112,9 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_GetText(XCHAR* ptszMSGBuffer) st_JsonOSObject["OSVersion"] = tszOSVersion; st_JsonOSObject["tszOSBuild"] = tszOSBuild; - st_JsonMEMObject["nTotal"] = st_MemoryInfo.dwMemory_Total; - st_JsonMEMObject["nFree"] = st_MemoryInfo.dwMemory_Free; + st_JsonMEMObject["nTotal"] = (Json::Value::UInt64)st_MemoryInfo.dwMemory_Total; + st_JsonMEMObject["nFree"] = (Json::Value::UInt64)st_MemoryInfo.dwMemory_Free; - st_JsonRoot["bAdmin"] = SystemApi_Process_IsAdmin(); st_JsonRoot["nProcessCount"] = nProcessCount; st_JsonRoot["st_CPUObject"] = st_JsonCPUObject; st_JsonRoot["st_OSObject"] = st_JsonOSObject; diff --git a/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj index 4ba0f54..f8f2b07 100644 --- a/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj +++ b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.vcxproj @@ -74,6 +74,18 @@ $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) + + $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib32);$(LibraryPath) + + + $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) + + + $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) + Level3 @@ -96,7 +108,7 @@ true true true - WIN32;NDEBUG;STORAGEMODULEINFOREPORT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + WIN32;NDEBUG;STORAGEMODULEINFOREPORT_EXPORTS;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Use pch.h @@ -114,7 +126,7 @@ Level3 true - _DEBUG;STORAGEMODULEINFOREPORT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + _DEBUG;STORAGEMODULEINFOREPORT_EXPORTS;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Use pch.h @@ -132,7 +144,7 @@ true true true - NDEBUG;STORAGEMODULEINFOREPORT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + NDEBUG;STORAGEMODULEINFOREPORT_EXPORTS;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Use pch.h diff --git a/XEngine_Source/XEngine_StorageApp/Makefile b/XEngine_Source/XEngine_StorageApp/Makefile index 65c3176..89d808a 100644 --- a/XEngine_Source/XEngine_StorageApp/Makefile +++ b/XEngine_Source/XEngine_StorageApp/Makefile @@ -5,9 +5,9 @@ PLATDIR = RELEASE = 0 UNICODE = 0 LOADHDR = -I ./ -I ../XEngine_ThirdPart/jsoncpp -LOADSO = -L ../StorageModule_Database -L ../StorageModule_Config -L ../StorageModule_Session -L ../StorageModule_APIHelp -L ../StorageModule_Protocol -L ../XEngine_ThirdPart/jsoncpp +LOADSO = -L ../StorageModule_Database -L ../StorageModule_Config -L ../StorageModule_Session -L ../StorageModule_APIHelp -L ../StorageModule_Protocol -L ../StorageModule_BTorrent -L ../StorageModule_InfoReport -L ../XEngine_ThirdPart/jsoncpp LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXEngine_OPenSsl -lXClient_APIHelp -lXEngine_ProcFile -lXEngine_SystemApi -lHelpComponents_XLog -lHelpComponents_Packets -lRfcComponents_HttpProtocol \ - -lStorageModule_Database -lStorageModule_Config -lStorageModule_Session -lStorageModule_APIHelp -lStorageModule_Protocol \ + -lStorageModule_Database -lStorageModule_Config -lStorageModule_Session -lStorageModule_APIHelp -lStorageModule_Protocol -lStorageModule_BTorrent -lStorageModule_InfoReport \ -ljsoncpp 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 From baaf87d6247f0dd699432304a869643d44433005 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 15 Apr 2024 17:29:39 +0800 Subject: [PATCH 06/20] fixed:bt module build error --- .../StorageModule_BTorrent.vcxproj | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj b/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj index 52a1425..a650105 100644 --- a/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj +++ b/XEngine_Source/StorageModule_BTorrent/StorageModule_BTorrent.vcxproj @@ -74,6 +74,18 @@ $(XEngine_Include);$(IncludePath) $(XEngine_Lib32);$(LibraryPath) + + $(XEngine_Include);$(IncludePath) + $(XEngine_Lib32);$(LibraryPath) + + + $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) + + + $(XEngine_Include);$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) + Level3 @@ -96,7 +108,7 @@ true true true - WIN32;NDEBUG;STORAGEMODULEBTORRENT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + WIN32;NDEBUG;STORAGEMODULEBTORRENT_EXPORTS;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Use pch.h @@ -114,7 +126,7 @@ Level3 true - _DEBUG;STORAGEMODULEBTORRENT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + _DEBUG;STORAGEMODULEBTORRENT_EXPORTS;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Use pch.h @@ -132,7 +144,7 @@ true true true - NDEBUG;STORAGEMODULEBTORRENT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + NDEBUG;STORAGEMODULEBTORRENT_EXPORTS;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Use pch.h From 20c07b9570b31b243ec50c49a564d5c38c78239e Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 16 Apr 2024 10:27:46 +0800 Subject: [PATCH 07/20] modify:info report support connect timeout --- .../InfoReport_APIMachine/InfoReport_APIMachine.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp index 70f18fe..9879cf6 100644 --- a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp @@ -53,7 +53,10 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) XCHAR tszOSBuild[128] = {}; XCHAR tszComputerName[128] = {}; XLONG nOSArch = 0; + + XCLIENT_APIHTTP st_HTTPParam = {}; SYSTEMAPI_SERIAL_INFOMATION st_SDKSerial = {}; + SystemApi_System_GetSystemVer(tszOSName, tszOSVersion, tszOSBuild, &nOSArch); SystemApi_System_GetSysName(NULL, tszComputerName); SystemApi_HardWare_GetSerial(&st_SDKSerial); @@ -72,7 +75,8 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) st_JsonBuilder["emitUTF8"] = true; XCHAR* ptszMsgBuffer = NULL; - if (!APIClient_Http_Request(_X("POST"), lpszAPIUrl, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), &nCode, &ptszMsgBuffer, &nLen)) + st_HTTPParam.nTimeConnect = 2; + if (!APIClient_Http_Request(_X("POST"), lpszAPIUrl, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), &nCode, &ptszMsgBuffer, &nLen, NULL, NULL, &st_HTTPParam)) { InfoReport_IsErrorOccur = true; InfoReport_dwErrorCode = APIClient_GetLastError(); @@ -82,6 +86,9 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) return true; } +////////////////////////////////////////////////////////////////////////// +// 保护函数 +////////////////////////////////////////////////////////////////////////// bool CInfoReport_APIMachine::InfoReport_APIMachine_GetText(XCHAR* ptszMSGBuffer) { InfoReport_IsErrorOccur = false; From 240e499197b3f920cef9b2778a2ac3ec8f90a2e5 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 16 Apr 2024 10:41:31 +0800 Subject: [PATCH 08/20] delete:unused code for center --- XEngine_Source/XEngine_StorageApp/StorageApp_Center.h | 1 - 1 file changed, 1 deletion(-) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h index e1bd7fd..bf451e0 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h @@ -7,5 +7,4 @@ #define XENGINE_STORAGE_APP_METHOD_DLFILE _X("DLFile") 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 From d83de9eb840cfaeb830ea83beb421483be50fd4f Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 16 Apr 2024 10:59:26 +0800 Subject: [PATCH 09/20] modify:define http request type modify to const char * --- .../XEngine_StorageApp/StorageApp_Center.cpp | 6 ++++-- .../XEngine_StorageApp/StorageApp_Center.h | 18 +++++++++++------- .../Storage_APPTask/Storage_TaskManage.cpp | 18 ++++++++++++------ .../Storage_APPTask/Storage_TaskManage.h | 6 ------ .../Storage_APPTask/Storage_TaskPass.cpp | 6 ++++-- 5 files changed, 31 insertions(+), 23 deletions(-) diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp index 8d088f0..db30b2e 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp @@ -57,6 +57,8 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int LPCXSTR lpszMethodPost = _X("POST"); LPCXSTR lpszMethodOption = _X("OPTIONS"); + LPCXSTR lpszMethodPass = _X("Pass"); + LPCXSTR lpszMehtodManage = _X("Manage"); if (st_ServiceCfg.st_XAuth.bCHAuth) { @@ -127,11 +129,11 @@ bool XEngine_Task_HttpCenter(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int return false; } //通知类型.用于多服务器 - if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_TASK_PASS, tszAPIMethod, _tcsxlen(XENGINE_STORAGE_APP_TASK_PASS))) + if (0 == _tcsxnicmp(lpszMethodPass, tszAPIMethod, _tcsxlen(lpszMethodPass))) { XEngine_Task_Pass(tszAPIName, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); } - else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_TASK_MANAGE, tszAPIMethod, _tcsxlen(XENGINE_STORAGE_APP_TASK_MANAGE))) + else if (0 == _tcsxnicmp(lpszMehtodManage, tszAPIMethod, _tcsxlen(lpszMehtodManage))) { XEngine_Task_Manage(tszAPIName, lpszClientAddr, lpszMsgBuffer, nMsgLen, pSt_HTTPParam, pptszListHdr, nHdrCount); } diff --git a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h index bf451e0..9ce548a 100644 --- a/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h +++ b/XEngine_Source/XEngine_StorageApp/StorageApp_Center.h @@ -1,10 +1,14 @@ #pragma once -#define XENGINE_STORAGE_APP_TASK_PASS _X("Pass") -#define XENGINE_STORAGE_APP_TASK_MANAGE _X("Manage") - -#define XENGINE_STORAGE_APP_METHOD_CONFIG _X("Config") -#define XENGINE_STORAGE_APP_METHOD_UPFILE _X("UPFile") -#define XENGINE_STORAGE_APP_METHOD_DLFILE _X("DLFile") - +/******************************************************************** +// Created: 2024/04/16 10:43:39 +// File Name: D:\XEngine_Storage\XEngine_Source\XEngine_StorageApp\StorageApp_Center.h +// File Path: D:\XEngine_Storage\XEngine_Source\XEngine_StorageApp +// File Base: StorageApp_Center +// File Ext: h +// Project: XEngine(网络通信引擎) +// Author: qyt +// Purpose: HTTP管理服务处理类 +// History: +*********************************************************************/ XHTHREAD CALLBACK XEngine_Center_HTTPThread(XPVOID lParam); 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/Storage_APPTask/Storage_TaskManage.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp index 7dfce13..6c0f2b3 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.cpp @@ -6,6 +6,12 @@ bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lp int nRVLen = 10240; XCHAR tszSDBuffer[10240]; XCHAR tszRVBuffer[10240]; + LPCXSTR lpszAPIConfig = _X("Config"); + LPCXSTR lpszAPIInsert = _X("Insert"); + LPCXSTR lpszAPIDelete = _X("Delete"); + LPCXSTR lpszAPIQuery = _X("Query"); + LPCXSTR lpszAPIDir = _X("Dir"); + LPCXSTR lpszAPITask = _X("Task"); RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); @@ -14,14 +20,14 @@ bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lp st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; - if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_CONFIG, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_CONFIG))) + if (0 == _tcsxnicmp(lpszAPIConfig, lpszAPIName, _tcsxlen(lpszAPIConfig))) { 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, _X("业务客户端:%s,处理用户重载配置文件成功"), lpszClientAddr); } - else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_QUERY, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_QUERY))) + else if (0 == _tcsxnicmp(lpszAPIQuery, lpszAPIName, _tcsxlen(lpszAPIQuery))) { //查询文件列表 int nMode = 0; @@ -160,7 +166,7 @@ bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lp stl_ListFile.clear(); } } - else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_INSERT, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_INSERT))) + else if (0 == _tcsxnicmp(lpszAPIInsert, lpszAPIName, _tcsxlen(lpszAPIInsert))) { int nListCount = 0; XSTORAGECORE_DBFILE** ppSt_DBFile; @@ -200,7 +206,7 @@ bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lp XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_DBFile, nListCount); } - else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_DELETE, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_DELETE))) + else if (0 == _tcsxnicmp(lpszAPIDelete, lpszAPIName, _tcsxlen(lpszAPIDelete))) { int nListCount = 0; XSTORAGECORE_DBFILE** ppSt_DBFile; @@ -275,7 +281,7 @@ bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lp XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_DBFile, nListCount); } - else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_DIR, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_DIR))) + else if (0 == _tcsxnicmp(lpszAPIDir, lpszAPIName, _tcsxlen(lpszAPIDir))) { int nOPCode = 0; int nListCount = 0; @@ -368,7 +374,7 @@ bool XEngine_Task_Manage(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lp XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("业务客户端:%s,请求删除文件夹:%s,成功"), lpszClientAddr, tszRealDir); } } - else if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_TASK, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_TASK))) + else if (0 == _tcsxnicmp(lpszAPITask, lpszAPIName, _tcsxlen(lpszAPITask))) { int nDLCount = 0; int nUPCount = 0; diff --git a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h index 99d9f05..dd5b8f0 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskManage.h @@ -1,9 +1,3 @@ #pragma once -#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(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_TaskPass.cpp b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp index 7049266..8fd0d24 100644 --- a/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp +++ b/XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskPass.cpp @@ -4,6 +4,8 @@ bool XEngine_Task_Pass(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpsz { int nSDLen = 2048; XCHAR tszSDBuffer[2048]; + LPCXSTR lpszAPIUPFile = _X("UPFile"); + LPCXSTR lpszAPIDLFile = _X("DLFile"); RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam; memset(tszSDBuffer, '\0', sizeof(tszSDBuffer)); @@ -12,7 +14,7 @@ bool XEngine_Task_Pass(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpsz st_HDRParam.bIsClose = true; st_HDRParam.nHttpCode = 200; //下载 - if (0 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_UPFILE, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_UPFILE))) + if (0 == _tcsxnicmp(lpszAPIUPFile, lpszAPIName, _tcsxlen(lpszAPIUPFile))) { XCHAR tszClientAddr[128]; XSTORAGECORE_DBFILE st_DBFile; @@ -24,7 +26,7 @@ bool XEngine_Task_Pass(LPCXSTR lpszAPIName, LPCXSTR lpszClientAddr, LPCXSTR lpsz XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER); 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 == _tcsxnicmp(XENGINE_STORAGE_APP_METHOD_DLFILE, lpszAPIName, _tcsxlen(XENGINE_STORAGE_APP_METHOD_DLFILE))) + else if (0 == _tcsxnicmp(lpszAPIDLFile, lpszAPIName, _tcsxlen(lpszAPIDLFile))) { __int64x nFileSize = 0; XCHAR tszPathKey[MAX_PATH]; From d557cc19a77d4723bde6698d603f30e4af0a0fb0 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 16 Apr 2024 11:00:44 +0800 Subject: [PATCH 10/20] added:get time number for info report modify:the complete request address is no longer required --- .../InfoReport_APIMachine.cpp | 89 ++++++++++++++++++- .../InfoReport_APIMachine.h | 1 + .../InfoReport_Define.h | 21 ++++- .../InfoReport_Error.h | 5 +- .../StorageModule_InfoReport.def | 3 +- .../StorageModule_InfoReport/pch.cpp | 4 + 6 files changed, 118 insertions(+), 5 deletions(-) diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp index 9879cf6..b7d7ac7 100644 --- a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp @@ -33,7 +33,7 @@ CInfoReport_APIMachine::~CInfoReport_APIMachine() 返回值 类型:逻辑型 意思:是否成功 -备注:lpszAPIUrl = _X("http://127.0.0.1:5501/api?function=machine¶ms1=0"); +备注:lpszAPIUrl = _X("http://127.0.0.1:5501/api?function=machine"); *********************************************************************/ bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) { @@ -48,6 +48,7 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) int nLen = 0; int nCode = 0; + XCHAR tszAPIUrl[MAX_PATH] = {}; XCHAR tszOSName[128] = {}; XCHAR tszOSVersion[128] = {}; XCHAR tszOSBuild[128] = {}; @@ -57,6 +58,8 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) XCLIENT_APIHTTP st_HTTPParam = {}; SYSTEMAPI_SERIAL_INFOMATION st_SDKSerial = {}; + _xstprintf(tszAPIUrl, _X("%s¶ms1=0"), lpszAPIUrl); + SystemApi_System_GetSystemVer(tszOSName, tszOSVersion, tszOSBuild, &nOSArch); SystemApi_System_GetSysName(NULL, tszComputerName); SystemApi_HardWare_GetSerial(&st_SDKSerial); @@ -76,7 +79,7 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) XCHAR* ptszMsgBuffer = NULL; st_HTTPParam.nTimeConnect = 2; - if (!APIClient_Http_Request(_X("POST"), lpszAPIUrl, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), &nCode, &ptszMsgBuffer, &nLen, NULL, NULL, &st_HTTPParam)) + if (!APIClient_Http_Request(_X("POST"), tszAPIUrl, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), &nCode, &ptszMsgBuffer, &nLen, NULL, NULL, &st_HTTPParam)) { InfoReport_IsErrorOccur = true; InfoReport_dwErrorCode = APIClient_GetLastError(); @@ -86,6 +89,88 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) return true; } +/******************************************************************** +函数名称:InfoReport_APIMachine_GetTime +函数功能:获取报告次数 + 参数.一:lpszAPIUrl + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入请求地址 + 参数.二:pInt_TimeNumber + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出报告次数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +bool CInfoReport_APIMachine::InfoReport_APIMachine_GetTime(LPCXSTR lpszAPIUrl, __int64x* pInt_TimeNumber) +{ + InfoReport_IsErrorOccur = false; + + if (NULL == lpszAPIUrl) + { + InfoReport_IsErrorOccur = true; + InfoReport_dwErrorCode = ERROR_XENGINE_STORAGE_INFOREPORT_PARAMENT; + return false; + } + int nLen = 0; + int nCode = 0; + XCHAR tszAPIUrl[MAX_PATH] = {}; + XCLIENT_APIHTTP st_HTTPParam = {}; + SYSTEMAPI_SERIAL_INFOMATION st_SDKSerial = {}; + + _xstprintf(tszAPIUrl, _X("%s¶ms1=2"), lpszAPIUrl); + + SystemApi_HardWare_GetSerial(&st_SDKSerial); + + Json::Value st_JsonRoot; + JSONCPP_STRING st_JsonError; + Json::StreamWriterBuilder st_JsonBuilder; + Json::CharReaderBuilder st_JsonReader; + + st_JsonRoot["tszMachineCode"] = st_SDKSerial.tszSystemSerial; + st_JsonBuilder["emitUTF8"] = true; + + XCHAR* ptszMsgBuffer = NULL; + st_HTTPParam.nTimeConnect = 2; + if (!APIClient_Http_Request(_X("POST"), tszAPIUrl, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), &nCode, &ptszMsgBuffer, &nLen, NULL, NULL, &st_HTTPParam)) + { + InfoReport_IsErrorOccur = true; + InfoReport_dwErrorCode = APIClient_GetLastError(); + return false; + } + st_JsonRoot.clear(); + //开始解析配置文件 + std::unique_ptr const pSt_JsonReader(st_JsonReader.newCharReader()); + if (!pSt_JsonReader->parse(ptszMsgBuffer, ptszMsgBuffer + nLen, &st_JsonRoot, &st_JsonError)) + { + InfoReport_IsErrorOccur = true; + InfoReport_dwErrorCode = ERROR_XENGINE_STORAGE_INFOREPORT_PARSE; + return false; + } + BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + + if (0 != st_JsonRoot["code"].asInt()) + { + InfoReport_IsErrorOccur = true; + InfoReport_dwErrorCode = ERROR_XENGINE_STORAGE_INFOREPORT_CODE; + return false; + } + Json::Value st_JsonObject = st_JsonRoot["data"]; + //老版本 + if (st_JsonObject.isArray()) + { + InfoReport_IsErrorOccur = true; + InfoReport_dwErrorCode = ERROR_XENGINE_STORAGE_INFOREPORT_VERSION; + return false; + } + *pInt_TimeNumber = st_JsonObject["nTimeNumber"].asInt64(); + return true; +} ////////////////////////////////////////////////////////////////////////// // 保护函数 ////////////////////////////////////////////////////////////////////////// diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.h b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.h index dbf7bfe..68a8507 100644 --- a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.h +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.h @@ -18,6 +18,7 @@ class CInfoReport_APIMachine ~CInfoReport_APIMachine(); public: bool InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl); + bool InfoReport_APIMachine_GetTime(LPCXSTR lpszAPIUrl, __int64x* pInt_TimeNumber); protected: bool InfoReport_APIMachine_GetText(XCHAR *ptszMSGBuffer); }; diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_Define.h b/XEngine_Source/StorageModule_InfoReport/InfoReport_Define.h index 2bce384..40f37fc 100644 --- a/XEngine_Source/StorageModule_InfoReport/InfoReport_Define.h +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_Define.h @@ -30,4 +30,23 @@ extern "C" XLONG InfoReport_GetLastError(int *pInt_ErrorCode = NULL); 意思:是否成功 备注:lpszAPIUrl = _X("http://127.0.0.1:5501/api?function=machine¶ms1=0"); *********************************************************************/ -extern "C" bool InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl); \ No newline at end of file +extern "C" bool InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl); +/******************************************************************** +函数名称:InfoReport_APIMachine_GetTime +函数功能:获取报告次数 + 参数.一:lpszAPIUrl + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入请求地址 + 参数.二:pInt_TimeNumber + In/Out:Out + 类型:整数型指针 + 可空:N + 意思:输出报告次数 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: +*********************************************************************/ +extern "C" bool InfoReport_APIMachine_GetTime(LPCXSTR lpszAPIUrl, __int64x* pInt_TimeNumber); \ No newline at end of file diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_Error.h b/XEngine_Source/StorageModule_InfoReport/InfoReport_Error.h index b6e9d42..92b40d1 100644 --- a/XEngine_Source/StorageModule_InfoReport/InfoReport_Error.h +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_Error.h @@ -10,4 +10,7 @@ // Purpose: 信息报告错误码 // History: *********************************************************************/ -#define ERROR_XENGINE_STORAGE_INFOREPORT_PARAMENT 0x01A0001 \ No newline at end of file +#define ERROR_XENGINE_STORAGE_INFOREPORT_PARAMENT 0x01A0001 +#define ERROR_XENGINE_STORAGE_INFOREPORT_PARSE 0x01A0002 +#define ERROR_XENGINE_STORAGE_INFOREPORT_CODE 0x01A0003 +#define ERROR_XENGINE_STORAGE_INFOREPORT_VERSION 0x01A0004 \ No newline at end of file diff --git a/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.def b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.def index 48e608d..a559d82 100644 --- a/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.def +++ b/XEngine_Source/StorageModule_InfoReport/StorageModule_InfoReport.def @@ -3,4 +3,5 @@ LIBRARY EXPORTS InfoReport_GetLastError - InfoReport_APIMachine_Send \ No newline at end of file + InfoReport_APIMachine_Send + InfoReport_APIMachine_GetTime \ No newline at end of file diff --git a/XEngine_Source/StorageModule_InfoReport/pch.cpp b/XEngine_Source/StorageModule_InfoReport/pch.cpp index c37cdfa..3f1e3ba 100644 --- a/XEngine_Source/StorageModule_InfoReport/pch.cpp +++ b/XEngine_Source/StorageModule_InfoReport/pch.cpp @@ -32,4 +32,8 @@ extern "C" XLONG InfoReport_GetLastError(int* pInt_ErrorCode) extern "C" bool InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) { return m_APIMachine.InfoReport_APIMachine_Send(lpszAPIUrl); +} +extern "C" bool InfoReport_APIMachine_GetTime(LPCXSTR lpszAPIUrl, __int64x * pInt_TimeNumber) +{ + return m_APIMachine.InfoReport_APIMachine_GetTime(lpszAPIUrl, pInt_TimeNumber); } \ No newline at end of file From 84b9c82a2435e2b7d2be50a776b8194881f6aff7 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 16 Apr 2024 11:02:59 +0800 Subject: [PATCH 11/20] modify:not handle error info for info report --- .../InfoReport_APIMachine.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp index b7d7ac7..ad0b3df 100644 --- a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp @@ -65,7 +65,9 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) SystemApi_HardWare_GetSerial(&st_SDKSerial); Json::Value st_JsonRoot; + JSONCPP_STRING st_JsonError; Json::StreamWriterBuilder st_JsonBuilder; + Json::CharReaderBuilder st_JsonReader; XCHAR tszMachineText[1024] = {}; InfoReport_APIMachine_GetText(tszMachineText); @@ -85,8 +87,24 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) InfoReport_dwErrorCode = APIClient_GetLastError(); return false; } + st_JsonRoot.clear(); + //开始解析配置文件 + std::unique_ptr const pSt_JsonReader(st_JsonReader.newCharReader()); + if (!pSt_JsonReader->parse(ptszMsgBuffer, ptszMsgBuffer + nLen, &st_JsonRoot, &st_JsonError)) + { + InfoReport_IsErrorOccur = true; + InfoReport_dwErrorCode = ERROR_XENGINE_STORAGE_INFOREPORT_PARSE; + return false; + } BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMsgBuffer); + if (0 != st_JsonRoot["code"].asInt()) + { + InfoReport_IsErrorOccur = true; + InfoReport_dwErrorCode = ERROR_XENGINE_STORAGE_INFOREPORT_CODE; + return false; + } + return true; } /******************************************************************** From 9fc323f78b9d5d61ace8096cd7785f34a5a0c9f7 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 16 Apr 2024 11:10:52 +0800 Subject: [PATCH 12/20] modify:ssl type default only tls now modify:ssl support multi type cert --- .../StorageModule_Config/Config_Define.h | 2 +- .../Config_Json/Config_Json.cpp | 5 ++- .../XEngine_StorageApp/XEngine_StorageApp.cpp | 33 +++++++++++++++---- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/XEngine_Source/StorageModule_Config/Config_Define.h b/XEngine_Source/StorageModule_Config/Config_Define.h index afab724..378b960 100644 --- a/XEngine_Source/StorageModule_Config/Config_Define.h +++ b/XEngine_Source/StorageModule_Config/Config_Define.h @@ -97,8 +97,8 @@ typedef struct tag_XEngine_ServerConfig struct { XCHAR tszCertChain[MAX_PATH]; + XCHAR tszCertServer[MAX_PATH]; XCHAR tszCertKey[MAX_PATH]; - int nSslType; bool bDLEnable; bool bUPEnable; bool bCHEnable; diff --git a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp index caf9cf2..5dcffe6 100644 --- a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp +++ b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp @@ -212,11 +212,14 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG pSt_ServerConfig->st_XCert.bDLEnable = st_JsonCert["bDLEnable"].asInt(); pSt_ServerConfig->st_XCert.bUPEnable = st_JsonCert["bUPEnable"].asInt(); pSt_ServerConfig->st_XCert.bCHEnable = st_JsonCert["bCHEnable"].asInt(); - pSt_ServerConfig->st_XCert.nSslType = st_JsonCert["nSslType"].asInt(); if (!st_JsonP2xp["tszCertChain"].isNull()) { _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertChain, st_JsonP2xp["tszCertChain"].asCString()); } + if (!st_JsonP2xp["tszCertServer"].isNull()) + { + _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertServer, st_JsonP2xp["tszCertServer"].asCString()); + } if (!st_JsonP2xp["tszCertKey"].isNull()) { _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertKey, st_JsonP2xp["tszCertKey"].asCString()); diff --git a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp index a452222..7517e75 100644 --- a/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp +++ b/XEngine_Source/XEngine_StorageApp/XEngine_StorageApp.cpp @@ -241,13 +241,20 @@ int main(int argc, char** argv) 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); + if (_tcsxlen(st_ServiceCfg.st_XCert.tszCertServer) > 0) + { + xhDLSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertServer, st_ServiceCfg.st_XCert.tszCertKey, false, false, XENGINE_OPENSSL_PROTOCOL_TLS_SERVER); + } + else + { + xhDLSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, NULL, st_ServiceCfg.st_XCert.tszCertKey, false, false, XENGINE_OPENSSL_PROTOCOL_TLS_SERVER); + } if (NULL == xhDLSsl) { 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, _X("启动服务中,启动下载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"), st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertKey); } else { @@ -301,13 +308,20 @@ int main(int argc, char** argv) 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); + if (_tcsxlen(st_ServiceCfg.st_XCert.tszCertServer) > 0) + { + xhUPSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertServer, st_ServiceCfg.st_XCert.tszCertKey, false, false, XENGINE_OPENSSL_PROTOCOL_TLS_SERVER); + } + else + { + xhUPSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, NULL, st_ServiceCfg.st_XCert.tszCertKey, false, false, XENGINE_OPENSSL_PROTOCOL_TLS_SERVER); + } if (NULL == xhUPSsl) { 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, _X("启动服务中,启动上传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"), st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertKey); } else { @@ -354,13 +368,20 @@ int main(int argc, char** argv) 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); + if (_tcsxlen(st_ServiceCfg.st_XCert.tszCertServer) > 0) + { + xhCHSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertServer, st_ServiceCfg.st_XCert.tszCertKey, false, false, XENGINE_OPENSSL_PROTOCOL_TLS_SERVER); + } + else + { + xhCHSsl = OPenSsl_Server_InitEx(st_ServiceCfg.st_XCert.tszCertChain, NULL, st_ServiceCfg.st_XCert.tszCertKey, false, false, XENGINE_OPENSSL_PROTOCOL_TLS_SERVER); + } if (NULL == xhCHSsl) { 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, _X("启动服务中,启动业务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"), st_ServiceCfg.st_XCert.tszCertChain, st_ServiceCfg.st_XCert.tszCertKey); } else { From 69f33de54a2d191ea21d82e8d6e9143fa467557a Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 16 Apr 2024 11:43:06 +0800 Subject: [PATCH 13/20] fixed:read ssl configure is incorrect modify:boolean type to asbool from asint for configure --- .../Config_Json/Config_Json.cpp | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp index 5dcffe6..1841a7c 100644 --- a/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp +++ b/XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp @@ -147,8 +147,8 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG } Json::Value st_JsonXStorage = st_JsonRoot["XStorage"]; pSt_ServerConfig->st_XStorage.nHashMode = st_JsonXStorage["nHashMode"].asInt(); - pSt_ServerConfig->st_XStorage.bUPHash = st_JsonXStorage["bUPHash"].asInt(); - pSt_ServerConfig->st_XStorage.bResumable = st_JsonXStorage["bResumable"].asInt(); + pSt_ServerConfig->st_XStorage.bUPHash = st_JsonXStorage["bUPHash"].asBool(); + pSt_ServerConfig->st_XStorage.bResumable = st_JsonXStorage["bResumable"].asBool(); if (st_JsonRoot["XProxy"].empty() || (6 != st_JsonRoot["XProxy"].size())) { @@ -209,20 +209,20 @@ bool CConfig_Json::Config_Json_File(LPCXSTR lpszConfigFile, XENGINE_SERVERCONFIG return false; } Json::Value st_JsonCert = st_JsonRoot["XCert"]; - pSt_ServerConfig->st_XCert.bDLEnable = st_JsonCert["bDLEnable"].asInt(); - pSt_ServerConfig->st_XCert.bUPEnable = st_JsonCert["bUPEnable"].asInt(); - pSt_ServerConfig->st_XCert.bCHEnable = st_JsonCert["bCHEnable"].asInt(); - if (!st_JsonP2xp["tszCertChain"].isNull()) + pSt_ServerConfig->st_XCert.bDLEnable = st_JsonCert["bDLEnable"].asBool(); + pSt_ServerConfig->st_XCert.bUPEnable = st_JsonCert["bUPEnable"].asBool(); + pSt_ServerConfig->st_XCert.bCHEnable = st_JsonCert["bCHEnable"].asBool(); + if (!st_JsonCert["tszCertChain"].isNull()) { - _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertChain, st_JsonP2xp["tszCertChain"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertChain, st_JsonCert["tszCertChain"].asCString()); } - if (!st_JsonP2xp["tszCertServer"].isNull()) + if (!st_JsonCert["tszCertServer"].isNull()) { - _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertServer, st_JsonP2xp["tszCertServer"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertServer, st_JsonCert["tszCertServer"].asCString()); } - if (!st_JsonP2xp["tszCertKey"].isNull()) + if (!st_JsonCert["tszCertKey"].isNull()) { - _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertKey, st_JsonP2xp["tszCertKey"].asCString()); + _tcsxcpy(pSt_ServerConfig->st_XCert.tszCertKey, st_JsonCert["tszCertKey"].asCString()); } if (st_JsonRoot["XReport"].empty() || (2 != st_JsonRoot["XReport"].size())) From bb913b9b66f2177a75919d7b7bfa8712044cdfd2 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 16 Apr 2024 11:43:36 +0800 Subject: [PATCH 14/20] fixed:timeout value is incorrect for info report --- .../InfoReport_APIMachine/InfoReport_APIMachine.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp index ad0b3df..410bbbe 100644 --- a/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp +++ b/XEngine_Source/StorageModule_InfoReport/InfoReport_APIMachine/InfoReport_APIMachine.cpp @@ -80,7 +80,7 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_Send(LPCXSTR lpszAPIUrl) st_JsonBuilder["emitUTF8"] = true; XCHAR* ptszMsgBuffer = NULL; - st_HTTPParam.nTimeConnect = 2; + st_HTTPParam.nTimeConnect = 2000; if (!APIClient_Http_Request(_X("POST"), tszAPIUrl, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), &nCode, &ptszMsgBuffer, &nLen, NULL, NULL, &st_HTTPParam)) { InfoReport_IsErrorOccur = true; @@ -154,7 +154,7 @@ bool CInfoReport_APIMachine::InfoReport_APIMachine_GetTime(LPCXSTR lpszAPIUrl, _ st_JsonBuilder["emitUTF8"] = true; XCHAR* ptszMsgBuffer = NULL; - st_HTTPParam.nTimeConnect = 2; + st_HTTPParam.nTimeConnect = 2000; if (!APIClient_Http_Request(_X("POST"), tszAPIUrl, Json::writeString(st_JsonBuilder, st_JsonRoot).c_str(), &nCode, &ptszMsgBuffer, &nLen, NULL, NULL, &st_HTTPParam)) { InfoReport_IsErrorOccur = true; From eeccde0f0f89bdef48fdeb58a530e0cb5c4e7094 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 16 Apr 2024 11:46:28 +0800 Subject: [PATCH 15/20] update:configure file --- .../XEngine_Config/XEngine_Config.json | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index bb05b14..55a6c01 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -32,8 +32,8 @@ "SQLPass":"123123aa" }, "XStorage":{ - "bResumable":1, - "bUPHash":0, + "bResumable":true, + "bUPHash":false, "nHashMode":2 }, "XAuth":{ @@ -64,14 +64,19 @@ "nSDPort":15001 }, "XCert":{ - "bDLEnable":0, - "bUPEnable":0, - "bCHEnable":0, - "nSslType":0, - "tszCertChain":"./XEngine_Cert/1_www.xyry.org_bundle.crt", - "tszCertKey":"./XEngine_Cert/2_www.xyry.org.key" + "bDLEnable":false, + "bUPEnable":false, + "bCHEnable":false, + "tszCertChain":"./XEngine_Cert/server.crt", + "tszCertServer":"", + "tszCertKey":"./XEngine_Cert/server.key" + }, + "XReport":{ + "bEnable":true, + "tszAPIUrl":"http://app.xyry.org:5501/api?function=machine" }, "XVer":[ + "3.14.0.1001 Build20240430", "3.13.0.1001 Build20240301", "3.12.1.1001 Build20240104", "3.12.0.1001 Build20231025", From 545c59b813fbf36a6b24d515d203210d01e266dc Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 16 Apr 2024 16:19:37 +0800 Subject: [PATCH 16/20] update:vscopy file --- XEngine_APPClient/VSCopy_x64.bat | 8 +------- XEngine_APPClient/VSCopy_x86.bat | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/XEngine_APPClient/VSCopy_x64.bat b/XEngine_APPClient/VSCopy_x64.bat index 3ca9440..78e0725 100644 --- a/XEngine_APPClient/VSCopy_x64.bat +++ b/XEngine_APPClient/VSCopy_x64.bat @@ -2,10 +2,4 @@ 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-x64.dll" "./" -copy /y "%XEngine_Lib64%\XEngine_NetHelp\libcurl.dll" "./" -copy /y "%XEngine_Lib64%\XEngine_NetHelp\nghttp2.dll" "./" \ No newline at end of file +copy /y "%XEngine_Lib64%\XEngine_NetHelp\NetHelp_APIClient.dll" "./" \ No newline at end of file diff --git a/XEngine_APPClient/VSCopy_x86.bat b/XEngine_APPClient/VSCopy_x86.bat index 54a3c4f..fbbc0b7 100644 --- a/XEngine_APPClient/VSCopy_x86.bat +++ b/XEngine_APPClient/VSCopy_x86.bat @@ -2,10 +2,4 @@ copy /y "%XEngine_Lib32%\XEngine_BaseLib\XEngine_BaseLib.dll" "./" copy /y "%XEngine_Lib32%\XEngine_BaseLib\XEngine_Algorithm.dll" "./" copy /y "%XEngine_Lib32%\XEngine_Core\XEngine_OPenSsl.dll" "./" copy /y "%XEngine_Lib32%\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" -copy /y "%XEngine_Lib32%\XEngine_NetHelp\NetHelp_APIClient.dll" "./" - -copy /y "%XEngine_Lib32%\XEngine_HelpComponents\zlib1.dll" "./" -copy /y "%XEngine_Lib32%\XEngine_LibEx\libcrypto-3.dll" "./" -copy /y "%XEngine_Lib32%\XEngine_LibEx\libssl-3.dll" "./" -copy /y "%XEngine_Lib32%\XEngine_NetHelp\libcurl.dll" "./" -copy /y "%XEngine_Lib32%\XEngine_NetHelp\nghttp2.dll" "./" \ No newline at end of file +copy /y "%XEngine_Lib32%\XEngine_Client\XClient_APIHelp.dll" "./" \ No newline at end of file From 7b7d6acdcb055619b58f3b0cf628dc841f6535ca Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 16 Apr 2024 16:32:43 +0800 Subject: [PATCH 17/20] added:default ssl key --- XEngine_Release/XEngine_Cert/.gitignore | 0 XEngine_Release/XEngine_Cert/server.crt | 21 +++++++++++++++++++ XEngine_Release/XEngine_Cert/server.csr | 17 +++++++++++++++ XEngine_Release/XEngine_Cert/server.key | 28 +++++++++++++++++++++++++ 4 files changed, 66 insertions(+) delete mode 100644 XEngine_Release/XEngine_Cert/.gitignore create mode 100644 XEngine_Release/XEngine_Cert/server.crt create mode 100644 XEngine_Release/XEngine_Cert/server.csr create mode 100644 XEngine_Release/XEngine_Cert/server.key diff --git a/XEngine_Release/XEngine_Cert/.gitignore b/XEngine_Release/XEngine_Cert/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/XEngine_Release/XEngine_Cert/server.crt b/XEngine_Release/XEngine_Cert/server.crt new file mode 100644 index 0000000..9b9719c --- /dev/null +++ b/XEngine_Release/XEngine_Cert/server.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDZzCCAk8CFGgg0Kn03GiOunI7jMmWuJALC6YaMA0GCSqGSIb3DQEBCwUAMHAx +CzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdzaWNodWFuMRAwDgYDVQQHDAdjaGVuZ2R1 +MRAwDgYDVQQKDAd4ZW5naW5lMRQwEgYDVQQLDAtzdHJlYW1tZWRpYTEVMBMGA1UE +AwwMd3d3Lnh5cnkub3JnMB4XDTI0MDMyMjAzNDExNloXDTM0MDMyMDAzNDExNlow +cDELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB3NpY2h1YW4xEDAOBgNVBAcMB2NoZW5n +ZHUxEDAOBgNVBAoMB3hlbmdpbmUxFDASBgNVBAsMC3N0cmVhbW1lZGlhMRUwEwYD +VQQDDAx3d3cueHlyeS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCYcWc5YUagKdzxma0GsHCnhZIYoy512mVHL4NGi6Xvz3eE379aLYzMQ/PYFNV+ +GqgDWDYlIsHvGthQqbixRoF47ezXPrHwnhjYsfBSU9IOJZ2iIeMXugmBduW9d8W4 +85eQ3x5HGzttILdPbgtnP52DMGu/Ev/Zi41KH0T+90MY6i1KxRLwvMN/liAUvPcO +Aydg1fNaVvpyS2iqhvb0jNC9kkK/bH4de2uTWU5t9+4ous1NBAIHZd0kLBeOTsRR +qaCiq/ADYvk/WY0pyeXPcPNhq2Fokfw2y+6gCccOEn7G6BzljzeOiCC2rIpU4bfW +6GezuR8qhFxuYxXo2Mk6DAqNAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAHQiJEFs +WsUMawg4pm0QWPHQTQ8L5976+BqZoMbmF2rAnMNaeEOMCUh0cjbZMyx+DflDCiT0 +coxWDVwbrXNB0ho7HE5RiEavgqswXtMmDg1PZ+PrcMR9EhDsVXOtY0/SIwIYU455 +x4ggiLnWm3wua2Yoj7HIaCmKGqdHKbqyCgKKrzcYTKz6dApMuvdPLy36+V4vhBA/ +sDYLQ37XHlE9iE3YBLqjoE1iWUuofFEgwlITCssEN8A3B0m9mc+O18IZ7MBir0sC +pPdqyLmfjAEyegAYBxofrOMD0nevI+/IhT4Gf1btL53rgRLd1o8wXFUwKvHEmcqY +pd3q0OEcbsBESKk= +-----END CERTIFICATE----- diff --git a/XEngine_Release/XEngine_Cert/server.csr b/XEngine_Release/XEngine_Cert/server.csr new file mode 100644 index 0000000..f330671 --- /dev/null +++ b/XEngine_Release/XEngine_Cert/server.csr @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICtTCCAZ0CAQAwcDELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB3NpY2h1YW4xEDAO +BgNVBAcMB2NoZW5nZHUxEDAOBgNVBAoMB3hlbmdpbmUxFDASBgNVBAsMC3N0cmVh +bW1lZGlhMRUwEwYDVQQDDAx3d3cueHlyeS5vcmcwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCYcWc5YUagKdzxma0GsHCnhZIYoy512mVHL4NGi6Xvz3eE +379aLYzMQ/PYFNV+GqgDWDYlIsHvGthQqbixRoF47ezXPrHwnhjYsfBSU9IOJZ2i +IeMXugmBduW9d8W485eQ3x5HGzttILdPbgtnP52DMGu/Ev/Zi41KH0T+90MY6i1K +xRLwvMN/liAUvPcOAydg1fNaVvpyS2iqhvb0jNC9kkK/bH4de2uTWU5t9+4ous1N +BAIHZd0kLBeOTsRRqaCiq/ADYvk/WY0pyeXPcPNhq2Fokfw2y+6gCccOEn7G6Bzl +jzeOiCC2rIpU4bfW6GezuR8qhFxuYxXo2Mk6DAqNAgMBAAGgADANBgkqhkiG9w0B +AQsFAAOCAQEAiHMwNeWi5hJhSEEsx3iMG+Ftk19ShPIFoSZXcx1/X8IcGT99k8f9 +bKHCX4NAP/byF5M6ElkPv5FBhprNieykKfBJVzz+cZfaE6eWYI1VI0vwAjMYVdVf +zMllRfstoSO/k+NQ067XJ4NjAVoitpuKYbqbJLKODXsO3ETMbEdo4iMB9kbHQY+U +5roJdAAF4fBe7qfcBuklZ3lRl6zbhdnY3ttgljzgG08k7jXb59tu6T7LX7+gjPUj +JSLA5uIBIi9CBaCatHEdtjg82o4ZSK6Yds1Opeprwtq7/RcsB9yhitL7GO+9oF90 +XnmrLZDfJreAN2hogb6mXgjWxEqvPV28Fg== +-----END CERTIFICATE REQUEST----- diff --git a/XEngine_Release/XEngine_Cert/server.key b/XEngine_Release/XEngine_Cert/server.key new file mode 100644 index 0000000..12462ac --- /dev/null +++ b/XEngine_Release/XEngine_Cert/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCYcWc5YUagKdzx +ma0GsHCnhZIYoy512mVHL4NGi6Xvz3eE379aLYzMQ/PYFNV+GqgDWDYlIsHvGthQ +qbixRoF47ezXPrHwnhjYsfBSU9IOJZ2iIeMXugmBduW9d8W485eQ3x5HGzttILdP +bgtnP52DMGu/Ev/Zi41KH0T+90MY6i1KxRLwvMN/liAUvPcOAydg1fNaVvpyS2iq +hvb0jNC9kkK/bH4de2uTWU5t9+4ous1NBAIHZd0kLBeOTsRRqaCiq/ADYvk/WY0p +yeXPcPNhq2Fokfw2y+6gCccOEn7G6BzljzeOiCC2rIpU4bfW6GezuR8qhFxuYxXo +2Mk6DAqNAgMBAAECggEAAJeVOHoiVbOF1Ly+QKF7gcaw9aqQHu7/aWalqnkdFGzY +dSfe/9hNVGft4ONVERoT54mcnjqF5JTm+zguHlF+KOTW1dj11wy+uqbv54tLBOC9 +HxdG9m42wx6IhprE0LXMRe1Rpmtdn7DCTkgeG6BVW3KO2w7qzGvqVU4rYioZoolJ +1bkCFrttktbztgQDS5spl/cugGWgsW5Y2GanU11as69w+9UiL09vCRg+Ie5DiZi1 +soN2i6y75tJDpgaSCnmSri2YaG4cSiDq/cvcpyCCoQmpIfxkuZ4BaTaaPBjIQoyt +Y45PqmuDOLuIaNgllUzxHZMgRSipM11bo2ySGAigwQKBgQC+V2oh67TaNkPvZZ5U +5iSm50Dsl0CVHIteBedB4xEuLQVtA4HPU1hF3EfwGVOUX5Qqr5B3whqlVr/4Z0Th +IAl6D3F5IFD41X5kpw0ygrxyCKPrRKfQfOijAuLQ+50NpnhcOqdmkXmXEh8ZQGZn +Tqqqiry6aTviRjAqUfhe3QE0wQKBgQDNB0RiT0bvtarBxVeehzvQtw67czwvYJq7 +3lGQlTLr1IP5H6JmzD6x0f0cTz0x50N62Lg8kI6IQmQL/ixJzBhcv3alQ+4jwRRx +pf+2LA+JBYHuuEValhY4awLn0QCCsP3BjvcDe1//T0tkatPu7bEUN3sMDeoG1vT8 +Qht0tcvMzQKBgAXTeyYqptB/FLlBLQWAPeL19SDIyGtIAmQQXjHAF4iITEA3+UM1 +U+Bfi7wnqk1CV7Cuywc/Y71n2FxsHMmfR2r7CgghGxliv4mpK1g+dDIxXYMYCOLy +z9QdhH/NE9OVIt3/1ZvoHAapwVXuiLPkzoiF0p0KF5EngNXqyGVu8liBAoGBAKtH +X+R08AC/FiiMULc5qEmjM6Z7DRNTM9CwWBld2s1SmvGacNRJ2jI5B6cHt0qiNShC +Nh86cCf6tpOiQaNg4hVRSa+kgSPTX93VXDr2sf+43yPrQtz7NxLoquO4ISIM8+Ao +K8j332ls98Gq0OPwI5eNBbk7Qn92QfEe1Mr6OIgdAoGAZSnBGYuE3iAf5z0k0pz4 +i+As/Y6tDIgJf5MUBJ0aZQjDZATRqTZewasxA+YEtan0t8h2lR5U3f98KcweT4Wo +qVReotVk98rNLH94cpeIA9+bhE+FpDPvDm3LMSTDX1b8vMLukE5CWKkEiOIMBFeo +3NL4mInqVDxxZX6OItH1UOw= +-----END PRIVATE KEY----- From b9f5ddc4285b5d1f360fecda7eb62862ff4510ac Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 17 Apr 2024 16:58:10 +0800 Subject: [PATCH 18/20] fixed:build switch is not work for bt module --- XEngine_Source/StorageModule_BTorrent/pch.h | 1 + 1 file changed, 1 insertion(+) diff --git a/XEngine_Source/StorageModule_BTorrent/pch.h b/XEngine_Source/StorageModule_BTorrent/pch.h index c41045f..e45d76b 100644 --- a/XEngine_Source/StorageModule_BTorrent/pch.h +++ b/XEngine_Source/StorageModule_BTorrent/pch.h @@ -46,6 +46,7 @@ using namespace std; #include #include #include +#include "../XStorage_BuildSwitch.h" #include "BTorrent_Define.h" #include "BTorrent_Error.h" ////////////////////////////////////////////////////////////////////////// From 40c78ebd218923f6dc6917e25a8e43921bfad3d3 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 17 Apr 2024 16:59:33 +0800 Subject: [PATCH 19/20] added:git attr info file --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++ CHANGELOG | 22 ++++ CODE_OF_CONDUCT.md | 128 ++++++++++++++++++++++ SECURITY.md | 19 ++++ 5 files changed, 227 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 SECURITY.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dd84ea7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..bbcbbe7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/CHANGELOG b/CHANGELOG index dea1f60..8be4cd7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,25 @@ +XEngine_Storage V3.14.0.1001 + +增加:默认SSL的KEY文件 +增加:BT协议模块(支持解析,创建和下载BT种子) +增加:信息报告模块,可以上报信息和查询 +修改:定义http请求的类型修改为const char *类型 +修改:ssl类型现在采取默认tls了 +修改:ssl支持多类型证书了 +修改:配置文件逻辑型从int都改成bool了 +修正:读取ssl配置不正确的问题 +删除:没有使用的center相关代码 + +added:default ssl key +added:bt protocol module +added:info report module +modify:define http request type modify to const char * +modify:ssl type default only tls now +modify:ssl support multi type cert +modify:boolean type to asbool from asint for configure +fixed:read ssl configure is incorrect +delete:unused code for center +====================================================================================== XEngine_Storage V3.13.0.1001 增加:st_PermissionFlags增加新的标志位上传限制,现在上传文件也可以进行限制了 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..751bf62 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +486179@qq.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..fc80423 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 2.6.x | :white_check_mark: | +| < 2.6 | :x: | + +## Reporting a Vulnerability + +Use this section to tell people how to report a vulnerability. + +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. From 1839676a6cf2bbc333fd45bf7191c243990ee8c5 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Thu, 18 Apr 2024 10:14:56 +0800 Subject: [PATCH 20/20] update:docment and configure --- XEngine_Docment/Docment_en.docx | Bin 127803 -> 128596 bytes XEngine_Docment/Docment_zh.docx | Bin 127432 -> 128297 bytes .../XEngine_Config/XEngine_Config.json | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index c4d02f8dd5c0513770ad6cd1e5e0f630d0a1d8fd..a6cbed9f931189a6fdbf350ee8157f213845a273 100644 GIT binary patch delta 107085 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 delta 106288 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�J(kR`zES3B28CofEOo9dBwTpmd>SR*-g^g8 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
rQ{DG=@(51Jd0sdK8{ukw7gA1Gor+2N|! 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 diff --git a/XEngine_Docment/Docment_zh.docx b/XEngine_Docment/Docment_zh.docx index 483211acf7789186b37ea964188f39a441c1cc15..a7e3d47cef2fa2fc3ff5cbfb7815696bb485e9b6 100644 GIT binary patch delta 112011 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
PRy3K))7U^DErxA=g{&rx-uM)1fjs2jnxy%VjE4 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

1Mg#pmdImFHm+w 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

VNRCA5te9)rfi-H#qDSgTa`D`~IX2NB+-%hw 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 buh5(!;DI~HwT(i+uXg|%c%)MR