상속: ICASCEntry
예제 #1
0
        protected void CreateSubTree(CASCFolder root, ulong filehash, string file)
        {
            string[] parts = file.Split(PathDelimiters);

            CASCFolder folder = root;

            for (int i = 0; i < parts.Length; ++i)
            {
                bool isFile = (i == parts.Length - 1);

                string entryName = parts[i];

                ICASCEntry entry = folder.GetEntry(entryName);

                if (entry == null)
                {
                    if (isFile)
                    {
                        entry = new CASCFile(filehash);
                        CASCFile.FileNames[filehash] = file;
                    }
                    else
                    {
                        entry = new CASCFolder(entryName);
                    }

                    folder.Entries[entryName] = entry;
                    folder.EntriesMirror[entryName] = entry;
                }

                folder = entry as CASCFolder;
            }
        }
예제 #2
0
 public void SetExtractData(CASCHandler _cascHandler, CASCFolder _folder, ListView.SelectedIndexCollection _selection)
 {
     cascHandler = _cascHandler;
     folder = _folder;
     selection = _selection.Cast<int>().ToArray();
     NumExtracted = 0;
     NumFiles = GetFilesCount(folder, selection);
     progressBar1.Value = 0;
 }
예제 #3
0
        private void loadDataWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            var worker = sender as BackgroundWorker;

            cascHandler = Settings.Default.OnlineMode
                ? CASCHandler.OpenOnlineStorage(worker)
                : CASCHandler.OpenLocalStorage(Settings.Default.WowPath, worker);

            root = LoadListFile(cascHandler, Path.Combine(Application.StartupPath, "listfile.txt"), worker);
            e.Result = CASCHandler.FileNames.Count;
        }
예제 #4
0
        private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            viewHelper.SetSort(e.Column);

            CASCFolder folder = viewHelper.CurrentFolder;

            if (folder == null)
            {
                return;
            }

            viewHelper.UpdateListView(folder, fileList, filterToolStripTextBox.Text);
        }
예제 #5
0
        public CASCFolder SetFlags(LocaleFlags locale, ContentFlags content, bool createTree = true)
        {
            using (var _ = new PerfCounter(GetType().Name + "::SetFlags()"))
            {
                Locale = locale;
                Content = content;

                if (createTree)
                    Root = CreateStorageTree();

                return Root;
            }
        }
예제 #6
0
        protected override CASCFolder CreateStorageTree()
        {
            var root = new CASCFolder("root");

            CountSelect = 0;

            // Cleanup fake names for unknown files
            CountUnknown = 0;

            Logger.WriteLine("AgentRootHandler: {0} file names missing for locale {1}", CountUnknown, Locale);

            return root;
        }
예제 #7
0
        protected override CASCFolder CreateStorageTree()
        {
            var root = new CASCFolder("root");

            CountSelect = 0;

            // Cleanup fake names for unknown files
            CountUnknown = 0;

            Logger.WriteLine("AgentRootHandler: {0} file names missing for locale {1}", CountUnknown, Locale);

            return(root);
        }
예제 #8
0
        private void OnStorageChanged()
        {
            CASCHandler  casc     = viewHelper.CASC;
            CASCConfig   cfg      = casc.Config;
            CASCGameType gameType = cfg.GameType;

            bool isWoW = gameType == CASCGameType.WoW;

            extractInstallFilesToolStripMenuItem.Enabled    = true;
            extractCASCSystemFilesToolStripMenuItem.Enabled = true;
            scanFilesToolStripMenuItem.Enabled           = isWoW;
            analyseUnknownFilesToolStripMenuItem.Enabled = isWoW || gameType == CASCGameType.Overwatch;
            localeFlagsToolStripMenuItem.Enabled         = CASCGame.SupportsLocaleSelection(gameType);
            useLVToolStripMenuItem.Enabled          = isWoW;
            exportListfileToolStripMenuItem.Enabled = true;

            CASCFolder root = viewHelper.Root;

            TreeNode node = new TreeNode()
            {
                Name = root.Name, Tag = root, Text = "Root [Read only]"
            };

            folderTree.Nodes.Add(node);
            node.Nodes.Add(new TreeNode()
            {
                Name = "tempnode"
            });                                                   // add dummy node
            node.Expand();
            folderTree.SelectedNode = node;

            if (cfg.OnlineMode)
            {
                CDNBuildsToolStripMenuItem.Enabled = true;
                if (cfg.Builds.Count > 1)
                {
                    foreach (var bld in cfg.Builds)
                    {
                        CDNBuildsToolStripMenuItem.DropDownItems.Add(bld["build-name"][0]);
                    }
                }
                else
                {
                    CDNBuildsToolStripMenuItem.DropDownItems.Add(cfg.BuildName);
                }
            }

            statusProgress.Visible = false;
            statusLabel.Text       = string.Format("Loaded {0} files ({1} names missing)", casc.Root.CountSelect - casc.Root.CountUnknown, casc.Root.CountUnknown);
        }
예제 #9
0
        public void Cleanup()
        {
            OnCleanup?.Invoke();

            Sorter.CASC = null;

            _root = null;

            if (_casc != null)
            {
                _casc.Clear();
                _casc = null;
            }
        }
예제 #10
0
 private void ScanFolder(CASCFolder folder)
 {
     foreach (var entry in folder.Entries)
     {
         if (entry.Value is CASCFile file)
         {
             ScanFile(file);
         }
         else
         {
             ScanFolder(entry.Value as CASCFolder);
         }
     }
 }
