Пример #1
0
        public void ReadAndDispatch()
        {
            try
            {
                byte frameType = _reader.ReadByte();
//				Console.WriteLine("Frame type " + frameType);

                if (frameType == 'A')
                {
                    // wtf
                    Console.WriteLine("Meh, protocol header received for some reason. darn it!");
                }

                ushort channel       = _reader.ReadUInt16();
                int    payloadLength = _reader.ReadInt32();

//				Console.WriteLine("> Incoming Frame (" + frameType + ") for channel [" + channel + "]  payload size: " + payloadLength);

                // needs special case for heartbeat, flow, etc..
                // since they are not replies to methods we sent and alter the client's behavior

                ushort classId  = 0;
                ushort methodId = 0;

                if (frameType == AmqpConstants.FrameMethod)
                {
                    classId  = _reader.ReadUInt16();
                    methodId = _reader.ReadUInt16();

                    var classMethodId = classId << 16 | methodId;

//					Console.WriteLine("> Incoming Method: class " + classId + " method " + methodId + " classMethodId " + classMethodId);

                    _frameProcessor.DispatchMethod(channel, classMethodId);
                }
                else if (frameType == AmqpConstants.FrameHeartbeat)
                {
                    Console.WriteLine("received FrameHeartbeat");
                }

                byte frameEndMarker = _reader.ReadByte();
                if (frameEndMarker != AmqpConstants.FrameEnd)
                {
                    throw new Exception("Expecting frame end, but found " + frameEndMarker);
                }
            }
            catch (ThreadAbortException)
            {
                // no-op
            }
            catch (Exception ex)
            {
                Console.WriteLine("Frame Reader error: " + ex);
                throw;
            }
        }
        public object ReadFieldValue()
        {
            object value         = null;
            byte   discriminator = _reader.ReadByte();

            switch ((char)discriminator)
            {
            case 'S':
                value = (string)this.ReadLongstr();
                break;

            case 'I':
                value = (Int32)_reader.ReadInt32();
                break;

            case 'A':
                value = (IList)this.ReadArray();
                break;

            case 'b':
                value = (sbyte)_reader.ReadSByte();
                break;

            case 'd':
                value = (double)_reader.ReadDouble();
                break;

            case 'f':
                value = (float)_reader.ReadSingle();
                break;

            case 'l':
                value = (long)_reader.ReadInt64();
                break;

            case 's':
                value = (short)_reader.ReadInt16();
                break;

            case 't':
                value = _reader.ReadByte() != 0;
                break;

//				case 'x':
//					value = new BinaryTableValue(ReadLongstr(reader));
//					break;
//				case 'D':
//					// value = ReadDecimal(reader);
//					break;
            case 'T':
                value = (AmqpTimestamp)ReadTimestamp();
                break;

            case 'F':
                value = (IDictionary <string, object>) this.ReadTable();
                break;

            case 'V':
                value = null;
                break;

            default:
                throw new Exception("Unexpected type discriminator: " + (char)discriminator);
            }
            return(value);
        }
Пример #3
0
        public void ReadAndDispatch()
        {
            try
            {
                byte frameType = _reader.ReadByte();

                if (frameType == 'A')
                {
                    var msg = "Invalid frame received " + frameType;

                    LogAdapter.LogError(LogSource, msg);
                    throw new Exception(msg);
                }

                ushort channel       = _reader.ReadUInt16();
                int    payloadLength = _reader.ReadInt32();

                // needs special case for heartbeat, flow, etc..
                // since they are not replies to methods we sent and alter the client's behavior

                ushort classId, methodId;
                classId = methodId = 0;
                if (frameType == AmqpConstants.FrameMethod)
                {
                    classId  = _reader.ReadUInt16();
                    methodId = _reader.ReadUInt16();

                    var classMethodId = classId << 16 | methodId;

                    if (LogAdapter.ProtocolLevelLogEnabled)
                    {
                        LogAdapter.LogDebug(LogSource, "> Incoming Frame (" + frameType + ") for channel [" + channel + "] class (" + classId + ") method  (" + methodId + ") payload size: " + payloadLength);
                    }

                    _frameProcessor.DispatchMethod(channel, classMethodId);
                }
                else if (frameType == AmqpConstants.FrameHeartbeat)
                {
                    if (LogAdapter.ProtocolLevelLogEnabled)
                    {
                        LogAdapter.LogDebug(LogSource, "Received FrameHeartbeat");
                    }

                    _frameProcessor.DispatchHeartbeat();
                }

                byte frameEndMarker = _reader.ReadByte();
                if (frameEndMarker != AmqpConstants.FrameEnd)
                {
                    var msg = "Expecting frame end, but found " + frameEndMarker + ". The original class and method: " + classId + " " + methodId;

                    LogAdapter.LogError(LogSource, msg);
                    throw new Exception(msg);
                }
            }
            catch (ThreadAbortException)
            {
                // no-op
            }
            catch (Exception ex)
            {
                if (LogAdapter.IsErrorEnabled)
                {
                    LogAdapter.LogError(LogSource, "Frame Reader error", ex);
                }
                throw;
            }
        }