Exemple #1
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);
        }