Esempio n. 1
0
 public UiDataTableNode(ArchiveListing listing, UiArchiveExtension extension, ArchiveEntry indices)
     : base(indices.Name, UiNodeType.DataTable)
 {
     _listing   = listing;
     _extension = extension;
     _indices   = indices;
 }
Esempio n. 2
0
 public UiArciveLeafsAccessor(ArchiveListing listing, bool? conversion, bool? compression, params ArchiveEntry[] leafs)
 {
     _listing = listing;
     _leafs = leafs;
     _conversion = conversion;
     _compression = compression;
 }
Esempio n. 3
0
        public void WriteListings()
        {
            HashSet <ArchiveListing> set = new HashSet <ArchiveListing>();

            foreach (ArchiveListing listing in _set)
            {
                ArchiveListing item = listing;
                while (item != null && set.Add(item))
                {
                    item = item.Parent;
                }
            }

            Action <ArchiveListing> writer;

            switch (InteractionService.GamePart)
            {
            case FFXIIIGamePart.Part1:
                writer = ArchiveListingWriterV1.Write;
                break;

            case FFXIIIGamePart.Part2:
                writer = ArchiveListingWriterV2.Write;
                break;

            default:
                throw new NotSupportedException(InteractionService.GamePart.ToString());
            }

            foreach (ArchiveListing listing in set.OrderByDescending(l => l.Accessor.Level))
            {
                writer(listing);
            }
        }
Esempio n. 4
0
        private void ParseEntries(ArchiveListingEntryInfoV1[] entries, ArchiveListingCompressedData data, ArchiveListing result)
        {
            byte[] buff = new byte[0];

            for (int currentBlock = -1, i = 0; i < entries.Length; i++)
            {
                ArchiveListingEntryInfoV1 entryInfoV1 = entries[i];
                if (entryInfoV1.BlockNumber != currentBlock)
                {
                    currentBlock = entryInfoV1.BlockNumber;
                    buff = data.AcquireData(currentBlock);
                }

                string name;
                long sector, uncompressedSize, compressedSize;
                ParseInfo(entryInfoV1, buff, out sector, out uncompressedSize, out compressedSize, out name);

                ArchiveEntry entry = new ArchiveEntry(name, sector, compressedSize, uncompressedSize)
                {
                    UnknownNumber = entryInfoV1.UnknownNumber,
                    UnknownValue = entryInfoV1.UnknownValue
                };

                result.Add(entry);
                _progressIncrement.NullSafeInvoke(1);
            }
        }
Esempio n. 5
0
        public void Show(ArchiveListing listing, ArchiveEntry entry)
        {
            _listing = listing;
            _entry = entry;

            if (listing == null || entry == null)
            {
                _textBox.Text = null;
                return;
            }

            FFXIIITextEncoding encoding = InteractionService.TextEncoding.Provide().Encoding;

            ZtrFileEntry[] entries;
            using (Stream data = listing.Accessor.ExtractBinary(entry))
            {
                ZtrFileUnpacker unpacker = new ZtrFileUnpacker(data, encoding);
                entries = unpacker.Unpack();
            }

            if (entries.IsNullOrEmpty())
                return;

            using (MemoryStream ms = new MemoryStream(4096))
            {
                ZtrTextWriter writer = new ZtrTextWriter(ms, StringsZtrFormatter.Instance);
                writer.Write(entry.Name, entries);

                ms.Position = 0;
                using (StreamReader sr = new StreamReader(ms, System.Text.Encoding.UTF8, false))
                    _textBox.Text = sr.ReadToEnd();
            }

            Visibility = Visibility.Visible;
        }
