Compressor
Represents base class for compression algorithm implementation.
using Renci.SshNet.Messages.Authentication;
using Renci.SshNet.Security;
using System;
namespace Renci.SshNet.Compression
{
public abstract class Compressor : Algorithm, IDisposable
{
private readonly bool _delayedCompression;
private bool _isActive;
private Session _session;
private bool _isDisposed;
protected Compressor(bool delayedCompression)
{
_delayedCompression = delayedCompression;
}
public virtual void Init(Session session)
{
if (_delayedCompression) {
_session = session;
_session.UserAuthenticationSuccessReceived += Session_UserAuthenticationSuccessReceived;
} else
_isActive = true;
}
public byte[] Compress(byte[] data)
{
return Compress(data, 0, data.Length);
}
public virtual byte[] Compress(byte[] data, int offset, int length)
{
if (!_isActive) {
if (offset == 0 && length == data.Length)
return data;
byte[] array = new byte[length];
Buffer.BlockCopy(data, offset, array, 0, length);
return array;
}
return CompressCore(data, offset, length);
}
protected abstract byte[] CompressCore(byte[] data, int offset, int length);
public byte[] Decompress(byte[] data)
{
return Decompress(data, 0, data.Length);
}
public virtual byte[] Decompress(byte[] data, int offset, int length)
{
if (!_isActive) {
if (offset == 0 && length == data.Length)
return data;
byte[] array = new byte[length];
Buffer.BlockCopy(data, offset, array, 0, length);
return array;
}
return DecompressCore(data, offset, length);
}
protected abstract byte[] DecompressCore(byte[] data, int offset, int length);
private void Session_UserAuthenticationSuccessReceived(object sender, MessageEventArgs<SuccessMessage> e)
{
_isActive = true;
_session.UserAuthenticationSuccessReceived -= Session_UserAuthenticationSuccessReceived;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!_isDisposed && disposing)
_isDisposed = true;
}
~Compressor()
{
Dispose(false);
}
}
}