private bool PatchUsingIncrementalPatches() { if (comms.Cancel) { return(false); } if (incrementalPatches.Count == 0) { return(false); } if (comms.VerifyFiles) { PatchStage = PatchStage.VerifyingFilesOnServer; for (int i = 0; i < incrementalPatches.Count; i++) { if (comms.Cancel) { return(false); } IncrementalPatch incrementalPatch = incrementalPatches[i]; long fileSize; if (!comms.DownloadManager.FileExistsAtUrl(comms.VersionInfo.GetInfoURLFor(incrementalPatch), out fileSize)) { FailReason = PatchFailReason.FileDoesNotExistOnServer; FailDetails = Localization.Get(StringId.E_FileXDoesNotExistOnServer, incrementalPatch.PatchVersion() + PatchParameters.PATCH_INFO_EXTENSION); return(false); } if (!comms.DownloadManager.FileExistsAtUrl(comms.VersionInfo.GetDownloadURLFor(incrementalPatch), out fileSize)) { FailReason = PatchFailReason.FileDoesNotExistOnServer; FailDetails = Localization.Get(StringId.E_FileXDoesNotExistOnServer, incrementalPatch.PatchVersion() + PatchParameters.PATCH_FILE_EXTENSION); return(false); } else if (fileSize > 0L && fileSize != incrementalPatch.PatchSize) { FailReason = PatchFailReason.FileIsNotValidOnServer; FailDetails = Localization.Get(StringId.E_FileXIsNotValidOnServer, incrementalPatch.PatchVersion() + PatchParameters.PATCH_FILE_EXTENSION); return(false); } } } for (int i = 0; i < incrementalPatches.Count; i++) { if (comms.Cancel) { return(false); } IncrementalPatch incrementalPatch = incrementalPatches[i]; string patchInfoXML = comms.DownloadManager.DownloadTextFromURL(comms.VersionInfo.GetInfoURLFor(incrementalPatch)); if (patchInfoXML == null) { FailReason = PatchFailReason.DownloadError; FailDetails = Localization.Get(StringId.E_CouldNotDownloadPatchInfoX, incrementalPatch.PatchVersionBrief()); return(false); } if (PatchInfoVerifier != null && !PatchInfoVerifier(ref patchInfoXML)) { FailReason = PatchFailReason.CantVerifyPatchInfo; FailDetails = Localization.Get(StringId.E_PatchInfoCouldNotBeVerified); return(false); } PatchInfo patchInfo; try { patchInfo = PatchUtils.DeserializeXMLToPatchInfo(patchInfoXML); } catch { FailReason = PatchFailReason.XmlDeserializeError; FailDetails = Localization.Get(StringId.E_InvalidPatchInfoX, incrementalPatch.PatchVersionBrief()); return(false); } patchInfo.FromVersion = incrementalPatch.FromVersion; patchInfo.ToVersion = incrementalPatch.ToVersion; patchInfo.DownloadURL = comms.VersionInfo.GetDownloadURLFor(incrementalPatch); patchInfo.CompressedFileSize = incrementalPatch.PatchSize; patchInfo.CompressedMd5Hash = incrementalPatch.PatchMd5Hash; incrementalPatchesInfo.Add(patchInfo); if (currentVersion > incrementalPatch.FromVersion) { continue; } PatchResult patchResult = new IncrementalPatchApplier(comms, patchInfo).Run(); if (patchResult == PatchResult.Failed) { return(false); } } return(true); }