示例#1
0
        private void ConvertCsObj(object csObj, IMPObject mpObj)
        {
            Type   type     = csObj.GetType();
            string fullName = type.FullName;

            if (!(mpObj is Serializable))
            {
                throw new Exception(string.Concat("Cannot serialize object: ", csObj, ", type: ", fullName, " -- It doesn't implement the SerializableSFSType interface"));
            }
            IMPArray val = MPArray.NewInstance();

            mpObj.PutUtfString(CLASS_MARKER_KEY, fullName);
            mpObj.PutMPArray(CLASS_FIELDS_KEY, val);
            foreach (FieldInfo info in type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance))
            {
                string        name    = info.Name;
                object        obj2    = info.GetValue(csObj);
                IMPObject     obj3    = MPObject.NewInstance();
                MPDataWrapper wrapper = WrapField(obj2);
                if (wrapper != null)
                {
                    obj3.PutUtfString(FIELD_NAME_KEY, name);
                    obj3.Put(FIELD_VALUE_KEY, wrapper);
                    val.AddMPObject(obj3);
                }
                else
                {
                    throw new Exception(string.Concat("Cannot serialize field of object: ", csObj, ", field: ", name, ", type: ", info.GetType().Name, " -- unsupported type!"));
                }
            }
        }
示例#2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="requestObject"></param>
        private void DispatchRequest(IMPObject requestObject)
        {
            IMessage message = new Message();

            if (requestObject.IsNull(CONTROLLER_ID))
            {
                throw new Exception("Request rejected: No Controller ID in request!");
            }
            if (requestObject.IsNull(ACTION_ID))
            {
                throw new Exception("Request rejected: No Action ID in request!");
            }
            message.Id      = Convert.ToInt32(requestObject.GetShort(ACTION_ID));
            message.Content = requestObject.GetMPObject(PARAM_ID);
            message.IsUDP   = requestObject.ContainsKey(UDP_PACKET_ID);
            if (message.IsUDP)
            {
                message.PacketId = requestObject.GetLong(UDP_PACKET_ID);
            }
            int         @byte      = requestObject.GetByte(CONTROLLER_ID);
            IController controller = this.bitSwarm.GetController(@byte);

            if (controller == null)
            {
                throw new Exception("Cannot handle server response. Unknown controller, id: " + @byte);
            }
            controller.HandleMessage(message);
        }
示例#3
0
        //----------------------------------  Class Mapping  -------------------------------------
        //*********************************** Class to MPObject  *********************************
        private IMPObject Cs2Mp(object csObj)
        {
            IMPObject sfsObj = MPObject.NewInstance();

            ConvertCsObj(csObj, sfsObj);
            return(sfsObj);
        }
示例#4
0
        private IMPObject UnrollDictionary(IDictionary dict)
        {
            IMPObject   obj2       = MPObject.NewInstance();
            IEnumerator enumerator = dict.Keys.GetEnumerator();

            try
            {
                while (enumerator.MoveNext())
                {
                    string        current = (string)enumerator.Current;
                    MPDataWrapper val     = WrapField(dict[current]);
                    if (val == null)
                    {
                        throw new Exception(string.Concat("Cannot serialize field of dictionary with key: ", current, ", ", dict[current], " -- unsupported type!"));
                    }
                    obj2.Put(current, val);
                }
            }
            finally
            {
                IDisposable disposable = enumerator as IDisposable;
                if (disposable != null)
                {
                    disposable.Dispose();
                }
            }
            return(obj2);
        }