예제 #11
0
        protected override CASCFolder CreateStorageTree()
        {
            var root = new CASCFolder("root");

            // Reset counts
            CountSelect = 0;
            UnknownFiles.Clear();

            // Create new tree based on specified locale
            foreach (var rootEntry in RootData)
            {
                var rootInfosLocale = rootEntry.Value.Where(re => (re.LocaleFlags & Locale) != 0);

                if (rootInfosLocale.Count() > 1)
                {
                    var rootInfosLocaleAndContent = rootInfosLocale.Where(re => (re.ContentFlags == Content));

                    if (rootInfosLocaleAndContent.Any())
                    {
                        rootInfosLocale = rootInfosLocaleAndContent;
                    }
                }

                if (!rootInfosLocale.Any())
                {
                    continue;
                }

                string filename;

                if (!CASCFile.Files.TryGetValue(rootEntry.Key, out CASCFile file))
                {
                    filename = "unknown\\" + rootEntry.Key.ToString("X16") + "_" + GetFileDataIdByHash(rootEntry.Key);

                    UnknownFiles.Add(rootEntry.Key);
                }
                else
                {
                    filename = file.FullName;
                }

                CreateSubTree(root, rootEntry.Key, filename);
                CountSelect++;
            }

            Logger.WriteLine("WowRootHandler: {0} file names missing for locale {1}", CountUnknown, Locale);

            return(root);
        }
예제 #12
0
        public void Cleanup()
        {
            Sorter.CASC = null;

            _currentFolder = null;
            _root          = null;

            _displayedEntries?.Clear();
            _displayedEntries = null;

            _casc?.Clear();
            _casc = null;

            OnCleanup?.Invoke();
        }
예제 #13
0
        public CASCFolder SetFlags(LocaleFlags locale, ContentFlags content, bool createTree = true)
        {
            using (var _ = new PerfCounter(GetType().Name + "::SetFlags()"))
            {
                Locale  = locale;
                Content = content;

                if (createTree)
                {
                    Root = CreateStorageTree();
                }

                return(Root);
            }
        }
예제 #14
0
        public void ChangeLocale(string locale)
        {
            if (_casc == null)
            {
                return;
            }

            OnCleanup?.Invoke();

            Settings.Default.LocaleFlags = (LocaleFlags)Enum.Parse(typeof(LocaleFlags), locale);

            _root = _casc.Root.SetFlags(Settings.Default.LocaleFlags, Settings.Default.ContentFlags);
            _casc.Root.MergeInstall(_casc.Install);

            OnStorageChanged?.Invoke();
        }
예제 #15
0
        public void SetOverrideArchive(bool set)
        {
            if (_casc == null)
            {
                return;
            }

            OnCleanup?.Invoke();

            Settings.Default.OverrideArchive = set;

            _root = _casc.Root.SetFlags(Settings.Default.LocaleFlags, Settings.Default.OverrideArchive);
            _casc.Root.MergeInstall(_casc.Install);

            OnStorageChanged?.Invoke();
        }
예제 #16
0
        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            CASCFolder folder = fileList.Tag as CASCFolder;

            if (folder == null)
            {
                return;
            }

            if (extractProgress == null)
            {
                extractProgress = new ExtractProgress();
            }

            extractProgress.SetExtractData(cascHandler, folder, fileList.SelectedIndices);
            extractProgress.ShowDialog();
        }
예제 #17
0
        private void PreviewFile()
        {
            CASCFolder folder = fileList.Tag as CASCFolder;

            if (folder == null)
            {
                return;
            }

            var files = GetFiles(folder, fileList.SelectedIndices.Cast <int>());

            foreach (var file in files)
            {
                var extension = Path.GetExtension(file.Name);
                if (extension != null)
                {
                    switch (extension.ToLower())
                    {
                    case ".blp":
                    {
                        PreviewBlp(file.FullName);
                        break;
                    }

                    case ".txt":
                    case ".ini":
                    case ".wtf":
                    case ".lua":
                    case ".toc":
                    case ".xml":
                    case ".htm":
                    case ".html":
                    {
                        PreviewText(file.FullName);
                        break;
                    }

                    default:
                    {
                        MessageBox.Show(string.Format("Preview of {0} is not supported yet", extension), "Not supported file");
                        break;
                    }
                    }
                }
            }
        }
예제 #18
0
        public void GetSize(NoFlickerListView fileList)
        {
            if (_currentFolder == null)
            {
                return;
            }

            if (!fileList.HasSelection)
            {
                return;
            }

            var files = CASCFolder.GetFiles(_displayedEntries, fileList.SelectedIndices.Cast <int>());

            long size = files.Sum(f => (long)f.GetSize(_casc));

            MessageBox.Show(string.Format(sizeNumberFmt, "{0:N} bytes", size));
        }
예제 #19
0
파일: ScanForm.cs 프로젝트: lyragosa/aleph
        private void ScanFolder(CASCFolder folder)
        {
            foreach (var entry in folder.Entries)
            {
                if (entry.Value is CASCFile)
                {
                    var rootEntries = CASC.Root.GetEntries(entry.Value.Hash);

                    foreach (var rootEntry in rootEntries)
                    {
                        ScanFile(entry.Value as CASCFile);
                    }
                }
                else
                {
                    ScanFolder(entry.Value as CASCFolder);
                }
            }
        }
예제 #20
0
        public void GetSize(NoFlickerListView fileList)
        {
            CASCFolder folder = fileList.Tag as CASCFolder;

            if (folder == null)
            {
                return;
            }

            if (!fileList.HasSelection)
            {
                return;
            }

            var files = folder.GetFiles(fileList.SelectedIndices.Cast <int>());

            long size = files.Sum(f => (long)f.GetSize(_casc));

            MessageBox.Show(string.Format(sizeNumberFmt, "{0:N} bytes", size));
        }
예제 #21
0
        private void copyNameToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CASCFolder folder = fileList.Tag as CASCFolder;

            if (folder == null)
            {
                return;
            }

            if (!fileList.HasSelection)
            {
                return;
            }

            var files = folder.GetFiles(fileList.SelectedIndices.Cast <int>(), false).Select(f => f.FullName);

            string temp = string.Join(Environment.NewLine, files);

            Clipboard.SetText(temp);
        }
