浏览代码

Move IsSocketConnected to Session.cs.
Move HandleMessageCore to Session.cs, and use FEATURE_DYNAMIC_TYPE conditional compilation symbol to use dynamic code.

drieseng 9 年之前
父节点
当前提交
6237dd4982

+ 3 - 9
src/Renci.SshNet.Silverlight5/Renci.SshNet.Silverlight5.csproj

@@ -29,7 +29,7 @@
     <DebugType>full</DebugType>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
     <Optimize>false</Optimize>
     <OutputPath>Bin\Debug</OutputPath>
     <OutputPath>Bin\Debug</OutputPath>
-    <DefineConstants>TRACE;DEBUG;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_RNG_CSP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_APM;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_HASH_SHA1_MANAGED;FEATURE_HASH_SHA256_MANAGED;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_RNG_CSP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_APM;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_HASH_SHA1_MANAGED;FEATURE_HASH_SHA256_MANAGED;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <NoStdLib>true</NoStdLib>
     <NoStdLib>true</NoStdLib>
     <NoConfig>true</NoConfig>
     <NoConfig>true</NoConfig>
     <ErrorReport>prompt</ErrorReport>
     <ErrorReport>prompt</ErrorReport>
@@ -42,7 +42,7 @@
     <DebugType>none</DebugType>
     <DebugType>none</DebugType>
     <Optimize>true</Optimize>
     <Optimize>true</Optimize>
     <OutputPath>Bin\Release</OutputPath>
     <OutputPath>Bin\Release</OutputPath>
-    <DefineConstants>TRACE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_RNG_CSP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_APM;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_HASH_SHA1_MANAGED;FEATURE_HASH_SHA256_MANAGED;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256</DefineConstants>
+    <DefineConstants>TRACE;FEATURE_DIRECTORYINFO_ENUMERATEFILES;FEATURE_RNG_CSP;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_APM;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_HASH_SHA1_MANAGED;FEATURE_HASH_SHA256_MANAGED;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <NoStdLib>true</NoStdLib>
     <NoStdLib>true</NoStdLib>
     <NoConfig>true</NoConfig>
     <NoConfig>true</NoConfig>
     <ErrorReport>prompt</ErrorReport>
     <ErrorReport>prompt</ErrorReport>
@@ -72,12 +72,6 @@
     <Reference Include="System.Net" />
     <Reference Include="System.Net" />
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
-    <Compile Include="..\Renci.SshNet.Silverlight\Session.SilverlightBrowser.cs">
-      <Link>Session.SilverlightBrowser.cs</Link>
-    </Compile>
-    <Compile Include="..\Renci.SshNet.Silverlight\Session.SilverlightShared.cs">
-      <Link>Session.SilverlightShared.cs</Link>
-    </Compile>
     <Compile Include="..\Renci.SshNet\Abstractions\CryptoAbstraction.cs">
     <Compile Include="..\Renci.SshNet\Abstractions\CryptoAbstraction.cs">
       <Link>Abstractions\CryptoAbstraction.cs</Link>
       <Link>Abstractions\CryptoAbstraction.cs</Link>
     </Compile>
     </Compile>
@@ -929,7 +923,7 @@
       <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
       <FlavorProperties GUID="{A1591282-1198-4647-A2B1-27E5FF5F6F3B}">
         <SilverlightProjectProperties />
         <SilverlightProjectProperties />
       </FlavorProperties>
       </FlavorProperties>
-      <UserProperties ProjectLinkerExcludeFilter="\\?desktop(\\.*)?$;\\?silverlight(\\.*)?$;\.desktop;\.silverlight;\.xaml;^service references(\\.*)?$;\.clientconfig;^web references(\\.*)?$" ProjectLinkReference="2f5f8c90-0bd1-424f-997c-7bc6280919d1" />
+      <UserProperties ProjectLinkReference="2f5f8c90-0bd1-424f-997c-7bc6280919d1" ProjectLinkerExcludeFilter="\\?desktop(\\.*)?$;\\?silverlight(\\.*)?$;\.desktop;\.silverlight;\.xaml;^service references(\\.*)?$;\.clientconfig;^web references(\\.*)?$" />
     </VisualStudio>
     </VisualStudio>
   </ProjectExtensions>
   </ProjectExtensions>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 