Esempio n. 6
0
 public UiArciveLeafsAccessor(ArchiveListing listing, bool?conversion, bool?compression, params ArchiveEntry[] leafs)
 {
     _listing     = listing;
     _leafs       = leafs;
     _conversion  = conversion;
     _compression = compression;
 }
        public ArchiveListing Read()
        {
            ArchiveListingHeaderV2 header;
            Stream input = Decrypt(out header);

            _progressTotalChanged.NullSafeInvoke(header.EntriesCount);

            short blockNumber = -1;
            bool? flag = null;

            ArchiveListingEntryInfoV2[] entries = new ArchiveListingEntryInfoV2[header.EntriesCount];
            for (int i = 0; i < entries.Length; i++)
            {
                entries[i] = input.ReadContent<ArchiveListingEntryInfoV2>();
                if (entries[i].Flag != flag)
                {
                    flag = entries[i].Flag;
                    blockNumber++;
                }
                entries[i].BlockNumber = blockNumber;
            }

            ArchiveListingCompressedData data = new ArchiveListingCompressedData(header);
            data.ReadFromStream(input);

            ArchiveListing result = new ArchiveListing(_accessor, header.EntriesCount);
            ParseEntries(entries, data, result);
            return result;
        }
        private void Inject(ArchiveListing listing, ArchiveEntry entry, Dictionary <String, String> sourceEntries, Stream output)
        {
            ZtrFileType type = ZtrFileType.LittleEndianUncompressedDictionary;

            ZtrFileEntry[] targetEntries;
            using (Stream original = listing.Accessor.ExtractBinary(entry))
            {
                ZtrFileUnpacker unpacker = new ZtrFileUnpacker(original, InteractionService.TextEncoding.Provide().Encoding);
                targetEntries = unpacker.Unpack();

                if (InteractionService.GamePart == FFXIIIGamePart.Part2)
                {
                    if (entry.Name.StartsWith("txtres/resident/system/txtres_", StringComparison.InvariantCultureIgnoreCase))
                    {
                        type = ZtrFileType.BigEndianCompressedDictionary;
                    }
                }
            }

            MergeEntries(sourceEntries, targetEntries);

            ZtrFilePacker packer = new ZtrFilePacker(output, InteractionService.TextEncoding.Provide().Encoding, type);

            packer.Pack(targetEntries);
        }
Esempio n. 9
0
 public UiDataTableNode(ArchiveListing listing, UiArchiveExtension extension, ArchiveEntry indices)
     : base(indices.Name, UiNodeType.DataTable)
 {
     _listing = listing;
     _extension = extension;
     _indices = indices;
 }
Esempio n. 10
0
        private bool TryAddImgbPair(ArchiveListing listing, ArchiveEntry entry, string entryPath, string entryName)
        {
            string ext = PathEx.GetMultiDotComparableExtension(entryName);

            switch (ext)
            {
            case ".win32.xfv":
            case ".win32.xgr":
            case ".win32.xwb":
                break;

            case ".win32.trb":
                break;

            case ".win32.imgb":
                break;

            default:
                return(false);
            }

            string longName = entryPath.Substring(0, entryPath.Length - ext.Length);

            if (IsUnexpectedEntry(listing.Name, longName))
            {
                return(false);
            }

            return(SetPairedEntry(listing, entry, ext, longName));
        }
Esempio n. 11
0
 public UiFileTableNode(ArchiveListing listing, UiArchiveExtension extension, ArchiveEntry indices, ArchiveEntry binary)
     : base(indices.Name, UiNodeType.FileTable)
 {
     _listing = listing;
     _extension = extension;
     _indices = indices;
     _binary = binary;
 }
Esempio n. 12
0
 public UiFileTableNode(ArchiveListing listing, UiArchiveExtension extension, ArchiveEntry indices, ArchiveEntry binary)
     : base(indices.Name, UiNodeType.FileTable)
 {
     _listing   = listing;
     _extension = extension;
     _indices   = indices;
     _binary    = binary;
 }
Esempio n. 13
0
 public UiArchiveExtractor(ArchiveListing listing, ArchiveEntry[] leafs, bool? conversion, IUiExtractionTarget target)
 {
     _listing = listing;
     _leafs = leafs;
     _target = target;
     _conversion = conversion;
     _extractors = ProvideExtractors();
 }
Esempio n. 14
0
 public UiArchiveExtractor(ArchiveListing listing, ArchiveEntry[] leafs, bool?conversion, IUiExtractionTarget target)
 {
     _listing    = listing;
     _leafs      = leafs;
     _target     = target;
     _conversion = conversion;
     _extractors = ProvideExtractors();
 }
Esempio n. 15
0
 public UiArchiveInjector(ArchiveListing listing, ArchiveEntry[] leafs, bool?conversion, bool?compression, IUiInjectionSource source)
 {
     _listing       = listing;
     _leafs         = leafs;
     _source        = source;
     _conversion    = conversion;
     _compression   = compression;
     _injectionData = new ArchiveEntryInjectionData(_listing, OpenOutputStream);
     _injectors     = ProvideInjectors();
 }
Esempio n. 16
0
 public UiArchiveInjector(ArchiveListing listing, ArchiveEntry[] leafs, bool? conversion, bool? compression, IUiInjectionSource source)
 {
     _listing = listing;
     _leafs = leafs;
     _source = source;
     _conversion = conversion;
     _compression = compression;
     _injectionData = new ArchiveEntryInjectionData(_listing, OpenOutputStream);
     _injectors = ProvideInjectors();
 }