예제 #22
0
        public void UpdateListView(CASCFolder baseEntry, NoFlickerListView fileList, string filter)
        {
            Wildcard wildcard = new Wildcard(filter, false, RegexOptions.IgnoreCase);

            // Sort
            baseEntry.Entries = baseEntry.EntriesMirror.Where(v => v.Value is CASCFolder || (v.Value is CASCFile && wildcard.IsMatch(v.Value.Name))).
                                OrderBy(v => v.Value, Sorter).ToDictionary(pair => pair.Key, pair => pair.Value);

            // Update
            fileList.Tag             = baseEntry;
            fileList.VirtualListSize = 0;
            fileList.VirtualListSize = baseEntry.Entries.Count;

            if (fileList.VirtualListSize > 0)
            {
                fileList.EnsureVisible(0);
                fileList.SelectedIndex = 0;
                fileList.FocusedItem   = fileList.Items[0];
            }
        }
예제 #23
0
        public void UpdateListView(CASCFolder baseEntry, NoFlickerListView fileList, string filter)
        {
            Wildcard wildcard = new Wildcard(filter, false, RegexOptions.IgnoreCase);

            // Sort
            _displayedEntries = baseEntry.Entries.Where(v => v.Value is CASCFolder || (v.Value is CASCFile && wildcard.IsMatch(v.Value.Name))).
                                OrderBy(v => v.Value, Sorter).Select(kv => kv.Value).ToList();

            _currentFolder = baseEntry;

            // Update
            fileList.VirtualListSize = 0;
            fileList.VirtualListSize = _displayedEntries.Count;

            if (fileList.VirtualListSize > 0)
            {
                fileList.EnsureVisible(0);
                fileList.SelectedIndex = 0;
                fileList.FocusedItem   = fileList.Items[0];
            }
        }
예제 #24
0
        public void ExtractFiles(NoFlickerListView filesList)
        {
            if (_currentFolder == null)
            {
                return;
            }

            if (!filesList.HasSelection)
            {
                return;
            }

            if (extractProgress == null)
            {
                extractProgress = new ExtractProgress();
            }

            var files = CASCFolder.GetFiles(_displayedEntries, filesList.SelectedIndices.Cast <int>()).ToList();

            extractProgress.SetExtractData(_casc, files);
            extractProgress.ShowDialog();
        }
예제 #25
0
        private static IEnumerable <CASCFile> GetFiles(CASCFolder folder, IEnumerable <int> selection)
        {
            if (selection != null)
            {
                foreach (int index in selection)
                {
                    var entry = folder.SubEntries.ElementAt(index);

                    if (entry.Value is CASCFile)
                    {
                        yield return(entry.Value as CASCFile);
                    }
                    else
                    {
                        foreach (var file in GetFiles(entry.Value as CASCFolder, null))
                        {
                            yield return(file);
                        }
                    }
                }
            }
            else
            {
                foreach (var entry in folder.SubEntries)
                {
                    if (entry.Value is CASCFile)
                    {
                        yield return(entry.Value as CASCFile);
                    }
                    else
                    {
                        foreach (var file in GetFiles(entry.Value as CASCFolder, null))
                        {
                            yield return(file);
                        }
                    }
                }
            }
        }
예제 #26
0
        protected override CASCFolder CreateStorageTree()
        {
            var root = new CASCFolder("root");

            CountSelect  = 0;
            CountUnknown = 0;

            foreach (var rootEntry in _rootData)
            {
                if ((rootEntry.Value.baseEntry.LocaleFlags & Locale) == 0)
                {
                    continue;
                }

                CreateSubTree(root, rootEntry.Key, CASCFile.Files[rootEntry.Key].FullName);
                CountSelect++;
            }

            Logger.WriteLine("OwRootHandler: {0} file names missing for locale {1}", CountUnknown, Locale);

            return(root);
        }
예제 #27
0
        protected void CreateSubTree(CASCFolder root, ulong filehash, string file)
        {
            string[] parts = file.Split(PathDelimiters);

            CASCFolder folder = root;

            for (int i = 0; i < parts.Length; ++i)
            {
                bool isFile = (i == parts.Length - 1);

                string entryName = parts[i];

                ICASCEntry entry = folder.GetEntry(entryName);

                if (entry == null)
                {
                    if (isFile)
                    {
                        if (!CASCFile.Files.ContainsKey(filehash))
                        {
                            entry = new CASCFile(filehash, file);
                            CASCFile.Files[filehash] = (CASCFile)entry;
                        }
                        else
                        {
                            entry = CASCFile.Files[filehash];
                        }
                    }
                    else
                    {
                        entry = new CASCFolder(entryName);
                    }

                    folder.Entries[entryName] = entry;
                }

                folder = entry as CASCFolder;
            }
        }
예제 #28
0
        private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
        {
            CASCFolder folder = fileList.Tag as CASCFolder;

            if (folder == null)
            {
                return;
            }

            if (e.ItemIndex < 0 || e.ItemIndex >= folder.SubEntries.Count)
            {
                return;
            }

            ICASCEntry entry = folder.SubEntries.ElementAt(e.ItemIndex).Value;

            var flags = LocaleFlags.None;

            if (entry is CASCFile)
            {
                var rootInfos = cascHandler.GetRootInfo(entry.Hash);

                if (rootInfos == null)
                {
                    throw new Exception("root entry missing!");
                }

                foreach (var rootInfo in rootInfos)
                {
                    flags |= rootInfo.Block.Flags;
                }
            }

            var item = new ListViewItem(new string[] { entry.Name, entry is CASCFolder ? "Folder" : "File", flags.ToString() });

            item.ImageIndex = entry is CASCFolder ? 0 : 2;
            e.Item          = item;
        }