示例#5
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="ip"></param>
    /// <param name="port"></param>
    public void Connect(string ip, int port)
    {
        MPNetClient mpnet = new MPNetClient(m_PrefabConnecterId);

        mpnet.Connect(ip, port);

        mpnet.AddEventListener(MPEvent.CONNECTION, delegate(BaseEvent evt)
        {
            IMPObject par = evt.Params;
            if ((bool)par["success"])
            {
                IMPObject mpo  = MPObject.NewInstance();
                mpo["test1"]   = 22;
                mpo["test2"]   = 22;
                mpo["test3"]   = 33;
                LuaTable table = mpo.ToLuaTable();
                GTLib.NetManager.DispatchLuaEvent("conn1", table);
            }
            else
            {
                GTLib.NetManager.DispatchLuaEvent("lost1", null);
            }
        });
        mpnet.AddEventListener(MPEvent.CONNECTION_LOST, delegate(BaseEvent evt)
        {
            GTLib.NetManager.KillConnection(m_PrefabConnecterId);
            GTLib.NetManager.DispatchLuaEvent("lost1", null);
        });

        GTLib.NetManager.AddMPNetClient(mpnet);
    }
示例#6
0
        private void Test(IMPObject parameters)
        {
            Hashtable rdata = new Hashtable();

            rdata["c"] = parameters.GetUtfString("c");
            DispatchEvent(new MPEvent(Program.EVENT_TEST + m_PrefabConnecterId, rdata));
        }
示例#7
0
    public void ConnectTest(string ip, int port)
    {
        MPNetClient mpnet = new MPNetClient(m_PrefabConnecterId);

        mpnet.Connect(ip, port);

        mpnet.AddEventListener(MPEvent.CONNECTION, delegate(BaseEvent evt)
        {
            IMPObject par = evt.Params;
            if ((bool)par["success"])
            {
                DispatchEvent(new MPEvent(CSTestManager.EVENT_CONNECT + m_PrefabConnecterId));
            }
            else
            {
                DispatchEvent(new MPEvent(CSTestManager.EVENT_CONNECT_LOST + m_PrefabConnecterId));
            }
        });
        mpnet.AddEventListener(MPEvent.CONNECTION_LOST, delegate(BaseEvent evt)
        {
            GTLib.NetManager.KillConnection(m_PrefabConnecterId);
            DispatchEvent(new MPEvent(CSTestManager.EVENT_CONNECT_LOST + m_PrefabConnecterId));
        });

        GTLib.NetManager.AddMPNetClient(mpnet);
    }
示例#8
0
        private object UnwrapField(MPDataWrapper wrapper)
        {
            object obj2 = null;
            int    type = wrapper.Type;

            if (type <= (int)MPDataType.UTF_STRING)
            {
                return(wrapper.Data);
            }
            switch (type)
            {
            case (int)MPDataType.MP_ARRAY:
                return(RebuildArray(wrapper.Data as IMPArray));

            case (int)MPDataType.MP_OBJECT:
            {
                IMPObject data = wrapper.Data as IMPObject;
                if (data.ContainsKey(CLASS_MARKER_KEY) && data.ContainsKey(CLASS_FIELDS_KEY))
                {
                    return(Cs2Mp(data));
                }
                return(RebuildDict(wrapper.Data as IMPObject));
            }

            case (int)MPDataType.CLASS:
                obj2 = wrapper.Data;
                break;
            }
            return(obj2);
        }
        private void FnLogout(IMessage msg)
        {
            mpnet.HandleLogout();
            IMPObject content = msg.Content;

            mpnet.DispatchEvent(new MPEvent(MPEvent.LOGOUT));
        }
示例#10
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="mpnet"></param>
 /// <param name="cmd"></param>
 /// <param name="parameters"></param>
 internal void HandleExtension(MPNetClient mpnet, string cmd, IMPObject parameters)
 {
     if (extensionMessages.ContainsKey(mpnet.Id))
     {
         Hashtable messages = extensionMessages[mpnet.Id];
         ExtensionMessageDelegate delegate2 = messages[cmd] as ExtensionMessageDelegate;
         if (delegate2 != null)
         {
             try
             {
                 delegate2(parameters);
             }
             catch (Exception exception)
             {
                 throw new Exception(string.Concat("Error extension handler [", cmd, "]: ", exception.Message, " ", exception.StackTrace), exception);
             }
         }
     }
     if (luaExtensionMessages.ContainsKey(mpnet.Id))
     {
         Hashtable   messages  = luaExtensionMessages[mpnet.Id];
         LuaFunction delegate2 = messages[cmd] as LuaFunction;
         if (delegate2 != null)
         {
             delegate2.Call(parameters.ToLuaTable());
         }
     }
 }
