예제 #1
0
        public void LoadClass(VLTDataClassLoad classLoad, VLTFile vltFile)
        {
            _vltFile   = vltFile;
            _classLoad = classLoad;
            _classHash = classLoad.NameHash;

            _pointers = vltFile.GetChunk(VLTChunkId.Pointers) as VLTPointers;
            int offset = _pointers[classLoad.Pointer].OffsetDest;

            vltFile.RawStream.Seek(offset, SeekOrigin.Begin);
            BinaryReader br = new BinaryReader(vltFile.RawStream);

            _classFields = new ClassField[_classLoad.TotalFieldsCount];
            for (int i = 0; i < _classLoad.TotalFieldsCount; i++)
            {
                ClassField field = new ClassField();
                field.Read(br);

                // HACK: for hash dumping later on
                HashResolver.Resolve(field.NameHash);

                _classFields[i] = field;
            }

            _data = new ClassData(this);
        }
예제 #2
0
        private VLTBase ReadChunk(BinaryReader br)
        {
            if (br.BaseStream.Position == br.BaseStream.Length)
            {
                return(null);
            }

            VLTChunk chunk = new VLTChunk();

            chunk.Read(br);

            if (chunk.IsValid)
            {
                VLTBase vltbase = null;
                switch (chunk.ChunkId)
                {
                case VLTChunkId.Dependency:
                    vltbase = new VLTDependency();
                    break;

                case VLTChunkId.Strings:
                    vltbase = new VLTRaw();
                    break;

                case VLTChunkId.Data:
                    vltbase = new VLTRaw();
                    break;

                case VLTChunkId.Expression:
                    vltbase = new VLTExpression();
                    break;

                case VLTChunkId.Pointers:
                    vltbase = new VLTPointers();
                    break;

                default:
                    vltbase = new VLTRaw();
                    break;
                }
                vltbase.Chunk = chunk;
                vltbase.Read(br);
                chunk.SkipChunk(br.BaseStream);
                return(vltbase);
            }
            else
            {
                return(null);
            }
        }
예제 #3
0
        public void LoadDatabase(VLTDataDatabaseLoad dbLoad, VLTFile vltFile)
        {
            VLTPointers vltPointers = vltFile.GetChunk(VLTChunkId.Pointers) as VLTPointers;
            int         offset      = vltPointers[dbLoad.Pointer].OffsetDest;

            vltFile.RawStream.Seek(offset, SeekOrigin.Begin);
            BinaryReader br = new BinaryReader(vltFile.RawStream);

            _types = new Hashtable(dbLoad.Count);

            for (int i = 0; i < dbLoad.Count; i++)
            {
                VLTType type = new VLTType();
                type.TypeName = NullTerminatedString.Read(br);
                type.Length   = dbLoad[i];
                type.Hash     = VLTHasher.Hash(type.TypeName);
                _types.Add(type.Hash, type);
                HashResolver.AddAuto(type.TypeName);
            }

            _classes = new Hashtable();
        }