Esempio n. 17
0
        private ImgbArchiveAccessor CreateAccessorV2()
        {
            GameLocationInfo gameLocation = InteractionService.GameLocation.Provide();
            string           binaryPath   = Path.Combine(gameLocation.SystemDirectory, "white_imgc.win32.bin");
            string           listingPath  = Path.Combine(gameLocation.SystemDirectory, "filelistc.win32.bin");

            ArchiveAccessor accessor  = new ArchiveAccessor(binaryPath, listingPath);
            ArchiveListing  listing   = ArchiveListingReaderV1.Read(accessor, null, null);
            ArchiveEntry    xgrEntry  = listing.Single(n => n.Name.EndsWith(@"gui/resident/system.win32.xgr"));
            ArchiveEntry    imgbEntry = listing.Single(n => n.Name.EndsWith(@"gui/resident/system.win32.imgb"));

            return(new ImgbArchiveAccessor(listing, xgrEntry, imgbEntry));
        }
        public void Write(ArchiveListing listing, out ArchiveListingBlockInfo[] blocksInfo, out ArchiveListingEntryInfoV1[] entriesInfoV1)
        {
            using (MemoryStream ms = new MemoryStream(32768))
            {
                int blockNumber = 0, unpackedBlockOffset = 0;
                entriesInfoV1 = new ArchiveListingEntryInfoV1[listing.Count];
                List<ArchiveListingBlockInfo> blocks = new List<ArchiveListingBlockInfo>(128);
                using (FormattingStreamWriter sw = new FormattingStreamWriter(ms, Encoding.ASCII, 4096, true, CultureInfo.InvariantCulture))
                {
                    sw.AutoFlush = true;
                    for (int i = 0; i < listing.Count; i++)
                    {
                        ArchiveEntry entry = listing[i];
                        entriesInfoV1[i] = new ArchiveListingEntryInfoV1 {BlockNumber = (short)(ms.Position / 8192)};

                        if (blockNumber != entriesInfoV1[i].BlockNumber)
                        {
                            //sw.Write("end\0");
                            int blockSize = (int)(ms.Position - unpackedBlockOffset);
                            ms.Position = unpackedBlockOffset;
                            ArchiveListingBlockInfo block = new ArchiveListingBlockInfo {Offset = (int)_output.Position, UncompressedSize = blockSize};
                            block.CompressedSize = ZLibHelper.Compress(ms, _output, block.UncompressedSize);
                            blocks.Add(block);

                            blockNumber++;
                            unpackedBlockOffset = (int)ms.Position;
                            sw.Write("{0:x}:{1:x}:{2:x}:{3}\0", entry.Sector, entry.UncompressedSize, entry.Size, entry.Name);
                        }
                        else if (i == listing.Count - 1)
                        {
                            entriesInfoV1[i].Offset = (short)(ms.Position - unpackedBlockOffset);
                            sw.Write("{0:x}:{1:x}:{2:x}:{3}\0end\0", entry.Sector, entry.UncompressedSize, entry.Size, entry.Name);
                            int blockSize = (int)(ms.Position - unpackedBlockOffset);
                            ms.Position = unpackedBlockOffset;
                            ArchiveListingBlockInfo block = new ArchiveListingBlockInfo {Offset = (int)_output.Position, UncompressedSize = blockSize};
                            block.CompressedSize = ZLibHelper.Compress(ms, _output, block.UncompressedSize);
                            blocks.Add(block);
                        }
                        else
                        {
                            entriesInfoV1[i].Offset = (short)(ms.Position - unpackedBlockOffset);
                            sw.Write("{0:x}:{1:x}:{2:x}:{3}\0", entry.Sector, entry.UncompressedSize, entry.Size, entry.Name);
                        }

                        //lengths[i] = (int)_output.Position - offsets[i];
                        //blockSize += lengths[i];
                    }
                }
                blocksInfo = blocks.ToArray();
            }
        }
Esempio n. 19
0
        public bool TryAdd(ArchiveListing listing, ArchiveEntry entry, string entryPath, string entryName)
        {
            if (TryAddZoneListing(listing, entry, entryPath))
                return true;

            // ������ ��� ������ ��� ����������� �� �������
            //if (TryAddSoundListing(listing, entry, entryName))
            //    return true;

            if (TryAddImgbPair(listing, entry, entryPath, entryName))
                return true;

            return false;
        }
