LTBOOL CGameButeMgr::Parse(ILTCSBase *pInterface, const char* sButeFile) { // Sanity checks... if (!sButeFile) return(LTFALSE); BOOL bRet = TRUE; // NOTE!!! When _REZFILE is defined, this code will need to be // updated to support being called from DEdit!!!! // (from a IObjectPlugin::PreHook_EditStringList() call)... #if !defined(_REZFILE) // If we're going to allow the bute file to be saved by the game, it must // be read in from a file (not a .rez file)... // Append the NOLF directory onto the filename if this file is normally // stored in the .rez file... if (m_bInRezFile) { m_strAttributeFile.Format("NOLF\\%s", sButeFile); } else { m_strAttributeFile.Format("%s", sButeFile); } if (m_pCryptKey) { bRet = m_buteMgr.Parse(m_strAttributeFile, m_pCryptKey); } else { bRet = m_buteMgr.Parse(m_strAttributeFile); } return bRet; #endif // !_REZFILE m_strAttributeFile = sButeFile; // Open the file... char sConstFile[256]; strncpy(sConstFile, sButeFile, 255); ILTStream* pDStream; LTRESULT dr = pInterface->OpenFile(sConstFile, &pDStream); if (dr != LT_OK) { char sError[512]; sprintf(sError,"ERROR CGameButeMgr couldn't open file %s!",sButeFile); GBM_DisplayError(sError); #ifdef _CLIENTBUILD g_pLTClient->ShutdownWithMessage(sError); #endif return(FALSE); } // Read the file... unsigned long uLen = pDStream->GetLen(); char* pData = debug_newa(char, uLen); if (!pData) { pDStream->Release(); GBM_DisplayError("CGameButeMgr couldn't allocate data for stream."); return(FALSE); } pDStream->Read(pData, uLen); // Parse the file... if (m_pCryptKey) { bRet = m_buteMgr.Parse(pData, uLen, m_pCryptKey); } else { bRet = m_buteMgr.Parse(pData, uLen); } // Clean up... pDStream->Release(); debug_deletea(pData); // Check for an error... if (!bRet) { TRACE("CGameButeMgr::Parse() ERROR!\n"); return(FALSE); } // All done... return(TRUE); }
LTBOOL CGameButeMgr::Parse(const char* sButeFile) { // Sanity checks... if (!sButeFile) return(LTFALSE); BOOL bRet = TRUE; //if there is no g_pLTBase, then we can't read from the stream if (!g_pLTBase || !m_bInRezFile) { // Append the GAME directory onto the filename if this file is normally // stored in the .rez file... if (m_bInRezFile) { m_strAttributeFile.Format("Game\\%s", sButeFile); } else { m_strAttributeFile.Format("%s", sButeFile); } if (m_pCryptKey) { bRet = m_buteMgr.Parse(m_strAttributeFile, m_pCryptKey); } else { bRet = m_buteMgr.Parse(m_strAttributeFile); } return bRet; } // Open the file... m_strAttributeFile = sButeFile; ILTStream* pDStream = LTNULL; LTRESULT dr = g_pLTBase->OpenFile(m_strAttributeFile, &pDStream); if (dr != LT_OK || !pDStream) { char sError[512]; sprintf(sError,"ERROR CGameButeMgr couldn't open file %s!",m_strAttributeFile); GBM_DisplayError(sError); #ifdef _CLIENTBUILD g_pLTClient->ShutdownWithMessage(sError); #endif return(FALSE); } // Read the file... unsigned long uLen = pDStream->GetLen(); char* pData = debug_newa(char, uLen); if (!pData) { pDStream->Release(); GBM_DisplayError("ERROR CGameButeMgr couldn't allocate data for stream."); return(FALSE); } pDStream->Read(pData, uLen); // Setup the save file name. This is for saving the attribute file from // the game and is ONLY used during development... CString strSaveFilename = ""; #ifndef _FINAL strSaveFilename = sButeFile; if (m_bInRezFile) { strSaveFilename.Format("Game\\%s", sButeFile); } #endif // _FINAL // Parse the file... if (m_pCryptKey) { bRet = m_buteMgr.Parse(pData, uLen, m_pCryptKey, strSaveFilename); } else { bRet = m_buteMgr.Parse(pData, uLen, 0, strSaveFilename); } // Clean up... pDStream->Release(); debug_deletea(pData); // Check for an error... if (!bRet) { TRACE("ERROR CGameButeMgr::Parse() (%s)!\n", sButeFile); return(FALSE); } // All done... return(TRUE); }
STDMETHODIMP CLTDMFileStream::Seek( LARGE_INTEGER dlibMove, unsigned long dwOrigin, ULARGE_INTEGER* plibNewPosition ) { #ifdef USE_DSTREAM // make sure our file item pointer is valid if (m_pOpenQueueItem == NULL) { return E_FAIL; } // make sure the file is open and get a pointer to the ILTStream ILTStream* pLTStream = m_pOpenQueueItem->LockDStream(); if (pLTStream == LTNULL) { return E_FAIL; } // current position in an item DWORD nSeekPos; // figure out the seek position relative to the origin if (dwOrigin == SEEK_SET) { nSeekPos = dlibMove.LowPart; } else { // relative to current position if (dwOrigin == SEEK_CUR) { LARGE_INTEGER nCurPos; if (pLTStream->GetPos((uint32*)&nCurPos.LowPart) != LT_OK) { m_pOpenQueueItem->UnLockDStream(); return E_FAIL; } nCurPos.HighPart = 0; LARGE_INTEGER nNewPos; nNewPos.QuadPart = nCurPos.QuadPart + dlibMove.QuadPart; nSeekPos = nNewPos.LowPart; // we don't need to seek if we didn't ask to move anywhere if (dlibMove.QuadPart == 0) { // set the return current position if it was not NULL if( plibNewPosition != NULL ) { plibNewPosition->QuadPart = nCurPos.QuadPart; } m_pOpenQueueItem->UnLockDStream(); return S_OK; } } else { if (dwOrigin == SEEK_END) { LARGE_INTEGER nSize; pLTStream->GetLen((uint32*)&nSize.LowPart); nSize.HighPart = 0; LARGE_INTEGER nNewPos; nNewPos.QuadPart = nSize.QuadPart + dlibMove.QuadPart; nSeekPos = nNewPos.LowPart; } else { // unknown origin we must fail m_pOpenQueueItem->UnLockDStream(); return E_FAIL; } } } // do the seek if (pLTStream->SeekTo(nSeekPos) != LT_OK) { // return fail if we failed m_pOpenQueueItem->UnLockDStream(); return E_FAIL; } // set the return current position if it was not NULL if( plibNewPosition != NULL ) { pLTStream->GetPos((uint32*)&plibNewPosition->LowPart); if( dlibMove.LowPart < 0 ) { plibNewPosition->HighPart = (uint32)-1; } else { plibNewPosition->HighPart = 0; } } // everything worked so we return successful m_pOpenQueueItem->UnLockDStream(); return S_OK; #endif #ifdef USE_REZMGR // if the loader doesn't exist fail if (m_pLoader == NULL) { LTDMConOutError("LTDirectMusic loader failed to seek from file because no directmusic loader exists\n"); return E_FAIL; } m_pLoader->EnterRezMgrCriticalSection(); // if the rezmgr is not open if (!m_pLoader->GetRezMgr()->IsOpen()) { LTDMConOutError("LTDirectMusic loader failed to seek from file because rez file was not open\n"); m_pLoader->LeaveRezMgrCriticalSection(); return E_FAIL; } // current position in an item DWORD nSeekPos; // figure out the seek position relative to the origin if (dwOrigin == SEEK_SET) { nSeekPos = dlibMove.LowPart; } else { // relative to current position if (dwOrigin == SEEK_CUR) { LARGE_INTEGER nCurPos; nCurPos.LowPart = m_nCurPos;; nCurPos.HighPart = 0; LARGE_INTEGER nNewPos; nNewPos.QuadPart = nCurPos.QuadPart + dlibMove.QuadPart; nSeekPos = nNewPos.LowPart; } else { if (dwOrigin == SEEK_END) { LARGE_INTEGER nSize; nSize.LowPart = m_pRezItem->GetSize(); nSize.HighPart = 0; LARGE_INTEGER nNewPos; nNewPos.QuadPart = nSize.QuadPart + dlibMove.QuadPart; nSeekPos = nNewPos.LowPart; } else { // unknown origin we must fail LTDMConOutError("LTDirectMusic failed to seek in file %s invalid seek origin\n",m_pRezItem->GetName()); m_pLoader->LeaveRezMgrCriticalSection(); return E_FAIL; } } } // do the seek m_nCurPos = nSeekPos; // set the return current position if it was not NULL if( plibNewPosition != NULL ) { plibNewPosition->LowPart = m_nCurPos; plibNewPosition->HighPart = 0; } // everything worked so we return successful m_pLoader->LeaveRezMgrCriticalSection(); return S_OK; #endif #ifdef USE_FILE // fseek can't handle a LARGE_INTEGER seek... long lOffset; lOffset = dlibMove.LowPart; int i = fseek( m_pFile, lOffset, dwOrigin ); if( i ) { return E_FAIL; } if( plibNewPosition != NULL ) { plibNewPosition->LowPart = ftell( m_pFile ); if( lOffset < 0 ) { plibNewPosition->HighPart = -1; } else { plibNewPosition->HighPart = 0; } } return S_OK; #endif }