Nanook.QueenBee.Parser.PakFormat.xBoxCompress C# (CSharp) Method

xBoxCompress() private method

private xBoxCompress ( string uncompFilename, string compFilename ) : void
uncompFilename string
compFilename string
return void
        private void xBoxCompress(string uncompFilename, string compFilename)
        {
            if (uncompFilename.ToLower() == compFilename.ToLower()) //nothing to do
                return;

            if (File.Exists(compFilename))
                File.Delete(compFilename);

            try
            {
                if (this.CompressionType == CompressionType.ZLib)
                {
                    using (FileStream outFileStream = new FileStream(compFilename, FileMode.Create))
                    {
                        using (ZlibOutputStream outZStream = new ZlibOutputStream(outFileStream, true, JZlib.Z_BEST_COMPRESSION))
                        {
                            using (FileStream inFileStream = new FileStream(uncompFilename, FileMode.Open, FileAccess.Read))
                            {
                                copyStream(inFileStream, outZStream);
                            }
                        }
                    }
                }
                else if (this.CompressionType == CompressionType.ZLibChunk)
                {
                    List<uint> sizes = new List<uint>();
                    List<uint> offsets = new List<uint>();
                    byte[] header = new byte[ZlibFilePad];

                    int pad = 0;
                    long lastUncompressedChunk;
                    long endPos;

                    EndianType et = this.EndianType;

                    int part = 0;

                    using (FileStream inFileStream = new FileStream(uncompFilename, FileMode.Open, FileAccess.Read))
                    {
                        long pos;
                        do
                        {
                            using (FileStream outFileStream = new FileStream(compFilename, inFileStream.Position == 0 ? FileMode.Create : FileMode.Append))
                            {
                                part++;

                                pad = (int)(outFileStream.Position % ZlibBlockPad);
                                if (pad != 0 && outFileStream.Position != 0)
                                    outFileStream.Write(header, 0, (int)ZlibBlockPad - pad);

                                pos = outFileStream.Position;

                                outFileStream.Write(Encoding.ASCII.GetBytes("CHNK"), 0, 4);
                                outFileStream.Write(header, 0, (int)_zLibHeaderLen - 4);

                                lastUncompressedChunk = (long)_zLibChunkSize;
                                if (inFileStream.Position + lastUncompressedChunk > inFileStream.Length)
                                    lastUncompressedChunk = inFileStream.Length - inFileStream.Position;

                                using (ZlibOutputStream outZStream = new ZlibOutputStream(outFileStream, true, JZlib.Z_BEST_COMPRESSION))
                                {
                                    copyStream(inFileStream, outZStream, (int)lastUncompressedChunk);

                                    offsets.Add((uint)pos);
                                    sizes.Add((uint)(outFileStream.Position - pos) - _zLibHeaderLen);
                                }

                            }

                        } while (inFileStream.Position < inFileStream.Length);

                        using (FileStream outFileStream = new FileStream(compFilename, inFileStream.Position == 0 ? FileMode.Create : FileMode.Append))
                        {
                            //find the end of the last file.
                            endPos = (int)(outFileStream.Position % ZlibBlockPad);
                            if (endPos != 0)
                                endPos = ZlibBlockPad - endPos;
                            endPos += outFileStream.Position;

                            //pad the compressed file
                            pad = (int)(outFileStream.Position % ZlibFilePad);
                            if (pad != 0 && outFileStream.Position != 0)
                                outFileStream.Write(header, 0, (int)ZlibFilePad - pad);
                        }

                        using (FileStream outFileStream = new FileStream(compFilename, FileMode.Open))
                        {
                            using (BinaryEndianWriter bw = new BinaryEndianWriter(outFileStream))
                            {
                                long uncompressedTotal = 0;
                                EndianType e = this.EndianType;

                                for (int i = 0; i < offsets.Count; i++)
                                {
                                    outFileStream.Seek(offsets[i] + 4, SeekOrigin.Begin);
                                    bw.Write((uint)_zLibHeaderLen, e); //headerlen
                                    bw.Write((uint)sizes[i], e); //blocklen
                                    bw.Write((uint)(i != offsets.Count - 1 ? offsets[i + 1] - offsets[i] : 0xffffffff), e); //chunklen ffs if last item

                                    //next blocklen 00's if last block
                                    if (i == offsets.Count - 1)  //last item
                                        bw.Write((uint)0x00000000, e);
                                    else if (i + 1 == offsets.Count - 1) //secondlast item
                                        bw.Write((uint)(endPos - offsets[i + 1]), e);
                                    else
                                        bw.Write((uint)offsets[i + 2] - offsets[i + 1], e);

                                    bw.Write((uint)(i != offsets.Count - 1 ? _zLibChunkSize : lastUncompressedChunk), e); //uncompressed size
                                    bw.Write((uint)uncompressedTotal, e);
                                    uncompressedTotal += (i != offsets.Count - 1 ? _zLibChunkSize : lastUncompressedChunk);
                                }
                            }
                        }

                    }
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException(string.Format("Compress Failed: {0}", ex));
            }

            //using (FileStream sf = File.OpenRead(uncompFilename))
            //{
            //    using (FileStream df = File.Create(compFilename))
            //    {
            //        using (DeflateStream ds = new DeflateStream(df, CompressionMode.Compress))
            //        {
            //            byte[] b = new byte[10000];
            //            int c = 0;
            //            do
            //            {
            //                c = sf.Read(b, 0, b.Length);
            //                ds.Write(b, 0, c);
            //            }
            //            while (c == b.Length);
            //        }
            //    }
            //}
        }