Esempio n. 20
0
        public ArchiveListing Read()
        {
            ArchiveListingHeader header = _input.ReadStruct<ArchiveListingHeader>();
            _progressTotalChanged.NullSafeInvoke(header.EntriesCount);

            ArchiveListingEntryInfoV1[] entries = _input.ReadStructs<ArchiveListingEntryInfoV1>(header.EntriesCount);

            ArchiveListingCompressedData data = new ArchiveListingCompressedData(header);
            data.ReadFromStream(_input);

            ArchiveListing result = new ArchiveListing(_accessor, header.EntriesCount);
            ParseEntries(entries, data, result);
            return result;
        }
Esempio n. 21
0
        private bool TryAddZoneListing(ArchiveListing parentListing, ArchiveEntry entry, string entryPath)
        {
            if (_areasDirectory == null)
            {
                return(false);
            }

            if (!entryPath.StartsWith("zone/filelist"))
            {
                return(false);
            }

            // Slip an empty archives
            if (entryPath.EndsWith("2"))
            {
                return(false);
            }

            string binaryName;

            switch (InteractionService.GamePart)
            {
            case FFXIIIGamePart.Part1:
                binaryName = $"white_{entryPath.Substring(14, 5)}_img{(entryPath.EndsWith("2") ? "2" : string.Empty)}.win32.bin";
                break;

            case FFXIIIGamePart.Part2:
                binaryName = $"white_{entryPath.Substring(14, 6)}_img{(entryPath.EndsWith("2") ? "2" : string.Empty)}.win32.bin";
                break;

            default:
                throw new NotSupportedException("InteractionService.GamePart");
            }

            string binaryPath = Path.Combine(_areasDirectory, binaryName);

            if (!File.Exists(binaryPath))
            {
                return(false);
            }

            ArchiveAccessor        accessor  = parentListing.Accessor.CreateDescriptor(binaryPath, entry);
            ConcurrentBag <UiNode> container = ProvideRootNodeChilds(UiArchiveExtension.Bin);

            container.Add(new UiArchiveNode(accessor, parentListing));

            return(true);
        }
Esempio n. 22
0
        private void OnArchiveLeafSelected(UiArchiveLeaf archiveLeaf)
        {
            ArchiveEntry   entry   = archiveLeaf.Entry;
            ArchiveListing listing = archiveLeaf.Listing;

            switch (Path.GetExtension(entry.Name))
            {
            case ".scd":
                _sound.Show(listing, entry);
                break;

            case ".ztr":
                _ztr.Show(listing, entry);
                break;
            }
        }
Esempio n. 23
0
        public void Show(ArchiveListing listing, ArchiveEntry entry)
        {
            _listing = listing;
            _entry = entry;

            Visibility = Visibility.Visible;

            using (Stream input = listing.Accessor.ExtractBinary(entry))
            {
                ScdFileReader reader = new ScdFileReader(input);
                WaveStream[] waveProviders = reader.Read();
                ListItem[] items = new ListItem[waveProviders.Length];
                for (int i = 0; i < items.Length; i++)
                    items[i] = new ListItem(i.ToString("D3"), waveProviders[i]);
                _listView.ItemsSource = items;
                if (items.Length > 0)
                    _listView.SelectedIndex = 0;
            }
        }
Esempio n. 24
0
        public bool TryAdd(ArchiveListing listing, ArchiveEntry entry, string entryPath, string entryName)
        {
            if (TryAddZoneListing(listing, entry, entryPath))
            {
                return(true);
            }

            if (TryAddMoviesListing(listing, entry, entryName))
            {
                return(true);
            }

            if (TryAddImgbPair(listing, entry, entryPath, entryName))
            {
                return(true);
            }

            return(false);
        }
Esempio n. 25
0
        private bool TryAddMoviesListing(ArchiveListing parentListing, ArchiveEntry entry, String entryName)
        {
            switch (entryName)
            {
            case "movie_items.win32.wdb":
            case "movie_items_us.win32.wdb":
                break;

            default:
                return(false);
            }

            UiArchiveExtension extension = GetArchiveExtension(entry);

            UiDataTableNode        node      = new UiDataTableNode(parentListing, extension, entry);
            ConcurrentBag <UiNode> container = ProvideRootNodeChilds(extension);

            container.Add(node);

            return(true);
        }
Esempio n. 26
0
        public void Show(ArchiveListing listing, ArchiveEntry entry)
        {
            _listing = listing;
            _entry   = entry;

            Visibility = Visibility.Visible;

            using (Stream input = listing.Accessor.ExtractBinary(entry))
            {
                ScdFileReader reader        = new ScdFileReader(input);
                WaveStream[]  waveProviders = reader.Read();
                ListItem[]    items         = new ListItem[waveProviders.Length];
                for (int i = 0; i < items.Length; i++)
                {
                    items[i] = new ListItem(i.ToString("D3"), waveProviders[i]);
                }
                _listView.ItemsSource = items;
                if (items.Length > 0)
                {
                    _listView.SelectedIndex = 0;
                }
            }
        }
