updatemanager.cpp
来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 329 行
CPP
329 行
//--------------------------------------------------------------------------------// // Filename : UpdateManager.cpp// Written By : Reiot// //--------------------------------------------------------------------------------// include files#include "UpdateManager.h"#include "Assert.h"#include "Socket.h"#include "SocketOutputStream.h"//--------------------------------------------------------------------------------// constructor//--------------------------------------------------------------------------------UpdateManager::UpdateManager () throw (): m_pResourceManager(NULL){}//--------------------------------------------------------------------------------// destructor//--------------------------------------------------------------------------------UpdateManager::~UpdateManager () throw (){ // delete all update while ( !m_Updates.empty() ) { Update * pUpdate = m_Updates.front(); delete pUpdate; m_Updates.pop_front(); } // delete resource manager if ( m_pResourceManager != NULL ) { delete m_pResourceManager; m_pResourceManager = NULL; }} //--------------------------------------------------------------------------------// load from update file//--------------------------------------------------------------------------------void UpdateManager::load ( const string & filename ) throw ( Error ){ __BEGIN_TRY ifstream ifile( filename.c_str() , ios::in | ios::binary | ios::nocreate ); if ( !ifile ) { StringStream msg; msg << "cannot open " << filename << " with read mode"; throw Error(msg.toString()); } //-------------------------------------------------------------------------------- // read #Updates //-------------------------------------------------------------------------------- WORD size; ifile.read( (char *)&size , szWORD ); //-------------------------------------------------------------------------------- // read each recource //-------------------------------------------------------------------------------- for ( int i = 0 ; i < size ; i ++ ) { Update * pUpdate = new Update(); pUpdate->load( ifile ); push_back( pUpdate ); } cout << "filename = " << filename.c_str() << " num = " << size << endl; ifile.close(); __END_CATCH}//--------------------------------------------------------------------------------// save to update file//--------------------------------------------------------------------------------void UpdateManager::save ( const string & filename ) const throw ( Error ){ __BEGIN_TRY ofstream ofile( filename.c_str() , ios::out | ios::binary | ios::noreplace ); if ( !ofile ) { StringStream msg; msg << "cannot open " << filename << " with write mode"; throw Error(msg.toString()); } //-------------------------------------------------------------------------------- // write #Update //-------------------------------------------------------------------------------- WORD size = m_Updates.size(); ofile.write( (const char *)&size , szWORD ); for ( list< Update * >::const_iterator itr = m_Updates.begin() ; itr != m_Updates.end() ; itr ++ ) { Update * pUpdate = *itr; pUpdate->save( ofile ); } ofile.close(); __END_CATCH}//--------------------------------------------------------------------------------// read from socket //--------------------------------------------------------------------------------void UpdateManager::read ( Socket * pSocket ) throw ( IOException , Error ){ __BEGIN_TRY //-------------------------------------------------------------------------------- // read #updates //-------------------------------------------------------------------------------- WORD nUpdates; pSocket->receive( &nUpdates , szWORD ); if ( nUpdates > maxUpdates ) throw InvalidProtocolException("too many updates"); for ( int i = 0 ; i < nUpdates ; i ++ ) { Update * pUpdate = new Update(); pUpdate->read( pSocket ); push_back( pUpdate ); } __END_CATCH}//--------------------------------------------------------------------------------// write to socket //--------------------------------------------------------------------------------void UpdateManager::write ( Socket * pSocket ) const throw ( IOException , Error ){ __BEGIN_TRY //-------------------------------------------------------------------------------- // #updates //-------------------------------------------------------------------------------- WORD nUpdates = m_Updates.size(); //cout << "============================================"<< endl; //cout << "诀单捞飘且 亲格狼 肮荐绰 倔付 老鳖夸? : " << (int)nUpdates << endl; //cout << "============================================"<< endl; if ( nUpdates > maxUpdates ) throw InvalidProtocolException("too many updates"); pSocket->send( &nUpdates , szWORD ); //-------------------------------------------------------------------------------- // write each update //-------------------------------------------------------------------------------- for ( list< Update * >::const_iterator itr = m_Updates.begin() ; itr != m_Updates.end() ; itr ++ ) { (*itr)->write( pSocket ); } __END_CATCH}//--------------------------------------------------------------------------------// get resource manager//--------------------------------------------------------------------------------ResourceManager * UpdateManager::getResourceManager () throw ( Error ){ __BEGIN_TRY // 酒流 府家胶概聪历甫 积己窍瘤 臼疽栏哥, 诀单捞飘 府胶飘啊 empty 啊 酒匆 版快 if ( m_pResourceManager == NULL && !m_Updates.empty() ) { // 府家胶 概聪历甫 积己窍磊. m_pResourceManager = new ResourceManager(); Resource * pResource; for ( list< Update * >::const_iterator itr = m_Updates.begin() ; itr != m_Updates.end() ; itr ++ ) { // 绢恫 诀单捞飘 疙飞狼 漂沥 颇扼固磐绰 府家胶甫 唱鸥辰促. // 弊繁 颇扼固磐甫 府家胶 按眉肺 父甸绢辑 府家胶 概聪历俊 殿废矫虐磊. switch ( (*itr)->getUpdateType() ) { // 促澜 疙飞甸俊绰 府家胶啊 粮犁窍瘤 臼绰促. case UPDATETYPE_CREATE_DIRECTORY : case UPDATETYPE_DELETE_DIRECTORY : case UPDATETYPE_RENAME_DIRECTORY : case UPDATETYPE_DELETE_FILE : case UPDATETYPE_RENAME_FILE : break; // param[0] case UPDATETYPE_CREATE_FILE : { pResource = new Resource( (*itr)->getVersion() , (*itr)->getParam(0) ); m_pResourceManager->push_back( pResource ); } break; // param[0], param[2] case UPDATETYPE_APPEND_SPRITE_PACK : { pResource = new Resource( (*itr)->getVersion() , (*itr)->getParam(0) ); m_pResourceManager->push_back( pResource ); pResource = new Resource( (*itr)->getVersion() , (*itr)->getParam(2) ); m_pResourceManager->push_back( pResource ); } break; // param[0], param[2] case UPDATETYPE_DELETE_SPRITE_PACK : { pResource = new Resource( (*itr)->getVersion() , (*itr)->getParam(0) ); m_pResourceManager->push_back( pResource ); pResource = new Resource( (*itr)->getVersion() , (*itr)->getParam(2) ); m_pResourceManager->push_back( pResource ); } break; // param[0], param[1] case UPDATETYPE_UPDATE_SPRITE_PACK : { pResource = new Resource( (*itr)->getVersion() , (*itr)->getParam(0) ); m_pResourceManager->push_back( pResource ); pResource = new Resource( (*itr)->getVersion() , (*itr)->getParam(1) ); m_pResourceManager->push_back( pResource ); } break; // param[0] case UPDATETYPE_APPEND_FRAME_PACK : { pResource = new Resource( (*itr)->getVersion() , (*itr)->getParam(0) ); m_pResourceManager->push_back( pResource ); } break; // param[0] case UPDATETYPE_APPEND_INFO : { pResource = new Resource( (*itr)->getVersion() , (*itr)->getParam(0) ); m_pResourceManager->push_back( pResource ); } break; // param[0] case UPDATETYPE_VERIFY : { pResource = new Resource( (*itr)->getVersion() , (*itr)->getParam(0) ); m_pResourceManager->push_back( pResource ); } break; default : throw Error("invalid update type"); }//switch }//for// cout << "Generating Resource Manager\n" << m_pResourceManager->toString() << endl; }//!empty return m_pResourceManager; __END_CATCH}//--------------------------------------------------------------------------------// get size//--------------------------------------------------------------------------------uint UpdateManager::getSize () const throw (){ uint size = szWORD; // nUpdates for ( list< Update * >::const_iterator itr = m_Updates.begin() ; itr != m_Updates.end() ; itr ++ ) { size += (*itr)->getSize(); } return size;}//--------------------------------------------------------------------------------// get debug string//--------------------------------------------------------------------------------string UpdateManager::toString () const throw (){ StringStream msg; msg << "UpdateManager(\n"; for ( list< Update * >::const_iterator itr = m_Updates.begin() ; itr != m_Updates.end() ; itr ++ ) { msg << (*itr)->toString(); } msg << ")"; return msg.toString();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?