📄 cubeginupdatehandler.cpp
字号:
//--------------------------------------------------------------------------------//// Filename : CUBeginUpdateHandler.cpp// Written By : Reiot////--------------------------------------------------------------------------------// include files#include "CUBeginUpdate.h"#ifdef __UPDATE_SERVER__ #include <sys/dir.h>// #include <stdio.h>// #include <fcntl.h>// #include <unistd.h> #include "UpdateServerPlayer.h" #include "Properties.h" #include "Upackets/UCUpdateList.h" #include "UpdateServerPlayer.h" #include "UpdateServer.h" // 诀单捞飘 叼泛配府 胶牡 包访 #include <stdio.h> #include <unistd.h> #include <dirent.h> #include <sys/stat.h>#endif/*//--------------------------------------------------------------------------------//// 努扼捞攫飘狼 滚傈 官肺 拉滚傈何磐 弥脚 滚傈鳖瘤狼 府胶飘甫 积己茄 饶,// 阿 滚傈狼 诀单捞飘 疙飞阑 merge 秦辑 弥利拳等 诀单捞飘 疙飞狼 府胶飘甫// 积己秦辑 UCUpdateList 菩哦俊 淬酒 努扼捞攫飘肺 傈价茄促.////--------------------------------------------------------------------------------void CUBeginUpdateHandler::execute ( CUBeginUpdate * pPacket , Player * pPlayer ) throw ( ProtocolException , Error ){ __BEGIN_TRY #ifdef __UPDATE_SERVER__ UpdateServerPlayer * pUpdateServerPlayer = dynamic_cast<UpdateServerPlayer*>(pPlayer); try { //cout << "Client Version : " << pPacket->getVersion() << endl; //-------------------------------------------------------------------------------- // 菩摹 叼泛配府狼 窍困 叼泛配府甸狼 府胶飘甫 积己茄促. // 捞锭 努扼捞攫飘 滚傈焊促 鞍芭唱 撤篮 滚傈篮 公矫秦档 等促. //-------------------------------------------------------------------------------- // 叼泛配府 捞抚狼 府胶飘 list<string> directories; string patchDir = g_pConfig->getProperty("HomeDir") + separator + g_pConfig->getProperty("PatchDir"); //cout << "patchDir = " << patchDir << endl; // 菩摹 叼泛配府甫 坷锹茄促. DIR * pDIR = opendir( patchDir.c_str() ); // 菩摹 叼泛配府啊 绝栏搁 富炉 炔! Assert( pDIR != NULL ); // 菩摹 叼泛配府狼 窍困 叼泛配府(滚傈 叼泛配府)甸阑 佬绢甸牢促. bool sameVersionFound = false; struct dirent * versionDir; while ( ( versionDir = readdir( pDIR ) ) != NULL ) { // 后 浇儿(inode==0)篮 公矫茄促... if ( versionDir->d_ino != 0 ) { // // 滚傈 叼泛配府绰 v + 0栏肺 盲况柳 5磊府 沥荐 巩磊凯肺 登绢 乐促. // ex> v00001/ v00002/ v00003/ ... // string dir = versionDir->d_name; // v 肺 矫累窍瘤 臼绰 窍困 叼泛配府肺绰 "." 苞 ".." 捞 乐促. -_-; if ( dir[0] == 'v' ) { // 滚傈阑 厚背窍扁 困秦辑绰 // 箭磊 何盒阑 胶飘傅栏肺 函券秦辑 促矫 沥荐肺 函券茄促. Version_t version = atoi( dir.substr( 1 , 5 ).c_str() ); if ( version == pPacket->getVersion() ) sameVersionFound = true; if ( version > pPacket->getVersion() ) directories.push_back( dir ); } else //cout << endl; } } closedir( pDIR ); if ( !sameVersionFound ) { throw InvalidProtocolException("invalid client version"); } // 抛胶飘肺 免仿秦夯促. for ( list<string>::iterator itr = directories.begin() ; itr != directories.end() ; itr ++ ) //cout << "Newer Version : " << *itr << endl; //-------------------------------------------------------------------------------- // 弥脚 滚傈 叼泛配府甸阑 八祸窍搁辑, 阿 叼泛配府狼 index.dat 颇老甸阑 肺爹秦辑 // UpdateManager 按眉甫 积己茄促. //-------------------------------------------------------------------------------- UCUpdateList ucUpdateList; UpdateManager * pUpdateManager = ucUpdateList.getUpdateManager();// int i = 0; for ( list<string>::iterator itr = directories.begin() ; itr != directories.end() ; itr ++ ) { // ex> "/home/vs/reiot/data/patch" + "/" + "v00010" + "/" + "index.dat" string filename = patchDir + separator + *itr + separator + "index.dat"; //cout << "try to open " << filename << endl; pUpdateManager->load( filename );// if( i == 12 ) break;// i++; } //cout << pUpdateManager->toString() << endl; pUpdateServerPlayer->sendPacket( &ucUpdateList ); pUpdateServerPlayer->setPlayerStatus( USPS_AFTER_SENDING_UC_UPDATE_LIST ); } catch ( FileNotExistException & fnee ) { throw InvalidProtocolException( fnee.toString() ); }#endif __END_CATCH}*/void CUBeginUpdateHandler::scan_Dir( const string Directory, CUBeginUpdate* pPacket, UpdateManager * pUpdateManager, bool bHttpPatch, bool bUpdaterPatch ) throw( ProtocolException, Error ){#ifdef __UPDATE_SERVER__ DIR * pDIR = opendir( Directory.c_str() ); struct dirent * versionDir; //cout << "Open Dir : " << Directory << endl; while ( ( versionDir = readdir( pDIR ) ) != NULL ) { string vName = versionDir->d_name; if ( versionDir->d_ino != 0 && vName[0] != '.' ) { //cout << "versionDir : " << versionDir->d_name<< endl; string DirectoryName = Directory + "/"; string SubDirectory = DirectoryName + versionDir->d_name; struct stat List; stat( SubDirectory.c_str(), &List ); //cout << versionDir->d_name << " " << List.st_size << endl; //cout << "Path : " << SubDirectory << " Path Size : " << List.st_size << endl; if( S_ISDIR( List.st_mode ) ) { // 滚傈阑 厚背窍扁 困秦辑绰 // 箭磊 何盒阑 胶飘傅栏肺 函券秦辑 促矫 沥荐肺 函券茄促. Version_t version = atoi( vName.substr( 1 , 5 ).c_str() ); Version_t ClientVersion = pPacket->getVersion() - 3000; if( bUpdaterPatch ) { ClientVersion = (ClientVersion<=46? 1 : 2); } if ( version == ClientVersion ) { //cout << versionDir->d_name << " is Directory " << endl; string SubDirectory = DirectoryName + versionDir->d_name; //cout << "SubDirectory : " << SubDirectory << endl; scan_Dir( SubDirectory, pPacket, pUpdateManager, bHttpPatch, bUpdaterPatch );// //cout << get_current_dir_name() << endl; } } else { //string tempversion = g_pConfig->getProperty("PatchVersion"); //Version_t PatchVersion = atoi( tempversion.c_str() ); //cout << "It is correct file" << endl; StringStream msg1; StringStream msg2; msg1 << versionDir->d_name << " " << List.st_size; if( vName == "AppendPatch.inf" ) { msg2 << "Data\\Info\\" << versionDir->d_name; } else { msg2 << versionDir->d_name; } //cout << " msg1 :" << msg1.toString() << endl; //cout << " msg2 :" << msg2.toString() << endl; Update * pUpdate = new Update(); // ClientVersion栏肺 官厕. by sigi. 2002.10.16 Version_t ClientVersion = pPacket->getVersion(); if (ClientVersion > 3000) ClientVersion -= 3000; pUpdate->setVersion( ClientVersion );//pPacket->getVersion() ); pUpdate->setUpdateType(UPDATETYPE_CREATE_FILE); pUpdate->setParam(0,msg1.toString()); pUpdate->setParam(1,msg2.toString());// pUpdate->setVersion( PatchVersion );// if( pPacket->getVersion() > 1000 ) { if( bHttpPatch ) { srand(time(NULL)); int randomv = rand(); // URL 急沥 累诀....... 棺 绢录备 历录备 int Random = randomv % g_pConfig->getPropertyInt( "MAXURL" ); StringStream ConfigParam; ConfigParam << "URL" << Random; StringStream URL; URL << g_pConfig->getProperty( ConfigParam.toString() ); pUpdate->setParam(5, URL.toString() ); } pUpdateManager->push_back( pUpdate ); } } } closedir( pDIR );#endif}//--------------------------------------------------------------------------------//// 努扼捞攫飘狼 滚傈 官肺 拉滚傈何磐 弥脚 滚傈鳖瘤狼 府胶飘甫 积己茄 饶,// 阿 滚傈狼 诀单捞飘 疙飞阑 merge 秦辑 弥利拳等 诀单捞飘 疙飞狼 府胶飘甫// 积己秦辑 UCUpdateList 菩哦俊 淬酒 努扼捞攫飘肺 傈价茄促.////--------------------------------------------------------------------------------void CUBeginUpdateHandler::execute ( CUBeginUpdate * pPacket , Player * pPlayer ) throw ( ProtocolException , Error ){ __BEGIN_TRY #ifdef __UPDATE_SERVER__ bool bHttpPatch = true; bool bUpdaterPatch = false; // 3000锅 捞惑 滚傈篮 2002.7.12 货滚傈何磐捞促. // 捞傈 滚傈篮 歹 捞惑 蜡瘤窍瘤 臼阑 抗沥捞骨肺 // 3000锅 捞窍绰 楼弗促. if (pPacket->getVersion() < 3000) { throw DisconnectException("under3000"); } /* if( pPacket->getVersion() < 2000 ) { if( pPacket->getVersion () > 1000 ) { bHttpPatch = true; pPacket->setVersion( pPacket->getVersion() - 1000 ); } bUpdaterPatch = true; } else { if (pPacket->getVersion() > 2000) { bHttpPatch = true; pPacket->setVersion( pPacket->getVersion() - 2000 ); } } */ // 3000锅 捞惑篮 公炼扒 HTTP patch捞促. if( bHttpPatch ) { ((UpdateServerPlayer*)pPlayer)->setExpiredTime( 5 ); } // 捞力 咯扁辑 葛电 贸府甫 窍霸 等促. // 辨霸 哎 巴档 绝促. 泅犁 滚怜狼 叼泛配府甫 佬绢辑 弊 救俊 颇老捞 乐栏搁 府胶飘甫 父甸绢 焊郴绊 // 绝栏搁 公矫 窍搁 等促. UpdateServerPlayer * pUpdateServerPlayer = dynamic_cast<UpdateServerPlayer*>(pPlayer); string Directory = g_pConfig->getProperty("HomeDir") + separator + g_pConfig->getProperty("PatchDir"); UCUpdateList ucUpdateList; UpdateManager * pUpdateManager = ucUpdateList.getUpdateManager(); // Info 包访登辑 诀单捞飘甫 窍唱 眠啊茄促. if ( pPacket->getVersion() >= g_pConfig->getPropertyInt("InfoVersion") ) { if ( pPacket->getInfoVersion() < g_pConfig->getPropertyInt("InfoMarkVersion") ) { Update* pUpdate = new Update(); Version_t ClientVersion = pPacket->getVersion(); if (ClientVersion > 3000) ClientVersion -= 3000; pUpdate->setVersion( ClientVersion );//pPacket->getVersion() ); pUpdate->setUpdateType(UPDATETYPE_CREATE_FILE); string infoFileName = "InfoPatch" + g_pConfig->getProperty("InfoMarkVersion"); infoFileName = infoFileName + " 1"; pUpdate->setParam(0, infoFileName); int Random = rand() % g_pConfig->getPropertyInt( "MAXINFOURL" ); StringStream ConfigParam; ConfigParam << "INFOURL" << Random; StringStream URL; URL << g_pConfig->getProperty( ConfigParam.toString() ); pUpdate->setParam(5, URL.toString() ); pUpdateManager->push_back( pUpdate ); } } scan_Dir( Directory, pPacket, pUpdateManager, bHttpPatch, bUpdaterPatch );// WORD version = pPacket->getVersion();// WORD keyver = atoi( g_pConfig->getProperty("KeyVersion").c_str() ); if ( pPacket->getType() == CUBeginUpdate::OLD_UPDATE ) { ucUpdateList.setOld(true); } else { ucUpdateList.setOld(false); string KeyFileName = Directory + "/../" + g_pConfig->getProperty("KeyFile"); FILE* pKeyFile = fopen( KeyFileName.c_str(), "r" ); if ( pKeyFile == NULL ) { filelog("UpdateServerError.log", "虐 颇老捞 绝绢夸."); throw Error("虐 颇老捞 绝娇寸 ぬ.ば"); } fread( (void*)ucUpdateList.getKeyArray(), szBYTE, 10, pKeyFile ); fclose( pKeyFile ); if ( pPacket->getType() == CUBeginUpdate::ONE_VERSION_KEY_BACK ) ucUpdateList.setFront( false ); else { ucUpdateList.setFront( true ); Update* pUpdate = new Update(); Version_t ClientVersion = pPacket->getVersion(); if (ClientVersion > 3000) ClientVersion -= 3000; pUpdate->setVersion( ClientVersion );//pPacket->getVersion() ); pUpdate->setUpdateType(UPDATETYPE_CREATE_FILE); WORD lastGuildMarkVersion = g_pConfig->getPropertyInt("LastGuildMarkVersion"); string guildFileName = "Guild"; if ( lastGuildMarkVersion > pPacket->getGuildVersion() ) guildFileName = guildFileName + itos( lastGuildMarkVersion ) + ".txt" + " 1"; else guildFileName = guildFileName + itos( pPacket->getGuildVersion() ) + ".txt" + " 1"; pUpdate->setParam(0, guildFileName); pUpdate->setParam(5, g_pConfig->getProperty("GUILDURL")); if ( pPacket->getGuildVersion() > 0 && pPacket->getGuildVersion() < g_pConfig->getPropertyInt("GuildMarkVersion") && ClientVersion > g_pConfig->getPropertyInt("StartGuildVersion") ) pUpdateManager->push_back( pUpdate ); } } //cout << pUpdateManager->toString() << endl; pUpdateServerPlayer->sendPacket( &ucUpdateList ); pUpdateServerPlayer->setPlayerStatus( USPS_AFTER_SENDING_UC_UPDATE_LIST );#endif __END_CATCH}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -