package org.societies.comm.android.ipc; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import android.os.Messenger; public class Stub implements InvocationHandler { private Client client; public static Object newInstance(Class<?>[] interfaces, String id, Messenger messenger) throws IllegalArgumentException { return Proxy.newProxyInstance(Stub.class.getClassLoader(), interfaces, new Stub(id, messenger)); } public static Object newInstance(Class<?>[] interfaces, Messenger messenger) throws IllegalArgumentException { return Stub.newInstance(interfaces, "0", messenger); } private Stub(String id, Messenger messenger) { client = new Client(id, messenger); } public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { Object rv; CallbackArgFilterer caf = new CallbackArgFilterer(args); if(caf.hasCallback()) rv = client.invoke(m.getName(), caf.filteredArgs, caf.callback); else rv = client.invoke(m.getName(), args); return rv; } private static class CallbackArgFilterer { public final Object[] filteredArgs; public final Object callback; public CallbackArgFilterer(Object[] args) { int i = args.length - 1; if(i != -1 && args[i] instanceof ICallback) { filteredArgs = removeIndexFromArray(args, i); callback = args[i]; } else { filteredArgs = args; callback = null; } } public boolean hasCallback() { return callback != null; } private static Object[] removeIndexFromArray(Object[] args, int index) { Object[] rv = new Object[args.length-1]; for(int i=0; i<index; i++) rv[i] = args[i]; for(int i=index+1; i<args.length; i++) rv[i-1] = args[i]; return rv; } } }