+ 8 - 14
src/Renci.SshNet.UAP10/Renci.SshNet.UAP10.csproj

@@ -23,7 +23,7 @@
     <DebugType>full</DebugType>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
     <Optimize>false</Optimize>
     <OutputPath>bin\Debug\</OutputPath>
     <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <WarningLevel>4</WarningLevel>
     <DocumentationFile>bin\Debug\Renci.SshNet.xml</DocumentationFile>
     <DocumentationFile>bin\Debug\Renci.SshNet.xml</DocumentationFile>
@@ -34,7 +34,7 @@
     <DebugType>pdbonly</DebugType>
     <DebugType>pdbonly</DebugType>
     <Optimize>true</Optimize>
     <Optimize>true</Optimize>
     <OutputPath>bin\Release\</OutputPath>
     <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII</DefineConstants>
+    <DefineConstants>TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <WarningLevel>4</WarningLevel>
     <DocumentationFile>bin\Release\Renci.SshNet.xml</DocumentationFile>
     <DocumentationFile>bin\Release\Renci.SshNet.xml</DocumentationFile>
@@ -44,7 +44,7 @@
     <PlatformTarget>x86</PlatformTarget>
     <PlatformTarget>x86</PlatformTarget>
     <DebugSymbols>true</DebugSymbols>
     <DebugSymbols>true</DebugSymbols>
     <OutputPath>bin\x86\Debug\</OutputPath>
     <OutputPath>bin\x86\Debug\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <NoWarn>;2008</NoWarn>
     <NoWarn>;2008</NoWarn>
     <DebugType>full</DebugType>
     <DebugType>full</DebugType>
     <PlatformTarget>x86</PlatformTarget>
     <PlatformTarget>x86</PlatformTarget>
@@ -54,7 +54,7 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
     <PlatformTarget>x86</PlatformTarget>
     <PlatformTarget>x86</PlatformTarget>
     <OutputPath>bin\x86\Release\</OutputPath>
     <OutputPath>bin\x86\Release\</OutputPath>
-    <DefineConstants>TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII</DefineConstants>
+    <DefineConstants>TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <Optimize>true</Optimize>
     <Optimize>true</Optimize>
     <NoWarn>;2008</NoWarn>
     <NoWarn>;2008</NoWarn>
     <DebugType>pdbonly</DebugType>
     <DebugType>pdbonly</DebugType>
@@ -66,7 +66,7 @@
     <PlatformTarget>ARM</PlatformTarget>
     <PlatformTarget>ARM</PlatformTarget>
     <DebugSymbols>true</DebugSymbols>
     <DebugSymbols>true</DebugSymbols>
     <OutputPath>bin\ARM\Debug\</OutputPath>
     <OutputPath>bin\ARM\Debug\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <NoWarn>;2008</NoWarn>
     <NoWarn>;2008</NoWarn>
     <DebugType>full</DebugType>
     <DebugType>full</DebugType>
     <PlatformTarget>ARM</PlatformTarget>
     <PlatformTarget>ARM</PlatformTarget>
@@ -76,7 +76,7 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|ARM'">
     <PlatformTarget>ARM</PlatformTarget>
     <PlatformTarget>ARM</PlatformTarget>
     <OutputPath>bin\ARM\Release\</OutputPath>
     <OutputPath>bin\ARM\Release\</OutputPath>
-    <DefineConstants>TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII</DefineConstants>
+    <DefineConstants>TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <Optimize>true</Optimize>
     <Optimize>true</Optimize>
     <NoWarn>;2008</NoWarn>
     <NoWarn>;2008</NoWarn>
     <DebugType>pdbonly</DebugType>
     <DebugType>pdbonly</DebugType>
