Exemplo n.º 1
0
 void ReadString(IO.EndianReader s)
 {
     if (UseDirectEncoding)
     {
     }
     else
     {
         String = s.ReadString(IsUnicode ? kUnicodeEncoding : kAnsiEncoding);
     }
 }
        public string ReadName(int nameOffset)
        {
            if (NameData == null || nameOffset >= NameData.Length)
            {
                throw new InvalidOperationException(nameOffset.ToString("X8"));
            }

            NameDataReader.Seek(nameOffset);
            return(NameDataReader.ReadString(Memory.Strings.StringStorage.CStringAscii));
        }
Exemplo n.º 3
0
        /// <summary>Read the string values from a stream</summary>
        /// <param name="s"></param>
        public void ReadStrings(IO.EndianReader s)
        {
            Contract.Requires(s != null);

            if (ioStringLengths == null)
            {
                for (int x = 0; x < mPool.Count; x++)
                {
                    AddFromRead(x, s.ReadString(mEncoding));
                }
            }
            else
            {
                for (int x = 0; x < Count; x++)
                {
                    AddFromRead(x, s.ReadString(mEncoding, ioStringLengths[x]));
                }
                ioStringLengths = null;
            }
        }
        public static void Assert(IO.EndianReader s, string expected, Memory.Strings.StringStorage storage)
        {
            Contract.Requires(s != null);
            Contract.Requires(!string.IsNullOrEmpty(expected));

            string signature = s.ReadString(storage, expected.Length);

            if (signature != expected)
            {
                throw new SignatureMismatchException(s.BaseStream,
                                                     expected, signature);
            }
        }
Exemplo n.º 5
0
        public static bool VerifyIsPkg(IO.EndianReader s)
        {
            Contract.Requires <InvalidOperationException>(s.BaseStream.CanRead);
            Contract.Requires <InvalidOperationException>(s.BaseStream.CanSeek);

            var base_stream = s.BaseStream;

            if ((base_stream.Length - base_stream.Position) < kHeaderLength)
            {
                return(false);
            }

            string sig              = s.ReadString(Memory.Strings.StringStorage.AsciiString);
            ulong  version          = s.ReadUInt64();
            long   file_entry_count = s.ReadInt64();

            base_stream.Seek(-kHeaderLength, SeekOrigin.Current);

            return(sig == kSignature &&
                   version < (ulong)CaPackageVersion.kNumberOf &&
                   file_entry_count >= kMinFileEntryCount);
        }
Exemplo n.º 6
0
        void ReadFileNamesChunk(IO.EndianStream s)
        {
            var eraUtil = s.Owner as EraFileUtil;

            var filenames_chunk = mFiles[0];

            if (eraUtil != null &&
                !eraUtil.Options.Test(EraFileUtilOptions.SkipVerification))
            {
                ValidateAdler32(filenames_chunk, s);
                ValidateHashes(filenames_chunk, s);
            }

            filenames_chunk.FileName = kFileNamesTableName;

            byte[] filenames_buffer = filenames_chunk.GetBuffer(s);
            using (var ms = new System.IO.MemoryStream(filenames_buffer, false))
                using (var er = new IO.EndianReader(ms, s.ByteOrder))
                {
                    for (int x = FileChunksFirstIndex; x < mFiles.Count; x++)
                    {
                        var file = mFiles[x];

                        if (file.FileNameOffset != er.BaseStream.Position)
                        {
                            throw new System.IO.InvalidDataException(string.Format(
                                                                         "#{0} {1} has bad filename offset {2} != {3}",
                                                                         FileIndexToListingIndex(x),
                                                                         file.EntryId.ToString("X16"),
                                                                         file.FileNameOffset.ToString("X8"),
                                                                         er.BaseStream.Position.ToString("X8")
                                                                         ));
                        }

                        file.FileName = er.ReadString(Memory.Strings.StringStorage.CStringAscii);
                    }
                }
        }
Exemplo n.º 7
0
            public void Read(IO.EndianReader s)
            {
                switch (Type)
                {
                case XmbVariantType.Int:        s.Read(out Int); break;

                case XmbVariantType.Single: s.Read(out Single); break;

                case XmbVariantType.Double: s.Read(out Double); break;

                case XmbVariantType.String:
                    String = s.ReadString(IsUnicode ? kUnicodeEncoding : kAnsiEncoding);
                    break;

                case XmbVariantType.Vector:
                    if (VectorLength >= 1)
                    {
                        s.Read(out Vector4d.X);
                    }
                    if (VectorLength >= 2)
                    {
                        s.Read(out Vector4d.Y);
                    }
                    if (VectorLength >= 3)
                    {
                        s.Read(out Vector4d.Z);
                    }
                    if (VectorLength >= 4)
                    {
                        s.Read(out Vector4d.W);
                    }
                    break;

                default: throw new KSoft.Debug.UnreachableException(Type.ToString());
                }
            }
        internal void ReadLanguageStrings(IO.EndianReader buffer, uint langBitmask = uint.MaxValue)
        {
            Contract.Assert(LanguageRegistry.NumberOfLanguages <= Bits.kInt32BitCount,
                            nameof(langBitmask) + " is too small to actually be a language bitvector");
            Contract.Assert(mLanguageOffsets != null);

            for (int x = 0; x < mLanguageOffsets.Length; x++)
            {
                int offset = mLanguageOffsets[x];
                if (offset.IsNone())
                {
                    continue;
                }
                else if (!Bitwise.Flags.Test(langBitmask, 1U << x))
                {
                    continue;
                }

                buffer.Seek(offset);
                mLanguageStrings[x] = buffer.ReadString(Memory.Strings.StringStorage.CStringUtf8);
            }

            LanguageOffsetsDispose();
        }