Exemplo n.º 1
0
        public void RequestBytesRES(RageArchiveResourceFile7 file_, long newLength)
        {
            // determine header size...
            long x = GetHeaderSize();

            DataBlock        thisBlock = null;
            List <DataBlock> blocks    = GetBlocks();

            foreach (var q in blocks)
            {
                if (q.Tag == file_)
                {
                    thisBlock = q;
                }
            }

            long maxlength = ArchiveHelpers.FindSpace(blocks, thisBlock);

            if (maxlength < newLength)
            {
                // move...

                long offset = ArchiveHelpers.FindOffset(blocks, newLength, 512);
                ArchiveHelpers.MoveBytes(archive_.BaseStream, thisBlock.Offset, offset, thisBlock.Length);
                ((IRageArchiveFileEntry7)thisBlock.Tag).FileOffset = (uint)offset / 512;
            }

            file_.FileSize = (uint)newLength;
        }
Exemplo n.º 2
0
        /// <summary>
        /// Clears all buffers for this archive and causes any buffered data to be
        /// written to the underlying device.
        /// </summary>
        public void Flush()
        {
            long headerSize = GetHeaderSize();

            do
            {
                var  blocks          = GetBlocks();
                long maxheaderlength = ArchiveHelpers.FindSpace(blocks, blocks[0]);
                if (maxheaderlength < headerSize)
                {
                    long newpos = ArchiveHelpers.FindOffset(blocks, blocks[1].Length, 512);
                    ArchiveHelpers.MoveBytes(archive_.BaseStream, blocks[1].Offset, newpos, blocks[1].Length);
                    ((IRageArchiveFileEntry7)blocks[1].Tag).FileOffset = (uint)(newpos / 512);

                    blocks          = GetBlocks();
                    maxheaderlength = ArchiveHelpers.FindSpace(blocks, blocks[0]);
                }
                else
                {
                    break;
                }
            } while (true);



            // calculate key...
            var tmp1 = GTA5Hash.CalculateHash(FileName);
            var tmp2 = (tmp1 + (uint)archive_.BaseStream.Length + (101 - 40)) % 0x65;

            //  archive_.key_ = GTA5Crypto.key_gta5;
            archive_.WriteHeader(GTA5Constants.PC_AES_KEY, GTA5Constants.PC_NG_KEYS[tmp2]);
            archive_.BaseStream.Flush();
        }
Exemplo n.º 3
0
        /// <summary>
        /// Clears all buffers for this archive and causes any buffered data to be
        /// written to the underlying device.
        /// </summary>
        public void Flush()
        {
            long headerSize = GetHeaderSize();

            for (;;)
            {
                List <DataBlock> blocks = GetBlocks();

                long num = ArchiveHelpers.FindSpace(blocks, blocks[0]);

                if (num >= headerSize)
                {
                    break;
                }

                long num2 = ArchiveHelpers.FindOffset(blocks, blocks[1].Length, 512);

                ArchiveHelpers.MoveBytes(archive_.BaseStream, blocks[1].Offset, num2, blocks[1].Length);

                ((IRageArchiveFileEntry7)blocks[1].Tag).FileOffset = (uint)(num2 / 512);
                blocks = this.GetBlocks();
                num    = ArchiveHelpers.FindSpace(blocks, blocks[0]);
            }

            uint num3 = GTA5Hash.CalculateHash(FileName);
            uint num4 = (num3 + (uint)archive_.BaseStream.Length + 0x3D) % 0x65;

            archive_.WriteHeader(GTA5Constants.PC_AES_KEY, GTA5Constants.PC_NG_KEYS[(int)num4]);
            archive_.BaseStream.Flush();
        }