private void InvokeMethod(Method method, SegmentType type) { MSEncoder encoder = GetEncoder(); encoder.Init(); encoder.WriteUint16(method.GetEncodedType()); if (type == SegmentType.COMMAND) { if (method.Sync) { encoder.WriteUint16(0x0101); } else { encoder.WriteUint16(0x0100); } } method.Write(_encoder); MemoryStream methodSeg = encoder.Segment(); byte flags = network.Frame.FIRST_SEG; bool payload = method.HasPayload(); if (!payload) { flags |= network.Frame.LAST_SEG; } MemoryStream headerSeg = null; if (payload) { Header hdr = method.Header; Struct[] structs = hdr.Structs; foreach (Struct st in structs) { encoder.WriteStruct32(st); } headerSeg = encoder.Segment(); } lock (_sendlock) { Fragment(flags, type, method, methodSeg); if (payload) { Fragment(0x0, SegmentType.HEADER, method, headerSeg); Fragment(network.Frame.LAST_SEG, SegmentType.BODY, method, method.Body); } } }
public void EncodeValue(IEncoder enc, short type, object val) { try { switch ((int)type) { case 1: enc.WriteUint8((short)val); break; // U8 case 2: enc.WriteUint16((int)val); break; // U16 case 3: enc.WriteUint32((long)val); break; // U32 case 4: enc.WriteUint64((long)val); break; // U64 case 6: enc.WriteStr8((string)val); break; // SSTR case 7: enc.WriteStr16((string)val); break; // LSTR case 8: enc.WriteDatetime((long)val); break; // ABSTIME case 9: enc.WriteUint32((long)val); break; // DELTATIME case 10: ((ObjectID)val).encode(enc); break; // ref case 11: if ((bool)val) { enc.WriteUint8(1); } else { enc.WriteUint8(0); } break; case 12: enc.WriteFloat((float)val); break; // FLOAT case 13: enc.WriteDouble((double)val); break; // DOUBLE case 14: enc.WriteUuid((UUID)val); break; // UUID case 15: enc.WriteMap((Dictionary <string, object>)val); break; // Ftable case 16: enc.WriteInt8((short)val); break; // int8 case 17: enc.WriteInt16((int)val); break; // int16 case 18: enc.WriteInt32(long.Parse("" + val)); break; // int32 case 19: enc.WriteInt64(long.Parse("" + val)); break; // int64 case 20: // Object // Check that the object has a session, if not // take ownership of it QMFObject qObj = (QMFObject)val; if (qObj.Session == null) { qObj.Session = this; } qObj.Encode(enc); break; case 21: // List List <object> items = (List <object>)val; MSEncoder lEnc = new MSEncoder(1); lEnc.Init(); lEnc.WriteUint32(items.Count); foreach (object obj in items) { short innerType = Util.QMFType(obj); lEnc.WriteUint8(innerType); this.EncodeValue(lEnc, innerType, obj); } enc.WriteVbin32(lEnc.Segment().ToArray()); break; case 22: // Array List <object> aItems = (List <object>)val; MSEncoder aEnc = new MSEncoder(1); aEnc.Init(); long aCount = aItems.Count; aEnc.WriteUint32(aCount); if (aCount > 0) { Object anObj = aItems[0]; short innerType = Util.QMFType(anObj); aEnc.WriteUint8(innerType); foreach (object obj in aItems) { this.EncodeValue(aEnc, innerType, obj); } } enc.WriteVbin32(aEnc.Segment().ToArray()); break; default: throw new Exception(String.Format("Invalid Type Code: {0}", type)); } } catch (System.InvalidCastException e) { string msg = String.Format("Class cast exception for typecode {0}, type {1} ", type, val.GetType()); log.Error(msg); throw new Exception(msg + type, e); } }