예제 #29
0
        public void OpenStorage(bool online, string path, string product)
        {
            Cleanup();

            using (var initForm = new InitForm())
            {
                initForm.LoadStorage((online, path, product));

                DialogResult res = initForm.ShowDialog();

                if (res != DialogResult.OK)
                {
                    return;
                }

                _casc = initForm.CASC;
                _root = initForm.Root;
            }

            Sorter.CASC = _casc;

            OnStorageChanged?.Invoke();
        }
예제 #30
0
        public void ChangeContentFlags(bool set)
        {
            if (_casc == null)
            {
                return;
            }

            OnCleanup?.Invoke();

            if (set)
            {
                Settings.Default.ContentFlags |= ContentFlags.LowViolence;
            }
            else
            {
                Settings.Default.ContentFlags &= ~ContentFlags.LowViolence;
            }

            _root = _casc.Root.SetFlags(Settings.Default.LocaleFlags, Settings.Default.ContentFlags);
            _casc.Root.MergeInstall(_casc.Install);

            OnStorageChanged?.Invoke();
        }
예제 #31
0
        private int GetFilesCount(CASCFolder _folder, IEnumerable <int> _selection)
        {
            int count = 0;

            if (_selection != null)
            {
                foreach (int index in _selection)
                {
                    var entry = _folder.SubEntries.ElementAt(index);

                    if (entry.Value is CASCFile)
                    {
                        count++;
                    }
                    else
                    {
                        count += GetFilesCount(entry.Value as CASCFolder, null);
                    }
                }
            }
            else
            {
                foreach (var entry in _folder.SubEntries)
                {
                    if (entry.Value is CASCFile)
                    {
                        count++;
                    }
                    else
                    {
                        count += GetFilesCount(entry.Value as CASCFolder, null);
                    }
                }
            }

            return(count);
        }
예제 #32
0
        public void Search(NoFlickerListView fileList, SearchForVirtualItemEventArgs e)
        {
            bool ignoreCase    = true;
            bool searchUp      = false;
            int  SelectedIndex = fileList.SelectedIndex;

            CASCFolder folder = fileList.Tag as CASCFolder;

            var comparisonType = ignoreCase
                                    ? StringComparison.InvariantCultureIgnoreCase
                                    : StringComparison.InvariantCulture;

            if (searchUp)
            {
                for (var i = SelectedIndex - 1; i >= 0; --i)
                {
                    var op = folder.Entries.ElementAt(i).Value.Name;
                    if (op.IndexOf(e.Text, comparisonType) != -1)
                    {
                        e.Index = i;
                        break;
                    }
                }
            }
            else
            {
                for (int i = SelectedIndex + 1; i < fileList.Items.Count; ++i)
                {
                    var op = folder.Entries.ElementAt(i).Value.Name;
                    if (op.IndexOf(e.Text, comparisonType) != -1)
                    {
                        e.Index = i;
                        break;
                    }
                }
            }
        }
예제 #33
0
        private void UpdateListView(CASCFolder baseEntry)
        {
            // Sort
            Dictionary <ulong, ICASCEntry> orderedEntries;

            if (fileList.Sorting == SortOrder.Ascending)
            {
                orderedEntries = baseEntry.SubEntries.OrderBy(v => v.Value).ToDictionary(pair => pair.Key, pair => pair.Value);
            }
            else
            {
                orderedEntries = baseEntry.SubEntries.OrderByDescending(v => v.Value).ToDictionary(pair => pair.Key, pair => pair.Value);
            }

            baseEntry.SubEntries = orderedEntries;

            // Update
            fileList.Tag             = baseEntry;
            fileList.VirtualListSize = 0;
            fileList.VirtualListSize = baseEntry.SubEntries.Count;
            fileList.EnsureVisible(0);
            fileList.SelectedIndices.Add(0);
            fileList.FocusedItem = fileList.Items[0];
        }
예제 #34
0
        protected override CASCFolder CreateStorageTree()
        {
            var root = new CASCFolder("root");

            CountSelect = 0;

            foreach (var entry in RootData)
            {
                if ((entry.Value.LocaleFlags & Locale) == 0)
                {
                    continue;
                }

                CreateSubTree(root, entry.Key, CASCFile.FileNames[entry.Key]);
                CountSelect++;
            }

            // Cleanup fake names for unknown files
            CountUnknown = 0;

            Logger.WriteLine("S1RootHandler: {0} file names missing for locale {1}", CountUnknown, Locale);

            return(root);
        }
예제 #35
0
        protected override CASCFolder CreateStorageTree()
        {
            var root = new CASCFolder("root");

            CountSelect = 0;

            // Create new tree based on specified locale
            foreach (var rootEntry in RootData)
            {
                var rootInfosLocale = rootEntry.Value.Where(re => (re.Block.LocaleFlags & Locale) != 0);

                if (!rootInfosLocale.Any())
                {
                    continue;
                }

                CreateSubTree(root, rootEntry.Key, CASCFile.FileNames[rootEntry.Key]);
                CountSelect++;
            }

            Logger.WriteLine("D3RootHandler: {0} file names missing extensions for locale {1}", CountUnknown, Locale);

            return(root);
        }
예제 #36
0
 private void ScanFolder(CASCFolder folder)
 {
     foreach (var entry in folder.Entries)
     {
         if (entry.Value is CASCFile)
             ScanFile(entry.Value as CASCFile);
         else
             ScanFolder(entry.Value as CASCFolder);
     }
 }
예제 #37
0
        public void ChangeLocale(string locale)
        {
            if (_casc == null)
                return;

            OnCleanup?.Invoke();

            Settings.Default.LocaleFlags = (LocaleFlags)Enum.Parse(typeof(LocaleFlags), locale);

            _root = _casc.Root.SetFlags(Settings.Default.LocaleFlags, Settings.Default.ContentFlags);
            _casc.Root.MergeInstall(_casc.Install);

            OnStorageChanged?.Invoke();
        }
