Exemplo n.º 1
0
        /// <summary>
        /// Takes the input stream and does any version specific
        /// data operations to get the tag manager ready for reading
        /// </summary>
        void CalculateVersion()
        {
            InputStream.Seek(60);
            InputStream.State = BlamLib.IO.EndianState.Little;
            uint      group_tag = InputStream.ReadTagUInt();
            BlamBuild bb        = FromSignature(group_tag);

            #region Endian handling
            if (bb == BlamBuild.Halo1)
            {
                endianState = BlamLib.IO.EndianState.Big;
            }
            else
            {
                endianState = BlamLib.IO.EndianState.Little;
            }

            if (InputStream != null)
            {
                InputStream.State = endianState;
            }
            if (OutputStream != null)
            {
                OutputStream.State = endianState;
            }
            #endregion

            if (engine == BlamVersion.Unknown)
            {
                engine = bb.ToVersion();

                ManageSetupTagGroup();
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Validates the cache's header for proper signatures
        /// </summary>
        /// <param name="s">cache stream</param>
        /// <param name="header_sizes">size of a single header</param>
        /// <remarks>Assumes the header is at the start of the stream</remarks>
        /// <returns>The header size entry that matches this cache or -1 if no matches</returns>
        internal static int ValidateHeader(IO.EndianReader s, params int[] header_sizes)
        {
            bool invalid = true;
            int  result  = -1;

            foreach (int header_size in header_sizes)
            {
                s.Seek(0);
                if (s.ReadTagUInt() == MiscGroups.head.ID && s.Length >= header_size)                 // it HAS to be more than the size of a header...
                {
                    s.Seek(header_size - sizeof(uint));
                    if (s.ReadTagUInt() == MiscGroups.foot.ID)
                    {
                        invalid = false;
                        result  = header_size;
                    }
                }

                if (!invalid)
                {
                    break;
                }
            }

            if (invalid)
            {
                throw new InvalidCacheFileException(s.FileName);
            }

            return(result);
        }
Exemplo n.º 3
0
        internal static int ValidateHeaderAdjustEndian(IO.EndianReader s, params int[] header_sizes)
        {
            bool invalid = true;
            int  result  = -1;

            foreach (int header_size in header_sizes)
            {
                if (s.Length < header_size)
                {
                    continue;                                         // it HAS to be more than the size of a header...
                }
                s.Seek(0);
                uint head = s.ReadTagUInt();

                if (head != MiscGroups.head.ID)
                {
                    if (IO.ByteSwap.SwapUDWord(head) == MiscGroups.head.ID)
                    {
                        s.State = s.State.Invert();
                    }
                }

                s.Seek(header_size - sizeof(uint));
                if (s.ReadTagUInt() == MiscGroups.foot.ID)
                {
                    invalid = false;
                    result  = header_size;
                }

                if (!invalid)
                {
                    break;
                }
            }

            if (invalid)
            {
                throw new InvalidCacheFileException(s.FileName);
            }

            return(result);
        }