using System.Linq;
using System;
using Renci.SshNet.Messages;
using System.Threading;
using System.Reflection;
using System.Collections.Generic;
using System.Diagnostics;
namespace Renci.SshNet
{
///
/// Provides functionality to connect and interact with SSH server.
///
public partial class Session
{
private static readonly Dictionary _handlers;
static Session()
{
_handlers = new Dictionary();
foreach (var method in typeof(Session).GetMethods(BindingFlags.Instance | BindingFlags.NonPublic).Where(x => x.Name == "HandleMessage"))
{
if (method.IsGenericMethod) continue;
var args = method.GetParameters();
if (args.Length != 1) continue;
var argType = args[0].ParameterType;
if (!argType.IsSubclassOf(typeof(Message))) continue;
_handlers.Add(argType, method);
}
}
///
/// Handles SSH messages.
///
/// The message.
partial void HandleMessageCore(Message message)
{
Debug.Assert(message != null);
MethodInfo method;
if (_handlers.TryGetValue(message.GetType(), out method))
{
try
{
method.Invoke(this, new object[] { message });
}
catch (TargetInvocationException ex)
{
throw ex.InnerException ?? ex;
}
}
else
{
HandleMessage(message);
}
}
partial void ExecuteThread(Action action)
{
ThreadPool.QueueUserWorkItem((o) => { action(); });
}
partial void InternalRegisterMessage(string messageName)
{
lock (this._messagesMetadata)
{
foreach (var m in from m in this._messagesMetadata where m.Name == messageName select m)
{
m.Enabled = true;
m.Activated = true;
}
}
}
partial void InternalUnRegisterMessage(string messageName)
{
lock (this._messagesMetadata)
{
foreach (var m in from m in this._messagesMetadata where m.Name == messageName select m)
{
m.Enabled = false;
m.Activated = false;
}
}
}
}
}