Nanook.QueenBee.Parser.PakEditor.fixUncompressedFileLengths C# (CSharp) Method

fixUncompressedFileLengths() private method

private fixUncompressedFileLengths ( string newPakFilename, string newPabFilename ) : void
newPakFilename string
newPabFilename string
return void
        private void fixUncompressedFileLengths(string newPakFilename, string newPabFilename)
        {
            byte[] padData = new byte[(int)_pakFormat.ZlibFilePad];

            if (_pakFormat.PakFormatType == PakFormatType.XBox && _pakFormat.CompressionType == CompressionType.ZLibChunk) //pak might not be compressed (GHWT etc)
            {
                long newSize = removePadding(newPakFilename, 0, _pakFormat.UnCompressedPakFilesize);

                //PAK
                using (FileStream fs = new FileStream(newPakFilename, FileMode.Open, FileAccess.ReadWrite))
                {
                    //correct padding on raw files
                    bool is0 = true;
                    if (newSize > _pakFormat.UnCompressedPakFilesize)
                    {
                        //check end is all 00's
                        fs.Seek(_pakFormat.UnCompressedPakFilesize, SeekOrigin.Begin);
                        byte[] end = new byte[newSize - _pakFormat.UnCompressedPakFilesize];
                        fs.Read(end, 0, end.Length);

                        foreach (byte b in end)
                        {
                            if (!(is0 = (b == 0)))
                                break;
                        }

                        if (is0)
                            fs.SetLength(_pakFormat.UnCompressedPakFilesize); //truncate file
                    }

                    //don't pad if not compressing
                    if (_pakFormat.FullCompressedPakFilename.ToLower() != _pakFormat.FullPakFilename.ToLower())
                    {
                        if (_pakFormat.UnCompressedPakFilesize > newSize || !is0)
                        {
                            fs.Seek(0, SeekOrigin.End);

                            //pad file to next 0x800
                            int pad = (int)(fs.Position % _pakFormat.ZlibBlockPad);
                            if (pad != 0 && fs.Position != 0)
                                fs.Write(padData, 0, (int)_pakFormat.ZlibBlockPad - pad);

                        }
                    }
                }

                newSize = removePadding(newPabFilename, 0xAB, 0);

                //PAB
                using (FileStream fs = new FileStream(newPabFilename, FileMode.Open, FileAccess.ReadWrite))
                {
                    //correct padding on raw files
                    bool isAB = true;
                    if (newSize > _pakFormat.UnCompressedPabFilesize)
                    {
                        //check end is all 00's
                        fs.Seek(_pakFormat.UnCompressedPabFilesize, SeekOrigin.Begin);
                        byte[] end = new byte[newSize - _pakFormat.UnCompressedPabFilesize];
                        fs.Read(end, 0, end.Length);

                        foreach (byte b in end)
                        {
                            if (!(isAB = (b == 0xAB)))
                                break;
                        }

                        if (isAB)
                            fs.SetLength(_pakFormat.UnCompressedPabFilesize); //truncate file
                    }

                    //don't pad if not compressing
                    if (_pakFormat.FullCompressedPabFilename.ToLower() != _pakFormat.FullPabFilename.ToLower())
                    {
                        if (_pakFormat.UnCompressedPabFilesize > newSize || !isAB)
                        {
                            for (int i = 0; i < padData.Length; i++)
                                padData[i] = 0xAB;

                            fs.Seek(0, SeekOrigin.End);

                            //pad file to next 0x800
                            int pad = (int)(fs.Position % _pakFormat.ZlibFilePadGH5);  //ZlibFilePadGH5  ZlibBlockPad
                            if (pad != 0 && fs.Position != 0)
                                fs.Write(padData, 0, (int)_pakFormat.ZlibFilePadGH5 - pad);  //ZlibFilePadGH5  ZlibBlockPad

                        }
                    }
                }
            }
        }