public void onMessage(
      final int msgTypeId, final MutableDirectBuffer buffer, final int index, final int length) {
    switch (msgTypeId) {
      case ON_PUBLICATION_READY:
        {
          publicationReady.wrap(buffer, index);

          final long correlationId = publicationReady.correlationId();

          if (correlationId == activeCorrelationId) {
            listener.onNewPublication(
                expectedChannel,
                publicationReady.streamId(),
                publicationReady.sessionId(),
                publicationReady.publicationLimitCounterId(),
                publicationReady.logFileName(),
                correlationId);

            lastReceivedCorrelationId = correlationId;
          }
          break;
        }

      case ON_IMAGE_READY:
        {
          imageReady.wrap(buffer, index);

          for (int i = 0, max = imageReady.subscriberPositionCount(); i < max; i++) {
            final long registrationId = imageReady.positionIndicatorRegistrationId(i);
            final int positionId = imageReady.subscriberPositionId(i);

            subscriberPositionMap.put(registrationId, positionId);
          }

          listener.onNewImage(
              imageReady.streamId(),
              imageReady.sessionId(),
              imageReady.joiningPosition(),
              subscriberPositionMap,
              imageReady.logFileName(),
              imageReady.sourceIdentity(),
              imageReady.correlationId());

          subscriberPositionMap.clear();
          break;
        }

      case ON_OPERATION_SUCCESS:
        {
          correlatedMessage.wrap(buffer, index);

          final long correlationId = correlatedMessage.correlationId();
          if (correlationId == activeCorrelationId) {
            lastReceivedCorrelationId = correlationId;
          }
          break;
        }

      case ON_INACTIVE_IMAGE:
        {
          imageMessage.wrap(buffer, index);

          listener.onInactiveImage(
              imageMessage.streamId(),
              imageMessage.sessionId(),
              imageMessage.position(),
              imageMessage.correlationId());
          break;
        }

      case ON_ERROR:
        {
          errorResponse.wrap(buffer, index);
          final long correlationId = errorResponse.offendingCommandCorrelationId();

          if (correlationId == activeCorrelationId) {
            listener.onError(
                errorResponse.errorCode(), errorResponse.errorMessage(), correlationId);

            lastReceivedCorrelationId = correlationId;
          }
          break;
        }
    }
  }