private void HandleAddedFile(UpdaterDefinitionEntry entry)
        {
            var filePath = PathsManager.Combine(_context.Settings.RootPath, entry.RelativePath);

            var difference      = FileValidityDifference.None;
            var alreadyExisting = FilesManager.Exists(filePath);

            if (alreadyExisting && IsValid(entry, out difference))
            {
                return;
            }

            if (difference.HasFlag(FileValidityDifference.Size))
            {
                if (FilesManager.IsFileLocked(filePath))
                {
                    var newFilePath = FilesManager.GetTemporaryDeletingFileName(filePath);
                    FilesManager.Rename(filePath, newFilePath);
                }
                else
                {
                    FilesManager.Delete(filePath);
                }

                Downloader.Download(_context.Settings.GetRemoteUpdaterFileUrl(entry.RelativePath),
                                    PathsManager.GetDirectoryPath(filePath));

                EnsureDefinition(entry);

                _context.SetDirtyFlag(entry.RelativePath);
            }
            else
            {
                if (!alreadyExisting)
                {
                    Downloader.Download(_context.Settings.GetRemoteUpdaterFileUrl(entry.RelativePath),
                                        PathsManager.GetDirectoryPath(filePath));
                }

                if (FilesManager.IsFileLocked(filePath))
                {
                    var newFilePath = FilesManager.GetTemporaryDeletingFileName(filePath);
                    FilesManager.Rename(filePath, newFilePath);
                    FilesManager.Copy(newFilePath, filePath);
                }

                EnsureDefinition(entry);
            }
        }
Example #2
0
        private void HandleUpdatedFile(PatchDefinitionEntry entry)
        {
            var fromFile      = PathsManager.Combine(_context.Settings.GetGameFolderPath(_context.VersionFrom), entry.RelativePath);
            var toFile        = PathsManager.Combine(_context.Settings.GetGameFolderPath(_context.VersionTo), entry.RelativePath);
            var patchFile     = PathsManager.Combine(_context.Settings.GetPatchesTempFolderPath(), entry.RelativePath + ".patch");
            var signatureFile = PathsManager.Combine(_context.Settings.GetPatchesTempFolderPath(), entry.RelativePath + ".signature");

            DirectoriesManager.Create(PathsManager.GetDirectoryPath(patchFile));

            DeltaFileBuilder.Build(fromFile, toFile, patchFile, signatureFile);

            var path = PathsManager.Combine(_context.Settings.GetGameFolderPath(_context.VersionTo), entry.RelativePath);
            var info = FilesManager.GetFileInfo(path);

            entry.Attributes  = info.Attributes;
            entry.LastWriting = info.LastWriting;
        }
        private void HandleChangedAttributesFile(UpdaterDefinitionEntry entry)
        {
            var filePath = PathsManager.Combine(_context.Settings.RootPath, entry.RelativePath);

            if (!FilesManager.Exists(filePath))
            {
                Downloader.Download(_context.Settings.GetRemoteUpdaterFileUrl(entry.RelativePath),
                                    PathsManager.GetDirectoryPath(filePath));
            }
            else
            {
                if (FilesManager.IsFileLocked(filePath))
                {
                    var newFilePath = FilesManager.GetTemporaryDeletingFileName(filePath);
                    FilesManager.Rename(filePath, newFilePath);
                    FilesManager.Copy(newFilePath, filePath);
                }
            }

            EnsureDefinition(entry);
        }
Example #4
0
        public void Update()
        {
            _context.Logger.Info("Repairing process started.");
            var repairedFiles   = 0;
            var downloadEntries = new List <DownloadEntry>();

            foreach (var currentEntry in _context.CurrentBuildDefinition.Entries)
            {
                var canSkip   = false;
                var integrity = GetFileIntegrity(currentEntry);
                var filePath  = PathsManager.Combine(_context.Settings.GetGamePath(), currentEntry.RelativePath);

                if (integrity == FileIntegrity.Valid)
                {
                    canSkip = true;
                }
                else if (integrity == FileIntegrity.InvalidAttributes)
                {
                    HandleInvalidAttributes(currentEntry);
                    canSkip = true;
                }
                else if (integrity == FileIntegrity.InvalidLastWriting || integrity == (FileIntegrity.InvalidLastWriting | FileIntegrity.InvalidAttributes))
                {
                    var isNowValid = HandleInvalidLastWriting(currentEntry);
                    if (isNowValid)
                    {
                        SetDefinition(filePath, currentEntry);
                        canSkip = true;
                    }
                }
                else if (integrity.HasFlag(FileIntegrity.InvalidSize))
                {
                    FilesManager.Delete(currentEntry.RelativePath);
                }

                if (!canSkip)
                {
                    // If I am here, the file cannot be fixed and it does not exist anymore (or never existed)
                    DirectoriesManager.Create(PathsManager.GetDirectoryPath(filePath));

                    var remoteFile = PathsManager.UriCombine(
                        _context.Settings.GetRemoteBuildUrl(_context.CurrentVersion),
                        _context.Settings.GameFolderName,
                        currentEntry.RelativePath
                        );
                    var partialRemoteFile = PathsManager.UriCombine(
                        _context.Settings.GetPartialRemoteBuildUrl(_context.CurrentVersion),
                        _context.Settings.GameFolderName,
                        currentEntry.RelativePath
                        );
                    downloadEntries.Add(new DownloadEntry(
                                            remoteFile,
                                            partialRemoteFile,
                                            PathsManager.GetDirectoryPath(filePath),
                                            filePath,
                                            currentEntry)
                                        );

                    repairedFiles++;
                }
            }

            Downloader.Download(downloadEntries, (entry) =>
            {
                SetDefinition(entry.DestinationFile, entry.Definition);
                _context.ReportProgress($"Repaired {entry.Definition.RelativePath}");
            });

            _context.Logger.Info("Repairing process completed. Checked {CheckedFiles} files, repaired {RepairedFiles} files, skipped {SkippedFiles} files.",
                                 _context.CurrentBuildDefinition.Entries.Length,
                                 repairedFiles,
                                 _context.CurrentBuildDefinition.Entries.Length - repairedFiles);
        }