示例#11
0
 public BaseRequest(int id)
 {
     mpo = MPObject.NewInstance();
     targetController = 0;
     isEncrypted      = false;
     this.id          = id;
 }
示例#12
0
 public BaseRequest(RequestType tp)
 {
     mpo = MPObject.NewInstance();
     targetController = 0;
     isEncrypted      = false;
     id = (int)tp;
 }
示例#13
0
        public override void HandleMessage(IMessage message)
        {
            if (mpnet.Debug)
            {
                log.Info(message.ToString());
            }
            IMPObject content = message.Content;
            //Hashtable data = new Hashtable();
            //data["cmd"] = content.GetUtfString(KEY_CMD);
            //data["params"] = content.GetMPObject(KEY_PARAMS);
            //if (message.IsUDP)
            //{
            //data["packetId"] = message.PacketId;
            //}
            //MPEvent evt = new MPEvent(MPEvent.EXTENSION_RESPONSE, data);
            string    cmd        = content.GetUtfString(KEY_CMD);
            IMPObject parameters = content.GetMPObject(KEY_PARAMS);

            if (message.IsUDP)
            {
                parameters.PutLong("packetId", message.PacketId);
            }
            mpnet.HandleExtension(cmd, parameters);
            //mpnet.DispatchEvent(new MPEvent(MPEvent.EXTENSION_RESPONSE, data));
        }
示例#14
0
        internal ByteArray Object2Binary(IMPObject obj)
        {
            ByteArray buffer = new ByteArray();

            buffer.WriteByte(Convert.ToByte(MPDataType.MP_OBJECT));
            buffer.WriteShort(Convert.ToInt16(obj.Size()));
            return(Obj2bin(obj, buffer));
        }
示例#15
0
        private void FnLogout(IMessage msg)
        {
            mpnet.HandleLogout();
            IMPObject content = msg.Content;
            Hashtable data    = new Hashtable();

            mpnet.DispatchEvent(new MPEvent(MPEvent.LOGOUT, data));
        }
示例#16
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="type"></param>
 public BaseEvent(string type)
 {
     this.type = type;
     if (arguments == null)
     {
         arguments = MPObject.NewInstance();
     }
 }
示例#17
0
        private MPDataWrapper DecodeObject(ByteArray buffer)
        {
            MPDataType type = (MPDataType)Convert.ToInt32(buffer.ReadByte());

            switch (type)
            {
            case MPDataType.NULL:
                return(BinDecode_NULL(buffer));

            case MPDataType.BOOL:
                return(BinDecode_BOOL(buffer));

            case MPDataType.BYTE:
                return(BinDecode_BYTE(buffer));

            case MPDataType.BYTE_ARRAY:
                return(BinDecode_BYTE_ARRAY(buffer));

            case MPDataType.SHORT:
                return(BinDecode_SHORT(buffer));

            case MPDataType.INT:
                return(BinDecode_INT(buffer));

            case MPDataType.LONG:
                return(BinDecode_LONG(buffer));

            case MPDataType.FLOAT:
                return(BinDecode_FLOAT(buffer));

            case MPDataType.DOUBLE:
                return(BinDecode_DOUBLE(buffer));

            case MPDataType.UTF_STRING:
                return(BinDecode_UTF_STRING(buffer));

            case MPDataType.MP_ARRAY:
                buffer.Position--;
                return(new MPDataWrapper(MPDataType.MP_ARRAY, DecodeMPArray(buffer)));
            }
            if (type != MPDataType.MP_OBJECT)
            {
                throw new Exception("Unknow MPDataType ID: " + type);
            }
            buffer.Position--;
            IMPObject mpObj = DecodeMPObject(buffer);
            byte      num   = Convert.ToByte(MPDataType.MP_OBJECT);
            object    data  = mpObj;

            if (mpObj.ContainsKey(CLASS_MARKER_KEY) && mpObj.ContainsKey(CLASS_FIELDS_KEY))
            {
                num  = Convert.ToByte(MPDataType.CLASS);
                data = Mp2Cs(mpObj);
            }
            return(new MPDataWrapper(num, data));
        }
示例#18
0
        private Hashtable RebuildDict(IMPObject mpObj)
        {
            Hashtable hashtable = new Hashtable();

            foreach (string str in mpObj.GetKeys())
            {
                hashtable[str] = UnwrapField(mpObj.GetData(str));
            }
            return(hashtable);
        }
示例#19
0
 private ByteArray Obj2bin(IMPObject obj, ByteArray buffer)
 {
     foreach (string str in obj.GetKeys())
     {
         MPDataWrapper data = obj.GetData(str);
         buffer = EncodeMPObjectKey(buffer, str);
         buffer = EncodeObject(buffer, data.Type, data.Data);
     }
     return(buffer);
 }
示例#20
0
 private void Init(string extCmd, IMPObject parameters, bool useUDP)
 {
     base.targetController = 1;
     this.extCmd           = extCmd;
     this.parameters       = parameters;
     this.useUDP           = useUDP;
     if (parameters == null)
     {
         parameters = new MPObject();
     }
 }
示例#21
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="message"></param>
        public void OnPacketWrite(IMessage message)
        {
            IMPObject obj2 = null;

            if (message.IsUDP)
            {
                obj2 = PrepareUDPPacket(message);
            }
            else
            {
                obj2 = PrepareTCPPacket(message);
            }
            message.Content = obj2;
            ioHandler.OnDataWrite(message);
        }
