public void RemoveChild(SyncObj obj) { var n = obj.Name; if (!HasChild(n) || m_childs[n] != obj) { return; } RemoveChild(n); }
public SyncObj GetChild(string name, bool autoCreate = true) { if (HasChild(name)) { return(m_childs[name]); } if (!autoCreate) { return(null); //不允许自动创建,只能返回null } var obj = new SyncObj(sid, this, name); m_childs.Add(name, obj); return(obj); }
internal void PostEvent(SyncObj obj, string attrName) { //精确绑定的事件 { QKEvent evt = GetValueChangedEvent(obj.sid, obj.Path, attrName); if (evt != null) { evt.Call(attrName); } } //模糊绑定的事件 { var evts = GetValueChangedEvents(obj.sid, obj.Path); if (evts != null) { foreach (var evtkv in evts) { var kvAttrName = evtkv.Key; var evt = evtkv.Value; if (kvAttrName == "" && evt != null) { evt.Call(attrName); } } } } //同时监听子对象的事件 { var fullPath = obj.Path + "@" + attrName; var path = obj.Path; do { var evts = GetValueChangedEvents(obj.sid, path); if (evts != null) { foreach (var evtkv in evts) { var kvAttrName = evtkv.Key; var evt = evtkv.Value; if (kvAttrName == "*" && evt != null) { evt.Call(fullPath); } } } if (path == "") { path = null; } else { int idx = path.LastIndexOf('/'); if (idx < 0) { path = ""; } else { path = path.Substring(0, idx); } } } while(path != null); } }
public void Reset() { RootObj = new SyncObj(sid); }
/// <summary> /// 执行封包分发 /// </summary> /// <returns></returns> public bool DoDispatcher(QK_JsonValue_Map doc) { if (null == doc) { return(false); } if ("_Sync" != doc.StrValue("n")) { return(false); //这不是一个同步包 } uint sid = uint.Parse(doc.StrValue("sid")); string tm = doc.StrValue("tm"); if (tm == null) { return(false); } DateTime svrTime = DateTime.FromFileTime(long.Parse(tm)); //服务器的当前时间 var svrNode = UpdateSvrTime(sid, svrTime); //服务器时间刷新到本地内存 QK_JsonValue_Array paths = doc["o"] as QK_JsonValue_Array; if (paths == null) { return(false); //不是正确的同步消息 } foreach (KeyValuePair <string, QK_JsonValue> kvpath in paths) { var objs = kvpath.Value as QK_JsonValue_Array; if (objs == null) { continue; //错误的协议 } var path = kvpath.Key; //获取本路径对应的对象 var pathObj = GetObject(sid, path, true); foreach (KeyValuePair <string, QK_JsonValue> kvobj in objs) { QK_JsonValue_Map objInfo = kvobj.Value as QK_JsonValue_Map; if (objInfo == null) { return(false); } //取得对象id string name = objInfo.StrValue("n"); SyncObj currObj = pathObj.GetChild(name); if (objInfo["d"] != null) //本对象被删除 { pathObj.RemoveChild(name); } else //变更属性 { QK_JsonValue_Array mNode = objInfo["m"] as QK_JsonValue_Array; if (mNode != null) //存在属性 { foreach (KeyValuePair <string, QK_JsonValue> currkv in mNode) { string attName = currkv.Key; QK_JsonValue_Str attValue_json = currkv.Value as QK_JsonValue_Str; if (attValue_json == null) { continue; } string attValue = (string)attValue_json; currObj.SetValue(attName, attValue); } } } } //end foreach (KeyValuePair<string, QK_JsonValue> kvobj in objs) } //end foreach (KeyValuePair<string, QK_JsonValue> kvpath in paths) return(true); }
public SyncObj(uint sid, SyncObj parent, string name) { this.sid = sid; this.Name = name; m_Parent = parent; }