private void DecompressWork()
        {
            byte[] buffer;
            int    chunkIndex = 0;

            int readLength = 0;

            while (!_StopWork && (readLength = _ChunkReader.ReadChunk(out buffer, out chunkIndex)) > 0)
            {
                byte[] decompressed = null;
                using (MemoryStream ws = new MemoryStream())
                {
                    using (MemoryStream ms = new MemoryStream(buffer))
                        using (GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress))
                            gzip.CopyTo(ws);

                    decompressed = ws.ToArray();
                }

                _ChunkWriter.WriteChunk(decompressed, 0, decompressed.Length, chunkIndex);
            }
        }
Example #2
0
        private void CompressWork()
        {
            int chunkIndex = 0;

            byte[] buffer;

            int readLength = 0;

            while (!_StopWork && (readLength = _ChunkReader.ReadChunk(out buffer, out chunkIndex)) > 0)
            {
                byte[] compressed = null;
                using (MemoryStream ms = new MemoryStream())
                {
                    using (GZipStream gzip = new GZipStream(ms, CompressionMode.Compress))
                    {
                        gzip.Write(buffer, 0, readLength);
                    }

                    compressed = ms.ToArray();
                }

                _ChunkWriter.WriteChunk(compressed, 0, compressed.Length, chunkIndex);
            }
        }
Example #3
0
        public void ReadChunk(IChunkReader reader)
        {
            byte[] idBytes = ReadByteArray(4);

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 4; i++)
            {
                char c = (char)idBytes[i];
                if (c >= 'A' && c <= 'Z')
                {
                    sb.Append(c);
                }
                else
                {
                    throw new Exception("Chunk id contained unexpected letter");
                }
            }

            string id = sb.ToString();

            //System.Console.WriteLine("Reading " + id);

            long chunkLength = ReadLong();
            long chunkStart = stream.Position;

            currentChunkStart = chunkStart;
            currentChunkLength = chunkLength;

            reader.ReadChunk(id, chunkLength, this);

            long bytesReadByReader = stream.Position - chunkStart;

            if (bytesReadByReader > chunkLength)
            {
                throw new Exception("Chunk reader read past the end of chunk '" + id + "'");
            }

            //System.Console.WriteLine("Skipping " + (chunkLength - bytesReadByReader));

            // Skip the rest of the chunk
            stream.Seek(chunkLength - bytesReadByReader, SeekOrigin.Current);
        }