Exemple #1
0
        public void RemoveChild(SyncObj obj)
        {
            var n = obj.Name;

            if (!HasChild(n) || m_childs[n] != obj)
            {
                return;
            }
            RemoveChild(n);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
 public void Reset()
 {
     RootObj = new SyncObj(sid);
 }
Exemple #5
0
        /// <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);
        }
Exemple #6
0
 public SyncObj(uint sid, SyncObj parent, string name)
 {
     this.sid  = sid;
     this.Name = name;
     m_Parent  = parent;
 }