Ejemplo n.º 1
0
        public RootDirectoryEntity Deserialize(string path)
        {
            RootDirectoryEntity root = base.Deserialize <RootDirectoryEntity>(path);

            root.RelativePath = "";
            root.BuildPaths();
            return(root);
        }
        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);
        }
Ejemplo n.º 3
0
        public static RootDirectoryEntity CreateRootEntityFromDirectory(string path, bool withHash = true, IProgress <int> progress = null)
        {
            DirectoryInfo       wot  = new DirectoryInfo(path);
            RootDirectoryEntity root = new RootDirectoryEntity(GetGameVersion(path));
            HashProvider        hp   = withHash ? new SHA1HashProvider() : null;

            GameDirectoryParser.Parse(wot, root, wot.FullName.Length, hp, IgnoreList.FromEnumerable(File.ReadAllLines("ignored.txt")), progress);
            return(root);
        }
Ejemplo n.º 4
0
 /// <summary>
 /// Deletes target version's files from container if they're not used by other versions.
 /// </summary>
 /// <param name="versionToRemove"></param>
 /// <param name="allVersions"></param>
 /// <param name="fileToPath"></param>
 /// <param name="cache"></param>
 /// <param name="progress"></param>
 public static void RemoveFiles(RootDirectoryEntity versionToRemove, List <RootDirectoryEntity> allVersions, Func <BaseEntity, string> fileToPath, DirectoryCache cache, IProgress <int> progress)
 {
     RemoveFiles(new HashSet <FileEntity>(versionToRemove.GetAllFileEntities(true).OfType <FileEntity>()),
                 allVersions.Except(new List <RootDirectoryEntity> {
         versionToRemove
     }).ToList(),
                 fileToPath,
                 cache,
                 progress);
 }
        public void ExtractToContainer(RootDirectoryEntity root, string gameDir, IProgress <int> progress)
        {
            string            container = Settings.Default.ContainerDirectory;
            ExtractionManager ex        = new ExtractionManager(new List <Extractor>()
            {
                new PackageExtractor(), new FileExtractor()
            });

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

            string cacheXml = Settings.Default.DirectoryCacheFile;

            _ds.Serialize(_dirCache, cacheXml);
        }
Ejemplo n.º 6
0
        private async void btnShowInfo_Click(object sender, RoutedEventArgs e)
        {
            btnShowInfo.IsEnabled = false;
            string              gameDir     = txtFolder.Text;
            DirectoryInfo       gameDirInfo = new DirectoryInfo(gameDir);
            string              version     = Helpers.GetGameVersion(gameDir);
            RootDirectoryEntity root        = new RootDirectoryEntity(version);
            await Task.Run(() => GameDirectoryParser.Parse(gameDirInfo, root, gameDirInfo.FullName.Length, null, new IgnoreList(), null));

            long   files  = Helpers.TotalFiles(root);
            long   size   = Helpers.TotalSize(root) / (1024 * 1024);
            string result = string.Format("Directory: {0}\nVersion: {1}\nTotal files: {2:N0}\nTotal size: {3:N0} MB", gameDir, version, files, size);

            MessageBox.Show(result);
            btnShowInfo.IsEnabled = true;
        }
        private async void btnCreateFile_Click(object sender, RoutedEventArgs e)
        {
            DirectoryInfo       wot    = new DirectoryInfo(txtGameFolder.Text);
            string              output = txtOutputFile.Text;
            RootDirectoryEntity root   = new RootDirectoryEntity(Helpers.GetGameVersion(txtGameFolder.Text));
            HashProvider        sha1   = new SHA1HashProvider();

            btnCreateFile.IsEnabled = false;
            btnCreateFile.Content   = "Creating...";
            await Task.Run(() => GameDirectoryParser.Parse(wot, root, wot.FullName.Length, sha1, IgnoreList.FromEnumerable(File.ReadAllLines("ignored.txt")), null));

            await Task.Run(() => new RootDirectoryEntityIO().Serialize(root, output));

            btnCreateFile.Content   = "Create";
            btnCreateFile.IsEnabled = true;
        }
