#pragma once //============================================================================================================================= /// ScriptDataManager class /** @author Lee Eun-pa @since 2006. 08. 23 @remark - ¼­¹öº° Script Data µéÀ» ÇѰ÷¿¡¼­ °ü¸®Çϱâ À§ÇÑ Å¬·¡½º @note - ¼­¹öº°·Î Script Data¸¦ ·ÎµåÇÏ´Â °ÍÀÌ Æ²¸®°í ÀÌ·¯ÇÑ µ¥ÀÌÅ͸¦ Àü¼Û¹Þ´Â ÇüÅ¿¡¼­ ÇÊ¿äÇϱ⠶§¹® @history - */ //============================================================================================================================= #include #include typedef DWORD eSCRIPT_DATA_CMD; struct SCRIPT_DATA_CMD { // CMD [OUT] static const eSCRIPT_DATA_CMD GET = 0x00000001; // CMD [IN] static const eSCRIPT_DATA_CMD SET = 0x00000002; // MASK static const eSCRIPT_DATA_CMD MASK_CMD = GET|SET; struct RANGE { // RANGE static const eSCRIPT_DATA_CMD ALL = 0x00000010; // RANGE static const eSCRIPT_DATA_CMD ONENODE = 0x00000100; // static const eSCRIPT_DATA_CMD MASK = ALL|ONENODE; }; struct BUFFERINFO { // DataStreamCommand static const eSCRIPT_DATA_CMD BUFFER = 0x00001000; // DataStreamCommand static const eSCRIPT_DATA_CMD BUFFER_SIZE = 0x00002000; // static const eSCRIPT_DATA_CMD MASK = BUFFER|BUFFER_SIZE; }; struct STATUS { // DataStatusCommand static const eSCRIPT_DATA_CMD MOVE2EMPTYDATA = 0x00010000; // DataStatusCommand static const eSCRIPT_DATA_CMD MOVE2LOADING = 0x00020000; // DataStatusCommand static const eSCRIPT_DATA_CMD MOVE2LOADED = 0x00040000; // static const eSCRIPT_DATA_CMD MASK = MOVE2EMPTYDATA|MOVE2LOADING|MOVE2LOADED; }; // static const eSCRIPT_DATA_CMD MASK_DATASTREAM_CMD = MASK_CMD|BUFFERINFO::MASK; // static const eSCRIPT_DATA_CMD MASK_DATASTATUS_CMD = MASK_CMD|RANGE::MASK|STATUS::MASK; }; typedef STLX_LIST SCRIPT_LIST; typedef SCRIPT_LIST::iterator SCRIPT_LIST_IT; class ScriptDataManager { public: //MSG_SM_DATA_TRANSFER_SENDDATA_CMD::SEND_INFO_TOKEN_INFO::MAX_SENDDATA_CMD_SEND_INFO_TOKEN_SIZE //ÀÇ °ª°ú µ¿ÀÏÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¼öÁ¤ÇÒ °Í static const DWORD c_dwMaxTokenSize = 4000; public: // // // // sSCRIPT_DATA_INFO_NODE pList = // { // SCRIPT_DATA_INFO_SET( ScriptCode, Parser*, ), // SCRIPT_DATA_INFO_SET( GroupParser::ScriptCode, GroupParser::Instance(), ), // . // . // . // SCRIPT_DATA_INFO_SET_EMPTY(), // }; // ScriptDataManager::RegisterDataList( pList ); // static BOOL RegisterDataList( sSCRIPT_DATA_INFO_NODE* pInfoList ); // // ¾ÆÁ÷ µ¥ÀÌÅÍ ·ÎµùÀÌ ¿Ï·áµÇÁö ¾ÊÀº »óȲ¿¡¼­ ³×Æ®¿öÅ©°¡ ´ÜÀýµÇ°Å³ª ÇÏ´Â »óȲÀÌ »ý±â¸é, // LOADING »óÅ¿¡ Á¸ÀçÇÏ´Â ¸ñ·ÏµéÀ» ã¾Æ¼­ ´Ù½Ã EMPTY·Î µ¹·ÁÁà¾ß ÇÏ´Â »óȲÀÌ »ý±ä´Ù. // »õ·Ó°Ô ½ÃÀÛÇÏ´Â °æ¿ì´Â ½Å°æ¾²Áö ¾Ê¾Æµµ µÇÁö¸¸, °è¼Ó µ¿ÀÛÁßÀÎ °æ¿ì¿¡ ´ëÇØ¼­ ÀÌ ¹®Á¦´Â // ÃæºÐÈ÷ »ý±æ ¼ö ÀÖ´Ù. static BOOL ReRegisterReloadDataList(); static BOOL IsLoadedData( eSCRIPT_CODE scriptCode ); static BOOL IsAllDataLoaded(); // // ProcessLoadedDataÀº ¿ÜºÎ ÀÎÅÍÆäÀ̽º·Î º°µµ·Î ÇØ´ç µ¥ÀÌÅ͸¦ ó¸®ÇÏ´Â °æ¿ì¿¡ »ç¿ëÇÑ´Ù // IParser°¡ µî·ÏµÇÁö ¾Ê¾Ò°Å³ª LOADED»óŰ¡ ¾Æ´Ï¸é Ưº°ÇÑ ÀÏÀº ¼öÇàÇÏÁö ¾Ê´Â´Ù. // ¾Æ, ÇѰ¡Áö Ãß°¡ÇÑ´Ù. CRCÈ®ÀÎ... (060826 ÇöÀç, ¹Ì±¸Çö) // // WorkLoadManager¸¦ ÅëÇÑ, µ¥ÀÌÅÍ ÀÔ/Ãâ·Â ¼öÇà ¿Ï·áµÇ¸é, ³»ºÎÀûÀ¸·Î AsyncReloadedDataCallbackÀ» ¼öÇàÇÏ°Ô µÉ °ÍÀÌ´Ù. // AsyncReloadedDataCallbackÀº IParser°¡ Á¸ÀçÇÏ¸é ¼öÇàÇÑ´Ù. // // T : µ¥ÀÌÅÍ ÀÔ/Ãâ·Â ¼öÇà ½ÃÀÛ // F : ÀÌ¹Ì ¼öÇàÁßÀ̰ųª, ±×·² ÇÊ¿ä ¾ø°Å³ª, ¾î¶°ÇÑ ÀÌÀ¯·Î ÀÎÇØ 󸮸¦ ¼öÇàÇÒ ¼ö ¾ø´Â »óȲ static BOOL ProcessLoadedData( eSCRIPT_CODE scriptCode ); static BOOL ProcessAllLoadedData(); static BOOL SaveDataStreamToken( eSCRIPT_CODE scriptCode, DWORD dwTokenNo, DWORD dwTokenSize, BYTE* pSTREAM ); //-------------------------------------------------------------------------------------------------------- // µ¥ÀÌÅÍ ·Îµå°¡ ÇÊ¿äÇÑ °æ¿ì // // µ¥ÀÌÅÍ ·Îµå°¡ ÇÊ¿äÇÑ ½ºÅ©¸³Æ® ¹øÈ£¸¦ ÀÎÀÚ·Î ÇØ¼­ ÇÔ¼ö¸¦ È£ÃâÇØÁØ´Ù.(·çÇÁ) template static VOID ForEach_NeedLoadData( _FN _funcRaw, const _ObjType& _Left ) { std::for_each( _GetEmptyListBegin(), _GetEmptyListEnd(), std::bind1st(std::mem_fun(_funcRaw), _Left) ); } // // µ¥ÀÌÅÍ ·Îµå°¡ ÇÊ¿äÇÑ ½ºÅ©¸³Æ® °³¼ö¸¦ ¹ÝȯÇÑ´Ù. static DWORD GetNeedLoadDataCount(); // //-------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------- // µ¥ÀÌÅÍ ·Îµù ÁßÀÎ °æ¿ì // //-------------------------------------------------------------------------------------------------------- // // (o) CMD::GET | CMD::BUFFER | CMD::BUFFER_SIZE --> ÇöÀç ¼³Á¤µÈ ¹öÆÛÀÇ Æ÷ÀÎÅÍ¿Í ±× Å©±â¸¦ ¹ÝȯÇÑ´Ù. // (o) CMD::GET | CMD::BUFFER_SIZE --> ÇöÀç ¼³Á¤µÈ ¹öÆÛÀÇ Å©±â¸¦ ¹ÝȯÇÑ´Ù. // (o) CMD::GET | CMD::BUFFER --> ÇöÀç ¼³Á¤µÈ ¹öÆÛ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù. (Å©±â Á¤ÀÇ ¾øÀ¸¹Ç·Î ÁÖÀÇÇÒ °Í) // (o) CMD::SET | CMD::BUFFER | CMD::BUFFER_SIZE --> ÁÖ¾îÁø ¹öÆÛ·Î ¼³Á¤ÇÑ´Ù. ±âÁ¸ ¹öÆÛ ÀÖÀ» °æ¿ì Á¦°Å // (x) CMD::SET | CMD::BUFFER // (o) CMD::SET | CMD::BUFFER_SIZE --> CreateBuffer static BOOL DataStreamCommand( eSCRIPT_DATA_CMD cmd, eSCRIPT_CODE scriptCode, BYTE*& rpSTREAM, DWORD& rdwSize ); // »óÅ Àüȯ¸¸ ó¸®ÇÑ´Ù. ÁÖÀÇÇϼ¼¿ë~ // LOADED»óÅ¿¡¼­ IParser¸¦ ¼öÇà½ÃŰ·Á¸é ProcessLoadedData¸¦ »ç¿ëÇØ ó¸®ÇØ¾ß ÇÑ´Ù. static BOOL DataStatusCommand( eSCRIPT_DATA_CMD cmd, eSCRIPT_CODE scriptCode = SCRIPT_EMPTY, eSCRIPT_DATA_CMD* result = NULL ); public: // typedef VOID (*fnAllDataLoaded)(); // // ÀÌ ÇÔ¼ö´Â EMPTY, LOADING»óŰ¡ ¾øÀÌ ¸ðµÎ LOADED»óÅ¿¡ ÀÖÀ» ¶§ È£ÃâÇØ ÁØ´Ù. // ¹ßµ¿ Á¶°Ç, ƯÁ¤ Script°¡ LOADED»óÅ·ΠÀüȯµÉ ¶§ °Ë»çµÇ°í È£ÃâµÈ´Ù. static VOID RegisterCallbackAllDataLoaded( fnAllDataLoaded fnHandler ); private://eSERVER_TYPE ScriptDataManager(); ~ScriptDataManager(); static VOID AsyncReloadedDataCallback( eSCRIPT_CODE scriptCode, BYTE* pSTREAM ); //static VOID ReloadInstruction( eSCRIPT_CODE scriptCode, BYTE* pSTREAM ) static SCRIPT_LIST_IT _GetEmptyListBegin(); static SCRIPT_LIST_IT _GetEmptyListEnd(); static DWORD _GetDataStatus( eSCRIPT_CODE scriptCode ); };