Beispiel #1
0
        /// <summary>
        /// Load an index file
        /// </summary>
        /// <param name="file">File path</param>
        /// <param name="bucketIndex">Index</param>
        /// <exception cref="InvalidDataException">Index file is invalid</exception>
        private unsafe void LoadIndexFile(string file, int bucketIndex)
        {
            using (Stream stream = File.OpenRead(file))
                using (BinaryReader reader = new BinaryReader(stream)) {
                    var header = reader.Read <IndexHeaderV2>();

                    if (header.IndexVersion != 0x07 ||
                        header.BucketIndex != bucketIndex ||
                        header.ExtraBytes != 0x00 ||
                        header.SpanSizeBytes != 0x04 ||
                        header.SpanOffsBytes != 0x05 ||
                        header.EKeyBytes != EKey.CASC_EKEY_SIZE)
                    {
                        throw new InvalidDataException("invalid index header");
                    }

                    var eKey1Block = reader.Read <BlockSizeAndHash>();
                    int entryCount = eKey1Block.BlockSize / sizeof(EKeyEntry);

                    EKeyEntry[] entries = reader.ReadArray <EKeyEntry>(entryCount);
                    for (int i = 0; i < entryCount; i++)
                    {
                        EKeyEntry entry = entries[i];
                        if (IndexEntries.ContainsKey(entry.EKey))
                        {
                            continue;
                        }

                        IndexEntries[entry.EKey] = new IndexEntry(entry);
                    }
                }
        }
Beispiel #2
0
            public unsafe IndexEntry(EKeyEntry entry)
            {
                int indexHigh = entry.FileOffsetBE[0];
                int indexLow  = Int32FromPtrBE(entry.FileOffsetBE + 1);

                Index  = indexHigh << 2 | (byte)((indexLow & 0xC0000000) >> 30);
                Offset = indexLow & 0x3FFFFFFF;
            }
Beispiel #3
0
        /// <summary>
        /// Load an index file
        /// </summary>
        /// <param name="file">File path</param>
        /// <param name="bucketIndex">Index</param>
        /// <exception cref="InvalidDataException">Index file is invalid</exception>
        private unsafe void LoadIndexFile(string file, int bucketIndex)
        {
            using (Stream stream = File.OpenRead(file))
                using (BinaryReader reader = new BinaryReader(stream)) {
                    var header = reader.Read <IndexHeaderV2>();

                    if (header.IndexVersion != 0x07 ||
                        header.BucketIndex != bucketIndex ||
                        header.ExtraBytes != 0x00 ||
                        header.SpanSizeBytes != 0x04 ||
                        header.SpanOffsBytes != 0x05 ||
                        header.EKeyBytes != EKey.CASC_EKEY_SIZE)
                    {
                        throw new InvalidDataException("invalid index header");
                    }

                    var eKey1Block = reader.Read <BlockSizeAndHash>();
                    int entryCount = eKey1Block.BlockSize / sizeof(EKeyEntry);

                    EKeyEntry[]            entries       = reader.ReadArray <EKeyEntry>(entryCount);
                    Dictionary <int, long> dataFileSizes = new Dictionary <int, long>();
                    for (int i = 0; i < entryCount; i++)
                    {
                        EKeyEntry entry = entries[i];
                        if (IndexEntries.ContainsKey(entry.EKey))
                        {
                            continue;
                        }

                        IndexEntry indexEntry = new IndexEntry(entry);

                        if (!dataFileSizes.TryGetValue(indexEntry.Index, out long dataFileSize))
                        {
                            var path = GetDataFilePath(indexEntry.Index);
                            if (!File.Exists(path))
                            {
                                continue;
                            }
                            dataFileSize = new FileInfo(path).Length;
                            dataFileSizes[indexEntry.Index] = dataFileSize;
                        }

                        if (indexEntry.Offset >= dataFileSize)
                        {
                            continue;
                        }

                        IndexEntries[entry.EKey] = indexEntry;
                    }
                }
        }