public Object construct(final ByteBuffer in, ValueHandler handler) throws AmqpErrorException { if (in.hasRemaining()) { byte b = in.get(); return UnsignedLong.valueOf(((long) b) & 0xffL); } else { Error error = new Error(); error.setCondition(ConnectionError.FRAMING_ERROR); error.setDescription("Cannot construct ulong: insufficient input data"); throw new AmqpErrorException(error); } }
public synchronized void receiveClose(short channel, Close close) { setClosedForInput(true); _connectionEventListener.closeReceived(); switch (_state) { case UNOPENED: case AWAITING_OPEN: Error error = new Error(); error.setCondition(ConnectionError.CONNECTION_FORCED); error.setDescription("Connection close sent before connection was opened"); connectionError(error); break; case OPEN: sendClose(new Close()); break; case CLOSE_SENT: default: } }
public synchronized void receiveBegin(short channel, Begin begin) { short myChannelId; if (begin.getRemoteChannel() != null) { myChannelId = begin.getRemoteChannel().shortValue(); SessionEndpoint endpoint; try { endpoint = _sendingSessions[myChannelId]; } catch (IndexOutOfBoundsException e) { final Error error = new Error(); error.setCondition(ConnectionError.FRAMING_ERROR); error.setDescription( "BEGIN received on channel " + channel + " with given remote-channel " + begin.getRemoteChannel() + " which is outside the valid range of 0 to " + _channelMax + "."); connectionError(error); return; } if (endpoint != null) { if (_receivingSessions[channel] == null) { _receivingSessions[channel] = endpoint; endpoint.setReceivingChannel(channel); endpoint.setNextIncomingId(begin.getNextOutgoingId()); endpoint.setOutgoingSessionCredit(begin.getIncomingWindow()); } else { final Error error = new Error(); error.setCondition(ConnectionError.FRAMING_ERROR); error.setDescription( "BEGIN received on channel " + channel + " which is already in use."); connectionError(error); } } else { final Error error = new Error(); error.setCondition(ConnectionError.FRAMING_ERROR); error.setDescription( "BEGIN received on channel " + channel + " with given remote-channel " + begin.getRemoteChannel() + " which is not known as a begun session."); connectionError(error); } } else // Peer requesting session creation { myChannelId = getFirstFreeChannel(); if (myChannelId == -1) { // close any half open channel myChannelId = getFirstFreeChannel(); } if (_receivingSessions[channel] == null) { SessionEndpoint endpoint = new SessionEndpoint(this, begin); _receivingSessions[channel] = endpoint; _sendingSessions[myChannelId] = endpoint; Begin beginToSend = new Begin(); endpoint.setReceivingChannel(channel); endpoint.setSendingChannel(myChannelId); beginToSend.setRemoteChannel(UnsignedShort.valueOf(channel)); beginToSend.setNextOutgoingId(endpoint.getNextOutgoingId()); beginToSend.setOutgoingWindow(endpoint.getOutgoingWindowSize()); beginToSend.setIncomingWindow(endpoint.getIncomingWindowSize()); send(myChannelId, beginToSend); _connectionEventListener.remoteSessionCreation(endpoint); } else { final Error error = new Error(); error.setCondition(ConnectionError.FRAMING_ERROR); error.setDescription("BEGIN received on channel " + channel + " which is already in use."); connectionError(error); } } }