Added NightAlert project for travel kit
This commit is contained in:
242
ThirdParty/SocketIoClientDotNet/Src/SocketIoClientDotNet.net45/Parser/Binary.cs
vendored
Normal file
242
ThirdParty/SocketIoClientDotNet/Src/SocketIoClientDotNet.net45/Parser/Binary.cs
vendored
Normal file
@@ -0,0 +1,242 @@
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Quobject.SocketIoClientDotNet.Parser
|
||||
{
|
||||
public class Binary
|
||||
{
|
||||
private static readonly string KEY_PLACEHOLDER = "_placeholder";
|
||||
|
||||
private static readonly string KEY_NUM = "num";
|
||||
|
||||
public static DeconstructedPacket DeconstructPacket(Packet packet)
|
||||
{
|
||||
var buffers = new List<byte[]>();
|
||||
|
||||
packet.Data = _deconstructPacket(packet.Data, buffers);
|
||||
packet.Attachments = buffers.Count;
|
||||
|
||||
var result = new DeconstructedPacket();
|
||||
result.Packet = packet;
|
||||
result.Buffers = buffers.ToArray();
|
||||
return result;
|
||||
}
|
||||
|
||||
private static JToken _deconstructPacket(object data, List<byte[]> buffers)
|
||||
{
|
||||
if (data == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (data is byte[])
|
||||
{
|
||||
var byteArray = (byte[])data;
|
||||
return AddPlaceholder(buffers, byteArray);
|
||||
}
|
||||
|
||||
var jToken = data as JToken;
|
||||
if (jToken == null)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
switch (jToken.Type)
|
||||
{
|
||||
case JTokenType.Object:
|
||||
var newJObject = new JObject();
|
||||
var jObject = (JObject)jToken;
|
||||
foreach (var property in jObject.Properties())
|
||||
{
|
||||
try
|
||||
{
|
||||
newJObject[property.Name] = _deconstructPacket(property.Value, buffers);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return newJObject;
|
||||
|
||||
case JTokenType.Array:
|
||||
var newJArray = new JArray();
|
||||
var jArray = (JArray)jToken;
|
||||
for (int i = 0; i < jArray.Count; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
newJArray.Add(_deconstructPacket(jArray[i], buffers));
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return newJArray;
|
||||
|
||||
case JTokenType.Bytes:
|
||||
var byteArray = jToken.Value<byte[]>();
|
||||
return AddPlaceholder(buffers, byteArray);
|
||||
|
||||
case JTokenType.None:
|
||||
case JTokenType.Constructor:
|
||||
case JTokenType.Property:
|
||||
case JTokenType.Comment:
|
||||
throw new NotImplementedException();
|
||||
|
||||
default:
|
||||
return jToken;
|
||||
}
|
||||
}
|
||||
|
||||
private static JToken AddPlaceholder(List<byte[]> buffers, byte[] byteArray)
|
||||
{
|
||||
var placeholder = new JObject();
|
||||
try
|
||||
{
|
||||
placeholder.Add(KEY_PLACEHOLDER, true);
|
||||
placeholder.Add(KEY_NUM, buffers.Count);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
buffers.Add(byteArray);
|
||||
return placeholder;
|
||||
}
|
||||
|
||||
public static Packet ReconstructPacket(Packet packet, byte[][] buffers)
|
||||
{
|
||||
packet.Data = _reconstructPacket(packet.Data, buffers);
|
||||
packet.Attachments = -1;
|
||||
return packet;
|
||||
}
|
||||
|
||||
private static object _reconstructPacket(object data, byte[][] buffers)
|
||||
{
|
||||
//var t = data.GetType();
|
||||
|
||||
if (data is JValue)
|
||||
{
|
||||
var dataStr = data.ToString();
|
||||
if (!dataStr.StartsWith("[") && !dataStr.StartsWith("{"))
|
||||
{
|
||||
//
|
||||
return dataStr;
|
||||
}
|
||||
var jdata = JToken.Parse(data.ToString());
|
||||
if (jdata.SelectToken(KEY_PLACEHOLDER) != null)
|
||||
{
|
||||
var jpl = jdata[KEY_PLACEHOLDER];
|
||||
var jnum = jdata[KEY_NUM];
|
||||
if (jpl != null && jnum != null)
|
||||
{
|
||||
var placeholder = jpl.ToObject<bool>();
|
||||
if (placeholder)
|
||||
{
|
||||
var num = jnum.ToObject<int>();
|
||||
return buffers[num];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var recValue = _reconstructPacket(jdata, buffers);
|
||||
return recValue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//jdata
|
||||
}else if (data is JArray)
|
||||
{
|
||||
var _data = (JArray)data;
|
||||
int len = _data.Count;
|
||||
var newData = new JArray();
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
var recValue = _reconstructPacket(_data[i], buffers);
|
||||
if (recValue is string)
|
||||
{
|
||||
//newData[i] = (string) recValue;
|
||||
newData.Add((string)recValue);
|
||||
}
|
||||
else if (recValue is byte[])
|
||||
{
|
||||
newData.Add((byte[])recValue);
|
||||
}
|
||||
else if (recValue is JArray)
|
||||
{
|
||||
//newData[i] = (JArray) recValue;
|
||||
newData.Add((JArray)recValue);
|
||||
}
|
||||
else if (recValue is JObject)
|
||||
{
|
||||
//newData[i] = (JObject)recValue;
|
||||
newData.Add((JObject)recValue);
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return newData;
|
||||
}
|
||||
if (!(data is JObject))
|
||||
{
|
||||
return data;
|
||||
}
|
||||
|
||||
var newData1 = new JObject();
|
||||
var _data1 = (JObject)data;
|
||||
|
||||
//if ((bool) _data1[KEY_PLACEHOLDER])
|
||||
if (_data1.SelectToken(KEY_PLACEHOLDER) != null && (bool) _data1[KEY_PLACEHOLDER])
|
||||
{
|
||||
var num = (int)_data1[KEY_NUM];
|
||||
return num >= 0 && num < buffers.Length ? buffers[num] : null;
|
||||
}
|
||||
|
||||
foreach (var property in _data1.Properties())
|
||||
{
|
||||
try
|
||||
{
|
||||
var recValue = _reconstructPacket(property.Value, buffers);
|
||||
if (recValue is string)
|
||||
{
|
||||
newData1[property.Name] = (string)recValue;
|
||||
}
|
||||
else if (recValue is byte[])
|
||||
{
|
||||
newData1[property.Name] = (byte[])recValue;
|
||||
}
|
||||
else if (recValue is JArray)
|
||||
{
|
||||
newData1[property.Name] = (JArray)recValue;
|
||||
}
|
||||
else if (recValue is JObject)
|
||||
{
|
||||
newData1[property.Name] = (JObject)recValue;
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return newData1;
|
||||
}
|
||||
|
||||
|
||||
public class DeconstructedPacket
|
||||
{
|
||||
public Packet Packet;
|
||||
public byte[][] Buffers;
|
||||
}
|
||||
}
|
||||
}
|
||||
109
ThirdParty/SocketIoClientDotNet/Src/SocketIoClientDotNet.net45/Parser/Packet.cs
vendored
Normal file
109
ThirdParty/SocketIoClientDotNet/Src/SocketIoClientDotNet.net45/Parser/Packet.cs
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Quobject.SocketIoClientDotNet.Parser
|
||||
{
|
||||
public class Packet<T>
|
||||
{
|
||||
public int Type = -1;
|
||||
public int Id = -1;
|
||||
public String Nsp;
|
||||
public T Data;
|
||||
public int Attachments;
|
||||
|
||||
public Packet() { }
|
||||
|
||||
public Packet(int type)
|
||||
{
|
||||
this.Type = type;
|
||||
}
|
||||
|
||||
public Packet(int type, T data)
|
||||
{
|
||||
this.Type = type;
|
||||
this.Data = data;
|
||||
}
|
||||
}
|
||||
public class Packet
|
||||
{
|
||||
public int Type = -1;
|
||||
public int Id = -1;
|
||||
public String Nsp;
|
||||
public object Data;
|
||||
public int Attachments;
|
||||
|
||||
public Packet()
|
||||
{ }
|
||||
|
||||
public Packet(int type)
|
||||
: this(type, data: JToken.Parse("{}"))
|
||||
{
|
||||
}
|
||||
|
||||
public Packet(int type, object data)
|
||||
{
|
||||
this.Type = type;
|
||||
this.Data = data;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format("Type:{0} Id:{1} Nsp:{2} Data:{3} Attachments:{4}", Type, Id, Nsp, Data, Attachments);
|
||||
}
|
||||
|
||||
public List<object> GetDataAsList()
|
||||
{
|
||||
var jarray = Data is JArray ? (JArray)Data : JArray.Parse((string)((JValue)Data).Value);
|
||||
var args = new List<object>();
|
||||
foreach (var o in jarray)
|
||||
{
|
||||
if (o is JValue)
|
||||
{
|
||||
var jval = (JValue)o;
|
||||
if (jval != null)
|
||||
{
|
||||
args.Add(jval.Value);
|
||||
}
|
||||
}
|
||||
else if (o is JToken)
|
||||
{
|
||||
var jtoken = (JToken)o;
|
||||
if (jtoken != null)
|
||||
{
|
||||
args.Add(jtoken);
|
||||
//args.Add(jtoken.ToString(Formatting.None));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return args;
|
||||
}
|
||||
|
||||
public static JArray Args2JArray(IEnumerable<object> _args)
|
||||
{
|
||||
var jsonArgs = new JArray();
|
||||
foreach (var o in _args)
|
||||
{
|
||||
jsonArgs.Add(o);
|
||||
}
|
||||
return jsonArgs;
|
||||
}
|
||||
|
||||
public static JArray Remove(JArray a, int pos)
|
||||
{
|
||||
var na = new JArray();
|
||||
for (int i = 0; i < a.Count; i++)
|
||||
{
|
||||
if (i != pos)
|
||||
{
|
||||
var v = a[i];
|
||||
na.Add(v);
|
||||
}
|
||||
}
|
||||
return na;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
323
ThirdParty/SocketIoClientDotNet/Src/SocketIoClientDotNet.net45/Parser/Parser.cs
vendored
Normal file
323
ThirdParty/SocketIoClientDotNet/Src/SocketIoClientDotNet.net45/Parser/Parser.cs
vendored
Normal file
@@ -0,0 +1,323 @@
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Quobject.EngineIoClientDotNet.ComponentEmitter;
|
||||
using Quobject.EngineIoClientDotNet.Modules;
|
||||
using Quobject.SocketIoClientDotNet.Client;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
|
||||
namespace Quobject.SocketIoClientDotNet.Parser
|
||||
{
|
||||
public class Parser
|
||||
{
|
||||
public const int CONNECT = 0;
|
||||
public const int DISCONNECT = 1;
|
||||
public const int EVENT = 2;
|
||||
public const int ACK = 3;
|
||||
public const int ERROR = 4;
|
||||
public const int BINARY_EVENT = 5;
|
||||
public const int BINARY_ACK = 6;
|
||||
public const int protocol = 4;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Packet types
|
||||
/// </summary>
|
||||
public static List<string> types = new List<string>()
|
||||
{
|
||||
"CONNECT",
|
||||
"DISCONNECT",
|
||||
"EVENT",
|
||||
"BINARY_EVENT",
|
||||
"ACK",
|
||||
"BINARY_ACK",
|
||||
"ERROR"
|
||||
};
|
||||
|
||||
private Parser() { }
|
||||
|
||||
private static Packet ErrorPacket = new Packet(ERROR, "parser error");
|
||||
|
||||
public class Encoder
|
||||
{
|
||||
public Encoder() { }
|
||||
|
||||
public interface ICallback
|
||||
{
|
||||
void Call(object[] data);
|
||||
}
|
||||
|
||||
|
||||
public void Encode(Packet obj, ICallback callback)
|
||||
{
|
||||
var log = LogManager.GetLogger(Global.CallerName());
|
||||
log.Info(string.Format("encoding packet {0}", obj));
|
||||
|
||||
if (BINARY_EVENT == obj.Type || BINARY_ACK == obj.Type)
|
||||
{
|
||||
EncodeAsBinary(obj, callback);
|
||||
}
|
||||
else
|
||||
{
|
||||
String encoding = EncodeAsString(obj);
|
||||
callback.Call(new object[] { encoding });
|
||||
}
|
||||
}
|
||||
|
||||
private string EncodeAsString(Packet obj)
|
||||
{
|
||||
var str = new StringBuilder();
|
||||
bool nsp = false;
|
||||
|
||||
str.Append(obj.Type);
|
||||
|
||||
if (BINARY_EVENT == obj.Type || BINARY_ACK == obj.Type)
|
||||
{
|
||||
str.Append(obj.Attachments);
|
||||
str.Append("-");
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(obj.Nsp) && !"/".Equals(obj.Nsp))
|
||||
{
|
||||
nsp = true;
|
||||
str.Append(obj.Nsp);
|
||||
}
|
||||
|
||||
if (obj.Id >= 0)
|
||||
{
|
||||
if (nsp)
|
||||
{
|
||||
str.Append(",");
|
||||
nsp = false;
|
||||
}
|
||||
str.Append(obj.Id);
|
||||
}
|
||||
|
||||
if (obj.Data != null)
|
||||
{
|
||||
if (nsp) str.Append(",");
|
||||
str.Append(obj.Data);
|
||||
}
|
||||
|
||||
var log = LogManager.GetLogger(Global.CallerName());
|
||||
log.Info(string.Format("encoded {0} as {1}", obj, str));
|
||||
return str.ToString();
|
||||
}
|
||||
|
||||
private void EncodeAsBinary(Packet obj, ICallback callback)
|
||||
{
|
||||
Binary.DeconstructedPacket deconstruction = Binary.DeconstructPacket(obj);
|
||||
String pack = EncodeAsString(deconstruction.Packet);
|
||||
var buffers = new List<object>();
|
||||
foreach (var item in deconstruction.Buffers)
|
||||
{
|
||||
buffers.Add(item);
|
||||
}
|
||||
|
||||
buffers.Insert(0, pack);
|
||||
callback.Call(buffers.ToArray());
|
||||
}
|
||||
|
||||
public class CallbackImp : ICallback
|
||||
{
|
||||
private readonly Action<object[]> Fn;
|
||||
|
||||
public CallbackImp(Action<object[]> fn)
|
||||
{
|
||||
Fn = fn;
|
||||
}
|
||||
|
||||
public void Call(object[] data)
|
||||
{
|
||||
Fn(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class Decoder : Emitter
|
||||
{
|
||||
public const string EVENT_DECODED = "decoded";
|
||||
|
||||
/*package*/
|
||||
public BinaryReconstructor Reconstructor = null;
|
||||
|
||||
public Decoder()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Add(string obj)
|
||||
{
|
||||
Packet packet = decodeString(obj);
|
||||
if (packet.Type == BINARY_EVENT || packet.Type == BINARY_ACK)
|
||||
{
|
||||
this.Reconstructor = new BinaryReconstructor(packet);
|
||||
|
||||
if (this.Reconstructor.reconPack.Attachments == 0)
|
||||
{
|
||||
this.Emit(EVENT_DECODED, packet);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this.Emit(EVENT_DECODED, packet);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void Add(byte[] obj)
|
||||
{
|
||||
if (this.Reconstructor == null)
|
||||
{
|
||||
throw new SocketIOException("got binary data when not reconstructing a packet");
|
||||
}
|
||||
else
|
||||
{
|
||||
var packet = this.Reconstructor.TakeBinaryData(obj);
|
||||
if (packet != null)
|
||||
{
|
||||
this.Reconstructor = null;
|
||||
this.Emit(EVENT_DECODED, packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Packet decodeString(string str)
|
||||
{
|
||||
Packet p = new Packet();
|
||||
int i = 0;
|
||||
|
||||
p.Type = int.Parse(str.Substring(0,1));
|
||||
if (p.Type < 0 || p.Type > types.Count - 1) return ErrorPacket;
|
||||
|
||||
if (BINARY_EVENT == p.Type || BINARY_ACK == p.Type)
|
||||
{
|
||||
StringBuilder attachments = new StringBuilder();
|
||||
while (str.Substring(++i, 1) != "-")
|
||||
{
|
||||
attachments.Append(str.Substring(i, 1));
|
||||
}
|
||||
p.Attachments = int.Parse(attachments.ToString());
|
||||
}
|
||||
|
||||
if (str.Length > i + 1 && "/" == str.Substring(i+1, 1))
|
||||
{
|
||||
var nsp = new StringBuilder();
|
||||
while (true)
|
||||
{
|
||||
++i;
|
||||
string c = str.Substring(i, 1);
|
||||
if ("," == c)
|
||||
{
|
||||
break;
|
||||
}
|
||||
nsp.Append(c);
|
||||
if (i + 1 == str.Length)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
p.Nsp = nsp.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
p.Nsp = "/";
|
||||
}
|
||||
|
||||
var next = (i + 1) >= str.Length ? null : str.Substring(i + 1, 1);
|
||||
|
||||
int unused;
|
||||
if (null != next && int.TryParse(next, out unused))
|
||||
{
|
||||
var id = new StringBuilder();
|
||||
while (true)
|
||||
{
|
||||
++i;
|
||||
var c = str.Substring(i, 1);
|
||||
|
||||
if (!int.TryParse(c, out unused))
|
||||
{
|
||||
--i;
|
||||
break;
|
||||
}
|
||||
id.Append(c);
|
||||
if (i + 1 >= str.Length)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
p.Id = int.Parse(id.ToString());
|
||||
}
|
||||
|
||||
|
||||
if (i++ < str.Length)
|
||||
{
|
||||
try
|
||||
{
|
||||
var t = str.Substring(i);
|
||||
p.Data = new JValue(t);
|
||||
}
|
||||
catch (ArgumentOutOfRangeException)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return ErrorPacket;
|
||||
}
|
||||
}
|
||||
var log = LogManager.GetLogger(Global.CallerName());
|
||||
log.Info(string.Format("decoded {0} as {1}", str, p));
|
||||
return p;
|
||||
}
|
||||
|
||||
public void Destroy()
|
||||
{
|
||||
if (Reconstructor != null)
|
||||
{
|
||||
Reconstructor.FinishReconstruction();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*package*/
|
||||
public class BinaryReconstructor
|
||||
{
|
||||
|
||||
public Packet reconPack;
|
||||
|
||||
/*package*/
|
||||
public List<byte[]> Buffers;
|
||||
|
||||
public BinaryReconstructor(Packet packet)
|
||||
{
|
||||
this.reconPack = packet;
|
||||
this.Buffers = new List<byte[]>();
|
||||
}
|
||||
|
||||
public Packet TakeBinaryData(byte[] binData)
|
||||
{
|
||||
this.Buffers.Add(binData);
|
||||
if (this.Buffers.Count == this.reconPack.Attachments)
|
||||
{
|
||||
Packet packet = Binary.ReconstructPacket(this.reconPack,
|
||||
this.Buffers.ToArray());
|
||||
this.FinishReconstruction();
|
||||
return packet;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void FinishReconstruction()
|
||||
{
|
||||
this.reconPack = null;
|
||||
this.Buffers = new List<byte[]>();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user