@@ -88,7 +88,7 @@
     <PlatformTarget>x64</PlatformTarget>
     <PlatformTarget>x64</PlatformTarget>
     <DebugSymbols>true</DebugSymbols>
     <DebugSymbols>true</DebugSymbols>
     <OutputPath>bin\x64\Debug\</OutputPath>
     <OutputPath>bin\x64\Debug\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <NoWarn>;2008</NoWarn>
     <NoWarn>;2008</NoWarn>
     <DebugType>full</DebugType>
     <DebugType>full</DebugType>
     <PlatformTarget>x64</PlatformTarget>
     <PlatformTarget>x64</PlatformTarget>
@@ -98,7 +98,7 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
     <PlatformTarget>x64</PlatformTarget>
     <PlatformTarget>x64</PlatformTarget>
     <OutputPath>bin\x64\Release\</OutputPath>
     <OutputPath>bin\x64\Release\</OutputPath>
-    <DefineConstants>TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII</DefineConstants>
+    <DefineConstants>TRACE;FEATURE_DATAGRAMSOCKET;FEATURE_SOCKET_EAP;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_STREAM_TAP;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_TAP;FEATURE_MEMORYSTREAM_TRYGETBUFFER;FEATURE_REFLECTION_TYPEINFO;FEATURE_ENCODING_ASCII;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <Optimize>true</Optimize>
     <Optimize>true</Optimize>
     <NoWarn>;2008</NoWarn>
     <NoWarn>;2008</NoWarn>
     <DebugType>pdbonly</DebugType>
     <DebugType>pdbonly</DebugType>
@@ -795,12 +795,6 @@
     <Compile Include="..\Renci.SshNet\Session.cs">
     <Compile Include="..\Renci.SshNet\Session.cs">
       <Link>Session.cs</Link>
       <Link>Session.cs</Link>
     </Compile>
     </Compile>
-    <Compile Include="..\Renci.SshNet\Session.NET.cs">
-      <Link>Session.NET.cs</Link>
-    </Compile>
-    <Compile Include="..\Renci.SshNet\Session.NET40.cs">
-      <Link>Session.NET40.cs</Link>
-    </Compile>
     <Compile Include="..\Renci.SshNet\SftpClient.cs">
     <Compile Include="..\Renci.SshNet\SftpClient.cs">
       <Link>SftpClient.cs</Link>
       <Link>SftpClient.cs</Link>
     </Compile>
     </Compile>

+ 2 - 8
src/Renci.SshNet/Renci.SshNet.csproj

@@ -18,7 +18,7 @@
     <DebugType>full</DebugType>
     <DebugType>full</DebugType>
     <Optimize>false</Optimize>
     <Optimize>false</Optimize>
     <OutputPath>bin\Debug\</OutputPath>
     <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <WarningLevel>4</WarningLevel>
     <DocumentationFile>bin\Debug\Renci.SshNet.xml</DocumentationFile>
     <DocumentationFile>bin\Debug\Renci.SshNet.xml</DocumentationFile>
@@ -29,7 +29,7 @@
     <DebugType>none</DebugType>
     <DebugType>none</DebugType>
     <Optimize>true</Optimize>
     <Optimize>true</Optimize>
     <OutputPath>bin\Release\</OutputPath>
     <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII</DefineConstants>
+    <DefineConstants>FEATURE_REGEX_COMPILE;FEATURE_BINARY_SERIALIZATION;FEATURE_RNG_CREATE;FEATURE_SOCKET_SYNC;FEATURE_SOCKET_EAP;FEATURE_SOCKET_APM;FEATURE_SOCKET_SETSOCKETOPTION;FEATURE_SOCKET_POLL;FEATURE_STREAM_APM;FEATURE_DNS_SYNC;FEATURE_THREAD_COUNTDOWNEVENT;FEATURE_THREAD_THREADPOOL;FEATURE_THREAD_SLEEP;FEATURE_HASH_MD5;FEATURE_HASH_SHA1_CREATE;FEATURE_HASH_SHA256_CREATE;FEATURE_HASH_SHA384_CREATE;FEATURE_HASH_SHA512_CREATE;FEATURE_HASH_RIPEMD160_CREATE;FEATURE_HMAC_MD5;FEATURE_HMAC_SHA1;FEATURE_HMAC_SHA256;FEATURE_HMAC_SHA384;FEATURE_HMAC_SHA512;FEATURE_HMAC_RIPEMD160;FEATURE_MEMORYSTREAM_GETBUFFER;FEATURE_DIAGNOSTICS_TRACESOURCE;FEATURE_ENCODING_ASCII;FEATURE_DYNAMIC_TYPE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
     <WarningLevel>4</WarningLevel>
     <DocumentationFile>bin\Release\Renci.SshNet.xml</DocumentationFile>
     <DocumentationFile>bin\Release\Renci.SshNet.xml</DocumentationFile>
