Exemplo n.º 1
0
        private bool PatchUsingIncrementalPatches()
        {
            if (comms.Cancel)
            {
                return(false);
            }

            comms.LogToFile(Localization.Get(StringId.ApplyingIncrementalPatch));

            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.INCREMENTAL_PATCH_INFO_EXTENSION);

                        return(false);
                    }

                    if (incrementalPatch.Files > 0)
                    {
                        if (!comms.DownloadManager.FileExistsAtUrl(comms.VersionInfo.GetDownloadURLFor(incrementalPatch), out fileSize))
                        {
                            FailReason  = PatchFailReason.FileDoesNotExistOnServer;
                            FailDetails = Localization.Get(StringId.E_FileXDoesNotExistOnServer, incrementalPatch.PatchVersion() + PatchParameters.INCREMENTAL_PATCH_FILE_EXTENSION);

                            return(false);
                        }
                        else if (fileSize > 0L && fileSize != incrementalPatch.PatchSize)
                        {
                            FailReason  = PatchFailReason.FileIsNotValidOnServer;
                            FailDetails = Localization.Get(StringId.E_FileXIsNotValidOnServer, incrementalPatch.PatchVersion() + PatchParameters.INCREMENTAL_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);
                }

                IncrementalPatchInfo patchInfo;
                try
                {
                    patchInfo = PatchUtils.DeserializeXMLToIncrementalPatchInfo(patchInfoXML);
                }
                catch (Exception e)
                {
                    comms.LogToFile(e);

                    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;
                patchInfo.CompressionFormat  = incrementalPatch.CompressionFormat;

                incrementalPatchesInfo.Add(patchInfo);

                if (currentVersion > incrementalPatch.FromVersion)
                {
                    continue;
                }

                if (new IncrementalPatchApplier(comms, patchInfo).Run() == PatchResult.Failed)
                {
                    return(false);
                }
            }

            return(true);
        }