Modified sending (Removed SendAsync method)
This commit is contained in:
		@@ -29,6 +29,7 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Collections.Specialized;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using WebSocketSharp.Net;
 | 
			
		||||
@@ -225,6 +226,11 @@ namespace WebSocketSharp.Server
 | 
			
		||||
      IsBound = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal void Start ()
 | 
			
		||||
    {
 | 
			
		||||
      _websocket.Connect ();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #endregion
 | 
			
		||||
 | 
			
		||||
    #region Protected Methods
 | 
			
		||||
@@ -235,7 +241,7 @@ namespace WebSocketSharp.Server
 | 
			
		||||
    /// <param name="message">
 | 
			
		||||
    /// A <see cref="string"/> that contains an error message.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected virtual void Error (string message)
 | 
			
		||||
    protected void Error (string message)
 | 
			
		||||
    {
 | 
			
		||||
      if (!message.IsNullOrEmpty ())
 | 
			
		||||
        OnError (new ErrorEventArgs (message));
 | 
			
		||||
@@ -282,6 +288,246 @@ namespace WebSocketSharp.Server
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a Ping to the client of the current <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <returns>
 | 
			
		||||
    /// <c>true</c> if the current <see cref="WebSocketService"/> instance receives a Pong
 | 
			
		||||
    /// from the client in a time; otherwise, <c>false</c>.
 | 
			
		||||
    /// </returns>
 | 
			
		||||
    protected bool Ping ()
 | 
			
		||||
    {
 | 
			
		||||
      return IsBound
 | 
			
		||||
             ? _websocket.Ping ()
 | 
			
		||||
             : false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a Ping with the specified <paramref name="message"/> to the client of
 | 
			
		||||
    /// the current <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <returns>
 | 
			
		||||
    /// <c>true</c> if the current <see cref="WebSocketService"/> instance receives a Pong
 | 
			
		||||
    /// from the client in a time; otherwise, <c>false</c>.
 | 
			
		||||
    /// </returns>
 | 
			
		||||
    /// <param name="message">
 | 
			
		||||
    /// A <see cref="string"/> that contains a message to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected bool Ping (string message)
 | 
			
		||||
    {
 | 
			
		||||
      return IsBound
 | 
			
		||||
             ? _websocket.Ping (message)
 | 
			
		||||
             : false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary <paramref name="data"/> to the client of the current
 | 
			
		||||
    /// <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// An array of <see cref="byte"/> that contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected void Send (byte [] data)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Send (data, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a text <paramref name="data"/> to the client of the current
 | 
			
		||||
    /// <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// A <see cref="string"/> that contains a text data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected void Send (string data)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Send (data, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary data from the specified <see cref="FileInfo"/> to
 | 
			
		||||
    /// the client of the current <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="file">
 | 
			
		||||
    /// A <see cref="FileInfo"/> from which contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected void Send (FileInfo file)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Send (file, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary <paramref name="data"/> to the client of the current
 | 
			
		||||
    /// <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// An array of <see cref="byte"/> that contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An Action<bool> delegate that references the method(s) called when
 | 
			
		||||
    /// the send is complete.
 | 
			
		||||
    /// A <see cref="bool"/> passed to this delegate is <c>true</c> if the send is
 | 
			
		||||
    /// complete successfully; otherwise, <c>false</c>.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected void Send (byte [] data, Action<bool> completed)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Send (data, completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a text <paramref name="data"/> to the client of the current
 | 
			
		||||
    /// <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// A <see cref="string"/> that contains a text data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An Action<bool> delegate that references the method(s) called when
 | 
			
		||||
    /// the send is complete.
 | 
			
		||||
    /// A <see cref="bool"/> passed to this delegate is <c>true</c> if the send is
 | 
			
		||||
    /// complete successfully; otherwise, <c>false</c>.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected void Send (string data, Action<bool> completed)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Send (data, completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary data from the specified <see cref="FileInfo"/> to
 | 
			
		||||
    /// the client of the current <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="file">
 | 
			
		||||
    /// A <see cref="FileInfo"/> from which contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An Action<bool> delegate that references the method(s) called when
 | 
			
		||||
    /// the send is complete.
 | 
			
		||||
    /// A <see cref="bool"/> passed to this delegate is <c>true</c> if the send is
 | 
			
		||||
    /// complete successfully; otherwise, <c>false</c>.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected void Send (FileInfo file, Action<bool> completed)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Send (file, completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary data from the specified <see cref="Stream"/> to
 | 
			
		||||
    /// the client of the current <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="stream">
 | 
			
		||||
    /// A <see cref="Stream"/> object from which contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="length">
 | 
			
		||||
    /// An <see cref="int"/> that contains the number of bytes to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="dispose">
 | 
			
		||||
    /// <c>true</c> if <paramref name="stream"/> is disposed after a binary data read;
 | 
			
		||||
    /// otherwise, <c>false</c>.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected void Send (Stream stream, int length, bool dispose)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Send (stream, length, dispose, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary data from the specified <see cref="Stream"/> to
 | 
			
		||||
    /// the client of the current <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="stream">
 | 
			
		||||
    /// A <see cref="Stream"/> object from which contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="length">
 | 
			
		||||
    /// An <see cref="int"/> that contains the number of bytes to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="dispose">
 | 
			
		||||
    /// <c>true</c> if <paramref name="stream"/> is disposed after a binary data read;
 | 
			
		||||
    /// otherwise, <c>false</c>.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An Action<bool> delegate that references the method(s) called when
 | 
			
		||||
    /// the send is complete.
 | 
			
		||||
    /// A <see cref="bool"/> passed to this delegate is <c>true</c> if the send is
 | 
			
		||||
    /// complete successfully; otherwise, <c>false</c>.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected void Send (Stream stream, int length, bool dispose, Action<bool> completed)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Send (stream, length, dispose, completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Stops the current <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    protected void Stop ()
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Close ();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Stops the current <see cref="WebSocketService"/> instance with the specified
 | 
			
		||||
    /// <see cref="ushort"/> and <see cref="string"/>.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="code">
 | 
			
		||||
    /// A <see cref="ushort"/> that contains a status code indicating the reason for stop.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="reason">
 | 
			
		||||
    /// A <see cref="string"/> that contains the reason for stop.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected void Stop (ushort code, string reason)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Close (code, reason);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Stops the current <see cref="WebSocketService"/> instance with the specified
 | 
			
		||||
    /// <see cref="CloseStatusCode"/> and <see cref="string"/>.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="code">
 | 
			
		||||
    /// One of the <see cref="CloseStatusCode"/> values that indicates a status code
 | 
			
		||||
    /// indicating the reason for stop.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="reason">
 | 
			
		||||
    /// A <see cref="string"/> that contains the reason for stop.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    protected void Stop (CloseStatusCode code, string reason)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Close (code, reason);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Validates the cookies used in the WebSocket connection request.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
@@ -306,152 +552,5 @@ namespace WebSocketSharp.Server
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #endregion
 | 
			
		||||
 | 
			
		||||
    #region Public Methods
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a Ping to the client of the current <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <returns>
 | 
			
		||||
    /// <c>true</c> if the current <see cref="WebSocketService"/> instance receives a Pong
 | 
			
		||||
    /// from the client in a time; otherwise, <c>false</c>.
 | 
			
		||||
    /// </returns>
 | 
			
		||||
    public bool Ping ()
 | 
			
		||||
    {
 | 
			
		||||
      return IsBound
 | 
			
		||||
             ? _websocket.Ping ()
 | 
			
		||||
             : false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a Ping with the specified <paramref name="message"/> to the client of
 | 
			
		||||
    /// the current <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <returns>
 | 
			
		||||
    /// <c>true</c> if the current <see cref="WebSocketService"/> instance receives a Pong
 | 
			
		||||
    /// from the client in a time; otherwise, <c>false</c>.
 | 
			
		||||
    /// </returns>
 | 
			
		||||
    /// <param name="message">
 | 
			
		||||
    /// A <see cref="string"/> that contains a message to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public bool Ping (string message)
 | 
			
		||||
    {
 | 
			
		||||
      return IsBound
 | 
			
		||||
             ? _websocket.Ping (message)
 | 
			
		||||
             : false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary <paramref name="data"/> to the client of the current
 | 
			
		||||
    /// <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// An array of <see cref="byte"/> that contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public virtual void Send (byte [] data)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Send (data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a text <paramref name="data"/> to the client of the current
 | 
			
		||||
    /// <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// A <see cref="string"/> that contains a text data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public virtual void Send (string data)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Send (data);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary <paramref name="data"/> to the client of the current
 | 
			
		||||
    /// <see cref="WebSocketService"/> instance asynchronously.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// An array of <see cref="byte"/> that contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An <see cref="Action"/> delegate that references the method(s) called when
 | 
			
		||||
    /// the asynchronous operation completes.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public virtual void SendAsync (byte [] data, Action completed)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.SendAsync (data, completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a text <paramref name="data"/> to the client of the current
 | 
			
		||||
    /// <see cref="WebSocketService"/> instance asynchronously.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// A <see cref="string"/> that contains a text data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An <see cref="Action"/> delegate that references the method(s) called when
 | 
			
		||||
    /// the asynchronous operation completes.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public virtual void SendAsync (string data, Action completed)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.SendAsync (data, completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Starts the current <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public void Start ()
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Connect ();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Stops the current <see cref="WebSocketService"/> instance.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public void Stop ()
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Close ();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Stops the current <see cref="WebSocketService"/> instance with the specified
 | 
			
		||||
    /// <see cref="ushort"/> and <see cref="string"/>.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="code">
 | 
			
		||||
    /// A <see cref="ushort"/> that contains a status code indicating the reason for stop.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="reason">
 | 
			
		||||
    /// A <see cref="string"/> that contains the reason for stop.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void Stop (ushort code, string reason)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Close (code, reason);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Stops the current <see cref="WebSocketService"/> instance with the specified
 | 
			
		||||
    /// <see cref="CloseStatusCode"/> and <see cref="string"/>.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="code">
 | 
			
		||||
    /// One of the <see cref="CloseStatusCode"/> values that indicates a status code
 | 
			
		||||
    /// indicating the reason for stop.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="reason">
 | 
			
		||||
    /// A <see cref="string"/> that contains the reason for stop.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void Stop (CloseStatusCode code, string reason)
 | 
			
		||||
    {
 | 
			
		||||
      if (IsBound)
 | 
			
		||||
        _websocket.Close (code, reason);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #endregion
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -649,14 +649,14 @@ namespace WebSocketSharp.Server
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      WebSocketService service;
 | 
			
		||||
      if (!TryGetServiceInstance (id, out service))
 | 
			
		||||
      WebSocketService session;
 | 
			
		||||
      if (!TryGetServiceInstance (id, out session))
 | 
			
		||||
      {
 | 
			
		||||
        _logger.Error ("The WebSocket session with the specified ID not found.\nID: " + id);
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      service.Send (data);
 | 
			
		||||
      session.Context.WebSocket.Send (data, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
@@ -678,14 +678,14 @@ namespace WebSocketSharp.Server
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      WebSocketService service;
 | 
			
		||||
      if (!TryGetServiceInstance (id, out service))
 | 
			
		||||
      WebSocketService session;
 | 
			
		||||
      if (!TryGetServiceInstance (id, out session))
 | 
			
		||||
      {
 | 
			
		||||
        _logger.Error ("The WebSocket session with the specified ID not found.\nID: " + id);
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      service.Send (data);
 | 
			
		||||
      session.Context.WebSocket.Send (data, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
 
 | 
			
		||||
@@ -1028,65 +1028,72 @@ namespace WebSocketSharp
 | 
			
		||||
      return _stream.Write (frame.ToByteArray ());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void send (Opcode opcode, byte [] data)
 | 
			
		||||
    private bool send (Opcode opcode, byte [] data)
 | 
			
		||||
    {
 | 
			
		||||
      lock (_forSend)
 | 
			
		||||
      {
 | 
			
		||||
        var sent = false;
 | 
			
		||||
        try {
 | 
			
		||||
          var comped = false;
 | 
			
		||||
          var compressed = false;
 | 
			
		||||
          if (_compression != CompressionMethod.NONE)
 | 
			
		||||
          {
 | 
			
		||||
            data = data.Compress (_compression);
 | 
			
		||||
            comped = true;
 | 
			
		||||
            compressed = true;
 | 
			
		||||
          }
 | 
			
		||||
          
 | 
			
		||||
          send (WsFrame.CreateFrame (
 | 
			
		||||
            Fin.FINAL, opcode, _client ? Mask.MASK : Mask.UNMASK, data, comped));
 | 
			
		||||
 | 
			
		||||
          sent = send (WsFrame.CreateFrame (
 | 
			
		||||
            Fin.FINAL, opcode, _client ? Mask.MASK : Mask.UNMASK, data, compressed));
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception ex) {
 | 
			
		||||
          _logger.Fatal (ex.ToString ());
 | 
			
		||||
          error ("An exception has occured.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return sent;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void send (Opcode opcode, Stream stream)
 | 
			
		||||
    private bool send (Opcode opcode, Stream stream)
 | 
			
		||||
    {
 | 
			
		||||
      lock (_forSend)
 | 
			
		||||
      {
 | 
			
		||||
        var comp = stream;
 | 
			
		||||
        var comped = false;
 | 
			
		||||
        var sent = false;
 | 
			
		||||
 | 
			
		||||
        var src = stream;
 | 
			
		||||
        var compressed = false;
 | 
			
		||||
        try {
 | 
			
		||||
          if (_compression != CompressionMethod.NONE)
 | 
			
		||||
          {
 | 
			
		||||
            comp = stream.Compress (_compression);
 | 
			
		||||
            comped = true;
 | 
			
		||||
            stream = stream.Compress (_compression);
 | 
			
		||||
            compressed = true;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          sendFragmented (opcode, comp, _client ? Mask.MASK : Mask.UNMASK, comped);
 | 
			
		||||
          sent = sendFragmented (opcode, stream, _client ? Mask.MASK : Mask.UNMASK, compressed);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception ex) {
 | 
			
		||||
          _logger.Fatal (ex.ToString ());
 | 
			
		||||
          error ("An exception has occured.");
 | 
			
		||||
        }
 | 
			
		||||
        finally {
 | 
			
		||||
          if (comped)
 | 
			
		||||
            comp.Dispose ();
 | 
			
		||||
          if (compressed)
 | 
			
		||||
            stream.Dispose ();
 | 
			
		||||
 | 
			
		||||
          stream.Dispose ();
 | 
			
		||||
          src.Dispose ();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return sent;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void sendAsync (Opcode opcode, byte [] data, Action completed)
 | 
			
		||||
    private void send (Opcode opcode, byte [] data, Action<bool> completed)
 | 
			
		||||
    {
 | 
			
		||||
      Action<Opcode, byte []> sender = send;
 | 
			
		||||
      Func<Opcode, byte [], bool> sender = send;
 | 
			
		||||
      AsyncCallback callback = ar =>
 | 
			
		||||
      {
 | 
			
		||||
        try {
 | 
			
		||||
          sender.EndInvoke (ar);
 | 
			
		||||
          var sent = sender.EndInvoke (ar);
 | 
			
		||||
          if (completed != null)
 | 
			
		||||
            completed ();
 | 
			
		||||
            completed (sent);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception ex)
 | 
			
		||||
        {
 | 
			
		||||
@@ -1098,15 +1105,15 @@ namespace WebSocketSharp
 | 
			
		||||
      sender.BeginInvoke (opcode, data, callback, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void sendAsync (Opcode opcode, Stream stream, Action completed)
 | 
			
		||||
    private void send (Opcode opcode, Stream stream, Action<bool> completed)
 | 
			
		||||
    {
 | 
			
		||||
      Action<Opcode, Stream> sender = send;
 | 
			
		||||
      Func<Opcode, Stream, bool> sender = send;
 | 
			
		||||
      AsyncCallback callback = ar =>
 | 
			
		||||
      {
 | 
			
		||||
        try {
 | 
			
		||||
          sender.EndInvoke (ar);
 | 
			
		||||
          var sent = sender.EndInvoke (ar);
 | 
			
		||||
          if (completed != null)
 | 
			
		||||
            completed ();
 | 
			
		||||
            completed (sent);
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception ex)
 | 
			
		||||
        {
 | 
			
		||||
@@ -1585,10 +1592,62 @@ namespace WebSocketSharp
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary <paramref name="data"/> using the WebSocket connection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// An array of <see cref="byte"/> that contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void Send (byte[] data)
 | 
			
		||||
    {
 | 
			
		||||
      Send (data, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a text <paramref name="data"/> using the WebSocket connection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// A <see cref="string"/> that contains a text data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void Send (string data)
 | 
			
		||||
    {
 | 
			
		||||
      Send (data, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary data from the specified <see cref="FileInfo"/>
 | 
			
		||||
    /// using the WebSocket connection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="file">
 | 
			
		||||
    /// A <see cref="FileInfo"/> from which contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void Send (FileInfo file)
 | 
			
		||||
    {
 | 
			
		||||
      Send (file, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary <paramref name="data"/> using the WebSocket connection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// An array of <see cref="byte"/> that contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An Action<bool> delegate that references the method(s) called when
 | 
			
		||||
    /// the send is complete.
 | 
			
		||||
    /// A <see cref="bool"/> passed to this delegate is <c>true</c> if the send is complete
 | 
			
		||||
    /// successfully; otherwise, <c>false</c>.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void Send (byte [] data, Action<bool> completed)
 | 
			
		||||
    {
 | 
			
		||||
      var msg = _readyState.CheckIfOpen () ?? data.CheckIfValidSendData ();
 | 
			
		||||
      if (msg != null)
 | 
			
		||||
@@ -1600,18 +1659,27 @@ namespace WebSocketSharp
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (data.LongLength <= FragmentLength)
 | 
			
		||||
        send (Opcode.BINARY, data);
 | 
			
		||||
        send (Opcode.BINARY, data, completed);
 | 
			
		||||
      else
 | 
			
		||||
        send (Opcode.BINARY, new MemoryStream (data));
 | 
			
		||||
        send (Opcode.BINARY, new MemoryStream (data), completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a text <paramref name="data"/> using the WebSocket connection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// A <see cref="string"/> that contains a text data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void Send (string data)
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An Action<bool> delegate that references the method(s) called when
 | 
			
		||||
    /// the send is complete.
 | 
			
		||||
    /// A <see cref="bool"/> passed to this delegate is <c>true</c> if the send is complete
 | 
			
		||||
    /// successfully; otherwise, <c>false</c>.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void Send (string data, Action<bool> completed)
 | 
			
		||||
    {
 | 
			
		||||
      var msg = _readyState.CheckIfOpen () ?? data.CheckIfValidSendData ();
 | 
			
		||||
      if (msg != null)
 | 
			
		||||
@@ -1624,18 +1692,28 @@ namespace WebSocketSharp
 | 
			
		||||
 | 
			
		||||
      var rawData = Encoding.UTF8.GetBytes (data);
 | 
			
		||||
      if (rawData.LongLength <= FragmentLength)
 | 
			
		||||
        send (Opcode.TEXT, rawData);
 | 
			
		||||
        send (Opcode.TEXT, rawData, completed);
 | 
			
		||||
      else
 | 
			
		||||
        send (Opcode.TEXT, new MemoryStream (rawData));
 | 
			
		||||
        send (Opcode.TEXT, new MemoryStream (rawData), completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary data using the WebSocket connection.
 | 
			
		||||
    /// Sends a binary data from the specified <see cref="FileInfo"/>
 | 
			
		||||
    /// using the WebSocket connection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="file">
 | 
			
		||||
    /// A <see cref="FileInfo"/> that contains a binary data to send.
 | 
			
		||||
    /// A <see cref="FileInfo"/> from which contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void Send (FileInfo file)
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An Action<bool> delegate that references the method(s) called when
 | 
			
		||||
    /// the send is complete.
 | 
			
		||||
    /// A <see cref="bool"/> passed to this delegate is <c>true</c> if the send is complete
 | 
			
		||||
    /// successfully; otherwise, <c>false</c>.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void Send (FileInfo file, Action<bool> completed)
 | 
			
		||||
    {
 | 
			
		||||
      var msg = _readyState.CheckIfOpen () ??
 | 
			
		||||
                (file == null ? "'file' must not be null." : null);
 | 
			
		||||
@@ -1648,12 +1726,16 @@ namespace WebSocketSharp
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      send (Opcode.BINARY, file.OpenRead ());
 | 
			
		||||
      send (Opcode.BINARY, file.OpenRead (), completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary data from the specified <see cref="Stream"/> using the WebSocket connection.
 | 
			
		||||
    /// Sends a binary data from the specified <see cref="Stream"/>
 | 
			
		||||
    /// using the WebSocket connection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="stream">
 | 
			
		||||
    /// A <see cref="Stream"/> object from which contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
@@ -1666,120 +1748,16 @@ namespace WebSocketSharp
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void Send (Stream stream, int length, bool dispose)
 | 
			
		||||
    {
 | 
			
		||||
      byte [] data = null;
 | 
			
		||||
      int readLen = 0;
 | 
			
		||||
      var msg = _readyState.CheckIfOpen () ??
 | 
			
		||||
                stream.CheckIfCanRead () ??
 | 
			
		||||
                (length < 1 ? "'length' must be greater than 0." : null) ??
 | 
			
		||||
                ((readLen = (data = stream.ReadBytes (length)).Length) == 0
 | 
			
		||||
                   ? "A data cannot be read from 'stream'." : null);
 | 
			
		||||
 | 
			
		||||
      if (msg != null)
 | 
			
		||||
      {
 | 
			
		||||
        _logger.Error (msg);
 | 
			
		||||
        error (msg);
 | 
			
		||||
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (readLen != length)
 | 
			
		||||
        _logger.Warn (String.Format (
 | 
			
		||||
          "A data with 'length' cannot be read from 'stream'.\nexpected: {0} actual: {1}", length, readLen));
 | 
			
		||||
 | 
			
		||||
      if (dispose)
 | 
			
		||||
        stream.Dispose ();
 | 
			
		||||
 | 
			
		||||
      if (readLen <= FragmentLength)
 | 
			
		||||
        send (Opcode.BINARY, data);
 | 
			
		||||
      else
 | 
			
		||||
        send (Opcode.BINARY, new MemoryStream (data));
 | 
			
		||||
      Send (stream, length, dispose, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary <paramref name="data"/> asynchronously using the WebSocket connection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// An array of <see cref="byte"/> that contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An <see cref="Action"/> delegate that references the method(s) called when
 | 
			
		||||
    /// the asynchronous operation completes.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void SendAsync (byte [] data, Action completed)
 | 
			
		||||
    {
 | 
			
		||||
      var msg = _readyState.CheckIfOpen () ?? data.CheckIfValidSendData ();
 | 
			
		||||
      if (msg != null)
 | 
			
		||||
      {
 | 
			
		||||
        _logger.Error (msg);
 | 
			
		||||
        error (msg);
 | 
			
		||||
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (data.LongLength <= FragmentLength)
 | 
			
		||||
        sendAsync (Opcode.BINARY, data, completed);
 | 
			
		||||
      else
 | 
			
		||||
        sendAsync (Opcode.BINARY, new MemoryStream (data), completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a text <paramref name="data"/> asynchronously using the WebSocket connection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="data">
 | 
			
		||||
    /// A <see cref="string"/> that contains a text data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An <see cref="Action"/> delegate that references the method(s) called when
 | 
			
		||||
    /// the asynchronous operation completes.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void SendAsync (string data, Action completed)
 | 
			
		||||
    {
 | 
			
		||||
      var msg = _readyState.CheckIfOpen () ?? data.CheckIfValidSendData ();
 | 
			
		||||
      if (msg != null)
 | 
			
		||||
      {
 | 
			
		||||
        _logger.Error (msg);
 | 
			
		||||
        error (msg);
 | 
			
		||||
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      var rawData = Encoding.UTF8.GetBytes (data);
 | 
			
		||||
      if (rawData.LongLength <= FragmentLength)
 | 
			
		||||
        sendAsync (Opcode.TEXT, rawData, completed);
 | 
			
		||||
      else
 | 
			
		||||
        sendAsync (Opcode.TEXT, new MemoryStream (rawData), completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary data asynchronously using the WebSocket connection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="file">
 | 
			
		||||
    /// A <see cref="FileInfo"/> that contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An <see cref="Action"/> delegate that references the method(s) called when
 | 
			
		||||
    /// the asynchronous operation completes.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void SendAsync (FileInfo file, Action completed)
 | 
			
		||||
    {
 | 
			
		||||
      var msg = _readyState.CheckIfOpen () ??
 | 
			
		||||
                (file == null ? "'file' must not be null." : null);
 | 
			
		||||
 | 
			
		||||
      if (msg != null)
 | 
			
		||||
      {
 | 
			
		||||
        _logger.Error (msg);
 | 
			
		||||
        error (msg);
 | 
			
		||||
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      sendAsync (Opcode.BINARY, file.OpenRead (), completed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sends a binary data asynchronously from the specified <see cref="Stream"/>
 | 
			
		||||
    /// Sends a binary data from the specified <see cref="Stream"/>
 | 
			
		||||
    /// using the WebSocket connection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <remarks>
 | 
			
		||||
    /// This method does not wait for the send to be complete.
 | 
			
		||||
    /// </remarks>
 | 
			
		||||
    /// <param name="stream">
 | 
			
		||||
    /// A <see cref="Stream"/> object from which contains a binary data to send.
 | 
			
		||||
    /// </param>
 | 
			
		||||
@@ -1791,10 +1769,12 @@ namespace WebSocketSharp
 | 
			
		||||
    /// otherwise, <c>false</c>.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    /// <param name="completed">
 | 
			
		||||
    /// An <see cref="Action"/> delegate that references the method(s) called when
 | 
			
		||||
    /// the asynchronous operation completes.
 | 
			
		||||
    /// An Action<bool> delegate that references the method(s) called when
 | 
			
		||||
    /// the send is complete.
 | 
			
		||||
    /// A <see cref="bool"/> passed to this delegate is <c>true</c> if the send is complete
 | 
			
		||||
    /// successfully; otherwise, <c>false</c>.
 | 
			
		||||
    /// </param>
 | 
			
		||||
    public void SendAsync (Stream stream, int length, bool dispose, Action completed)
 | 
			
		||||
    public void Send (Stream stream, int length, bool dispose, Action<bool> completed)
 | 
			
		||||
    {
 | 
			
		||||
      var msg = _readyState.CheckIfOpen () ??
 | 
			
		||||
                stream.CheckIfCanRead () ??
 | 
			
		||||
@@ -1829,10 +1809,12 @@ namespace WebSocketSharp
 | 
			
		||||
        if (dispose)
 | 
			
		||||
          stream.Dispose ();
 | 
			
		||||
 | 
			
		||||
        if (readLen <= FragmentLength)
 | 
			
		||||
          sendAsync (Opcode.BINARY, data, completed);
 | 
			
		||||
        else
 | 
			
		||||
          sendAsync (Opcode.BINARY, new MemoryStream (data), completed);
 | 
			
		||||
        var sent = readLen <= FragmentLength
 | 
			
		||||
                 ? send (Opcode.BINARY, data)
 | 
			
		||||
                 : send (Opcode.BINARY, new MemoryStream (data));
 | 
			
		||||
 | 
			
		||||
        if (completed != null)
 | 
			
		||||
          completed (sent);
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      Action<Exception> exception = ex =>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user