Esempio n. 27
0
        public void Show(ArchiveListing listing, ArchiveEntry entry)
        {
            _listing = listing;
            _entry   = entry;

            if (listing == null || entry == null)
            {
                _textBox.Text = null;
                return;
            }

            FFXIIITextEncoding encoding = InteractionService.TextEncoding.Provide().Encoding;

            ZtrFileEntry[] entries;
            using (Stream data = listing.Accessor.ExtractBinary(entry))
            {
                ZtrFileUnpacker unpacker = new ZtrFileUnpacker(data, encoding);
                entries = unpacker.Unpack();
            }

            if (entries.IsNullOrEmpty())
            {
                return;
            }

            using (MemoryStream ms = new MemoryStream(4096))
            {
                ZtrTextWriter writer = new ZtrTextWriter(ms, StringsZtrFormatter.Instance);
                writer.Write(entry.Name, entries);

                ms.Position = 0;
                using (StreamReader sr = new StreamReader(ms, System.Text.Encoding.UTF8, false))
                    _textBox.Text = sr.ReadToEnd();
            }

            Visibility = Visibility.Visible;
        }
Esempio n. 28
0
        private bool SetPairedEntry(ArchiveListing listing, ArchiveEntry entry, string ext, string longName)
        {
            Pair <ArchiveEntry, ArchiveEntry> pair = ProvidePair(longName);

            if (ext == ".win32.imgb")
            {
                pair.Item2 = entry;
            }
            else
            {
                pair.Item1 = entry;
            }

            if (!pair.IsAnyEmpty)
            {
                UiArchiveExtension extension = GetArchiveExtension(pair.Item1);

                UiFileTableNode        node      = new UiFileTableNode(listing, extension, pair.Item1, pair.Item2);
                ConcurrentBag <UiNode> container = ProvideRootNodeChilds(extension);
                container.Add(node);
            }

            return(true);
        }
Esempio n. 29
0
 public UiArchiveLeaf(string name, ArchiveEntry entry, ArchiveListing listing)
     : base(name, UiNodeType.ArchiveLeaf)
 {
     Entry   = entry;
     Listing = listing;
 }
Esempio n. 30
0
        private bool TryAddImgbPair(ArchiveListing listing, ArchiveEntry entry, string entryPath, string entryName)
        {
            string ext = PathEx.GetMultiDotComparableExtension(entryName);
            switch (ext)
            {
                case ".win32.xfv":
                case ".win32.xgr":
                case ".win32.xwb":
                case ".win32.trb":
                case ".win32.imgb":
                    break;
                default:
                    return false;
            }

            string longName = entryPath.Substring(0, entryPath.Length - ext.Length);
            if (IsUnexpectedEntry(listing.Name, longName))
                return false;

            return SetPairedEntry(listing, entry, ext, longName);
        }
Esempio n. 31
0
        private bool TryAddZoneListing(ArchiveListing parentListing, ArchiveEntry entry, string entryPath)
        {
            if (_areasDirectory == null)
                return false;

            if (!entryPath.StartsWith("zone/filelist"))
                return false;

            // ���������� ������ ������
            if (entryPath.EndsWith("2"))
                return false;

            string binaryName = String.Format("white_{0}_img{1}.win32.bin", entryPath.Substring(14, 5), entryPath.EndsWith("2") ? "2" : string.Empty);
            string binaryPath = Path.Combine(_areasDirectory, binaryName);
            if (!File.Exists(binaryPath))
                return false;

            ArchiveAccessor accessor = parentListing.Accessor.CreateDescriptor(binaryPath, entry);
            ConcurrentBag<UiNode> container = ProvideRootNodeChilds(UiArchiveExtension.Bin);
            container.Add(new UiArchiveNode(accessor, parentListing));

            return true;
        }
Esempio n. 32
0
 public ArchiveEntryInjectionData(ArchiveListing listing, Func <ArchiveEntry, Stream> ouputStreamFactory)
 {
     Listing            = listing;
     OuputStreamFactory = ouputStreamFactory;
 }
