private bool TransferStatusCallback(int msgType, int percent, ulong bytesTransferred, uint hresult, IStream stream) { switch (msgType) { case MSG_STATUS: Progress?.Invoke(this, new ProgressEventArgs(percent)); break; case MSG_END_STREAM: var wrappedStream = new NativeStreamWrapper(stream); if (cancel) { wrappedStream.Dispose(); } else { PageScanned?.Invoke(this, new PageScannedEventArgs(wrappedStream)); } break; case MSG_END_TRANSFER: TransferComplete?.Invoke(this, EventArgs.Empty); break; } return(!cancel); }