📄 patchi.h
字号:
#include "Patch.h"
#include "../include/MyIniFile.h"
using namespace std;
using namespace Ice;
using namespace Patch;
class subvector
{
public:
void vectortobuf(OUT BYTE *buf,OUT int *buflen,::Patch::ByteSeq ByteSeq)
{
int ByteSeqLen = ByteSeq.size();
for(int i=0;i<ByteSeqLen;i++)
{
buf[i] = ByteSeq[i];
}
*buflen = ByteSeqLen;
}
void buftovector(IN BYTE *buf,IN int buflen,::Patch::ByteSeq& ByteSeq)
{
for(int i=0;i<buflen;i++)
{
ByteSeq.push_back(buf[i]);
}
}
};
class FileHelp
{
public:
FileHelp()
{
hFileSrc = NULL;
memset(strFileName,0,MAX_PATH);
memset(strFileVer,0,MAX_PATH);
memset(pFileMD5,0,16);
}
~FileHelp()
{
}
bool InitFile()
{
if (hFileSrc == NULL)
{
GetFileInfo(strFileName,strFileVer,pFileMD5);
hFileSrc = CreateFile(strFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (INVALID_HANDLE_VALUE ==hFileSrc)
{
return false;
}
}
return true;
}
bool ReInitFile()
{
GetFileInfo(strFileName,strFileVer,pFileMD5);
hFileSrc = CreateFile(strFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (INVALID_HANDLE_VALUE ==hFileSrc)
{
return false;
}
return true;
}
void DeinitFile()
{
if (hFileSrc!=NULL)
{
CloseHandle(hFileSrc);
hFileSrc = NULL;
}
memset(strFileName,0,MAX_PATH);
memset(strFileVer,0,MAX_PATH);
}
BOOL GetFileInfo(CHAR *strPatchPath,CHAR *strFileVer,BYTE *pFileHash)
{
IniFile ini;
CHAR szInst[MAX_PATH] = {0};
if(!GetSystemDirectoryA(szInst, MAX_PATH))
{
return FALSE;
}
strcat(szInst, "\\ProductConsole.ini");
if(!ini.open(szInst))
{
return FALSE;
}
string s = ini.GetProfileValue("[CtrlCenter]","Directory");
DWORD len = s.length();
if((0 == len) || (MAX_PATH < len))
{
return FALSE;
}
memcpy(szInst, s.c_str(), len);
szInst[len] = 0;
if('\\' != szInst[len - 1])
{
szInst[len++] = '\\';
szInst[len] = 0;
}
strcat(szInst,"\\Config.ini");
strcpy(strPatchPath,szInst);
if(!ini.open(strPatchPath))
{
return FALSE;
}
s = ini.GetProfileValue("[Patch]","PatchPath");
len = s.length();
if((0 == len) || (MAX_PATH < len))
{
return FALSE;
}
memset(strPatchPath,0,strlen(strPatchPath));
memcpy(strPatchPath, s.c_str(), len);
strPatchPath[len] = 0;
if('\\' != strPatchPath[len - 1])
{
strPatchPath[len++] = '\\';
strPatchPath[len] = 0;
}
s = ini.GetProfileValue("[Patch]","PatchVer");
len = s.length();
/* 这里没做检查,因为有可能这里没有值
if((0 == len) || (MAX_PATH < len))
{
return FALSE;
}*/
memset(strFileVer,0,strlen(strFileVer));
memcpy(strFileVer,s.c_str(),len);
strFileVer[len] = 0;
s = ini.GetProfileValue("[Patch]","PatchName");
len = s.length();
/* 这里没做检查,因为有可能这里没有值
if((0 == len) || (MAX_PATH < len))
{
return FALSE;
}*/
CHAR strPatchName[MAX_PATH]={0};
memcpy(strPatchName, s.c_str(), len);
strPatchName[len] = 0;
strcat(strPatchPath,strPatchName);
len = strlen(strPatchPath);
for(int i=0;i<len;i++)
{
if (strPatchPath[i]=='\\')
{
strPatchPath[i]='/';
}
}
s = ini.GetProfileValue("[Patch]","MD5Hash");
len = s.length();
if (len!=0)
{
memcpy(pFileHash,s.c_str(),len);
}
return TRUE;
}
bool IsDigits(CHAR *pNumChar)
{
CHAR c;
for (DWORD i=0; i<strlen(pNumChar); i++)
{
c = pNumChar[i];
if (c >= ('0') && c <= ('9'))
{
continue;
}
else
{
return false;
}
}
return true;
}
int CompareVersion(string strFileVer1,string strFileVer2)
{
int wVer1[4], wVer2[4];
int i;
CHAR *fileVer1 = const_cast<CHAR *>(strFileVer1.c_str());
CHAR *fileVer2 = const_cast<CHAR *>(strFileVer2.c_str());
for (i=0; i<4; i++)
{
wVer1[i] = 0;
wVer2[i] = 0;
}
// Get version 1 to DWORDs
CHAR *pToken = strtok(fileVer1,("."));
if (pToken == NULL)
{
return -21;
}
i=3;
while(pToken != NULL)
{
if (i<0 || !IsDigits(pToken))
{
return -21; // Error in structure, too many parameters
}
wVer1[i] = atoi(pToken);
pToken = strtok(NULL,("."));
i--;
}
// Get version 2 to DWORDs
pToken = strtok(fileVer2,("."));
if (pToken == NULL)
{
return -22;
}
i=3;
while(pToken != NULL)
{
if (i<0 || !IsDigits(pToken))
{
return -22; // Error in structure, too many parameters
}
wVer2[i] = atoi(pToken);
pToken = strtok(NULL,("."));
i--;
}
// Compare the versions
for (i=3; i>=0; i--)
{
if (wVer1[i] > wVer2[i])
{
return 1; // ver1 > ver 2
}
else if (wVer1[i] < wVer2[i])
{
return -1; // ver1 < ver2
}
}
return 0; // ver 1 == ver 2
}
public:
HANDLE hFileSrc;
CHAR strFileName[MAX_PATH];
CHAR strFileVer[MAX_PATH];
BYTE pFileMD5[128];
};
class UpdateServerI:virtual public UpdateServer
{
public:
UpdateServerI();
virtual bool Init(const ::Ice::Current& = ::Ice::Current());
virtual bool isUpdate(const ::std::string&, const ::Ice::Current& = ::Ice::Current()) const;
virtual void GetFileInfo(::std::string&, ::Ice::Long&, ::std::string&, ::Patch::ByteSeq&, const ::Ice::Current& = ::Ice::Current());
virtual void GetDataFromFile_async(const ::Patch::AMD_UpdateServer_GetDataFromFilePtr&, ::Ice::Int, const ::Ice::Current& = ::Ice::Current());
virtual bool shutdown(const ::Ice::Current& = ::Ice::Current());
~UpdateServerI();
FileHelp *myFileHelp;
IceUtil::Mutex _updateMutex;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -