int IsoFileWrite(struct IsoFile *file, char *block) { int byteswritten; if (file == NULL) return(-1); if (block == NULL) return(-1); if (file->openforread == 1) return(-1); #ifdef VERBOSE_FUNCTION_ISOFILE PrintLog("CDVD isofile: IsoFileWrite()"); #endif /* VERBOSE_FUNCTION_ISOFILE */ byteswritten = 0; if (file->multi > 0) { byteswritten = MultiFileWrite(file, block); } else if (file->compress > 0) { byteswritten = CompressWrite(file, block); } else { byteswritten = ActualFileWrite(file->handle, file->blocksize, block); if (byteswritten > 0) file->filebytepos += byteswritten; if (byteswritten == file->blocksize) file->filesectorpos++; } // ENDLONGIF- Write to different file? Compressed block? or Raw? if (byteswritten < 0) { #ifdef VERBOSE_FUNCTION_ISOFILE PrintLog("CDVD isofile: Trouble writing the sector!"); #endif /* VERBOSE_FUNCTION_ISOFILE */ return(-1); } // ENDIF- Trouble reading the block? Say so! if (file->filebytepos > file->filebytesize) file->filebytesize = file->filebytepos; if (byteswritten < file->blocksize) { #ifdef VERBOSE_FUNCTION_ISOFILE PrintLog("CDVD isofile: Short block! Wrote %i out of %i bytes", byteswritten, file->blocksize); #endif /* VERBOSE_FUNCTION_ISOFILE */ return(-1); } // ENDIF- Didn't write enough bytes? Say so! if (file->filesectorpos > file->filesectorsize) file->filesectorsize = file->filesectorpos; file->sectorpos++; return(0); } // END IsoFileWrite()
bool ParseReplay(const char *pszFilename, DWORD dwFlags) { // Open replay file FileReader fr; if ( !fr.Open(pszFilename) ) return false; ///////////////////// Header // Read replay resource identifier DWORD dwRepResourceID = 0; // Best guess: "reRS" is "replay RESOURCE" if ( !DecompressRead(&dwRepResourceID, sizeof(dwRepResourceID), fr) || dwRepResourceID != mmioFOURCC('r','e','R','S') ) return errSimple("No Replay resource ID found."); // Read replay resource header if ( !DecompressRead(&replayHeader, sizeof(replayHeader), fr) ) return errSimple("Unable to read replay header."); ////////////////// Actions // Read replay actions section size DWORD dwActionBufferSize = 0; if ( !DecompressRead(&dwActionBufferSize, 4, fr) ) return errSimple("Unable to read actions size."); // Allocate and Read replay actions void *pActionBuffer = malloc(dwActionBufferSize); FileReader frActions(pActionBuffer, dwActionBufferSize); if ( dwActionBufferSize && !DecompressRead(pActionBuffer, dwActionBufferSize, fr) ) return errSimple("Decompressing actions failed."); /////////////////// Map Chk // get map chunk data size DWORD dwChkBufferSize = 0; if ( !DecompressRead(&dwChkBufferSize, 4, fr) ) return errSimple("Unable to read chk size."); // Allocate and Read chk data void *pChkBuffer = malloc(dwChkBufferSize); //FileReader frChk(pChkBuffer, dwChkBufferSize); if ( dwChkBufferSize && !DecompressRead(pChkBuffer, dwChkBufferSize, fr) ) return errSimple("Decompressing map failed."); // Write extracted replay data if ( dwFlags & RFLAG_EXTRACT ) { WriteBuffer("%s.hdr", pszFilename, &replayHeader, sizeof(replayHeader)); WriteBuffer("%s.act", pszFilename, pActionBuffer, dwActionBufferSize); WriteBuffer("%s.chk", pszFilename, pChkBuffer, dwChkBufferSize); } // parse data for repair if ( dwFlags & RFLAG_REPAIR ) { // Parse replay actions ParseActions(frActions); if ( replayHeader.dwFrameCount < g_dwHighestFrame ) { char szTmp[256]; sprintf(szTmp, "Fixed replay with %u frames. Desired: %u frames.", replayHeader.dwFrameCount, g_dwHighestFrame); MessageBox(NULL, szTmp, "Fixed", 0); //replayHeader.dwFrameCount = g_dwHighestFrame + 10; } FileWriter fw; fw.Open(pszFilename); // write rep resource id dwRepResourceID = mmioFOURCC('r','e','R','S'); CompressWrite(&dwRepResourceID, sizeof(dwRepResourceID), fw); // write header CompressWrite(&replayHeader, sizeof(replayHeader), fw); // write actions CompressWrite(&dwActionBufferSize, sizeof(dwActionBufferSize), fw); if ( dwActionBufferSize ) CompressWrite(pActionBuffer, dwActionBufferSize, fw); // write chk CompressWrite(&dwChkBufferSize, sizeof(dwChkBufferSize), fw); if ( dwChkBufferSize ) CompressWrite(pChkBuffer, dwChkBufferSize, fw); } return true; }