예제 #4
0
            public void Add(VLTDataCollectionLoad collLoad, VLTFile vltFile)
            {
                BinaryReader br;

                BinaryReader brR = new BinaryReader(vltFile.RawStream);
                BinaryReader brV = new BinaryReader(vltFile.VltStream);

                VLTDataRow  dataRow  = new VLTDataRow(_vltClass.FieldCount);
                VLTPointers pointers = vltFile.GetChunk(VLTChunkId.Pointers) as VLTPointers;

                int offset = 0;

#if CARBON
                if (pointers[collLoad.Pointer] == null)
                {
                    /*
                     * Debug.WriteLine(string.Format("Skipped Exp.. class='{0}', name='{1}', num1={2}, exp_ptr={3:x}, ptr_ptr={4:x}",
                     *      HashResolver.Resolve(collLoad.ClassNameHash), HashResolver.Resolve(collLoad.NameHash),
                     *      collLoad.Num1, collLoad.Address, collLoad.Pointer));
                     */
                }
                else
                {
                    offset = pointers[collLoad.Pointer].OffsetDest;
                }
#else
                offset = pointers[collLoad.Pointer].OffsetDest;
#endif

                dataRow.VLTFile        = vltFile;
                dataRow.VLTClass       = _vltClass;
                dataRow.CollectionLoad = collLoad;

                for (int i = 0; i < _vltClass.FieldCount; i++)
                {
#if CARBON
                    bool runtimeLink = false;
#endif
                    ClassField field = _vltClass[i];

                    if (field.IsOptional)
                    {
                        br = null;
                        for (int j = 0; j < collLoad.CountOptional; j++)
                        {
                            if (collLoad[j].NameHash == field.NameHash)
                            {
                                if (collLoad[j].IsDataEmbedded)
                                {
                                    br = brV;
                                    br.BaseStream.Seek(collLoad[j].Pointer, SeekOrigin.Begin);
                                }
                                else
                                {
                                    VLTPointerBlock block = pointers[collLoad[j].Pointer];
#if CARBON
                                    if (block != null)
#endif
                                    {
                                        int localOffset = block.OffsetDest;
                                        br = brR;
                                        br.BaseStream.Seek(localOffset, SeekOrigin.Begin);
                                    }
#if CARBON
                                    else
                                    {
                                        /*
                                         * System.Diagnostics.Debug.WriteLine(
                                         *      string.Format("Runtime Linkage '{0}', name '{1}', field '{2}', req ptr '{3:x}'",
                                         *              HashResolver.Resolve(_vltClass.ClassHash), HashResolver.Resolve(collLoad.NameHash),
                                         *              HashResolver.Resolve(field.NameHash), collLoad[j].Pointer));
                                         */
                                        runtimeLink = true;
                                        br          = brR;
                                    }
#endif
                                }
                            }
                        }
                        if (br == null)
                        {
                            // data is not defined
                            continue;
                        }
                    }
                    else
                    {
                        br = brR;
                        br.BaseStream.Seek(offset + field.Offset, SeekOrigin.Begin);
                    }

/*
 #if !CARBON
 *                                      if (!field.IsArray && field.Alignment > 0)
 *                                      {
 *                                              int align = field.Alignment;
 *                                              if (br.BaseStream.Position % align != 0)
 *                                                      br.BaseStream.Position += align - (br.BaseStream.Position % align);
 *                                      }
 #endif
 */

                    Type type = VLTTypeResolver.Resolver.Resolve(field.TypeHash);

                    if (type == null)
                    {
                        type = typeof(VLTDataItems.Unknown);
                    }

                    VLTDataItem dataItem;
                    if (field.IsArray)
                    {
                        dataItem = VLTDataItemArray.Instantiate(field, type);
                    }
                    else
                    {
                        dataItem = VLTDataItem.Instantiate(type);
                        if (dataItem is VLTDataItems.Unknown)
                        {
                            (dataItem as VLTDataItems.Unknown).SetLength(field.Length);
                        }
                    }

                    dataItem.Offset     = 0;
                    dataItem.InlineData = (br == brV);
                    dataItem.TypeHash   = field.TypeHash;
                    dataItem.NameHash   = field.NameHash;
                    dataItem.DataRow    = dataRow;

                    if (offset != 0 && !runtimeLink)
                    {
                        dataItem.Offset = (uint)br.BaseStream.Position;
                        dataItem.Read(br);
                    }

                    dataRow[i] = dataItem;
                }

                _collection.Add(dataRow);
            }
예제 #5
0
        public void Open(Stream vlt, Stream bin)
        {
            byte[] data = new byte[vlt.Length];
            vlt.Read(data, 0, data.Length);
            _binVlt = new MemoryStream(data);

            _chunks = new ArrayList();
            BinaryReader br = new BinaryReader(_binVlt);

            // Load up the chunks
            VLTBase chunk;

            do
            {
                chunk = ReadChunk(br);
                if (chunk != null)
                {
                    _chunks.Add(chunk);
                }
            } while (chunk != null);

            // Load up expression data
            VLTExpression expChunk = GetChunk(VLTChunkId.Expression) as VLTExpression;

            for (int i = 0; i < expChunk.Count; i++)
            {
                VLTExpressionBlock block = expChunk[i];
                block.ReadData(br);
            }

            // Load up raw bin data
            if (bin == null)
            {
                DirectoryInfo di      = new DirectoryInfo(_baseDir);
                VLTDependency dep     = GetChunk(VLTChunkId.Dependency) as VLTDependency;
                string        binName = dep.GetName(VLTDependency.BinFile);
                FileInfo[]    fi      = di.GetFiles(binName);
                if (fi.Length == 0)
                {
                    throw new Exception("Required file " + binName + " was not found.");
                }
                bin  = new FileStream(fi[0].FullName, FileMode.Open, FileAccess.Read);
                data = new byte[bin.Length];
                bin.Read(data, 0, data.Length);
                bin.Close();
            }
            else
            {
                data = new byte[bin.Length];
                bin.Read(data, 0, data.Length);
            }

            _binRaw = new MemoryStream(data);

            br = new BinaryReader(_binRaw);

            _binRaw.Seek(0, SeekOrigin.Begin);
            chunk = ReadChunk(br);
            chunk.Chunk.GotoStart(_binRaw);
            if (chunk.Chunk.ChunkId == VLTChunkId.StringsRaw)
            {
                int endPos = (int)_binRaw.Position + chunk.Chunk.DataLength;
                while (_binRaw.Position < endPos)
                {
                    string str = NullTerminatedString.Read(br);
                    if (str != "")
                    {
                        HashResolver.AddAuto(str);
                    }
                }
            }

            VLTPointers ptrChunk = GetChunk(VLTChunkId.Pointers) as VLTPointers;

            ptrChunk.ResolveRawPointers(_binRaw);
        }