All pastes #405140 Raw Edit

Mine

public text v1 · immutable
·published 2007-03-21 15:10 UTC
rendered paste body
TPatchStatus __fastcall TMainForm::PatchFile(std::string Filename)
{
 Application->ProcessMessages();

 if(Cancel)
	return tpsUnknownError;

 //Get just File Name
 std::string File = ExtractFileName(Filename.c_str()).c_str();
 std::string Dir = ExtractFilePath(Filename.c_str()).c_str();

 //Make sure File Exists
 if(!FileExists(Filename.c_str()))
 {
	std::string Reason = "File Not Found!";
	std::string Msg = "IWad Patcher cannot Patch the IWad \'"+File+"\' - "+Reason;

	//Add Event
	AddStatusItem("Patch Failure - "+Reason);

	xMessageBox(NULL, Msg.c_str(), "Cannot Patch IWad!", MB_OK|MB_ICONERROR);

	//Return Failure
	return tpsFileNotFound;
 }

 //Add Event
 AddStatusItem("Creating Backup File...");

 //Create backup
 int Status = Copy_File(Filename, Dir+"backup_"+File);

 //Make sure everything went OK
 if(Status > 0 && Status != 2)
 {
	std::string Reason = "Error Creating Backup File!";
	std::string Msg = "IWad Patcher cannot Patch the IWad \'"+File+"\' - "+Reason;

        //Add Event
	AddStatusItem("Patch Failure - "+Reason);

	xMessageBox(NULL, Msg.c_str(), "Cannot Patch IWad!", MB_OK|MB_ICONERROR);

	//Return Failure
	return tpsUnknownError;
 }

 //Add Event
 AddStatusItem("Detecting IWad Version...");

 //Detect IWad
 TIWadFile IWad;
 Status = GetIWad(Filename, IWad);

 //MD5 Error
 if(Status == 2)
 {
	std::string Reason = "Error Calculating IWad MD5!";
	std::string Msg = "IWad Patcher cannot Patch the IWad \'"+File+"\' - "+Reason;

        //Add Event
	AddStatusItem("Patch Failure - "+Reason);

	xMessageBox(NULL, Msg.c_str(), "Cannot Patch IWad!", MB_OK|MB_ICONERROR);

	//Return Failure
	return tpsErrorMD5;
 }
 //Unknown IWad
 else if(Status == 1)
 {
	std::string Reason = "Unknown IWad!";
	std::string Msg = "IWad Patcher cannot Patch the IWad \'"+File+"\' - "+Reason;

        //Add Event
	AddStatusItem("Patch Failure - "+Reason);

	xMessageBox(NULL, Msg.c_str(), "Cannot Patch IWad!", MB_OK|MB_ICONERROR);

	//Return Failure
	return tpsUnknownIWad;
 }

 //Add Event
 AddStatusItem(IWad.Name+" v"+IWad.Version);

 //Is it already latest version?
 if(IWad.Version.compare(IWad.LatestVer) == 0)
 {
	//Add Event
	AddStatusItem("No patching required, at latest version.");

	return tpsLatest;
 }

 //Does it have an Upgrade Path?
 if(IWad.UpgradePath.empty())
 {
 	std::string Reason = "No Patch Available!";
 	std::string Msg = "IWad Patcher cannot Patch the IWad \'"+File+"\' - "+Reason;

        //Add Event
	AddStatusItem("Patch Failure - "+Reason);

 	xMessageBox(NULL, Msg.c_str(), "Cannot Patch IWad!", MB_OK|MB_ICONINFORMATION);

 	//Return Failure
 	return tpsNoUpgrade;
 }

 //Current Version
 std::string CurrentVer=IWad.Version;
 std::string PatchedFile;

 std::vector<std::string> TempPaths;

 int Attempts=0;
 while(CurrentVer.compare(IWad.LatestVer) != 0)
 {
	Application->ProcessMessages();

	if(Cancel)
		return tpsUnknownError;

	//Keep Track of Patch Attempts
 	if(Attempts > 10)
 	{
          	std::string Reason = "Maximum Patch Attempts Reached!";
		std::string Msg = "IWad Patcher cannot Patch the IWad \'"+File+"\' - "+Reason;

		//Add Event
		AddStatusItem("Patch Failure - "+Reason);

 		xMessageBox(NULL, Msg.c_str(), "Cannot Patch IWad!", MB_OK|MB_ICONERROR);

 		//Return Failure
		return tpsUnknownError;
	}

	//Add Event
	AddStatusItem("Extracting Patch Version "+IWad.Version+" to "+IWad.UpgradeTo+"...");

	//Run Patcher
	PatchedFile = RunPatch(Filename, IWad.UpgradePath, IWad.UpgradePatcher, IWad.File);

 	//If Nothing was Patched
 	if(PatchedFile.empty())
	{
		//Return Failure
 		return tpsUnknownError;
	}

	//Add Event
 	AddStatusItem("Checking Patched File...");

	//Detect IWad Again
	std::string OldMD5 = IWad.MD5;
	std::string OldUpgradeTo = IWad.UpgradeTo;
	std::string OldUpgradePath = IWad.UpgradePath;
	Status = GetIWad(PatchedFile, IWad);

	//MD5 Error
	if(Status == 2)
	{
		std::string Reason = "Error Calculating IWad MD5!";
		std::string Msg = "IWad Patcher cannot Patch the IWad \'"+File+"\' - "+Reason;

                //Add Event
		AddStatusItem("Patch Failure - "+Reason);

		xMessageBox(NULL, Msg.c_str(), "Cannot Patch IWad!", MB_OK|MB_ICONERROR);

		//Return Failure
		return tpsErrorMD5;
	}
	//Unknown IWad
	else if(Status == 1)
	{
		std::string Reason = "Patch Failure!";
		std::string Msg = "IWad Patcher cannot Patch the IWad \'"+File+"\' - "+Reason;

                //Add Event
		AddStatusItem("Patch Failure - "+Reason);

		xMessageBox(NULL, Msg.c_str(), "Cannot Patch IWad!", MB_OK|MB_ICONERROR);

		//Return Failure
		return tpsUnknownIWad;
	}

	//If IWad wasnt Patched
	if(IWad.MD5.compare(OldMD5) == 0)
	{
		std::string Reason = "Nothing Patched!";
		std::string Msg = "IWad Patcher cannot Patch the IWad \'"+File+"\' - "+Reason;

		//Add Event
		AddStatusItem("Patch Failure - "+Reason);

		xMessageBox(NULL, Msg.c_str(), "Cannot Patch IWad!", MB_OK|MB_ICONERROR);

		//Return Failure
		return tpsUnknownError;
	}

	//If Patched File's version doesnt match UpgradeTo version
	std::string NVer = GetIWadVer(IWad.MD5);
	if(NVer.compare(OldUpgradeTo) != 0)
	{
		std::string Reason = "Unexpected Version!";
		std::string Msg = "IWad Patcher cannot Patch the IWad \'"+File+"\' - "+Reason;

		//Add Event
		AddStatusItem("Patch Failure - "+Reason);

		xMessageBox(NULL, Msg.c_str(), "Cannot Patch IWad!", MB_OK|MB_ICONERROR);

		//Return Failure
		return tpsUnknownError;
	}

	//Make sure Patched File exists
	if(!FileExists(PatchedFile.c_str()))
	{
		std::string Reason = "Cannot Find Patched File!";
		std::string Msg = "IWad Patcher cannot Patch the IWad \'"+File+"\' - "+Reason;

		//Add Event
		AddStatusItem("Patch Failure - "+Reason);

		xMessageBox(NULL, Msg.c_str(), "Cannot Patch IWad!", MB_OK|MB_ICONERROR);

		//Return Failure
		return tpsUnknownError;
 	}

	//Add Event
	AddStatusItem("Patch Successfull!");

	//Update Current Version
	CurrentVer=IWad.Version;

	//Delete old IWad
	DeleteFile(Filename.c_str());

	//Copy Patched File
	Copy_File(PatchedFile, Filename);

	//Delete Temp File
	DeleteFile(PatchedFile.c_str());

	//Delete Temporary Files
	std::string ExtractedPath = PatchPath+OldUpgradePath+"\\";

	//Add to Temp Paths vector
	TempPaths.push_back(ExtractedPath);

	//Update Patch Attempts
 	Attempts++;
 }

 //Set Current Directory
 SetCurrentDirectory(CurPath.c_str());

 //Remove Temp Paths
 for(unsigned int i=0; i < TempPaths.size(); ++i)
 {
	if(!DeleteDirectory(TempPaths[i].c_str()))
		RemoveDir(TempPaths[i].c_str());
 }

 //Return Success
 return tpsPatched;
}