aboutsummaryrefslogtreecommitdiff
path: root/SocketHttpListener/CloseEventArgs.cs
blob: b1bb4b1960111ac71328d7d4da8591d77aeabd38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
using System;
using System.Text;

namespace SocketHttpListener
{
  /// <summary>
  /// Contains the event data associated with a <see cref="WebSocket.OnClose"/> event.
  /// </summary>
  /// <remarks>
  /// A <see cref="WebSocket.OnClose"/> event occurs when the WebSocket connection has been closed.
  /// If you would like to get the reason for the close, you should access the <see cref="Code"/> or
  /// <see cref="Reason"/> property.
  /// </remarks>
  public class CloseEventArgs : EventArgs
  {
    #region Private Fields

    private bool   _clean;
    private ushort _code;
    private string _reason;

    #endregion

    #region Internal Constructors

    internal CloseEventArgs (PayloadData payload)
    {
      var data = payload.ApplicationData;
      var len = data.Length;
      _code = len > 1
              ? data.SubArray (0, 2).ToUInt16 (ByteOrder.Big)
              : (ushort) CloseStatusCode.NoStatusCode;

      _reason = len > 2
                ? GetUtf8String(data.SubArray (2, len - 2))
                : String.Empty;
    }

      private string GetUtf8String(byte[] bytes)
      {
          return Encoding.UTF8.GetString(bytes, 0, bytes.Length);
      }

    #endregion

    #region Public Properties

    /// <summary>
    /// Gets the status code for the close.
    /// </summary>
    /// <value>
    /// A <see cref="ushort"/> that represents the status code for the close if any.
    /// </value>
    public ushort Code {
      get {
        return _code;
      }
    }

    /// <summary>
    /// Gets the reason for the close.
    /// </summary>
    /// <value>
    /// A <see cref="string"/> that represents the reason for the close if any.
    /// </value>
    public string Reason {
      get {
        return _reason;
      }
    }

    /// <summary>
    /// Gets a value indicating whether the WebSocket connection has been closed cleanly.
    /// </summary>
    /// <value>
    /// <c>true</c> if the WebSocket connection has been closed cleanly; otherwise, <c>false</c>.
    /// </value>
    public bool WasClean {
      get {
        return _clean;
      }

      internal set {
        _clean = value;
      }
    }

    #endregion
  }
}