public override int Read(byte[] buffer, int offset, int count) { if (position == 0 && zipEntry.IsCrypted && ((ZipInputStream)zipStream).Password == null && PasswordRequired != null) { CompressionPasswordRequiredEventArgs e = new CompressionPasswordRequiredEventArgs(); PasswordRequired(this, e); if (e.ContinueOperation && e.Password.Length > 0) { ((ZipInputStream)zipStream).Password = e.Password; } } // TODO: always save to a local temp circular buffer for optimization of the backwards seek. int total = zipStream.Read(buffer, offset, count); position += total; if (ExtractionProgress != null) { CompressionExtractionProgressEventArgs e = new CompressionExtractionProgressEventArgs(); e.BytesExtracted = position; e.FileName = zipEntry.Name; e.FileSize = zipEntry.Size; e.PercentComplete = 100.0 * position / zipEntry.Size; ExtractionProgress(this, e); } return(total); }
protected virtual int OnDataAvailable(IntPtr p1, int p2) { int result = 1; if (this.currentFile != null) { this.currentFile.BytesExtracted += p2; } if (this.DataAvailable != null) { byte[] data = new byte[p2]; Marshal.Copy(p1, data, 0, p2); DataAvailableEventArgs e = new DataAvailableEventArgs(data); this.DataAvailable(this, e); if (!e.ContinueOperation) { result = -1; } } if ((this.ExtractionProgress != null) && (this.currentFile != null)) { CompressionExtractionProgressEventArgs e = new CompressionExtractionProgressEventArgs(); e.FileName = this.currentFile.FileName; e.FileSize = this.currentFile.UnpackedSize; e.BytesExtracted = this.currentFile.BytesExtracted; e.PercentComplete = this.currentFile.PercentComplete; this.ExtractionProgress(this, e); if (!e.ContinueOperation) { result = -1; } } return(result); }