Esempio n. 33
0
 public static void Write(ArchiveListing listing)
 {
     ArchiveListingWriterV2 writer = new ArchiveListingWriterV2(listing);
     writer.Write();
 }
        private void Inject(ArchiveListing listing, ArchiveEntry entry, Dictionary<String, String> sourceEntries, Stream output)
        {
            ZtrFileEntry[] targetEntries;
            using (Stream original = listing.Accessor.ExtractBinary(entry))
            {
                ZtrFileUnpacker unpacker = new ZtrFileUnpacker(original, InteractionService.TextEncoding.Provide().Encoding);
                targetEntries = unpacker.Unpack();
            }

            MergeEntries(sourceEntries, targetEntries);

            ZtrFilePacker packer = new ZtrFilePacker(output, InteractionService.TextEncoding.Provide().Encoding);
            packer.Pack(targetEntries);
        }
Esempio n. 35
0
 public ArchiveEntryInjectionData(ArchiveListing listing, Func<ArchiveEntry, Stream> ouputStreamFactory)
 {
     Listing = listing;
     OuputStreamFactory = ouputStreamFactory;
 }
Esempio n. 36
0
        private bool SetPairedEntry(ArchiveListing listing, ArchiveEntry entry, string ext, string longName)
        {
            Pair<ArchiveEntry, ArchiveEntry> pair = ProvidePair(longName);

            if (ext == ".win32.imgb")
                pair.Item2 = entry;
            else
                pair.Item1 = entry;

            if (!pair.IsAnyEmpty)
            {
                UiArchiveExtension extension = GetArchiveExtension(pair.Item1);

                UiDataTableNode node = new UiDataTableNode(listing, extension, pair.Item1, pair.Item2);
                ConcurrentBag<UiNode> container = ProvideRootNodeChilds(extension);
                container.Add(node);
            }

            return true;
        }
Esempio n. 37
0
        private bool TryAddSoundListing(ArchiveListing parentListing, ArchiveEntry entry, String entryName)
        {
            switch (entryName)
            {
                case "filelist_sound_pack.win32.bin":
                case "filelist_sound_pack.win32_us.bin":
                    break;
                default:
                    return false;
            }

            ArchiveAccessor accessor = parentListing.Accessor.CreateDescriptor(entry);
            ConcurrentBag<UiNode> container = ProvideRootNodeChilds(UiArchiveExtension.Bin);
            container.Add(new UiArchiveNode(accessor, parentListing));

            return true;
        }
Esempio n. 38
0
        private bool TryAddImgbPair(ArchiveListing listing, ArchiveEntry entry, string entryPath, string entryName)
        {
            string ext = PathEx.GetMultiDotComparableExtension(entryName);
            //if (entryName.StartsWith("block") && ext.Contains(".win32."))
            //{
            //    Console.WriteLine();
            //}
            switch (ext)
            {
                case ".win32.xfv":
                case ".win32.xgr":
                case ".win32.xwb":
                    break;
                case ".win32.trb":
                    break;
                case ".win32.imgb":
                    break;
                default:
                    return false;
            }

            string longName = entryPath.Substring(0, entryPath.Length - ext.Length);
            if (IsUnexpectedEntry(listing.Name, longName))
                return false;

            return SetPairedEntry(listing, entry, ext, longName);
        }
Esempio n. 39
0
        private bool TryAddZoneListing(ArchiveListing parentListing, ArchiveEntry entry, string entryPath)
        {
            if (_areasDirectory == null)
                return false;

            if (!entryPath.StartsWith("zone/filelist"))
                return false;

            // ���������� ������ ������
            if (entryPath.EndsWith("2"))
                return false;

            string binaryName;
            switch (InteractionService.GamePart)
            {
                case FFXIIIGamePart.Part1:
                    binaryName = $"white_{entryPath.Substring(14, 5)}_img{(entryPath.EndsWith("2") ? "2" : string.Empty)}.win32.bin";
                    break;
                case FFXIIIGamePart.Part2:
                    binaryName = $"white_{entryPath.Substring(14, 6)}_img{(entryPath.EndsWith("2") ? "2" : string.Empty)}.win32.bin";
                    break;
                default:
                    throw new NotSupportedException("InteractionService.GamePart");
            }

            string binaryPath = Path.Combine(_areasDirectory, binaryName);
            if (!File.Exists(binaryPath))
                return false;

            ArchiveAccessor accessor = parentListing.Accessor.CreateDescriptor(binaryPath, entry);
            ConcurrentBag<UiNode> container = ProvideRootNodeChilds(UiArchiveExtension.Bin);
            container.Add(new UiArchiveNode(accessor, parentListing));

            return true;
        }
