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 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; }