예제 #1
0
        public static string GetStoredTypeName(ulong id)
        {
            string result;

            if (StoredNameMap.TryGetValue(id, out result))
            {
                return(result);
            }

            return(null);
        }
예제 #2
0
        private static void ReadAllItems(GomBinaryReader br, long offset)
        {
            while (true)
            {
                // Begin Reading Gom Definitions

                int defLength = br.ReadInt32();

                // Length == 0 means we've read them all!
                if (defLength == 0)
                {
                    break;
                }

                //short defFlags = br.ReadInt16();
                //int defType = (defFlags >> 3) & 0x7;
                byte[] defBuffer = new byte[defLength];
                int    defZero   = br.ReadInt32();  // 4 blank bytes
                ulong  defId     = br.ReadUInt64(); // 8-byte type ID
                short  defFlags  = br.ReadInt16();  // 16-bit flag field
                int    defType   = (defFlags >> 3) & 0x7;

                //var defData = br.ReadBytes(defLength - 6);
                var defData = br.ReadBytes(defLength - 18);
                Buffer.BlockCopy(defData, 0, defBuffer, 18, defData.Length);

                using (var memStream = new System.IO.MemoryStream(defBuffer))
                    using (var defReader = new GomBinaryReader(memStream, Encoding.UTF8))
                    {
                        DomTypeLoaders.IDomTypeLoader loader;
                        if (typeLoaderMap.TryGetValue(defType, out loader))
                        {
                            var domType = loader.Load(defReader);
                            domType.Id = defId;
                            DomTypeMap.Add(domType.Id, domType);

                            if (String.IsNullOrEmpty(domType.Name))
                            {
                                string storedTypeName;
                                if (StoredNameMap.TryGetValue(domType.Id, out storedTypeName))
                                {
                                    domType.Name = storedTypeName;
                                }
                            }

                            AddToNameLookup(domType);
                        }
                        else
                        {
                            throw new InvalidOperationException(String.Format("No loader for DomType 0x{1:X} as offset 0x{0:X}", offset, defType));
                        }
                    }

                // Read the required number of padding bytes
                int padding = ((8 - (defLength & 0x7)) & 0x7);
                if (padding > 0)
                {
                    br.ReadBytes(padding);
                }

                offset = offset + defLength + padding;
            }
        }