rendered paste bodyTPatchStatus __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;
}