CmtFileBase* CmtFat::FileCreate( cpchar fname, int32 msMode ) { FatDirEntry1x *ptr = 0; CmtFileBase *file = 0; devLock(); if( msMode & CMT_CREATE_WRITE ) { //Открыть для записи ptr = FindFile( fname ); //Если уже существует, то удалить файл if( ptr && (msMode & CMT_FILE_RESET) ) { DeleteFileEntry( ptr ); ptr = 0; } //Создать новый файл if( ptr == 0 ) ptr = CreateFileName( fname ); } else if( msMode & CMT_CREATE_READ ) { //Открыть для чтения ptr = FindFile( fname ); } if( ptr ) { //Файл найден file = new CmtFatFile( this, ptr, msMode ); } devUnLock(); return file; }
bool WINAPI SFileRemoveFile(HANDLE hMpq, const char * szFileName, DWORD dwSearchScope) { TMPQArchive * ha = IsValidMpqHandle(hMpq); TMPQFile * hf = NULL; int nError = ERROR_SUCCESS; // Keep compiler happy dwSearchScope = dwSearchScope; // Check the parameters if(ha == NULL) nError = ERROR_INVALID_HANDLE; if(szFileName == NULL || *szFileName == 0) nError = ERROR_INVALID_PARAMETER; if(IsInternalMpqFileName(szFileName)) nError = ERROR_INTERNAL_FILE; // Do not allow to remove files from read-only or patched MPQs if(nError == ERROR_SUCCESS) { if((ha->dwFlags & MPQ_FLAG_READ_ONLY) || (ha->haPatch != NULL)) nError = ERROR_ACCESS_DENIED; } // If all checks have passed, we can delete the file from the MPQ if(nError == ERROR_SUCCESS) { // Open the file from the MPQ if(SFileOpenFileEx(hMpq, szFileName, SFILE_OPEN_BASE_FILE, (HANDLE *)&hf)) { // Delete the file entry nError = DeleteFileEntry(ha, hf); FreeFileHandle(hf); } else nError = GetLastError(); } // If the file has been deleted, we need to invalidate // the internal files and recreate HET table if(nError == ERROR_SUCCESS) { // Invalidate the entries for internal files // After we are done with MPQ changes, we need to re-create them anyway InvalidateInternalFiles(ha); // // Don't rebuild HET table now; the file's flags indicate // that it's been deleted, which is enough // } // Resolve error and exit if(nError != ERROR_SUCCESS) SetLastError(nError); return (nError == ERROR_SUCCESS); }
int32 CmtFat::FileDelete( cpchar fname ) { devLock(); FatDirEntry1x *ptr = FindFile( fname ); //Если уже существует, то удалить файл if( ptr ) { DeleteFileEntry( ptr ); devUnLock(); return CMTE_OK; } devUnLock(); return CMTE_FS_NO_FILE; }
int SFileAddFile_Finish(TMPQFile * hf) { TMPQArchive * ha = hf->ha; TFileEntry * pFileEntry = hf->pFileEntry; int nError = hf->nAddFileError; // If all previous operations succeeded, we can update the MPQ if(nError == ERROR_SUCCESS) { // Verify if the caller wrote the file properly if(hf->pPatchInfo == NULL) { assert(pFileEntry != NULL); if(hf->dwFilePos != pFileEntry->dwFileSize) nError = ERROR_CAN_NOT_COMPLETE; } else { if(hf->dwFilePos != hf->pPatchInfo->dwDataSize) nError = ERROR_CAN_NOT_COMPLETE; } } // Now we need to recreate the HET table, if exists if(nError == ERROR_SUCCESS && ha->pHetTable != NULL) { nError = RebuildHetTable(ha); } // Update the block table size if(nError == ERROR_SUCCESS) { // Call the user callback, if any if(ha->pfnAddFileCB != NULL) ha->pfnAddFileCB(ha->pvAddFileUserData, hf->dwDataSize, hf->dwDataSize, true); } else { // Free the file entry in MPQ tables if(pFileEntry != NULL) DeleteFileEntry(ha, hf); } // Clear the add file callback FreeFileHandle(hf); return nError; }