Esempio n. 40
0
        protected override UiNode[] ExpandChilds()
        {
            UiChildPackageBuilder childPackages = new UiChildPackageBuilder(InteractionService.GameLocation.Provide().AreasDirectory);

            switch (InteractionService.GamePart)
            {
            case FFXIIIGamePart.Part1:
                _listing = ArchiveListingReaderV1.Read(_accessor, null, null);
                break;

            case FFXIIIGamePart.Part2:
                _listing = ArchiveListingReaderV2.Read(_accessor, null, null);
                break;

            default:
                throw new NotSupportedException(InteractionService.GamePart.ToString());
            }

            _listing.Parent = _parentListing;

            HashSet <string>            set = new HashSet <string>();
            Dictionary <string, UiNode> dic = new Dictionary <string, UiNode>(_listing.Count * 2);

            foreach (ArchiveEntry entry in _listing)
            {
                UiNode parent = this;

                string name;
                string entryPath = entry.Name.ToLowerInvariant();
                int    index     = entryPath.LastIndexOf(Path.AltDirectorySeparatorChar);
                if (index > 0)
                {
                    name = entryPath.Substring(index + 1);
                    string directoryPath = entryPath.Substring(0, index);
                    set.Add(directoryPath);
                    if (!dic.TryGetValue(directoryPath, out parent))
                    {
                        string directoryName = directoryPath;
                        int    nameIndex     = directoryPath.LastIndexOf(Path.AltDirectorySeparatorChar);
                        if (nameIndex > 0)
                        {
                            directoryName = directoryPath.Substring(nameIndex + 1);
                        }

                        parent = new UiContainerNode(directoryName, UiNodeType.Directory);
                        dic.Add(directoryPath, parent);
                    }
                }
                else
                {
                    name = entryPath;
                }

                if (!dic.ContainsKey(entryPath))
                {
                    dic.Add(entryPath, new UiArchiveLeaf(name, entry, _listing)
                    {
                        Parent = parent
                    });
                }

                childPackages.TryAdd(_listing, entry, entryPath, name);
            }

            UiContainerNode packagesNode = childPackages.TryBuild();

            if (packagesNode != null)
            {
                packagesNode.Parent = this;
                dic.Add(packagesNode.Name, packagesNode);
            }

            string separator = Path.AltDirectorySeparatorChar.ToString();

            foreach (string dir in set)
            {
                UiNode parent = this;

                string[] parts = dir.Split(Path.AltDirectorySeparatorChar);
                for (int i = 0; i < parts.Length; i++)
                {
                    UiNode node;
                    string name = parts[i];
                    string path = String.Join(separator, parts, 0, i + 1);
                    if (!dic.TryGetValue(path, out node))
                    {
                        node = new UiContainerNode(name, UiNodeType.Directory);
                        dic.Add(path, node);
                    }
                    node.Parent = parent;
                    parent      = node;
                }
            }

            UiNode[] result = EmptyChilds;
            foreach (IGrouping <UiNode, UiNode> group in dic.Values.GroupBy(n => n.Parent))
            {
                if (group.Key == this)
                {
                    result = group.ToArray();
                    continue;
                }

                UiContainerNode dir = ((UiContainerNode)group.Key);
                dir.SetChilds(group.ToArray());
            }

            foreach (UiNode node in dic.Values)
            {
                if (node.Type != UiNodeType.Directory)
                {
                    continue;
                }

                UiContainerNode container = (UiContainerNode)node;
                container.AbsorbSingleChildContainer();
            }

            return(result);
        }
Esempio n. 41
0
 public UiArchiveNode(ArchiveAccessor accessor, ArchiveListing parentListing)
     : base(accessor.ListingEntry.Name, UiNodeType.Archive)
 {
     _accessor      = accessor;
     _parentListing = parentListing;
 }
Esempio n. 42
0
 public void Enqueue(ArchiveListing parent)
 {
     _set.Add(parent);
 }
Esempio n. 43
0
 public ImgbArchiveAccessor(ArchiveListing parent, ArchiveEntry headersEntry, ArchiveEntry contentEntry)
     : base(parent, headersEntry)
 {
     ContentEntry = contentEntry;
 }
Esempio n. 44
0
 public ImgbArchiveAccessor(ArchiveListing parent, ArchiveEntry xgrHeadersEntry, ArchiveEntry xgrContentEntry)
 {
     Parent = parent;
     XgrHeadersEntry = xgrHeadersEntry;
     XgrContentEntry = xgrContentEntry;
 }