예제 #38
0
        public void CreateListViewItem(RetrieveVirtualItemEventArgs e, CASCFolder folder)
        {
            if (folder == null)
                return;

            if (e.ItemIndex < 0 || e.ItemIndex >= folder.Entries.Count)
                return;

            ICASCEntry entry = folder.Entries.ElementAt(e.ItemIndex).Value;

            var localeFlags = LocaleFlags.None;
            var contentFlags = ContentFlags.None;
            var size = "<DIR>";

            if (entry is CASCFile)
            {
                var rootInfosLocale = _casc.Root.GetEntries(entry.Hash);

                if (rootInfosLocale.Any())
                {
                    var enc = _casc.Encoding.GetEntry(rootInfosLocale.First().MD5);

                    if (enc != null)
                        size = enc.Size.ToString("N", sizeNumberFmt);
                    else
                        size = "0";

                    foreach (var rootInfo in rootInfosLocale)
                    {
                        if (rootInfo.Block != null)
                        {
                            localeFlags |= rootInfo.Block.LocaleFlags;
                            contentFlags |= rootInfo.Block.ContentFlags;
                        }
                    }
                }
                else
                {
                    var installInfos = _casc.Install.GetEntries(entry.Hash);

                    if (installInfos.Any())
                    {
                        var enc = _casc.Encoding.GetEntry(installInfos.First().MD5);

                        if (enc != null)
                            size = enc.Size.ToString("N", sizeNumberFmt);
                        else
                            size = "0";

                        //foreach (var rootInfo in rootInfosLocale)
                        //{
                        //    if (rootInfo.Block != null)
                        //    {
                        //        localeFlags |= rootInfo.Block.LocaleFlags;
                        //        contentFlags |= rootInfo.Block.ContentFlags;
                        //    }
                        //}
                    }
                }
            }

            e.Item = new ListViewItem(new string[]
            {
                entry.Name,
                entry is CASCFolder ? "Folder" : Path.GetExtension(entry.Name),
                localeFlags.ToString(),
                contentFlags.ToString(),
                size
            })
            { ImageIndex = entry is CASCFolder ? 0 : 2 };
        }
예제 #39
0
        public void ChangeContentFlags(bool set)
        {
            if (_casc == null)
                return;

            OnCleanup?.Invoke();

            if (set)
                Settings.Default.ContentFlags |= ContentFlags.LowViolence;
            else
                Settings.Default.ContentFlags &= ~ContentFlags.LowViolence;

            _root = _casc.Root.SetFlags(Settings.Default.LocaleFlags, Settings.Default.ContentFlags);
            _casc.Root.MergeInstall(_casc.Install);

            OnStorageChanged?.Invoke();
        }
예제 #40
0
        private int GetFilesCount(CASCFolder _folder, IEnumerable<int> _selection)
        {
            int count = 0;

            if (_selection != null)
            {
                foreach (int index in _selection)
                {
                    var entry = _folder.SubEntries.ElementAt(index);

                    if (entry.Value is CASCFile)
                        count++;
                    else
                        count += GetFilesCount(entry.Value as CASCFolder, null);
                }
            }
            else
            {
                foreach (var entry in _folder.SubEntries)
                {
                    if (entry.Value is CASCFile)
                        count++;
                    else
                        count += GetFilesCount(entry.Value as CASCFolder, null);
                }
            }

            return count;
        }
예제 #41
0
        private static CASCFolder LoadListFile(CASCHandler cascHandler, string path, BackgroundWorker worker)
        {
            if (!File.Exists(path))
                throw new FileNotFoundException("list file missing!");

            var rootHash = CASCHandler.Hasher.ComputeHash("root");

            var root = new CASCFolder(rootHash);

            CASCHandler.FolderNames[rootHash] = "root";

            using (var sr = new StreamReader(path))
            {
                string file;
                int filesCount = 0;

                CASCFolder folder = root;

                while ((file = sr.ReadLine()) != null)
                {
                    filesCount++;

                    string[] parts = file.Split('\\');

                    for (int i = 0; i < parts.Length; ++i)
                    {
                        bool isFile = (i == parts.Length - 1);

                        ulong hash = isFile ? CASCHandler.Hasher.ComputeHash(file) : CASCHandler.Hasher.ComputeHash(parts[i]);

                        // skip invalid names
                        if (isFile && !cascHandler.RootData.ContainsKey(hash))
                            break;

                        ICASCEntry entry = folder.GetEntry(hash);

                        if (entry == null)
                        {
                            if (isFile)
                            {
                                entry = new CASCFile(hash);
                                CASCHandler.FileNames[hash] = file;
                            }
                            else
                            {
                                entry = new CASCFolder(hash);
                                CASCHandler.FolderNames[hash] = parts[i];
                            }

                            folder.SubEntries[hash] = entry;

                            if (isFile)
                            {
                                folder = root;
                                break;
                            }
                        }

                        folder = entry as CASCFolder;
                    }
                }
                Logger.WriteLine("CASCHandler: loaded {0} file names", CASCHandler.FileNames.Count);
            }
            return root;
        }
예제 #42
0
        private void UpdateListView(CASCFolder baseEntry)
        {
            // Sort
            Dictionary<ulong, ICASCEntry> orderedEntries;

            if (fileList.Sorting == SortOrder.Ascending)
                orderedEntries = baseEntry.SubEntries.OrderBy(v => v.Value).ToDictionary(pair => pair.Key, pair => pair.Value);
            else
                orderedEntries = baseEntry.SubEntries.OrderByDescending(v => v.Value).ToDictionary(pair => pair.Key, pair => pair.Value);

            baseEntry.SubEntries = orderedEntries;

            // Update
            fileList.Tag = baseEntry;
            fileList.VirtualListSize = 0;
            fileList.VirtualListSize = baseEntry.SubEntries.Count;
            fileList.EnsureVisible(0);
            fileList.SelectedIndices.Add(0);
            fileList.FocusedItem = fileList.Items[0];
        }
