public Task <EncodedFileResult> AppendStream(Stream stream, bool checksum) { // TODO: validate relative filename (in particular the directory separator and checking for invalid components like drives, '..' and '.') if (stream == null) { throw new ArgumentNullException(nameof(stream)); } if (checksum) { stream = new ChecksumStream(stream); } return(Task.Run(delegate { lock (mLockObject) { if (mPendingStream != null) { throw new InvalidOperationException(); } mPendingStream = stream; mResultLength = 0; Monitor.PulseAll(mLockObject); while (mPendingStream != null) { Monitor.Wait(mLockObject); } var resultChecksum = checksum ? ((ChecksumStream)stream).GetChecksum() : default(Checksum?); mContent.Add(new DecodedStreamMetadata(mResultLength, resultChecksum)); return new EncodedFileResult(mResultLength, resultChecksum); } })); }
public Task<EncodedFileResult> AppendStream(Stream stream, bool checksum) { // TODO: validate relative filename (in particular the directory separator and checking for invalid components like drives, '..' and '.') if (stream == null) throw new ArgumentNullException(nameof(stream)); if (checksum) stream = new ChecksumStream(stream); return Task.Run(delegate { lock (mLockObject) { if (mPendingStream != null) throw new InvalidOperationException(); mPendingStream = stream; mResultLength = 0; Monitor.PulseAll(mLockObject); while (mPendingStream != null) Monitor.Wait(mLockObject); var resultChecksum = checksum ? ((ChecksumStream)stream).GetChecksum() : default(Checksum?); mContent.Add(new DecodedStreamMetadata(mResultLength, resultChecksum)); return new EncodedFileResult(mResultLength, resultChecksum); } }); }