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
}
}
}
}
}