Ejemplo n.º 8
0
        public static void Parse(DirectoryInfo directory, RootDirectoryEntity root, int prefixLength, HashProvider hashProvider, IgnoreList ignoreList, IProgress <int> progress)
        {
            RootDirectoryEntity temp = new RootDirectoryEntity();

            ParseInner(directory, temp, prefixLength, null, ignoreList, null);

            if (hashProvider == null)
            {
                progress?.Report(100);
                return;
            }

            int            totalFiles  = temp.GetAllFileEntities(true).Count;
            int            processed   = 0;
            Progress <int> sumProgress = new Progress <int>(prog =>
            {
                int percent = ++processed * 100 / totalFiles;
                progress?.Report(percent);
            });

            ParseInner(directory, root, prefixLength, hashProvider, ignoreList, sumProgress);
        }
Ejemplo n.º 9
0
        public static void RemoveFiles(RootDirectoryEntity versionToRemove, List <RootDirectoryEntity> versions, string container, Func <BaseEntity, string> fileToPath, DirectoryCache cache, IProgress <int> progress)
        {
            HashSet <FileEntity>       versionFiles  = new HashSet <FileEntity>(versionToRemove.GetAllFileEntities(true).OfType <FileEntity>());
            List <RootDirectoryEntity> otherVersions = versions.ToList();

            otherVersions.Remove(versionToRemove);
            HashSet <FileEntity> otherFiles = new HashSet <FileEntity>();

            otherVersions.ForEach(version => otherFiles.UnionWith(version.GetAllFileEntities(true).OfType <FileEntity>()));
            versionFiles.ExceptWith(otherFiles);
            int   total = versionFiles.Count;
            float done  = 0;

            foreach (FileEntity fe in versionFiles)
            {
                string path = fileToPath(fe);
                if (cache.DeleteDirectoryFromCache(path))
                {
                    try { Directory.Delete(path, true); } catch (Exception ex) { }

                    progress?.Report((int)(100 * ++done / total));
                }
            }
        }
        public void CreateGameDirectory(RootDirectoryEntity game, string outputDir, IProgress <int> progress)
        {
            string container = Settings.Default.ContainerDirectory;

            GameDirGenerator.Generate(game, outputDir, container, Helpers.EntityToPath(container), progress);
        }
Ejemplo n.º 11
0
        private void CreateVersionXML(string dir, string output, IProgress <int> progress)
        {
            RootDirectoryEntity root = Helpers.CreateRootEntityFromDirectory(dir, true, progress);

            new RootDirectoryEntityIO().Serialize(root, output);
        }
Ejemplo n.º 12
0
        public void Import(string path, bool copyMods, IProgress <int> progress)
        {
            ImportStatus status = CanImport(path);

            if (status == ImportStatus.INVALID_PATH)
            {
                return;
            }

            if (status == ImportStatus.ALREADY_EXISTS)
            {
                // Check if user attempted to import from managed directory
                bool isTargetDirectoryManaged = _mvs.GetManagedVersions().Select(v => Path.GetFullPath(v.Path)).Contains(Path.GetFullPath(path));
                if (isTargetDirectoryManaged)
                {
                    return;
                }
            }

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

            string gameVersion = Helpers.GetGameVersion(path);
            string xmlFilename = gameVersion.Replace(".", "_") + ".xml";
            string xml         = Path.Combine(Settings.Default.VersionDataDirectory, xmlFilename);
            string output      = Path.Combine(Settings.Default.GameOutputDirectory, "World of Tanks " + gameVersion);

            if (status == ImportStatus.CAN_IMPORT)
            {
                // Import new version
                CreateVersionXML(path, xml, partialProgress);
                basePercent = 33;
                _gds.ExtractToContainer(xml, path, partialProgress);
                basePercent = 66;
                _gds.CreateGameDirectory(xml, output, partialProgress);
            }
            else if (status == ImportStatus.ALREADY_EXISTS)
            {
                // Update version
                RootDirectoryEntity newBuild = Helpers.CreateRootEntityFromDirectory(path, true, partialProgress);
                basePercent = 33;
                _gds.ExtractToContainer(newBuild, path, partialProgress);
                basePercent = 66;
                _gds.UpdateGameDirectory(newBuild, output, partialProgress);
                new RootDirectoryEntityIO().Serialize(newBuild, xml);
            }


            if (copyMods)
            {
                CopyDirectory("mods", path, output);
                CopyDirectory("res_mods", path, output);
            }
            progress.Report(100);

            if (status == ImportStatus.CAN_IMPORT)
            {
                System.Windows.Application.Current.Dispatcher.BeginInvoke((Action) delegate()
                {
                    _mvs.Add(xml, output);
                });
            }
        }