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); }
private void PasswordRequired(object sender, CompressionPasswordRequiredEventArgs e) { this.Invoke((MethodInvoker) delegate() { frmPassword dlg = new frmPassword(); if (dlg.ShowDialog(this) == DialogResult.OK) { e.Password = dlg.txtPassword.Text; e.ContinueOperation = true; } else { e.ContinueOperation = false; } }); }
protected virtual int OnPasswordRequired(IntPtr p1, int p2) { int result = -1; if (this.PasswordRequired != null) { CompressionPasswordRequiredEventArgs e = new CompressionPasswordRequiredEventArgs(); this.PasswordRequired(this, e); if (e.ContinueOperation && e.Password.Length > 0) { for (int i = 0; (i < e.Password.Length) && (i < p2); i++) { Marshal.WriteByte(p1, i, (byte)e.Password[i]); } Marshal.WriteByte(p1, e.Password.Length, (byte)0); result = 1; } } else { throw new IOException("Password is required for extraction."); } return(result); }