예제 #43
0
        public void UpdateListView(CASCFolder baseEntry, NoFlickerListView fileList, string filter)
        {
            Wildcard wildcard = new Wildcard(filter, false, RegexOptions.IgnoreCase);

            // Sort
            _displayedEntries = baseEntry.Entries.Where(v => v.Value is CASCFolder || (v.Value is CASCFile && wildcard.IsMatch(v.Value.Name))).
                OrderBy(v => v.Value, Sorter).Select(kv => kv.Value).ToList();

            _currentFolder = baseEntry;

            // Update
            fileList.VirtualListSize = 0;
            fileList.VirtualListSize = _displayedEntries.Count;

            if (fileList.VirtualListSize > 0)
            {
                fileList.EnsureVisible(0);
                fileList.SelectedIndex = 0;
                fileList.FocusedItem = fileList.Items[0];
            }
        }
예제 #44
0
        public void OpenStorage(string arg, bool online)
        {
            Cleanup();

            using (var initForm = new InitForm())
            {
                if (online)
                    initForm.LoadOnlineStorage(arg);
                else
                    initForm.LoadLocalStorage(arg);

                DialogResult res = initForm.ShowDialog();

                if (res != DialogResult.OK)
                    return;

                _casc = initForm.CASC;
                _root = initForm.Root;
            }

            Sorter.CASC = _casc;

            OnStorageChanged?.Invoke();
        }
예제 #45
0
        public void Cleanup()
        {
            OnCleanup?.Invoke();

            Sorter.CASC = null;

            _root = null;

            if (_casc != null)
            {
                _casc.Clear();
                _casc = null;
            }
        }
예제 #46
0
        private static IEnumerable<CASCFile> GetFiles(CASCFolder folder, IEnumerable<int> selection)
        {
            if (selection != null)
            {
                foreach (int index in selection)
                {
                    var entry = folder.SubEntries.ElementAt(index);

                    if (entry.Value is CASCFile)
                    {
                        yield return entry.Value as CASCFile;
                    }
                    else
                    {
                        foreach (var file in GetFiles(entry.Value as CASCFolder, null))
                        {
                            yield return file;
                        }
                    }
                }
            }
            else
            {
                foreach (var entry in folder.SubEntries)
                {
                    if (entry.Value is CASCFile)
                    {
                        yield return entry.Value as CASCFile;
                    }
                    else
                    {
                        foreach (var file in GetFiles(entry.Value as CASCFolder, null))
                        {
                            yield return file;
                        }
                    }
                }
            }
        }
예제 #47
0
파일: ScanForm.cs 프로젝트: aeo24/WoWMap
 public void Initialize(CASCHandler casc, CASCFolder root)
 {
     CASC = casc;
     Root = root;
     scanner = new FileScanner(CASC, Root);
 }
예제 #48
0
        private void ExtractData(CASCFolder _folder, IEnumerable<int> _selection)
        {
            if (_selection != null)
            {
                foreach (int index in _selection)
                {
                    var entry = _folder.SubEntries.ElementAt(index);

                    if (entry.Value is CASCFile)
                        ExtractFile(entry.Value as CASCFile);
                    else
                        ExtractData(entry.Value as CASCFolder, null);
                }
            }
            else
            {
                foreach (var entry in _folder.SubEntries)
                {
                    if (entry.Value is CASCFile)
                        ExtractFile(entry.Value as CASCFile);
                    else
                        ExtractData(entry.Value as CASCFolder, null);
                }
            }
        }
예제 #49
0
        protected override CASCFolder CreateStorageTree()
        {
            var root = new CASCFolder("root");

            CountSelect = 0;

            // Create new tree based on specified locale
            foreach (var rootEntry in RootData)
            {
                var rootInfosLocale = rootEntry.Value.Where(re => (re.LocaleFlags & Locale) != 0);

                if (!rootInfosLocale.Any())
                    continue;

                CreateSubTree(root, rootEntry.Key, CASCFile.FileNames[rootEntry.Key]);
                CountSelect++;
            }

            Logger.WriteLine("D3RootHandler: {0} file names missing extensions for locale {1}", CountUnknown, Locale);

            return root;
        }
예제 #50
0
        protected override CASCFolder CreateStorageTree()
        {
            var root = new CASCFolder("root");

            CountSelect = 0;

            // Cleanup fake names for unknown files
            CountUnknown = 0;

            foreach (var unkFile in UnknownFiles)
                CASCFile.FileNames.Remove(unkFile);

            // Create new tree based on specified locale
            foreach (var rootEntry in RootData)
            {
                var rootInfosLocale = rootEntry.Value.Where(re => (re.Block.LocaleFlags & Locale) != 0);

                if (rootInfosLocale.Count() > 1)
                {
                    var rootInfosLocaleAndContent = rootInfosLocale.Where(re => (re.Block.ContentFlags == Content));

                    if (rootInfosLocaleAndContent.Any())
                        rootInfosLocale = rootInfosLocaleAndContent;
                }

                if (!rootInfosLocale.Any())
                    continue;

                string file;

                if (!CASCFile.FileNames.TryGetValue(rootEntry.Key, out file))
                {
                    file = "unknown\\" + rootEntry.Key.ToString("X16") + "_" + rootEntry.Value.First().FileDataId;

                    CountUnknown++;
                    UnknownFiles.Add(rootEntry.Key);
                }

                CreateSubTree(root, rootEntry.Key, file);
                CountSelect++;
            }

            Logger.WriteLine("WowRootHandler: {0} file names missing for locale {1}", CountUnknown, Locale);

            return root;
        }
