Esempio n. 1
0
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()
Esempio n. 2
0
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;
}