| /* |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| */ |
| package org.apache.qpid.codec; |
| |
| import java.io.IOException; |
| |
| import org.apache.qpid.bytebuffer.QpidByteBuffer; |
| import org.apache.qpid.framing.*; |
| |
| public class ServerDecoder extends AMQDecoder<ServerMethodProcessor<? extends ServerChannelMethodProcessor>> |
| { |
| |
| /** |
| * Creates a new AMQP decoder. |
| * |
| * @param methodProcessor method processor |
| */ |
| public ServerDecoder(final ServerMethodProcessor<? extends ServerChannelMethodProcessor> methodProcessor) |
| { |
| super(true, methodProcessor); |
| } |
| |
| public void decodeBuffer(QpidByteBuffer buf) throws AMQFrameDecodingException, AMQProtocolVersionException, IOException |
| { |
| decode(buf); |
| } |
| |
| |
| void processMethod(int channelId, |
| QpidByteBuffer in) |
| throws AMQFrameDecodingException |
| { |
| ServerMethodProcessor<? extends ServerChannelMethodProcessor> methodProcessor = getMethodProcessor(); |
| final int classAndMethod = in.getInt(); |
| int classId = classAndMethod >> 16; |
| int methodId = classAndMethod & 0xFFFF; |
| methodProcessor.setCurrentMethod(classId, methodId); |
| try |
| { |
| switch (classAndMethod) |
| { |
| //CONNECTION_CLASS: |
| case 0x000a000b: |
| ConnectionStartOkBody.process(in, methodProcessor); |
| break; |
| case 0x000a0015: |
| ConnectionSecureOkBody.process(in, methodProcessor); |
| break; |
| case 0x000a001f: |
| ConnectionTuneOkBody.process(in, methodProcessor); |
| break; |
| case 0x000a0028: |
| ConnectionOpenBody.process(in, methodProcessor); |
| break; |
| case 0x000a0032: |
| if (methodProcessor.getProtocolVersion().equals(ProtocolVersion.v0_8)) |
| { |
| throw newUnknownMethodException(classId, methodId, |
| methodProcessor.getProtocolVersion()); |
| } |
| else |
| { |
| ConnectionCloseBody.process(in, methodProcessor); |
| } |
| break; |
| case 0x000a0033: |
| if (methodProcessor.getProtocolVersion().equals(ProtocolVersion.v0_8)) |
| { |
| throw newUnknownMethodException(classId, methodId, |
| methodProcessor.getProtocolVersion()); |
| } |
| else |
| { |
| methodProcessor.receiveConnectionCloseOk(); |
| } |
| break; |
| case 0x000a003c: |
| if (methodProcessor.getProtocolVersion().equals(ProtocolVersion.v0_8)) |
| { |
| ConnectionCloseBody.process(in, methodProcessor); |
| } |
| else |
| { |
| throw newUnknownMethodException(classId, methodId, |
| methodProcessor.getProtocolVersion()); |
| } |
| break; |
| case 0x000a003d: |
| if (methodProcessor.getProtocolVersion().equals(ProtocolVersion.v0_8)) |
| { |
| methodProcessor.receiveConnectionCloseOk(); |
| } |
| else |
| { |
| throw newUnknownMethodException(classId, methodId, |
| methodProcessor.getProtocolVersion()); |
| } |
| break; |
| |
| // CHANNEL_CLASS: |
| |
| case 0x0014000a: |
| ChannelOpenBody.process(channelId, in, methodProcessor); |
| break; |
| case 0x00140014: |
| ChannelFlowBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x00140015: |
| ChannelFlowOkBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x00140028: |
| ChannelCloseBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x00140029: |
| methodProcessor.getChannelMethodProcessor(channelId).receiveChannelCloseOk(); |
| break; |
| |
| // ACCESS_CLASS: |
| |
| case 0x001e000a: |
| AccessRequestBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| |
| // EXCHANGE_CLASS: |
| |
| case 0x0028000a: |
| ExchangeDeclareBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x00280014: |
| ExchangeDeleteBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x00280016: |
| ExchangeBoundBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| |
| |
| // QUEUE_CLASS: |
| |
| case 0x0032000a: |
| QueueDeclareBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x00320014: |
| QueueBindBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x0032001e: |
| QueuePurgeBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x00320028: |
| QueueDeleteBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x00320032: |
| QueueUnbindBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| |
| |
| // BASIC_CLASS: |
| |
| case 0x003c000a: |
| BasicQosBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x003c0014: |
| BasicConsumeBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x003c001e: |
| BasicCancelBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x003c0028: |
| BasicPublishBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x003c0046: |
| BasicGetBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x003c0050: |
| BasicAckBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x003c005a: |
| BasicRejectBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x003c0064: |
| BasicRecoverBody.process(in, methodProcessor.getProtocolVersion(), |
| methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x003c0066: |
| BasicRecoverSyncBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x003c006e: |
| BasicRecoverSyncBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| case 0x003c0078: |
| BasicNackBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| |
| // CONFIRM CLASS: |
| |
| case 0x0055000a: |
| ConfirmSelectBody.process(in, methodProcessor.getChannelMethodProcessor(channelId)); |
| break; |
| |
| // TX_CLASS: |
| |
| case 0x005a000a: |
| if(!methodProcessor.getChannelMethodProcessor(channelId).ignoreAllButCloseOk()) |
| { |
| methodProcessor.getChannelMethodProcessor(channelId).receiveTxSelect(); |
| } |
| break; |
| case 0x005a0014: |
| if(!methodProcessor.getChannelMethodProcessor(channelId).ignoreAllButCloseOk()) |
| { |
| methodProcessor.getChannelMethodProcessor(channelId).receiveTxCommit(); |
| } |
| break; |
| case 0x005a001e: |
| if(!methodProcessor.getChannelMethodProcessor(channelId).ignoreAllButCloseOk()) |
| { |
| methodProcessor.getChannelMethodProcessor(channelId).receiveTxRollback(); |
| } |
| break; |
| |
| |
| default: |
| throw newUnknownMethodException(classId, methodId, |
| methodProcessor.getProtocolVersion()); |
| |
| } |
| } |
| finally |
| { |
| methodProcessor.setCurrentMethod(0, 0); |
| } |
| } |
| |
| } |