@@ -368,12 +368,6 @@
     <Compile Include="Session.cs">
     <Compile Include="Session.cs">
       <SubType>Code</SubType>
       <SubType>Code</SubType>
     </Compile>
     </Compile>
-    <Compile Include="Session.NET.cs">
-      <SubType>Code</SubType>
-    </Compile>
-    <Compile Include="Session.NET40.cs">
-      <SubType>Code</SubType>
-    </Compile>
     <Compile Include="SftpClient.cs">
     <Compile Include="SftpClient.cs">
       <SubType>Code</SubType>
       <SubType>Code</SubType>
     </Compile>
     </Compile>

+ 0 - 83
src/Renci.SshNet/Session.NET.cs

@@ -1,83 +0,0 @@
-using System;
-using System.Net.Sockets;
-using Renci.SshNet.Abstractions;
-
-namespace Renci.SshNet
-{
-    public partial class Session
-    {
-#if FEATURE_SOCKET_POLL
-        /// <summary>
-        /// Gets a value indicating whether the socket is connected.
-        /// </summary>
-        /// <param name="isConnected"><c>true</c> if the socket is connected; otherwise, <c>false</c></param>
-        /// <remarks>
-        /// <para>
-        /// As a first check we verify whether <see cref="Socket.Connected"/> is
-        /// <c>true</c>. However, this only returns the state of the socket as of
-        /// the last I/O operation.
-        /// </para>
-        /// <para>
-        /// Therefore we use the combination of <see cref="Socket.Poll(int, SelectMode)"/> with mode <see cref="SelectMode.SelectRead"/>
-        /// and <see cref="Socket.Available"/> to verify if the socket is still connected.
-        /// </para>
-        /// <para>
-        /// The MSDN doc mention the following on the return value of <see cref="Socket.Poll(int, SelectMode)"/>
-        /// with mode <see cref="SelectMode.SelectRead"/>:
-        /// <list type="bullet">
-        ///     <item>
-        ///         <description><c>true</c> if data is available for reading;</description>
-        ///     </item>
-        ///     <item>
-        ///         <description><c>true</c> if the connection has been closed, reset, or terminated; otherwise, returns <c>false</c>.</description>
-        ///     </item>
-        /// </list>
-        /// </para>
-        /// <para>
-        /// <c>Conclusion:</c> when the return value is <c>true</c> - but no data is available for reading - then
-        /// the socket is no longer connected.
-        /// </para>
-        /// <para>
-        /// When a <see cref="Socket"/> is used from multiple threads, there's a race condition
-        /// between the invocation of <see cref="Socket.Poll(int, SelectMode)"/> and the moment
-        /// when the value of <see cref="Socket.Available"/> is obtained. To workaround this issue
-        /// we synchronize reads from the <see cref="Socket"/>.
-        /// </para>
-        /// </remarks>
-#else
-        /// <summary>
-        /// Gets a value indicating whether the socket is connected.
-        /// </summary>
-        /// <param name="isConnected"><c>true</c> if the socket is connected; otherwise, <c>false</c></param>
-        /// <remarks>
-        /// We verify whether <see cref="Socket.Connected"/> is <c>true</c>. However, this only returns the state
-        /// of the socket as of the last I/O operation.
-        /// </remarks>
-#endif
-        partial void IsSocketConnected(ref bool isConnected)
-        {
-            DiagnosticAbstraction.Log(string.Format("[{0}] {1} Checking socket", ToHex(SessionId), DateTime.Now.Ticks));
-
-            lock (_socketDisposeLock)
-            {
-#if FEATURE_SOCKET_POLL
-                if (!_socket.IsConnected())
-                {
-                    isConnected = false;
-                    return;
-                }
-
-                lock (_socketReadLock)
-                {
-                    var connectionClosedOrDataAvailable = _socket.Poll(0, SelectMode.SelectRead);
-                    isConnected = !(connectionClosedOrDataAvailable && _socket.Available == 0);
-                }
-#else
-                isConnected = _socket.IsConnected();
-#endif // FEATURE_SOCKET_POLL
-            }
-
-            DiagnosticAbstraction.Log(string.Format("[{0}] {1} Checked socket", ToHex(SessionId), DateTime.Now.Ticks));
-        }
-    }
-}