예제 #51
0
        protected override CASCFolder CreateStorageTree()
        {
            var root = new CASCFolder("root");

            // Reset counts
            CountSelect = 0;
            UnknownFiles.Clear();

            // Create new tree based on specified locale
            foreach (var rootEntry in RootData)
            {
                var rootInfosLocale = rootEntry.Value.Where(re => (re.LocaleFlags & Locale) != 0);

                if (rootInfosLocale.Count() > 1)
                {
                    var rootInfosLocaleAndContent = rootInfosLocale.Where(re => (re.ContentFlags == Content));

                    if (rootInfosLocaleAndContent.Any())
                        rootInfosLocale = rootInfosLocaleAndContent;
                }

                if (!rootInfosLocale.Any())
                    continue;

                string file;

                if (!CASCFile.FileNames.TryGetValue(rootEntry.Key, out file))
                {
                    file = "unknown\\" + rootEntry.Key.ToString("X16") + "_" + GetFileDataIdByHash(rootEntry.Key);

                    UnknownFiles[rootEntry.Key] = true;
                }

                CreateSubTree(root, rootEntry.Key, file);
                CountSelect++;
            }

            Logger.WriteLine("WowRootHandler: {0} file names missing for locale {1}", CountUnknown, Locale);

            return root;
        }
