Esempio n. 1
0
        private static void OpenArchiveBackgroundWork(object?sender, DoWorkEventArgs e)
        {
            _archive = MpqArchive.Open((string)e.Argument, true);
            _archive.DiscoverFileNames();

            var mapsList = new HashSet <string>();

            if (_archive.IsCampaignArchive(out var campaignInfo))
            {
                for (var i = 0; i < campaignInfo.Maps.Count; i++)
                {
                    mapsList.Add(campaignInfo.Maps[i].MapFilePath);
                }
            }
            else
            {
                using var mpqStream = _archive.OpenFile(MapInfo.FileName);
                using var reader    = new BinaryReader(mpqStream);
                _originPatch        = reader.ReadMapInfo().GetOriginGamePatch();
            }

            var listViewItems         = new List <ListViewItem>();
            var possibleOriginPatches = new HashSet <GamePatch>();
            var files = _archive.ToList();

            var progress = new OpenArchiveProgress();

            progress.Maximum = files.Count;

            foreach (var file in files)
            {
                if (mapsList.Contains(file.FileName))
                {
                    var mapName = file.FileName;

                    using var mapArchiveStream = _archive.OpenFile(mapName);
                    using var mapArchive       = MpqArchive.Open(mapArchiveStream, true);
                    mapArchive.DiscoverFileNames();

                    var children = new List <ListViewItem>();
                    var mapFiles = mapArchive.ToList();

                    progress.Maximum += mapFiles.Count;

                    foreach (var mapFile in mapArchive)
                    {
                        var subItem = ListViewItemExtensions.Create(new ItemTag(mapArchive, mapFile, mapName));

                        subItem.IndentCount = 1;
                        children.Add(subItem);

                        _openArchiveWorker.ReportProgress(0, progress);
                    }

                    using (var mapInfoFileStream = mapArchive.OpenFile(MapInfo.FileName))
                    {
                        using var reader = new BinaryReader(mapInfoFileStream);
                        var mapArchiveOriginPatch = reader.ReadMapInfo().GetOriginGamePatch();

                        var mapArchiveItem = ListViewItemExtensions.Create(new ItemTag(_archive, file, children.ToArray(), mapArchiveOriginPatch));

                        listViewItems.Add(mapArchiveItem);

                        _openArchiveWorker.ReportProgress(0, progress);

                        if (mapArchiveOriginPatch.HasValue)
                        {
                            possibleOriginPatches.Add(mapArchiveOriginPatch.Value);
                        }
                    }

                    foreach (var child in children)
                    {
                        listViewItems.Add(child);
                    }
                }
                else
                {
                    var item = ListViewItemExtensions.Create(new ItemTag(_archive, file));

                    listViewItems.Add(item);

                    _openArchiveWorker.ReportProgress(0, progress);
                }
            }

            if (_originPatch is null)
            {
                _originPatch = possibleOriginPatches.Count == 1 ? possibleOriginPatches.Single() : _latestPatch;
            }

            e.Result = listViewItems;
        }