+ 0 - 15
src/Renci.SshNet/Session.NET40.cs

@@ -1,15 +0,0 @@
-using Renci.SshNet.Messages;
-
-namespace Renci.SshNet
-{
-    /// <summary>
-    /// Provides functionality to connect and interact with SSH server.
-    /// </summary>
-    public partial class Session
-    {
-        partial void HandleMessageCore(Message message)
-        {
-            HandleMessage((dynamic)message);
-        }
-    }
-}

+ 286 - 27
src/Renci.SshNet/Session.cs

@@ -247,7 +247,7 @@ namespace Renci.SshNet
         /// <c>true</c> if the session is connected; otherwise, <c>false</c>.
         /// <c>true</c> if the session is connected; otherwise, <c>false</c>.
         /// </value>
         /// </value>
         /// <remarks>
         /// <remarks>
-        /// This methods returns true in all but the following cases:
+        /// This methods returns <c>true</c> in all but the following cases:
         /// <list type="bullet">
         /// <list type="bullet">
         ///     <item>
         ///     <item>
         ///         <description>The <see cref="Session"/> is disposed.</description>
         ///         <description>The <see cref="Session"/> is disposed.</description>
@@ -275,9 +275,7 @@ namespace Renci.SshNet
                 if (_messageListenerCompleted == null || _messageListenerCompleted.WaitOne(0))
                 if (_messageListenerCompleted == null || _messageListenerCompleted.WaitOne(0))
                     return false;
                     return false;
 
 
-                var isSocketConnected = false;
-                IsSocketConnected(ref isSocketConnected);
-                return isSocketConnected;
+                return IsSocketConnected();
             }
             }
         }
         }
 
 
@@ -1065,7 +1063,202 @@ namespace Renci.SshNet
             _isDisconnectMessageSent = true;
             _isDisconnectMessageSent = true;
         }
         }
 
 
