private void Assemble(Frame frame, MemoryStream segment) { MSDecoder decoder = GetDecoder(); decoder.Init(segment); int channel = frame.Channel; Method command; switch (frame.Type) { case SegmentType.CONTROL: int controlType = decoder.ReadUint16(); Method control = Method.Create(controlType); control.Read(decoder); Emit(channel, control); break; case SegmentType.COMMAND: int commandType = decoder.ReadUint16(); // read in the session header, right now we don't use it decoder.ReadUint16(); command = Method.Create(commandType); command.Read(decoder); if (command.HasPayload()) { incomplete[channel] = command; } else { Emit(channel, command); } break; case SegmentType.HEADER: command = incomplete[channel]; List <Struct> structs = new List <Struct>(); while (decoder.HasRemaining()) { structs.Add(decoder.ReadStruct32()); } command.Header = new Header(structs); if (frame.IsLastSegment()) { incomplete[channel] = null; Emit(channel, command); } break; case SegmentType.BODY: command = incomplete[channel]; segment.Seek(0, SeekOrigin.Begin); command.Body = segment; incomplete[channel] = null; Emit(channel, command); break; default: throw new Exception("unknown frame type: " + frame.Type); } }
private MSDecoder GetDecoder() { if (_decoder == null) { _decoder = new MSDecoder(); } return(_decoder); }
public void MessageTransfer(IMessage msg) { MSDecoder decoder = new MSDecoder(); decoder.Init(msg.Body); RangeSet rangeSet = new RangeSet(); rangeSet.Add(msg.Id); char opcode = 'x'; long seq = -1; while (this.CheckHeader(decoder, out opcode, out seq)) { //log.Debug("Message recieved with opcode " + opcode + " and sequence " + seq) ; //log.Debug(System.Text.Encoding.UTF8.GetString(msg.Body.ToArray())) ; switch (opcode) { case 'b': consoleSession.HandleBrokerResponse(this, decoder, seq); break; case 'p': consoleSession.HandlePackageIndicator(this, decoder, seq); break; case 'z': consoleSession.HandleCommandComplete(this, decoder, seq); break; case 'q': consoleSession.HandleClassIndicator(this, decoder, seq); break; case 'm': consoleSession.HandleMethodResponse(this, decoder, seq); break; case 'h': consoleSession.HandleHeartbeatIndicator(this, decoder, seq, msg); break; case 'e': consoleSession.HandleEventIndicator(this, decoder, seq); break; case 's': consoleSession.HandleSchemaResponse(this, decoder, seq); break; case 'c': consoleSession.HandleContentIndicator(this, decoder, seq, true, false); break; case 'i': consoleSession.HandleContentIndicator(this, decoder, seq, false, true); break; case 'g': consoleSession.HandleContentIndicator(this, decoder, seq, true, true); break; default: log.Error("Invalid message type recieved with opcode " + opcode); break; } } lock (lockObject) { outSession.MessageAccept(rangeSet); } }
public object DecodeValue(IDecoder dec, short type) { switch (type) { case 1: return(dec.ReadUint8()); // U8 case 2: return(dec.ReadUint16()); // U16 case 3: return(dec.ReadUint32()); // U32 case 4: return(dec.ReadUint64()); // U64 case 6: return(dec.ReadStr8()); // SSTR case 7: return(dec.ReadStr16()); // LSTR case 8: return(dec.ReadDatetime()); // ABSTIME case 9: return(dec.ReadUint32()); // DELTATIME case 10: return(new ObjectID(dec)); // ref case 11: return(dec.ReadUint8() != 0); // bool case 12: return(dec.ReadFloat()); // float case 13: return(dec.ReadDouble()); // double case 14: return(dec.ReadUuid()); // UUID case 15: return(dec.ReadMap()); // Ftable case 16: return(dec.ReadInt8()); // int8 case 17: return(dec.ReadInt16()); // int16 case 18: return(dec.ReadInt32()); // int32 case 19: return(dec.ReadInt64()); // int64 case 20: // Object // Peek into the inner type code, make sure // it is actually an object object returnValue = null; short innerTypeCode = dec.ReadUint8(); if (innerTypeCode != 20) { returnValue = this.DecodeValue(dec, innerTypeCode); } else { ClassKey classKey = new ClassKey(dec); lock (LockObject) { SchemaClass sClass = GetSchema(classKey); if (sClass != null) { returnValue = this.CreateQMFObject(sClass, dec, true, true, false); } } } return(returnValue); case 21: // List { MSDecoder lDec = new MSDecoder(); lDec.Init(new MemoryStream(dec.ReadVbin32())); long count = lDec.ReadUint32(); List <object> newList = new List <object>(); while (count > 0) { short innerType = lDec.ReadUint8(); newList.Add(this.DecodeValue(lDec, innerType)); count -= 1; } return(newList); } case 22: // Array { MSDecoder aDec = new MSDecoder(); aDec.Init(new MemoryStream(dec.ReadVbin32())); long cnt = aDec.ReadUint32(); short innerType = aDec.ReadUint8(); List <object> aList = new List <object>(); while (cnt > 0) { aList.Add(this.DecodeValue(aDec, innerType)); cnt -= 1; } return(aList); } default: throw new Exception(String.Format("Invalid Type Code: {0}", type)); } }