diff options
Diffstat (limited to 'Mage/Assets/ThirdParty/Photon/PhotonLibs/WebSocket/WebSocket.cs')
-rw-r--r-- | Mage/Assets/ThirdParty/Photon/PhotonLibs/WebSocket/WebSocket.cs | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/Mage/Assets/ThirdParty/Photon/PhotonLibs/WebSocket/WebSocket.cs b/Mage/Assets/ThirdParty/Photon/PhotonLibs/WebSocket/WebSocket.cs new file mode 100644 index 0000000..76aae23 --- /dev/null +++ b/Mage/Assets/ThirdParty/Photon/PhotonLibs/WebSocket/WebSocket.cs @@ -0,0 +1,188 @@ +#if UNITY_WEBGL || WEBSOCKET || ((UNITY_XBOXONE || UNITY_GAMECORE) && UNITY_EDITOR) + +// -------------------------------------------------------------------------------------------------------------------- +// <summary> +// Provided originally by Unity to cover WebSocket support in WebGL and the Editor. Modified by Exit Games GmbH. +// </summary> +// <author>developer@exitgames.com</author> +// -------------------------------------------------------------------------------------------------------------------- + + +namespace ExitGames.Client.Photon +{ + using System; + using System.Text; + #if UNITY_WEBGL && !UNITY_EDITOR + using System.Runtime.InteropServices; + #else + using WebSocketSharp; + using System.Collections.Generic; + using System.Security.Authentication; + #endif + + + public class WebSocket + { + private Uri mUrl; + /// <summary>Photon uses this to agree on a serialization protocol. Either: GpBinaryV16 or GpBinaryV18. Based on enum SerializationProtocol.</summary> + private string protocols = "GpBinaryV16"; + + public WebSocket(Uri url, string serialization = null) + { + this.mUrl = url; + if (serialization != null) + { + this.protocols = serialization; + } + + string protocol = mUrl.Scheme; + if (!protocol.Equals("ws") && !protocol.Equals("wss")) + throw new ArgumentException("Unsupported protocol: " + protocol); + } + + public void SendString(string str) + { + Send(Encoding.UTF8.GetBytes (str)); + } + + public string RecvString() + { + byte[] retval = Recv(); + if (retval == null) + return null; + return Encoding.UTF8.GetString (retval); + } + + #if UNITY_WEBGL && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern int SocketCreate (string url, string protocols); + + [DllImport("__Internal")] + private static extern int SocketState (int socketInstance); + + [DllImport("__Internal")] + private static extern void SocketSend (int socketInstance, byte[] ptr, int length); + + [DllImport("__Internal")] + private static extern void SocketRecv (int socketInstance, byte[] ptr, int length); + + [DllImport("__Internal")] + private static extern int SocketRecvLength (int socketInstance); + + [DllImport("__Internal")] + private static extern void SocketClose (int socketInstance); + + [DllImport("__Internal")] + private static extern int SocketError (int socketInstance, byte[] ptr, int length); + + int m_NativeRef = 0; + + public void Send(byte[] buffer) + { + SocketSend (m_NativeRef, buffer, buffer.Length); + } + + public byte[] Recv() + { + int length = SocketRecvLength (m_NativeRef); + if (length == 0) + return null; + byte[] buffer = new byte[length]; + SocketRecv (m_NativeRef, buffer, length); + return buffer; + } + + public void Connect() + { + m_NativeRef = SocketCreate (mUrl.ToString(), this.protocols); + + //while (SocketState(m_NativeRef) == 0) + // yield return 0; + } + + public void Close() + { + SocketClose(m_NativeRef); + } + + public bool Connected + { + get { return SocketState(m_NativeRef) != 0; } + } + + public string Error + { + get { + const int bufsize = 1024; + byte[] buffer = new byte[bufsize]; + int result = SocketError (m_NativeRef, buffer, bufsize); + + if (result == 0) + return null; + + return Encoding.UTF8.GetString (buffer); + } + } + #else + WebSocketSharp.WebSocket m_Socket; + Queue<byte[]> m_Messages = new Queue<byte[]>(); + bool m_IsConnected = false; + string m_Error = null; + + public void Connect() + { + m_Socket = new WebSocketSharp.WebSocket(mUrl.ToString(), new string[] { this.protocols }); + m_Socket.SslConfiguration.EnabledSslProtocols = m_Socket.SslConfiguration.EnabledSslProtocols | (SslProtocols)(3072| 768); + m_Socket.OnMessage += (sender, e) => m_Messages.Enqueue(e.RawData); + m_Socket.OnOpen += (sender, e) => m_IsConnected = true; + //this.m_Socket.Log.Level = LogLevel.Debug; + //this.m_Socket.Log.Output += Output; + this.m_Socket.OnClose += SocketOnClose; + m_Socket.OnError += (sender, e) => m_Error = e.Message + (e.Exception == null ? "" : " / " + e.Exception); + m_Socket.ConnectAsync(); + } + + private void SocketOnClose(object sender, CloseEventArgs e) + { + //UnityEngine.Debug.Log(e.Code.ToString()); + + // this code is used for cases when the socket failed to get created (specifically used to detect "blocked by Windows firewall") + // for some reason this situation is not calling OnError + if (e.Code == 1006) + { + this.m_Error = e.Reason; + this.m_IsConnected = false; + } + } + + public bool Connected { get { return m_IsConnected; } }// added by TS + + + public void Send(byte[] buffer) + { + m_Socket.Send(buffer); + } + + public byte[] Recv() + { + if (m_Messages.Count == 0) + return null; + return m_Messages.Dequeue(); + } + + public void Close() + { + m_Socket.Close(); + } + + public string Error + { + get + { + return m_Error; + } + } + #endif + } +} +#endif
\ No newline at end of file |