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 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)); }
/// <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); }
//*********************************** 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); }
/// <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); } } } }