using System;
using System.Collections.Generic;
using Renci.SshNet.Channels;
using Renci.SshNet.Messages.Connection;
namespace Renci.SshNet.Tests.Classes.Channels
{
    internal class ChannelStub : Channel
    {
        /// 
        /// Initializes a new  instance.
        /// 
        /// The session.
        /// The local channel number.
        /// Size of the window.
        /// Size of the packet.
        public ChannelStub(ISession session, uint localChannelNumber, uint localWindowSize, uint localPacketSize)
            : base(session, localChannelNumber, localWindowSize, localPacketSize)
        {
            OnErrorOccurredInvocations = new List();
        }
        public override ChannelTypes ChannelType
        {
            get { return ChannelTypes.X11; }
        }
        public IList OnErrorOccurredInvocations { get; private set; }
        public Exception OnCloseException { get; set; }
        public Exception OnDataException { get; set; }
        public Exception OnDisconnectedException { get; set; }
        public Exception OnEofException{ get; set; }
        public Exception OnErrorOccurredException { get; set; }
        public Exception OnExtendedDataException { get; set; }
        public Exception OnFailureException { get; set; }
        public Exception OnRequestException { get; set; }
        public Exception OnSuccessException { get; set; }
        public Exception OnWindowAdjustException { get; set; }
        public void SetIsOpen(bool value)
        {
            IsOpen = value;
        }
        public void InitializeRemoteChannelInfo(uint remoteChannelNumber, uint remoteWindowSize, uint remotePacketSize)
        {
            InitializeRemoteInfo(remoteChannelNumber, remoteWindowSize, remotePacketSize);
        }
        protected override void OnClose()
        {
            base.OnClose();
            if (OnCloseException != null)
            {
                throw OnCloseException;
            }
        }
        protected override void OnData(byte[] data)
        {
            base.OnData(data);
            if (OnDataException != null)
            {
                throw OnDataException;
            }
        }
        protected override void OnDisconnected()
        {
            base.OnDisconnected();
            if (OnDisconnectedException != null)
            {
                throw OnDisconnectedException;
            }
        }
        protected override void OnEof()
        {
            base.OnEof();
            if (OnEofException != null)
            {
                throw OnEofException;
            }
        }
        protected override void OnExtendedData(byte[] data, uint dataTypeCode)
        {
            base.OnExtendedData(data, dataTypeCode);
            if (OnExtendedDataException != null)
            {
                throw OnExtendedDataException;
            }
        }
        protected override void OnErrorOccured(Exception exp)
        {
            OnErrorOccurredInvocations.Add(exp);
            if (OnErrorOccurredException != null)
            {
                throw OnErrorOccurredException;
            }
        }
        protected override void OnFailure()
        {
            base.OnFailure();
            if (OnFailureException != null)
            {
                throw OnFailureException;
            }
        }
        protected override void OnRequest(RequestInfo info)
        {
            base.OnRequest(info);
            if (OnRequestException != null)
            {
                throw OnRequestException;
            }
        }
        protected override void OnSuccess()
        {
            base.OnSuccess();
            if (OnSuccessException != null)
            {
                throw OnSuccessException;
            }
        }
        protected override void OnWindowAdjust(uint bytesToAdd)
        {
            base.OnWindowAdjust(bytesToAdd);
            if (OnWindowAdjustException != null)
            {
                throw OnWindowAdjustException;
            }
        }
    }
}