Esempio n. 45
0
 public UiArchiveNode(ArchiveAccessor accessor, ArchiveListing parentListing)
     : base(accessor.ListingEntry.Name, UiNodeType.Archive)
 {
     _accessor = accessor;
     _parentListing = parentListing;
 }
Esempio n. 46
0
        private bool TryAddMoviesListing(ArchiveListing parentListing, ArchiveEntry entry, String entryName)
        {
            switch (entryName)
            {
                case "movie_items.win32.wdb":
                case "movie_items_us.win32.wdb":
                    break;
                default:
                    return false;
            }

            UiArchiveExtension extension = GetArchiveExtension(entry);

            UiDataTableNode node = new UiDataTableNode(parentListing, extension, entry);
            ConcurrentBag<UiNode> container = ProvideRootNodeChilds(extension);
            container.Add(node);

            return true;
        }
Esempio n. 47
0
        protected override UiNode[] ExpandChilds()
        {
            UiChildPackageBuilder childPackages = new UiChildPackageBuilder(InteractionService.GameLocation.Provide().AreasDirectory);

            _listing = ArchiveListingReaderV1.Read(_accessor, null, null);
            _listing.Parent = _parentListing;

            HashSet<string> set = new HashSet<string>();
            Dictionary<string, UiNode> dic = new Dictionary<string, UiNode>(_listing.Count * 2);

            foreach (ArchiveEntry entry in _listing)
            {
                UiNode parent = this;

                string name;
                string entryPath = entry.Name.ToLowerInvariant();
                int index = entryPath.LastIndexOf(Path.AltDirectorySeparatorChar);
                if (index > 0)
                {
                    name = entryPath.Substring(index + 1);
                    string directoryPath = entryPath.Substring(0, index);
                    set.Add(directoryPath);
                    if (!dic.TryGetValue(directoryPath, out parent))
                    {
                        string directoryName = directoryPath;
                        int nameIndex = directoryPath.LastIndexOf(Path.AltDirectorySeparatorChar);
                        if (nameIndex > 0)
                            directoryName = directoryPath.Substring(nameIndex + 1);

                        parent = new UiContainerNode(directoryName, UiNodeType.Directory);
                        dic.Add(directoryPath, parent);
                    }
                }
                else
                {
                    name = entryPath;
                }

                if (!dic.ContainsKey(entryPath))
                    dic.Add(entryPath, new UiArchiveLeaf(name, entry, _listing) {Parent = parent});

                childPackages.TryAdd(_listing, entry, entryPath, name);
            }

            UiContainerNode packagesNode = childPackages.TryBuild();
            if (packagesNode != null)
            {
                packagesNode.Parent = this;
                dic.Add(packagesNode.Name, packagesNode);
            }

            string separator = Path.AltDirectorySeparatorChar.ToString();
            foreach (string dir in set)
            {
                UiNode parent = this;

                string[] parts = dir.Split(Path.AltDirectorySeparatorChar);
                for (int i = 0; i < parts.Length; i++)
                {
                    UiNode node;
                    string name = parts[i];
                    string path = String.Join(separator, parts, 0, i + 1);
                    if (!dic.TryGetValue(path, out node))
                    {
                        node = new UiContainerNode(name, UiNodeType.Directory);
                        dic.Add(path, node);
                    }
                    node.Parent = parent;
                    parent = node;
                }
            }

            UiNode[] result = null;
            foreach (IGrouping<UiNode, UiNode> group in dic.Values.GroupBy(n => n.Parent))
            {
                if (group.Key == this)
                {
                    result = group.ToArray();
                    continue;
                }

                UiContainerNode dir = ((UiContainerNode)group.Key);
                dir.SetChilds(group.ToArray());
            }

            foreach (UiNode node in dic.Values)
            {
                if (node.Type != UiNodeType.Directory)
                    continue;

                UiContainerNode container = (UiContainerNode)node;
                container.AbsorbSingleChildContainer();
            }

            return result;
        }
Esempio n. 48
0
 private ArchiveListingWriterV2(ArchiveListing listing)
 {
     _listing = listing;
     _accessor = _listing.Accessor;
 }
Esempio n. 49
0
 public DbArchiveAccessor(ArchiveListing parent, ArchiveEntry headersEntry)
 {
     Parent = parent;
     HeadersEntry = headersEntry;
 }
Esempio n. 50
0
 public UiArchiveLeaf(string name, ArchiveEntry entry, ArchiveListing listing)
     : base(name, UiNodeType.ArchiveLeaf)
 {
     Entry = entry;
     Listing = listing;
 }
Esempio n. 51
0
 public void Enqueue(ArchiveListing parent)
 {
     _set.Add(parent);
 }