}
}
return null;
}
case RemoteOSGiMessage.REMOTE_CALL: {
final RemoteCallMessage invMsg = (RemoteCallMessage) msg;
try {
RemoteServiceRegistration serv = (RemoteServiceRegistration) localServices
.get(invMsg.getServiceID());
if (serv == null) {
final RemoteServiceRegistration reg = getServiceRegistration(invMsg
.getServiceID());
if (reg == null) {
throw new IllegalStateException(toString()
+ "Could not get " + invMsg.getServiceID() //$NON-NLS-1$
+ ", known services " + localServices); //$NON-NLS-1$
} else {
serv = reg;
}
}
// get the invocation arguments and the local method
final Object[] arguments = invMsg.getArgs();
for (int i = 0; i < arguments.length; i++) {
if (arguments[i] instanceof InputStreamHandle) {
arguments[i] = getInputStreamProxy((InputStreamHandle) arguments[i]);
} else if (arguments[i] instanceof OutputStreamHandle) {
arguments[i] = getOutputStreamProxy((OutputStreamHandle) arguments[i]);
}
}
final Method method = serv.getMethod(invMsg
.getMethodSignature());
// invoke method
try {
Object result = method.invoke(serv.getServiceObject(),
arguments);
final RemoteCallResultMessage m = new RemoteCallResultMessage();
m.setXID(invMsg.getXID());
if (result instanceof InputStream) {
m
.setResult(getInputStreamPlaceholder((InputStream) result));
} else if (result instanceof OutputStream) {
m
.setResult(getOutputStreamPlaceholder((OutputStream) result));
} else {
m.setResult(result);
}
return m;
} catch (final InvocationTargetException t) {
t.printStackTrace();
throw t.getTargetException();
}
} catch (final Throwable t) {
// TODO: send to log
t.printStackTrace();
final RemoteCallResultMessage m = new RemoteCallResultMessage();
m.setXID(invMsg.getXID());
m.setException(t);
return m;
}
}
case RemoteOSGiMessage.REMOTE_EVENT: {