/// <summary>set topics field</summary> /// <param name="args"> /// REQUEST: [14, msgId, path, fieldName, value] /// RESPONSE: [3, msgId, success, [errorMsg] ] /// </param> private void SetField(EsMessage msg) { if (msg.Count != 5 || !msg[1].IsNumber || msg[2].ValueType != JSC.JSValueType.String || msg[3].ValueType != JSC.JSValueType.String) { if (_basePl.verbose) { Log.Warning("Syntax error: {0}", msg); } return; } Topic t = Topic.root.Get(msg[2].Value as string, false, _owner); if (t != null) { if (t.TrySetField(msg[3].Value as string, msg[4], _owner)) { msg.Response(3, msg[1], true); } else { msg.Response(3, msg[1], false, "FieldAccessError"); } } else { msg.Response(3, msg[1], false, "TopicNotExist"); } }
/// <summary>Read old log entrys</summary> /// <param name="msg">Req: [91, Date. count]</param> private void History(EsMessage msg) { if (msg.Count != 3 || msg[1].ValueType != JSC.JSValueType.Date || !msg[2].IsNumber) { if (_basePl.verbose) { Log.Warning("Syntax error: {0}", msg); } return; } try { if (Log.History != null) { var resp = Log.History((msg[1].Value as JSL.Date).ToDateTime(), (int)msg[2]); foreach (var e in resp) { base.SendArr(new JSL.Array { 90, JSC.JSValue.Marshal(e.dt), (int)e.ll, e.format }, false); } } } catch (Exception ex) { Log.Warning("History({0}) - {1}", msg[1].Value as string, ex.Message); } }
/// <summary>Create topic</summary> /// <param name="args"> /// REQUEST: [8, msgId, path, state, manifest] /// </param> private void Create(EsMessage msg) { if (msg.Count < 4 || !msg[1].IsNumber || msg[2].ValueType != JSC.JSValueType.String) { if (_basePl.verbose) { Log.Warning("Syntax error: {0}", msg); } return; } Create(Topic.root, msg[2].Value as string, msg[3], (msg[4].ValueType == JSC.JSValueType.Object && msg[4].Value != null) ? msg[4] : null); }
/// <summary>Remove topic</summary> /// <param name="args"> /// REQUEST: [12, msgId, path] /// </param> private void Remove(EsMessage msg) { if (msg.Count != 3 || !msg[1].IsNumber || msg[2].ValueType != JSC.JSValueType.String) { if (_basePl.verbose) { Log.Warning("Syntax error: {0}", msg); } return; } Topic t = Topic.root.Get(msg[2].Value as string, false, _owner); if (t != null) { t.Remove(_owner); } }
/// <summary>Import</summary> /// <param name="msg"> /// Command: [16, FileName, payload(Base64)] /// </param> private void Import(EsMessage msg) { if (msg.Count != 3 || msg[1].ValueType != JSC.JSValueType.String || msg[2].ValueType != JSC.JSValueType.String) { if (_basePl.verbose) { Log.Warning("Syntax error: {0}", msg); } return; } try { var str = Encoding.UTF8.GetString(Convert.FromBase64String(msg[2].Value as string)); using (var sr = new StringReader(str)) { Repo.Import(sr, null); } } catch (Exception ex) { Log.Warning("Import({0}) - {1}", msg[1].Value as string, ex.Message); } }
/// <summary>Move topic</summary> /// <param name="args"> /// REQUEST: [10, msgId, path source, path destinations parent, new name(optional rename)] /// </param> private void Move(EsMessage msg) { if (msg.Count < 4 || msg.Count > 5 || !msg[1].IsNumber || msg[2].ValueType != JSC.JSValueType.String || msg[3].ValueType != JSC.JSValueType.String || (msg.Count == 5 && msg[4].ValueType != JSC.JSValueType.String)) { if (_basePl.verbose) { Log.Warning("Syntax error: {0}", msg); } return; } Topic t = Topic.root.Get(msg[2].Value as string, false, _owner); Topic p = Topic.root.Get(msg[3].Value as string, false, _owner); if (t != null && p != null) { string nname = msg.Count == 5 ? (msg[4].Value as string) : t.name; t.Move(p, nname, _owner); } }
/// <summary>set topics state</summary> /// <param name="args"> /// REQUEST: [6, msgId, path, value] /// RESPONSE: [3, msgId, success, [errorMsg] ] /// </param> private void SetState(EsMessage msg) { if (msg.Count != 4 || !msg[1].IsNumber || msg[2].ValueType != JSC.JSValueType.String) { if (_basePl.verbose) { Log.Warning("Syntax error: {0}", msg); } return; } string path = msg[2].Value as string; Topic t = Topic.root.Get(path, false, _owner); if (t != null) { t.SetState(msg[3], _owner); msg.Response(3, msg[1], true); } else { msg.Response(3, msg[1], false, "TopicNotExist"); } }
/// <summary>Subscribe topics</summary> /// <param name="args"> /// REQUEST: [4, msgId, path, mask], mask: 1 - data, 2 - children /// RESPONSE: [3, msgId, success, exist] /// </param> private void Subscribe(EsMessage msg) { if (msg.Count != 4 || !msg[1].IsNumber || msg[2].ValueType != JSC.JSValueType.String || !msg[3].IsNumber) { if (_basePl.verbose) { Log.Warning("Syntax error: {0}", msg); } return; } Topic parent = Topic.root.Get(msg[2].Value as string, false, _owner); if (parent != null) { var sr1 = parent.Subscribe(SubRec.SubMask.Value | SubRec.SubMask.Field | SubRec.SubMask.Once | SubRec.SubMask.Chldren, string.Empty, _subCB); lock (_subscriptions) { _subscriptions.Add(new Tuple <SubRec, EsMessage>(sr1, msg)); } } else { msg.Response(3, msg[1], true, false); } }
private void RcvMsg(EsMessage msg) { if (msg.Count == 0) { return; } try { if (msg[0].IsNumber) { switch ((int)msg[0]) { case 4: this.Subscribe(msg); break; case 6: this.SetState(msg); break; case 8: this.Create(msg); break; case 10: this.Move(msg); break; case 12: this.Remove(msg); break; case 14: this.SetField(msg); break; case 16: this.Import(msg); break; case 91: this.History(msg); break; case 99: { var o = Interlocked.Exchange(ref _owner, null); if (o != null) { Log.Write -= Log_Write; Log.Info("{0} connection dropped", o.path); o.Remove(o); //-V3062 lock (_subscriptions) { foreach (var sr in _subscriptions) { sr.Item1.Dispose(); } } } } break; // Disconnect } } else { _basePl.AddRMsg(msg); } } catch (Exception ex) { if (_basePl.verbose) { Log.Warning("{0} - {1}", msg, ex); } } }
internal void AddRMsg(EsMessage msg) { _msgs.Add(msg); }