protected void receiveData(IRemoteCallObject rco) {
    if (rco == null) throw new IllegalArgumentException("aRemoteCallObject is null");
    try {
      long callId = rco.getCallObjectId();                      //..call id
      IRemoteCallObjectMetaData meta = rco.getMetaDataObject(); //..meta data
      IRemoteCallObjectData data = rco.getDataObject();         //..data
      RemoteCallObjectType rcoType = meta.getCallObjectType();               //..receive type
      //..
      if (rcoType == RemoteCallObjectType.Message) {
        //..receive message, forward handler and don't expect result
        receiveMessageData(meta, data);
      }
      else if (rcoType == RemoteCallObjectType.Query) {
        //..request to execute some method on this side
        receiveQueryData(meta, data, callId);
      }
      else if (rcoType == RemoteCallObjectType.Respond) {
        //..receive the result of the call, put it passed without errors
        IRemoteCallObject obj = setResponse(callId, rco, true, false);
        synchronized (obj) {
          obj.notifyAll(); //..notify waiting thread in call method
        }
      }
      else if (rcoType == RemoteCallObjectType.RespondError) {
        //..receive the result of the call, put it passed with errors
        IRemoteCallObject obj = setResponse(callId, rco, true, true);
        synchronized (obj) {
          obj.notifyAll(); //..notify waiting thread in call method
        }
      }
      Thread.yield();
    }
    catch(Exception exc) {
      catchException(this, new Exception("receiveData: " + exc.getMessage()));
    }
  }