-        partial void HandleMessageCore(Message message);
+        void HandleMessageCore(Message message)
+        {
+            if (message == null)
+                throw new ArgumentNullException("message");
+
+#if FEATURE_DYNAMIC_TYPE
+            HandleMessage((dynamic) message);
+#else
+            var disconnectMessage = message as DisconnectMessage;
+            if (disconnectMessage != null)
+            {
+                HandleMessage(disconnectMessage);
+                return;
+            }
+
+            var serviceRequestMessage = message as ServiceRequestMessage;
+            if (serviceRequestMessage != null)
+            {
+                HandleMessage(serviceRequestMessage);
+                return;
+            }
+
+            var serviceAcceptMessage = message as ServiceAcceptMessage;
+            if (serviceAcceptMessage != null)
+            {
+                HandleMessage(serviceAcceptMessage);
+                return;
+            }
+
+            var keyExchangeInitMessage = message as KeyExchangeInitMessage;
+            if (keyExchangeInitMessage != null)
+            {
+                HandleMessage(keyExchangeInitMessage);
+                return;
+            }
+
+            var newKeysMessage = message as NewKeysMessage;
+            if (newKeysMessage != null)
+            {
+                HandleMessage(newKeysMessage);
+                return;
+            }
+
+            var requestMessage = message as RequestMessage;
+            if (requestMessage != null)
+            {
+                HandleMessage(requestMessage);
+                return;
+            }
+
+            var failureMessage = message as FailureMessage;
+            if (failureMessage != null)
+            {
+                HandleMessage(failureMessage);
+                return;
+            }
+
+            var successMessage = message as SuccessMessage;
+            if (successMessage != null)
+            {
+                HandleMessage(successMessage);
+                return;
+            }
+
+            var bannerMessage = message as BannerMessage;
+            if (bannerMessage != null)
+            {
+                HandleMessage(bannerMessage);
+                return;
+            }
+
+            var globalRequestMessage = message as GlobalRequestMessage;
+            if (globalRequestMessage != null)
+            {
+                HandleMessage(globalRequestMessage);
+                return;
+            }
+
+            var requestSuccessMessage = message as RequestSuccessMessage;
+            if (requestSuccessMessage != null)
+            {
+                HandleMessage(requestSuccessMessage);
+                return;
+            }
+
+            var requestFailureMessage = message as RequestFailureMessage;
+            if (requestFailureMessage != null)
+            {
+                HandleMessage(requestFailureMessage);
+                return;
+            }
+
+            var channelOpenMessage = message as ChannelOpenMessage;
+            if (channelOpenMessage != null)
+            {
+                HandleMessage(channelOpenMessage);
+                return;
+            }
+
+            var channelOpenConfirmationMessage = message as ChannelOpenConfirmationMessage;
+            if (channelOpenConfirmationMessage != null)
+            {
+                HandleMessage(channelOpenConfirmationMessage);
+                return;
+            }
+
+            var channelOpenFailureMessage = message as ChannelOpenFailureMessage;
+            if (channelOpenFailureMessage != null)
+            {
+                HandleMessage(channelOpenFailureMessage);
+                return;
+            }
+
+            var channelWindowAdjustMessage = message as ChannelWindowAdjustMessage;
+            if (channelWindowAdjustMessage != null)
+            {
+                HandleMessage(channelWindowAdjustMessage);
+                return;
+            }
+
+            var channelDataMessage = message as ChannelDataMessage;
+            if (channelDataMessage != null)
+            {
+                HandleMessage(channelDataMessage);
+                return;
+            }
+
+            var channelExtendedDataMessage = message as ChannelExtendedDataMessage;
+            if (channelExtendedDataMessage != null)
+            {
+                HandleMessage(channelExtendedDataMessage);
+                return;
+            }
+
+            var channelEofMessage = message as ChannelEofMessage;
+            if (channelEofMessage != null)
+            {
+                HandleMessage(channelEofMessage);
+                return;
+            }
+
+            var channelCloseMessage = message as ChannelCloseMessage;
+            if (channelCloseMessage != null)
+            {
+                HandleMessage(channelCloseMessage);
+                return;
+            }
+
+            var channelRequestMessage = message as ChannelRequestMessage;
+            if (channelRequestMessage != null)
+            {
+                HandleMessage(channelRequestMessage);
+                return;
+            }
+
+            var channelSuccessMessage = message as ChannelSuccessMessage;
+            if (channelSuccessMessage != null)
+            {
+                HandleMessage(channelSuccessMessage);
+                return;
+            }
+
+            var channelFailureMessage = message as ChannelFailureMessage;
+            if (channelFailureMessage != null)
+            {
+                HandleMessage(channelFailureMessage);
+                return;
+            }
+
+            var ignoreMessage = message as IgnoreMessage;
+            if (ignoreMessage != null)
+            {
+                HandleMessage(ignoreMessage);
+                return;
+            }
+
+            var unimplementedMessage = message as UnimplementedMessage;
+            if (unimplementedMessage != null)
+            {
+                HandleMessage(unimplementedMessage);
+                return;
+            }
+
+            var debugMessage = message as DebugMessage;
+            if (debugMessage != null)
+            {
+                HandleMessage(debugMessage);
+                return;
+            }
+
+            throw new NotImplementedException("Message type '{0}' is not implemented. Please submit an issue.", message.GetType().FullName);
+        }
+
+        #error FUCK
+#endif
+        }
 
 
         /// <summary>
         /// <summary>
         /// Handles the message.
         /// Handles the message.
