DocSpace-client/thirdparty/AppLimit.CloudComputing.SharpBox/Common/Net/Web/WebRequestStream.cs
2020-03-13 16:40:58 +03:00

131 lines
3.8 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
namespace AppLimit.CloudComputing.SharpBox.Common.Net.Web
{
internal delegate void WebRequestStreamDisposeOperation(params object[] args);
internal class WebRequestStream : Stream, IDisposable
{
private Stream _requestStream;
private Stack<WebRequestStreamDisposeOperation> _PostDisposeOperations;
private Stack<WebRequestStreamDisposeOperation> _PreDisposeOperations;
private Dictionary<WebRequestStreamDisposeOperation, object[]> _DisposeOperationsParams;
public long WrittenBytes { get; set; }
public WebRequestStream(Stream srcStream, WebRequest request, WebRequestService service)
{
_requestStream = srcStream;
_PostDisposeOperations = new Stack<WebRequestStreamDisposeOperation>();
_PreDisposeOperations = new Stack<WebRequestStreamDisposeOperation>();
_DisposeOperationsParams = new Dictionary<WebRequestStreamDisposeOperation, object[]>();
WrittenBytes = 0;
}
public void PushPostDisposeOperation(WebRequestStreamDisposeOperation opp, params object[] args)
{
_PostDisposeOperations.Push(opp);
if (args != null)
_DisposeOperationsParams.Add(opp, args);
}
public void PushPreDisposeOperation(WebRequestStreamDisposeOperation opp, params object[] args)
{
_PreDisposeOperations.Push(opp);
if (args != null)
_DisposeOperationsParams.Add(opp, args);
}
public override bool CanRead
{
get { return _requestStream.CanRead; }
}
public override bool CanSeek
{
get { return _requestStream.CanSeek; }
}
public override bool CanWrite
{
get { return _requestStream.CanWrite; }
}
public override void Flush()
{
_requestStream.Flush();
}
public override long Length
{
get { return _requestStream.Length; }
}
public override long Position
{
get { return _requestStream.Position; }
set { _requestStream.Position = value; }
}
public override int Read(byte[] buffer, int offset, int count)
{
return _requestStream.Read(buffer, offset, count);
}
public override long Seek(long offset, SeekOrigin origin)
{
return _requestStream.Seek(offset, origin);
}
public override void SetLength(long value)
{
_requestStream.SetLength(value);
}
public override void Write(byte[] buffer, int offset, int count)
{
WrittenBytes += count;
_requestStream.Write(buffer, offset, count);
}
#region IDisposable Members
void IDisposable.Dispose()
{
// dispose our pre opps
PerformeDisposeOperations(_PreDisposeOperations);
// to all dispose stuff from base
Dispose();
// dispose our post opps
PerformeDisposeOperations(_PostDisposeOperations);
}
private void PerformeDisposeOperations(Stack<WebRequestStreamDisposeOperation> stack)
{
// dispose our opps
while (stack.Count > 0)
{
// pop the opp
var dop = stack.Pop();
// get the args
object[] args;
_DisposeOperationsParams.TryGetValue(dop, out args);
// perform opp
dop(args);
}
}
#endregion
}
}