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; }