예제 #52
0
파일: InitForm.cs 프로젝트: aeo24/WoWMap
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            DialogResult = DialogResult.Cancel;

            if (e.Cancelled)
            {
                MessageBox.Show("Loading cancelled", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                //Application.Exit();
                return;
            }

            if (e.Error != null)
            {
                MessageBox.Show("Loading failed due to:\n" + e.Error.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                //Application.Exit();
                return;
            }

            if (e.Result == null)
            {
                MessageBox.Show("Loading failed: Result is null", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                //Application.Exit();
                return;
            }

            var result = (object[])e.Result;
            CASC = (CASCHandler)result[0];
            Root = (CASCFolder)result[1];

            DialogResult = DialogResult.OK;
        }
예제 #53
0
        public void UpdateListView(CASCFolder baseEntry, NoFlickerListView fileList, string filter)
        {
            Wildcard wildcard = new Wildcard(filter, false, RegexOptions.IgnoreCase);

            // Sort
            baseEntry.Entries = baseEntry.EntriesMirror.Where(v => v.Value is CASCFolder || (v.Value is CASCFile && wildcard.IsMatch(v.Value.Name))).
                OrderBy(v => v.Value, Sorter).ToDictionary(pair => pair.Key, pair => pair.Value);

            // Update
            fileList.Tag = baseEntry;
            fileList.VirtualListSize = 0;
            fileList.VirtualListSize = baseEntry.Entries.Count;

            if (fileList.VirtualListSize > 0)
            {
                fileList.EnsureVisible(0);
                fileList.SelectedIndex = 0;
                fileList.FocusedItem = fileList.Items[0];
            }
        }
예제 #54
0
        public void Cleanup()
        {
            Sorter.CASC = null;

            _currentFolder = null;
            _root = null;

            _displayedEntries?.Clear();
            _displayedEntries = null;

            _casc?.Clear();
            _casc = null;

            OnCleanup?.Invoke();
        }
예제 #55
0
파일: FileScanner.cs 프로젝트: aeo24/WoWMap
 public FileScanner(CASCHandler casc, CASCFolder root)
 {
     CASC = casc;
     Root = root;
 }
예제 #56
0
        public CASCHandler(CASCFolder root, BackgroundWorker worker)
        {
            if (!OnlineMode)
            {
                var idxFiles = GetIdxFiles(Properties.Settings.Default.WowPath);

                if (idxFiles.Count == 0)
                    throw new FileNotFoundException("idx files missing!");

                worker.ReportProgress(0);

                int idxIndex = 0;

                foreach (var idx in idxFiles)
                {
                    using (var fs = new FileStream(idx, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    using (var br = new BinaryReader(fs))
                    {
                        int h2Len = br.ReadInt32();
                        int h2Check = br.ReadInt32();
                        byte[] h2 = br.ReadBytes(h2Len);

                        long padPos = (8 + h2Len + 0x0F) & 0xFFFFFFF0;
                        fs.Position = padPos;

                        int dataLen = br.ReadInt32();
                        int dataCheck = br.ReadInt32();

                        int numBlocks = dataLen / 18;

                        for (int i = 0; i < numBlocks; i++)
                        {
                            IndexEntry info = new IndexEntry();
                            byte[] key = br.ReadBytes(9);
                            int indexHigh = br.ReadByte();
                            int indexLow = br.ReadInt32BE();

                            info.Index = (int)((byte)(indexHigh << 2) | ((indexLow & 0xC0000000) >> 30));
                            info.Offset = (indexLow & 0x3FFFFFFF);
                            info.Size = br.ReadInt32();

                            // duplicate keys wtf...
                            //IndexData[key] = info; // use last key
                            if (!LocalIndexData.ContainsKey(key)) // use first key
                                LocalIndexData.Add(key, info);
                        }

                        padPos = (dataLen + 0x0FFF) & 0xFFFFF000;
                        fs.Position = padPos;

                        fs.Position += numBlocks * 18;
                        //for (int i = 0; i < numBlocks; i++)
                        //{
                        //    var bytes = br.ReadBytes(18); // unknown data
                        //}

                        if (fs.Position != fs.Position)
                            throw new Exception("idx file under read");
                    }

                    worker.ReportProgress((int)((float)++idxIndex / (float)idxFiles.Count * 100));
                }

                Logger.WriteLine("CASCHandler: loaded {0} indexes", LocalIndexData.Count);
            }

            worker.ReportProgress(0);

            using (var fs = OpenEncodingFile())
            using (var br = new BinaryReader(fs))
            {
                br.ReadBytes(2); // EN
                byte b1 = br.ReadByte();
                byte b2 = br.ReadByte();
                byte b3 = br.ReadByte();
                ushort s1 = br.ReadUInt16();
                ushort s2 = br.ReadUInt16();
                int numEntries = br.ReadInt32BE();
                int i1 = br.ReadInt32BE();
                byte b4 = br.ReadByte();
                int entriesOfs = br.ReadInt32BE();

                fs.Position += entriesOfs; // skip strings

                fs.Position += numEntries * 32;
                //for (int i = 0; i < numEntries; ++i)
                //{
                //    br.ReadBytes(16);
                //    br.ReadBytes(16);
                //}

                for (int i = 0; i < numEntries; ++i)
                {
                    ushort keysCount;

                    while ((keysCount = br.ReadUInt16()) != 0)
                    {
                        int fileSize = br.ReadInt32BE();
                        byte[] md5 = br.ReadBytes(16);

                        var entry = new EncodingEntry();
                        entry.Size = fileSize;

                        for (int ki = 0; ki < keysCount; ++ki)
                        {
                            byte[] key = br.ReadBytes(16);

                            entry.Keys.Add(key);
                        }

                        //Encodings[md5] = entry;
                        EncodingData.Add(md5, entry);
                    }

                    //br.ReadBytes(28);
                    while (br.PeekChar() == 0)
                        fs.Position++;

                    worker.ReportProgress((int)((float)fs.Position / (float)fs.Length * 100));
                }
                //var pos = br.BaseStream.Position;
                //for (int i = 0; i < i1; ++i)
                //{
                //    br.ReadBytes(16);
                //    br.ReadBytes(16);
                //}
                Logger.WriteLine("CASCHandler: loaded {0} encoding data", EncodingData.Count);
            }

            worker.ReportProgress(0);

            using (var fs = OpenRootFile())
            using (var br = new BinaryReader(fs))
            {
                while (fs.Position < fs.Length)
                {
                    int count = br.ReadInt32();

                    RootBlock block = new RootBlock();
                    block.Unk1 = br.ReadUInt32();
                    block.Flags = (LocaleFlags)br.ReadUInt32();

                    if (block.Flags == LocaleFlags.None)
                        throw new Exception("block.Flags == LocaleFlags.None");

                    RootEntry[] entries = new RootEntry[count];

                    for (var i = 0; i < count; ++i)
                    {
                        entries[i] = new RootEntry();
                        entries[i].Block = block;
                        entries[i].Unk1 = br.ReadInt32();
                    }

                    for (var i = 0; i < count; ++i)
                    {
                        entries[i].MD5 = br.ReadBytes(16);

                        ulong hash = br.ReadUInt64();
                        entries[i].Hash = hash;

                        // don't load other locales
                        //if (block.Flags != LocaleFlags.All && (block.Flags & LocaleFlags.enUS) == 0)
                        //    continue;

                        if (!RootData.ContainsKey(hash))
                        {
                            RootData[hash] = new List<RootEntry>();
                            RootData[hash].Add(entries[i]);
                        }
                        else
                            RootData[hash].Add(entries[i]);
                    }

                    worker.ReportProgress((int)((float)fs.Position / (float)fs.Length * 100));
                }

                Logger.WriteLine("CASCHandler: loaded {0} root data", RootData.Count);
            }

            worker.ReportProgress(0);

            if (File.Exists(listFile))
            {
                FolderNames[Hasher.ComputeHash("root")] = "root";

                using (StreamReader sr = new StreamReader(listFile))
                {
                    string file;
                    int filesCount = 0;

                    CASCFolder folder = root;

                    while ((file = sr.ReadLine()) != null)
                    {
                        ulong fileHash = Hasher.ComputeHash(file);

                        // skip invalid names
                        if (!RootData.ContainsKey(fileHash))
                        {
                            Logger.WriteLine("Invalid file name: {0}", file);
                            continue;
                        }

                        filesCount++;

                        string[] parts = file.Split('\\');

                        for (int i = 0; i < parts.Length; ++i)
                        {
                            bool isFile = (i == parts.Length - 1);

                            ulong hash = isFile ? fileHash : Hasher.ComputeHash(parts[i]);

                            ICASCEntry entry = folder.GetEntry(hash);

                            if (entry == null)
                            {
                                if (isFile)
                                {
                                    entry = new CASCFile(hash);
                                    FileNames[hash] = file;
                                }
                                else
                                {
                                    entry = new CASCFolder(hash);
                                    FolderNames[hash] = parts[i];
                                }

                                folder.SubEntries[hash] = entry;

                                if (isFile)
                                {
                                    folder = root;
                                    break;
                                }
                            }

                            folder = entry as CASCFolder;
                        }

                        if ((filesCount % 1000) == 0)
                            worker.ReportProgress((int)((float)sr.BaseStream.Position / (float)sr.BaseStream.Length * 100));
                    }

                    Logger.WriteLine("CASCHandler: loaded {0} file names", FileNames.Count);
                }
            }
            else
            {
                throw new FileNotFoundException("list file missing!");
            }
        }
예제 #57
0
        protected override CASCFolder CreateStorageTree()
        {
            var root = new CASCFolder("root");

            CountSelect = 0;
            CountUnknown = 0;

            foreach (var rootEntry in _rootData)
            {
                if ((rootEntry.Value.baseEntry.LocaleFlags & Locale) == 0)
                    continue;

                CreateSubTree(root, rootEntry.Key, CASCFile.FileNames[rootEntry.Key]);
                CountSelect++;
            }

            Logger.WriteLine("OwRootHandler: {0} file names missing for locale {1}", CountUnknown, Locale);

            return root;
        }
예제 #58
0
파일: ScanForm.cs 프로젝트: aeo24/WoWMap
        private void ScanFolder(CASCFolder folder)
        {
            foreach (var entry in folder.Entries)
            {
                if (entry.Value is CASCFile)
                {
                    var rootEntries = CASC.Root.GetEntries(entry.Value.Hash);

                    foreach (var rootEntry in rootEntries)
                        ScanFile(entry.Value as CASCFile);
                }
                else
                    ScanFolder(entry.Value as CASCFolder);
            }
        }