@@ -1074,10 +1267,11 @@ namespace Renci.SshNet
         /// <param name="message">The message.</param>
         /// <param name="message">The message.</param>
         private void HandleMessage<T>(T message) where T : Message
         private void HandleMessage<T>(T message) where T : Message
         {
         {
+            DiagnosticAbstraction.Log(string.Format("[{0}] Message<{1}> received", ToHex(SessionId), typeof(T).FullName));
             OnMessageReceived(message);
             OnMessageReceived(message);
         }
         }
 
 
-        #region Handle transport messages
+#region Handle transport messages
 
 
         /// <summary>
         /// <summary>
         /// Invoked via reflection.
         /// Invoked via reflection.
@@ -1146,9 +1340,9 @@ namespace Renci.SshNet
             OnNewKeysReceived(message);
             OnNewKeysReceived(message);
         }
         }
 
 
-        #endregion
+#endregion
 
 
-        #region Handle User Authentication messages
+#region Handle User Authentication messages
 
 
         /// <summary>
         /// <summary>
         /// Invoked via reflection.
         /// Invoked via reflection.
@@ -1182,9 +1376,9 @@ namespace Renci.SshNet
             OnUserAuthenticationBannerReceived(message);
             OnUserAuthenticationBannerReceived(message);
         }
         }
 
 
-        #endregion
+#endregion
 
 
-        #region Handle connection messages
+#region Handle connection messages
 
 
         /// <summary>
         /// <summary>
         /// Invoked via reflection.
         /// Invoked via reflection.
@@ -1298,9 +1492,9 @@ namespace Renci.SshNet
             OnChannelFailureReceived(message);
             OnChannelFailureReceived(message);
         }
         }
 
 
-        #endregion
+#endregion
 
 
-        #region Handle received message events
+#region Handle received message events
 
 
         /// <summary>
         /// <summary>
         /// Called when <see cref="DisconnectMessage"/> received.
         /// Called when <see cref="DisconnectMessage"/> received.
@@ -1684,7 +1878,7 @@ namespace Renci.SshNet
                 handlers(this, new MessageEventArgs<Message>(message));
                 handlers(this, new MessageEventArgs<Message>(message));
         }
         }
 
 
-        #endregion
+#endregion
 
 
         private void KeyExchange_HostKeyReceived(object sender, HostKeyEventArgs e)
         private void KeyExchange_HostKeyReceived(object sender, HostKeyEventArgs e)
         {
         {
@@ -1693,7 +1887,7 @@ namespace Renci.SshNet
                 handlers(this, e);
                 handlers(this, e);
         }
         }
 
 
-        #region Message loading functions
+#region Message loading functions
 
 
         /// <summary>
         /// <summary>
         /// Registers SSH message with the session.
         /// Registers SSH message with the session.
@@ -1763,15 +1957,7 @@ namespace Renci.SshNet
             return ToHex(bytes, 0);
             return ToHex(bytes, 0);
         }
         }
 
 
-        #endregion
-
-        /// <summary>
-        /// Gets a value indicating whether the socket is connected.
-        /// </summary>
-        /// <value>
-        /// <c>true</c> if the socket is connected; otherwise, <c>false</c>.
-        /// </value>
-        partial void IsSocketConnected(ref bool isConnected);
+#endregion
 
 
         /// <summary>
         /// <summary>
         /// Establishes a socket connection to the specified host and port.
         /// Establishes a socket connection to the specified host and port.
@@ -1820,6 +2006,79 @@ namespace Renci.SshNet
             return bytesRead;
             return bytesRead;
         }
         }
 
 
