Esempio n. 1
0
        public void CreateGameDirectory(string versionXml, string outputDir, IProgress <int> progress)
        {
            string container         = Settings.Default.ContainerDirectory;
            RootDirectoryEntity root = new RootDirectoryEntityIO().Deserialize(versionXml);

            GameDirGenerator.Generate(root, outputDir, container, Helpers.EntityToPath(container), progress);
        }
        public void DeleteGameDirectory(ManagedGameVersion game, IProgress <int> progress)
        {
            progress.Report(10);
            if (Directory.Exists(game.Path))
            {
                Directory.Delete(game.Path, true);
            }

            RootDirectoryEntity        root          = new RootDirectoryEntityIO().Deserialize(game.GameXML);
            List <RootDirectoryEntity> otherVersions = new List <RootDirectoryEntity>();

            foreach (var mgv in _mvs.GetManagedVersions())
            {
                RootDirectoryEntity data = new RootDirectoryEntityIO().Deserialize(mgv.GameXML);
                otherVersions.Add(data);
            }

            Progress <int> partialProgress = new Progress <int>(prog =>
            {
                int percent = (int)(prog * 0.9);
                progress.Report(10 + percent);
            });

            string container = Settings.Default.ContainerDirectory;

            GameFilesRemover.RemoveFiles(root, otherVersions, Helpers.EntityToPath(container), _dirCache, partialProgress);
            SaveDirCache();

            System.Windows.Application.Current.Dispatcher.BeginInvoke((Action) delegate()
            {
                _mvs.Remove(game);
            });
            progress.Report(100);
        }
        private void GenerateGameFolder(string containerPath, string versionFilePath, string outputFolderPath)
        {
            RootDirectoryEntity root = new RootDirectoryEntityIO().Deserialize(versionFilePath);
            string gameFolder        = Path.Combine(outputFolderPath, "World of Tanks " + root.Version);

            GameDirGenerator.Generate(root, gameFolder, containerPath, Helpers.EntityToPath(containerPath), null);
        }
        public void UpdateGameDirectory(RootDirectoryEntity updated, string outputDir, IProgress <int> progress)
        {
            ManagedGameVersion   oldMGV        = _mvs.GetManagedVersions().First(mvg => mvg.Version == updated.Version);
            RootDirectoryEntity  oldBuild      = new RootDirectoryEntityIO().Deserialize(oldMGV.GameXML);
            HashSet <FileEntity> oldFiles      = oldBuild.GetAllFileEntities(true).OfType <FileEntity>().ToHashSet();
            HashSet <FileEntity> newFiles      = updated.GetAllFileEntities(true).OfType <FileEntity>().ToHashSet();
            HashSet <FileEntity> changedFiles  = newFiles.Except(oldFiles).ToHashSet();
            HashSet <FileEntity> filesToRemove = oldFiles.Except(newFiles).ToHashSet();

            // Do not remove files that only changed location
            HashSet <string>     newFilesHashes  = newFiles.Select(x => x.Hash).ToHashSet();
            HashSet <FileEntity> movedFileHashes = filesToRemove.Where(f => newFilesHashes.Contains(f.Hash)).ToHashSet();

            filesToRemove.ExceptWith(movedFileHashes);

            string container = Settings.Default.ContainerDirectory;
            List <RootDirectoryEntity> otherVersions = new List <RootDirectoryEntity>();

            foreach (var mgv in _mvs.GetManagedVersions().Except(new List <ManagedGameVersion>()
            {
                oldMGV
            }))
            {
                RootDirectoryEntity data = new RootDirectoryEntityIO().Deserialize(mgv.GameXML);
                otherVersions.Add(data);
            }

            int            basePercent     = 0;
            Progress <int> partialProgress = new Progress <int>(percent =>
            {
                progress.Report(basePercent + percent / 2);
            });

            // Remove old unused files from cache
            GameFilesRemover.RemoveFiles(filesToRemove,
                                         otherVersions,
                                         Helpers.EntityToPath(container),
                                         _dirCache,
                                         partialProgress
                                         );
            SaveDirCache();
            basePercent = 50;
            // Remove old unused files from game directory
            foreach (FileEntity unusedFile in filesToRemove)
            {
                string path = Path.Combine(oldMGV.Path, unusedFile.RelativePath);
                try
                {
                    File.Delete(path);
                }
                catch (Exception ex) { }
            }

            // Update files in directory
            CreateGameDirectory(updated, oldMGV.Path, partialProgress);
            progress.Report(100);
        }
