⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 patchi.cpp

📁 ice中间件 文件传输原代码 更新为服务形式
💻 CPP
字号:
#include "stdafx.h"
#include <Ice/Ice.h>
#include "PatchI.h"
#include "MD5.h"

UpdateServerI::UpdateServerI()
{
	myFileHelp = new FileHelp;
}

UpdateServerI::~UpdateServerI()
{
   delete myFileHelp;
}

bool UpdateServerI::Init(const ::Ice::Current& cur)
{
   myFileHelp->DeinitFile();
   bool bRet = myFileHelp->InitFile(); 
   return bRet;
}

bool UpdateServerI::isUpdate(const ::std::string& curFileVer, const ::Ice::Current&) const
{
	if (0==strlen(myFileHelp->strFileVer)) 
	{
		if (!myFileHelp->InitFile()) {
			return false;
		}
	}
    int iRet = myFileHelp->CompareVersion(curFileVer,myFileHelp->strFileVer);
    if (iRet<0) 
	{
		return false;
    }
	return true;
}

void UpdateServerI::GetFileInfo(::std::string& fileName, ::Ice::Long& fileSize, ::std::string& updateVersion, ::Patch::ByteSeq& pFileHash, const ::Ice::Current&)
{
	CHAR strFileName[MAX_PATH] = {0};
	myFileHelp->GetFileName(myFileHelp->strFileName,myFileHelp->strFileVer);
	fileName = myFileHelp->strFileName;
	if (NULL == myFileHelp->hFileSrc) 
	{
       if (!myFileHelp->InitFile()) 
	   {
		   return;
       }
	}
	fileSize = GetFileSize(myFileHelp->hFileSrc,NULL);
}

void UpdateServerI::GetDataFromFile_async(const ::Patch::AMD_UpdateServer_GetDataFromFilePtr& amdPtr, ::Ice::Int iFilePos,const ::Ice::Current& /* = ::Ice::Current */)
{
	BYTE *pNewBuf = NULL;
	BYTE *pHashValue = NULL;
	::Patch::ByteSeq myByteSeq;
	::Patch::ByteSeq myHashValue;
	::Ice::Int iReadSize = 0;
	subvector subv;
	bool bRet = true;
	unsigned char   md5[16] = {0};
	unsigned long dwReadSizeOut, dwTotalReadSize = 0;
	if (myFileHelp->hFileSrc==NULL) 
	{
		if (!myFileHelp->InitFile()) {
			myException ex;
			ex.iErrCode = -1;
			ex.errDescription = "打开文件失败!";
			throw ex;
			// 这里返回文件打开的错误
		}
	}
	pNewBuf = new BYTE[4096];
	
	if (NULL==pNewBuf) {
		bRet = 0; 
		myException ex;
		ex.iErrCode = -1;
		ex.errDescription = "内存不足,无法分配内存";
		throw ex;
	}	
	memset(pNewBuf,0,4096);
	SetFilePointer(myFileHelp->hFileSrc,iFilePos*4096,0,FILE_BEGIN);
	bRet = ReadFile(myFileHelp->hFileSrc,pNewBuf,4096,&dwReadSizeOut,NULL);
	
	iReadSize = dwReadSizeOut;
	if ((true==bRet)&&(iReadSize==4096)) 
	{
		MD5(pNewBuf,4096,md5);
		subv.buftovector(pNewBuf,dwReadSizeOut,myByteSeq);
		subv.buftovector(md5,16,myHashValue);
	}
	else if ((true==bRet)&&(iReadSize<4096)) 
	{ // 表示文件已经读取完毕
		MD5(pNewBuf,iReadSize,md5);
		subv.buftovector(pNewBuf,dwReadSizeOut,myByteSeq);
		subv.buftovector(md5,16,myHashValue);
	}
	{
		if (!bRet)
		{
			CloseHandle(myFileHelp->hFileSrc);	
			myFileHelp->hFileSrc = NULL;
			delete pNewBuf;
			pNewBuf = NULL;
			amdPtr->ice_response(myByteSeq,myHashValue,0);
			myException ex;
			ex.iErrCode = -2;
			ex.errDescription = "读取文件失败";
			throw ex;
			// 这里返回读取文件失败的错误
		}			
	} 
	delete pNewBuf;
	pNewBuf = NULL;
	amdPtr->ice_response(myByteSeq,myHashValue,iReadSize);
	// 这里返回文件成功    
	return ;
}

bool UpdateServerI::shutdown(const ::Ice::Current& cur)
{
	cur.adapter->getCommunicator()->shutdown();
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -