Exemplo n.º 1
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);
        }
Exemplo n.º 2
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));
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
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);
                    }
                }
            }
        }