/// <summary> /// Read from the stream /// </summary> /// <param name="buffer">the buffer to read</param> /// <param name="offset">the offset at which to start</param> /// <param name="count">the number of bytes to read</param> /// <returns>the number of bytes actually read</returns> public override int Read(byte[] buffer, int offset, int count) { int bytesToRead = count; // Need to limit the # of bytes returned, if the stream is intended to have // a definite length. This is especially useful when returning a stream for // the uncompressed data directly to the application. The app won't // necessarily read only the UncompressedSize number of bytes. For example // wrapping the stream returned from OpenReader() into a StreadReader() and // calling ReadToEnd() on it, We can "over-read" the zip data and get a // corrupt string. The length limits that, prevents that problem. if (_lengthLimit != CrcCalculatorStream.UnsetLengthLimit) { if (_Crc32.TotalBytesRead >= _lengthLimit) { return(0); // EOF } Int64 bytesRemaining = _lengthLimit - _Crc32.TotalBytesRead; if (bytesRemaining < count) { bytesToRead = (int)bytesRemaining; } } int n = _innerStream.Read(buffer, offset, bytesToRead); if (n > 0) { _Crc32.SlurpBlock(buffer, offset, n); } return(n); }
private void _DeflateOne(Object wi) { WorkItem workitem = (WorkItem)wi; try { // compress one buffer int myItem = workitem.index; lock (workitem) { if (workitem.status != (int)WorkItem.Status.Filled) { throw new InvalidOperationException(); } PMDCP.Compression.Zlib.CRC32 crc = new CRC32(); // use the workitem: // calc CRC on the buffer crc.SlurpBlock(workitem.buffer, 0, workitem.inputBytesAvailable); // deflate it DeflateOneSegment(workitem); // update status workitem.status = (int)WorkItem.Status.Compressed; workitem.crc = crc.Crc32Result; TraceOutput(TraceBits.Compress, "Compress wi({0}) stat({1}) len({2})", workitem.index, workitem.status, workitem.compressedBytesAvailable ); // release the item Monitor.Pulse(workitem); } } catch (System.Exception exc1) { lock (_eLock) { // expose the exception to the main thread if (_pendingException != null) { _pendingException = exc1; } } } }
private void _DeflateOne(Object wi) { WorkItem workitem = (WorkItem) wi; try { // compress one buffer int myItem = workitem.index; lock(workitem) { if (workitem.status != (int)WorkItem.Status.Filled) throw new InvalidOperationException(); PMDCP.Compression.Zlib.CRC32 crc = new CRC32(); // use the workitem: // calc CRC on the buffer crc.SlurpBlock(workitem.buffer, 0, workitem.inputBytesAvailable); // deflate it DeflateOneSegment(workitem); // update status workitem.status = (int)WorkItem.Status.Compressed; workitem.crc = crc.Crc32Result; TraceOutput(TraceBits.Compress, "Compress wi({0}) stat({1}) len({2})", workitem.index, workitem.status, workitem.compressedBytesAvailable ); // release the item Monitor.Pulse(workitem); } } catch (System.Exception exc1) { lock(_eLock) { // expose the exception to the main thread if (_pendingException!=null) _pendingException = exc1; } } }