示例#22
0
 private void ConvertMPObject(IMPArray fieldList, object csObj, Type objType)
 {
     for (int i = 0; i < fieldList.Size(); i++)
     {
         IMPObject     sFSObject = fieldList.GetMPObject(i);
         string        utfString = sFSObject.GetUtfString(FIELD_NAME_KEY);
         MPDataWrapper data      = sFSObject.GetData(FIELD_VALUE_KEY);
         object        obj3      = UnwrapField(data);
         FieldInfo     field     = objType.GetField(utfString, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
         if (field == null)
         {
             throw new Exception(string.Format("The deserialized class ({0}) doesn't contain the field: {1}", objType.FullName, utfString));
         }
         field.SetValue(csObj, obj3);
     }
 }
示例#23
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="bt"></param>
        private void OnUDPData(byte[] bt)
        {
            ByteArray ba = new ByteArray(bt);

            if (ba.BytesAvailable < 4)
            {
                log.Warn("Too small UDP packet. Len: " + ba.Length);
            }
            else
            {
                bool  flag = (ba.ReadByte() & 0x20) > 0;
                short num2 = ba.ReadShort();
                if (num2 != ba.BytesAvailable)
                {
                    string str = string.Concat("Insufficient UDP data. Expected: ", num2, ", got: ", ba.BytesAvailable);
                    log.Warn(str);
                }
                else
                {
                    ByteArray array2 = new ByteArray(ba.ReadBytes(ba.BytesAvailable));
                    if (flag)
                    {
                        array2.Uncompress();
                    }
                    IMPObject packet = MPObject.NewFromBinaryData(array2);
                    if (packet.ContainsKey("h"))
                    {
                        if (!initSuccess)
                        {
                            StopTimer();
                            locked      = false;
                            initSuccess = true;
                            Hashtable data = new Hashtable();
                            data["success"] = true;
                            mpnet.DispatchEvent(new MPEvent(MPEvent.UDP_INIT, data));
                        }
                    }
                    else
                    {
                        mpnet.GetSocketEngine().IoHandler.Codec.OnPacketRead(packet);
                    }
                }
            }
        }
示例#24
0
        //*********************************** MPObject to Class *********************************
        private object Mp2Cs(IMPObject mpObj)
        {
            if (!mpObj.ContainsKey(CLASS_MARKER_KEY) || !mpObj.ContainsKey(CLASS_FIELDS_KEY))
            {
                throw new Exception("The MPObject passed does not represent any serialized class.");
            }
            string utfString = mpObj.GetUtfString(CLASS_MARKER_KEY);
            Type   type      = Type.GetType(utfString);

            if (type == null)
            {
                throw new Exception("Cannot find type: " + utfString);
            }
            object csObj = Activator.CreateInstance(type);

            if (!(csObj is Serializable))
            {
                throw new Exception(string.Concat("Cannot deserialize object: ", csObj, ", type: ", utfString, " -- It doesn't implement the Serializable interface"));
            }
            ConvertMPObject(mpObj.GetMPArray(CLASS_FIELDS_KEY), csObj, type);
            return(csObj);
        }
示例#25
0
        private void FnLogin(IMessage msg)
        {
            IMPObject content = msg.Content;
            Hashtable data    = new Hashtable();

            if (content.IsNull(BaseRequest.KEY_ERROR_CODE))
            {
                mpnet.MySelf             = new MPUser(content.GetInt(LoginRequest.KEY_ID), content.GetUtfString(LoginRequest.KEY_USER_NAME));
                mpnet.MySelf.PrivilegeId = content.GetShort(LoginRequest.KEY_PRIVILEGE_ID);
                mpnet.SetReconnectionSeconds(content.GetShort(LoginRequest.KEY_RECONNECTION_SECONDS));
                mpnet.MySelf.PrivilegeId = content.GetShort(LoginRequest.KEY_PRIVILEGE_ID);
                data["user"]             = mpnet.MySelf;
                data["data"]             = content.GetMPObject(LoginRequest.KEY_PARAMS);
                MPEvent evt = new MPEvent(MPEvent.LOGIN, data);
                mpnet.DispatchEvent(evt);
            }
            else
            {
                short code = content.GetShort(BaseRequest.KEY_ERROR_CODE);
                data["errorCode"] = code;
                mpnet.DispatchEvent(new MPEvent(MPEvent.LOGIN_ERROR, data));
            }
        }
示例#26
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="evt"></param>
        public void HandleHandShake(IMPObject parameters)
        {
            IMPObject obj2 = parameters;

            if (obj2.IsNull(BaseRequest.KEY_ERROR_CODE))
            {
                sessionToken = obj2.GetUtfString(HandshakeRequest.KEY_SESSION_TOKEN);
                bitSwarm.CompressionThreshold = obj2.GetInt(HandshakeRequest.KEY_COMPRESSION_THRESHOLD);
                bitSwarm.MaxMessageSize       = obj2.GetInt(HandshakeRequest.KEY_MAX_MESSAGE_SIZE);
                if (Debug)
                {
                    log.Debug(string.Format("Handshake response: tk => {0}, ct => {1}", sessionToken, bitSwarm.CompressionThreshold));
                }
                if (bitSwarm.IsReconnecting)
                {
                    bitSwarm.IsReconnecting = false;
                    DispatchEvent(new MPEvent(MPEvent.CONNECTION_RESUME));
                }
                else
                {
                    isConnecting = false;
                    Hashtable data = new Hashtable();
                    data["success"] = true;
                    DispatchEvent(new MPEvent(MPEvent.CONNECTION, data));
                }
            }
            else
            {
                short errorCode = obj2.GetShort(BaseRequest.KEY_ERROR_CODE);

                Hashtable hashtable2 = new Hashtable();
                hashtable2["success"]   = false;
                hashtable2["errorCode"] = errorCode;
                DispatchEvent(new MPEvent(MPEvent.CONNECTION, hashtable2));
            }
        }
示例#27
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="packet"></param>
 public void OnPacketRead(IMPObject packet)
 {
     DispatchRequest(packet);
 }
示例#28
0
 public ExtensionRequest(string extCmd, IMPObject parameters, bool useUDP)
     : base(RequestType.CallExtension)
 {
     this.Init(extCmd, parameters, useUDP);
 }
示例#29
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="packet"></param>
        public void OnPacketRead(ByteArray packet)
        {
            IMPObject requestObject = MPObject.NewFromBinaryData(packet);

            DispatchRequest(requestObject);
        }
示例#30
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="parameters"></param>
 public void ExtensionTest(IMPObject parameters)
 {
     SendExtensionRequest("test", parameters, true);
 }