Beispiel #1
0
  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);
      }
    }
  }