Esempio n. 5
0
        private void ExtractGameDir(string containerPath, string versionFilePath, string gamePath)
        {
            ExtractionManager ex = new ExtractionManager(new List <Extractor>()
            {
                new PackageExtractor(), new FileExtractor()
            });
            RootDirectoryEntity deser = new RootDirectoryEntityIO().Deserialize(versionFilePath);

            ex.Extract(deser, gamePath, Helpers.EntityToPath(containerPath), _dirCache, null);
        }
        private async void RemoveGameFiles()
        {
            string             btnContent = btnRemove.Content as string;
            ManagedGameVersion selected   = lbVersions.SelectedItem as ManagedGameVersion;

            if (selected == null)
            {
                return;
            }

            _containerPath = txtContainer.Text;
            if (_containerPath == null || !Directory.Exists(_containerPath))
            {
                MessageBox.Show("Please select container directory.", "Error");
                return;
            }

            if (!LoadDirCache())
            {
                return;
            }

            MessageBoxResult result = MessageBox.Show("This process will remove ALL files from the selected version and delete the game directory. Proceed?", "Warning", MessageBoxButton.YesNo);

            if (result != MessageBoxResult.Yes)
            {
                return;
            }

            btnRemove.IsEnabled = false;
            btnRemove.Content   = "Removing...";

            if (Directory.Exists(selected.Path))
            {
                await Task.Run(() => Directory.Delete(selected.Path, true));
            }

            RootDirectoryEntity        root          = new RootDirectoryEntityIO().Deserialize(selected.GameXML);
            List <RootDirectoryEntity> otherVersions = new List <RootDirectoryEntity>();

            foreach (var mgv in ManagedVersions)
            {
                RootDirectoryEntity data = new RootDirectoryEntityIO().Deserialize(mgv.GameXML);
                otherVersions.Add(data);
            }

            await Task.Run(() => GameFilesRemover.RemoveFiles(root, otherVersions, _containerPath, Helpers.EntityToPath(_containerPath), _dirCache, null));

            ManagedVersions.Remove(selected);
            SaveManagedVersions();
            SaveDirCache();

            btnRemove.IsEnabled = true;
            btnRemove.Content   = btnContent;
        }
Esempio n. 7
0
        public void ExtractToContainer(string versionXml, string gameDir, IProgress <int> progress)
        {
            string            container = Settings.Default.ContainerDirectory;
            ExtractionManager ex        = new ExtractionManager(new List <Extractor>()
            {
                new PackageExtractor(), new FileExtractor()
            });
            RootDirectoryEntity deser = new RootDirectoryEntityIO().Deserialize(versionXml);

            ex.Extract(deser, gameDir, Helpers.EntityToPath(container), _dirCache, progress);

            string cacheXml = Settings.Default.DirectoryCacheFile;

            _ds.Serialize(_dirCache, cacheXml);
        }
        private void btnAddVersion_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();

            dialog.Filter      = "Version Manager XML File|*.xml";
            dialog.Multiselect = true;
            if (dialog.ShowDialog().GetValueOrDefault())
            {
                foreach (string file in dialog.FileNames)
                {
                    RootDirectoryEntity ent = new RootDirectoryEntityIO().Deserialize(file);
                    _items.Add(ent);
                }
            }
        }
        public void Add(string versionXml, string directory)
        {
            string dirVersion = Helpers.GetGameVersion(directory);
            string xmlVersion = new RootDirectoryEntityIO().Deserialize(versionXml).Version;

            if (dirVersion != xmlVersion)
            {
                return;
            }

            if (Contains(dirVersion))
            {
                return;
            }

            Add(new ManagedGameVersion(directory, dirVersion, versionXml));
        }
        private string Compare(string path1, string path2)
        {
            string formatVersion(string version, IEnumerable <FileEntity> files, IEnumerable <FileEntity> unique) =>
            string.Format("Version: {0}\nNumber of files: {1:N0}\nSize: {2:N0} MB\nUnique files: {3:N0} ({4:N0} MB)",
                          version, files.Count(), files.Select(f => f.Size).Sum() / (1024 * 1024), unique.Count(), unique.Select(f => f.Size).Sum() / (1024 * 1024));

            RootDirectoryEntity first  = new RootDirectoryEntityIO().Deserialize(path1);
            RootDirectoryEntity second = new RootDirectoryEntityIO().Deserialize(path2);

            IEnumerable <FileEntity> firstFiles  = first.GetAllFileEntities(true).OfType <FileEntity>();
            IEnumerable <FileEntity> secondFiles = second.GetAllFileEntities(true).OfType <FileEntity>();

            IEnumerable <FileEntity> firstUnique  = firstFiles.Except(secondFiles);
            IEnumerable <FileEntity> secondUnique = secondFiles.Except(firstFiles);

            string message = string.Format("{0}\n\n{1}", formatVersion(first.Version, firstFiles, firstUnique), formatVersion(second.Version, secondFiles, secondUnique));

            return(message);
        }
        public void CreateGameDirectory(string versionXml, string outputDir, IProgress <int> progress)
        {
            RootDirectoryEntity root = new RootDirectoryEntityIO().Deserialize(versionXml);

            CreateGameDirectory(root, outputDir, progress);
        }
        public void ExtractToContainer(string versionXml, string gameDir, IProgress <int> progress)
        {
            RootDirectoryEntity deser = new RootDirectoryEntityIO().Deserialize(versionXml);

            ExtractToContainer(deser, gameDir, progress);
        }