@Override
    public long perform() {
      code = ((MgcpCommandException) transaction().getLastError()).getCode();
      message = ((MgcpCommandException) transaction().getLastError()).getErrorMessage();

      MgcpEvent evt =
          transaction().getProvider().createEvent(MgcpEvent.RESPONSE, getEvent().getAddress());
      MgcpResponse response = (MgcpResponse) evt.getMessage();
      response.setResponseCode(code);
      response.setResponseString(message);
      response.setTxID(transaction().getId());

      if (connectionID != null) {
        response.setParameter(Parameter.CONNECTION_ID, connectionID.getValue());
      }

      try {
        transaction().getProvider().send(evt);
      } catch (IOException e) {
        logger.error(e);
      } finally {
        evt.recycle();
      }

      return 0;
    }
    @Override
    public long perform() {
      MgcpEvent evt =
          transaction().getProvider().createEvent(MgcpEvent.RESPONSE, getEvent().getAddress());
      MgcpResponse response = (MgcpResponse) evt.getMessage();
      response.setResponseCode(MgcpResponseCode.TRANSACTION_WAS_EXECUTED);
      response.setResponseString(SUCCESS);
      response.setTxID(transaction().getId());

      if (connectionID != null) {
        response.setParameter(Parameter.CONNECTION_ID, connectionID.getValue());
      }
      response.setParameter(Parameter.CONNECTION_PARAMETERS, new Text("PS=" + tx + ", PR=" + rx));

      try {
        transaction().getProvider().send(evt);
      } catch (IOException e) {
        logger.error(e);
      } finally {
        evt.recycle();
      }

      return 0;
    }
    @Override
    public long perform() {
      request = (MgcpRequest) getEvent().getMessage();

      Parameter callID = request.getParameter(Parameter.CALL_ID);
      if (callID == null) {
        throw new MgcpCommandException(MgcpResponseCode.PROTOCOL_ERROR, CALLID_MISSING);
      }

      // modify local connection options
      Parameter l = request.getParameter(Parameter.LOCAL_CONNECTION_OPTIONS);
      if (l != null) {
        lcOptions.setValue(l.getValue());
      } else {
        lcOptions.setValue(null);
      }

      // getting call
      MgcpCall call = transaction().getCall(callID.getValue().hexToInteger(), false);
      if (call == null) {
        throw new MgcpCommandException(MgcpResponseCode.INCORRECT_CALL_ID, UNKNOWN_CALL_IDENTIFIER);
      }

      connectionID = request.getParameter(Parameter.CONNECTION_ID);
      if (connectionID == null) {
        throw new MgcpCommandException(MgcpResponseCode.PROTOCOL_ERROR, CONNECTIONID_EXPECTED);
      }

      try {
        mgcpConnection = call.getMgcpConnection(connectionID.getValue().hexToInteger());
      } catch (Exception e) {
        throw new MgcpCommandException(
            MgcpResponseCode.CONNECTION_WAS_DELETED,
            new Text("Unknown connectionidentifier, probably it was deleted"));
      }

      if (mgcpConnection == null)
        throw new MgcpCommandException(
            MgcpResponseCode.CONNECTION_WAS_DELETED,
            new Text("Unknown connectionidentifier, probably it was deleted"));

      // set SDP if requested
      Parameter sdp = request.getParameter(Parameter.SDP);
      Parameter mode = request.getParameter(Parameter.MODE);

      if (sdp != null) {
        try {
          mgcpConnection.setOtherParty(sdp.getValue());
        } catch (IOException e) {
          logger.error("Could not set remote peer", e);
          throw new MgcpCommandException(MgcpResponseCode.UNSUPPORTED_SDP, SDP_NEGOTIATION_FAILED);
        }
      }

      if (mode != null) {
        try {
          mgcpConnection.setMode(mode.getValue());
        } catch (ModeNotSupportedException e) {
          throw new MgcpCommandException(
              MgcpResponseCode.INVALID_OR_UNSUPPORTED_MODE, new Text("problem with mode"));
        }
      }

      mgcpConnection.setDtmfClamp(lcOptions.getDtmfClamp());

      MgcpEvent evt =
          transaction().getProvider().createEvent(MgcpEvent.RESPONSE, getEvent().getAddress());
      MgcpResponse response = (MgcpResponse) evt.getMessage();
      response.setResponseCode(MgcpResponseCode.TRANSACTION_WAS_EXECUTED);
      response.setResponseString(SUCCESS);
      response.setTxID(transaction().getId());

      if (connectionID != null) {
        response.setParameter(Parameter.CONNECTION_ID, connectionID.getValue());
      }

      Text descriptor = mgcpConnection.getDescriptor();
      if (descriptor != null) response.setParameter(Parameter.SDP, mgcpConnection.getDescriptor());

      try {
        transaction().getProvider().send(evt);
      } catch (IOException e) {
        logger.error(e);
      } finally {
        evt.recycle();
      }

      return 0;
    }