180 lines
5.3 KiB
C#
180 lines
5.3 KiB
C#
using System;
|
|
using System.Runtime.Serialization;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Converters;
|
|
|
|
namespace Ooui
|
|
{
|
|
public class Message
|
|
{
|
|
[JsonProperty("m")]
|
|
public MessageType MessageType = MessageType.Nop;
|
|
|
|
[JsonProperty("id")]
|
|
public string TargetId = "";
|
|
|
|
[JsonProperty("k")]
|
|
public string Key = "";
|
|
|
|
[JsonProperty("v", NullValueHandling = NullValueHandling.Ignore)]
|
|
public object Value = null;
|
|
|
|
[JsonProperty("rid", NullValueHandling = NullValueHandling.Ignore)]
|
|
public string ResultId = null;
|
|
|
|
public static Message Call (string targetId, string method, params object[] args) => new Message {
|
|
MessageType = MessageType.Call,
|
|
TargetId = targetId,
|
|
Key = method,
|
|
Value = args,
|
|
};
|
|
|
|
public static Message Event (string targetId, string eventType, object value = null) => new Message {
|
|
MessageType = MessageType.Event,
|
|
TargetId = targetId,
|
|
Key = eventType,
|
|
Value = value,
|
|
};
|
|
|
|
static void WriteJsonString (System.IO.TextWriter w, string s)
|
|
{
|
|
w.Write ('\"');
|
|
for (var i = 0; i < s.Length; i++) {
|
|
var c = s[i];
|
|
if (c == '\"') {
|
|
w.Write ("\\\"");
|
|
}
|
|
else if (c == '\r') {
|
|
w.Write ("\\r");
|
|
}
|
|
else if (c == '\n') {
|
|
w.Write ("\\n");
|
|
}
|
|
else if (c == '\t') {
|
|
w.Write ("\\t");
|
|
}
|
|
else if (c == '\b') {
|
|
w.Write ("\\b");
|
|
}
|
|
else if (c == '\\') {
|
|
w.Write ("\\");
|
|
}
|
|
else {
|
|
w.Write (c);
|
|
}
|
|
}
|
|
w.Write ('\"');
|
|
}
|
|
|
|
static void WriteJsonValue (System.IO.TextWriter w, object value)
|
|
{
|
|
if (value == null) {
|
|
w.Write ("null");
|
|
return;
|
|
}
|
|
var s = value as string;
|
|
if (s != null) {
|
|
WriteJsonString (w, s);
|
|
return;
|
|
}
|
|
|
|
var a = value as Array;
|
|
if (a != null) {
|
|
w.Write ('[');
|
|
var head = "";
|
|
foreach (var o in a) {
|
|
w.Write (head);
|
|
WriteJsonValue (w, o);
|
|
head = ",";
|
|
}
|
|
w.Write (']');
|
|
return;
|
|
}
|
|
|
|
var e = value as EventTarget;
|
|
if (e != null) {
|
|
w.Write ('\"');
|
|
w.Write (e.Id);
|
|
w.Write ('\"');
|
|
return;
|
|
}
|
|
|
|
if (value is Color) {
|
|
WriteJsonString (w, ((Color)value).ToString ());
|
|
return;
|
|
}
|
|
|
|
var icult = System.Globalization.CultureInfo.InvariantCulture;
|
|
|
|
if (value is double) {
|
|
w.Write (((double)value).ToString (icult));
|
|
}
|
|
|
|
if (value is int) {
|
|
w.Write (((int)value).ToString (icult));
|
|
}
|
|
|
|
if (value is float) {
|
|
w.Write (((float)value).ToString (icult));
|
|
}
|
|
|
|
WriteJsonString (w, Convert.ToString (value, icult));
|
|
}
|
|
|
|
public void WriteJson (System.IO.TextWriter w)
|
|
{
|
|
w.Write ('{');
|
|
switch (MessageType) {
|
|
case MessageType.Call: w.Write ("\"m\":\"call\",\"id\":\""); break;
|
|
case MessageType.Create: w.Write ("\"m\":\"create\",\"id\":\""); break;
|
|
case MessageType.Event: w.Write ("\"m\":\"event\",\"id\":\""); break;
|
|
case MessageType.Listen: w.Write ("\"m\":\"listen\",\"id\":\""); break;
|
|
case MessageType.Nop: w.Write ("\"m\":\"nop\",\"id\":\""); break;
|
|
case MessageType.RemoveAttribute: w.Write ("\"m\":\"remAttr\",\"id\":\""); break;
|
|
case MessageType.Set: w.Write ("\"m\":\"set\",\"id\":\""); break;
|
|
case MessageType.SetAttribute: w.Write ("\"m\":\"setAttr\",\"id\":\""); break;
|
|
}
|
|
w.Write (TargetId);
|
|
w.Write ("\",\"k\":\"");
|
|
w.Write (Key);
|
|
if (Value != null) {
|
|
w.Write ("\",\"v\":");
|
|
WriteJsonValue (w, Value);
|
|
w.Write ('}');
|
|
}
|
|
else {
|
|
w.Write ("\"}");
|
|
}
|
|
}
|
|
|
|
public string ToJson ()
|
|
{
|
|
using (var sw = new System.IO.StringWriter ()) {
|
|
WriteJson (sw);
|
|
return sw.ToString ();
|
|
}
|
|
}
|
|
}
|
|
|
|
[JsonConverter (typeof (StringEnumConverter))]
|
|
public enum MessageType
|
|
{
|
|
[EnumMember(Value = "nop")]
|
|
Nop,
|
|
[EnumMember(Value = "create")]
|
|
Create,
|
|
[EnumMember(Value = "set")]
|
|
Set,
|
|
[EnumMember (Value = "setAttr")]
|
|
SetAttribute,
|
|
[EnumMember(Value = "remAttr")]
|
|
RemoveAttribute,
|
|
[EnumMember(Value = "call")]
|
|
Call,
|
|
[EnumMember(Value = "listen")]
|
|
Listen,
|
|
[EnumMember(Value = "event")]
|
|
Event,
|
|
}
|
|
}
|