public TransmissionStream(Stream wrappedStream, Transmission transmission) {
if (transmission == null) {
throw new ArgumentNullException("transmission");
}
this.abort = new AbortableStream(wrappedStream);
this.pause = new PausableStream(this.abort);
this.bandwidthNotify = new BandwidthNotifyingStream(this.pause);
this.progress = new ProgressStream(this.bandwidthNotify);
this.abort.PropertyChanged += (object sender, PropertyChangedEventArgs e) => {
var a = sender as AbortableStream;
if (e.PropertyName == Utils.NameOf(() => a.Exception)) {
transmission.Status = TransmissionStatus.ABORTED;
transmission.FailedException = a.Exception;
}
};
this.bandwidthNotify.PropertyChanged += (object sender, PropertyChangedEventArgs e) => {
var s = sender as BandwidthNotifyingStream;
if (e.PropertyName == Utils.NameOf(() => s.BitsPerSecond)) {
transmission.BitsPerSecond = s.BitsPerSecond;
}
};
this.progress.PropertyChanged += (object sender, PropertyChangedEventArgs e) => {
var p = sender as ProgressStream;
if (e.PropertyName == Utils.NameOf(() => p.Position)) {
transmission.Position = p.Position;
} else if (e.PropertyName == Utils.NameOf(() => p.Length)) {
transmission.Length = p.Length;
}
};
transmission.PropertyChanged += (object sender, PropertyChangedEventArgs e) => {
var t = sender as Transmission;
if (e.PropertyName == Utils.NameOf(() => t.Status)) {
if (t.Status == TransmissionStatus.ABORTING) {
this.abort.Abort();
this.pause.Resume();
} else if (t.Status == TransmissionStatus.PAUSED) {
this.pause.Pause();
} else if (t.Status == TransmissionStatus.TRANSMITTING) {
this.pause.Resume();
}
}
};
if (transmission.Status == TransmissionStatus.ABORTING || transmission.Status == TransmissionStatus.ABORTED) {
this.abort.Abort();
}
}