libbluray | branch: master | hpi1 <[email protected]> | Tue Dec 10 10:51:38 2013 +0200| [6c5a7774080d2841b0fe9ebda99ca083c0f49d65] | committer: hpi1
IxcRegistryImpl: verify interfaces > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=6c5a7774080d2841b0fe9ebda99ca083c0f49d65 --- .../bdj/java/org/videolan/IxcRegistryImpl.java | 58 +++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/src/libbluray/bdj/java/org/videolan/IxcRegistryImpl.java b/src/libbluray/bdj/java/org/videolan/IxcRegistryImpl.java index c3802f3..a9ed8da 100644 --- a/src/libbluray/bdj/java/org/videolan/IxcRegistryImpl.java +++ b/src/libbluray/bdj/java/org/videolan/IxcRegistryImpl.java @@ -152,8 +152,55 @@ public class IxcRegistryImpl { getAllInterfaces(objClass.getSuperclass(), resultList); } + private static final void verifyRemoteInterfaces(Class remoteClass) throws RemoteException { + Class[] remoteInterfaces = remoteClass.getInterfaces(); + for (int i = 0; i < remoteInterfaces.length; i++) { + if (Remote.class.isAssignableFrom(remoteInterfaces[i])) { + Method[] remoteMethods = remoteInterfaces[i].getMethods(); + for (int j = 0; j < remoteMethods.length; j++) { + verifyRemoteMethod(remoteMethods[j]); + } + } + } + } + + private static final void verifyRemoteMethod(Method remoteMethod) throws RemoteException { + Class[] expTypes = remoteMethod.getExceptionTypes(); + boolean hasRemoteException = false; + for (int i = 0; i < expTypes.length; i++) { + if (expTypes[i].isAssignableFrom(RemoteException.class)) { + hasRemoteException = true; + break; + } + } + if (!hasRemoteException) { + throw new RemoteException("no RemoteException found from remote method"); + } + + Class[] paramTypes = remoteMethod.getParameterTypes(); + for (int i = 0; i < paramTypes.length; i++) { + verifyRemoteParameters(paramTypes[i]); + } + verifyRemoteParameters(remoteMethod.getReturnType()); + } + + private static final void verifyRemoteParameters(Class parameter) throws RemoteException { + if (Remote.class.isAssignableFrom(parameter)) { + if (!parameter.isInterface()) + throw new RemoteException("remote parameter is not an interface"); + Class[] superInterfaces = parameter.getInterfaces(); + for (int j = 0; j < superInterfaces.length; j++) { + if (!Remote.class.isAssignableFrom(superInterfaces[j])) + throw new RemoteException("remote parameter not assignable"); + } + } + else if ((!parameter.isPrimitive()) && (!parameter.equals(Void.TYPE)) && (!Serializable.class.isAssignableFrom(parameter))) { + throw new RemoteException("invalid parameter"); + } + } + private class RemoteObjectInvocationHandler implements InvocationHandler { - public WrappedRemoteObj remoteObj = null; + public IxcRegistryImpl.WrappedRemoteObj remoteObj = null; public RemoteObjectInvocationHandler(IxcRegistryImpl.WrappedRemoteObj remoteObj) { TRACE("RemoteInvocationHandler created for " + remoteObj); @@ -168,7 +215,14 @@ public class IxcRegistryImpl { TRACE("RemoteInvocationHandler called for " + remoteObj); - /* TODO: verify interfaces */ + if (null != args) { + /* verify interfaces */ + for (int i = 0; i < args.length; i++) { + if ((null != args[i]) && (Remote.class.isAssignableFrom(args[i].getClass()))) { + IxcRegistryImpl.verifyRemoteInterfaces(args[i].getClass()); + } + } + } RemoteMethod remoteMethod = new RemoteMethod(method, remoteObj.context, args); _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