+#if FEATURE_SOCKET_POLL
+        /// <summary>
+        /// Gets a value indicating whether the socket is connected.
+        /// </summary>
+        /// <returns>
+        /// <c>true</c> if the socket is connected; otherwise, <c>false</c>.
+        /// </returns>
+        /// <remarks>
+        /// <para>
+        /// As a first check we verify whether <see cref="Socket.Connected"/> is
+        /// <c>true</c>. However, this only returns the state of the socket as of
+        /// the last I/O operation.
+        /// </para>
+        /// <para>
+        /// Therefore we use the combination of <see cref="Socket.Poll(int, SelectMode)"/> with mode <see cref="SelectMode.SelectRead"/>
+        /// and <see cref="Socket.Available"/> to verify if the socket is still connected.
+        /// </para>
+        /// <para>
+        /// The MSDN doc mention the following on the return value of <see cref="Socket.Poll(int, SelectMode)"/>
+        /// with mode <see cref="SelectMode.SelectRead"/>:
+        /// <list type="bullet">
+        ///     <item>
+        ///         <description><c>true</c> if data is available for reading;</description>
+        ///     </item>
+        ///     <item>
+        ///         <description><c>true</c> if the connection has been closed, reset, or terminated; otherwise, returns <c>false</c>.</description>
+        ///     </item>
+        /// </list>
+        /// </para>
+        /// <para>
+        /// <c>Conclusion:</c> when the return value is <c>true</c> - but no data is available for reading - then
+        /// the socket is no longer connected.
+        /// </para>
+        /// <para>
+        /// When a <see cref="Socket"/> is used from multiple threads, there's a race condition
+        /// between the invocation of <see cref="Socket.Poll(int, SelectMode)"/> and the moment
+        /// when the value of <see cref="Socket.Available"/> is obtained. To workaround this issue
+        /// we synchronize reads from the <see cref="Socket"/>.
+        /// </para>
+        /// </remarks>
+#else
+        /// <summary>
+        /// Gets a value indicating whether the socket is connected.
+        /// </summary>
+        /// <returns>
+        /// <c>true</c> if the socket is connected; otherwise, <c>false</c>.
+        /// </returns>
+        /// <remarks>
+        /// We verify whether <see cref="Socket.Connected"/> is <c>true</c>. However, this only returns the state
+        /// of the socket as of the last I/O operation.
+        /// </remarks>
+#endif
+        private bool IsSocketConnected()
+        {
+            lock (_socketDisposeLock)
+            {
+#if FEATURE_SOCKET_POLL
+                if (!_socket.IsConnected())
+                {
+                    return false;
+                }
+
+                lock (_socketReadLock)
+                {
+                    var connectionClosedOrDataAvailable = _socket.Poll(0, SelectMode.SelectRead);
+                    return !(connectionClosedOrDataAvailable && _socket.Available == 0);
+                }
+#else
+                return _socket.IsConnected();
+#endif // FEATURE_SOCKET_POLL
+            }
+        }
+
         /// <summary>
         /// <summary>
         /// Performs a blocking read on the socket until <paramref name="length"/> bytes are received.
         /// Performs a blocking read on the socket until <paramref name="length"/> bytes are received.
         /// </summary>
         /// </summary>
@@ -2350,7 +2609,7 @@ namespace Renci.SshNet
                 DisconnectReason.ConnectionLost);
                 DisconnectReason.ConnectionLost);
         }
         }
 
 
-        #region IDisposable implementation
+#region IDisposable implementation
 
 
         private bool _disposed;
         private bool _disposed;
 
 
@@ -2441,9 +2700,9 @@ namespace Renci.SshNet
             Dispose(false);
             Dispose(false);
         }
         }
 
 
-        #endregion IDisposable implementation
+#endregion IDisposable implementation
 
 
-        #region ISession implementation
+#region ISession implementation
 
 
         /// <summary>
         /// <summary>
         /// Gets or sets the connection info.
         /// Gets or sets the connection info.
@@ -2528,6 +2787,6 @@ namespace Renci.SshNet
             return TrySendMessage(message);
             return TrySendMessage(message);
         }
         }
 
 
-        #endregion ISession implementation
+#endregion ISession implementation
     }
     }
 }
 }