package org.societies.comm.android.ipc;
import java.lang.reflect.Method;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.util.Log;
public class Skeleton {
private static final String TAG = Skeleton.class.getName();
private class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MessageMethodInvocation.WHAT:
MessageMethodInvocation msgMethod = new MessageMethodInvocation(msg);
MessageMethodResult result;
try {
Method method = msgMethod.getMethod(object.getClass());
Object rv;
if(msgMethod.hasCallback()) {
rv = method.invoke(object, msgMethod.params(msgMethod.id(), msg.replyTo));
}
else {
rv = method.invoke(object, msgMethod.params());
}
result = new MessageMethodResult(msgMethod, rv);
} catch(Exception e) {
result = new MessageMethodResult(msgMethod, e);
}
try {
msg.replyTo.send(result.message());
} catch(Exception e) {
Log.e(TAG, e.getMessage(), e);
}
break;
default:
super.handleMessage(msg);
}
}
}
private Object object;
private Messenger messenger;
public Skeleton(Object object) throws InterruptedException {
this.object = object;
messenger = new MessengerThreadFactory() {
@Override
protected Handler createHandler() {
return new IncomingHandler();
}
}.createMessengerThread();
}
public Messenger messenger() {
return messenger;
}
}