--- /dev/null
--- /dev/null
++//\r\r
++// System.Diagnostics.Debugger.cs\r\r
++//\r\r
++// Author:\r\r
++// John R. Hicks (angryjohn69@nc.rr.com)\r\r
++//\r\r
++// (C) 2001\r\r
++//\r\r
++using System;\r\r
++\r\r
++namespace System.Diagnostics\r\r
++{\r\r
++ /// <summary>\r\r
++ /// Enables communication with a debugger.\r\r
++ /// </summary>\r\r
++ [MonoTODO]\r\r
++ public sealed class Debugger\r\r
++ {\r\r
++ private static bool isAttached;\r\r
++ \r\r
++ /// <summary>\r\r
++ /// Represents the default category of a message with a constant.\r\r
++ /// </summary>\r\r
++ public static readonly string DefaultCategory = "";\r\r
++ \r\r
++ /// <summary>\r\r
++ /// Returns a Boolean indicating whether a debugger is attached to a process.\r\r
++ /// </summary>\r\r
++ /// <value>\r\r
++ /// true if debugger is attached; otherwise, false.\r\r
++ /// </value>\r\r
++ public static bool IsAttached\r\r
++ {\r\r
++ get\r\r
++ {\r\r
++ return isAttached;\r\r
++ }\r\r
++ }\r\r
++ \r\r
++ /// <summary>\r\r
++ /// Causes a breakpoint to be signaled to an attached debugger.\r\r
++ /// </summary>\r\r
++ [MonoTODO]\r\r
++ public static void Break()\r\r
++ {\r\r
++ throw new NotImplementedException();\r\r
++ }\r\r
++ \r\r
++ /// <summary>\r\r
++ /// Checks to see if logging is enabled by an attached debugger.\r\r
++ /// </summary>\r\r
++ [MonoTODO]\r\r
++ public static bool IsLogging()\r\r
++ {\r\r
++ // Return false. DefaultTraceListener invokes this method, so throwing\r\r
++ // a NotImplementedException wouldn't be appropriate.\r\r
++ return false;\r\r
++\r\r
++ }\r\r
++ \r\r
++ /// <summary>\r\r
++ /// Launches and attaches a debugger to the process.\r\r
++ /// </summary>\r\r
++ [MonoTODO]\r\r
++ public static bool Launch()\r\r
++ {\r\r
++ throw new NotImplementedException();\r\r
++ }\r\r
++ \r\r
++ /// <summary>\r\r
++ /// Posts a message for the attached debugger.\r\r
++ /// </summary>\r\r
++ /// <param name="level">\r\r
++ /// A description of the importance of this message\r\r
++ /// </param>\r\r
++ /// <param name="category">\r\r
++ /// A string describing the category of this message.\r\r
++ /// </param>\r\r
++ /// <param name="message">\r\r
++ /// A string representing the message to show.\r\r
++ /// </param>\r\r
++ [MonoTODO]\r\r
++ public static void Log(int level, string category, string message)\r\r
++ {\r\r
++ // Do nothing. DefaultTraceListener invokes this method, so throwing\r\r
++ // a NotImplementedException wouldn't be appropriate.\r\r
++ }\r\r
++ \r\r
++ public Debugger()\r\r
++ {\r\r
++ isAttached = false;\r\r
++ }\r\r
++ }\r\r
++}\r\r
--- /dev/null
--- /dev/null
++//\r
++// System.Diagnostics.StackFrame.cs\r
++//\r
++// Author:\r
++// Alexander Klyubin (klyubin@aqris.com)\r
++// Dietmar Maurer (dietmar@ximian.com)\r
++//\r
++// (C) 2001\r
++//\r
++\r
++using System;\r
++using System.Reflection;\r
++using System.Runtime.CompilerServices;\r
++\r
++namespace System.Diagnostics {\r
++ /// <summary>\r
++ /// Stack frame.\r
++ /// </summary>\r
++\r
++ [Serializable]\r
++ public class StackFrame {\r
++ /// <value>\r
++ /// Constant returned when the native or IL offset is unknown.\r
++ /// </value>\r
++ public const int OFFSET_UNKNOWN = -1;\r
++ \r
++ /// <value>\r
++ /// Offset from the start of the IL code for the method\r
++ /// being executed.\r
++ /// </value>\r
++ private int ilOffset = OFFSET_UNKNOWN;\r
++ \r
++ /// <value>\r
++ /// Offset from the start of the native code for the method\r
++ /// being executed.\r
++ /// </value>\r
++ private int nativeOffset = OFFSET_UNKNOWN;\r
++\r
++ /// <value>\r
++ /// Method associated with this stack frame.\r
++ /// </value>\r
++ private MethodBase methodBase;\r
++ \r
++ /// <value>\r
++ /// File name.\r
++ /// </value>\r
++ private string fileName;\r
++ \r
++ /// <value>\r
++ /// Line number.\r
++ /// </value>\r
++ private int lineNumber;\r
++ \r
++ /// <value>\r
++ /// Column number.\r
++ /// </value>\r
++ private int columnNumber;\r
++#if TARGET_JVM\r
++ static bool get_frame_info (int skip, bool needFileInfo, out MethodBase method,\r
++ out int iloffset, out int native_offset,\r
++ out string file, out int line, out int column)\r
++ {\r
++ native_offset = 0;\r
++ line = 0;\r
++ column = 0;\r
++ file = "";\r
++ iloffset = 0;\r
++ method = null;\r
++ return false;\r
++ }\r
++#else\r
++ [MethodImplAttribute(MethodImplOptions.InternalCall)]\r
++ extern static bool get_frame_info (int skip, bool needFileInfo, out MethodBase method,\r
++ out int iloffset, out int native_offset,\r
++ out string file, out int line, out int column);\r
++#endif\r
++ /// <summary>\r
++ /// Initializes a new StackFrame object corresponding to the\r
++ /// active stack frame.\r
++ /// </summary>\r
++ public StackFrame() \r
++ {\r
++ get_frame_info (2, false, out methodBase, out ilOffset,\r
++ out nativeOffset, out fileName, out lineNumber,\r
++ out columnNumber); \r
++ }\r
++ \r
++ /// <summary>\r
++ /// Initializes a new StackFrame object corresponding to the\r
++ /// active stack frame.\r
++ /// </summary>\r
++ /// <param name="needFileInfo">\r
++ /// TODO:\r
++ /// </param>\r
++ public StackFrame(bool needFileInfo) : this() {\r
++ get_frame_info (2, needFileInfo, out methodBase, out ilOffset,\r
++ out nativeOffset, out fileName, out lineNumber,\r
++ out columnNumber); \r
++ }\r
++ \r
++ /// <summary>\r
++ /// Initializes a new StackFrame object corresponding to the\r
++ /// active stack frame.\r
++ /// </summary>\r
++ /// <param name="skipFrames">\r
++ /// The number of frames up the stack to skip.\r
++ /// </param>\r
++ public StackFrame(int skipFrames) {\r
++ get_frame_info (skipFrames + 2, false, out methodBase, out ilOffset,\r
++ out nativeOffset, out fileName, out lineNumber,\r
++ out columnNumber); \r
++ }\r
++ \r
++ /// <summary>\r
++ /// Initializes a new StackFrame object corresponding to the\r
++ /// active stack frame.\r
++ /// </summary>\r
++ /// <param name="skipFrames">\r
++ /// The number of frames up the stack to skip.\r
++ /// </param>\r
++ /// <param name="needFileInfo">\r
++ /// TODO:\r
++ /// </param>\r
++ public StackFrame(int skipFrames, bool needFileInfo) {\r
++ get_frame_info (skipFrames + 2, needFileInfo, out methodBase, out ilOffset,\r
++ out nativeOffset, out fileName, out lineNumber,\r
++ out columnNumber);\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Constructs a fake stack frame that just contains the\r
++ /// given file name and line number. Use this constructor\r
++ /// when you do not want to use the debugger's line mapping\r
++ /// logic.\r
++ /// </summary>\r
++ /// <param name="fileName">\r
++ /// The given file name.\r
++ /// </param>\r
++ /// <param name="lineNumber">\r
++ /// The line number in the specified file.\r
++ /// </param>\r
++ // LAMESPEC: According to the MSDN docs, this creates a\r
++ // fake stack frame. But MS fills out the frame info as well\r
++ public StackFrame(string fileName, int lineNumber) {\r
++ get_frame_info (2, false, out methodBase, out ilOffset,\r
++ out nativeOffset, out fileName, out lineNumber,\r
++ out columnNumber);\r
++ this.fileName = fileName;\r
++ this.lineNumber = lineNumber;\r
++ this.columnNumber = 0;\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Constructs a fake stack frame that just contains the\r
++ /// given file name and line number. Use this constructor\r
++ /// when you do not want to use the debugger's line mapping\r
++ /// logic.\r
++ /// </summary>\r
++ /// <param name="fileName">\r
++ /// The given file name.\r
++ /// </param>\r
++ /// <param name="lineNumber">\r
++ /// The line number in the specified file.\r
++ /// </param>\r
++ /// <param name="colNumber">\r
++ /// The column number in the specified file.\r
++ /// </param>\r
++ // LAMESPEC: According to the MSDN docs, this creates a\r
++ // fake stack frame. But MS fills out the frame info as well\r
++ public StackFrame(string fileName,\r
++ int lineNumber,\r
++ int colNumber) {\r
++ get_frame_info (2, false, out methodBase, out ilOffset,\r
++ out nativeOffset, out fileName, out lineNumber,\r
++ out columnNumber);\r
++ this.fileName = fileName;\r
++ this.lineNumber = lineNumber;\r
++ this.columnNumber = colNumber;\r
++ }\r
++ \r
++ \r
++ /// <summary>\r
++ /// Gets the line number in the file containing the code\r
++ /// being executed. This information is typically extracted\r
++ /// from the debugging symbols for the executable.\r
++ /// </summary>\r
++ /// <returns>\r
++ /// The file line number or zero if it cannot be determined.\r
++ /// </returns>\r
++ public virtual int GetFileLineNumber()\r
++ {\r
++ return lineNumber;\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Gets the column number in the file containing the code\r
++ /// being executed. This information is typically extracted\r
++ /// from the debugging symbols for the executable.\r
++ /// </summary>\r
++ /// <returns>\r
++ /// The file column number or zero if it cannot be determined.\r
++ /// </returns>\r
++ public virtual int GetFileColumnNumber()\r
++ {\r
++ return columnNumber;\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Gets the file name containing the code being executed.\r
++ /// This information is typically extracted from the\r
++ /// debugging symbols for the executable.\r
++ /// </summary>\r
++ /// <returns>\r
++ /// The file name or null if it cannot be determined.\r
++ /// </returns> \r
++ public virtual string GetFileName()\r
++ {\r
++ return fileName;\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Gets the offset from the start of the IL code for the\r
++ /// method being executed. This offset may be approximate\r
++ /// depending on whether the JIT compiler is generating\r
++ /// debugging code or not.\r
++ /// </summary>\r
++ /// <returns>\r
++ /// The offset from the start of the IL code for the method\r
++ /// being executed.\r
++ /// </returns>\r
++ public virtual int GetILOffset()\r
++ {\r
++ return ilOffset;\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Gets the method in which the frame is executing.\r
++ /// </summary>\r
++ /// <returns>\r
++ /// The method the frame is executing in.\r
++ /// </returns>\r
++ public virtual MethodBase GetMethod()\r
++ {\r
++ return methodBase;\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Gets the offset from the start of the native\r
++ /// (JIT-compiled) code for the method being executed.\r
++ /// </summary>\r
++ /// <returns>\r
++ /// The offset from the start of the native (JIT-compiled)\r
++ /// code or the method being executed.\r
++ /// </returns>\r
++ public virtual int GetNativeOffset()\r
++ {\r
++ return nativeOffset; \r
++ }\r
++ \r
++ /// <summary>\r
++ /// Builds a readable representation of the stack frame.\r
++ /// </summary>\r
++ /// <returns>\r
++ /// A readable representation of the stack frame.\r
++ /// </returns>\r
++ public override string ToString() {\r
++ string methodNameString =\r
++ (GetMethod() == null)\r
++ ? "<unknown method>"\r
++ : GetMethod().Name;\r
++ string offsetString =\r
++ (GetILOffset() == OFFSET_UNKNOWN)\r
++ ? "<unknown offset>"\r
++ : "offset " + GetILOffset();\r
++ string fileNameString =\r
++ (GetFileName() == null)\r
++ ? "<filename unknown>" : GetFileName();\r
++ return methodNameString + " at " + offsetString\r
++ + " in file:line:column " + fileNameString\r
++ + ":" + GetFileLineNumber()\r
++ + ":" + GetFileColumnNumber();\r
++ }\r
++ \r
++ public override bool Equals(Object obj) {\r
++ if ((obj == null) || (!(obj is StackFrame))) {\r
++ return false;\r
++ }\r
++ \r
++ StackFrame rhs = (StackFrame) obj;\r
++ \r
++ if (!ObjectsEqual(GetMethod(), rhs.GetMethod())) {\r
++ return false;\r
++ }\r
++ \r
++ if (!ObjectsEqual(GetFileName(), rhs.GetFileName())) {\r
++ return false;\r
++ }\r
++ \r
++ if (GetFileLineNumber() != rhs.GetFileLineNumber()) {\r
++ return false;\r
++ }\r
++ \r
++ if (GetFileColumnNumber() != rhs.GetFileColumnNumber()) {\r
++ return false;\r
++ }\r
++ \r
++ if (GetILOffset() != rhs.GetILOffset()) {\r
++ return false;\r
++ }\r
++ \r
++ if (GetNativeOffset() != rhs.GetNativeOffset()) {\r
++ return false;\r
++ }\r
++ \r
++ return true;\r
++ \r
++ }\r
++ \r
++ public override int GetHashCode() {\r
++ return GetFileLineNumber();\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Checks whether two objects are equal.\r
++ /// The objects are assumed equal if and only if either\r
++ /// both of the references are <code>null</code> or they\r
++ /// equal via <code>Equals</code> method.\r
++ /// </summary>\r
++ /// <param name="obj1">\r
++ /// First object.\r
++ /// </param>\r
++ /// <param name="obj2">\r
++ /// Second object.\r
++ /// </param>\r
++ /// <returns>\r
++ /// <code>true</code> if the two objects are equal,\r
++ /// </code>false</code> otherwise.\r
++ /// </returns>\r
++ private static bool ObjectsEqual(Object obj1, Object obj2) {\r
++ if (obj1 == null) {\r
++ return (obj2 == null);\r
++ } else {\r
++ return obj1.Equals(obj2);\r
++ }\r
++ }\r
++ }\r
++}\r
--- /dev/null
--- /dev/null
++//\r
++// System.Diagnostics.StackTrace.cs\r
++//\r
++// Author:\r
++// Alexander Klyubin (klyubin@aqris.com)\r
++// Dietmar Maurer (dietmar@ximian.com)\r
++//\r
++// (C) 2001\r
++//\r
++\r
++using System;\r
++using System.Reflection;\r
++using System.Threading;\r
++using System.Runtime.CompilerServices;\r
++using System.Collections;\r
++\r
++namespace System.Diagnostics {\r
++ /// <summary>\r
++ /// Stack trace.\r
++ /// TODO: more information.\r
++ /// </summary>\r
++ [Serializable]\r
++ public class StackTrace {\r
++ /// <value>\r
++ /// Uses a constant to define the number of methods that are\r
++ /// to be omitted from the stack trace.\r
++ /// </value>\r
++ public const int METHODS_TO_SKIP = 0;\r
++ \r
++ /// <value>\r
++ /// Frames. First frame is the last stack frame pushed.\r
++ /// </value>\r
++ private StackFrame[] frames;\r
++\r
++ /// <summary>\r
++ /// Initializes a new instance of the StackTrace class.\r
++ /// </summary>\r
++ [MonoTODO]\r
++ public StackTrace() {\r
++ init_frames (METHODS_TO_SKIP, false);\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Initializes a new instance of the StackTrace class.\r
++ /// </summary>\r
++ /// <param name="needFileInfo">\r
++ /// TODO:\r
++ /// </param>\r
++ public StackTrace(bool needFileInfo) {\r
++ init_frames (METHODS_TO_SKIP, needFileInfo);\r
++ }\r
++\r
++ /// <summary>\r
++ /// Initializes a new instance of the StackTrace class\r
++ /// from the current location, in a caller's frame.\r
++ /// </summary>\r
++ /// <param name="skipFrames">\r
++ /// The number of frames up the stack to start the trace\r
++ /// from.\r
++ /// </param>\r
++ public StackTrace(int skipFrames) {\r
++ init_frames (skipFrames, false);\r
++ }\r
++\r
++ /// <summary>\r
++ /// Initializes a new instance of the StackTrace class\r
++ /// from the current location, in a caller's frame.\r
++ /// </summary>\r
++ /// <param name="skipFrames">\r
++ /// The number of frames up the stack to start the trace\r
++ /// from.\r
++ /// </param>\r
++ /// <param name="needFileInfo">\r
++ /// TODO:\r
++ /// </param>\r
++ public StackTrace(int skipFrames, bool needFileInfo) {\r
++ init_frames (skipFrames, needFileInfo);\r
++ }\r
++\r
++ void init_frames (int skipFrames, bool needFileInfo)\r
++ {\r
++ StackFrame sf;\r
++ ArrayList al = new ArrayList ();\r
++\r
++ skipFrames += 2;\r
++ \r
++ while ((sf = new StackFrame (skipFrames, needFileInfo)) != null &&\r
++ sf.GetMethod () != null) {\r
++ \r
++ al.Add (sf);\r
++ skipFrames++;\r
++ };\r
++\r
++ frames = (StackFrame [])al.ToArray (typeof (StackFrame));\r
++ }\r
++#if TARGET_JVM\r
++ static StackFrame [] get_trace (Exception e, int skipFrames, bool needFileInfo)\r
++ {\r
++ return null;\r
++ }\r
++#else\r
++ [MethodImplAttribute(MethodImplOptions.InternalCall)]\r
++ extern static StackFrame [] get_trace (Exception e, int skipFrames, bool needFileInfo);\r
++#endif\r
++ /// <summary>\r
++ /// Initializes a new instance of the StackTrace class.\r
++ /// </summary>\r
++ /// <param name="e">\r
++ /// TODO:\r
++ /// </param>\r
++ public StackTrace(Exception e) \r
++ {\r
++ frames = get_trace (e, METHODS_TO_SKIP, false);\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Initializes a new instance of the StackTrace class,\r
++ /// using the provided exception object. The resulting stack\r
++ /// trace describes the stack at the time of the exception.\r
++ /// </summary>\r
++ /// <param name="e">\r
++ /// TODO:\r
++ /// </param>\r
++ /// <param name="needFileInfo">\r
++ /// TODO:\r
++ /// </param>\r
++ public StackTrace(Exception e, bool needFileInfo) {\r
++ frames = get_trace (e, METHODS_TO_SKIP, needFileInfo);\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Initializes a new instance of the StackTrace class,\r
++ /// using the provided exception object. The resulting stack\r
++ /// trace describes the stack at the time of the exception.\r
++ /// </summary>\r
++ /// <param name="e">\r
++ /// Exception.\r
++ /// </param>\r
++ /// <param name="skipFrames">\r
++ /// The number of frames up the stack to start the trace\r
++ /// from.\r
++ /// </param>\r
++ public StackTrace(Exception e, int skipFrames) {\r
++ frames = get_trace (e, skipFrames, false);\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Initializes a new instance of the StackTrace class,\r
++ /// using the provided exception object. The resulting stack\r
++ /// trace describes the stack at the time of the exception.\r
++ /// </summary>\r
++ /// <param name="e">\r
++ /// Exception.\r
++ /// </param>\r
++ /// <param name="skipFrames">\r
++ /// The number of frames up the stack to start the trace\r
++ /// from.\r
++ /// </param>\r
++ /// <param name="needFileInfo">\r
++ /// TODO:\r
++ /// </param>\r
++ public StackTrace(Exception e, int skipFrames, bool needFileInfo) {\r
++ frames = get_trace (e, skipFrames, needFileInfo);\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Initializes a new instance of the StackTrace class\r
++ /// containing a single frame.\r
++ /// </summary>\r
++ /// <param name="frame">\r
++ /// The frame that the StackTrace object should contain.\r
++ /// </param>\r
++ public StackTrace(StackFrame frame) {\r
++ this.frames = new StackFrame[1];\r
++ this.frames[0] = frame;\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Initializes a new instance of the StackTrace class.\r
++ /// </summary>\r
++ /// <param name="targetThread">\r
++ /// TODO:\r
++ /// </param>\r
++ /// <param name="needFileInfo">\r
++ /// TODO:\r
++ /// </param>\r
++ [MonoTODO]\r
++ public StackTrace(Thread targetThread, bool needFileInfo) {\r
++ throw new NotImplementedException();\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Holds the number of frames in the stack trace.\r
++ /// </summary>\r
++ public virtual int FrameCount {\r
++ get {\r
++ return (frames == null) ? 0 : frames.Length;\r
++ }\r
++ } \r
++ \r
++ /// <summary>\r
++ /// Gets the specified stack frame.\r
++ /// </summary>\r
++ /// <param name="index">\r
++ /// The index of the stack frame requested.\r
++ /// </param>\r
++ /// <returns>\r
++ /// The specified stack frame. Returns <code>null</code> if\r
++ /// frame with specified index does not exist in this stack\r
++ /// trace.\r
++ /// </returns>\r
++ /// <remarks>\r
++ /// Stack frames are numbered starting at zero, which is the\r
++ /// last stack frame pushed.\r
++ /// </remarks>\r
++ public virtual StackFrame GetFrame(int index) {\r
++ if ((index < 0) || (index >= FrameCount)) {\r
++ return null;\r
++ }\r
++ \r
++ return frames[index];\r
++ } \r
++ \r
++ /// <summary>\r
++ /// Builds a readable representation of the stack trace.\r
++ /// </summary>\r
++ /// <returns>\r
++ /// A readable representation of the stack trace.\r
++ /// </returns>\r
++ public override string ToString() {\r
++ string result = "";\r
++ for (int i = 0; i < FrameCount; i++) {\r
++ StackFrame frame = GetFrame(i);\r
++ result += "\n\tat " + FrameToString(frame);\r
++ }\r
++ \r
++ return result;\r
++ }\r
++ \r
++ public override bool Equals(Object obj) {\r
++ if ((obj == null) || (!(obj is StackTrace))) {\r
++ return false;\r
++ }\r
++ \r
++ StackTrace rhs = (StackTrace) obj;\r
++ \r
++ if (FrameCount != rhs.FrameCount) {\r
++ return false;\r
++ }\r
++ \r
++ for (int i = 0; i < FrameCount; i++) {\r
++ if (!GetFrame(i).Equals(rhs.GetFrame(i))) {\r
++ return false;\r
++ }\r
++ }\r
++ \r
++ return true;\r
++ }\r
++ \r
++ public override int GetHashCode() {\r
++ return FrameCount;\r
++ }\r
++ \r
++ /// <summary>\r
++ /// Converts single stack frame to string to be used in\r
++ /// ToString method.\r
++ /// </summary>\r
++ /// <param name="frame">\r
++ /// Frame to convert.\r
++ /// </param>\r
++ /// <returns>\r
++ /// A readable representation of stack frame for using\r
++ /// ToString.\r
++ /// </returns>\r
++ private static String FrameToString(StackFrame frame) {\r
++ MethodBase method = frame.GetMethod();\r
++ if (method != null) {\r
++ // Method information available\r
++ return method.DeclaringType.FullName\r
++ + "." + method.Name + "()";\r
++ } else {\r
++ // Method information not available\r
++ return "<unknown method>";\r
++ }\r
++ }\r
++ }\r
++}\r
+++ /dev/null
--using System;\r
--using System.Net;\r
--\r
--namespace System.Net.Sockets\r
--{\r
-- /// <summary>\r
-- /// Summary description for GHSocket.\r
-- /// </summary>\r
-- internal interface GHSocket\r
-- {\r
-- int Available_internal(out int error);\r
--\r
-- void Blocking_internal(bool block, out int error);\r
--\r
-- EndPoint LocalEndPoint_internal(out int error);\r
--\r
-- EndPoint RemoteEndPoint_internal(out int error);\r
--\r
-- GHSocket Accept_internal(out int error);\r
--\r
-- void Bind_internal(EndPoint sa, out int error);\r
--\r
-- void Close_internal(out int error);\r
--\r
-- void Connect_internal(EndPoint sa, out int error);\r
--\r
-- void GetSocketOption_obj_internal(SocketOptionLevel level, SocketOptionName name, \r
-- out object obj_val, out int error);\r
-- \r
-- void GetSocketOption_arr_internal(SocketOptionLevel level, SocketOptionName name, \r
-- ref byte[] byte_val, out int error);\r
--\r
-- int WSAIoctl (int ioctl_code, byte [] input, byte [] output, out int error);\r
--\r
-- void Listen_internal(int backlog, out int error);\r
--\r
-- bool Poll_internal (SelectMode mode, int timeout, Socket source, out int error);\r
--\r
-- int Receive_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
-- out int error);\r
--\r
-- int RecvFrom_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
-- ref SocketAddress sockaddr, out int error);\r
--\r
-- int Send_internal(byte[] buf, int offset, int count, SocketFlags flags,\r
-- out int error);\r
--\r
-- int SendTo_internal(byte[] buffer, int offset, int count,\r
-- SocketFlags flags, SocketAddress sa, out int error);\r
--\r
-- void SetSocketOption_internal (SocketOptionLevel level,\r
-- SocketOptionName name, object obj_val,\r
-- byte [] byte_val, int int_val, out int error);\r
--\r
-- void Shutdown_internal(SocketShutdown how, out int error);\r
--\r
-- void RegisterSelector(java.nio.channels.Selector selector, int mode, Socket source, out int error);\r
--\r
-- bool CheckConnectionFinished();\r
--\r
-- GHSocket ChangeToSSL(EndPoint remote_end);\r
-- }\r
--}\r
--- /dev/null
--- /dev/null
++using System;\r
++using System.Net;\r
++\r
++namespace System.Net.Sockets\r
++{\r
++ /// <summary>\r
++ /// Summary description for GHSocket.\r
++ /// </summary>\r
++ internal interface GHSocket\r
++ {\r
++ int Available_internal(out int error);\r
++\r
++ void Blocking_internal(bool block, out int error);\r
++\r
++ EndPoint LocalEndPoint_internal(out int error);\r
++\r
++ EndPoint RemoteEndPoint_internal(out int error);\r
++\r
++ GHSocket Accept_internal(out int error);\r
++\r
++ void Bind_internal(EndPoint sa, out int error);\r
++\r
++ void Close_internal(out int error);\r
++\r
++ void Connect_internal(EndPoint sa, out int error);\r
++\r
++ void GetSocketOption_obj_internal(SocketOptionLevel level, SocketOptionName name, \r
++ out object obj_val, out int error);\r
++ \r
++ void GetSocketOption_arr_internal(SocketOptionLevel level, SocketOptionName name, \r
++ ref byte[] byte_val, out int error);\r
++\r
++ int WSAIoctl (int ioctl_code, byte [] input, byte [] output, out int error);\r
++\r
++ void Listen_internal(int backlog, out int error);\r
++\r
++ bool Poll_internal (SelectMode mode, int timeout, Socket source, out int error);\r
++\r
++ int Receive_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
++ out int error);\r
++\r
++ int RecvFrom_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
++ ref SocketAddress sockaddr, out int error);\r
++\r
++ int Send_internal(byte[] buf, int offset, int count, SocketFlags flags,\r
++ out int error);\r
++\r
++ int SendTo_internal(byte[] buffer, int offset, int count,\r
++ SocketFlags flags, SocketAddress sa, out int error);\r
++\r
++ void SetSocketOption_internal (SocketOptionLevel level,\r
++ SocketOptionName name, object obj_val,\r
++ byte [] byte_val, int int_val, out int error);\r
++\r
++ void Shutdown_internal(SocketShutdown how, out int error);\r
++\r
++ void RegisterSelector(java.nio.channels.Selector selector, int mode, Socket source, out int error);\r
++\r
++ bool CheckConnectionFinished();\r
++\r
++ GHSocket ChangeToSSL(EndPoint remote_end);\r
++ }\r
++}\r
+++ /dev/null
--using System;\r
--using System.Net;\r
--\r
--namespace System.Net.Sockets\r
--{\r
-- /// <summary>\r
-- /// Summary description for GHSocketFactory.\r
-- /// </summary>\r
-- public class GHSocketFactory\r
-- {\r
-- internal static GHSocket Socket_internal(AddressFamily family,\r
-- SocketType type,\r
-- ProtocolType proto,\r
-- out int error)\r
-- {\r
-- if ( family == AddressFamily.InterNetwork &&\r
-- //(family == AddressFamily.InterNetwork || family == AddressFamily.InterNetworkV6) &&\r
-- (type == SocketType.Stream || type == SocketType.Unknown) &&\r
-- (proto == ProtocolType.Tcp || proto == ProtocolType.Unknown || proto == ProtocolType.Unspecified) )\r
-- {\r
-- error = 0;\r
-- return new GHStreamSocket();\r
-- }\r
--\r
-- error = 10044; //WSAESOCKTNOSUPPORT (Socket type not supported)\r
-- return null;\r
-- }\r
--\r
-- internal static void Select_internal (ref Socket [] sockets, int microSeconds, out int error)\r
-- {\r
-- error = 0;\r
--\r
-- java.nio.channels.Selector selector = java.nio.channels.Selector.open();\r
--\r
-- int mode = 0;\r
-- int count = sockets.Length;\r
-- for (int i = 0; i < count; i++) \r
-- {\r
-- if (sockets [i] == null) \r
-- { // separator\r
-- mode++;\r
-- continue;\r
-- }\r
--\r
-- GHSocket sock = sockets [i].GHHandle;\r
-- if (sock == null)\r
-- {\r
-- throw new ArgumentNullException ("GHSocket handle is null");\r
-- }\r
--\r
-- sock.RegisterSelector(selector, mode, sockets [i], out error);\r
-- if (error != 0)\r
-- {\r
-- error = 0;\r
-- sockets = null;\r
-- CloseSelector(selector);\r
-- return;\r
-- }\r
-- }\r
-- \r
-- sockets = null;\r
--\r
-- long timeOutMillis = 1;\r
-- if (microSeconds < 0)\r
-- {\r
-- timeOutMillis = 0;\r
-- } \r
-- else if (microSeconds > 999)\r
-- {\r
-- timeOutMillis = (long)(microSeconds / 1000);\r
-- }\r
--\r
-- int readyCount = 0;\r
-- try\r
-- {\r
-- readyCount = selector.select(timeOutMillis);\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Select_internal selector.select - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- if (readyCount > 0)\r
-- {\r
-- try\r
-- {\r
-- sockets = new Socket[readyCount+2];\r
-- Socket[] writeList = new Socket[readyCount];\r
-- Socket[] errorList = new Socket[readyCount];\r
--\r
-- int readListCount = 0;\r
-- int writeListCount = 0;\r
-- int errorListCount = 0;\r
--\r
-- java.util.Set readyKeys = selector.selectedKeys();\r
-- java.util.Iterator it = readyKeys.iterator();\r
--\r
-- while (it.hasNext()) \r
-- {\r
-- java.nio.channels.SelectionKey key = (java.nio.channels.SelectionKey)it.next();\r
-- \r
-- if (key.isAcceptable() || key.isReadable()) \r
-- {\r
-- sockets[readListCount] = (Socket)key.attachment();\r
-- readListCount++;\r
-- }\r
-- if (key.isWritable()) \r
-- {\r
-- writeList[writeListCount] = (Socket)key.attachment();\r
-- writeListCount++;\r
-- }\r
-- if (key.isConnectable()) \r
-- {\r
-- Socket source = (Socket)key.attachment();\r
-- if (source.GHHandle.CheckConnectionFinished())\r
-- {\r
-- writeList[writeListCount] = source;\r
-- writeListCount++;\r
-- }\r
-- else\r
-- {\r
-- errorList[errorListCount] = source;\r
-- errorListCount++;\r
-- }\r
-- }\r
-- }\r
--\r
-- sockets[readListCount] = null;\r
-- readListCount++;\r
-- for (int i = 0; i < writeListCount; i++, readListCount++)\r
-- {\r
-- sockets[readListCount] = writeList[i];\r
-- }\r
-- sockets[readListCount] = null;\r
-- readListCount++;\r
-- for (int i = 0; i < errorListCount; i++, readListCount++)\r
-- {\r
-- sockets[readListCount] = errorList[i];\r
-- }\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Select_internal iterate selected keys - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
--\r
-- CloseSelector(selector);\r
-- }\r
--\r
-- internal static void CloseSelector (java.nio.channels.Selector selector)\r
-- {\r
-- java.util.Set keys = selector.keys();\r
-- java.util.Iterator it = keys.iterator();\r
--\r
-- try\r
-- {\r
-- selector.close();\r
-- }\r
-- catch (Exception e)\r
-- {\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during CloseSelector selector.close - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- while (it.hasNext()) \r
-- {\r
-- java.nio.channels.SelectionKey key = (java.nio.channels.SelectionKey)it.next();\r
-- Socket source = (Socket)key.attachment();\r
-- try\r
-- {\r
-- if (source.Blocking)\r
-- {\r
-- /*\r
-- A channel must be placed into non-blocking mode before being registered \r
-- with a selector, and may not be returned to blocking mode until it has been \r
-- deregistered. So, I need set the channel back to the blocking mode, if it was\r
-- in blocking mode before select operation\r
-- */\r
-- source.Blocking = true;\r
-- }\r
-- }\r
-- catch (Exception be)\r
-- {\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during CloseSelector source.Blocking - {0}: {1}\n{2}", be.GetType(), be.Message, be.StackTrace);\r
--#endif\r
-- }\r
-- }\r
-- }\r
-- }\r
--}\r
--- /dev/null
--- /dev/null
++using System;\r
++using System.Net;\r
++\r
++namespace System.Net.Sockets\r
++{\r
++ /// <summary>\r
++ /// Summary description for GHSocketFactory.\r
++ /// </summary>\r
++ public class GHSocketFactory\r
++ {\r
++ internal static GHSocket Socket_internal(AddressFamily family,\r
++ SocketType type,\r
++ ProtocolType proto,\r
++ out int error)\r
++ {\r
++ if ( family == AddressFamily.InterNetwork &&\r
++ //(family == AddressFamily.InterNetwork || family == AddressFamily.InterNetworkV6) &&\r
++ (type == SocketType.Stream || type == SocketType.Unknown) &&\r
++ (proto == ProtocolType.Tcp || proto == ProtocolType.Unknown || proto == ProtocolType.Unspecified) )\r
++ {\r
++ error = 0;\r
++ return new GHStreamSocket();\r
++ }\r
++\r
++ error = 10044; //WSAESOCKTNOSUPPORT (Socket type not supported)\r
++ return null;\r
++ }\r
++\r
++ internal static void Select_internal (ref Socket [] sockets, int microSeconds, out int error)\r
++ {\r
++ error = 0;\r
++\r
++ java.nio.channels.Selector selector = java.nio.channels.Selector.open();\r
++\r
++ int mode = 0;\r
++ int count = sockets.Length;\r
++ for (int i = 0; i < count; i++) \r
++ {\r
++ if (sockets [i] == null) \r
++ { // separator\r
++ mode++;\r
++ continue;\r
++ }\r
++\r
++ GHSocket sock = sockets [i].GHHandle;\r
++ if (sock == null)\r
++ {\r
++ throw new ArgumentNullException ("GHSocket handle is null");\r
++ }\r
++\r
++ sock.RegisterSelector(selector, mode, sockets [i], out error);\r
++ if (error != 0)\r
++ {\r
++ error = 0;\r
++ sockets = null;\r
++ CloseSelector(selector);\r
++ return;\r
++ }\r
++ }\r
++ \r
++ sockets = null;\r
++\r
++ long timeOutMillis = 1;\r
++ if (microSeconds < 0)\r
++ {\r
++ timeOutMillis = 0;\r
++ } \r
++ else if (microSeconds > 999)\r
++ {\r
++ timeOutMillis = (long)(microSeconds / 1000);\r
++ }\r
++\r
++ int readyCount = 0;\r
++ try\r
++ {\r
++ readyCount = selector.select(timeOutMillis);\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Select_internal selector.select - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ if (readyCount > 0)\r
++ {\r
++ try\r
++ {\r
++ sockets = new Socket[readyCount+2];\r
++ Socket[] writeList = new Socket[readyCount];\r
++ Socket[] errorList = new Socket[readyCount];\r
++\r
++ int readListCount = 0;\r
++ int writeListCount = 0;\r
++ int errorListCount = 0;\r
++\r
++ java.util.Set readyKeys = selector.selectedKeys();\r
++ java.util.Iterator it = readyKeys.iterator();\r
++\r
++ while (it.hasNext()) \r
++ {\r
++ java.nio.channels.SelectionKey key = (java.nio.channels.SelectionKey)it.next();\r
++ \r
++ if (key.isAcceptable() || key.isReadable()) \r
++ {\r
++ sockets[readListCount] = (Socket)key.attachment();\r
++ readListCount++;\r
++ }\r
++ if (key.isWritable()) \r
++ {\r
++ writeList[writeListCount] = (Socket)key.attachment();\r
++ writeListCount++;\r
++ }\r
++ if (key.isConnectable()) \r
++ {\r
++ Socket source = (Socket)key.attachment();\r
++ if (source.GHHandle.CheckConnectionFinished())\r
++ {\r
++ writeList[writeListCount] = source;\r
++ writeListCount++;\r
++ }\r
++ else\r
++ {\r
++ errorList[errorListCount] = source;\r
++ errorListCount++;\r
++ }\r
++ }\r
++ }\r
++\r
++ sockets[readListCount] = null;\r
++ readListCount++;\r
++ for (int i = 0; i < writeListCount; i++, readListCount++)\r
++ {\r
++ sockets[readListCount] = writeList[i];\r
++ }\r
++ sockets[readListCount] = null;\r
++ readListCount++;\r
++ for (int i = 0; i < errorListCount; i++, readListCount++)\r
++ {\r
++ sockets[readListCount] = errorList[i];\r
++ }\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Select_internal iterate selected keys - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++\r
++ CloseSelector(selector);\r
++ }\r
++\r
++ internal static void CloseSelector (java.nio.channels.Selector selector)\r
++ {\r
++ java.util.Set keys = selector.keys();\r
++ java.util.Iterator it = keys.iterator();\r
++\r
++ try\r
++ {\r
++ selector.close();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during CloseSelector selector.close - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ while (it.hasNext()) \r
++ {\r
++ java.nio.channels.SelectionKey key = (java.nio.channels.SelectionKey)it.next();\r
++ Socket source = (Socket)key.attachment();\r
++ try\r
++ {\r
++ if (source.Blocking)\r
++ {\r
++ /*\r
++ A channel must be placed into non-blocking mode before being registered \r
++ with a selector, and may not be returned to blocking mode until it has been \r
++ deregistered. So, I need set the channel back to the blocking mode, if it was\r
++ in blocking mode before select operation\r
++ */\r
++ source.Blocking = true;\r
++ }\r
++ }\r
++ catch (Exception be)\r
++ {\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during CloseSelector source.Blocking - {0}: {1}\n{2}", be.GetType(), be.Message, be.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++ }\r
++ }\r
++}\r
+++ /dev/null
--using System;\r
--using System.Net;\r
--using javax.net;\r
--using javax.net.ssl;\r
--using java.security;\r
--\r
--namespace System.Net.Sockets\r
--{\r
-- /// <summary>\r
-- /// Summary description for GHStreamSocket.\r
-- /// </summary>\r
-- internal class GHStreamSocket : GHSocket\r
-- {\r
-- java.net.ServerSocket jServerSocket;\r
-- java.net.Socket jSocket;\r
-- java.nio.channels.ServerSocketChannel jServerSocketChannel;\r
-- java.nio.channels.SocketChannel jSocketChannel;\r
--\r
-- // This field I need because a bug in the java.nio.channels.SocketAdapter, which \r
-- // returns local port 0 if the socket is not connected (even if the socket is bound)\r
-- // so I need temporary use regular socket (not channel socket) to bind it to the \r
-- // local address and use this address in the LocalPoint property and to create the \r
-- // actual client/server channel sockets\r
-- // The bug #5076965 (SocketChannel does not report local address after binding to a wildcard )\r
-- // See: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5076965\r
-- java.net.InetSocketAddress jTempLocalSocketAddress;\r
--\r
-- public GHStreamSocket()\r
-- {\r
-- jSocketChannel = java.nio.channels.SocketChannel.open();\r
-- jSocket = jSocketChannel.socket();\r
-- }\r
--\r
-- public GHStreamSocket(java.nio.channels.SocketChannel socketChannel)\r
-- {\r
-- jSocketChannel = socketChannel;\r
-- jSocket = jSocketChannel.socket();\r
-- }\r
--\r
-- public override int GetHashCode ()\r
-- {\r
-- if (jSocket == null && jServerSocket == null)\r
-- return -1;\r
--\r
-- if (jServerSocket != null) {\r
-- return jServerSocket.ToString ().GetHashCode ();\r
-- }\r
--\r
-- return jSocket.ToString ().GetHashCode ();\r
-- }\r
--\r
-- public int Available_internal(out int error)\r
-- {\r
-- error = 0;\r
-- int r = 0;\r
--\r
-- if (jSocket == null || !jSocket.isConnected())\r
-- {\r
-- return r;\r
-- }\r
--\r
-- try\r
-- {\r
-- r = jSocket.getInputStream().available();\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10054; //WSAECONNRESET (Connection reset by peer)\r
-- r = 0;\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Available_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- return r;\r
-- }\r
--\r
-- public void Blocking_internal(bool block, out int error)\r
-- {\r
-- error = 0;\r
--\r
-- if (jSocket == null && jServerSocket == null)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
--\r
-- try\r
-- {\r
-- if (jServerSocket != null)\r
-- {\r
-- jServerSocketChannel.configureBlocking(block);\r
-- }\r
-- else\r
-- {\r
-- jSocketChannel.configureBlocking(block);\r
-- }\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Blocking_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
--\r
-- public EndPoint LocalEndPoint_internal(out int error)\r
-- {\r
-- error = 0;\r
-- java.net.InetSocketAddress localAddr = null;\r
--\r
-- try\r
-- {\r
-- if (jTempLocalSocketAddress != null)\r
-- {\r
-- localAddr = jTempLocalSocketAddress;\r
-- }\r
-- else if (jServerSocket != null)\r
-- {\r
-- localAddr = (java.net.InetSocketAddress)jServerSocket.getLocalSocketAddress();\r
-- }\r
-- else\r
-- {\r
-- localAddr = (java.net.InetSocketAddress)jSocket.getLocalSocketAddress();\r
-- }\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- localAddr = null;\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during LocalEndPoint_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- if (localAddr == null || localAddr.getAddress() == null || localAddr.getPort() < 0)\r
-- {\r
-- return null;\r
-- }\r
--\r
-- IPHostEntry lipa = Dns.Resolve(localAddr.getHostName());\r
-- IPEndPoint ret = new IPEndPoint(lipa.AddressList[0], localAddr.getPort());\r
-- return ret;\r
-- }\r
--\r
-- public EndPoint RemoteEndPoint_internal(out int error)\r
-- {\r
-- error = 0;\r
-- java.net.InetSocketAddress remoteAddr = null;\r
--\r
-- if (jSocket == null || !jSocket.isBound())\r
-- {\r
-- return null;\r
-- }\r
--\r
-- try\r
-- {\r
-- remoteAddr = (java.net.InetSocketAddress)jSocket.getRemoteSocketAddress();\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- remoteAddr = null;\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during RemoteEndPoint_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- if (remoteAddr == null || remoteAddr.getAddress() == null || remoteAddr.getPort() <= 0)\r
-- {\r
-- error = 10057; //WSAENOTCONN (Socket is not connected)\r
-- return null;\r
-- }\r
--\r
-- IPHostEntry lipa = Dns.Resolve(remoteAddr.getHostName());\r
-- IPEndPoint ret = new IPEndPoint(lipa.AddressList[0], remoteAddr.getPort());\r
-- return ret;\r
-- }\r
--\r
-- public GHSocket Accept_internal(out int error)\r
-- {\r
-- error = 0;\r
--\r
-- if (jServerSocket == null)\r
-- {\r
-- throw new InvalidOperationException("You must call Bind and Listen before calling Accept.");\r
-- }\r
--\r
-- try\r
-- {\r
-- /*\r
-- If this channel is in non-blocking mode then this method will immediately \r
-- return null if there are no pending connections. \r
-- Otherwise it will block indefinitely until a new connection is \r
-- available or an I/O error occurs. \r
-- */\r
-- java.nio.channels.SocketChannel acceptedSocket = jServerSocketChannel.accept();\r
-- if (acceptedSocket == null) \r
-- {\r
-- error = 10035; //WSAEWOULDBLOCK (Resource temporarily unavailable)\r
--#if DEBUG\r
-- Console.WriteLine("The Accept_internal is in non-blocking mode and no pending connections are available");\r
--#endif\r
-- return null;\r
-- }\r
--\r
-- return new GHStreamSocket(acceptedSocket);\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10061; //WSAECONNREFUSED (Connection refused)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Accept_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- return null;\r
-- }\r
--\r
-- public void Bind_internal(EndPoint sa, out int error)\r
-- {\r
-- error = 0;\r
-- IPEndPoint addr = sa as IPEndPoint;\r
-- if (addr == null)\r
-- {\r
-- error = 10044; //WSAESOCKTNOSUPPORT (Socket type not supported)\r
-- return;\r
-- }\r
--\r
-- if (jSocket == null || jSocket.isBound() || jSocket.isConnected() || jSocketChannel.isConnectionPending())\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
--\r
-- try\r
-- {\r
-- // This code I need because a bug in the java.nio.channels.SocketAdapter, which \r
-- // returns local port 0 if the socket is not connected (even if the socket is bound)\r
-- // so I need temporary use regular socket (not channel socket) to bind it to the \r
-- // local address and use this address in the LocalPoint property and to create the \r
-- // actual client/server channel sockets\r
-- // The bug #5076965 (SocketChannel does not report local address after binding to a wildcard )\r
-- // See: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5076965\r
-- java.net.Socket jTempSocket = new java.net.Socket();\r
-- jTempSocket.bind(new java.net.InetSocketAddress(java.net.InetAddress.getByName(addr.Address.ToString()),\r
-- addr.Port));\r
-- jTempLocalSocketAddress = (java.net.InetSocketAddress)jTempSocket.getLocalSocketAddress();\r
-- jTempSocket.close();\r
-- jSocket.bind(jTempLocalSocketAddress);\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10048; //WSAEADDRINUSE (Address already in use)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Bind_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
--\r
-- public void Close_internal(out int error)\r
-- {\r
-- error = 0;\r
--\r
-- if (jServerSocket != null)\r
-- {\r
-- try\r
-- {\r
-- jServerSocket.close();\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Close_internal jServerSocket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- try\r
-- {\r
-- jServerSocketChannel.close();\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Close_internal jServerSocketChannel - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- jServerSocket = null;\r
-- jServerSocketChannel = null;\r
-- }\r
-- else if (jSocket != null)\r
-- {\r
-- try\r
-- {\r
-- jSocket.close();\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Close_internal jSocket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- try\r
-- {\r
-- jSocketChannel.close();\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Close_internal jSocketChannel - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- jSocket = null;\r
-- jSocketChannel = null;\r
-- }\r
-- }\r
--\r
-- public void Connect_internal(EndPoint sa, out int error)\r
-- {\r
-- error = 0;\r
--\r
-- IPEndPoint addr = sa as IPEndPoint;\r
-- if (addr == null)\r
-- {\r
-- error = 10044; //WSAESOCKTNOSUPPORT (Socket type not supported)\r
-- return;\r
-- }\r
--\r
-- if (jSocket == null)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
--\r
-- if (jSocket.isConnected() || jSocketChannel.isConnectionPending())\r
-- {\r
-- error = 10056; //WSAEISCONN (Socket is already connected)\r
-- return;\r
-- }\r
--\r
-- try\r
-- {\r
-- /*\r
-- If this channel is in non-blocking mode then an invocation of this method\r
-- initiates a non-blocking connection operation. If the connection is \r
-- established immediately, as can happen with a local connection, then this \r
-- method returns true. Otherwise this method returns false. \r
-- If this channel is in blocking mode then an invocation of this method \r
-- will block until the connection is established or an I/O error occurs. \r
-- */\r
-- bool status = jSocketChannel.connect(new java.net.InetSocketAddress(\r
-- java.net.InetAddress.getByName(addr.Address.ToString()), \r
-- addr.Port));\r
-- if (!status)\r
-- {\r
-- error = 10035; //WSAEWOULDBLOCK (Resource temporarily unavailable)\r
-- }\r
-- }\r
-- catch (java.nio.channels.AlreadyConnectedException ae)\r
-- { \r
-- error = 10056; //WSAEISCONN (Socket is already connected)\r
-- }\r
-- catch (java.nio.channels.ConnectionPendingException cpe)\r
-- { \r
-- error = 10036; //WSAEINPROGRESS (Operation now in progress)\r
-- }\r
-- catch (java.nio.channels.UnresolvedAddressException uae)\r
-- { \r
-- error = 10039; //WSAEDESTADDRREQ (Destination address required)\r
-- }\r
-- catch (java.nio.channels.UnsupportedAddressTypeException uate)\r
-- { \r
-- error = 10041; //WSAEPROTOTYPE (Protocol wrong type for socket)\r
-- }\r
-- catch (Exception e)\r
-- { \r
-- error = 10061; //WSAECONNREFUSED (Connection refused)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Connect_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
--\r
-- public void Listen_internal(int backlog, out int error)\r
-- {\r
-- error = 0;\r
--\r
-- if (jSocket == null || !jSocket.isBound())\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
--\r
-- if (jSocket.isConnected() || jSocketChannel.isConnectionPending())\r
-- {\r
-- error = 10056; //WSAEISCONN (Socket is already connected)\r
-- return;\r
-- }\r
--\r
-- bool blockMode = jSocketChannel.isBlocking();\r
-- bool reuseAddr = jSocket.getReuseAddress();\r
--\r
-- try\r
-- {\r
-- jSocket.close();\r
-- }\r
-- catch (Exception e)\r
-- {\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Listen_internal close old jSocket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- try\r
-- {\r
-- jSocketChannel.close();\r
-- }\r
-- catch (Exception e)\r
-- {\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Listen_internal close old jSocketChannel - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- jSocket = null;\r
-- jSocketChannel = null;\r
--\r
-- try\r
-- {\r
-- jServerSocketChannel = java.nio.channels.ServerSocketChannel.open();\r
-- jServerSocket = jServerSocketChannel.socket();\r
-- jServerSocket.bind(jTempLocalSocketAddress, backlog);\r
-- jServerSocketChannel.configureBlocking(blockMode);\r
-- jServerSocket.setReuseAddress(reuseAddr);\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10048; //WSAEADDRINUSE (Address already in use)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Listen_internal create server socket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
--\r
-- public bool Poll_internal (SelectMode mode, int timeout, Socket source, out int error)\r
-- {\r
-- error = 0;\r
--\r
-- if (mode == SelectMode.SelectError && !jSocketChannel.isConnectionPending())\r
-- {\r
-- return false;\r
-- }\r
--\r
-- java.nio.channels.Selector selector = java.nio.channels.Selector.open();\r
-- RegisterSelector(selector, ((mode == SelectMode.SelectRead)?0:1), source, out error);\r
--\r
-- if (error != 0)\r
-- {\r
-- error = 0;\r
-- GHSocketFactory.CloseSelector(selector);\r
-- return (mode == SelectMode.SelectError);\r
-- }\r
--\r
-- bool retVal = false;\r
--\r
-- long timeOutMillis = 1;\r
-- if (timeout < 0)\r
-- {\r
-- timeOutMillis = 0;\r
-- } \r
-- else if (timeout > 999)\r
-- {\r
-- timeOutMillis = (long)(timeout / 1000);\r
-- }\r
--\r
-- int readyCount = 0;\r
-- try\r
-- {\r
-- readyCount = selector.select(timeOutMillis);\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Poll_internal selector.select - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- if (readyCount > 0)\r
-- {\r
-- if (jSocket != null && jSocketChannel.isConnectionPending())\r
-- {\r
-- bool status = false;\r
-- try\r
-- {\r
-- status = jSocketChannel.finishConnect();\r
-- }\r
-- catch (Exception e)\r
-- {\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Poll_internal, finishConnect - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- if (status)\r
-- {\r
-- retVal = (mode != SelectMode.SelectError);\r
-- }\r
-- else \r
-- {\r
-- retVal = (mode == SelectMode.SelectError);\r
-- }\r
-- }\r
-- else\r
-- {\r
-- retVal = true;\r
-- }\r
-- }\r
--\r
-- GHSocketFactory.CloseSelector(selector);\r
--\r
-- return retVal;\r
-- }\r
--\r
-- public void RegisterSelector(java.nio.channels.Selector selector, int mode, Socket source, out int error)\r
-- {\r
-- error = 0;\r
-- if (jServerSocket != null)\r
-- {\r
-- // only accept operation, which included to the read list, is allowed for server sockets\r
-- if (mode != 0)\r
-- {\r
--// error = 10038; //WSAENOTSOCK (Socket operation on nonsocket)\r
--#if DEBUG\r
-- Console.WriteLine("RegisterSelector, invalid mode {0} for the server socket", mode);\r
--#endif\r
-- return;\r
-- }\r
--\r
-- try\r
-- {\r
-- if (jServerSocketChannel.isBlocking())\r
-- {\r
-- /*\r
-- A channel must be placed into non-blocking mode before being registered \r
-- with a selector, and may not be returned to blocking mode until it has been \r
-- deregistered. \r
-- */\r
-- jServerSocketChannel.configureBlocking(false);\r
-- }\r
--\r
-- jServerSocketChannel.register(selector, java.nio.channels.SelectionKey.OP_ACCEPT, source);\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during RegisterSelector, register server socket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
-- else\r
-- {\r
-- try\r
-- {\r
-- int ops = java.nio.channels.SelectionKey.OP_READ;\r
-- if (mode > 0)\r
-- {\r
-- if (jSocketChannel.isConnectionPending())\r
-- {\r
-- ops = java.nio.channels.SelectionKey.OP_CONNECT;\r
-- }\r
-- else\r
-- {\r
-- ops = java.nio.channels.SelectionKey.OP_WRITE;\r
-- }\r
-- }\r
-- \r
-- if (jSocketChannel.isBlocking())\r
-- {\r
-- /*\r
-- A channel must be placed into non-blocking mode before being registered \r
-- with a selector, and may not be returned to blocking mode until it has been \r
-- deregistered. \r
-- */\r
-- jSocketChannel.configureBlocking(false);\r
-- }\r
--\r
-- jSocketChannel.register(selector, ops, source);\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during RegisterSelector, register client socket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
-- }\r
--\r
-- public bool CheckConnectionFinished()\r
-- {\r
-- bool status = true;\r
-- if (jSocket != null && jSocketChannel.isConnectionPending())\r
-- {\r
-- try\r
-- {\r
-- status = jSocketChannel.finishConnect();\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- status = false;\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Poll_internal, finishConnect - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
--\r
-- return status;\r
-- }\r
--\r
-- public int Receive_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
-- out int error)\r
-- {\r
-- error = 0;\r
-- int ret = 0;\r
--\r
-- if (jSocket == null)\r
-- {\r
-- error = 10057; //WSAENOTCONN (Socket is not connected)\r
-- return ret;\r
-- }\r
--\r
-- try\r
-- {\r
-- if (jSocketChannel.isConnectionPending())\r
-- {\r
-- bool status = jSocketChannel.finishConnect();\r
-- if (!status)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Receive_internal, jSocketChannel.finishConnect return false");\r
--#endif\r
-- return 0;\r
-- }\r
-- }\r
-- else if (!jSocketChannel.isConnected())\r
-- {\r
-- error = 10057; //WSAENOTCONN (Socket is not connected)\r
-- return ret;\r
-- }\r
--\r
-- java.nio.ByteBuffer readBuff = java.nio.ByteBuffer.wrap(vmw.common.TypeUtils.ToSByteArray(buffer), offset, count);\r
-- ret = jSocketChannel.read(readBuff);\r
-- if (ret < 0) ret = 0;\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10054; //WSAECONNRESET (Connection reset by peer)\r
-- ret = 0;\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Receive_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- if (ret == 0 && !jSocketChannel.isBlocking())\r
-- {\r
-- error = 10035; //WSAEWOULDBLOCK (Resource temporarily unavailable)\r
-- }\r
-- return ret;\r
-- }\r
--\r
-- public int RecvFrom_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
-- ref SocketAddress sockaddr, out int error)\r
-- {\r
-- return Receive_internal(buffer, offset, count, flags, out error);\r
-- }\r
--\r
-- public int Send_internal(byte[] buf, int offset, int count, SocketFlags flags,\r
-- out int error)\r
-- {\r
-- error = 0;\r
-- int ret = 0;\r
--\r
-- if (jSocket == null)\r
-- {\r
-- error = 10057; //WSAENOTCONN (Socket is not connected)\r
-- return ret;\r
-- }\r
--\r
-- try\r
-- {\r
-- if (jSocketChannel.isConnectionPending())\r
-- {\r
-- bool status = jSocketChannel.finishConnect();\r
-- if (!status)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Send_internal, jSocketChannel.finishConnect return false");\r
--#endif\r
-- return 0;\r
-- }\r
-- }\r
-- else if (!jSocketChannel.isConnected())\r
-- {\r
-- error = 10057; //WSAENOTCONN (Socket is not connected)\r
-- return ret;\r
-- }\r
--\r
-- java.nio.ByteBuffer writeBuff = java.nio.ByteBuffer.wrap(vmw.common.TypeUtils.ToSByteArray(buf), offset, count);\r
-- ret = jSocketChannel.write(writeBuff);\r
-- if (ret < 0) ret = 0;\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10054; //WSAECONNRESET (Connection reset by peer)\r
-- ret = 0;\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Send_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- if (ret == 0 && !jSocketChannel.isBlocking())\r
-- {\r
-- error = 10035; //WSAEWOULDBLOCK (Resource temporarily unavailable)\r
-- }\r
-- return ret;\r
-- }\r
--\r
-- public int SendTo_internal(byte[] buffer, int offset, int count,\r
-- SocketFlags flags, SocketAddress sa, out int error)\r
-- {\r
-- return Send_internal(buffer, offset, count, flags, out error);\r
-- }\r
--\r
-- public void SetSocketOption_internal (SocketOptionLevel level,\r
-- SocketOptionName name, object obj_val,\r
-- byte [] byte_val, int int_val, out int error)\r
-- {\r
-- error = 0;\r
--\r
-- if (byte_val != null)\r
-- {\r
-- error = -1;\r
-- throw new NotImplementedException();\r
-- }\r
--\r
-- if (jSocket == null && jServerSocket == null)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
--\r
-- switch (level)\r
-- {\r
-- case SocketOptionLevel.IPv6:\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- return;\r
-- case SocketOptionLevel.IP:\r
-- if (name != SocketOptionName.NoDelay)\r
-- {\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- return;\r
-- }\r
-- break;\r
-- case SocketOptionLevel.Udp:\r
-- if (name == SocketOptionName.NoDelay)\r
-- {\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- }\r
-- else\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- }\r
-- return;\r
-- case SocketOptionLevel.Tcp:\r
-- if (name != SocketOptionName.NoDelay)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
-- break;\r
-- }\r
--\r
-- try\r
-- {\r
-- bool bval = false;\r
-- int ival = 0;\r
-- switch (name)\r
-- {\r
-- case SocketOptionName.DontLinger:\r
-- jSocket.setSoLinger(false, 0);\r
-- break;\r
-- case SocketOptionName.Linger:\r
-- LingerOption lval = obj_val as LingerOption;\r
-- if (lval != null)\r
-- {\r
-- jSocket.setSoLinger(lval.Enabled, lval.LingerTime);\r
-- }\r
-- else\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- }\r
-- break;\r
-- case SocketOptionName.KeepAlive:\r
-- if (obj_val != null)\r
-- {\r
-- bval = ((int)obj_val == 0)?false:true;\r
-- }\r
-- else\r
-- {\r
-- bval = (int_val == 0)?false:true;\r
-- }\r
-- jSocket.setKeepAlive(bval);\r
-- break;\r
-- case SocketOptionName.NoDelay:\r
-- if (obj_val != null)\r
-- {\r
-- bval = ((int)obj_val == 0)?false:true;\r
-- }\r
-- else\r
-- {\r
-- bval = (int_val == 0)?false:true;\r
-- }\r
-- jSocket.setTcpNoDelay(bval);\r
-- break;\r
-- case SocketOptionName.ReceiveBuffer:\r
-- ival = int_val;\r
-- if (obj_val != null)\r
-- {\r
-- ival = (int) obj_val;\r
-- }\r
-- if (jServerSocket != null)\r
-- {\r
-- jServerSocket.setReceiveBufferSize(ival);\r
-- }\r
-- else\r
-- {\r
-- jSocket.setReceiveBufferSize(ival);\r
-- }\r
-- break;\r
-- case SocketOptionName.ReceiveTimeout:\r
-- ival = int_val;\r
-- if (obj_val != null)\r
-- {\r
-- ival = (int) obj_val;\r
-- }\r
-- if (jServerSocket != null)\r
-- {\r
-- jServerSocket.setSoTimeout(ival);\r
-- }\r
-- else\r
-- {\r
-- jSocket.setSoTimeout(ival);\r
-- }\r
-- break;\r
-- case SocketOptionName.ReuseAddress:\r
-- if (obj_val != null)\r
-- {\r
-- bval = ((int)obj_val == 0)?false:true;\r
-- }\r
-- else\r
-- {\r
-- bval = (int_val == 0)?false:true;\r
-- }\r
-- if (jServerSocket != null)\r
-- {\r
-- jServerSocket.setReuseAddress(bval);\r
-- }\r
-- else\r
-- {\r
-- jSocket.setReuseAddress(bval);\r
-- }\r
-- break;\r
-- case SocketOptionName.SendBuffer:\r
-- ival = int_val;\r
-- if (obj_val != null)\r
-- {\r
-- ival = (int) obj_val;\r
-- }\r
-- jSocket.setSendBufferSize(ival);\r
-- break;\r
-- case SocketOptionName.OutOfBandInline:\r
-- if (obj_val != null)\r
-- {\r
-- bval = ((int)obj_val == 0)?false:true;\r
-- }\r
-- else\r
-- {\r
-- bval = (int_val == 0)?false:true;\r
-- }\r
-- jSocket.setOOBInline(bval);\r
-- break;\r
-- default:\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- break;\r
-- }\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- obj_val = null;\r
-- }\r
-- }\r
--\r
-- public void GetSocketOption_obj_internal(SocketOptionLevel level, SocketOptionName name, \r
-- out object obj_val, out int error)\r
-- {\r
-- obj_val = null;\r
-- error = 0;\r
--\r
-- if (jSocket == null && jServerSocket == null)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
--\r
-- switch (level)\r
-- {\r
-- case SocketOptionLevel.IPv6:\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- return;\r
-- case SocketOptionLevel.IP:\r
-- if (name != SocketOptionName.NoDelay)\r
-- {\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- return;\r
-- }\r
-- break;\r
-- case SocketOptionLevel.Udp:\r
-- if (name == SocketOptionName.NoDelay)\r
-- {\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- }\r
-- else\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- }\r
-- return;\r
-- case SocketOptionLevel.Tcp:\r
-- if (name != SocketOptionName.NoDelay)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
-- break;\r
-- }\r
--\r
-- try\r
-- {\r
-- bool bval = false;\r
-- int ival = 0;\r
-- switch (name)\r
-- {\r
-- case SocketOptionName.DontLinger:\r
-- ival = jSocket.getSoLinger();\r
-- if (ival == -1)\r
-- {\r
-- obj_val = 1;\r
-- }\r
-- else\r
-- {\r
-- obj_val = 0;\r
-- }\r
-- break;\r
-- case SocketOptionName.Linger:\r
-- ival = jSocket.getSoLinger();\r
-- if (ival == -1)\r
-- {\r
-- ival = 0;\r
-- }\r
-- LingerOption ret = new LingerOption((ival != 0), ival);\r
-- obj_val = ret;\r
-- break;\r
-- case SocketOptionName.KeepAlive:\r
-- bval = jSocket.getKeepAlive();\r
-- obj_val = ((bval)?1:0);\r
-- break;\r
-- case SocketOptionName.NoDelay:\r
-- bval = jSocket.getTcpNoDelay();\r
-- obj_val = ((bval)?1:0);\r
-- break;\r
-- case SocketOptionName.ReceiveBuffer:\r
-- if (jServerSocket != null)\r
-- {\r
-- ival = jServerSocket.getReceiveBufferSize();\r
-- }\r
-- else\r
-- {\r
-- ival = jSocket.getReceiveBufferSize();\r
-- }\r
-- obj_val = ival;\r
-- break;\r
-- case SocketOptionName.ReceiveTimeout:\r
-- if (jServerSocket != null)\r
-- {\r
-- ival = jServerSocket.getSoTimeout();\r
-- }\r
-- else\r
-- {\r
-- ival = jSocket.getSoTimeout();\r
-- }\r
-- obj_val = ival;\r
-- break;\r
-- case SocketOptionName.ReuseAddress:\r
-- if (jServerSocket != null)\r
-- {\r
-- bval = jServerSocket.getReuseAddress();\r
-- }\r
-- else\r
-- {\r
-- bval = jSocket.getReuseAddress();\r
-- }\r
-- obj_val = ((bval)?1:0);\r
-- break;\r
-- case SocketOptionName.SendBuffer:\r
-- ival = jSocket.getSendBufferSize();\r
-- obj_val = ival;\r
-- break;\r
-- case SocketOptionName.OutOfBandInline:\r
-- bval = jSocket.getOOBInline();\r
-- obj_val = ((bval)?1:0);\r
-- break;\r
-- default:\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- break;\r
-- }\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- obj_val = null;\r
-- }\r
-- }\r
-- \r
-- public void GetSocketOption_arr_internal(SocketOptionLevel level, SocketOptionName name, \r
-- ref byte[] byte_val, out int error)\r
-- {\r
-- error = -1;\r
-- throw new NotImplementedException();\r
-- }\r
--\r
-- public int WSAIoctl (int ioctl_code, byte [] input, byte [] output, out int error)\r
-- {\r
-- error = -1;\r
-- throw new NotImplementedException();\r
-- }\r
--\r
-- public void Shutdown_internal(SocketShutdown how, out int error)\r
-- {\r
-- error = 0;\r
--\r
-- if (jServerSocket != null || jSocket == null || !jSocket.isConnected())\r
-- {\r
-- error = 10057; //WSAENOTCONN (Socket is not connected)\r
-- return;\r
-- }\r
--\r
-- try\r
-- {\r
-- switch (how)\r
-- {\r
-- case SocketShutdown.Receive: \r
-- jSocket.shutdownInput();\r
-- break;\r
-- case SocketShutdown.Send: \r
-- jSocket.shutdownOutput();\r
-- break;\r
-- case SocketShutdown.Both: \r
-- jSocket.shutdownInput();\r
-- jSocket.shutdownOutput();\r
-- break;\r
-- }\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Shutdown_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
--\r
-- private java.io.FileInputStream searchDefaultCacerts()\r
-- {\r
-- try\r
-- {\r
-- string javaHome = java.lang.System.getProperty("java.home");\r
-- if(javaHome == null)\r
-- return null;\r
--\r
-- string keyStorePath = javaHome + "/lib/security/cacerts";\r
-- //Console.WriteLine("keyStorePath = {0}", keyStorePath);\r
--\r
-- java.io.File f = new java.io.File(keyStorePath);\r
-- if(!f.exists())\r
-- return null;\r
-- return new java.io.FileInputStream(f);\r
-- }\r
-- catch(Exception e)\r
-- {\r
--#if DEBUG\r
-- //todo log it\r
-- Console.WriteLine(e.GetType() + ":" + e.Message + "\n" + e.StackTrace);\r
--#endif\r
-- return null;\r
-- }\r
-- }\r
--\r
-- private SSLSocketFactory getSSLSocketFactory()\r
-- {\r
-- SSLSocketFactory factory = null;\r
--\r
-- try\r
-- {\r
-- //reading the keyStore path and password from the environment properties\r
-- string keyStorePath = java.lang.System.getProperty("javax.net.ssl.keyStore");\r
-- java.io.FileInputStream keyStoreStream = null;\r
-- if (keyStorePath != null)\r
-- {\r
-- java.io.File file = new java.io.File(keyStorePath);\r
-- if(file.exists())\r
-- keyStoreStream = new java.io.FileInputStream(file);\r
-- else\r
-- keyStoreStream = searchDefaultCacerts();\r
-- }\r
-- else\r
-- keyStoreStream = searchDefaultCacerts();\r
--\r
-- string keyStorePassWord = java.lang.System.getProperty("javax.net.ssl.keyStorePassword");\r
-- if (keyStorePassWord == null)\r
-- keyStorePassWord = "changeit";\r
-- char[] passphrase = keyStorePassWord.ToCharArray(); \r
-- \r
-- //initiating SSLContext\r
-- SSLContext ctx = SSLContext.getInstance("TLS");\r
-- KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());\r
-- TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\r
-- KeyStore ks = KeyStore.getInstance("JKS");\r
-- if (keyStoreStream != null)\r
-- ks.load(keyStoreStream,passphrase);\r
-- else\r
-- ks.load(null,null);\r
-- kmf.init(ks, passphrase);\r
-- tmf.init(ks);\r
-- ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);\r
--\r
-- factory = ctx.getSocketFactory();\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- factory = null;\r
--#if DEBUG\r
-- Console.WriteLine("Can't get SSL Socket Factory, the exception is {0}, {1}", e.GetType(), e.Message);\r
--#endif\r
-- }\r
--\r
-- return factory;\r
-- }\r
--\r
-- public GHSocket ChangeToSSL(EndPoint remote_end)\r
-- {\r
-- if (jSocket == null)\r
-- {\r
-- throw new InvalidOperationException("The underlying socket is null");\r
-- }\r
--\r
-- if (!jSocketChannel.isBlocking())\r
-- {\r
-- throw new NotImplementedException("The SSL Socket for non-blocking mode is not supported");\r
-- }\r
--\r
-- SSLSocketFactory factory = getSSLSocketFactory();\r
-- if (factory == null)\r
-- {\r
-- throw new ApplicationException("Can't get SSL Socket Factory");\r
-- }\r
--\r
-- int err;\r
--\r
-- // The problem with local address, when I closed the socket and try to create the new one\r
-- // bounded to the given local address, I receive exception "Address already in use"\r
-- IPEndPoint localEndPoint = null;\r
--// IPEndPoint localEndPoint = (IPEndPoint) LocalEndPoint_internal(out err);\r
--// if (err != 0)\r
--// localEndPoint = null;\r
--\r
-- IPEndPoint remoteEndPoint = remote_end as IPEndPoint;\r
-- if (remoteEndPoint == null)\r
-- {\r
-- remoteEndPoint = (IPEndPoint) RemoteEndPoint_internal(out err);\r
-- if (err != 0)\r
-- remoteEndPoint = null;\r
-- }\r
--\r
-- java.net.Socket sslSocket = null;\r
-- try\r
-- {\r
-- if (remoteEndPoint != null)\r
-- {\r
-- if (localEndPoint != null)\r
-- {\r
-- sslSocket = factory.createSocket(\r
-- java.net.InetAddress.getByName(remoteEndPoint.Address.ToString()),\r
-- remoteEndPoint.Port,\r
-- java.net.InetAddress.getByName(localEndPoint.Address.ToString()),\r
-- localEndPoint.Port);\r
-- }\r
-- else\r
-- {\r
-- sslSocket = factory.createSocket(\r
-- jSocket, \r
-- remoteEndPoint.Address.ToString(),\r
-- remoteEndPoint.Port,\r
-- false);\r
-- }\r
--\r
-- if (sslSocket != null)\r
-- {\r
-- String[] protocols = { "TLSv1", "SSLv3" };\r
-- ((SSLSocket)sslSocket).setUseClientMode(true);\r
-- ((SSLSocket)sslSocket).startHandshake();\r
-- }\r
--\r
-- }\r
-- else\r
-- {\r
-- sslSocket = factory.createSocket();\r
-- }\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- sslSocket = null;\r
--#if DEBUG\r
-- Console.WriteLine("Can't create SSL Socket, the exception is {0}, {1}", e.GetType(), e.Message);\r
--#endif\r
-- }\r
--\r
-- if (sslSocket == null)\r
-- {\r
--// throw new ApplicationException("Can't create SSL Socket");\r
-- // it is important to the Socket class to distinguish if the underlying \r
-- // handle (GHSocket) is still valid and can be used as non-SSL, or it is already\r
-- // closed by this function and can't be used any more.\r
-- return null;\r
-- }\r
--\r
--/*\r
-- string[] arr = ((SSLSocket)sslSocket).getEnabledProtocols();\r
-- if (arr != null)\r
-- {\r
-- foreach (string s in arr)\r
-- Console.WriteLine("s:"+s);\r
-- }\r
-- string [] arr1 = ((SSLSocket)sslSocket).getEnabledCipherSuites();\r
-- if (arr1 != null)\r
-- {\r
-- foreach (string s in arr1)\r
-- Console.WriteLine("s:"+s);\r
-- }\r
--*/\r
--\r
-- return new GHStreamSocketSSL(sslSocket);\r
-- }\r
-- }\r
--}\r
--- /dev/null
--- /dev/null
++using System;\r
++using System.Net;\r
++using javax.net;\r
++using javax.net.ssl;\r
++using java.security;\r
++\r
++namespace System.Net.Sockets\r
++{\r
++ /// <summary>\r
++ /// Summary description for GHStreamSocket.\r
++ /// </summary>\r
++ internal class GHStreamSocket : GHSocket\r
++ {\r
++ java.net.ServerSocket jServerSocket;\r
++ java.net.Socket jSocket;\r
++ java.nio.channels.ServerSocketChannel jServerSocketChannel;\r
++ java.nio.channels.SocketChannel jSocketChannel;\r
++\r
++ // This field I need because a bug in the java.nio.channels.SocketAdapter, which \r
++ // returns local port 0 if the socket is not connected (even if the socket is bound)\r
++ // so I need temporary use regular socket (not channel socket) to bind it to the \r
++ // local address and use this address in the LocalPoint property and to create the \r
++ // actual client/server channel sockets\r
++ // The bug #5076965 (SocketChannel does not report local address after binding to a wildcard )\r
++ // See: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5076965\r
++ java.net.InetSocketAddress jTempLocalSocketAddress;\r
++\r
++ public GHStreamSocket()\r
++ {\r
++ jSocketChannel = java.nio.channels.SocketChannel.open();\r
++ jSocket = jSocketChannel.socket();\r
++ }\r
++\r
++ public GHStreamSocket(java.nio.channels.SocketChannel socketChannel)\r
++ {\r
++ jSocketChannel = socketChannel;\r
++ jSocket = jSocketChannel.socket();\r
++ }\r
++\r
++ public override int GetHashCode ()\r
++ {\r
++ if (jSocket == null && jServerSocket == null)\r
++ return -1;\r
++\r
++ if (jServerSocket != null) {\r
++ return jServerSocket.ToString ().GetHashCode ();\r
++ }\r
++\r
++ return jSocket.ToString ().GetHashCode ();\r
++ }\r
++\r
++ public int Available_internal(out int error)\r
++ {\r
++ error = 0;\r
++ int r = 0;\r
++\r
++ if (jSocket == null || !jSocket.isConnected())\r
++ {\r
++ return r;\r
++ }\r
++\r
++ try\r
++ {\r
++ r = jSocket.getInputStream().available();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10054; //WSAECONNRESET (Connection reset by peer)\r
++ r = 0;\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Available_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ return r;\r
++ }\r
++\r
++ public void Blocking_internal(bool block, out int error)\r
++ {\r
++ error = 0;\r
++\r
++ if (jSocket == null && jServerSocket == null)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++\r
++ try\r
++ {\r
++ if (jServerSocket != null)\r
++ {\r
++ jServerSocketChannel.configureBlocking(block);\r
++ }\r
++ else\r
++ {\r
++ jSocketChannel.configureBlocking(block);\r
++ }\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Blocking_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++\r
++ public EndPoint LocalEndPoint_internal(out int error)\r
++ {\r
++ error = 0;\r
++ java.net.InetSocketAddress localAddr = null;\r
++\r
++ try\r
++ {\r
++ if (jTempLocalSocketAddress != null)\r
++ {\r
++ localAddr = jTempLocalSocketAddress;\r
++ }\r
++ else if (jServerSocket != null)\r
++ {\r
++ localAddr = (java.net.InetSocketAddress)jServerSocket.getLocalSocketAddress();\r
++ }\r
++ else\r
++ {\r
++ localAddr = (java.net.InetSocketAddress)jSocket.getLocalSocketAddress();\r
++ }\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ localAddr = null;\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during LocalEndPoint_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ if (localAddr == null || localAddr.getAddress() == null || localAddr.getPort() < 0)\r
++ {\r
++ return null;\r
++ }\r
++\r
++ IPHostEntry lipa = Dns.Resolve(localAddr.getHostName());\r
++ IPEndPoint ret = new IPEndPoint(lipa.AddressList[0], localAddr.getPort());\r
++ return ret;\r
++ }\r
++\r
++ public EndPoint RemoteEndPoint_internal(out int error)\r
++ {\r
++ error = 0;\r
++ java.net.InetSocketAddress remoteAddr = null;\r
++\r
++ if (jSocket == null || !jSocket.isBound())\r
++ {\r
++ return null;\r
++ }\r
++\r
++ try\r
++ {\r
++ remoteAddr = (java.net.InetSocketAddress)jSocket.getRemoteSocketAddress();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ remoteAddr = null;\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during RemoteEndPoint_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ if (remoteAddr == null || remoteAddr.getAddress() == null || remoteAddr.getPort() <= 0)\r
++ {\r
++ error = 10057; //WSAENOTCONN (Socket is not connected)\r
++ return null;\r
++ }\r
++\r
++ IPHostEntry lipa = Dns.Resolve(remoteAddr.getHostName());\r
++ IPEndPoint ret = new IPEndPoint(lipa.AddressList[0], remoteAddr.getPort());\r
++ return ret;\r
++ }\r
++\r
++ public GHSocket Accept_internal(out int error)\r
++ {\r
++ error = 0;\r
++\r
++ if (jServerSocket == null)\r
++ {\r
++ throw new InvalidOperationException("You must call Bind and Listen before calling Accept.");\r
++ }\r
++\r
++ try\r
++ {\r
++ /*\r
++ If this channel is in non-blocking mode then this method will immediately \r
++ return null if there are no pending connections. \r
++ Otherwise it will block indefinitely until a new connection is \r
++ available or an I/O error occurs. \r
++ */\r
++ java.nio.channels.SocketChannel acceptedSocket = jServerSocketChannel.accept();\r
++ if (acceptedSocket == null) \r
++ {\r
++ error = 10035; //WSAEWOULDBLOCK (Resource temporarily unavailable)\r
++#if DEBUG\r
++ Console.WriteLine("The Accept_internal is in non-blocking mode and no pending connections are available");\r
++#endif\r
++ return null;\r
++ }\r
++\r
++ return new GHStreamSocket(acceptedSocket);\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10061; //WSAECONNREFUSED (Connection refused)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Accept_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ return null;\r
++ }\r
++\r
++ public void Bind_internal(EndPoint sa, out int error)\r
++ {\r
++ error = 0;\r
++ IPEndPoint addr = sa as IPEndPoint;\r
++ if (addr == null)\r
++ {\r
++ error = 10044; //WSAESOCKTNOSUPPORT (Socket type not supported)\r
++ return;\r
++ }\r
++\r
++ if (jSocket == null || jSocket.isBound() || jSocket.isConnected() || jSocketChannel.isConnectionPending())\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++\r
++ try\r
++ {\r
++ // This code I need because a bug in the java.nio.channels.SocketAdapter, which \r
++ // returns local port 0 if the socket is not connected (even if the socket is bound)\r
++ // so I need temporary use regular socket (not channel socket) to bind it to the \r
++ // local address and use this address in the LocalPoint property and to create the \r
++ // actual client/server channel sockets\r
++ // The bug #5076965 (SocketChannel does not report local address after binding to a wildcard )\r
++ // See: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5076965\r
++ java.net.Socket jTempSocket = new java.net.Socket();\r
++ jTempSocket.bind(new java.net.InetSocketAddress(java.net.InetAddress.getByName(addr.Address.ToString()),\r
++ addr.Port));\r
++ jTempLocalSocketAddress = (java.net.InetSocketAddress)jTempSocket.getLocalSocketAddress();\r
++ jTempSocket.close();\r
++ jSocket.bind(jTempLocalSocketAddress);\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10048; //WSAEADDRINUSE (Address already in use)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Bind_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++\r
++ public void Close_internal(out int error)\r
++ {\r
++ error = 0;\r
++\r
++ if (jServerSocket != null)\r
++ {\r
++ try\r
++ {\r
++ jServerSocket.close();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Close_internal jServerSocket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ try\r
++ {\r
++ jServerSocketChannel.close();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Close_internal jServerSocketChannel - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ jServerSocket = null;\r
++ jServerSocketChannel = null;\r
++ }\r
++ else if (jSocket != null)\r
++ {\r
++ try\r
++ {\r
++ jSocket.close();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Close_internal jSocket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ try\r
++ {\r
++ jSocketChannel.close();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Close_internal jSocketChannel - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ jSocket = null;\r
++ jSocketChannel = null;\r
++ }\r
++ }\r
++\r
++ public void Connect_internal(EndPoint sa, out int error)\r
++ {\r
++ error = 0;\r
++\r
++ IPEndPoint addr = sa as IPEndPoint;\r
++ if (addr == null)\r
++ {\r
++ error = 10044; //WSAESOCKTNOSUPPORT (Socket type not supported)\r
++ return;\r
++ }\r
++\r
++ if (jSocket == null)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++\r
++ if (jSocket.isConnected() || jSocketChannel.isConnectionPending())\r
++ {\r
++ error = 10056; //WSAEISCONN (Socket is already connected)\r
++ return;\r
++ }\r
++\r
++ try\r
++ {\r
++ /*\r
++ If this channel is in non-blocking mode then an invocation of this method\r
++ initiates a non-blocking connection operation. If the connection is \r
++ established immediately, as can happen with a local connection, then this \r
++ method returns true. Otherwise this method returns false. \r
++ If this channel is in blocking mode then an invocation of this method \r
++ will block until the connection is established or an I/O error occurs. \r
++ */\r
++ bool status = jSocketChannel.connect(new java.net.InetSocketAddress(\r
++ java.net.InetAddress.getByName(addr.Address.ToString()), \r
++ addr.Port));\r
++ if (!status)\r
++ {\r
++ error = 10035; //WSAEWOULDBLOCK (Resource temporarily unavailable)\r
++ }\r
++ }\r
++ catch (java.nio.channels.AlreadyConnectedException ae)\r
++ { \r
++ error = 10056; //WSAEISCONN (Socket is already connected)\r
++ }\r
++ catch (java.nio.channels.ConnectionPendingException cpe)\r
++ { \r
++ error = 10036; //WSAEINPROGRESS (Operation now in progress)\r
++ }\r
++ catch (java.nio.channels.UnresolvedAddressException uae)\r
++ { \r
++ error = 10039; //WSAEDESTADDRREQ (Destination address required)\r
++ }\r
++ catch (java.nio.channels.UnsupportedAddressTypeException uate)\r
++ { \r
++ error = 10041; //WSAEPROTOTYPE (Protocol wrong type for socket)\r
++ }\r
++ catch (Exception e)\r
++ { \r
++ error = 10061; //WSAECONNREFUSED (Connection refused)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Connect_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++\r
++ public void Listen_internal(int backlog, out int error)\r
++ {\r
++ error = 0;\r
++\r
++ if (jSocket == null || !jSocket.isBound())\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++\r
++ if (jSocket.isConnected() || jSocketChannel.isConnectionPending())\r
++ {\r
++ error = 10056; //WSAEISCONN (Socket is already connected)\r
++ return;\r
++ }\r
++\r
++ bool blockMode = jSocketChannel.isBlocking();\r
++ bool reuseAddr = jSocket.getReuseAddress();\r
++\r
++ try\r
++ {\r
++ jSocket.close();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Listen_internal close old jSocket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ try\r
++ {\r
++ jSocketChannel.close();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Listen_internal close old jSocketChannel - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ jSocket = null;\r
++ jSocketChannel = null;\r
++\r
++ try\r
++ {\r
++ jServerSocketChannel = java.nio.channels.ServerSocketChannel.open();\r
++ jServerSocket = jServerSocketChannel.socket();\r
++ jServerSocket.bind(jTempLocalSocketAddress, backlog);\r
++ jServerSocketChannel.configureBlocking(blockMode);\r
++ jServerSocket.setReuseAddress(reuseAddr);\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10048; //WSAEADDRINUSE (Address already in use)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Listen_internal create server socket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++\r
++ public bool Poll_internal (SelectMode mode, int timeout, Socket source, out int error)\r
++ {\r
++ error = 0;\r
++\r
++ if (mode == SelectMode.SelectError && !jSocketChannel.isConnectionPending())\r
++ {\r
++ return false;\r
++ }\r
++\r
++ java.nio.channels.Selector selector = java.nio.channels.Selector.open();\r
++ RegisterSelector(selector, ((mode == SelectMode.SelectRead)?0:1), source, out error);\r
++\r
++ if (error != 0)\r
++ {\r
++ error = 0;\r
++ GHSocketFactory.CloseSelector(selector);\r
++ return (mode == SelectMode.SelectError);\r
++ }\r
++\r
++ bool retVal = false;\r
++\r
++ long timeOutMillis = 1;\r
++ if (timeout < 0)\r
++ {\r
++ timeOutMillis = 0;\r
++ } \r
++ else if (timeout > 999)\r
++ {\r
++ timeOutMillis = (long)(timeout / 1000);\r
++ }\r
++\r
++ int readyCount = 0;\r
++ try\r
++ {\r
++ readyCount = selector.select(timeOutMillis);\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Poll_internal selector.select - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ if (readyCount > 0)\r
++ {\r
++ if (jSocket != null && jSocketChannel.isConnectionPending())\r
++ {\r
++ bool status = false;\r
++ try\r
++ {\r
++ status = jSocketChannel.finishConnect();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Poll_internal, finishConnect - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ if (status)\r
++ {\r
++ retVal = (mode != SelectMode.SelectError);\r
++ }\r
++ else \r
++ {\r
++ retVal = (mode == SelectMode.SelectError);\r
++ }\r
++ }\r
++ else\r
++ {\r
++ retVal = true;\r
++ }\r
++ }\r
++\r
++ GHSocketFactory.CloseSelector(selector);\r
++\r
++ return retVal;\r
++ }\r
++\r
++ public void RegisterSelector(java.nio.channels.Selector selector, int mode, Socket source, out int error)\r
++ {\r
++ error = 0;\r
++ if (jServerSocket != null)\r
++ {\r
++ // only accept operation, which included to the read list, is allowed for server sockets\r
++ if (mode != 0)\r
++ {\r
++// error = 10038; //WSAENOTSOCK (Socket operation on nonsocket)\r
++#if DEBUG\r
++ Console.WriteLine("RegisterSelector, invalid mode {0} for the server socket", mode);\r
++#endif\r
++ return;\r
++ }\r
++\r
++ try\r
++ {\r
++ if (jServerSocketChannel.isBlocking())\r
++ {\r
++ /*\r
++ A channel must be placed into non-blocking mode before being registered \r
++ with a selector, and may not be returned to blocking mode until it has been \r
++ deregistered. \r
++ */\r
++ jServerSocketChannel.configureBlocking(false);\r
++ }\r
++\r
++ jServerSocketChannel.register(selector, java.nio.channels.SelectionKey.OP_ACCEPT, source);\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during RegisterSelector, register server socket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++ else\r
++ {\r
++ try\r
++ {\r
++ int ops = java.nio.channels.SelectionKey.OP_READ;\r
++ if (mode > 0)\r
++ {\r
++ if (jSocketChannel.isConnectionPending())\r
++ {\r
++ ops = java.nio.channels.SelectionKey.OP_CONNECT;\r
++ }\r
++ else\r
++ {\r
++ ops = java.nio.channels.SelectionKey.OP_WRITE;\r
++ }\r
++ }\r
++ \r
++ if (jSocketChannel.isBlocking())\r
++ {\r
++ /*\r
++ A channel must be placed into non-blocking mode before being registered \r
++ with a selector, and may not be returned to blocking mode until it has been \r
++ deregistered. \r
++ */\r
++ jSocketChannel.configureBlocking(false);\r
++ }\r
++\r
++ jSocketChannel.register(selector, ops, source);\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during RegisterSelector, register client socket - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++ }\r
++\r
++ public bool CheckConnectionFinished()\r
++ {\r
++ bool status = true;\r
++ if (jSocket != null && jSocketChannel.isConnectionPending())\r
++ {\r
++ try\r
++ {\r
++ status = jSocketChannel.finishConnect();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ status = false;\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Poll_internal, finishConnect - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++\r
++ return status;\r
++ }\r
++\r
++ public int Receive_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
++ out int error)\r
++ {\r
++ error = 0;\r
++ int ret = 0;\r
++\r
++ if (jSocket == null)\r
++ {\r
++ error = 10057; //WSAENOTCONN (Socket is not connected)\r
++ return ret;\r
++ }\r
++\r
++ try\r
++ {\r
++ if (jSocketChannel.isConnectionPending())\r
++ {\r
++ bool status = jSocketChannel.finishConnect();\r
++ if (!status)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Receive_internal, jSocketChannel.finishConnect return false");\r
++#endif\r
++ return 0;\r
++ }\r
++ }\r
++ else if (!jSocketChannel.isConnected())\r
++ {\r
++ error = 10057; //WSAENOTCONN (Socket is not connected)\r
++ return ret;\r
++ }\r
++\r
++ java.nio.ByteBuffer readBuff = java.nio.ByteBuffer.wrap(vmw.common.TypeUtils.ToSByteArray(buffer), offset, count);\r
++ ret = jSocketChannel.read(readBuff);\r
++ if (ret < 0) ret = 0;\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10054; //WSAECONNRESET (Connection reset by peer)\r
++ ret = 0;\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Receive_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ if (ret == 0 && !jSocketChannel.isBlocking())\r
++ {\r
++ error = 10035; //WSAEWOULDBLOCK (Resource temporarily unavailable)\r
++ }\r
++ return ret;\r
++ }\r
++\r
++ public int RecvFrom_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
++ ref SocketAddress sockaddr, out int error)\r
++ {\r
++ return Receive_internal(buffer, offset, count, flags, out error);\r
++ }\r
++\r
++ public int Send_internal(byte[] buf, int offset, int count, SocketFlags flags,\r
++ out int error)\r
++ {\r
++ error = 0;\r
++ int ret = 0;\r
++\r
++ if (jSocket == null)\r
++ {\r
++ error = 10057; //WSAENOTCONN (Socket is not connected)\r
++ return ret;\r
++ }\r
++\r
++ try\r
++ {\r
++ if (jSocketChannel.isConnectionPending())\r
++ {\r
++ bool status = jSocketChannel.finishConnect();\r
++ if (!status)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Send_internal, jSocketChannel.finishConnect return false");\r
++#endif\r
++ return 0;\r
++ }\r
++ }\r
++ else if (!jSocketChannel.isConnected())\r
++ {\r
++ error = 10057; //WSAENOTCONN (Socket is not connected)\r
++ return ret;\r
++ }\r
++\r
++ java.nio.ByteBuffer writeBuff = java.nio.ByteBuffer.wrap(vmw.common.TypeUtils.ToSByteArray(buf), offset, count);\r
++ ret = jSocketChannel.write(writeBuff);\r
++ if (ret < 0) ret = 0;\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10054; //WSAECONNRESET (Connection reset by peer)\r
++ ret = 0;\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Send_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ if (ret == 0 && !jSocketChannel.isBlocking())\r
++ {\r
++ error = 10035; //WSAEWOULDBLOCK (Resource temporarily unavailable)\r
++ }\r
++ return ret;\r
++ }\r
++\r
++ public int SendTo_internal(byte[] buffer, int offset, int count,\r
++ SocketFlags flags, SocketAddress sa, out int error)\r
++ {\r
++ return Send_internal(buffer, offset, count, flags, out error);\r
++ }\r
++\r
++ public void SetSocketOption_internal (SocketOptionLevel level,\r
++ SocketOptionName name, object obj_val,\r
++ byte [] byte_val, int int_val, out int error)\r
++ {\r
++ error = 0;\r
++\r
++ if (byte_val != null)\r
++ {\r
++ error = -1;\r
++ throw new NotImplementedException();\r
++ }\r
++\r
++ if (jSocket == null && jServerSocket == null)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++\r
++ switch (level)\r
++ {\r
++ case SocketOptionLevel.IPv6:\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ return;\r
++ case SocketOptionLevel.IP:\r
++ if (name != SocketOptionName.NoDelay)\r
++ {\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ return;\r
++ }\r
++ break;\r
++ case SocketOptionLevel.Udp:\r
++ if (name == SocketOptionName.NoDelay)\r
++ {\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ }\r
++ else\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ }\r
++ return;\r
++ case SocketOptionLevel.Tcp:\r
++ if (name != SocketOptionName.NoDelay)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++ break;\r
++ }\r
++\r
++ try\r
++ {\r
++ bool bval = false;\r
++ int ival = 0;\r
++ switch (name)\r
++ {\r
++ case SocketOptionName.DontLinger:\r
++ jSocket.setSoLinger(false, 0);\r
++ break;\r
++ case SocketOptionName.Linger:\r
++ LingerOption lval = obj_val as LingerOption;\r
++ if (lval != null)\r
++ {\r
++ jSocket.setSoLinger(lval.Enabled, lval.LingerTime);\r
++ }\r
++ else\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ }\r
++ break;\r
++ case SocketOptionName.KeepAlive:\r
++ if (obj_val != null)\r
++ {\r
++ bval = ((int)obj_val == 0)?false:true;\r
++ }\r
++ else\r
++ {\r
++ bval = (int_val == 0)?false:true;\r
++ }\r
++ jSocket.setKeepAlive(bval);\r
++ break;\r
++ case SocketOptionName.NoDelay:\r
++ if (obj_val != null)\r
++ {\r
++ bval = ((int)obj_val == 0)?false:true;\r
++ }\r
++ else\r
++ {\r
++ bval = (int_val == 0)?false:true;\r
++ }\r
++ jSocket.setTcpNoDelay(bval);\r
++ break;\r
++ case SocketOptionName.ReceiveBuffer:\r
++ ival = int_val;\r
++ if (obj_val != null)\r
++ {\r
++ ival = (int) obj_val;\r
++ }\r
++ if (jServerSocket != null)\r
++ {\r
++ jServerSocket.setReceiveBufferSize(ival);\r
++ }\r
++ else\r
++ {\r
++ jSocket.setReceiveBufferSize(ival);\r
++ }\r
++ break;\r
++ case SocketOptionName.ReceiveTimeout:\r
++ ival = int_val;\r
++ if (obj_val != null)\r
++ {\r
++ ival = (int) obj_val;\r
++ }\r
++ if (jServerSocket != null)\r
++ {\r
++ jServerSocket.setSoTimeout(ival);\r
++ }\r
++ else\r
++ {\r
++ jSocket.setSoTimeout(ival);\r
++ }\r
++ break;\r
++ case SocketOptionName.ReuseAddress:\r
++ if (obj_val != null)\r
++ {\r
++ bval = ((int)obj_val == 0)?false:true;\r
++ }\r
++ else\r
++ {\r
++ bval = (int_val == 0)?false:true;\r
++ }\r
++ if (jServerSocket != null)\r
++ {\r
++ jServerSocket.setReuseAddress(bval);\r
++ }\r
++ else\r
++ {\r
++ jSocket.setReuseAddress(bval);\r
++ }\r
++ break;\r
++ case SocketOptionName.SendBuffer:\r
++ ival = int_val;\r
++ if (obj_val != null)\r
++ {\r
++ ival = (int) obj_val;\r
++ }\r
++ jSocket.setSendBufferSize(ival);\r
++ break;\r
++ case SocketOptionName.OutOfBandInline:\r
++ if (obj_val != null)\r
++ {\r
++ bval = ((int)obj_val == 0)?false:true;\r
++ }\r
++ else\r
++ {\r
++ bval = (int_val == 0)?false:true;\r
++ }\r
++ jSocket.setOOBInline(bval);\r
++ break;\r
++ default:\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ break;\r
++ }\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ obj_val = null;\r
++ }\r
++ }\r
++\r
++ public void GetSocketOption_obj_internal(SocketOptionLevel level, SocketOptionName name, \r
++ out object obj_val, out int error)\r
++ {\r
++ obj_val = null;\r
++ error = 0;\r
++\r
++ if (jSocket == null && jServerSocket == null)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++\r
++ switch (level)\r
++ {\r
++ case SocketOptionLevel.IPv6:\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ return;\r
++ case SocketOptionLevel.IP:\r
++ if (name != SocketOptionName.NoDelay)\r
++ {\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ return;\r
++ }\r
++ break;\r
++ case SocketOptionLevel.Udp:\r
++ if (name == SocketOptionName.NoDelay)\r
++ {\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ }\r
++ else\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ }\r
++ return;\r
++ case SocketOptionLevel.Tcp:\r
++ if (name != SocketOptionName.NoDelay)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++ break;\r
++ }\r
++\r
++ try\r
++ {\r
++ bool bval = false;\r
++ int ival = 0;\r
++ switch (name)\r
++ {\r
++ case SocketOptionName.DontLinger:\r
++ ival = jSocket.getSoLinger();\r
++ if (ival == -1)\r
++ {\r
++ obj_val = 1;\r
++ }\r
++ else\r
++ {\r
++ obj_val = 0;\r
++ }\r
++ break;\r
++ case SocketOptionName.Linger:\r
++ ival = jSocket.getSoLinger();\r
++ if (ival == -1)\r
++ {\r
++ ival = 0;\r
++ }\r
++ LingerOption ret = new LingerOption((ival != 0), ival);\r
++ obj_val = ret;\r
++ break;\r
++ case SocketOptionName.KeepAlive:\r
++ bval = jSocket.getKeepAlive();\r
++ obj_val = ((bval)?1:0);\r
++ break;\r
++ case SocketOptionName.NoDelay:\r
++ bval = jSocket.getTcpNoDelay();\r
++ obj_val = ((bval)?1:0);\r
++ break;\r
++ case SocketOptionName.ReceiveBuffer:\r
++ if (jServerSocket != null)\r
++ {\r
++ ival = jServerSocket.getReceiveBufferSize();\r
++ }\r
++ else\r
++ {\r
++ ival = jSocket.getReceiveBufferSize();\r
++ }\r
++ obj_val = ival;\r
++ break;\r
++ case SocketOptionName.ReceiveTimeout:\r
++ if (jServerSocket != null)\r
++ {\r
++ ival = jServerSocket.getSoTimeout();\r
++ }\r
++ else\r
++ {\r
++ ival = jSocket.getSoTimeout();\r
++ }\r
++ obj_val = ival;\r
++ break;\r
++ case SocketOptionName.ReuseAddress:\r
++ if (jServerSocket != null)\r
++ {\r
++ bval = jServerSocket.getReuseAddress();\r
++ }\r
++ else\r
++ {\r
++ bval = jSocket.getReuseAddress();\r
++ }\r
++ obj_val = ((bval)?1:0);\r
++ break;\r
++ case SocketOptionName.SendBuffer:\r
++ ival = jSocket.getSendBufferSize();\r
++ obj_val = ival;\r
++ break;\r
++ case SocketOptionName.OutOfBandInline:\r
++ bval = jSocket.getOOBInline();\r
++ obj_val = ((bval)?1:0);\r
++ break;\r
++ default:\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ break;\r
++ }\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ obj_val = null;\r
++ }\r
++ }\r
++ \r
++ public void GetSocketOption_arr_internal(SocketOptionLevel level, SocketOptionName name, \r
++ ref byte[] byte_val, out int error)\r
++ {\r
++ error = -1;\r
++ throw new NotImplementedException();\r
++ }\r
++\r
++ public int WSAIoctl (int ioctl_code, byte [] input, byte [] output, out int error)\r
++ {\r
++ error = -1;\r
++ throw new NotImplementedException();\r
++ }\r
++\r
++ public void Shutdown_internal(SocketShutdown how, out int error)\r
++ {\r
++ error = 0;\r
++\r
++ if (jServerSocket != null || jSocket == null || !jSocket.isConnected())\r
++ {\r
++ error = 10057; //WSAENOTCONN (Socket is not connected)\r
++ return;\r
++ }\r
++\r
++ try\r
++ {\r
++ switch (how)\r
++ {\r
++ case SocketShutdown.Receive: \r
++ jSocket.shutdownInput();\r
++ break;\r
++ case SocketShutdown.Send: \r
++ jSocket.shutdownOutput();\r
++ break;\r
++ case SocketShutdown.Both: \r
++ jSocket.shutdownInput();\r
++ jSocket.shutdownOutput();\r
++ break;\r
++ }\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Shutdown_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++\r
++ private java.io.FileInputStream searchDefaultCacerts()\r
++ {\r
++ try\r
++ {\r
++ string javaHome = java.lang.System.getProperty("java.home");\r
++ if(javaHome == null)\r
++ return null;\r
++\r
++ string keyStorePath = javaHome + "/lib/security/cacerts";\r
++ //Console.WriteLine("keyStorePath = {0}", keyStorePath);\r
++\r
++ java.io.File f = new java.io.File(keyStorePath);\r
++ if(!f.exists())\r
++ return null;\r
++ return new java.io.FileInputStream(f);\r
++ }\r
++ catch(Exception e)\r
++ {\r
++#if DEBUG\r
++ //todo log it\r
++ Console.WriteLine(e.GetType() + ":" + e.Message + "\n" + e.StackTrace);\r
++#endif\r
++ return null;\r
++ }\r
++ }\r
++\r
++ private SSLSocketFactory getSSLSocketFactory()\r
++ {\r
++ SSLSocketFactory factory = null;\r
++\r
++ try\r
++ {\r
++ //reading the keyStore path and password from the environment properties\r
++ string keyStorePath = java.lang.System.getProperty("javax.net.ssl.keyStore");\r
++ java.io.FileInputStream keyStoreStream = null;\r
++ if (keyStorePath != null)\r
++ {\r
++ java.io.File file = new java.io.File(keyStorePath);\r
++ if(file.exists())\r
++ keyStoreStream = new java.io.FileInputStream(file);\r
++ else\r
++ keyStoreStream = searchDefaultCacerts();\r
++ }\r
++ else\r
++ keyStoreStream = searchDefaultCacerts();\r
++\r
++ string keyStorePassWord = java.lang.System.getProperty("javax.net.ssl.keyStorePassword");\r
++ if (keyStorePassWord == null)\r
++ keyStorePassWord = "changeit";\r
++ char[] passphrase = keyStorePassWord.ToCharArray(); \r
++ \r
++ //initiating SSLContext\r
++ SSLContext ctx = SSLContext.getInstance("TLS");\r
++ KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());\r
++ TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\r
++ KeyStore ks = KeyStore.getInstance("JKS");\r
++ if (keyStoreStream != null)\r
++ ks.load(keyStoreStream,passphrase);\r
++ else\r
++ ks.load(null,null);\r
++ kmf.init(ks, passphrase);\r
++ tmf.init(ks);\r
++ ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);\r
++\r
++ factory = ctx.getSocketFactory();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ factory = null;\r
++#if DEBUG\r
++ Console.WriteLine("Can't get SSL Socket Factory, the exception is {0}, {1}", e.GetType(), e.Message);\r
++#endif\r
++ }\r
++\r
++ return factory;\r
++ }\r
++\r
++ public GHSocket ChangeToSSL(EndPoint remote_end)\r
++ {\r
++ if (jSocket == null)\r
++ {\r
++ throw new InvalidOperationException("The underlying socket is null");\r
++ }\r
++\r
++ if (!jSocketChannel.isBlocking())\r
++ {\r
++ throw new NotImplementedException("The SSL Socket for non-blocking mode is not supported");\r
++ }\r
++\r
++ SSLSocketFactory factory = getSSLSocketFactory();\r
++ if (factory == null)\r
++ {\r
++ throw new ApplicationException("Can't get SSL Socket Factory");\r
++ }\r
++\r
++ int err;\r
++\r
++ // The problem with local address, when I closed the socket and try to create the new one\r
++ // bounded to the given local address, I receive exception "Address already in use"\r
++ IPEndPoint localEndPoint = null;\r
++// IPEndPoint localEndPoint = (IPEndPoint) LocalEndPoint_internal(out err);\r
++// if (err != 0)\r
++// localEndPoint = null;\r
++\r
++ IPEndPoint remoteEndPoint = remote_end as IPEndPoint;\r
++ if (remoteEndPoint == null)\r
++ {\r
++ remoteEndPoint = (IPEndPoint) RemoteEndPoint_internal(out err);\r
++ if (err != 0)\r
++ remoteEndPoint = null;\r
++ }\r
++\r
++ java.net.Socket sslSocket = null;\r
++ try\r
++ {\r
++ if (remoteEndPoint != null)\r
++ {\r
++ if (localEndPoint != null)\r
++ {\r
++ sslSocket = factory.createSocket(\r
++ java.net.InetAddress.getByName(remoteEndPoint.Address.ToString()),\r
++ remoteEndPoint.Port,\r
++ java.net.InetAddress.getByName(localEndPoint.Address.ToString()),\r
++ localEndPoint.Port);\r
++ }\r
++ else\r
++ {\r
++ sslSocket = factory.createSocket(\r
++ jSocket, \r
++ remoteEndPoint.Address.ToString(),\r
++ remoteEndPoint.Port,\r
++ false);\r
++ }\r
++\r
++ if (sslSocket != null)\r
++ {\r
++ String[] protocols = { "TLSv1", "SSLv3" };\r
++ ((SSLSocket)sslSocket).setUseClientMode(true);\r
++ ((SSLSocket)sslSocket).startHandshake();\r
++ }\r
++\r
++ }\r
++ else\r
++ {\r
++ sslSocket = factory.createSocket();\r
++ }\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ sslSocket = null;\r
++#if DEBUG\r
++ Console.WriteLine("Can't create SSL Socket, the exception is {0}, {1}", e.GetType(), e.Message);\r
++#endif\r
++ }\r
++\r
++ if (sslSocket == null)\r
++ {\r
++// throw new ApplicationException("Can't create SSL Socket");\r
++ // it is important to the Socket class to distinguish if the underlying \r
++ // handle (GHSocket) is still valid and can be used as non-SSL, or it is already\r
++ // closed by this function and can't be used any more.\r
++ return null;\r
++ }\r
++\r
++/*\r
++ string[] arr = ((SSLSocket)sslSocket).getEnabledProtocols();\r
++ if (arr != null)\r
++ {\r
++ foreach (string s in arr)\r
++ Console.WriteLine("s:"+s);\r
++ }\r
++ string [] arr1 = ((SSLSocket)sslSocket).getEnabledCipherSuites();\r
++ if (arr1 != null)\r
++ {\r
++ foreach (string s in arr1)\r
++ Console.WriteLine("s:"+s);\r
++ }\r
++*/\r
++\r
++ return new GHStreamSocketSSL(sslSocket);\r
++ }\r
++ }\r
++}\r
+++ /dev/null
--using System;\r
--using System.Net;\r
--\r
--namespace System.Net.Sockets\r
--{\r
-- /// <summary>\r
-- /// Summary description for GHStreamSocket.\r
-- /// </summary>\r
-- internal class GHStreamSocketSSL : GHSocket\r
-- {\r
-- java.net.Socket jSocket;\r
--\r
-- public GHStreamSocketSSL(java.net.Socket sslSocket)\r
-- {\r
-- jSocket = sslSocket;\r
-- }\r
--\r
-- public override int GetHashCode ()\r
-- {\r
-- if (jSocket == null)\r
-- return -1;\r
--\r
-- return jSocket.ToString().GetHashCode();\r
-- }\r
--\r
-- public int Available_internal(out int error)\r
-- {\r
-- error = 0;\r
-- int r = 0;\r
--\r
-- if (jSocket == null || !jSocket.isConnected())\r
-- {\r
-- return r;\r
-- }\r
--\r
-- try\r
-- {\r
-- r = jSocket.getInputStream().available();\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10054; //WSAECONNRESET (Connection reset by peer)\r
-- r = 0;\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Available_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- return r;\r
-- }\r
--\r
-- public void Blocking_internal(bool block, out int error)\r
-- {\r
-- //SVETA: see in the non-blocking io\r
-- error = 0;\r
--\r
-- if (block == false)\r
-- throw new NotSupportedException();\r
-- }\r
--\r
-- public EndPoint LocalEndPoint_internal(out int error)\r
-- {\r
-- error = 0;\r
-- java.net.InetSocketAddress localAddr = null;\r
--\r
-- try\r
-- {\r
-- localAddr = (java.net.InetSocketAddress)jSocket.getLocalSocketAddress();\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- localAddr = null;\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during LocalEndPoint_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- if (localAddr == null || localAddr.getAddress() == null || localAddr.getPort() < 0)\r
-- {\r
-- return null;\r
-- }\r
--\r
-- IPHostEntry lipa = Dns.Resolve(localAddr.getHostName());\r
-- IPEndPoint ret = new IPEndPoint(lipa.AddressList[0], localAddr.getPort());\r
-- return ret;\r
-- }\r
--\r
-- public EndPoint RemoteEndPoint_internal(out int error)\r
-- {\r
-- error = 0;\r
-- java.net.InetSocketAddress remoteAddr = null;\r
--\r
-- if (jSocket == null || !jSocket.isBound())\r
-- {\r
-- return null;\r
-- }\r
--\r
-- try\r
-- {\r
-- remoteAddr = (java.net.InetSocketAddress)jSocket.getRemoteSocketAddress();\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- remoteAddr = null;\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during RemoteEndPoint_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- if (remoteAddr == null || remoteAddr.getAddress() == null || remoteAddr.getPort() <= 0)\r
-- {\r
-- error = 10057; //WSAENOTCONN (Socket is not connected)\r
-- return null;\r
-- }\r
--\r
-- IPHostEntry lipa = Dns.Resolve(remoteAddr.getHostName());\r
-- IPEndPoint ret = new IPEndPoint(lipa.AddressList[0], remoteAddr.getPort());\r
-- return ret;\r
-- }\r
--\r
-- public GHSocket Accept_internal(out int error)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return null;\r
-- }\r
--\r
-- public void Bind_internal(EndPoint sa, out int error)\r
-- {\r
-- error = 0;\r
-- IPEndPoint addr = sa as IPEndPoint;\r
-- if (addr == null)\r
-- {\r
-- error = 10044; //WSAESOCKTNOSUPPORT (Socket type not supported)\r
-- return;\r
-- }\r
--\r
-- if (jSocket == null || jSocket.isBound() || jSocket.isConnected())\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
--\r
-- try\r
-- {\r
-- jSocket.bind(new java.net.InetSocketAddress(java.net.InetAddress.getByName(addr.Address.ToString()),\r
-- addr.Port));\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10048; //WSAEADDRINUSE (Address already in use)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Bind_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
--\r
-- public void Close_internal(out int error)\r
-- {\r
-- error = 0;\r
--\r
-- try\r
-- {\r
-- if (jSocket != null)\r
-- {\r
-- jSocket.close();\r
-- jSocket = null;\r
-- }\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Close_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
--\r
-- public void Connect_internal(EndPoint sa, out int error)\r
-- {\r
-- error = 0;\r
--\r
-- IPEndPoint addr = sa as IPEndPoint;\r
-- if (addr == null)\r
-- {\r
-- error = 10044; //WSAESOCKTNOSUPPORT (Socket type not supported)\r
-- return;\r
-- }\r
--\r
-- if (jSocket == null)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
--\r
-- if (jSocket.isConnected())\r
-- {\r
-- error = 10056; //WSAEISCONN (Socket is already connected)\r
-- return;\r
-- }\r
--\r
-- try\r
-- {\r
-- jSocket.connect(new java.net.InetSocketAddress(\r
-- java.net.InetAddress.getByName(addr.Address.ToString()), \r
-- addr.Port));\r
-- }\r
-- catch (Exception e)\r
-- { \r
-- error = 10061; //WSAECONNREFUSED (Connection refused)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Connect_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
--\r
-- public void Listen_internal(int backlog, out int error)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
--\r
-- public bool Poll_internal (SelectMode mode, int timeout, Socket source, out int error)\r
-- {\r
-- error = 0;\r
-- throw new NotImplementedException();\r
-- }\r
--\r
-- public int Receive_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
-- out int error)\r
-- {\r
-- error = 0;\r
-- int ret = 0;\r
--\r
-- if (jSocket == null || !jSocket.isConnected())\r
-- {\r
-- error = 10057; //WSAENOTCONN (Socket is not connected)\r
-- return ret;\r
-- }\r
--\r
-- try\r
-- {\r
-- ret = jSocket.getInputStream().read(vmw.common.TypeUtils.ToSByteArray(buffer), offset, count);\r
-- if (ret < 0) ret = 0;\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10054; //WSAECONNRESET (Connection reset by peer)\r
-- ret = 0;\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Receive_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- return ret;\r
-- }\r
--\r
-- public int RecvFrom_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
-- ref SocketAddress sockaddr, out int error)\r
-- {\r
-- return Receive_internal(buffer, offset, count, flags, out error);\r
-- }\r
--\r
-- public int Send_internal(byte[] buf, int offset, int count, SocketFlags flags,\r
-- out int error)\r
-- {\r
-- error = 0;\r
-- int ret = 0;\r
--\r
-- if (jSocket == null || !jSocket.isConnected())\r
-- {\r
-- error = 10057; //WSAENOTCONN (Socket is not connected)\r
-- return ret;\r
-- }\r
--\r
-- try\r
-- {\r
-- jSocket.getOutputStream().write(vmw.common.TypeUtils.ToSByteArray(buf), offset, count);\r
-- ret = count;\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10054; //WSAECONNRESET (Connection reset by peer)\r
-- ret = 0;\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Send_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
--\r
-- return ret;\r
-- }\r
--\r
-- public int SendTo_internal(byte[] buffer, int offset, int count,\r
-- SocketFlags flags, SocketAddress sa, out int error)\r
-- {\r
-- return Send_internal(buffer, offset, count, flags, out error);\r
-- }\r
--\r
-- public void SetSocketOption_internal (SocketOptionLevel level,\r
-- SocketOptionName name, object obj_val,\r
-- byte [] byte_val, int int_val, out int error)\r
-- {\r
-- error = 0;\r
--\r
-- if (byte_val != null)\r
-- {\r
-- error = -1;\r
-- throw new NotImplementedException();\r
-- }\r
--\r
-- if (jSocket == null)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
--\r
-- switch (level)\r
-- {\r
-- case SocketOptionLevel.IPv6:\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- return;\r
-- case SocketOptionLevel.IP:\r
-- if (name != SocketOptionName.NoDelay)\r
-- {\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- return;\r
-- }\r
-- break;\r
-- case SocketOptionLevel.Udp:\r
-- if (name == SocketOptionName.NoDelay)\r
-- {\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- }\r
-- else\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- }\r
-- return;\r
-- case SocketOptionLevel.Tcp:\r
-- if (name != SocketOptionName.NoDelay)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
-- break;\r
-- }\r
--\r
-- try\r
-- {\r
-- bool bval = false;\r
-- int ival = 0;\r
-- switch (name)\r
-- {\r
-- case SocketOptionName.DontLinger:\r
-- jSocket.setSoLinger(false, 0);\r
-- break;\r
-- case SocketOptionName.Linger:\r
-- LingerOption lval = obj_val as LingerOption;\r
-- if (lval != null)\r
-- {\r
-- jSocket.setSoLinger(lval.Enabled, lval.LingerTime);\r
-- }\r
-- else\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- }\r
-- break;\r
-- case SocketOptionName.KeepAlive:\r
-- if (obj_val != null)\r
-- {\r
-- bval = ((int)obj_val == 0)?false:true;\r
-- }\r
-- else\r
-- {\r
-- bval = (int_val == 0)?false:true;\r
-- }\r
-- jSocket.setKeepAlive(bval);\r
-- break;\r
-- case SocketOptionName.NoDelay:\r
-- if (obj_val != null)\r
-- {\r
-- bval = ((int)obj_val == 0)?false:true;\r
-- }\r
-- else\r
-- {\r
-- bval = (int_val == 0)?false:true;\r
-- }\r
-- jSocket.setTcpNoDelay(bval);\r
-- break;\r
-- case SocketOptionName.ReceiveBuffer:\r
-- ival = int_val;\r
-- if (obj_val != null)\r
-- {\r
-- ival = (int) obj_val;\r
-- }\r
-- jSocket.setReceiveBufferSize(ival);\r
-- break;\r
-- case SocketOptionName.ReceiveTimeout:\r
-- ival = int_val;\r
-- if (obj_val != null)\r
-- {\r
-- ival = (int) obj_val;\r
-- }\r
-- jSocket.setSoTimeout(ival);\r
-- break;\r
-- case SocketOptionName.ReuseAddress:\r
-- if (obj_val != null)\r
-- {\r
-- bval = ((int)obj_val == 0)?false:true;\r
-- }\r
-- else\r
-- {\r
-- bval = (int_val == 0)?false:true;\r
-- }\r
-- jSocket.setReuseAddress(bval);\r
-- break;\r
-- case SocketOptionName.SendBuffer:\r
-- ival = int_val;\r
-- if (obj_val != null)\r
-- {\r
-- ival = (int) obj_val;\r
-- }\r
-- jSocket.setSendBufferSize(ival);\r
-- break;\r
-- case SocketOptionName.OutOfBandInline:\r
-- if (obj_val != null)\r
-- {\r
-- bval = ((int)obj_val == 0)?false:true;\r
-- }\r
-- else\r
-- {\r
-- bval = (int_val == 0)?false:true;\r
-- }\r
-- jSocket.setOOBInline(bval);\r
-- break;\r
-- default:\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- break;\r
-- }\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- obj_val = null;\r
-- }\r
-- }\r
--\r
-- public void GetSocketOption_obj_internal(SocketOptionLevel level, SocketOptionName name, \r
-- out object obj_val, out int error)\r
-- {\r
-- obj_val = null;\r
-- error = 0;\r
--\r
-- if (jSocket == null)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
--\r
-- switch (level)\r
-- {\r
-- case SocketOptionLevel.IPv6:\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- return;\r
-- case SocketOptionLevel.IP:\r
-- if (name != SocketOptionName.NoDelay)\r
-- {\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- return;\r
-- }\r
-- break;\r
-- case SocketOptionLevel.Udp:\r
-- if (name == SocketOptionName.NoDelay)\r
-- {\r
-- error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
-- }\r
-- else\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- }\r
-- return;\r
-- case SocketOptionLevel.Tcp:\r
-- if (name != SocketOptionName.NoDelay)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- return;\r
-- }\r
-- break;\r
-- }\r
--\r
-- try\r
-- {\r
-- bool bval = false;\r
-- int ival = 0;\r
-- switch (name)\r
-- {\r
-- case SocketOptionName.DontLinger:\r
-- ival = jSocket.getSoLinger();\r
-- if (ival == -1)\r
-- {\r
-- obj_val = 1;\r
-- }\r
-- else\r
-- {\r
-- obj_val = 0;\r
-- }\r
-- break;\r
-- case SocketOptionName.Linger:\r
-- ival = jSocket.getSoLinger();\r
-- if (ival == -1)\r
-- {\r
-- ival = 0;\r
-- }\r
-- LingerOption ret = new LingerOption((ival != 0), ival);\r
-- obj_val = ret;\r
-- break;\r
-- case SocketOptionName.KeepAlive:\r
-- bval = jSocket.getKeepAlive();\r
-- obj_val = ((bval)?1:0);\r
-- break;\r
-- case SocketOptionName.NoDelay:\r
-- bval = jSocket.getTcpNoDelay();\r
-- obj_val = ((bval)?1:0);\r
-- break;\r
-- case SocketOptionName.ReceiveBuffer:\r
-- ival = jSocket.getReceiveBufferSize();\r
-- obj_val = ival;\r
-- break;\r
-- case SocketOptionName.ReceiveTimeout:\r
-- ival = jSocket.getSoTimeout();\r
-- obj_val = ival;\r
-- break;\r
-- case SocketOptionName.ReuseAddress:\r
-- bval = jSocket.getReuseAddress();\r
-- obj_val = ((bval)?1:0);\r
-- break;\r
-- case SocketOptionName.SendBuffer:\r
-- ival = jSocket.getSendBufferSize();\r
-- obj_val = ival;\r
-- break;\r
-- case SocketOptionName.OutOfBandInline:\r
-- bval = jSocket.getOOBInline();\r
-- obj_val = ((bval)?1:0);\r
-- break;\r
-- default:\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- break;\r
-- }\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
-- obj_val = null;\r
-- }\r
-- }\r
-- \r
-- public void GetSocketOption_arr_internal(SocketOptionLevel level, SocketOptionName name, \r
-- ref byte[] byte_val, out int error)\r
-- {\r
-- error = -1;\r
-- throw new NotImplementedException();\r
-- }\r
--\r
-- public int WSAIoctl (int ioctl_code, byte [] input, byte [] output, out int error)\r
-- {\r
-- error = -1;\r
-- throw new NotImplementedException();\r
-- }\r
--\r
-- public void Shutdown_internal(SocketShutdown how, out int error)\r
-- {\r
-- error = 0;\r
--\r
-- if (jSocket == null || !jSocket.isConnected())\r
-- {\r
-- error = 10057; //WSAENOTCONN (Socket is not connected)\r
-- return;\r
-- }\r
--\r
-- try\r
-- {\r
-- switch (how)\r
-- {\r
-- case SocketShutdown.Receive: \r
-- jSocket.shutdownInput();\r
-- break;\r
-- case SocketShutdown.Send: \r
-- jSocket.shutdownOutput();\r
-- break;\r
-- case SocketShutdown.Both: \r
-- jSocket.shutdownInput();\r
-- jSocket.shutdownOutput();\r
-- break;\r
-- }\r
-- }\r
-- catch (Exception e)\r
-- {\r
-- error = 10022; //WSAEINVAL (Invalid argument)\r
--#if DEBUG\r
-- Console.WriteLine("Caught exception during Shutdown_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
--#endif\r
-- }\r
-- }\r
--\r
-- public void RegisterSelector(java.nio.channels.Selector selector, int mode, Socket source, out int error)\r
-- {\r
-- throw new InvalidOperationException();\r
-- }\r
--\r
-- public bool CheckConnectionFinished()\r
-- {\r
-- throw new InvalidOperationException();\r
-- }\r
--\r
-- public GHSocket ChangeToSSL(EndPoint remote_end)\r
-- {\r
-- return this;\r
-- }\r
--\r
-- }\r
--}\r
--- /dev/null
--- /dev/null
++using System;\r
++using System.Net;\r
++\r
++namespace System.Net.Sockets\r
++{\r
++ /// <summary>\r
++ /// Summary description for GHStreamSocket.\r
++ /// </summary>\r
++ internal class GHStreamSocketSSL : GHSocket\r
++ {\r
++ java.net.Socket jSocket;\r
++\r
++ public GHStreamSocketSSL(java.net.Socket sslSocket)\r
++ {\r
++ jSocket = sslSocket;\r
++ }\r
++\r
++ public override int GetHashCode ()\r
++ {\r
++ if (jSocket == null)\r
++ return -1;\r
++\r
++ return jSocket.ToString().GetHashCode();\r
++ }\r
++\r
++ public int Available_internal(out int error)\r
++ {\r
++ error = 0;\r
++ int r = 0;\r
++\r
++ if (jSocket == null || !jSocket.isConnected())\r
++ {\r
++ return r;\r
++ }\r
++\r
++ try\r
++ {\r
++ r = jSocket.getInputStream().available();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10054; //WSAECONNRESET (Connection reset by peer)\r
++ r = 0;\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Available_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ return r;\r
++ }\r
++\r
++ public void Blocking_internal(bool block, out int error)\r
++ {\r
++ //SVETA: see in the non-blocking io\r
++ error = 0;\r
++\r
++ if (block == false)\r
++ throw new NotSupportedException();\r
++ }\r
++\r
++ public EndPoint LocalEndPoint_internal(out int error)\r
++ {\r
++ error = 0;\r
++ java.net.InetSocketAddress localAddr = null;\r
++\r
++ try\r
++ {\r
++ localAddr = (java.net.InetSocketAddress)jSocket.getLocalSocketAddress();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ localAddr = null;\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during LocalEndPoint_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ if (localAddr == null || localAddr.getAddress() == null || localAddr.getPort() < 0)\r
++ {\r
++ return null;\r
++ }\r
++\r
++ IPHostEntry lipa = Dns.Resolve(localAddr.getHostName());\r
++ IPEndPoint ret = new IPEndPoint(lipa.AddressList[0], localAddr.getPort());\r
++ return ret;\r
++ }\r
++\r
++ public EndPoint RemoteEndPoint_internal(out int error)\r
++ {\r
++ error = 0;\r
++ java.net.InetSocketAddress remoteAddr = null;\r
++\r
++ if (jSocket == null || !jSocket.isBound())\r
++ {\r
++ return null;\r
++ }\r
++\r
++ try\r
++ {\r
++ remoteAddr = (java.net.InetSocketAddress)jSocket.getRemoteSocketAddress();\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ remoteAddr = null;\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during RemoteEndPoint_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ if (remoteAddr == null || remoteAddr.getAddress() == null || remoteAddr.getPort() <= 0)\r
++ {\r
++ error = 10057; //WSAENOTCONN (Socket is not connected)\r
++ return null;\r
++ }\r
++\r
++ IPHostEntry lipa = Dns.Resolve(remoteAddr.getHostName());\r
++ IPEndPoint ret = new IPEndPoint(lipa.AddressList[0], remoteAddr.getPort());\r
++ return ret;\r
++ }\r
++\r
++ public GHSocket Accept_internal(out int error)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return null;\r
++ }\r
++\r
++ public void Bind_internal(EndPoint sa, out int error)\r
++ {\r
++ error = 0;\r
++ IPEndPoint addr = sa as IPEndPoint;\r
++ if (addr == null)\r
++ {\r
++ error = 10044; //WSAESOCKTNOSUPPORT (Socket type not supported)\r
++ return;\r
++ }\r
++\r
++ if (jSocket == null || jSocket.isBound() || jSocket.isConnected())\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++\r
++ try\r
++ {\r
++ jSocket.bind(new java.net.InetSocketAddress(java.net.InetAddress.getByName(addr.Address.ToString()),\r
++ addr.Port));\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10048; //WSAEADDRINUSE (Address already in use)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Bind_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++\r
++ public void Close_internal(out int error)\r
++ {\r
++ error = 0;\r
++\r
++ try\r
++ {\r
++ if (jSocket != null)\r
++ {\r
++ jSocket.close();\r
++ jSocket = null;\r
++ }\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Close_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++\r
++ public void Connect_internal(EndPoint sa, out int error)\r
++ {\r
++ error = 0;\r
++\r
++ IPEndPoint addr = sa as IPEndPoint;\r
++ if (addr == null)\r
++ {\r
++ error = 10044; //WSAESOCKTNOSUPPORT (Socket type not supported)\r
++ return;\r
++ }\r
++\r
++ if (jSocket == null)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++\r
++ if (jSocket.isConnected())\r
++ {\r
++ error = 10056; //WSAEISCONN (Socket is already connected)\r
++ return;\r
++ }\r
++\r
++ try\r
++ {\r
++ jSocket.connect(new java.net.InetSocketAddress(\r
++ java.net.InetAddress.getByName(addr.Address.ToString()), \r
++ addr.Port));\r
++ }\r
++ catch (Exception e)\r
++ { \r
++ error = 10061; //WSAECONNREFUSED (Connection refused)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Connect_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++\r
++ public void Listen_internal(int backlog, out int error)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++\r
++ public bool Poll_internal (SelectMode mode, int timeout, Socket source, out int error)\r
++ {\r
++ error = 0;\r
++ throw new NotImplementedException();\r
++ }\r
++\r
++ public int Receive_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
++ out int error)\r
++ {\r
++ error = 0;\r
++ int ret = 0;\r
++\r
++ if (jSocket == null || !jSocket.isConnected())\r
++ {\r
++ error = 10057; //WSAENOTCONN (Socket is not connected)\r
++ return ret;\r
++ }\r
++\r
++ try\r
++ {\r
++ ret = jSocket.getInputStream().read(vmw.common.TypeUtils.ToSByteArray(buffer), offset, count);\r
++ if (ret < 0) ret = 0;\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10054; //WSAECONNRESET (Connection reset by peer)\r
++ ret = 0;\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Receive_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ return ret;\r
++ }\r
++\r
++ public int RecvFrom_internal(byte[] buffer, int offset, int count, SocketFlags flags,\r
++ ref SocketAddress sockaddr, out int error)\r
++ {\r
++ return Receive_internal(buffer, offset, count, flags, out error);\r
++ }\r
++\r
++ public int Send_internal(byte[] buf, int offset, int count, SocketFlags flags,\r
++ out int error)\r
++ {\r
++ error = 0;\r
++ int ret = 0;\r
++\r
++ if (jSocket == null || !jSocket.isConnected())\r
++ {\r
++ error = 10057; //WSAENOTCONN (Socket is not connected)\r
++ return ret;\r
++ }\r
++\r
++ try\r
++ {\r
++ jSocket.getOutputStream().write(vmw.common.TypeUtils.ToSByteArray(buf), offset, count);\r
++ ret = count;\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10054; //WSAECONNRESET (Connection reset by peer)\r
++ ret = 0;\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Send_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++\r
++ return ret;\r
++ }\r
++\r
++ public int SendTo_internal(byte[] buffer, int offset, int count,\r
++ SocketFlags flags, SocketAddress sa, out int error)\r
++ {\r
++ return Send_internal(buffer, offset, count, flags, out error);\r
++ }\r
++\r
++ public void SetSocketOption_internal (SocketOptionLevel level,\r
++ SocketOptionName name, object obj_val,\r
++ byte [] byte_val, int int_val, out int error)\r
++ {\r
++ error = 0;\r
++\r
++ if (byte_val != null)\r
++ {\r
++ error = -1;\r
++ throw new NotImplementedException();\r
++ }\r
++\r
++ if (jSocket == null)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++\r
++ switch (level)\r
++ {\r
++ case SocketOptionLevel.IPv6:\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ return;\r
++ case SocketOptionLevel.IP:\r
++ if (name != SocketOptionName.NoDelay)\r
++ {\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ return;\r
++ }\r
++ break;\r
++ case SocketOptionLevel.Udp:\r
++ if (name == SocketOptionName.NoDelay)\r
++ {\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ }\r
++ else\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ }\r
++ return;\r
++ case SocketOptionLevel.Tcp:\r
++ if (name != SocketOptionName.NoDelay)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++ break;\r
++ }\r
++\r
++ try\r
++ {\r
++ bool bval = false;\r
++ int ival = 0;\r
++ switch (name)\r
++ {\r
++ case SocketOptionName.DontLinger:\r
++ jSocket.setSoLinger(false, 0);\r
++ break;\r
++ case SocketOptionName.Linger:\r
++ LingerOption lval = obj_val as LingerOption;\r
++ if (lval != null)\r
++ {\r
++ jSocket.setSoLinger(lval.Enabled, lval.LingerTime);\r
++ }\r
++ else\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ }\r
++ break;\r
++ case SocketOptionName.KeepAlive:\r
++ if (obj_val != null)\r
++ {\r
++ bval = ((int)obj_val == 0)?false:true;\r
++ }\r
++ else\r
++ {\r
++ bval = (int_val == 0)?false:true;\r
++ }\r
++ jSocket.setKeepAlive(bval);\r
++ break;\r
++ case SocketOptionName.NoDelay:\r
++ if (obj_val != null)\r
++ {\r
++ bval = ((int)obj_val == 0)?false:true;\r
++ }\r
++ else\r
++ {\r
++ bval = (int_val == 0)?false:true;\r
++ }\r
++ jSocket.setTcpNoDelay(bval);\r
++ break;\r
++ case SocketOptionName.ReceiveBuffer:\r
++ ival = int_val;\r
++ if (obj_val != null)\r
++ {\r
++ ival = (int) obj_val;\r
++ }\r
++ jSocket.setReceiveBufferSize(ival);\r
++ break;\r
++ case SocketOptionName.ReceiveTimeout:\r
++ ival = int_val;\r
++ if (obj_val != null)\r
++ {\r
++ ival = (int) obj_val;\r
++ }\r
++ jSocket.setSoTimeout(ival);\r
++ break;\r
++ case SocketOptionName.ReuseAddress:\r
++ if (obj_val != null)\r
++ {\r
++ bval = ((int)obj_val == 0)?false:true;\r
++ }\r
++ else\r
++ {\r
++ bval = (int_val == 0)?false:true;\r
++ }\r
++ jSocket.setReuseAddress(bval);\r
++ break;\r
++ case SocketOptionName.SendBuffer:\r
++ ival = int_val;\r
++ if (obj_val != null)\r
++ {\r
++ ival = (int) obj_val;\r
++ }\r
++ jSocket.setSendBufferSize(ival);\r
++ break;\r
++ case SocketOptionName.OutOfBandInline:\r
++ if (obj_val != null)\r
++ {\r
++ bval = ((int)obj_val == 0)?false:true;\r
++ }\r
++ else\r
++ {\r
++ bval = (int_val == 0)?false:true;\r
++ }\r
++ jSocket.setOOBInline(bval);\r
++ break;\r
++ default:\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ break;\r
++ }\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ obj_val = null;\r
++ }\r
++ }\r
++\r
++ public void GetSocketOption_obj_internal(SocketOptionLevel level, SocketOptionName name, \r
++ out object obj_val, out int error)\r
++ {\r
++ obj_val = null;\r
++ error = 0;\r
++\r
++ if (jSocket == null)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++\r
++ switch (level)\r
++ {\r
++ case SocketOptionLevel.IPv6:\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ return;\r
++ case SocketOptionLevel.IP:\r
++ if (name != SocketOptionName.NoDelay)\r
++ {\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ return;\r
++ }\r
++ break;\r
++ case SocketOptionLevel.Udp:\r
++ if (name == SocketOptionName.NoDelay)\r
++ {\r
++ error = 10042; //WSAENOPROTOOPT (Bad protocol option)\r
++ }\r
++ else\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ }\r
++ return;\r
++ case SocketOptionLevel.Tcp:\r
++ if (name != SocketOptionName.NoDelay)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ return;\r
++ }\r
++ break;\r
++ }\r
++\r
++ try\r
++ {\r
++ bool bval = false;\r
++ int ival = 0;\r
++ switch (name)\r
++ {\r
++ case SocketOptionName.DontLinger:\r
++ ival = jSocket.getSoLinger();\r
++ if (ival == -1)\r
++ {\r
++ obj_val = 1;\r
++ }\r
++ else\r
++ {\r
++ obj_val = 0;\r
++ }\r
++ break;\r
++ case SocketOptionName.Linger:\r
++ ival = jSocket.getSoLinger();\r
++ if (ival == -1)\r
++ {\r
++ ival = 0;\r
++ }\r
++ LingerOption ret = new LingerOption((ival != 0), ival);\r
++ obj_val = ret;\r
++ break;\r
++ case SocketOptionName.KeepAlive:\r
++ bval = jSocket.getKeepAlive();\r
++ obj_val = ((bval)?1:0);\r
++ break;\r
++ case SocketOptionName.NoDelay:\r
++ bval = jSocket.getTcpNoDelay();\r
++ obj_val = ((bval)?1:0);\r
++ break;\r
++ case SocketOptionName.ReceiveBuffer:\r
++ ival = jSocket.getReceiveBufferSize();\r
++ obj_val = ival;\r
++ break;\r
++ case SocketOptionName.ReceiveTimeout:\r
++ ival = jSocket.getSoTimeout();\r
++ obj_val = ival;\r
++ break;\r
++ case SocketOptionName.ReuseAddress:\r
++ bval = jSocket.getReuseAddress();\r
++ obj_val = ((bval)?1:0);\r
++ break;\r
++ case SocketOptionName.SendBuffer:\r
++ ival = jSocket.getSendBufferSize();\r
++ obj_val = ival;\r
++ break;\r
++ case SocketOptionName.OutOfBandInline:\r
++ bval = jSocket.getOOBInline();\r
++ obj_val = ((bval)?1:0);\r
++ break;\r
++ default:\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ break;\r
++ }\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++ obj_val = null;\r
++ }\r
++ }\r
++ \r
++ public void GetSocketOption_arr_internal(SocketOptionLevel level, SocketOptionName name, \r
++ ref byte[] byte_val, out int error)\r
++ {\r
++ error = -1;\r
++ throw new NotImplementedException();\r
++ }\r
++\r
++ public int WSAIoctl (int ioctl_code, byte [] input, byte [] output, out int error)\r
++ {\r
++ error = -1;\r
++ throw new NotImplementedException();\r
++ }\r
++\r
++ public void Shutdown_internal(SocketShutdown how, out int error)\r
++ {\r
++ error = 0;\r
++\r
++ if (jSocket == null || !jSocket.isConnected())\r
++ {\r
++ error = 10057; //WSAENOTCONN (Socket is not connected)\r
++ return;\r
++ }\r
++\r
++ try\r
++ {\r
++ switch (how)\r
++ {\r
++ case SocketShutdown.Receive: \r
++ jSocket.shutdownInput();\r
++ break;\r
++ case SocketShutdown.Send: \r
++ jSocket.shutdownOutput();\r
++ break;\r
++ case SocketShutdown.Both: \r
++ jSocket.shutdownInput();\r
++ jSocket.shutdownOutput();\r
++ break;\r
++ }\r
++ }\r
++ catch (Exception e)\r
++ {\r
++ error = 10022; //WSAEINVAL (Invalid argument)\r
++#if DEBUG\r
++ Console.WriteLine("Caught exception during Shutdown_internal - {0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace);\r
++#endif\r
++ }\r
++ }\r
++\r
++ public void RegisterSelector(java.nio.channels.Selector selector, int mode, Socket source, out int error)\r
++ {\r
++ throw new InvalidOperationException();\r
++ }\r
++\r
++ public bool CheckConnectionFinished()\r
++ {\r
++ throw new InvalidOperationException();\r
++ }\r
++\r
++ public GHSocket ChangeToSSL(EndPoint remote_end)\r
++ {\r
++ return this;\r
++ }\r
++\r
++ }\r
++}\r
+++ /dev/null
--using System;\r
--using System.Security.Cryptography.X509Certificates;\r
--using System.IO;\r
--\r
--namespace System.Net\r
--{\r
-- [Serializable]\r
-- internal abstract class HttpProvider\r
-- {\r
-- #region Fields\r
--\r
-- protected static int _defaultMaxResponseHeadersLength;\r
-- protected static int _defaultMaxRedirectsNum = 50;\r
-- \r
-- protected Uri _originalUri;\r
-- protected WebHeaderCollection _headers;\r
-- protected bool _allowAutoRedirect;\r
-- protected bool _allowWriteStreamBuffering = true;\r
-- protected X509CertificateCollection _certificates;\r
-- protected string _connectionGroupName;\r
-- protected HttpContinueDelegate _continueDelegate;\r
-- protected CookieContainer _cookieContainer;\r
-- protected ICredentials _credentials;\r
-- protected bool _keepAlive = true;\r
-- protected int _maxResponseHeadersLength = _defaultMaxResponseHeadersLength;\r
-- protected int _maxAutoRedirections = _defaultMaxRedirectsNum;\r
-- protected int _readWriteTimeout = 300000;\r
-- protected string _mediaType = string.Empty;\r
-- protected string _methodName = "GET";\r
-- protected bool _pipelined = true;\r
-- protected bool _preAuthenticate;\r
-- protected Version _version = HttpVersion.Version11;\r
-- protected IWebProxy _proxy;\r
-- protected bool _sendChunked;\r
-- protected ServicePoint _servicePoint;\r
-- protected int _timeout = 100000;\r
--\r
-- protected bool _isAborted;\r
-- protected long _contentLength = -1L;\r
--\r
-- \r
-- \r
--\r
-- #endregion /* Fields */\r
--\r
-- #region Constructors and Factory Methods\r
-- protected HttpProvider(Uri uri)\r
-- {\r
-- _originalUri = uri;\r
-- _headers = new WebHeaderCollection(true);\r
-- _allowAutoRedirect = true;\r
-- }\r
--\r
-- public static HttpProvider GetHttpProvider(Uri uri)\r
-- {\r
-- return new VMWHttpProvider(uri);\r
-- }\r
--\r
-- public static HttpProvider GetHttpProvider(string provider, Uri uri)\r
-- {\r
-- Type type = Type.GetType(provider, true);\r
-- if(type != null)\r
-- return GetHttpProvider(type, uri);\r
-- //log it as an error\r
-- return new VMWHttpProvider(uri);\r
-- }\r
--\r
-- public static HttpProvider GetHttpProvider(Type provider, Uri uri)\r
-- {\r
-- try\r
-- {\r
-- return (HttpProvider)Activator.CreateInstance(provider, \r
-- new object[]{uri}); \r
-- }\r
-- catch\r
-- {\r
-- //log it as an error\r
-- return new VMWHttpProvider(uri);\r
-- }\r
-- }\r
--\r
-- #endregion\r
--\r
-- #region Properties\r
-- internal virtual WebHeaderCollection Headers\r
-- {\r
-- get{return _headers;}\r
-- set\r
-- {\r
-- if(IsRequestStarted ())\r
-- throw new InvalidOperationException("Connection already opened");\r
-- WebHeaderCollection newHeaders = new WebHeaderCollection (true);\r
-- int count = value.Count;\r
-- for (int i = 0; i < count; i++) \r
-- newHeaders.Add (value.GetKey (i), value.Get (i));\r
--\r
-- _headers = newHeaders;\r
-- }\r
-- }\r
--\r
-- internal virtual bool AllowAutoRedirect\r
-- {\r
-- get{return _allowAutoRedirect;}\r
-- set{_allowAutoRedirect = value;}\r
-- }\r
--\r
-- internal virtual bool AllowWriteStreamBuffering\r
-- {\r
-- get{return _allowWriteStreamBuffering;}\r
-- set{_allowWriteStreamBuffering = value;}\r
-- }\r
--\r
-- internal virtual string ConnectionGroupName\r
-- {\r
-- get{return _connectionGroupName;}\r
-- set{_connectionGroupName = value;}\r
-- }\r
--\r
-- internal virtual HttpContinueDelegate ContinueDelegate\r
-- {\r
-- get{return _continueDelegate;}\r
-- set{_continueDelegate = value;}\r
-- }\r
--\r
-- internal virtual CookieContainer CookieContainer\r
-- {\r
-- get{return _cookieContainer;}\r
-- set{_cookieContainer = value;}\r
-- }\r
--\r
-- internal virtual ICredentials Credentials\r
-- {\r
-- get{return _credentials;}\r
-- set{_credentials = value;}\r
-- }\r
-- internal static int DefaultMaxResponseHeadersLength\r
-- {\r
-- get{return _defaultMaxResponseHeadersLength;}\r
-- set\r
-- {\r
-- if (value < 0 && value != -1)\r
-- throw new ArgumentOutOfRangeException("Argument should be positive");\r
-- _defaultMaxResponseHeadersLength = value;\r
-- }\r
-- }\r
--\r
-- internal virtual bool KeepAlive\r
-- {\r
-- get{return _keepAlive;}\r
-- set{_keepAlive = value;}\r
-- }\r
--\r
-- internal virtual int MaxAutoRedirections\r
-- {\r
-- get{return _maxAutoRedirections;}\r
-- set\r
-- {\r
-- if (value <= 0)\r
-- throw new ArgumentException("Must be > 0", "value");\r
-- _maxAutoRedirections = value;\r
-- }\r
-- }\r
--\r
-- internal virtual int MaximumResponseHeadersLength\r
-- {\r
-- get{return _maxResponseHeadersLength;}\r
-- set\r
-- {\r
-- if (IsRequestStarted())\r
-- {\r
-- throw new InvalidOperationException("Request has been already submitted.");\r
-- }\r
-- if (value < 0 && value != -1)\r
-- throw new ArgumentOutOfRangeException("The argument must be positive or -1");\r
-- _maxResponseHeadersLength = value;\r
-- }\r
-- }\r
-- \r
-- internal virtual string MediaType\r
-- {\r
-- get{return _mediaType;}\r
-- set{_mediaType = value;}\r
-- }\r
--\r
-- internal virtual string MethodName\r
-- {\r
-- get{return _methodName;}\r
-- set\r
-- {\r
-- if (value == null || value.Trim () == "")\r
-- throw new ArgumentException ("not a valid method");\r
--\r
-- _methodName = value;\r
-- }\r
-- }\r
-- internal virtual bool Pipelined\r
-- {\r
-- get{return _pipelined;}\r
-- set{_pipelined = value;}\r
-- }\r
--\r
-- internal virtual bool PreAuthenticate \r
-- { \r
-- get { return _preAuthenticate; }\r
-- set { _preAuthenticate = value; }\r
-- }\r
--\r
-- internal virtual Version ProtocolVersion\r
-- {\r
-- get{return _version;}\r
-- set\r
-- {\r
-- if (value != HttpVersion.Version10 && value != HttpVersion.Version11)\r
-- throw new ArgumentException ("value");\r
--\r
-- _version = value; \r
-- }\r
-- }\r
-- internal virtual IWebProxy Proxy\r
-- {\r
-- get{return _proxy;}\r
-- set\r
-- {\r
-- if(IsRequestStarted())\r
-- throw new InvalidOperationException("Request already has been submitted");\r
-- if(value == null)\r
-- throw new ArgumentNullException("value");\r
-- if(!(value is WebProxy))\r
-- throw new NotImplementedException("The supported proxy objects only of type System.Net.WebProxy");\r
-- _proxy = value;\r
-- }\r
-- }\r
-- internal virtual int ReadWriteTimeout\r
-- {\r
-- get{return _readWriteTimeout;}\r
-- set\r
-- {\r
-- if (IsRequestStarted())\r
-- throw new InvalidOperationException("Request has been submitted.");\r
--\r
-- if (value < 0 && value != -1)\r
-- throw new ArgumentOutOfRangeException("value");\r
--\r
-- _readWriteTimeout = value;\r
-- }\r
-- }\r
--\r
-- internal virtual bool SendChunked\r
-- {\r
-- get{return _sendChunked;}\r
-- set\r
-- {\r
-- if(IsRequestStarted ())\r
-- throw new InvalidOperationException("Request has been submitted.");\r
-- _sendChunked = value;\r
-- }\r
-- }\r
--\r
-- internal virtual ServicePoint ServicePoint\r
-- {\r
-- get{return _servicePoint;}\r
-- }\r
--\r
-- internal virtual int Timeout\r
-- {\r
-- get{return _timeout;}\r
-- set\r
-- {\r
-- if (value < -1)\r
-- throw new ArgumentOutOfRangeException ("value");\r
--\r
-- _timeout = value;\r
-- }\r
-- }\r
--\r
-- internal virtual long ContentLength\r
-- {\r
-- get{return _contentLength;}\r
-- set\r
-- {\r
-- if(value < 0)\r
-- throw new ArgumentOutOfRangeException("value", "The Content-Length property value must be positive");\r
-- _contentLength = value;\r
-- }\r
-- }\r
--\r
--\r
--\r
-- #endregion\r
--\r
-- #region Methods\r
--\r
-- public virtual Uri GetOriginalAddress()\r
-- {\r
-- return _originalUri;\r
-- }\r
--\r
-- public virtual X509CertificateCollection GetX509Certificates()\r
-- {\r
-- if(_certificates == null)\r
-- _certificates = new X509CertificateCollection();\r
-- return _certificates;\r
-- }\r
--\r
-- public abstract bool IsRequestStarted();\r
--\r
-- public abstract Uri GetAddress();\r
--\r
-- public abstract bool IsHaveResponse();\r
--\r
-- public abstract void Abort();\r
--\r
-- public abstract Stream GetRequestStream();\r
--\r
-- public abstract WebResponse GetResponse();\r
--\r
-- public abstract IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state);\r
--\r
-- public abstract Stream EndGetRequestStream(IAsyncResult asyncResult);\r
--\r
-- public abstract IAsyncResult BeginGetResponse(AsyncCallback callback, object state);\r
--\r
-- public abstract WebResponse EndGetResponse(IAsyncResult asyncResult);\r
--\r
--\r
-- #endregion\r
--\r
--\r
-- }\r
--}\r
--- /dev/null
--- /dev/null
++using System;\r
++using System.Security.Cryptography.X509Certificates;\r
++using System.IO;\r
++\r
++namespace System.Net\r
++{\r
++ [Serializable]\r
++ internal abstract class HttpProvider\r
++ {\r
++ #region Fields\r
++\r
++ protected static int _defaultMaxResponseHeadersLength;\r
++ protected static int _defaultMaxRedirectsNum = 50;\r
++ \r
++ protected Uri _originalUri;\r
++ protected WebHeaderCollection _headers;\r
++ protected bool _allowAutoRedirect;\r
++ protected bool _allowWriteStreamBuffering = true;\r
++ protected X509CertificateCollection _certificates;\r
++ protected string _connectionGroupName;\r
++ protected HttpContinueDelegate _continueDelegate;\r
++ protected CookieContainer _cookieContainer;\r
++ protected ICredentials _credentials;\r
++ protected bool _keepAlive = true;\r
++ protected int _maxResponseHeadersLength = _defaultMaxResponseHeadersLength;\r
++ protected int _maxAutoRedirections = _defaultMaxRedirectsNum;\r
++ protected int _readWriteTimeout = 300000;\r
++ protected string _mediaType = string.Empty;\r
++ protected string _methodName = "GET";\r
++ protected bool _pipelined = true;\r
++ protected bool _preAuthenticate;\r
++ protected Version _version = HttpVersion.Version11;\r
++ protected IWebProxy _proxy;\r
++ protected bool _sendChunked;\r
++ protected ServicePoint _servicePoint;\r
++ protected int _timeout = 100000;\r
++\r
++ protected bool _isAborted;\r
++ protected long _contentLength = -1L;\r
++\r
++ \r
++ \r
++\r
++ #endregion /* Fields */\r
++\r
++ #region Constructors and Factory Methods\r
++ protected HttpProvider(Uri uri)\r
++ {\r
++ _originalUri = uri;\r
++ _headers = new WebHeaderCollection(true);\r
++ _allowAutoRedirect = true;\r
++ }\r
++\r
++ public static HttpProvider GetHttpProvider(Uri uri)\r
++ {\r
++ return new VMWHttpProvider(uri);\r
++ }\r
++\r
++ public static HttpProvider GetHttpProvider(string provider, Uri uri)\r
++ {\r
++ Type type = Type.GetType(provider, true);\r
++ if(type != null)\r
++ return GetHttpProvider(type, uri);\r
++ //log it as an error\r
++ return new VMWHttpProvider(uri);\r
++ }\r
++\r
++ public static HttpProvider GetHttpProvider(Type provider, Uri uri)\r
++ {\r
++ try\r
++ {\r
++ return (HttpProvider)Activator.CreateInstance(provider, \r
++ new object[]{uri}); \r
++ }\r
++ catch\r
++ {\r
++ //log it as an error\r
++ return new VMWHttpProvider(uri);\r
++ }\r
++ }\r
++\r
++ #endregion\r
++\r
++ #region Properties\r
++ internal virtual WebHeaderCollection Headers\r
++ {\r
++ get{return _headers;}\r
++ set\r
++ {\r
++ if(IsRequestStarted ())\r
++ throw new InvalidOperationException("Connection already opened");\r
++ WebHeaderCollection newHeaders = new WebHeaderCollection (true);\r
++ int count = value.Count;\r
++ for (int i = 0; i < count; i++) \r
++ newHeaders.Add (value.GetKey (i), value.Get (i));\r
++\r
++ _headers = newHeaders;\r
++ }\r
++ }\r
++\r
++ internal virtual bool AllowAutoRedirect\r
++ {\r
++ get{return _allowAutoRedirect;}\r
++ set{_allowAutoRedirect = value;}\r
++ }\r
++\r
++ internal virtual bool AllowWriteStreamBuffering\r
++ {\r
++ get{return _allowWriteStreamBuffering;}\r
++ set{_allowWriteStreamBuffering = value;}\r
++ }\r
++\r
++ internal virtual string ConnectionGroupName\r
++ {\r
++ get{return _connectionGroupName;}\r
++ set{_connectionGroupName = value;}\r
++ }\r
++\r
++ internal virtual HttpContinueDelegate ContinueDelegate\r
++ {\r
++ get{return _continueDelegate;}\r
++ set{_continueDelegate = value;}\r
++ }\r
++\r
++ internal virtual CookieContainer CookieContainer\r
++ {\r
++ get{return _cookieContainer;}\r
++ set{_cookieContainer = value;}\r
++ }\r
++\r
++ internal virtual ICredentials Credentials\r
++ {\r
++ get{return _credentials;}\r
++ set{_credentials = value;}\r
++ }\r
++ internal static int DefaultMaxResponseHeadersLength\r
++ {\r
++ get{return _defaultMaxResponseHeadersLength;}\r
++ set\r
++ {\r
++ if (value < 0 && value != -1)\r
++ throw new ArgumentOutOfRangeException("Argument should be positive");\r
++ _defaultMaxResponseHeadersLength = value;\r
++ }\r
++ }\r
++\r
++ internal virtual bool KeepAlive\r
++ {\r
++ get{return _keepAlive;}\r
++ set{_keepAlive = value;}\r
++ }\r
++\r
++ internal virtual int MaxAutoRedirections\r
++ {\r
++ get{return _maxAutoRedirections;}\r
++ set\r
++ {\r
++ if (value <= 0)\r
++ throw new ArgumentException("Must be > 0", "value");\r
++ _maxAutoRedirections = value;\r
++ }\r
++ }\r
++\r
++ internal virtual int MaximumResponseHeadersLength\r
++ {\r
++ get{return _maxResponseHeadersLength;}\r
++ set\r
++ {\r
++ if (IsRequestStarted())\r
++ {\r
++ throw new InvalidOperationException("Request has been already submitted.");\r
++ }\r
++ if (value < 0 && value != -1)\r
++ throw new ArgumentOutOfRangeException("The argument must be positive or -1");\r
++ _maxResponseHeadersLength = value;\r
++ }\r
++ }\r
++ \r
++ internal virtual string MediaType\r
++ {\r
++ get{return _mediaType;}\r
++ set{_mediaType = value;}\r
++ }\r
++\r
++ internal virtual string MethodName\r
++ {\r
++ get{return _methodName;}\r
++ set\r
++ {\r
++ if (value == null || value.Trim () == "")\r
++ throw new ArgumentException ("not a valid method");\r
++\r
++ _methodName = value;\r
++ }\r
++ }\r
++ internal virtual bool Pipelined\r
++ {\r
++ get{return _pipelined;}\r
++ set{_pipelined = value;}\r
++ }\r
++\r
++ internal virtual bool PreAuthenticate \r
++ { \r
++ get { return _preAuthenticate; }\r
++ set { _preAuthenticate = value; }\r
++ }\r
++\r
++ internal virtual Version ProtocolVersion\r
++ {\r
++ get{return _version;}\r
++ set\r
++ {\r
++ if (value != HttpVersion.Version10 && value != HttpVersion.Version11)\r
++ throw new ArgumentException ("value");\r
++\r
++ _version = value; \r
++ }\r
++ }\r
++ internal virtual IWebProxy Proxy\r
++ {\r
++ get{return _proxy;}\r
++ set\r
++ {\r
++ if(IsRequestStarted())\r
++ throw new InvalidOperationException("Request already has been submitted");\r
++ if(value == null)\r
++ throw new ArgumentNullException("value");\r
++ if(!(value is WebProxy))\r
++ throw new NotImplementedException("The supported proxy objects only of type System.Net.WebProxy");\r
++ _proxy = value;\r
++ }\r
++ }\r
++ internal virtual int ReadWriteTimeout\r
++ {\r
++ get{return _readWriteTimeout;}\r
++ set\r
++ {\r
++ if (IsRequestStarted())\r
++ throw new InvalidOperationException("Request has been submitted.");\r
++\r
++ if (value < 0 && value != -1)\r
++ throw new ArgumentOutOfRangeException("value");\r
++\r
++ _readWriteTimeout = value;\r
++ }\r
++ }\r
++\r
++ internal virtual bool SendChunked\r
++ {\r
++ get{return _sendChunked;}\r
++ set\r
++ {\r
++ if(IsRequestStarted ())\r
++ throw new InvalidOperationException("Request has been submitted.");\r
++ _sendChunked = value;\r
++ }\r
++ }\r
++\r
++ internal virtual ServicePoint ServicePoint\r
++ {\r
++ get{return _servicePoint;}\r
++ }\r
++\r
++ internal virtual int Timeout\r
++ {\r
++ get{return _timeout;}\r
++ set\r
++ {\r
++ if (value < -1)\r
++ throw new ArgumentOutOfRangeException ("value");\r
++\r
++ _timeout = value;\r
++ }\r
++ }\r
++\r
++ internal virtual long ContentLength\r
++ {\r
++ get{return _contentLength;}\r
++ set\r
++ {\r
++ if(value < 0)\r
++ throw new ArgumentOutOfRangeException("value", "The Content-Length property value must be positive");\r
++ _contentLength = value;\r
++ }\r
++ }\r
++\r
++\r
++\r
++ #endregion\r
++\r
++ #region Methods\r
++\r
++ public virtual Uri GetOriginalAddress()\r
++ {\r
++ return _originalUri;\r
++ }\r
++\r
++ public virtual X509CertificateCollection GetX509Certificates()\r
++ {\r
++ if(_certificates == null)\r
++ _certificates = new X509CertificateCollection();\r
++ return _certificates;\r
++ }\r
++\r
++ public abstract bool IsRequestStarted();\r
++\r
++ public abstract Uri GetAddress();\r
++\r
++ public abstract bool IsHaveResponse();\r
++\r
++ public abstract void Abort();\r
++\r
++ public abstract Stream GetRequestStream();\r
++\r
++ public abstract WebResponse GetResponse();\r
++\r
++ public abstract IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state);\r
++\r
++ public abstract Stream EndGetRequestStream(IAsyncResult asyncResult);\r
++\r
++ public abstract IAsyncResult BeginGetResponse(AsyncCallback callback, object state);\r
++\r
++ public abstract WebResponse EndGetResponse(IAsyncResult asyncResult);\r
++\r
++\r
++ #endregion\r
++\r
++\r
++ }\r
++}\r
+++ /dev/null
--using System;\r
--using System.Collections;\r
--\r
--using mainsoft.apache.commons.httpclient;\r
--\r
--namespace System.Net\r
--{\r
-- \r
-- class HttpStateCache\r
-- {\r
-- private static readonly int MAX_SIZE = 30;\r
--\r
-- private Stack _states;\r
-- private int _currentSize;\r
--\r
-- internal HttpStateCache()\r
-- {\r
-- _states = new Stack(20);\r
-- }\r
--\r
-- internal HttpState GetHttpState()\r
-- {\r
-- lock(this)\r
-- {\r
-- if(_states.Count > 0)\r
-- return (HttpState) _states.Pop();\r
-- }\r
-- return new HttpState();\r
-- }\r
--\r
-- internal void ReleaseHttpState(HttpState state)\r
-- {\r
-- lock(this)\r
-- {\r
-- if(_states.Count < MAX_SIZE)\r
-- {\r
-- state.clear();\r
-- _states.Push(state);\r
-- }\r
-- }\r
-- }\r
-- }\r
--}\r
--- /dev/null
--- /dev/null
++using System;\r
++using System.Collections;\r
++\r
++using mainsoft.apache.commons.httpclient;\r
++\r
++namespace System.Net\r
++{\r
++ \r
++ class HttpStateCache\r
++ {\r
++ private static readonly int MAX_SIZE = 30;\r
++\r
++ private Stack _states;\r
++ private int _currentSize;\r
++\r
++ internal HttpStateCache()\r
++ {\r
++ _states = new Stack(20);\r
++ }\r
++\r
++ internal HttpState GetHttpState()\r
++ {\r
++ lock(this)\r
++ {\r
++ if(_states.Count > 0)\r
++ return (HttpState) _states.Pop();\r
++ }\r
++ return new HttpState();\r
++ }\r
++\r
++ internal void ReleaseHttpState(HttpState state)\r
++ {\r
++ lock(this)\r
++ {\r
++ if(_states.Count < MAX_SIZE)\r
++ {\r
++ state.clear();\r
++ _states.Push(state);\r
++ }\r
++ }\r
++ }\r
++ }\r
++}\r
+++ /dev/null
--using System;\r
--using System.IO;\r
--using System.Threading;\r
--\r
--using mainsoft.apache.commons.httpclient;\r
--using mainsoft.apache.commons.httpclient.methods;\r
--using mainsoft.apache.commons.httpclient.@params;\r
--using mainsoft.apache.commons.httpclient.auth;\r
--\r
--namespace System.Net\r
--{\r
-- /// <summary>\r
-- /// Summary description for VMWHttpProvider.\r
-- /// </summary>\r
-- internal class VMWHttpProvider : HttpProvider\r
-- {\r
-- protected static HttpClient _client; //todo init it in static constructor\r
-- protected static HttpStateCache _stateCache = new HttpStateCache();\r
--\r
-- protected static object LOCK_OBJECT = new object();\r
-- \r
-- \r
--\r
-- protected HttpMethod _method;\r
-- protected HttpState _state;\r
-- protected HostConfiguration _hostConfig;\r
-- \r
-- protected HttpWebResponse _response;\r
-- protected bool _hasResponse;\r
-- protected bool _hasRequest;\r
-- protected Stream _writeStream;\r
-- private GHWebAsyncResult _asyncWrite;\r
-- private GHWebAsyncResult _asyncRead;\r
--\r
-- private bool _isConnectionOpened;\r
-- \r
-- static VMWHttpProvider()\r
-- {\r
-- if(java.lang.System.getProperty("mainsoft.apache.commons.logging.Log") == null)\r
-- java.lang.System.setProperty("mainsoft.apache.commons.logging.Log",\r
-- "mainsoft.apache.commons.logging.impl.SimpleLog");\r
-- if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.showdatetime") == null)\r
-- java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.showdatetime",\r
-- "true");\r
-- if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire") == null)\r
-- java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire",\r
-- "error");\r
-- if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.mainsoft.apache.commons.httpclient")\r
-- == null)\r
-- java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.mainsoft.apache.commons.httpclient",\r
-- "error");\r
-- if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire.header")\r
-- == null)\r
-- java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire.header", \r
-- "error");\r
--\r
-- }\r
-- public VMWHttpProvider(Uri uri) : base (uri)\r
-- {\r
-- }\r
--\r
-- internal override ServicePoint ServicePoint\r
-- {\r
-- get {throw new NotImplementedException();}\r
-- }\r
--\r
--\r
--\r
-- public override bool IsRequestStarted()\r
-- {\r
-- if(_method == null)\r
-- return false;\r
-- return _method.isRequestSent();\r
-- }\r
--\r
-- public override Uri GetAddress()\r
-- {\r
-- if(_method == null)\r
-- return GetOriginalAddress();\r
-- mainsoft.apache.commons.httpclient.URI javaURI = _method.getURI();\r
-- return new Uri(javaURI.ToString());\r
-- }\r
--\r
-- public override bool IsHaveResponse()\r
-- {\r
-- return _hasResponse;\r
-- }\r
--\r
-- private void SetJavaCredential(NetworkCredential nc, string type)\r
-- {\r
-- SetJavaCredential(nc, type, false);\r
-- }\r
--\r
-- private void SetJavaCredential(NetworkCredential nc, string type, bool proxyCredentials)\r
-- {\r
-- type = type.ToLower();\r
-- string host = null;\r
-- \r
-- if(!proxyCredentials)\r
-- host = GetOriginalAddress().Host;\r
-- else\r
-- host = ((WebProxy)this.Proxy).Address.Host;\r
--\r
-- string domain = (nc.Domain == null) ? host : nc.Domain;\r
--\r
-- if(type.Equals("any"))\r
-- {\r
-- if(!proxyCredentials)\r
-- {\r
-- _state.setCredentials(AuthScope.ANY,\r
-- new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
-- _state.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "Ntlm"),\r
-- new NTCredentials(nc.UserName, nc.Password, host, domain));\r
-- }\r
-- else\r
-- {\r
-- _state.setProxyCredentials(AuthScope.ANY,\r
-- new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
-- _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "Ntlm"),\r
-- new NTCredentials(nc.UserName, nc.Password, host, domain));\r
-- }\r
-- }\r
-- else if(type.Equals("basic"))\r
-- {\r
-- if(!proxyCredentials)\r
-- {\r
-- _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,\r
-- AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),\r
-- new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
-- }\r
-- else\r
-- {\r
-- _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,\r
-- AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),\r
-- new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
-- }\r
-- }\r
-- else if(type.Equals("digest"))\r
-- {\r
-- if(!proxyCredentials)\r
-- {\r
-- _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,\r
-- AuthScope.ANY_PORT, AuthScope.ANY_REALM, "digest"),\r
-- new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
-- }\r
-- else\r
-- {\r
-- _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,\r
-- AuthScope.ANY_PORT, AuthScope.ANY_REALM, "digest"),\r
-- new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
-- }\r
-- }\r
-- else if(type.Equals("ntlm"))\r
-- {\r
-- if(!proxyCredentials)\r
-- {\r
-- _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,\r
-- AuthScope.ANY_PORT, AuthScope.ANY_REALM, "ntlm"),\r
-- new NTCredentials(nc.UserName, nc.Password, host, domain));\r
-- }\r
-- else\r
-- {\r
-- _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,\r
-- AuthScope.ANY_PORT, AuthScope.ANY_REALM, "ntlm"),\r
-- new NTCredentials(nc.UserName, nc.Password, host, domain));\r
-- }\r
-- }\r
-- else\r
-- {\r
-- if(!proxyCredentials)\r
-- {\r
-- _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,\r
-- AuthScope.ANY_PORT, AuthScope.ANY_REALM, type),\r
-- new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
-- }\r
-- else\r
-- {\r
-- _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,\r
-- AuthScope.ANY_PORT, AuthScope.ANY_REALM, type),\r
-- new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
-- }\r
-- }\r
--\r
-- }\r
-- private void InitProxyCredentials()\r
-- {\r
-- if(this.Proxy == null)\r
-- return;\r
--\r
-- if(!(this.Proxy is WebProxy))\r
-- return;\r
-- \r
-- WebProxy proxy = (WebProxy)this.Proxy;\r
-- ICredentials creds = proxy.Credentials;\r
--\r
-- if(creds == null)\r
-- return;\r
--\r
-- if(creds is CredentialCache)\r
-- {\r
-- string type = "basic";\r
-- NetworkCredential nc = ((CredentialCache)creds).GetCredential(proxy.Address, "basic");\r
-- if(nc == null)\r
-- {\r
-- type = "digest";\r
-- nc = ((CredentialCache)creds).GetCredential(proxy.Address, "digest");\r
-- if(nc == null)\r
-- {\r
-- type = "ntlm";\r
-- nc = ((CredentialCache)creds).GetCredential(proxy.Address, "ntlm");\r
-- }\r
-- }\r
-- if(nc != null)\r
-- {\r
-- SetJavaCredential(nc, type, true);\r
-- }\r
-- }\r
-- else if (creds is NetworkCredential)\r
-- {\r
-- SetJavaCredential((NetworkCredential)creds, "any", true);\r
-- }\r
--\r
-- _method.setDoAuthentication(true);\r
-- }\r
--\r
-- private void InitCredentials()\r
-- {\r
-- if(_credentials == null)\r
-- return;\r
-- if(_credentials is CredentialCache)\r
-- {\r
-- NetworkCredential nc = ((CredentialCache)_credentials).GetCredential(GetOriginalAddress(), "basic");\r
-- string type = "basic";\r
-- if(nc == null)\r
-- {\r
-- nc = ((CredentialCache)_credentials).GetCredential(GetOriginalAddress(), "digest");\r
-- type = "digest";\r
-- if(nc == null)\r
-- {\r
-- nc = ((CredentialCache)_credentials).GetCredential(GetOriginalAddress(), "ntlm");\r
-- type = "ntlm";\r
-- }\r
-- }\r
-- if(nc != null)\r
-- {\r
-- SetJavaCredential(nc, type);\r
-- }\r
-- }\r
-- else if(_credentials is NetworkCredential)\r
-- {\r
-- SetJavaCredential((NetworkCredential)_credentials, "any");\r
-- }\r
--\r
-- _method.setDoAuthentication(true);\r
-- }\r
--\r
-- private void InitHostConfig()\r
-- {\r
-- if(this.Proxy == null)\r
-- return;\r
-- if(this.Proxy.IsBypassed(GetOriginalAddress()))\r
-- return;\r
--\r
-- _hostConfig = new HostConfiguration(); \r
-- _hostConfig.setHost(new HttpHost(_method.getURI()));\r
--\r
-- \r
-- if(this.Proxy is WebProxy)\r
-- {\r
-- WebProxy wp = (WebProxy) this.Proxy;\r
-- _hostConfig.setProxyHost(new ProxyHost(wp.Address.Host, wp.Address.Port));\r
-- }\r
-- else\r
-- throw new NotImplementedException("Cannot accept Proxy which is not System.Net.WebProxy instance");\r
--\r
-- \r
-- }\r
--\r
-- private void SetConnectionHeader(string val)\r
-- {\r
-- string connectionHeader = (this.Proxy != null) ? "Proxy-Connection" : "Connection";\r
-- Headers.RemoveInternal ((this.Proxy != null) ? "Proxy-Connection" : "Connection");\r
-- \r
-- if(val != null)\r
-- _method.setRequestHeader(connectionHeader, val);\r
--\r
-- if (_keepAlive) \r
-- {\r
-- _method.addRequestHeader (connectionHeader, "keep-alive");\r
-- Headers.SetInternal(connectionHeader,"keep-alive");\r
-- }\r
-- else if (!_keepAlive && _version == HttpVersion.Version11) \r
-- {\r
-- _method.addRequestHeader (connectionHeader, "close");\r
-- Headers.SetInternal(connectionHeader,"close");\r
-- }\r
--\r
-- }\r
-- private bool OpenConnection()\r
-- {\r
-- lock(this)\r
-- {\r
-- if(_isConnectionOpened)\r
-- return false;\r
-- _isConnectionOpened = true;\r
-- }\r
-- InitClient();\r
-- InitMethod();\r
--\r
-- _state = _stateCache.GetHttpState();\r
--\r
-- //todo insert needed Authontication, Cookies info to state!\r
-- _method.setDoAuthentication(this.PreAuthenticate);\r
-- \r
-- InitHostConfig();\r
-- InitCredentials();\r
-- InitProxyCredentials();\r
-- \r
-- if(this.ProtocolVersion == HttpVersion.Version11)\r
-- _method.getParams().setVersion(mainsoft.apache.commons.httpclient.HttpVersion.HTTP_1_1);\r
-- else if(ProtocolVersion == HttpVersion.Version10)\r
-- _method.getParams().setVersion(mainsoft.apache.commons.httpclient.HttpVersion.HTTP_1_0);\r
-- else \r
-- throw new ProtocolViolationException("Unsupported protocol version: " + ProtocolVersion);\r
--\r
-- if(!(_method is mainsoft.apache.commons.httpclient.methods.EntityEnclosingMethod))\r
-- {\r
-- _method.setFollowRedirects(this.AllowAutoRedirect);\r
-- }\r
-- else\r
-- {\r
-- if(!AllowWriteStreamBuffering && _contentLength < 0 && !SendChunked)\r
-- throw new ProtocolViolationException();\r
-- if(SendChunked)\r
-- ((EntityEnclosingMethod)_method).setContentChunked(SendChunked); \r
-- }\r
-- if(MaxAutoRedirections != _defaultMaxRedirectsNum)\r
-- {\r
-- _method.getParams().setParameter(HttpClientParams.MAX_REDIRECTS,\r
-- new java.lang.Integer(MaxAutoRedirections));\r
-- }\r
-- \r
-- \r
-- \r
-- foreach(string k in Headers)\r
-- { \r
-- if(k.ToLower().Equals("connection"))\r
-- continue;\r
-- string val = Headers[k];\r
-- val = (val == null) ? "" : val;\r
-- _method.setRequestHeader(k, val);\r
-- }\r
--\r
-- if (this.CookieContainer != null) \r
-- {
-- string cookieHeader = this.CookieContainer.GetCookieHeader (this.GetOriginalAddress());
-- if (cookieHeader != "")
-- _method.setRequestHeader("Cookie", cookieHeader);
-- }\r
-- SetConnectionHeader(Headers["Connection"]);\r
-- \r
-- _method.getParams().setSoTimeout(ReadWriteTimeout);\r
--\r
-- return true;\r
-- \r
-- }\r
--\r
-- private static void InitClient()\r
-- {\r
-- lock(LOCK_OBJECT)\r
-- {\r
-- if(_client == null)\r
-- {\r
-- mainsoft.apache.commons.httpclient.MultiThreadedHttpConnectionManager manager =\r
-- new mainsoft.apache.commons.httpclient.MultiThreadedHttpConnectionManager();\r
-- manager.setConnectionStaleCheckingEnabled(true);\r
-- manager.setMaxTotalConnections(200);\r
-- //by some reasons RFC something - the default \r
-- //value will be 2 , so we need to change it ...\r
-- manager.setMaxConnectionsPerHost(20);\r
-- _client = new HttpClient(manager);\r
-- _client.getParams().setIntParameter(HttpClientParams.MAX_REDIRECTS, _defaultMaxRedirectsNum);\r
-- _client.getParams().setParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, new java.lang.Boolean(true));\r
-- _client.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, new java.lang.Long(30000));\r
-- _client.getParams().setParameter(HttpClientParams.USER_AGENT, \r
-- "VMW4J HttpClient (based on Jakarta Commons HttpClient)");\r
-- }\r
-- }\r
-- }\r
--\r
-- private void InitMethod()\r
-- {\r
-- lock(this)\r
-- {\r
-- if(_method == null)\r
-- {\r
-- string uriString = this.GetOriginalAddress().AbsoluteUri;\r
--\r
-- if(this.MethodName == null || this.MethodName == "")\r
-- {\r
-- this.MethodName = "GET";\r
-- }\r
-- \r
-- string name = this.MethodName.ToUpper().Trim();\r
--\r
-- switch(name)\r
-- {\r
-- case "GET" : _method = new GetMethod(uriString); break;\r
-- case "PUT" : _method = new PutMethod(uriString); break;\r
-- case "POST": _method = new PostMethod(uriString); break;\r
-- case "HEAD": _method = new HeadMethod(uriString); break;\r
-- case "TRACE": _method = new TraceMethod(uriString);break;\r
-- case "DELETE": _method = new DeleteMethod(uriString);break;\r
-- case "OPTIONS": _method = new OptionsMethod(uriString);break;\r
-- default: _method = new GenericMethod(uriString, MethodName); break;\r
-- }\r
-- }\r
-- }\r
-- }\r
--\r
-- private void InitHostConfiguration()\r
-- {\r
-- lock(this)\r
-- {\r
-- if(_hostConfig == null)\r
-- {\r
-- _hostConfig = new HostConfiguration();\r
-- }\r
-- }\r
-- }\r
--\r
-- \r
--\r
-- public override Stream GetRequestStream()\r
-- {\r
-- bool isPutPost = String.Compare("post", MethodName, true) == 0 \r
-- || String.Compare("put", MethodName, true) == 0;\r
-- if(!isPutPost)\r
-- throw new ProtocolViolationException();\r
-- lock(this)\r
-- {\r
-- if(_writeStream != null)\r
-- return _writeStream;\r
-- this.OpenConnection();\r
--\r
-- //java.io.PipedInputStream inJavaStream = new java.io.PipedInputStream();\r
-- //java.io.PipedOutputStream outJavaStream = new java.io.PipedOutputStream(inJavaStream);\r
-- \r
-- long contLen = _contentLength;\r
-- \r
-- OutputStreamRequestEntity reqEntity = new OutputStreamRequestEntity(contLen);\r
--\r
-- _writeStream = new VMWRequestStream(reqEntity, contLen);\r
-- \r
-- EntityEnclosingMethod method = (EntityEnclosingMethod)_method;\r
-- if(AllowWriteStreamBuffering )\r
-- method.setRequestEntity(reqEntity);\r
-- else if(!AllowWriteStreamBuffering && contLen < 0 && !SendChunked)\r
-- throw new ProtocolViolationException();\r
-- else\r
-- method.setRequestEntity(reqEntity);\r
-- \r
-- _hasRequest = true;\r
-- return _writeStream;\r
-- }\r
-- }\r
-- private bool isRedirectNeeded(HttpMethod method)\r
-- {\r
-- switch (method.getStatusCode()) \r
-- {\r
-- case 302:\r
-- case 301:\r
-- case 303:\r
-- case 307:\r
-- if (method.getFollowRedirects()) \r
-- return true;\r
-- else \r
-- return false;\r
-- default:\r
-- return false;\r
-- } //end of switch\r
-- }\r
--\r
-- private void synchHeaders()\r
-- {\r
-- foreach(string k in Headers)\r
-- { \r
-- if(k.ToLower().Equals("connection"))\r
-- continue;\r
-- string val = Headers[k];\r
-- val = (val == null) ? "" : val;\r
-- _method.setRequestHeader(k, val);\r
-- }\r
-- }\r
--\r
-- public override WebResponse GetResponse()\r
-- {\r
-- lock(this)\r
-- {\r
-- if(!_isConnectionOpened)\r
-- OpenConnection();\r
-- if(_response == null)\r
-- {\r
-- try\r
-- { \r
-- synchHeaders();\r
-- _client.executeMethod(_hostConfig, _method, _state);\r
-- //todo right place to re-put all headers again...\r
-- mainsoft.apache.commons.httpclient.Header hostHeader =\r
-- _method.getRequestHeader("Host");\r
-- if(hostHeader != null)\r
-- Headers.SetInternal("Host", hostHeader.getValue());\r
--\r
-- _response = new HttpWebResponse(_method, _state, _stateCache, GetAddress(), this.MethodName);\r
-- \r
-- if(_response != null && \r
-- _response.Cookies != null && \r
-- _response.Cookies.Count > 0)\r
-- {\r
-- if(CookieContainer != null)\r
-- {\r
-- foreach(Cookie cooky in _response.Cookies)\r
-- {\r
-- CookieContainer.Add(GetAddress(), cooky);\r
-- }\r
-- }\r
-- }\r
--\r
-- _hasResponse = true;\r
-- int respCodeAsInt = (int) _response.StatusCode;\r
-- if(respCodeAsInt >= 400)\r
-- {\r
-- // The WebException contains the readable (not closed) response stream.\r
-- // So, in case of WebException, we should read all data from the \r
-- // network response stream into the memory stream, and after that\r
-- // close the underlying network stream. The following requests to read\r
-- // from the stream will actually read from the memory stream.\r
-- // So, the this.Abort() should not be called in this case.\r
-- _response.ReadAllAndClose();\r
-- //this.Abort();\r
-- throw new WebException("The remote server returned an error: (" + respCodeAsInt +") " +_response.StatusCode, null, WebExceptionStatus.ProtocolError, _response);\r
-- }\r
-- if(isRedirectNeeded(_method) && _method.getResponseHeader("location") == null)\r
-- {\r
-- // See comments above for the error >= 400\r
-- _response.ReadAllAndClose();\r
-- //this.Abort();\r
-- throw new WebException("Got response code "+_response.StatusCode+", but no location provided", null, WebExceptionStatus.ProtocolError, _response);\r
-- }\r
-- }\r
-- catch(ProtocolException e)\r
-- {\r
-- throw new WebException("", e);\r
-- }\r
-- catch(java.net.ConnectException e)\r
-- {\r
-- throw new WebException("Unable to connect to the remote server.", e);\r
-- }\r
-- catch(java.net.SocketTimeoutException e)\r
-- {\r
-- throw new WebException("Timeout exceeded", e);\r
-- }\r
-- catch(java.io.IOException e)\r
-- {\r
-- throw new WebException("", e);\r
-- }\r
-- }\r
-- return _response;\r
-- }\r
--\r
-- }\r
--\r
-- public override void Abort()\r
-- {\r
-- _isAborted = true;\r
-- try\r
-- {\r
-- if(_hasResponse)\r
-- {\r
-- _response.Close();\r
-- }\r
-- }\r
-- finally\r
-- {\r
-- _method.releaseConnection(); \r
-- }\r
-- }\r
--\r
-- public override IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state)\r
-- {\r
-- lock(this)\r
-- {\r
-- if(_asyncWrite != null)\r
-- {\r
-- throw new InvalidOperationException ("Cannot re-call start of asynchronous " +
-- "method while a previous call is still in progress.");
-- }
--
-- _asyncWrite = new GHWebAsyncResult (this, callback, state);
-- if (_hasRequest)
-- {
-- if (_writeStream != null)
-- {
-- _asyncWrite.SetCompleted (true, _writeStream);
-- _asyncWrite.DoCallback ();
-- return _asyncWrite;
-- }\r
-- }\r
-- \r
-- \r
-- try\r
-- {\r
-- this.GetRequestStream(); \r
-- }\r
-- catch(Exception e)\r
-- {\r
-- _asyncWrite.SetCompleted(false, e);\r
-- }\r
--\r
-- _asyncWrite.SetCompleted (true, _writeStream);
-- _asyncWrite.DoCallback ();
-- return _asyncWrite;\r
-- \r
-- }\r
-- } \r
--\r
-- public override Stream EndGetRequestStream(IAsyncResult asyncResult)\r
-- {\r
-- if (asyncResult == null)
-- throw new ArgumentNullException ("asyncResult");
--
-- GHWebAsyncResult result = asyncResult as GHWebAsyncResult;
-- if (result == null)
-- throw new ArgumentException ("Invalid IAsyncResult");
--
-- _asyncWrite = result;
--
-- result.WaitUntilComplete ();
--
-- Exception e = result.Exception;
--
-- if (e != null)
-- throw e;
--
-- return result.WriteStream;\r
-- }\r
--\r
-- public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state)\r
-- {\r
-- lock(this)\r
-- {\r
-- if(_asyncRead != null && !_hasResponse)\r
-- {\r
-- throw new InvalidOperationException ("Cannot re-call start of asynchronous " +
-- "method while a previous call is still in progress.");
-- }
--
-- _asyncRead = new GHWebAsyncResult (this, callback, state);
-- if (_hasResponse)
-- {
-- if (_response != null)
-- {
-- _asyncRead.SetCompleted (true, _writeStream);
-- _asyncRead.DoCallback ();
-- return _asyncRead;
-- }\r
-- }\r
-- \r
--\r
-- try\r
-- {\r
-- GetResponse();\r
-- }\r
-- catch(Exception e)\r
-- {\r
-- _asyncRead.SetCompleted(false, e);\r
-- }
-- _asyncRead.SetCompleted (true, _writeStream);
-- _asyncRead.DoCallback ();
-- return _asyncRead;\r
-- \r
-- }\r
-- }\r
--\r
-- public override WebResponse EndGetResponse(IAsyncResult asyncResult)\r
-- {\r
-- if (asyncResult == null)
-- throw new ArgumentNullException ("asyncResult");
--
-- GHWebAsyncResult result = asyncResult as GHWebAsyncResult;
-- if (result == null)
-- throw new ArgumentException ("Invalid IAsyncResult", "asyncResult");
--
--
-- _asyncRead = result;
-- if (!result.WaitUntilComplete (_timeout, false)) \r
-- {
-- Abort ();
-- throw new WebException("The request timed out", WebExceptionStatus.Timeout);
-- }
--
-- return result.Response;\r
-- }\r
--\r
--\r
--\r
--\r
--\r
--\r
--\r
-- \r
--\r
--\r
--\r
--\r
-- #region VMWRequestStream class\r
-- internal class VMWRequestStream : Stream, IDisposable\r
-- {\r
--\r
-- private java.io.OutputStream _javaOutput;\r
-- private long _len;\r
-- private long _contentLength;\r
--\r
-- internal VMWRequestStream (java.io.OutputStream stream) :\r
-- this(stream , -1L)\r
-- {\r
-- }\r
--\r
-- internal VMWRequestStream (java.io.OutputStream stream, long contentLength)\r
-- {\r
-- _javaOutput = stream;\r
-- _contentLength = contentLength;\r
-- _len = 0;\r
-- }\r
-- public override bool CanRead\r
-- {\r
-- get {return false;}\r
-- }\r
--\r
-- public override bool CanWrite\r
-- {\r
-- get{return true;}\r
-- }\r
--\r
-- public override bool CanSeek\r
-- {\r
-- get { return false;}\r
-- }\r
--\r
-- public override long Length\r
-- {\r
-- get{ return _len;}\r
-- }\r
--\r
-- public override long Position\r
-- {\r
-- get\r
-- {\r
-- return _len;\r
-- }\r
--\r
-- set\r
-- {\r
-- throw new NotSupportedException();\r
-- }\r
-- }\r
--\r
-- private volatile bool _closed = false;\r
--\r
-- public override void Close()\r
-- {\r
-- if(!_closed)\r
-- {\r
-- lock(this)\r
-- {\r
-- if(!_closed)\r
-- {\r
-- _closed = true;\r
-- _javaOutput.flush();\r
-- _javaOutput.close();\r
-- }\r
-- }\r
-- }\r
-- }\r
--\r
-- public override void Flush()\r
-- {\r
-- _javaOutput.flush();\r
-- }\r
--\r
-- public override int ReadByte()\r
-- {\r
-- throw new NotSupportedException();\r
-- }\r
--\r
-- public override int Read(byte[] buffer, int offset, int count)\r
-- {\r
-- throw new NotSupportedException();\r
-- }\r
--\r
-- public override void Write(byte[] buffer, int offset, int count)\r
-- {\r
-- if(_contentLength >= 0)\r
-- {\r
-- _len += count;\r
-- if(_len > _contentLength)\r
-- {\r
-- throw new System.Net.ProtocolViolationException(\r
-- "Bytes to be written to the stream exceed Content-Length bytes size specified.");\r
-- }\r
-- }\r
-- _javaOutput.write(vmw.common.TypeUtils.ToSByteArray(buffer), offset, count);\r
--\r
-- if(_contentLength == _len)\r
-- {\r
-- _javaOutput.flush();\r
-- _javaOutput.close();\r
-- }\r
-- }\r
--\r
-- public override long Seek(long offset, SeekOrigin origin)\r
-- {\r
-- throw new NotSupportedException();\r
-- }\r
--\r
-- public override void SetLength(long length)\r
-- {\r
-- throw new NotSupportedException();\r
-- }\r
--\r
-- void IDisposable.Dispose()\r
-- {\r
-- try\r
-- {\r
-- Close();\r
-- }\r
-- catch(Exception)\r
-- {\r
-- }\r
-- }\r
-- }\r
-- \r
-- #endregion\r
--\r
-- #region GHWebAsyncResult\r
-- internal class GHWebAsyncResult : IAsyncResult\r
-- {\r
-- private object _state;\r
-- private AsyncCallback _callback;\r
-- private ManualResetEvent _handle;\r
-- private bool _isCompleted = false;\r
-- private bool _callbackDone;\r
-- private Stream _writeStream;\r
-- private HttpProvider _provider;\r
--\r
-- private Exception _exception;\r
--\r
-- #region Constructors\r
--\r
-- public GHWebAsyncResult(HttpProvider provider, \r
-- AsyncCallback callback, object state) : \r
-- this(state, callback)\r
-- {\r
-- _provider = provider;\r
-- }\r
--\r
-- public GHWebAsyncResult(object state, AsyncCallback callback)\r
-- {\r
-- _state = state;\r
-- _callback = callback;\r
-- }\r
-- #endregion\r
--\r
-- #region IAsyncResult Members\r
--\r
-- public object AsyncState\r
-- {\r
-- get\r
-- {\r
-- return _state;\r
-- }\r
-- }\r
--\r
-- public bool CompletedSynchronously\r
-- {\r
-- get\r
-- {\r
-- // TODO: Add HWebAsyncResult.CompletedSynchronously getter implementation\r
-- return false;\r
-- }\r
-- }\r
--\r
-- public WaitHandle AsyncWaitHandle \r
-- {
-- get \r
-- {
-- if (_handle == null) \r
-- {
-- lock (this) \r
-- {
-- if (_handle == null)
-- _handle = new ManualResetEvent (_isCompleted);
-- }
-- }
--
-- return _handle;
-- }
-- }\r
--\r
-- public bool IsCompleted\r
-- {\r
-- get\r
-- {\r
-- return _isCompleted; \r
-- }\r
-- }\r
--\r
-- #endregion\r
--\r
-- #region Internal Properties\r
--\r
-- internal Stream WriteStream\r
-- {\r
-- get\r
-- {\r
-- return _writeStream;\r
-- }\r
-- }\r
--\r
-- internal Exception Exception\r
-- {\r
-- get\r
-- {\r
-- return _exception;\r
-- }\r
-- }\r
--\r
-- internal HttpWebResponse Response\r
-- {\r
-- get\r
-- {\r
-- return ((VMWHttpProvider)_provider)._response;\r
-- }\r
-- }\r
--\r
-- #endregion\r
--\r
-- #region Internal Methods\r
--\r
-- internal void SetCompleted(bool res, Stream writeStream)\r
-- {\r
-- _isCompleted = res;\r
-- _writeStream = writeStream;\r
-- ((ManualResetEvent) AsyncWaitHandle).Set ();\r
-- }\r
--\r
-- internal void SetCompleted(bool res, Exception exc)\r
-- {\r
-- _isCompleted = res;\r
-- _exception = exc;\r
-- ((ManualResetEvent) AsyncWaitHandle).Set ();\r
-- }\r
--\r
-- internal void DoCallback()\r
-- {\r
-- if (!_callbackDone && _callback != null) \r
-- {
-- _callbackDone = true;
-- _callback (this);
-- }\r
-- }\r
--\r
-- internal void WaitUntilComplete()\r
-- {\r
-- if(_isCompleted)\r
-- return;\r
-- AsyncWaitHandle.WaitOne ();\r
-- }\r
--\r
-- internal bool WaitUntilComplete (int timeout, bool exitContext)
-- {
-- if (_isCompleted)
-- return true;
--
-- return AsyncWaitHandle.WaitOne (timeout, exitContext);
-- }\r
-- #endregion\r
--\r
-- }\r
--\r
-- #endregion\r
--\r
-- #region OutputStreamRequestEntity\r
--\r
-- internal class OutputStreamRequestEntity : java.io.OutputStream, RequestEntity\r
-- {\r
-- private long _contentLength;\r
-- private java.io.ByteArrayOutputStream _out;\r
-- private sbyte[] _buffer;\r
--\r
-- internal OutputStreamRequestEntity(): this(-1)\r
-- {\r
-- }\r
--\r
-- internal OutputStreamRequestEntity(long length)\r
-- {\r
-- _contentLength = length;\r
-- int tmp = (int) _contentLength;\r
--\r
-- if(tmp <=0)\r
-- tmp = 4096;\r
-- _out = new java.io.ByteArrayOutputStream(tmp);\r
-- }\r
--\r
-- #region RequestEntity Members\r
--\r
-- public bool isRepeatable()\r
-- {\r
-- return ((_out != null) || (_buffer != null));\r
-- }\r
--\r
-- public long getContentLength()\r
-- {\r
-- if(_out != null)\r
-- {\r
-- _buffer = _out.toByteArray();\r
-- }\r
-- if(_buffer != null)\r
-- {\r
-- _contentLength = _buffer.Length;\r
-- _out = null;\r
-- }\r
-- return _contentLength;\r
-- }\r
--\r
-- public void writeRequest(java.io.OutputStream output)\r
-- {\r
-- if(_out != null)\r
-- _buffer = _out.toByteArray();\r
-- if(_buffer != null)\r
-- {\r
-- output.write(_buffer, 0, _buffer.Length);\r
-- _out = null;\r
-- }\r
-- else throw new ApplicationException();\r
-- }\r
--\r
-- public string getContentType()\r
-- {\r
-- return null;\r
-- }\r
--\r
-- #endregion\r
--\r
-- public override void write(int i)\r
-- {\r
-- _out.write(i);\r
-- }\r
--\r
-- }\r
--\r
-- #endregion\r
--\r
--\r
--\r
--\r
--\r
--\r
--\r
-- }\r
--}\r
--- /dev/null
--- /dev/null
++using System;\r
++using System.IO;\r
++using System.Threading;\r
++\r
++using mainsoft.apache.commons.httpclient;\r
++using mainsoft.apache.commons.httpclient.methods;\r
++using mainsoft.apache.commons.httpclient.@params;\r
++using mainsoft.apache.commons.httpclient.auth;\r
++\r
++namespace System.Net\r
++{\r
++ /// <summary>\r
++ /// Summary description for VMWHttpProvider.\r
++ /// </summary>\r
++ internal class VMWHttpProvider : HttpProvider\r
++ {\r
++ protected static HttpClient _client; //todo init it in static constructor\r
++ protected static HttpStateCache _stateCache = new HttpStateCache();\r
++\r
++ protected static object LOCK_OBJECT = new object();\r
++ \r
++ \r
++\r
++ protected HttpMethod _method;\r
++ protected HttpState _state;\r
++ protected HostConfiguration _hostConfig;\r
++ \r
++ protected HttpWebResponse _response;\r
++ protected bool _hasResponse;\r
++ protected bool _hasRequest;\r
++ protected Stream _writeStream;\r
++ private GHWebAsyncResult _asyncWrite;\r
++ private GHWebAsyncResult _asyncRead;\r
++\r
++ private bool _isConnectionOpened;\r
++ \r
++ static VMWHttpProvider()\r
++ {\r
++ if(java.lang.System.getProperty("mainsoft.apache.commons.logging.Log") == null)\r
++ java.lang.System.setProperty("mainsoft.apache.commons.logging.Log",\r
++ "mainsoft.apache.commons.logging.impl.SimpleLog");\r
++ if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.showdatetime") == null)\r
++ java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.showdatetime",\r
++ "true");\r
++ if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire") == null)\r
++ java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire",\r
++ "error");\r
++ if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.mainsoft.apache.commons.httpclient")\r
++ == null)\r
++ java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.mainsoft.apache.commons.httpclient",\r
++ "error");\r
++ if(java.lang.System.getProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire.header")\r
++ == null)\r
++ java.lang.System.setProperty("mainsoft.apache.commons.logging.simplelog.log.httpclient.wire.header", \r
++ "error");\r
++\r
++ }\r
++ public VMWHttpProvider(Uri uri) : base (uri)\r
++ {\r
++ }\r
++\r
++ internal override ServicePoint ServicePoint\r
++ {\r
++ get {throw new NotImplementedException();}\r
++ }\r
++\r
++\r
++\r
++ public override bool IsRequestStarted()\r
++ {\r
++ if(_method == null)\r
++ return false;\r
++ return _method.isRequestSent();\r
++ }\r
++\r
++ public override Uri GetAddress()\r
++ {\r
++ if(_method == null)\r
++ return GetOriginalAddress();\r
++ mainsoft.apache.commons.httpclient.URI javaURI = _method.getURI();\r
++ return new Uri(javaURI.ToString());\r
++ }\r
++\r
++ public override bool IsHaveResponse()\r
++ {\r
++ return _hasResponse;\r
++ }\r
++\r
++ private void SetJavaCredential(NetworkCredential nc, string type)\r
++ {\r
++ SetJavaCredential(nc, type, false);\r
++ }\r
++\r
++ private void SetJavaCredential(NetworkCredential nc, string type, bool proxyCredentials)\r
++ {\r
++ type = type.ToLower();\r
++ string host = null;\r
++ \r
++ if(!proxyCredentials)\r
++ host = GetOriginalAddress().Host;\r
++ else\r
++ host = ((WebProxy)this.Proxy).Address.Host;\r
++\r
++ string domain = (nc.Domain == null) ? host : nc.Domain;\r
++\r
++ if(type.Equals("any"))\r
++ {\r
++ if(!proxyCredentials)\r
++ {\r
++ _state.setCredentials(AuthScope.ANY,\r
++ new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
++ _state.setCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "Ntlm"),\r
++ new NTCredentials(nc.UserName, nc.Password, host, domain));\r
++ }\r
++ else\r
++ {\r
++ _state.setProxyCredentials(AuthScope.ANY,\r
++ new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
++ _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "Ntlm"),\r
++ new NTCredentials(nc.UserName, nc.Password, host, domain));\r
++ }\r
++ }\r
++ else if(type.Equals("basic"))\r
++ {\r
++ if(!proxyCredentials)\r
++ {\r
++ _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,\r
++ AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),\r
++ new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
++ }\r
++ else\r
++ {\r
++ _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,\r
++ AuthScope.ANY_PORT, AuthScope.ANY_REALM, "basic"),\r
++ new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
++ }\r
++ }\r
++ else if(type.Equals("digest"))\r
++ {\r
++ if(!proxyCredentials)\r
++ {\r
++ _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,\r
++ AuthScope.ANY_PORT, AuthScope.ANY_REALM, "digest"),\r
++ new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
++ }\r
++ else\r
++ {\r
++ _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,\r
++ AuthScope.ANY_PORT, AuthScope.ANY_REALM, "digest"),\r
++ new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
++ }\r
++ }\r
++ else if(type.Equals("ntlm"))\r
++ {\r
++ if(!proxyCredentials)\r
++ {\r
++ _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,\r
++ AuthScope.ANY_PORT, AuthScope.ANY_REALM, "ntlm"),\r
++ new NTCredentials(nc.UserName, nc.Password, host, domain));\r
++ }\r
++ else\r
++ {\r
++ _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,\r
++ AuthScope.ANY_PORT, AuthScope.ANY_REALM, "ntlm"),\r
++ new NTCredentials(nc.UserName, nc.Password, host, domain));\r
++ }\r
++ }\r
++ else\r
++ {\r
++ if(!proxyCredentials)\r
++ {\r
++ _state.setCredentials(new AuthScope(AuthScope.ANY_HOST,\r
++ AuthScope.ANY_PORT, AuthScope.ANY_REALM, type),\r
++ new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
++ }\r
++ else\r
++ {\r
++ _state.setProxyCredentials(new AuthScope(AuthScope.ANY_HOST,\r
++ AuthScope.ANY_PORT, AuthScope.ANY_REALM, type),\r
++ new UsernamePasswordCredentials(nc.UserName, nc.Password));\r
++ }\r
++ }\r
++\r
++ }\r
++ private void InitProxyCredentials()\r
++ {\r
++ if(this.Proxy == null)\r
++ return;\r
++\r
++ if(!(this.Proxy is WebProxy))\r
++ return;\r
++ \r
++ WebProxy proxy = (WebProxy)this.Proxy;\r
++ ICredentials creds = proxy.Credentials;\r
++\r
++ if(creds == null)\r
++ return;\r
++\r
++ if(creds is CredentialCache)\r
++ {\r
++ string type = "basic";\r
++ NetworkCredential nc = ((CredentialCache)creds).GetCredential(proxy.Address, "basic");\r
++ if(nc == null)\r
++ {\r
++ type = "digest";\r
++ nc = ((CredentialCache)creds).GetCredential(proxy.Address, "digest");\r
++ if(nc == null)\r
++ {\r
++ type = "ntlm";\r
++ nc = ((CredentialCache)creds).GetCredential(proxy.Address, "ntlm");\r
++ }\r
++ }\r
++ if(nc != null)\r
++ {\r
++ SetJavaCredential(nc, type, true);\r
++ }\r
++ }\r
++ else if (creds is NetworkCredential)\r
++ {\r
++ SetJavaCredential((NetworkCredential)creds, "any", true);\r
++ }\r
++\r
++ _method.setDoAuthentication(true);\r
++ }\r
++\r
++ private void InitCredentials()\r
++ {\r
++ if(_credentials == null)\r
++ return;\r
++ if(_credentials is CredentialCache)\r
++ {\r
++ NetworkCredential nc = ((CredentialCache)_credentials).GetCredential(GetOriginalAddress(), "basic");\r
++ string type = "basic";\r
++ if(nc == null)\r
++ {\r
++ nc = ((CredentialCache)_credentials).GetCredential(GetOriginalAddress(), "digest");\r
++ type = "digest";\r
++ if(nc == null)\r
++ {\r
++ nc = ((CredentialCache)_credentials).GetCredential(GetOriginalAddress(), "ntlm");\r
++ type = "ntlm";\r
++ }\r
++ }\r
++ if(nc != null)\r
++ {\r
++ SetJavaCredential(nc, type);\r
++ }\r
++ }\r
++ else if(_credentials is NetworkCredential)\r
++ {\r
++ SetJavaCredential((NetworkCredential)_credentials, "any");\r
++ }\r
++\r
++ _method.setDoAuthentication(true);\r
++ }\r
++\r
++ private void InitHostConfig()\r
++ {\r
++ if(this.Proxy == null)\r
++ return;\r
++ if(this.Proxy.IsBypassed(GetOriginalAddress()))\r
++ return;\r
++\r
++ _hostConfig = new HostConfiguration(); \r
++ _hostConfig.setHost(new HttpHost(_method.getURI()));\r
++\r
++ \r
++ if(this.Proxy is WebProxy)\r
++ {\r
++ WebProxy wp = (WebProxy) this.Proxy;\r
++ _hostConfig.setProxyHost(new ProxyHost(wp.Address.Host, wp.Address.Port));\r
++ }\r
++ else\r
++ throw new NotImplementedException("Cannot accept Proxy which is not System.Net.WebProxy instance");\r
++\r
++ \r
++ }\r
++\r
++ private void SetConnectionHeader(string val)\r
++ {\r
++ string connectionHeader = (this.Proxy != null) ? "Proxy-Connection" : "Connection";\r
++ Headers.RemoveInternal ((this.Proxy != null) ? "Proxy-Connection" : "Connection");\r
++ \r
++ if(val != null)\r
++ _method.setRequestHeader(connectionHeader, val);\r
++\r
++ if (_keepAlive) \r
++ {\r
++ _method.addRequestHeader (connectionHeader, "keep-alive");\r
++ Headers.SetInternal(connectionHeader,"keep-alive");\r
++ }\r
++ else if (!_keepAlive && _version == HttpVersion.Version11) \r
++ {\r
++ _method.addRequestHeader (connectionHeader, "close");\r
++ Headers.SetInternal(connectionHeader,"close");\r
++ }\r
++\r
++ }\r
++ private bool OpenConnection()\r
++ {\r
++ lock(this)\r
++ {\r
++ if(_isConnectionOpened)\r
++ return false;\r
++ _isConnectionOpened = true;\r
++ }\r
++ InitClient();\r
++ InitMethod();\r
++\r
++ _state = _stateCache.GetHttpState();\r
++\r
++ //todo insert needed Authontication, Cookies info to state!\r
++ _method.setDoAuthentication(this.PreAuthenticate);\r
++ \r
++ InitHostConfig();\r
++ InitCredentials();\r
++ InitProxyCredentials();\r
++ \r
++ if(this.ProtocolVersion == HttpVersion.Version11)\r
++ _method.getParams().setVersion(mainsoft.apache.commons.httpclient.HttpVersion.HTTP_1_1);\r
++ else if(ProtocolVersion == HttpVersion.Version10)\r
++ _method.getParams().setVersion(mainsoft.apache.commons.httpclient.HttpVersion.HTTP_1_0);\r
++ else \r
++ throw new ProtocolViolationException("Unsupported protocol version: " + ProtocolVersion);\r
++\r
++ if(!(_method is mainsoft.apache.commons.httpclient.methods.EntityEnclosingMethod))\r
++ {\r
++ _method.setFollowRedirects(this.AllowAutoRedirect);\r
++ }\r
++ else\r
++ {\r
++ if(!AllowWriteStreamBuffering && _contentLength < 0 && !SendChunked)\r
++ throw new ProtocolViolationException();\r
++ if(SendChunked)\r
++ ((EntityEnclosingMethod)_method).setContentChunked(SendChunked); \r
++ }\r
++ if(MaxAutoRedirections != _defaultMaxRedirectsNum)\r
++ {\r
++ _method.getParams().setParameter(HttpClientParams.MAX_REDIRECTS,\r
++ new java.lang.Integer(MaxAutoRedirections));\r
++ }\r
++ \r
++ \r
++ \r
++ foreach(string k in Headers)\r
++ { \r
++ if(k.ToLower().Equals("connection"))\r
++ continue;\r
++ string val = Headers[k];\r
++ val = (val == null) ? "" : val;\r
++ _method.setRequestHeader(k, val);\r
++ }\r
++\r
++ if (this.CookieContainer != null) \r
++ {
++ string cookieHeader = this.CookieContainer.GetCookieHeader (this.GetOriginalAddress());
++ if (cookieHeader != "")
++ _method.setRequestHeader("Cookie", cookieHeader);
++ }\r
++ SetConnectionHeader(Headers["Connection"]);\r
++ \r
++ _method.getParams().setSoTimeout(ReadWriteTimeout);\r
++\r
++ return true;\r
++ \r
++ }\r
++\r
++ private static void InitClient()\r
++ {\r
++ lock(LOCK_OBJECT)\r
++ {\r
++ if(_client == null)\r
++ {\r
++ mainsoft.apache.commons.httpclient.MultiThreadedHttpConnectionManager manager =\r
++ new mainsoft.apache.commons.httpclient.MultiThreadedHttpConnectionManager();\r
++ manager.setConnectionStaleCheckingEnabled(true);\r
++ manager.setMaxTotalConnections(200);\r
++ //by some reasons RFC something - the default \r
++ //value will be 2 , so we need to change it ...\r
++ manager.setMaxConnectionsPerHost(20);\r
++ _client = new HttpClient(manager);\r
++ _client.getParams().setIntParameter(HttpClientParams.MAX_REDIRECTS, _defaultMaxRedirectsNum);\r
++ _client.getParams().setParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, new java.lang.Boolean(true));\r
++ _client.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, new java.lang.Long(30000));\r
++ _client.getParams().setParameter(HttpClientParams.USER_AGENT, \r
++ "VMW4J HttpClient (based on Jakarta Commons HttpClient)");\r
++ }\r
++ }\r
++ }\r
++\r
++ private void InitMethod()\r
++ {\r
++ lock(this)\r
++ {\r
++ if(_method == null)\r
++ {\r
++ string uriString = this.GetOriginalAddress().AbsoluteUri;\r
++\r
++ if(this.MethodName == null || this.MethodName == "")\r
++ {\r
++ this.MethodName = "GET";\r
++ }\r
++ \r
++ string name = this.MethodName.ToUpper().Trim();\r
++\r
++ switch(name)\r
++ {\r
++ case "GET" : _method = new GetMethod(uriString); break;\r
++ case "PUT" : _method = new PutMethod(uriString); break;\r
++ case "POST": _method = new PostMethod(uriString); break;\r
++ case "HEAD": _method = new HeadMethod(uriString); break;\r
++ case "TRACE": _method = new TraceMethod(uriString);break;\r
++ case "DELETE": _method = new DeleteMethod(uriString);break;\r
++ case "OPTIONS": _method = new OptionsMethod(uriString);break;\r
++ default: _method = new GenericMethod(uriString, MethodName); break;\r
++ }\r
++ }\r
++ }\r
++ }\r
++\r
++ private void InitHostConfiguration()\r
++ {\r
++ lock(this)\r
++ {\r
++ if(_hostConfig == null)\r
++ {\r
++ _hostConfig = new HostConfiguration();\r
++ }\r
++ }\r
++ }\r
++\r
++ \r
++\r
++ public override Stream GetRequestStream()\r
++ {\r
++ bool isPutPost = String.Compare("post", MethodName, true) == 0 \r
++ || String.Compare("put", MethodName, true) == 0;\r
++ if(!isPutPost)\r
++ throw new ProtocolViolationException();\r
++ lock(this)\r
++ {\r
++ if(_writeStream != null)\r
++ return _writeStream;\r
++ this.OpenConnection();\r
++\r
++ //java.io.PipedInputStream inJavaStream = new java.io.PipedInputStream();\r
++ //java.io.PipedOutputStream outJavaStream = new java.io.PipedOutputStream(inJavaStream);\r
++ \r
++ long contLen = _contentLength;\r
++ \r
++ OutputStreamRequestEntity reqEntity = new OutputStreamRequestEntity(contLen);\r
++\r
++ _writeStream = new VMWRequestStream(reqEntity, contLen);\r
++ \r
++ EntityEnclosingMethod method = (EntityEnclosingMethod)_method;\r
++ if(AllowWriteStreamBuffering )\r
++ method.setRequestEntity(reqEntity);\r
++ else if(!AllowWriteStreamBuffering && contLen < 0 && !SendChunked)\r
++ throw new ProtocolViolationException();\r
++ else\r
++ method.setRequestEntity(reqEntity);\r
++ \r
++ _hasRequest = true;\r
++ return _writeStream;\r
++ }\r
++ }\r
++ private bool isRedirectNeeded(HttpMethod method)\r
++ {\r
++ switch (method.getStatusCode()) \r
++ {\r
++ case 302:\r
++ case 301:\r
++ case 303:\r
++ case 307:\r
++ if (method.getFollowRedirects()) \r
++ return true;\r
++ else \r
++ return false;\r
++ default:\r
++ return false;\r
++ } //end of switch\r
++ }\r
++\r
++ private void synchHeaders()\r
++ {\r
++ foreach(string k in Headers)\r
++ { \r
++ if(k.ToLower().Equals("connection"))\r
++ continue;\r
++ string val = Headers[k];\r
++ val = (val == null) ? "" : val;\r
++ _method.setRequestHeader(k, val);\r
++ }\r
++ }\r
++\r
++ public override WebResponse GetResponse()\r
++ {\r
++ lock(this)\r
++ {\r
++ if(!_isConnectionOpened)\r
++ OpenConnection();\r
++ if(_response == null)\r
++ {\r
++ try\r
++ { \r
++ synchHeaders();\r
++ _client.executeMethod(_hostConfig, _method, _state);\r
++ //todo right place to re-put all headers again...\r
++ mainsoft.apache.commons.httpclient.Header hostHeader =\r
++ _method.getRequestHeader("Host");\r
++ if(hostHeader != null)\r
++ Headers.SetInternal("Host", hostHeader.getValue());\r
++\r
++ _response = new HttpWebResponse(_method, _state, _stateCache, GetAddress(), this.MethodName);\r
++ \r
++ if(_response != null && \r
++ _response.Cookies != null && \r
++ _response.Cookies.Count > 0)\r
++ {\r
++ if(CookieContainer != null)\r
++ {\r
++ foreach(Cookie cooky in _response.Cookies)\r
++ {\r
++ CookieContainer.Add(GetAddress(), cooky);\r
++ }\r
++ }\r
++ }\r
++\r
++ _hasResponse = true;\r
++ int respCodeAsInt = (int) _response.StatusCode;\r
++ if(respCodeAsInt >= 400)\r
++ {\r
++ // The WebException contains the readable (not closed) response stream.\r
++ // So, in case of WebException, we should read all data from the \r
++ // network response stream into the memory stream, and after that\r
++ // close the underlying network stream. The following requests to read\r
++ // from the stream will actually read from the memory stream.\r
++ // So, the this.Abort() should not be called in this case.\r
++ _response.ReadAllAndClose();\r
++ //this.Abort();\r
++ throw new WebException("The remote server returned an error: (" + respCodeAsInt +") " +_response.StatusCode, null, WebExceptionStatus.ProtocolError, _response);\r
++ }\r
++ if(isRedirectNeeded(_method) && _method.getResponseHeader("location") == null)\r
++ {\r
++ // See comments above for the error >= 400\r
++ _response.ReadAllAndClose();\r
++ //this.Abort();\r
++ throw new WebException("Got response code "+_response.StatusCode+", but no location provided", null, WebExceptionStatus.ProtocolError, _response);\r
++ }\r
++ }\r
++ catch(ProtocolException e)\r
++ {\r
++ throw new WebException("", e);\r
++ }\r
++ catch(java.net.ConnectException e)\r
++ {\r
++ throw new WebException("Unable to connect to the remote server.", e);\r
++ }\r
++ catch(java.net.SocketTimeoutException e)\r
++ {\r
++ throw new WebException("Timeout exceeded", e);\r
++ }\r
++ catch(java.io.IOException e)\r
++ {\r
++ throw new WebException("", e);\r
++ }\r
++ }\r
++ return _response;\r
++ }\r
++\r
++ }\r
++\r
++ public override void Abort()\r
++ {\r
++ _isAborted = true;\r
++ try\r
++ {\r
++ if(_hasResponse)\r
++ {\r
++ _response.Close();\r
++ }\r
++ }\r
++ finally\r
++ {\r
++ _method.releaseConnection(); \r
++ }\r
++ }\r
++\r
++ public override IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state)\r
++ {\r
++ lock(this)\r
++ {\r
++ if(_asyncWrite != null)\r
++ {\r
++ throw new InvalidOperationException ("Cannot re-call start of asynchronous " +
++ "method while a previous call is still in progress.");
++ }
++
++ _asyncWrite = new GHWebAsyncResult (this, callback, state);
++ if (_hasRequest)
++ {
++ if (_writeStream != null)
++ {
++ _asyncWrite.SetCompleted (true, _writeStream);
++ _asyncWrite.DoCallback ();
++ return _asyncWrite;
++ }\r
++ }\r
++ \r
++ \r
++ try\r
++ {\r
++ this.GetRequestStream(); \r
++ }\r
++ catch(Exception e)\r
++ {\r
++ _asyncWrite.SetCompleted(false, e);\r
++ }\r
++\r
++ _asyncWrite.SetCompleted (true, _writeStream);
++ _asyncWrite.DoCallback ();
++ return _asyncWrite;\r
++ \r
++ }\r
++ } \r
++\r
++ public override Stream EndGetRequestStream(IAsyncResult asyncResult)\r
++ {\r
++ if (asyncResult == null)
++ throw new ArgumentNullException ("asyncResult");
++
++ GHWebAsyncResult result = asyncResult as GHWebAsyncResult;
++ if (result == null)
++ throw new ArgumentException ("Invalid IAsyncResult");
++
++ _asyncWrite = result;
++
++ result.WaitUntilComplete ();
++
++ Exception e = result.Exception;
++
++ if (e != null)
++ throw e;
++
++ return result.WriteStream;\r
++ }\r
++\r
++ public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state)\r
++ {\r
++ lock(this)\r
++ {\r
++ if(_asyncRead != null && !_hasResponse)\r
++ {\r
++ throw new InvalidOperationException ("Cannot re-call start of asynchronous " +
++ "method while a previous call is still in progress.");
++ }
++
++ _asyncRead = new GHWebAsyncResult (this, callback, state);
++ if (_hasResponse)
++ {
++ if (_response != null)
++ {
++ _asyncRead.SetCompleted (true, _writeStream);
++ _asyncRead.DoCallback ();
++ return _asyncRead;
++ }\r
++ }\r
++ \r
++\r
++ try\r
++ {\r
++ GetResponse();\r
++ }\r
++ catch(Exception e)\r
++ {\r
++ _asyncRead.SetCompleted(false, e);\r
++ }
++ _asyncRead.SetCompleted (true, _writeStream);
++ _asyncRead.DoCallback ();
++ return _asyncRead;\r
++ \r
++ }\r
++ }\r
++\r
++ public override WebResponse EndGetResponse(IAsyncResult asyncResult)\r
++ {\r
++ if (asyncResult == null)
++ throw new ArgumentNullException ("asyncResult");
++
++ GHWebAsyncResult result = asyncResult as GHWebAsyncResult;
++ if (result == null)
++ throw new ArgumentException ("Invalid IAsyncResult", "asyncResult");
++
++
++ _asyncRead = result;
++ if (!result.WaitUntilComplete (_timeout, false)) \r
++ {
++ Abort ();
++ throw new WebException("The request timed out", WebExceptionStatus.Timeout);
++ }
++
++ return result.Response;\r
++ }\r
++\r
++\r
++\r
++\r
++\r
++\r
++\r
++ \r
++\r
++\r
++\r
++\r
++ #region VMWRequestStream class\r
++ internal class VMWRequestStream : Stream, IDisposable\r
++ {\r
++\r
++ private java.io.OutputStream _javaOutput;\r
++ private long _len;\r
++ private long _contentLength;\r
++\r
++ internal VMWRequestStream (java.io.OutputStream stream) :\r
++ this(stream , -1L)\r
++ {\r
++ }\r
++\r
++ internal VMWRequestStream (java.io.OutputStream stream, long contentLength)\r
++ {\r
++ _javaOutput = stream;\r
++ _contentLength = contentLength;\r
++ _len = 0;\r
++ }\r
++ public override bool CanRead\r
++ {\r
++ get {return false;}\r
++ }\r
++\r
++ public override bool CanWrite\r
++ {\r
++ get{return true;}\r
++ }\r
++\r
++ public override bool CanSeek\r
++ {\r
++ get { return false;}\r
++ }\r
++\r
++ public override long Length\r
++ {\r
++ get{ return _len;}\r
++ }\r
++\r
++ public override long Position\r
++ {\r
++ get\r
++ {\r
++ return _len;\r
++ }\r
++\r
++ set\r
++ {\r
++ throw new NotSupportedException();\r
++ }\r
++ }\r
++\r
++ private volatile bool _closed = false;\r
++\r
++ public override void Close()\r
++ {\r
++ if(!_closed)\r
++ {\r
++ lock(this)\r
++ {\r
++ if(!_closed)\r
++ {\r
++ _closed = true;\r
++ _javaOutput.flush();\r
++ _javaOutput.close();\r
++ }\r
++ }\r
++ }\r
++ }\r
++\r
++ public override void Flush()\r
++ {\r
++ _javaOutput.flush();\r
++ }\r
++\r
++ public override int ReadByte()\r
++ {\r
++ throw new NotSupportedException();\r
++ }\r
++\r
++ public override int Read(byte[] buffer, int offset, int count)\r
++ {\r
++ throw new NotSupportedException();\r
++ }\r
++\r
++ public override void Write(byte[] buffer, int offset, int count)\r
++ {\r
++ if(_contentLength >= 0)\r
++ {\r
++ _len += count;\r
++ if(_len > _contentLength)\r
++ {\r
++ throw new System.Net.ProtocolViolationException(\r
++ "Bytes to be written to the stream exceed Content-Length bytes size specified.");\r
++ }\r
++ }\r
++ _javaOutput.write(vmw.common.TypeUtils.ToSByteArray(buffer), offset, count);\r
++\r
++ if(_contentLength == _len)\r
++ {\r
++ _javaOutput.flush();\r
++ _javaOutput.close();\r
++ }\r
++ }\r
++\r
++ public override long Seek(long offset, SeekOrigin origin)\r
++ {\r
++ throw new NotSupportedException();\r
++ }\r
++\r
++ public override void SetLength(long length)\r
++ {\r
++ throw new NotSupportedException();\r
++ }\r
++\r
++ void IDisposable.Dispose()\r
++ {\r
++ try\r
++ {\r
++ Close();\r
++ }\r
++ catch(Exception)\r
++ {\r
++ }\r
++ }\r
++ }\r
++ \r
++ #endregion\r
++\r
++ #region GHWebAsyncResult\r
++ internal class GHWebAsyncResult : IAsyncResult\r
++ {\r
++ private object _state;\r
++ private AsyncCallback _callback;\r
++ private ManualResetEvent _handle;\r
++ private bool _isCompleted = false;\r
++ private bool _callbackDone;\r
++ private Stream _writeStream;\r
++ private HttpProvider _provider;\r
++\r
++ private Exception _exception;\r
++\r
++ #region Constructors\r
++\r
++ public GHWebAsyncResult(HttpProvider provider, \r
++ AsyncCallback callback, object state) : \r
++ this(state, callback)\r
++ {\r
++ _provider = provider;\r
++ }\r
++\r
++ public GHWebAsyncResult(object state, AsyncCallback callback)\r
++ {\r
++ _state = state;\r
++ _callback = callback;\r
++ }\r
++ #endregion\r
++\r
++ #region IAsyncResult Members\r
++\r
++ public object AsyncState\r
++ {\r
++ get\r
++ {\r
++ return _state;\r
++ }\r
++ }\r
++\r
++ public bool CompletedSynchronously\r
++ {\r
++ get\r
++ {\r
++ // TODO: Add HWebAsyncResult.CompletedSynchronously getter implementation\r
++ return false;\r
++ }\r
++ }\r
++\r
++ public WaitHandle AsyncWaitHandle \r
++ {
++ get \r
++ {
++ if (_handle == null) \r
++ {
++ lock (this) \r
++ {
++ if (_handle == null)
++ _handle = new ManualResetEvent (_isCompleted);
++ }
++ }
++
++ return _handle;
++ }
++ }\r
++\r
++ public bool IsCompleted\r
++ {\r
++ get\r
++ {\r
++ return _isCompleted; \r
++ }\r
++ }\r
++\r
++ #endregion\r
++\r
++ #region Internal Properties\r
++\r
++ internal Stream WriteStream\r
++ {\r
++ get\r
++ {\r
++ return _writeStream;\r
++ }\r
++ }\r
++\r
++ internal Exception Exception\r
++ {\r
++ get\r
++ {\r
++ return _exception;\r
++ }\r
++ }\r
++\r
++ internal HttpWebResponse Response\r
++ {\r
++ get\r
++ {\r
++ return ((VMWHttpProvider)_provider)._response;\r
++ }\r
++ }\r
++\r
++ #endregion\r
++\r
++ #region Internal Methods\r
++\r
++ internal void SetCompleted(bool res, Stream writeStream)\r
++ {\r
++ _isCompleted = res;\r
++ _writeStream = writeStream;\r
++ ((ManualResetEvent) AsyncWaitHandle).Set ();\r
++ }\r
++\r
++ internal void SetCompleted(bool res, Exception exc)\r
++ {\r
++ _isCompleted = res;\r
++ _exception = exc;\r
++ ((ManualResetEvent) AsyncWaitHandle).Set ();\r
++ }\r
++\r
++ internal void DoCallback()\r
++ {\r
++ if (!_callbackDone && _callback != null) \r
++ {
++ _callbackDone = true;
++ _callback (this);
++ }\r
++ }\r
++\r
++ internal void WaitUntilComplete()\r
++ {\r
++ if(_isCompleted)\r
++ return;\r
++ AsyncWaitHandle.WaitOne ();\r
++ }\r
++\r
++ internal bool WaitUntilComplete (int timeout, bool exitContext)
++ {
++ if (_isCompleted)
++ return true;
++
++ return AsyncWaitHandle.WaitOne (timeout, exitContext);
++ }\r
++ #endregion\r
++\r
++ }\r
++\r
++ #endregion\r
++\r
++ #region OutputStreamRequestEntity\r
++\r
++ internal class OutputStreamRequestEntity : java.io.OutputStream, RequestEntity\r
++ {\r
++ private long _contentLength;\r
++ private java.io.ByteArrayOutputStream _out;\r
++ private sbyte[] _buffer;\r
++\r
++ internal OutputStreamRequestEntity(): this(-1)\r
++ {\r
++ }\r
++\r
++ internal OutputStreamRequestEntity(long length)\r
++ {\r
++ _contentLength = length;\r
++ int tmp = (int) _contentLength;\r
++\r
++ if(tmp <=0)\r
++ tmp = 4096;\r
++ _out = new java.io.ByteArrayOutputStream(tmp);\r
++ }\r
++\r
++ #region RequestEntity Members\r
++\r
++ public bool isRepeatable()\r
++ {\r
++ return ((_out != null) || (_buffer != null));\r
++ }\r
++\r
++ public long getContentLength()\r
++ {\r
++ if(_out != null)\r
++ {\r
++ _buffer = _out.toByteArray();\r
++ }\r
++ if(_buffer != null)\r
++ {\r
++ _contentLength = _buffer.Length;\r
++ _out = null;\r
++ }\r
++ return _contentLength;\r
++ }\r
++\r
++ public void writeRequest(java.io.OutputStream output)\r
++ {\r
++ if(_out != null)\r
++ _buffer = _out.toByteArray();\r
++ if(_buffer != null)\r
++ {\r
++ output.write(_buffer, 0, _buffer.Length);\r
++ _out = null;\r
++ }\r
++ else throw new ApplicationException();\r
++ }\r
++\r
++ public string getContentType()\r
++ {\r
++ return null;\r
++ }\r
++\r
++ #endregion\r
++\r
++ public override void write(int i)\r
++ {\r
++ _out.write(i);\r
++ }\r
++\r
++ }\r
++\r
++ #endregion\r
++\r
++\r
++\r
++\r
++\r
++\r
++\r
++ }\r
++}\r
--<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
++<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
<PropertyGroup>\r
<Configuration Condition=" '$(Configuration)' == '' ">Debug_Java</Configuration>\r
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
-->\r
<ProjectExtensions>\r
<VisualStudio>\r
-- <UserProperties REFS-JarPath-apache_http_client="..\lib\apache_http_client.jar" REFS-JarPath-system-configuration="..\..\..\..\..\Program Files\Mainsoft\Visual MainWin for J2EE V2\jgac\vmw4j2ee_110\System.Configuration.jar" REFS-JarPath-rt="..\..\..\..\..\Program Files\Mainsoft\Visual MainWin for J2EE V2\jre5\lib\rt.jar" REFS-JarPath-mscorlib="..\..\..\..\..\Program Files\Mainsoft\Visual MainWin for J2EE V2\jgac\vmw4j2ee_110\mscorlib.jar" REFS-JarPath-j2se-helpers="..\..\..\..\..\Program Files\Mainsoft\Visual MainWin for J2EE V2\jgac\vmw4j2ee_110\J2SE.Helpers.jar" REFS-JarPath-system-xml="..\..\..\..\..\Program Files\Mainsoft\Visual MainWin for J2EE V2\jgac\vmw4j2ee_110\System.Xml.jar" />\r
++ <UserProperties REFS-JarPath-system-xml="..\..\..\..\..\Program Files\Mainsoft\Visual MainWin for J2EE V2\jgac\vmw4j2ee_110\System.Xml.jar" REFS-JarPath-j2se-helpers="..\..\..\..\..\Program Files\Mainsoft\Visual MainWin for J2EE V2\jgac\vmw4j2ee_110\J2SE.Helpers.jar" REFS-JarPath-mscorlib="..\..\..\..\..\Program Files\Mainsoft\Visual MainWin for J2EE V2\jgac\vmw4j2ee_110\mscorlib.jar" REFS-JarPath-rt="..\..\..\..\..\Program Files\Mainsoft\Visual MainWin for J2EE V2\jre5\lib\rt.jar" REFS-JarPath-system-configuration="..\..\..\..\..\Program Files\Mainsoft\Visual MainWin for J2EE V2\jgac\vmw4j2ee_110\System.Configuration.jar" REFS-JarPath-apache_http_client="..\lib\apache_http_client.jar" />\r
</VisualStudio>\r
</ProjectExtensions>\r
<ItemGroup>\r
<Compile Include="System.Diagnostics\Debug.cs">\r
<SubType>Code</SubType>\r
</Compile>\r
++ <Compile Include="System.Diagnostics\Debugger.jvm.cs" />\r
<Compile Include="System.Diagnostics\DefaultTraceListener.cs">\r
<SubType>Code</SubType>\r
</Compile>\r
<Compile Include="System.Diagnostics\DiagnosticsConfigurationHandler.cs">\r
<SubType>Code</SubType>\r
</Compile>\r
++ <Compile Include="System.Diagnostics\StackFrame.jvm.cs" />\r
++ <Compile Include="System.Diagnostics\StackTrace.jvm.cs" />\r
<Compile Include="System.Diagnostics\Trace.cs">\r
<SubType>Code</SubType>\r
</Compile>\r
<Compile Include="System.Net.Security\SslPolicyErrors.cs" />\r
<Compile Include="System.Net.Security\SslStream.cs" />\r
<Compile Include="System.Net.Sockets\AddressFamily.cs" />\r
-- <Compile Include="System.Net.Sockets\GHSocket.cs" />\r
-- <Compile Include="System.Net.Sockets\GHSocketFactory.cs" />\r
-- <Compile Include="System.Net.Sockets\GHStreamSocket.cs" />\r
-- <Compile Include="System.Net.Sockets\GHStreamSocketSSL.cs" />\r
++ <Compile Include="System.Net.Sockets\GHSocket.jvm.cs" />\r
++ <Compile Include="System.Net.Sockets\GHSocketFactory.jvm.cs" />\r
++ <Compile Include="System.Net.Sockets\GHStreamSocket.jvm.cs" />\r
++ <Compile Include="System.Net.Sockets\GHStreamSocketSSL.jvm.cs" />\r
<Compile Include="System.Net.Sockets\IPv6MulticastOption.cs" />\r
<Compile Include="System.Net.Sockets\LingerOption.cs" />\r
<Compile Include="System.Net.Sockets\MulticastOption.cs" />\r
<Compile Include="System.Net\HttpListenerPrefixCollection.cs" />\r
<Compile Include="System.Net\HttpListenerRequest.cs" />\r
<Compile Include="System.Net\HttpListenerResponse.cs" />\r
-- <Compile Include="System.Net\HttpProvider.cs" />\r
++ <Compile Include="System.Net\HttpProvider.jvm.cs" />\r
<Compile Include="System.Net\HttpRequestCreator.cs" />\r
<Compile Include="System.Net\HttpRequestHeader.cs" />\r
<Compile Include="System.Net\HttpResponseHeader.cs" />\r
-- <Compile Include="System.Net\HttpStateCache.cs" />\r
++ <Compile Include="System.Net\HttpStateCache.jvm.cs" />\r
<Compile Include="System.Net\HttpStatusCode.cs" />\r
<Compile Include="System.Net\HttpStreamAsyncResult.cs" />\r
<Compile Include="System.Net\HttpUtility.cs" />\r
<Compile Include="System.Net\UploadStringCompletedEventHandler.cs" />\r
<Compile Include="System.Net\UploadValuesCompletedEventArgs.cs" />\r
<Compile Include="System.Net\UploadValuesCompletedEventHandler.cs" />\r
-- <Compile Include="System.Net\VMWHttpProvider.cs" />\r
++ <Compile Include="System.Net\VMWHttpProvider.jvm.cs" />\r
<Compile Include="System.Net\WebAsyncResult.cs" />\r
<Compile Include="System.Net\WebClient.cs" />\r
<Compile Include="System.Net\WebConnectionData.cs" />\r