gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r4785 - in freeway: . native src/org/gnu/freeway/cwrappers


From: gnunet
Subject: [GNUnet-SVN] r4785 - in freeway: . native src/org/gnu/freeway/cwrappers src/org/gnu/freeway/cwrappers/util src/org/gnu/freeway/server src/org/gnu/freeway/services src/org/gnu/freeway/services/c src/org/gnu/freeway/services/java
Date: Mon, 7 May 2007 18:05:37 -0600 (MDT)

Author: mdonoughe
Date: 2007-05-07 18:05:37 -0600 (Mon, 07 May 2007)
New Revision: 4785

Added:
   freeway/native/builtin.h
   freeway/native/datastoreservice.c
   freeway/native/identityservice.c
   freeway/native/sqstoreservice.c
   freeway/native/statsservice.c
   freeway/native/trafficservice.c
   freeway/server.sh
   freeway/stg.sh
Modified:
   freeway/build.sh
   freeway/native/Makefile.am
   freeway/native/java.c
   freeway/native/org_gnu_freeway_server_CPluginLoader.h
   freeway/native/switch-table.c
   freeway/native/switch-table.h
   freeway/native/util.c
   freeway/native/util.h
   freeway/src/org/gnu/freeway/cwrappers/CString.java
   freeway/src/org/gnu/freeway/cwrappers/ConstCString.java
   freeway/src/org/gnu/freeway/cwrappers/util/CWrapper.java
   freeway/src/org/gnu/freeway/cwrappers/util/SwitchTableGenerator.java
   freeway/src/org/gnu/freeway/server/CPluginLoader.java
   freeway/src/org/gnu/freeway/server/CoreAPI.java
   freeway/src/org/gnu/freeway/services/SqstoreService.java
   freeway/src/org/gnu/freeway/services/c/DatastoreService.java
   freeway/src/org/gnu/freeway/services/c/IdentityService.java
   freeway/src/org/gnu/freeway/services/c/SqstoreService.java
   freeway/src/org/gnu/freeway/services/c/StatsService.java
   freeway/src/org/gnu/freeway/services/c/TrafficService.java
   freeway/src/org/gnu/freeway/services/java/StatsService.java
Log:
 starting to wrap freeway services in c
 Now generates the switch table as part of build.sh
 Added C wrappers around Java code(not perfect)
 Removed two possible infinite loops in getModule
 Added server.sh and stg.sh for running the server and SwitchTableGenerator
 Some code added towards potentially supporting the conversion between
        "int*, int" and "int[]" or something similar.



Modified: freeway/build.sh
===================================================================
--- freeway/build.sh    2007-05-04 06:57:57 UTC (rev 4784)
+++ freeway/build.sh    2007-05-08 00:05:37 UTC (rev 4785)
@@ -3,7 +3,7 @@
 # Build Freeway and it's C libraries.
 #
 
-ant && javah -classpath build/classes -d native 
org.gnu.freeway.server.CPluginLoader && make || exit 1
+ant && javah -classpath build/classes -d native 
org.gnu.freeway.server.CPluginLoader && sh stg.sh && make || exit 1
 cp native/.libs/lib*.so* etc/support/clib/.libs/*.so* native/.libs/lib*.dylib 
etc/support/clib/.libs/lib*.dylib build/ > /dev/null 2>&1
 mv build/libfreeway-clib.dylib build/libfreeway-clib.jnilib > /dev/null 2>&1
 mv build/libcpluginloader.dylib build/libcpluginloader.jnilib > /dev/null 2>&1

Modified: freeway/native/Makefile.am
===================================================================
--- freeway/native/Makefile.am  2007-05-04 06:57:57 UTC (rev 4784)
+++ freeway/native/Makefile.am  2007-05-08 00:05:37 UTC (rev 4785)
@@ -11,5 +11,7 @@
 libcpluginloader_la_SOURCES = core.c connection.c \
   handler.c tcpserver.c util.c jni.h java.c \
   org_gnu_freeway_server_CPluginLoader.h gettext.h \
-  connection.h handler.h tcpserver.h util.h core.h
+  connection.h handler.h tcpserver.h util.h core.h \
+  trafficservice.c statsservice.c datastoreservice.c \
+  identityservice.c sqstoreservice.c 
 endif

Added: freeway/native/builtin.h
===================================================================
--- freeway/native/builtin.h                            (rev 0)
+++ freeway/native/builtin.h    2007-05-08 00:05:37 UTC (rev 4785)
@@ -0,0 +1,42 @@
+// This file was autogenerated by SwitchTableGenerator
+#include <GNUnet/gnunet_datastore_service.h>
+#include <GNUnet/gnunet_identity_service.h>
+#include <GNUnet/gnunet_sqstore_service.h>
+#include <GNUnet/gnunet_stats_service.h>
+#include <GNUnet/gnunet_traffic_service.h>
+
+// method pointers to internal services
+typedef void * (*FacadeInitMethod)(jobject object, CoreAPIForApplication * 
capi);
+typedef void (*FacadeDoneMethod)();
+Datastore_ServiceAPI * provide_facade_datastore(jobject, CoreAPIForApplication 
*);
+void release_facade_datastore();
+Identity_ServiceAPI * provide_facade_identity(jobject, CoreAPIForApplication 
*);
+void release_facade_identity();
+SQstore_ServiceAPI * provide_facade_sqstore(jobject, CoreAPIForApplication *);
+void release_facade_sqstore();
+Stats_ServiceAPI * provide_facade_stats(jobject, CoreAPIForApplication *);
+void release_facade_stats();
+Traffic_ServiceAPI * provide_facade_traffic(jobject, CoreAPIForApplication *);
+void release_facade_traffic();
+const int facadeCount = 5;
+const char* facadeNames[] = {
+       "datastore",
+       "identity",
+       "sqstore",
+       "stats",
+       "traffic"
+};
+const ServiceInitMethod facadeInitPointers[] = {
+       (FacadeInitMethod) &provide_facade_datastore,
+       (FacadeInitMethod) &provide_facade_identity,
+       (FacadeInitMethod) &provide_facade_sqstore,
+       (FacadeInitMethod) &provide_facade_stats,
+       (FacadeInitMethod) &provide_facade_traffic
+};
+ServiceDoneMethod facadeReleasePointers[] = {
+       (FacadeDoneMethod) &release_facade_datastore,
+       (FacadeDoneMethod) &release_facade_identity,
+       (FacadeDoneMethod) &release_facade_sqstore,
+       (FacadeDoneMethod) &release_facade_stats,
+       (FacadeDoneMethod) &release_facade_traffic
+};

Added: freeway/native/datastoreservice.c
===================================================================
--- freeway/native/datastoreservice.c                           (rev 0)
+++ freeway/native/datastoreservice.c   2007-05-08 00:05:37 UTC (rev 4785)
@@ -0,0 +1,160 @@
+// This file was autogenerated by SwitchTableGenerator
+#include <config.h>
+#include <stdio.h>
+#include <GNUnet/gnunet_util.h>
+#include <GNUnet/gnunet_core.h>
+#include <GNUnet/gnunet_datastore_service.h>
+#include <locale.h>
+#include "gettext.h"
+#include "jni.h"
+#include "util.h"
+#include "switch-table.h"
+#include "core.h"
+
+static jobject myObject;
+
+static int putUpdate(void * arg0, void * arg1) {
+       fprintf(stderr, "in putUpdate\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject arg1obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "putUpdate", 
"(Lorg/gnu/freeway/cwrappers/ConstCHashCode512;Lorg/gnu/freeway/cwrappers/ConstCDatastoreValue;)Lorg/gnu/freeway/cwrappers/CInt;");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convPtrToNewObject(arg0, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/ConstCHashCode512"), env);
+       arg1obj = convPtrToNewObject(arg1, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/ConstCDatastoreValue"), env);
+       fprintf(stderr, "calling Java from putUpdate\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method, arg0obj, 
arg1obj);
+       updatePtrFromObject(arg0, arg0obj, env);
+       updatePtrFromObject(arg1, arg1obj, env);
+       fprintf(stderr, "leaving putUpdate\n");
+               return convCIntToInt(retobj, env);
+}
+static int fast_get(void * arg0) {
+       fprintf(stderr, "in fast_get\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "fast_get", 
"(Lorg/gnu/freeway/cwrappers/ConstCHashCode512;)Lorg/gnu/freeway/cwrappers/CInt;");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convPtrToNewObject(arg0, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/ConstCHashCode512"), env);
+       fprintf(stderr, "calling Java from fast_get\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method, arg0obj);
+       updatePtrFromObject(arg0, arg0obj, env);
+       fprintf(stderr, "leaving fast_get\n");
+               return convCIntToInt(retobj, env);
+}
+static int del(void * arg0, void * arg1) {
+       fprintf(stderr, "in del\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject arg1obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "del", 
"(Lorg/gnu/freeway/cwrappers/ConstCHashCode512;Lorg/gnu/freeway/cwrappers/ConstCDatastoreValue;)Lorg/gnu/freeway/cwrappers/CInt;");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convPtrToNewObject(arg0, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/ConstCHashCode512"), env);
+       arg1obj = convPtrToNewObject(arg1, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/ConstCDatastoreValue"), env);
+       fprintf(stderr, "calling Java from del\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method, arg0obj, 
arg1obj);
+       updatePtrFromObject(arg0, arg0obj, env);
+       updatePtrFromObject(arg1, arg1obj, env);
+       fprintf(stderr, "leaving del\n");
+               return convCIntToInt(retobj, env);
+}
+static int put(void * arg0, void * arg1) {
+       fprintf(stderr, "in put\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject arg1obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "put", 
"(Lorg/gnu/freeway/cwrappers/ConstCHashCode512;Lorg/gnu/freeway/cwrappers/ConstCDatastoreValue;)Lorg/gnu/freeway/cwrappers/CInt;");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convPtrToNewObject(arg0, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/ConstCHashCode512"), env);
+       arg1obj = convPtrToNewObject(arg1, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/ConstCDatastoreValue"), env);
+       fprintf(stderr, "calling Java from put\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method, arg0obj, 
arg1obj);
+       updatePtrFromObject(arg0, arg0obj, env);
+       updatePtrFromObject(arg1, arg1obj, env);
+       fprintf(stderr, "leaving put\n");
+               return convCIntToInt(retobj, env);
+}
+static long long getSize() {
+       fprintf(stderr, "in getSize\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "getSize", 
"()Lorg/gnu/freeway/cwrappers/CLong;");
+       GNUNET_ASSERT(method != 0);
+       fprintf(stderr, "calling Java from getSize\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method);
+       fprintf(stderr, "leaving getSize\n");
+               return convCLongToLong(retobj, env);
+}
+
+Datastore_ServiceAPI * provide_facade_datastore(jobject object, 
CoreAPIForApplication * capi) {
+       static Datastore_ServiceAPI api;
+       JNIEnv * env;
+       env = findThread()->env;
+       GNUNET_ASSERT(env != NULL);
+       myObject = (*env)->NewGlobalRef(env, object);
+       api.putUpdate = &putUpdate;
+       api.fast_get = &fast_get;
+       api.del = &del;
+       api.put = &put;
+       api.getSize = &getSize;
+       return &api;
+}
+
+void release_facade_datastore() {
+       ActiveThreadList * t;
+       JNIEnv * env;
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       //release java stats service
+       (*env)->DeleteGlobalRef(env, myObject);
+}

Added: freeway/native/identityservice.c
===================================================================
--- freeway/native/identityservice.c                            (rev 0)
+++ freeway/native/identityservice.c    2007-05-08 00:05:37 UTC (rev 4785)
@@ -0,0 +1,34 @@
+// This file was autogenerated by SwitchTableGenerator
+#include <config.h>
+#include <stdio.h>
+#include <GNUnet/gnunet_util.h>
+#include <GNUnet/gnunet_core.h>
+#include <GNUnet/gnunet_identity_service.h>
+#include <locale.h>
+#include "gettext.h"
+#include "jni.h"
+#include "util.h"
+#include "switch-table.h"
+#include "core.h"
+
+static jobject myObject;
+
+
+Identity_ServiceAPI * provide_facade_identity(jobject object, 
CoreAPIForApplication * capi) {
+       static Identity_ServiceAPI api;
+       JNIEnv * env;
+       env = findThread()->env;
+       GNUNET_ASSERT(env != NULL);
+       myObject = (*env)->NewGlobalRef(env, object);
+       return &api;
+}
+
+void release_facade_identity() {
+       ActiveThreadList * t;
+       JNIEnv * env;
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       //release java stats service
+       (*env)->DeleteGlobalRef(env, myObject);
+}

Modified: freeway/native/java.c
===================================================================
--- freeway/native/java.c       2007-05-04 06:57:57 UTC (rev 4784)
+++ freeway/native/java.c       2007-05-08 00:05:37 UTC (rev 4785)
@@ -36,6 +36,7 @@
 #include "util.h"
 #include "switch-table.h"
 #include "core.h"
+#include "builtin.h"
 
 JNIEXPORT jlong JNICALL Java_org_gnu_freeway_server_CPluginLoader_cLoadService
   (JNIEnv *env, jobject cls, jstring serviceName, jobject capi) {
@@ -52,14 +53,12 @@
        if (m == NULL) 
                goto ULE;
        if(m->moduleFptrStruct == NULL) {
-               mptr = bindDynamicMethod(m->modulePtr,
-                                       "provide_",
-                                       strServiceName);
+               mptr = bindDynamicMethod(m->modulePtr, "provide_", 
strServiceName);
                if (mptr == NULL) {
                        releaseModule(m);
                        goto ULE;
                }
-               m->moduleFptrStruct = mptr(&jcapi);
+               m->moduleFptrStruct = mptr(&jcapi);
                if (m->moduleFptrStruct == NULL) {
                  releaseModule(m);
                  goto ULE;
@@ -70,11 +69,11 @@
        fprintf(stderr, "leaving cLoadService\n");
        return (jlong) (long) m;
 ULE:        
-        UnsatisfiedLinkError = (*env)->FindClass(env, 
"java/lang/UnsatisfiedLinkError");
-        if(UnsatisfiedLinkError)
+       UnsatisfiedLinkError = (*env)->FindClass(env, 
"java/lang/UnsatisfiedLinkError");
+       if(UnsatisfiedLinkError)
                (*env)->ThrowNew(env, UnsatisfiedLinkError, strServiceName);
        (*env)->ReleaseStringUTFChars(env, serviceName, strServiceName);
-        unregisterThread();
+       unregisterThread();
        return 0;
 }
 
@@ -370,3 +369,70 @@
   setIdentity();
   unregisterThread();
 }
+
+JNIEXPORT jlong JNICALL Java_org_gnu_freeway_server_CPluginLoader_cLoadFacade
+  (JNIEnv *env, jclass clazz, jobject obj, jstring serviceName, jobject capi) {
+       fprintf(stderr, "in cLoadFacade\n");
+       registerThread(env, capi);
+       const char *strServiceName;
+       ModuleList * m;
+       FacadeInitMethod mptr;
+       jclass UnsatisfiedLinkError;
+       int i;
+       
+       strServiceName = (*env)->GetStringUTFChars(env, serviceName, NULL);
+       GNUNET_ASSERT(strServiceName != NULL);
+       m = getModule("facade", strServiceName);
+       if(m->moduleFptrStruct == NULL) {
+               for(i = 0; i < facadeCount; i++) {
+                       if(strcmp(strServiceName, facadeNames[i]) == 0) {
+                               mptr = facadeInitPointers[i];
+                               break;
+                       }
+               }
+               if (mptr == NULL) {
+                       releaseModule(m);
+                       goto ULE;
+               }
+               m->moduleFptrStruct = mptr(obj, &jcapi);
+               if (m->moduleFptrStruct == NULL) {
+                 releaseModule(m);
+                 goto ULE;
+               }
+               (*env)->ReleaseStringUTFChars(env, serviceName, strServiceName);
+       }
+       unregisterThread();
+       fprintf(stderr, "leaving cLoadFacade\n");
+       return (jlong) (long) m;
+ULE:        
+       UnsatisfiedLinkError = (*env)->FindClass(env, 
"java/lang/UnsatisfiedLinkError");
+       if(UnsatisfiedLinkError)
+               (*env)->ThrowNew(env, UnsatisfiedLinkError, strServiceName);
+       (*env)->ReleaseStringUTFChars(env, serviceName, strServiceName);
+       unregisterThread();
+       return 0;
+}
+
+JNIEXPORT void JNICALL Java_org_gnu_freeway_server_CPluginLoader_cUnloadFacade
+  (JNIEnv *env, jobject cls, jlong ml, jobject capi) {
+  fprintf(stderr, "in cUnloadFacade\n");
+  registerThread(env, capi);
+  ModuleList * m = (ModuleList *) (long) ml;
+  FacadeDoneMethod mptr;
+  int i;
+  for(i = 0; i < facadeCount; i++) {
+    if(strcmp(m->name, facadeNames[i]) == 0) {
+      mptr = facadeReleasePointers[i];
+      break;
+    }
+  }
+  if (mptr != NULL) {
+    fprintf(stderr, "Releasing the %s facade\n", m->name);
+    mptr();
+  }
+
+  releaseModule(m);
+
+  unregisterThread();
+  fprintf(stderr, "leaving cUnloadFacade\n");
+}

Modified: freeway/native/org_gnu_freeway_server_CPluginLoader.h
===================================================================
--- freeway/native/org_gnu_freeway_server_CPluginLoader.h       2007-05-04 
06:57:57 UTC (rev 4784)
+++ freeway/native/org_gnu_freeway_server_CPluginLoader.h       2007-05-08 
00:05:37 UTC (rev 4785)
@@ -111,6 +111,22 @@
 JNIEXPORT void JNICALL Java_org_gnu_freeway_server_CPluginLoader_cSetIdentity
   (JNIEnv *, jclass, jobject);
 
+/*
+ * Class:     org_gnu_freeway_server_CPluginLoader
+ * Method:    cLoadFacade
+ * Signature: 
(Ljava/lang/Object;Ljava/lang/String;Lorg/gnu/freeway/server/CoreAPI;)J
+ */
+JNIEXPORT jlong JNICALL Java_org_gnu_freeway_server_CPluginLoader_cLoadFacade
+  (JNIEnv *, jclass, jobject, jstring, jobject);
+
+/*
+ * Class:     org_gnu_freeway_server_CPluginLoader
+ * Method:    cUnloadFacade
+ * Signature: (JLorg/gnu/freeway/server/CoreAPI;)V
+ */
+JNIEXPORT void JNICALL Java_org_gnu_freeway_server_CPluginLoader_cUnloadFacade
+  (JNIEnv *, jclass, jlong, jobject);
+
 #ifdef __cplusplus
 }
 #endif

Added: freeway/native/sqstoreservice.c
===================================================================
--- freeway/native/sqstoreservice.c                             (rev 0)
+++ freeway/native/sqstoreservice.c     2007-05-08 00:05:37 UTC (rev 4785)
@@ -0,0 +1,158 @@
+// This file was autogenerated by SwitchTableGenerator
+#include <config.h>
+#include <stdio.h>
+#include <GNUnet/gnunet_util.h>
+#include <GNUnet/gnunet_core.h>
+#include <GNUnet/gnunet_sqstore_service.h>
+#include <locale.h>
+#include "gettext.h"
+#include "jni.h"
+#include "util.h"
+#include "switch-table.h"
+#include "core.h"
+
+static jobject myObject;
+
+static int del(void * arg0, void * arg1) {
+       fprintf(stderr, "in del\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject arg1obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "del", 
"(Lorg/gnu/freeway/cwrappers/CHashCode512;Lorg/gnu/freeway/cwrappers/CDatastoreValue;)Lorg/gnu/freeway/cwrappers/CInt;");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convPtrToNewObject(arg0, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/CHashCode512"), env);
+       arg1obj = convPtrToNewObject(arg1, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/CDatastoreValue"), env);
+       fprintf(stderr, "calling Java from del\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method, arg0obj, 
arg1obj);
+       updatePtrFromObject(arg0, arg0obj, env);
+       updatePtrFromObject(arg1, arg1obj, env);
+       fprintf(stderr, "leaving del\n");
+               return convCIntToInt(retobj, env);
+}
+static int put(void * arg0, void * arg1) {
+       fprintf(stderr, "in put\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject arg1obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "put", 
"(Lorg/gnu/freeway/cwrappers/CHashCode512;Lorg/gnu/freeway/cwrappers/CDatastoreValue;)Lorg/gnu/freeway/cwrappers/CInt;");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convPtrToNewObject(arg0, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/CHashCode512"), env);
+       arg1obj = convPtrToNewObject(arg1, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/CDatastoreValue"), env);
+       fprintf(stderr, "calling Java from put\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method, arg0obj, 
arg1obj);
+       updatePtrFromObject(arg0, arg0obj, env);
+       updatePtrFromObject(arg1, arg1obj, env);
+       fprintf(stderr, "leaving put\n");
+               return convCIntToInt(retobj, env);
+}
+static long long getSize() {
+       fprintf(stderr, "in getSize\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "getSize", 
"()Lorg/gnu/freeway/cwrappers/CLong;");
+       GNUNET_ASSERT(method != 0);
+       fprintf(stderr, "calling Java from getSize\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method);
+       fprintf(stderr, "leaving getSize\n");
+               return convCLongToLong(retobj, env);
+}
+static int update(void * arg0, void * arg1, int arg2) {
+       fprintf(stderr, "in update\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject arg1obj;
+       jobject arg2obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "update", 
"(Lorg/gnu/freeway/cwrappers/CHashCode512;Lorg/gnu/freeway/cwrappers/CDatastoreValue;Lorg/gnu/freeway/cwrappers/CInt;)Lorg/gnu/freeway/cwrappers/CInt;");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convPtrToNewObject(arg0, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/CHashCode512"), env);
+       arg1obj = convPtrToNewObject(arg1, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/CDatastoreValue"), env);
+       arg2obj = convIntToCInt(arg2, env);
+       fprintf(stderr, "calling Java from update\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method, arg0obj, 
arg1obj, arg2obj);
+       updatePtrFromObject(arg0, arg0obj, env);
+       updatePtrFromObject(arg1, arg1obj, env);
+       fprintf(stderr, "leaving update\n");
+               return convCIntToInt(retobj, env);
+}
+static void drop() {
+       fprintf(stderr, "in drop\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "drop", "()V");
+       GNUNET_ASSERT(method != 0);
+       fprintf(stderr, "calling Java from drop\n");
+       (*env)->CallVoidMethod(env, myObject, method);
+       fprintf(stderr, "leaving drop\n");
+}
+
+SQstore_ServiceAPI * provide_facade_sqstore(jobject object, 
CoreAPIForApplication * capi) {
+       static SQstore_ServiceAPI api;
+       JNIEnv * env;
+       env = findThread()->env;
+       GNUNET_ASSERT(env != NULL);
+       myObject = (*env)->NewGlobalRef(env, object);
+       api.del = &del;
+       api.put = &put;
+       api.getSize = &getSize;
+       api.update = &update;
+       api.drop = &drop;
+       return &api;
+}
+
+void release_facade_sqstore() {
+       ActiveThreadList * t;
+       JNIEnv * env;
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       //release java stats service
+       (*env)->DeleteGlobalRef(env, myObject);
+}

Added: freeway/native/statsservice.c
===================================================================
--- freeway/native/statsservice.c                               (rev 0)
+++ freeway/native/statsservice.c       2007-05-08 00:05:37 UTC (rev 4785)
@@ -0,0 +1,129 @@
+// This file was autogenerated by SwitchTableGenerator
+#include <config.h>
+#include <stdio.h>
+#include <GNUnet/gnunet_util.h>
+#include <GNUnet/gnunet_core.h>
+#include <GNUnet/gnunet_stats_service.h>
+#include <locale.h>
+#include "gettext.h"
+#include "jni.h"
+#include "util.h"
+#include "switch-table.h"
+#include "core.h"
+
+static jobject myObject;
+
+static void change(int arg0, int arg1) {
+       fprintf(stderr, "in change\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject arg1obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "change", 
"(Lorg/gnu/freeway/cwrappers/ConstCInt;Lorg/gnu/freeway/cwrappers/ConstCInt;)V");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convIntToCInt(arg0, env);
+       arg1obj = convIntToCInt(arg1, env);
+       fprintf(stderr, "calling Java from change\n");
+       (*env)->CallVoidMethod(env, myObject, method, arg0obj, arg1obj);
+       fprintf(stderr, "leaving change\n");
+}
+static long long get(int arg0) {
+       fprintf(stderr, "in get\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "get", 
"(Lorg/gnu/freeway/cwrappers/ConstCInt;)Lorg/gnu/freeway/cwrappers/CLong;");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convIntToCInt(arg0, env);
+       fprintf(stderr, "calling Java from get\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method, arg0obj);
+       fprintf(stderr, "leaving get\n");
+               return convCLongToLong(retobj, env);
+}
+static void set(int arg0, long long arg1) {
+       fprintf(stderr, "in set\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject arg1obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "set", 
"(Lorg/gnu/freeway/cwrappers/ConstCInt;Lorg/gnu/freeway/cwrappers/ConstCLong;)V");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convIntToCInt(arg0, env);
+       arg1obj = convLongToCLong(arg1, env);
+       fprintf(stderr, "calling Java from set\n");
+       (*env)->CallVoidMethod(env, myObject, method, arg0obj, arg1obj);
+       fprintf(stderr, "leaving set\n");
+}
+static int create(void * arg0) {
+       fprintf(stderr, "in create\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "create", 
"(Lorg/gnu/freeway/cwrappers/ConstCString;)Lorg/gnu/freeway/cwrappers/CInt;");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convPtrToNewObject(arg0, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/ConstCString"), env);
+       fprintf(stderr, "calling Java from create\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method, arg0obj);
+       updatePtrFromObject(arg0, arg0obj, env);
+       fprintf(stderr, "leaving create\n");
+               return convCIntToInt(retobj, env);
+}
+
+Stats_ServiceAPI * provide_facade_stats(jobject object, CoreAPIForApplication 
* capi) {
+       static Stats_ServiceAPI api;
+       JNIEnv * env;
+       env = findThread()->env;
+       GNUNET_ASSERT(env != NULL);
+       myObject = (*env)->NewGlobalRef(env, object);
+       api.change = &change;
+       api.get = &get;
+       api.set = &set;
+       api.create = &create;
+       return &api;
+}
+
+void release_facade_stats() {
+       ActiveThreadList * t;
+       JNIEnv * env;
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       //release java stats service
+       (*env)->DeleteGlobalRef(env, myObject);
+}

Modified: freeway/native/switch-table.c
===================================================================
--- freeway/native/switch-table.c       2007-05-04 06:57:57 UTC (rev 4784)
+++ freeway/native/switch-table.c       2007-05-08 00:05:37 UTC (rev 4785)
@@ -2,84 +2,84 @@
 jobject * jargs;
 int jargLength = (*env)->GetArrayLength(env, arguments);
 if(jargLength > 0) {
-  jargs = malloc(sizeof(jobject) * jargLength);
-  int jargsI;
-  for(jargsI = 0; jargsI < jargLength; jargsI++) {
-    jargs[jargsI] = (*env)->GetObjectArrayElement(env, arguments, jargsI);
-  }
+       jargs = malloc(sizeof(jobject) * jargLength);
+       int jargsI;
+       for(jargsI = 0; jargsI < jargLength; jargsI++) {
+               jargs[jargsI] = (*env)->GetObjectArrayElement(env, arguments, 
jargsI);
+       }
 }
 switch (functionType) {
-  case 792: {
-    PointerObject * carg0 = convObjectToPtr(jargs[0], env);
-    PointerObject * carg1 = convObjectToPtr(jargs[1], env);
-    int carg2 = convCIntToInt(jargs[2], env);
-    int cret = ((FunctionType792) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0->pointer, carg1->pointer, 
carg2);
-    updateObjectFromPtr(jargs[1], carg1, env);
-    updateObjectFromPtr(jargs[0], carg0, env);
-    oret = convIntToCInt(cret, env);
-    break;
+       case 0: {
+               ((FunctionType0) 
((void**)m->moduleFptrStruct)[functionOffset])();
+               break;
   }
-  case 15: {
-    PointerObject * carg0 = convObjectToPtr(jargs[0], env);
-    int cret = ((FunctionType15) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0->pointer);
-    updateObjectFromPtr(jargs[0], carg0, env);
-    oret = convIntToCInt(cret, env);
-    break;
+       case 1635880: {
+               int carg0 = convCIntToInt(jargs[0], env);
+               short carg1 = convCShortToShort(jargs[1], env);
+               short carg2 = convCShortToShort(jargs[2], env);
+               PointerObject * carg3 = convObjectToPtr(jargs[3], env);
+               PointerObject * carg4 = convObjectToPtr(jargs[4], env);
+               PointerObject * carg5 = convObjectToPtr(jargs[5], env);
+               PointerObject * carg6 = convObjectToPtr(jargs[6], env);
+               int cret = ((FunctionType1635880) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0, carg1, carg2, 
carg3->pointer, carg4->pointer, carg5->pointer, carg6->pointer);
+               updateObjectFromPtr(jargs[6], carg6, env);
+               updateObjectFromPtr(jargs[5], carg5, env);
+               updateObjectFromPtr(jargs[4], carg4, env);
+               updateObjectFromPtr(jargs[3], carg3, env);
+               oret = convIntToCInt(cret, env);
+               break;
   }
-  case 4: {
-    long long cret = ((FunctionType4) 
((void**)m->moduleFptrStruct)[functionOffset])();
-    oret = convLongToCLong(cret, env);
-    break;
+       case 4: {
+               long long cret = ((FunctionType4) 
((void**)m->moduleFptrStruct)[functionOffset])();
+               oret = convLongToCLong(cret, env);
+               break;
   }
-  case 77: {
-    int carg0 = convCIntToInt(jargs[0], env);
-    long long carg1 = convCLongToLong(jargs[1], env);
-    ((FunctionType77) ((void**)m->moduleFptrStruct)[functionOffset])(carg0, 
carg1);
-    break;
+       case 113: {
+               PointerObject * carg0 = convObjectToPtr(jargs[0], env);
+               PointerObject * carg1 = convObjectToPtr(jargs[1], env);
+               int cret = ((FunctionType113) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0->pointer, carg1->pointer);
+               updateObjectFromPtr(jargs[1], carg1, env);
+               updateObjectFromPtr(jargs[0], carg0, env);
+               oret = convIntToCInt(cret, env);
+               break;
   }
-  case 11: {
-    int carg0 = convCIntToInt(jargs[0], env);
-    long long cret = ((FunctionType11) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0);
-    oret = convLongToCLong(cret, env);
-    break;
+       case 77: {
+               int carg0 = convCIntToInt(jargs[0], env);
+               long long carg1 = convCLongToLong(jargs[1], env);
+               ((FunctionType77) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0, carg1);
+               break;
   }
-  case 1635880: {
-    int carg0 = convCIntToInt(jargs[0], env);
-    short carg1 = convCShortToShort(jargs[1], env);
-    short carg2 = convCShortToShort(jargs[2], env);
-    PointerObject * carg3 = convObjectToPtr(jargs[3], env);
-    PointerObject * carg4 = convObjectToPtr(jargs[4], env);
-    PointerObject * carg5 = convObjectToPtr(jargs[5], env);
-    PointerObject * carg6 = convObjectToPtr(jargs[6], env);
-    int cret = ((FunctionType1635880) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0, carg1, carg2, 
carg3->pointer, carg4->pointer, carg5->pointer, carg6->pointer);
-    updateObjectFromPtr(jargs[6], carg6, env);
-    updateObjectFromPtr(jargs[5], carg5, env);
-    updateObjectFromPtr(jargs[4], carg4, env);
-    updateObjectFromPtr(jargs[3], carg3, env);
-    oret = convIntToCInt(cret, env);
-    break;
+       case 11: {
+               int carg0 = convCIntToInt(jargs[0], env);
+               long long cret = ((FunctionType11) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0);
+               oret = convLongToCLong(cret, env);
+               break;
   }
-  case 56: {
-    int carg0 = convCIntToInt(jargs[0], env);
-    int carg1 = convCIntToInt(jargs[1], env);
-    ((FunctionType56) ((void**)m->moduleFptrStruct)[functionOffset])(carg0, 
carg1);
-    break;
+       case 56: {
+               int carg0 = convCIntToInt(jargs[0], env);
+               int carg1 = convCIntToInt(jargs[1], env);
+               ((FunctionType56) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0, carg1);
+               break;
   }
-  case 113: {
-    PointerObject * carg0 = convObjectToPtr(jargs[0], env);
-    PointerObject * carg1 = convObjectToPtr(jargs[1], env);
-    int cret = ((FunctionType113) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0->pointer, carg1->pointer);
-    updateObjectFromPtr(jargs[1], carg1, env);
-    updateObjectFromPtr(jargs[0], carg0, env);
-    oret = convIntToCInt(cret, env);
-    break;
+       case 792: {
+               PointerObject * carg0 = convObjectToPtr(jargs[0], env);
+               PointerObject * carg1 = convObjectToPtr(jargs[1], env);
+               int carg2 = convCIntToInt(jargs[2], env);
+               int cret = ((FunctionType792) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0->pointer, carg1->pointer, 
carg2);
+               updateObjectFromPtr(jargs[1], carg1, env);
+               updateObjectFromPtr(jargs[0], carg0, env);
+               oret = convIntToCInt(cret, env);
+               break;
   }
-  case 0: {
-    ((FunctionType0) ((void**)m->moduleFptrStruct)[functionOffset])();
-    break;
+       case 15: {
+               PointerObject * carg0 = convObjectToPtr(jargs[0], env);
+               int cret = ((FunctionType15) 
((void**)m->moduleFptrStruct)[functionOffset])(carg0->pointer);
+               updateObjectFromPtr(jargs[0], carg0, env);
+               oret = convIntToCInt(cret, env);
+               break;
   }
-  default:
-    GNUNET_ASSERT(0);
+       default:
+               GNUNET_ASSERT(0);
 }
 if(jargs != NULL)
-  free(jargs);
+       free(jargs);

Modified: freeway/native/switch-table.h
===================================================================
--- freeway/native/switch-table.h       2007-05-04 06:57:57 UTC (rev 4784)
+++ freeway/native/switch-table.h       2007-05-08 00:05:37 UTC (rev 4785)
@@ -1,10 +1,11 @@
 // This file was autogenerated by SwitchTableGenerator
-typedef int (*FunctionType792)(void * arg0, void * arg1, int arg2);
-typedef int (*FunctionType15)(void * arg0);
+#include "jni.h"
+typedef void (*FunctionType0)();
+typedef int (*FunctionType1635880)(int arg0, short arg1, short arg2, void * 
arg3, void * arg4, void * arg5, void * arg6);
 typedef long long (*FunctionType4)();
+typedef int (*FunctionType113)(void * arg0, void * arg1);
 typedef void (*FunctionType77)(int arg0, long long arg1);
 typedef long long (*FunctionType11)(int arg0);
-typedef int (*FunctionType1635880)(int arg0, short arg1, short arg2, void * 
arg3, void * arg4, void * arg5, void * arg6);
 typedef void (*FunctionType56)(int arg0, int arg1);
-typedef int (*FunctionType113)(void * arg0, void * arg1);
-typedef void (*FunctionType0)();
+typedef int (*FunctionType792)(void * arg0, void * arg1, int arg2);
+typedef int (*FunctionType15)(void * arg0);

Added: freeway/native/trafficservice.c
===================================================================
--- freeway/native/trafficservice.c                             (rev 0)
+++ freeway/native/trafficservice.c     2007-05-08 00:05:37 UTC (rev 4785)
@@ -0,0 +1,73 @@
+// This file was autogenerated by SwitchTableGenerator
+#include <config.h>
+#include <stdio.h>
+#include <GNUnet/gnunet_util.h>
+#include <GNUnet/gnunet_core.h>
+#include <GNUnet/gnunet_traffic_service.h>
+#include <locale.h>
+#include "gettext.h"
+#include "jni.h"
+#include "util.h"
+#include "switch-table.h"
+#include "core.h"
+
+static jobject myObject;
+
+static int get(int arg0, short arg1, short arg2, void * arg3, void * arg4, 
void * arg5, void * arg6) {
+       fprintf(stderr, "in get\n");
+       ActiveThreadList * t;
+       jmethodID method;
+       jclass clazz;
+       JNIEnv * env;
+       jobject arg0obj;
+       jobject arg1obj;
+       jobject arg2obj;
+       jobject arg3obj;
+       jobject arg4obj;
+       jobject arg5obj;
+       jobject arg6obj;
+       jobject retobj;
+
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       clazz = (*env)->GetObjectClass(env, myObject);
+       GNUNET_ASSERT(clazz != 0);
+       method = (*env)->GetMethodID(env, clazz, "get", 
"(Lorg/gnu/freeway/cwrappers/CUnsignedInt;Lorg/gnu/freeway/cwrappers/CShort;Lorg/gnu/freeway/cwrappers/CShort;Lorg/gnu/freeway/cwrappers/CUnsignedIntPtr;Lorg/gnu/freeway/cwrappers/CUnsignedIntPtr;Lorg/gnu/freeway/cwrappers/CUnsignedIntPtr;Lorg/gnu/freeway/cwrappers/CUnsignedIntPtr;)Lorg/gnu/freeway/cwrappers/CInt;");
+       GNUNET_ASSERT(method != 0);
+       arg0obj = convIntToCInt(arg0, env);
+       arg1obj = convShortToCShort(arg1, env);
+       arg2obj = convShortToCShort(arg2, env);
+       arg3obj = convPtrToNewObject(arg3, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/CUnsignedIntPtr"), env);
+       arg4obj = convPtrToNewObject(arg4, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/CUnsignedIntPtr"), env);
+       arg5obj = convPtrToNewObject(arg5, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/CUnsignedIntPtr"), env);
+       arg6obj = convPtrToNewObject(arg6, (*env)->FindClass(env, 
"org/gnu/freeway/cwrappers/CUnsignedIntPtr"), env);
+       fprintf(stderr, "calling Java from get\n");
+       retobj = (*env)->CallObjectMethod(env, myObject, method, arg0obj, 
arg1obj, arg2obj, arg3obj, arg4obj, arg5obj, arg6obj);
+       updatePtrFromObject(arg3, arg3obj, env);
+       updatePtrFromObject(arg4, arg4obj, env);
+       updatePtrFromObject(arg5, arg5obj, env);
+       updatePtrFromObject(arg6, arg6obj, env);
+       fprintf(stderr, "leaving get\n");
+               return convCIntToInt(retobj, env);
+}
+
+Traffic_ServiceAPI * provide_facade_traffic(jobject object, 
CoreAPIForApplication * capi) {
+       static Traffic_ServiceAPI api;
+       JNIEnv * env;
+       env = findThread()->env;
+       GNUNET_ASSERT(env != NULL);
+       myObject = (*env)->NewGlobalRef(env, object);
+       api.get = &get;
+       return &api;
+}
+
+void release_facade_traffic() {
+       ActiveThreadList * t;
+       JNIEnv * env;
+       t = findThread();
+       env = t->env;
+       GNUNET_ASSERT(env != NULL);
+       //release java stats service
+       (*env)->DeleteGlobalRef(env, myObject);
+}

Modified: freeway/native/util.c
===================================================================
--- freeway/native/util.c       2007-05-04 06:57:57 UTC (rev 4784)
+++ freeway/native/util.c       2007-05-08 00:05:37 UTC (rev 4785)
@@ -33,6 +33,7 @@
 #include "gettext.h"
 #include "jni.h"
 #include "util.h"
+#include <time.h>
 
 static ModuleList * modules;
 static ActiveThreadList * threads;
@@ -98,10 +99,14 @@
   MUTEX_LOCK(&modulesLock);
   pos = modules;
   while(pos != NULL) {
-    if(pos->prefix == NULL || pos->name == NULL)
+    if(pos->prefix == NULL || pos->name == NULL) {
+      pos = pos->next;
       continue;
-    if(strcmp(prefix, pos->prefix) != 0)
+    }
+    if(strcmp(prefix, pos->prefix) != 0) {
+      pos = pos->next;
       continue;
+    }
     if(strcmp(name, pos->name) == 0)
       break;
     pos = pos->next;
@@ -111,12 +116,16 @@
     MUTEX_UNLOCK(&modulesLock);
     return pos;
   }
-  //Load a new module
-fprintf(stderr, "Loading new dynamic library %s %s\n", prefix, name);
-  temp = loadDynamicLibrary(prefix, name);
-  if(temp == NULL) {
-    MUTEX_UNLOCK(&modulesLock);
-    return NULL;
+  if(strcmp(prefix, "facade") != 0) {
+    //Load a new module
+    fprintf(stderr, "Loading new dynamic library %s %s\n", prefix, name);
+    temp = loadDynamicLibrary(prefix, name);
+    if(temp == NULL) {
+      MUTEX_UNLOCK(&modulesLock);
+      return NULL;
+    }
+  } else {
+    temp = NULL;
   }
   pos = MALLOC(sizeof(ModuleList));
   pos->modulePtr = temp;
@@ -158,27 +167,156 @@
     modules = modules->next;
   }
   MUTEX_UNLOCK(&modulesLock);
-  unloadDynamicLibrary(module->modulePtr);
+  if(module->modulePtr != NULL)
+    unloadDynamicLibrary(module->modulePtr);
   FREE(module->prefix);
   FREE(module->name);
   MUTEX_DESTROY(&module->mutex);
   FREE(module);
 }
 
+#if 0
 /**
+ * get an ActiveThreadList for this thread, using the provided data.
+ * This will overwrite an existing entry for this thread if one exists.
+ * @return the thread entry. contents of thread will match supplied values
+ */
+static ActiveThreadList * _getThread(JNIEnv * env, jobject jcapi) {
+       ActiveThreadList * pos;
+       pos = threads;
+       while(pos != NULL) {
+               if(PTHREAD_SELF_TEST(&pos->thread))
+                       break;
+               pos = pos->next;
+       }
+       if(pos == NULL) {
+               pos = MALLOC(sizeof(ActiveThreadList));
+               PTHREAD_GET_SELF(&pos->thread);
+               pos->regs = 0;
+               pos->next = threads;
+               threads = pos;
+       }
+       pos->lastRet = time(NULL);
+       pos->env = env;
+       pos->jcapi = jcapi;
+       return pos;
+}
+
+/**
+ * get an ActiveThreadList for this thread. Attempt to generate one if none 
exists.
+ * @return the thread entry or null.
+ */
+static ActiveThreadList * _getThread() {
+       ActiveThreadList * pos;
+       pos = threads;
+       while(pos != NULL) {
+               if(PTHREAD_SELF_TEST(&pos->thread))
+                       break;
+               pos = pos->next;
+       }
+       if(pos == NULL) {
+               JNIEnv * env;
+               jobject jcapi;
+               jclass jcapiclass;
+               jfieldID jcapifield;
+               if(jvm == NULL) goto crash;
+               (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+               if(env == NULL) goto crash;
+               jcapiclass = (*env)->FindClass(env, 
"org/gnu/freeway/server/CoreAPI");
+               if(env == NULL) goto crash;
+               jcapifield = (*env)->GetStaticFieldID(env, jcapiclass, "_", 
"Lorg/gnu/freeway/server/CoreAPI;");
+               if(jcapifield == NULL) goto crash;
+               jcapi = (*env)->GetStaticObjectField(env, jcapiclass, 
jcapifield);
+               if(jcapifield == NULL) goto crash;
+               pos = MALLOC(sizeof(ActiveThreadList));
+               PTHREAD_GET_SELF(&pos->thread);
+               pos->env = env;
+               pos->jcapi = jcapi;
+               pos->regs = 0;
+               pos->lastRet = time(NULL);
+               pos->next = threads;
+               threads = pos;
+       }
+       return pos;
+crash:
+       fprintf(stderr, (_("Cannot obtain an env for the new thread!\n")));
+       return NULL;
+}
+#endif
+
+/**
+ * release a reference to the ActiveThreadList entry.
+ */
+static void _releaseThread() {
+       ActiveThreadList * pos = NULL;
+       ActiveThreadList * this = NULL;
+       MUTEX_LOCK(&threadsLock);
+       if(PTHREAD_SELF_TEST(&threads->thread)) {
+               this = threads;
+       } else {
+               pos = threads;
+               while(pos->next != NULL) {
+                       if(PTHREAD_SELF_TEST(&pos->next->thread)) {
+                               this = pos->next;
+                               break;
+                       }
+                       pos = pos->next;
+               }
+       }
+       if(this != NULL) {
+               if(this->regs <= 1) {
+                       if(pos == NULL)
+                               threads = this->next;
+                       else
+                               pos->next = this->next;
+                       MUTEX_UNLOCK(&threadsLock);
+                       PTHREAD_REL_SELF(&this->thread);
+                       this->env = NULL;
+                       this->jcapi = 0;
+                       FREE(this);
+                       return;
+               } else {
+                       this->regs--;
+               }
+       }
+       MUTEX_UNLOCK(&threadsLock);
+}
+
+/**
  * find our thread in ActiveThreadList. Does not check for null or unlock the 
mutex.
  * Consider using findThread instead.
  * @return our thread entry or null.
  */
 static ActiveThreadList * _findThread() {
+       ActiveThreadList * last;
        ActiveThreadList * pos;
        MUTEX_LOCK(&threadsLock);
+       last = NULL;
        pos = threads;
+       time_t cutOff = time(NULL) - 300;
        while(pos != NULL) {
                if(PTHREAD_SELF_TEST(&pos->thread))
                        break;
-               pos = pos->next;
+               //delete old entries
+               if(pos->regs < 1 && pos->lastRet < cutOff) {
+                       if(last == NULL)
+                               threads = pos->next;
+                       else
+                               last->next = pos->next;
+                       last = pos;
+                       pos = pos->next;
+                       //this doesn't look like it will cause problems
+                       PTHREAD_REL_SELF(&last->thread);
+                       last->env = NULL;
+                       last->jcapi = 0;
+                       FREE(last);
+               } else {
+                       last = pos;
+                       pos = pos->next;
+               }
        }
+       if(pos != NULL)
+               pos->lastRet = time(NULL);
        return pos;
 }
 
@@ -197,6 +335,7 @@
                thread->env = env;
                thread->jcapi = jcapi;
                thread->regs = 1;
+               thread->lastRet = time(NULL);
                thread->next = threads;
                threads = thread;
        } else {
@@ -239,6 +378,7 @@
        thread->env = env;
        thread->jcapi = jcapi;
        thread->regs = 0;
+       thread->lastRet = time(NULL);
        thread->next = threads;
        threads = thread;
        MUTEX_UNLOCK(&threadsLock);
@@ -329,7 +469,7 @@
   return (*env)->NewObject(env, classCInt, method, input);
 }
 
-int convCShortToShort(jobject input, JNIEnv * env) {
+short convCShortToShort(jobject input, JNIEnv * env) {
 fprintf(stderr, "in convCShortToShort\n");
   jclass classCShort;
   jmethodID method;
@@ -361,7 +501,7 @@
   return (*env)->NewObject(env, classCShort, method, input);
 }
 
-int convCUIntToUInt(jobject input, JNIEnv * env) {
+unsigned int convCUIntToUInt(jobject input, JNIEnv * env) {
 fprintf(stderr, "in convCUIntToUInt\n");
   jclass classCInt;
   jmethodID method;
@@ -447,8 +587,36 @@
   return po;
 }
 
+void * convObjectToRetPtr(jobject input, JNIEnv * env) {
+fprintf(stderr, "in convObjectToRetPtr\n");
+  jclass objectClass;
+  jmethodID method;
+  jobject jArray;
+  char * array;
+  char * dest;
+  int i, size;
+
+  if(input == NULL)
+    return NULL;
+  objectClass = (*env)->GetObjectClass(env, input);
+  if(objectClass == NULL)
+    return NULL;
+  method = (*env)->GetMethodID(env, objectClass, "serializeToByteArray", 
"()[B");
+  if(method == NULL)
+    return NULL;
+  jArray = (*env)->CallObjectMethod(env, input, method);
+  size = (*env)->GetArrayLength(env, jArray);
+  dest = MALLOC(size);
+  array = (*env)->GetByteArrayElements(env, jArray, NULL);
+  for(i = 0; i < size; i++)
+    dest[i] = array[i];
+  (*env)->ReleaseByteArrayElements(env, jArray, array, 0);
+fprintf(stderr, "leaving convObjectToRetPtr\n");
+  return dest;
+}
+
 jobject convPtrToNewObject(void * input, jclass returnType, JNIEnv * env) {
-fprintf(stderr, "in convPtrToNewObject\n");
+fprintf(stderr, "in convPtrToNewObject %p\n", input);
   jmethodID method;
   jmethodID methodSize;
   jint size;
@@ -464,14 +632,14 @@
   (*env)->ExceptionClear(env);
   object = (*env)->AllocObject(env, returnType);
   if(object == NULL)
-    return;
-  methodSize = (*env)->GetMethodID(env, object, "getSerializedSize", "()I");
-  if(methodSize == NULL)
     return NULL;
+  //methodSize = (*env)->GetMethodID(env, returnType, "getSerializedSize", 
"(V)I");
+  //if(methodSize == NULL)
+  //  return NULL;
   method = (*env)->GetMethodID(env, returnType, "<init>", "([B)V");
   if(method == NULL)
     return NULL;
-  size = (*env)->CallIntMethod(env, object, methodSize);
+  size = sizeof(input); //(*env)->CallIntMethod(env, object, methodSize);
   array = (*env)->NewByteArray(env, size);
   if(array == NULL)
     return NULL;
@@ -513,6 +681,40 @@
   //Constant CWrappers cannot be updated
 }
 
+jobject updatePtrFromObject(void * target, jobject input, JNIEnv * env) {
+  fprintf(stderr, "in updatePtrFromObject %p %p\n", target, input);
+  jclass objectClass;
+  jmethodID method;
+  jobject jArray;
+  char* array;
+  int i, size;
+  
+  if(target == NULL)
+       return;
+  objectClass = (*env)->GetObjectClass(env, input);
+  if(objectClass == NULL)
+    return;
+  method = (*env)->GetMethodID(env, objectClass, "deserializeIntoPointer", 
"(J)V");
+  if(method != NULL) {
+    (*env)->CallVoidMethod(env, input, method, target);
+fprintf(stderr, "leaving updatePtrFromObject\n");
+    return;
+  }
+  (*env)->ExceptionClear(env);
+  method = (*env)->GetMethodID(env, objectClass, "serializeToByteArray", 
"(V)[B");
+  if(method != NULL) {
+    jArray = (*env)->CallObjectMethod(env, input, method);
+    array = (*env)->GetByteArrayElements(env, jArray, NULL);
+    size = (*env)->GetArrayLength(env, jArray);
+    for(i = 0; i < size; i++)
+      ((char*) target)[i] = ((char*) array)[i];
+    (*env)->ReleaseByteArrayElements(env, jArray, array, 0);
+fprintf(stderr, "leaving updatePtrFromObject\n");
+    return;
+  }
+  (*env)->ExceptionClear(env);
+}
+
 jobject convJStringToCString(jstring input, JNIEnv * env) {
 fprintf(stderr, "in convJStringToCString\n");
   jclass classCString;

Modified: freeway/native/util.h
===================================================================
--- freeway/native/util.h       2007-05-04 06:57:57 UTC (rev 4784)
+++ freeway/native/util.h       2007-05-08 00:05:37 UTC (rev 4785)
@@ -27,6 +27,7 @@
 #ifndef HAVE_UTIL_H
 #define HAVE_UTIL_H 1
 #include "jni.h"
+#include <time.h>
 
 #define DSO_PREFIX "libgnunet"
 
@@ -35,11 +36,11 @@
 /**
  * Used to identify which env / jcapi to use when called back.
  */
-//TODO: make a cron task that cleans out ActiveThreadLists that have 0 
regs(created from a C thread) and haven't been retrieved recently.
 typedef struct ActiveThreadList {
   JNIEnv * env;
   jobject jcapi;
   unsigned int regs;
+  time_t lastRet;
   PTHREAD_T thread;
   struct ActiveThreadList * next;
 } ActiveThreadList;
@@ -81,7 +82,7 @@
 
 jobject convIntToCInt(int input, JNIEnv * env);
 
-int convCUIntToUInt(jobject input, JNIEnv * env);
+unsigned int convCUIntToUInt(jobject input, JNIEnv * env);
 
 jobject convUIntToCUInt(unsigned int input, JNIEnv * env);
 

Added: freeway/server.sh
===================================================================
--- freeway/server.sh                           (rev 0)
+++ freeway/server.sh   2007-05-08 00:05:37 UTC (rev 4785)
@@ -0,0 +1,3 @@
+#!/bin/sh
+cd build
+java -Djava.library.path=. -classpath 
freeway.jar:../lib/concurrent.jar:../lib/bcprov-jdk14-124.jar 
org.gnu.freeway.GNUNetDaemon

Modified: freeway/src/org/gnu/freeway/cwrappers/CString.java
===================================================================
--- freeway/src/org/gnu/freeway/cwrappers/CString.java  2007-05-04 06:57:57 UTC 
(rev 4784)
+++ freeway/src/org/gnu/freeway/cwrappers/CString.java  2007-05-08 00:05:37 UTC 
(rev 4785)
@@ -40,6 +40,11 @@
         * @see 
org.gnu.freeway.cwrappers.util.CWrapper#deserializeFromByteArray(byte[])
         */
        public void deserializeFromByteArray(byte[] serializedData) {
+               super.deserializeFromByteArray(serializedData);
+       }
+       
+       public CString(byte[] serializedData) {
+               super("");
                try {
                        value = new String(serializedData, 0, 
getSerializedSize(), "UTF-8");
                } catch(UnsupportedEncodingException e) {

Modified: freeway/src/org/gnu/freeway/cwrappers/ConstCString.java
===================================================================
--- freeway/src/org/gnu/freeway/cwrappers/ConstCString.java     2007-05-04 
06:57:57 UTC (rev 4784)
+++ freeway/src/org/gnu/freeway/cwrappers/ConstCString.java     2007-05-08 
00:05:37 UTC (rev 4785)
@@ -40,6 +40,22 @@
                this.value = value;
        }
        
+       public ConstCString(byte[] value) {
+               deserializeFromByteArray(value);
+       }
+       
+       protected void deserializeFromByteArray(byte[] serializedData) {
+               int i;
+               for(i = 0; i < serializedData.length; i++)
+                       if(serializedData[i] == 0)
+                               break;
+               try {
+                       value = new String(serializedData, 0, i, "UTF-8");
+               } catch(UnsupportedEncodingException e) {
+                       throw new Error(e);
+               }
+       }
+       
        /* (non-Javadoc)
         * @see 
org.gnu.freeway.cwrappers.util.ConstCWrapper#serializeToByteArray()
         */
@@ -61,7 +77,9 @@
         * @see org.gnu.freeway.cwrappers.util.ConstCWrapper#getSerializedSize()
         */
        public int getSerializedSize() {
-               byte[] string = {};
+               if(value.length() == 0)
+                       return 128;
+               byte[] string;
                try {
                        string = value.getBytes("UTF-8");
                } catch(UnsupportedEncodingException e) {

Modified: freeway/src/org/gnu/freeway/cwrappers/util/CWrapper.java
===================================================================
--- freeway/src/org/gnu/freeway/cwrappers/util/CWrapper.java    2007-05-04 
06:57:57 UTC (rev 4784)
+++ freeway/src/org/gnu/freeway/cwrappers/util/CWrapper.java    2007-05-08 
00:05:37 UTC (rev 4785)
@@ -46,5 +46,9 @@
        public static final String[] CTYPES = {"void", "int", "PointerObject 
*", "float", "long long", "double", "short"};
        public static final String[] CARGTYPES = {"void", "int", "void *", 
"float", "long long", "double", "short"};
        
+       public static final String[] C_CONVERT_TO = {null, "convIntToCInt", 
"convPtrToNewObject", "convFloatToCFloat", "convLongToCLong", 
"convDoubleToCDouble", "convShortToCShort"};
+       
+       public static final String[] C_CONVERT_FROM = {null, "convCIntToInt", 
"convObjectToPtr", "convCFloatToFloat", "convCLongToLong", 
"convCDoubleToDouble", "convCShortToShort"};
+       
        public void deserializeFromByteArray(byte[] serializedData);
 }

Modified: freeway/src/org/gnu/freeway/cwrappers/util/SwitchTableGenerator.java
===================================================================
--- freeway/src/org/gnu/freeway/cwrappers/util/SwitchTableGenerator.java        
2007-05-04 06:57:57 UTC (rev 4784)
+++ freeway/src/org/gnu/freeway/cwrappers/util/SwitchTableGenerator.java        
2007-05-08 00:05:37 UTC (rev 4785)
@@ -35,7 +35,11 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
 
+import org.gnu.freeway.server.CPluginLoader;
+
 import org.gnu.freeway.support.javaparser.CompilationUnit;
 import org.gnu.freeway.support.javaparser.JavaParser;
 import org.gnu.freeway.support.javaparser.MethodDeclarator;
@@ -45,9 +49,10 @@
 
 /**
  * @file SwitchTableGenerator.java
- * @brief This class should generate the switch-table.c, switch-table.h and
- *        service.c.* classes by reflecting over the various service interfaces
- *        and generating the appropriate code 
+ * @brief This class should generate the switch-table.c, switch-table.h, Java
+ *        wrappers for C services, and C wrappers for Java services by
+ *        reflecting over and parsing the various service interfaces and
+ *        generating the appropriate code 
  * @author Christian Grothoff
  * @author mdonoughe
  */
@@ -71,6 +76,7 @@
                StringBuffer srcPrefix = new StringBuffer();
                StringBuffer natPrefix = new StringBuffer();
                HashSet functionTypeSet = new HashSet();
+               List facadeList = new ArrayList();
                
                int i;
                
@@ -137,6 +143,16 @@
                                }
                        }
                
+               //create services.c folder
+               if(!nativeCDir.exists())
+                       if(!nativeCDir.mkdirs()) {
+                               try {
+                                       System.err.println("Could not create 
nonexistant native sources folder \"" + nativeCDir.getCanonicalPath() + "\".");
+                               } catch(IOException ee) {
+                                       System.err.println("Could not create 
nonexistant native sources folder \"" + nativeCDir.getAbsolutePath() + "\".");
+                               }
+                       }
+               
                //check for classes folder
                if(!classesDir.exists()) {
                        try {
@@ -273,9 +289,83 @@
                                        e.printStackTrace();
                                }
                        }
+                       
+                       // create empty output files
+                       File outputNativeSource = new File(nativeCDir, 
stripPackage(inputClass.getName()).toLowerCase() + ".c");
+                       try {
+                               if(!outputNativeSource.createNewFile()) {
+                                       if(!outputNativeSource.delete()) {
+                                               try {
+                                                       
System.err.println("Could not delete existing native source file \"" + 
outputNativeSource.getCanonicalPath() + "\".");
+                                               } catch(IOException ee) {
+                                                       
System.err.println("Could not delete existing native source file \"" + 
outputNativeSource.getAbsolutePath() + "\".");
+                                               }
+                                               continue;
+                                       }
+                                       if(!outputNativeSource.createNewFile()) 
{
+                                               try {
+                                                       
System.err.println("Could not create native source file \"" + 
outputNativeSource.getCanonicalPath() + "\".");
+                                               } catch(IOException ee) {
+                                                       
System.err.println("Could not create native source file \"" + 
outputNativeSource.getAbsolutePath() + "\".");
+                                               }
+                                               continue;
+                                       }
+                               }
+                       } catch(Exception e) {
+                               e.printStackTrace();
+                               try {
+                                       System.err.println("Could not create 
native source file \"" + outputNativeSource.getCanonicalPath() + "\".");
+                               } catch(IOException ee) {
+                                       System.err.println("Could not create 
native source file \"" + outputNativeSource.getAbsolutePath() + "\".");
+                               }
+                               continue;
+                       }
+                       
+                       //get a writer
+                       BufferedWriter outputNativeSourceWriter = null;
+                       try {
+                               outputNativeSourceWriter = new 
BufferedWriter(new FileWriter(outputNativeSource));
+                       } catch(IOException e) {
+                               e.printStackTrace();
+                               try {
+                                       System.err.println("Could not open 
native source file \"" + outputNativeSource.getCanonicalPath() + "\".");
+                               } catch(IOException ee) {
+                                       System.err.println("Could not open 
native source file \"" + outputNativeSource.getAbsolutePath() + "\".");
+                               }
+                               continue;
+                       }
+                       
+                       //write code
+                       try {
+                               cWrapClass(inputClass, 
outputNativeSourceWriter, methodList);
+                       } catch(IOException e) {
+                               e.printStackTrace();
+                               try {
+                                       System.err.println("Could not write 
native source file \"" + outputNativeSource.getCanonicalPath() + "\".");
+                               } catch(IOException ee) {
+                                       System.err.println("Could not write 
native source file \"" + outputNativeSource.getAbsolutePath() + "\".");
+                               }
+                               continue;
+                       } catch(IllegalArgumentException e) {
+                               System.err.println(inputClass.getName() + " is 
not an interface.");
+                       } finally {
+                               try {
+                                       outputNativeSourceWriter.flush();
+                               } catch(IOException e) {
+                                       e.printStackTrace();
+                               }
+                               try {
+                                       outputNativeSourceWriter.close();
+                               } catch(IOException e) {
+                                       e.printStackTrace();
+                               }
+                       }
+                       
+                       //add the service to the list
+                       
facadeList.add(CPluginLoader.getServiceName(inputClass));
                }
                
-               //begin working on the C side
+               //begin working on the C switch table
                //create native folder
                if(!nativeCDir.exists())
                        if(!nativeCDir.mkdirs()) {
@@ -402,20 +492,121 @@
                                e.printStackTrace();
                        }
                }
+               
+               //begin working on builtin.h
+               //create empty builtin.h
+               File builtinHFile = new File(nativeCDir, "builtin.h");
+               try {
+                       if(!builtinHFile.createNewFile()) {
+                               if(!builtinHFile.delete()) {
+                                       try {
+                                               System.err.println("Could not 
delete existing native file \"" + builtinHFile.getCanonicalPath() + "\".");
+                                       } catch(IOException ee) {
+                                               System.err.println("Could not 
delete existing native file \"" + builtinHFile.getAbsolutePath() + "\".");
+                                       }
+                                       return;
+                               }
+                               if(!builtinHFile.createNewFile()) {
+                                       try {
+                                               System.err.println("Could not 
create native file \"" + builtinHFile.getCanonicalPath() + "\".");
+                                       } catch(IOException ee) {
+                                               System.err.println("Could not 
create native file \"" + builtinHFile.getAbsolutePath() + "\".");
+                                       }
+                                       return;
+                               }
+                       }
+               } catch(Exception e) {
+                       e.printStackTrace();
+                       try {
+                               System.err.println("Could not create native 
file \"" + builtinHFile.getCanonicalPath() + "\".");
+                       } catch(IOException ee) {
+                               System.err.println("Could not create native 
file \"" + builtinHFile.getAbsolutePath() + "\".");
+                       }
+                       return;
+               }
+               //get writer
+               BufferedWriter builtinHWriter = null;
+               try {
+                       builtinHWriter = new BufferedWriter(new 
FileWriter(builtinHFile));
+               } catch(IOException e) {
+                       e.printStackTrace();
+                       try {
+                               System.err.println("Could not open native file 
\"" + builtinHFile.getCanonicalPath() + "\".");
+                       } catch(IOException ee) {
+                               System.err.println("Could not open native file 
\"" + builtinHFile.getAbsolutePath() + "\".");
+                       }
+                       return;
+               }
+               //write code
+               try {
+                       writeBuiltin(builtinHWriter, facadeList);
+               } catch(IOException e) {
+                       e.printStackTrace();
+                       System.err.println("Could not write builtin.h.");
+                       return;
+               } finally {
+                       try {
+                               builtinHWriter.flush();
+                       } catch(IOException e) {
+                               e.printStackTrace();
+                       }
+                       try {
+                               builtinHWriter.close();
+                       } catch(IOException e) {
+                               e.printStackTrace();
+                       }
+               }
        }
        
-       public static void writeSwitchTable(Writer writerC, Writer writerH, 
HashSet functionTypeSet) throws IOException {
+       public static void writeBuiltin(Writer writer, List facadeList) throws 
IOException {
+               System.err.println("Writing builtin.h");
+               writer.write("// This file was autogenerated by 
SwitchTableGenerator\n");
+               for(int i = 0; i < facadeList.size(); i++)
+                       writer.write("#include <GNUnet/gnunet_" + ((String) 
facadeList.get(i)).toLowerCase() + "_service.h>\n");
+               writer.write("\n// method pointers to internal services\n");
+               writer.write("typedef void * (*FacadeInitMethod)(jobject 
object, CoreAPIForApplication * capi);\n");
+               writer.write("typedef void (*FacadeDoneMethod)();\n");
+               for(int i = 0; i < facadeList.size(); i++) {
+                       writer.write(facadeList.get(i) + "_ServiceAPI * 
provide_facade_" + ((String) facadeList.get(i)).toLowerCase() + "(jobject, 
CoreAPIForApplication *);\n");
+                       writer.write("void release_facade_" + ((String) 
facadeList.get(i)).toLowerCase() + "();\n");
+               }
+               writer.write("const int facadeCount = " + facadeList.size() + 
";\n");
+               writer.write("const char* facadeNames[] = {");
+               for(int i = 0; i < facadeList.size(); i++) {
+                       if(i > 0)
+                               writer.write(",");
+                       writer.write("\n        \"" + ((String) 
facadeList.get(i)).toLowerCase() + "\"");
+               }
+               writer.write("\n};\n");
+               writer.write("const ServiceInitMethod facadeInitPointers[] = 
{");
+               for(int i = 0; i < facadeList.size(); i++) {
+                       if(i > 0)
+                               writer.write(",");
+                       writer.write("\n        (FacadeInitMethod) 
&provide_facade_" + ((String) facadeList.get(i)).toLowerCase());
+               }
+               writer.write("\n};\n");
+               writer.write("ServiceDoneMethod facadeReleasePointers[] = {");
+               for(int i = 0; i < facadeList.size(); i++) {
+                       if(i > 0)
+                               writer.write(",");
+                       writer.write("\n        (FacadeDoneMethod) 
&release_facade_" + ((String) facadeList.get(i)).toLowerCase());
+               }
+               writer.write("\n};\n");
+       }
+       
+       public static void writeSwitchTable(Writer writerC, Writer writerH, Set 
functionTypeSet) throws IOException {
                System.err.println("Writing the switch table");
+               writerH.write("// This file was autogenerated by 
SwitchTableGenerator\n");
+               writerH.write("#include \"jni.h\"\n");
                writerC.write("// This file was autogenerated by 
SwitchTableGenerator\n");
-               writerH.write("// This file was autogenerated by 
SwitchTableGenerator\n");
                writerC.write("jobject * jargs;\n");
                writerC.write("int jargLength = (*env)->GetArrayLength(env, 
arguments);\n");
                writerC.write("if(jargLength > 0) {\n");
-               writerC.write("  jargs = malloc(sizeof(jobject) * 
jargLength);\n");
-               writerC.write("  int jargsI;\n");
-               writerC.write("  for(jargsI = 0; jargsI < jargLength; jargsI++) 
{\n");
-               writerC.write("    jargs[jargsI] = 
(*env)->GetObjectArrayElement(env, arguments, jargsI);\n");
-               writerC.write("  }\n");
+               writerC.write(" jargs = malloc(sizeof(jobject) * 
jargLength);\n");
+               writerC.write(" int jargsI;\n");
+               writerC.write(" for(jargsI = 0; jargsI < jargLength; jargsI++) 
{\n");
+               writerC.write("         jargs[jargsI] = 
(*env)->GetObjectArrayElement(env, arguments, jargsI);\n");
+               writerC.write(" }\n");
                writerC.write("}\n");
                writerC.write("switch (functionType) {\n");
                for(Iterator i = functionTypeSet.iterator(); i.hasNext(); ) {
@@ -423,18 +614,18 @@
                        writeSwitch(functionType.intValue(), writerC);
                        writeFunctionTypeDefine(functionType.intValue(), 
writerH);
                }
-               writerC.write("  default:\n");
-               writerC.write("    GNUNET_ASSERT(0);\n");
+               writerC.write(" default:\n");
+               writerC.write("         GNUNET_ASSERT(0);\n");
                writerC.write("}\n");
                writerC.write("if(jargs != NULL)\n");
-               writerC.write("  free(jargs);\n");
+               writerC.write(" free(jargs);\n");
        }
        
        public static void writeSwitch(int functionType, Writer writer)  throws 
IOException {
                int returnType = functionType % CWrapper.MAX_KIND;
-               StringBuffer preBuffer = new StringBuffer("  case " + 
functionType + ": {\n");
-               StringBuffer callBuffer = new StringBuffer("    ((FunctionType" 
+ functionType + ") ((void**)m->moduleFptrStruct)[functionOffset])(");
-               StringBuffer postBuffer = new StringBuffer("    break;\n  }\n");
+               StringBuffer preBuffer = new StringBuffer("     case " + 
functionType + ": {\n");
+               StringBuffer callBuffer = new StringBuffer("            
((FunctionType" + functionType + ") 
((void**)m->moduleFptrStruct)[functionOffset])(");
+               StringBuffer postBuffer = new StringBuffer("            
break;\n  }\n");
                functionType = (functionType - returnType) / CWrapper.MAX_KIND;
                //a - the current position(base MAX_KIND)
                //maxA - the initial value of a(puts the arguments in order)
@@ -442,10 +633,10 @@
                int a = (int) Math.max(Math.floor(Math.log(functionType) / 
Math.log(CWrapper.MAX_KIND)), -1);
                int maxA = a;
                if(returnType == CWrapper.PTR_KIND) {
-                       preBuffer.append("    jclass returnClass = (jclass) 
jargs[" + (a + 1) + "];\n");
+                       preBuffer.append("              jclass returnClass = 
(jclass) jargs[" + (a + 1) + "];\n");
                }
                if(returnType != CWrapper.VOID_KIND) {
-                       callBuffer.insert(4, CWrapper.CTYPES[returnType] + " 
cret = ");
+                       callBuffer.insert(2, CWrapper.CTYPES[returnType] + " 
cret = ");
                        postBuffer.insert(0, 
writeCTypeToJTypeReturn(returnType));
                }
                while(a >= 0) {
@@ -471,57 +662,76 @@
                if(returnType == CWrapper.VOID_KIND)
                        return "";
                else if(returnType == CWrapper.INT_KIND)
-                       return "    oret = convIntToCInt(cret, env);\n";
+                       return "                oret = convIntToCInt(cret, 
env);\n";
                else if(returnType == CWrapper.PTR_KIND)
-                       return "    oret = convPtrToNewObject(cret, 
returnClass, env);\n";
+                       return "                oret = convPtrToNewObject(cret, 
returnClass, env);\n";
                else if(returnType == CWrapper.FLT_KIND)
-                       return "    oret = convFloatToCFloat(cret, env);\n";
+                       return "                oret = convFloatToCFloat(cret, 
env);\n";
                else if(returnType == CWrapper.LINT_KIND)
-                       return "    oret = convLongToCLong(cret, env);\n";
+                       return "                oret = convLongToCLong(cret, 
env);\n";
                else if(returnType == CWrapper.DBLE_KIND)
-                       return "    oret = convDoubleToCDouble(cret, env);\n";
+                       return "                oret = 
convDoubleToCDouble(cret, env);\n";
                else if(returnType == CWrapper.SHRT_KIND)
-                       return "    oret = convShortToCShort(cret, env);\n";
+                       return "                oret = convShortToCShort(cret, 
env);\n";
                else
-                       return "    //TODO: return cret " + returnType + "\n";
+                       return "                //TODO: return cret " + 
returnType + "\n";
        }
        
+       public static String writeJTypeToCTypeReturn(int returnType) {
+               if(returnType == CWrapper.VOID_KIND)
+                       return "";
+               else if(returnType == CWrapper.INT_KIND)
+                       return "                return convCIntToInt(retobj, 
env);\n";
+               else if(returnType == CWrapper.PTR_KIND)
+                       return "                return 
convObjectToRetPtr(retobj, env);\n";
+               else if(returnType == CWrapper.FLT_KIND)
+                       return "                return 
convCFloatToFloat(retobj, env);\n";
+               else if(returnType == CWrapper.LINT_KIND)
+                       return "                return convCLongToLong(retobj, 
env);\n";
+               else if(returnType == CWrapper.DBLE_KIND)
+                       return "                return 
convCDoubleToDouble(retobj, env);\n";
+               else if(returnType == CWrapper.SHRT_KIND)
+                       return "                return 
convCShortToShort(retobj, env);\n";
+               else
+                       return "                //TODO: return retobj " + 
returnType + "\n";
+       }
+       
        public static String writeCTypeToJType(int returnType, int argnumber) {
                if(returnType == CWrapper.VOID_KIND)
                        return "";
                else if(returnType == CWrapper.INT_KIND)
-                       return "    jargs[" + argnumber + "] = 
convIntToCInt(carg" + argnumber + ", env);\n";
+                       return "                jargs[" + argnumber + "] = 
convIntToCInt(carg" + argnumber + ", env);\n";
                else if(returnType == CWrapper.PTR_KIND)
-                       return "    updateObjectFromPtr(jargs[" + argnumber + 
"], carg" + argnumber + ", env);\n";
+                       return "                updateObjectFromPtr(jargs[" + 
argnumber + "], carg" + argnumber + ", env);\n";
                else if(returnType == CWrapper.FLT_KIND)
-                       return "    jargs[" + argnumber + "] = 
convFloatToCFloat(carg" + argnumber + ", env);\n";
+                       return "                jargs[" + argnumber + "] = 
convFloatToCFloat(carg" + argnumber + ", env);\n";
                else if(returnType == CWrapper.LINT_KIND)
-                       return "    jargs[" + argnumber + "] = 
convLongToCLong(carg" + argnumber + ", env);\n";
+                       return "                jargs[" + argnumber + "] = 
convLongToCLong(carg" + argnumber + ", env);\n";
                else if(returnType == CWrapper.DBLE_KIND)
-                       return "    jargs[" + argnumber + "] = 
convDoubleToCDouble(carg" + argnumber + ", env);\n";
+                       return "                jargs[" + argnumber + "] = 
convDoubleToCDouble(carg" + argnumber + ", env);\n";
                else if(returnType == CWrapper.SHRT_KIND)
-                       return "    jargs[" + argnumber + "] = 
convShortToCShort(carg" + argnumber + ", env);\n";
+                       return "                jargs[" + argnumber + "] = 
convShortToCShort(carg" + argnumber + ", env);\n";
                else
-                       return "    //TODO: carg" + argnumber + " -> jarg" + 
argnumber + " " + returnType + "\n";
+                       return "                //TODO: carg" + argnumber + " 
-> jarg" + argnumber + " " + returnType + "\n";
        }
        
        public static String writeJTypeToCType(int returnType, int argnumber) {
                if(returnType == CWrapper.VOID_KIND)
                        return "";
                else if(returnType == CWrapper.INT_KIND)
-                       return "    " + CWrapper.CTYPES[returnType] + " carg" + 
argnumber + " = convCIntToInt(jargs[" + argnumber + "], env);\n";
+                       return "                " + CWrapper.CTYPES[returnType] 
+ " carg" + argnumber + " = convCIntToInt(jargs[" + argnumber + "], env);\n";
                else if(returnType == CWrapper.PTR_KIND)
-                       return "    " + CWrapper.CTYPES[returnType] + " carg" + 
argnumber + " = convObjectToPtr(jargs[" + argnumber + "], env);\n";
+                       return "                " + CWrapper.CTYPES[returnType] 
+ " carg" + argnumber + " = convObjectToPtr(jargs[" + argnumber + "], env);\n";
                else if(returnType == CWrapper.FLT_KIND)
-                       return "    " + CWrapper.CTYPES[returnType] + " carg" + 
argnumber + " = convCFloatToFloat(jargs[" + argnumber + "], env);\n";
+                       return "                " + CWrapper.CTYPES[returnType] 
+ " carg" + argnumber + " = convCFloatToFloat(jargs[" + argnumber + "], 
env);\n";
                else if(returnType == CWrapper.LINT_KIND)
-                       return "    " + CWrapper.CTYPES[returnType] + " carg" + 
argnumber + " = convCLongToLong(jargs[" + argnumber + "], env);\n";
+                       return "                " + CWrapper.CTYPES[returnType] 
+ " carg" + argnumber + " = convCLongToLong(jargs[" + argnumber + "], env);\n";
                else if(returnType == CWrapper.DBLE_KIND)
-                       return "    " + CWrapper.CTYPES[returnType] + " carg" + 
argnumber + " = convCDoubleToDouble(jargs[" + argnumber + "], env);\n";
+                       return "                " + CWrapper.CTYPES[returnType] 
+ " carg" + argnumber + " = convCDoubleToDouble(jargs[" + argnumber + "], 
env);\n";
                else if(returnType == CWrapper.SHRT_KIND)
-                       return "    " + CWrapper.CTYPES[returnType] + " carg" + 
argnumber + " = convCShortToShort(jargs[" + argnumber + "], env);\n";
+                       return "                " + CWrapper.CTYPES[returnType] 
+ " carg" + argnumber + " = convCShortToShort(jargs[" + argnumber + "], 
env);\n";
                else
-                       return "    //TODO: jargs[" + argnumber + "] -> carg" + 
argnumber + " " + returnType + "\n";
+                       return "                //TODO: jargs[" + argnumber + 
"] -> carg" + argnumber + " " + returnType + "\n";
        }
        
        public static void writeFunctionTypeDefine(int functionType, Writer 
writer) throws IOException {
@@ -586,7 +796,7 @@
                        
if(!"void".equals(methods[i].getReturnType().getName())) {
                                buffer.append("return (" + 
cleanClassName(methods[i].getReturnType().getName(), imports) + ") ");
                                if(getArgumentType(methods[i].getReturnType()) 
== CWrapper.PTR_KIND) {
-                                       if(j > 0)
+                                       if(j > 0) // if there are already 
objects in the array
                                                arrayBuffer.append(", ");
                                        
arrayBuffer.append(cleanClassName(methods[i].getReturnType().getName(), 
imports) + ".class");
                                }
@@ -623,6 +833,141 @@
                writer.write("}\n");
        }
        
+       public static void cWrapClass(Class c, Writer writer, ArrayList order) 
throws IOException, IllegalArgumentException {
+               if(!c.isInterface()) {
+                       throw new IllegalArgumentException();
+               }
+               System.err.println("Wrapping " + c.getName() + " with C");
+               
+               Method[] methods = c.getMethods();
+               
+               writer.write("// This file was autogenerated by 
SwitchTableGenerator\n");
+               writer.write("#include <config.h>\n");
+               writer.write("#include <stdio.h>\n");
+               writer.write("#include <GNUnet/gnunet_util.h>\n");
+               writer.write("#include <GNUnet/gnunet_core.h>\n");
+               writer.write("#include <GNUnet/gnunet_" + 
CPluginLoader.getServiceName(c).toLowerCase() + "_service.h>\n");
+               writer.write("#include <locale.h>\n");
+               writer.write("#include \"gettext.h\"\n");
+               writer.write("#include \"jni.h\"\n");
+               writer.write("#include \"util.h\"\n");
+               writer.write("#include \"switch-table.h\"\n");
+               writer.write("#include \"core.h\"\n");
+               writer.write("\n");
+               writer.write("static jobject myObject;\n");
+               writer.write("\n");
+               
+               // write every method to the buffer
+               for(int i = 0; i < methods.length; i++) {
+                       Iterator temp = null;
+                       String tempStr = null;
+                       for(temp = order.iterator(); temp.hasNext(); tempStr = 
(String) temp.next())
+                               if(methods[i].getName().equals(tempStr))
+                                       break;
+                       if(!methods[i].getName().equals(tempStr))
+                               continue;
+                       writer.write("static " + 
CWrapper.CARGTYPES[getArgumentType(methods[i].getReturnType())] + " " + 
methods[i].getName() + "(");
+                       Class[] argTypes = methods[i].getParameterTypes();
+                       int j;
+                       // add every argument to the arguments list
+                       for(j = 0; j < argTypes.length; j++) {
+                               if(j > 0) {
+                                       writer.write(", ");
+                               }
+                               
writer.write(CWrapper.CARGTYPES[getArgumentType(argTypes[j])] + " arg" + j);
+                       }
+                       writer.write(") {\n");
+                       writer.write("  fprintf(stderr, \"in " + 
methods[i].getName() + "\\n\");\n");
+                       writer.write("  ActiveThreadList * t;\n");
+                       writer.write("  jmethodID method;\n");
+                       writer.write("  jclass clazz;\n");
+                       writer.write("  JNIEnv * env;\n");
+                       for(j = 0; j < argTypes.length; j++) {
+                               writer.write("  jobject arg" + j + "obj;\n");
+                       }
+                       writer.write("  jobject retobj;\n");
+                       writer.write("\n");
+                       writer.write("  t = findThread();\n");
+                       writer.write("  env = t->env;\n");
+                       writer.write("  GNUNET_ASSERT(env != NULL);\n");
+                       writer.write("  clazz = (*env)->GetObjectClass(env, 
myObject);\n");
+                       writer.write("  GNUNET_ASSERT(clazz != 0);\n");
+                       writer.write("  method = (*env)->GetMethodID(env, 
clazz, \"" + methods[i].getName() + "\", \"(");
+                       for(j = 0; j < argTypes.length; j++) {
+                               writer.write("L" + 
argTypes[j].getCanonicalName().replaceAll("\\.", "/") + ";");
+                       }
+                       writer.write(")");
+                       
if(!"void".equals(methods[i].getReturnType().getName())) {
+                               writer.write("L" + 
methods[i].getReturnType().getCanonicalName().replaceAll("\\.", "/") + ";");
+                       } else {
+                               writer.write("V");
+                       }
+                       writer.write("\");\n");
+                       writer.write("  GNUNET_ASSERT(method != 0);\n");
+                       
+                       for(j = 0; j < argTypes.length; j++) {
+                               if(getArgumentType(argTypes[j]) == 
CWrapper.PTR_KIND) 
+                                       writer.write("  arg" + j + "obj = " + 
CWrapper.C_CONVERT_TO[getArgumentType(argTypes[j])] + "(arg" + j + ", 
(*env)->FindClass(env, \"" + argTypes[j].getCanonicalName().replaceAll("\\.", 
"/") + "\"), env);\n");
+                               else
+                                       writer.write("  arg" + j + "obj = " + 
CWrapper.C_CONVERT_TO[getArgumentType(argTypes[j])] + "(arg" + j + ", env);\n");
+                               //writer.write("        //convert arg" + j + " 
to arg" + j + "obj\n");
+                       }
+                       
+                       writer.write("  fprintf(stderr, \"calling Java from " + 
methods[i].getName() + "\\n\");\n");
+                       
if(!"void".equals(methods[i].getReturnType().getName())) {
+                               writer.write("  retobj = 
(*env)->CallObjectMethod(env, myObject, method");
+                       } else {
+                               writer.write("  (*env)->CallVoidMethod(env, 
myObject, method");
+                       }
+                       for(j = 0; j < argTypes.length; j++) {
+                               writer.write(", ");
+                               writer.write("arg" + j + "obj");
+                       }
+                       writer.write(");\n");
+                       for(j = 0; j < argTypes.length; j++) {
+                               if(getArgumentType(argTypes[j]) == 
CWrapper.PTR_KIND)
+                                       writer.write("  
updatePtrFromObject(arg" + j + ", arg" + j + "obj, env);\n");
+                       }
+                       writer.write("  fprintf(stderr, \"leaving " + 
methods[i].getName() + "\\n\");\n");
+                       
if(!"void".equals(methods[i].getReturnType().getName())) {
+                               
writer.write(writeJTypeToCTypeReturn(getArgumentType(methods[i].getReturnType())));
+                       }
+                       writer.write("}\n");
+               }
+               
+               writer.write("\n");
+               writer.write(CPluginLoader.getServiceName(c) + "_ServiceAPI * 
provide_facade_" + CPluginLoader.getServiceName(c).toLowerCase() + "(jobject 
object, CoreAPIForApplication * capi) {\n");
+               writer.write("  static " + CPluginLoader.getServiceName(c) + 
"_ServiceAPI api;\n");
+               writer.write("  JNIEnv * env;\n");
+               writer.write("  env = findThread()->env;\n");
+               writer.write("  GNUNET_ASSERT(env != NULL);\n");
+               writer.write("  myObject = (*env)->NewGlobalRef(env, 
object);\n");
+               
+               for(int i = 0; i < methods.length; i++) {
+                       Iterator temp = null;
+                       String tempStr = null;
+                       for(temp = order.iterator(); temp.hasNext(); tempStr = 
(String) temp.next())
+                               if(methods[i].getName().equals(tempStr))
+                                       break;
+                       if(!methods[i].getName().equals(tempStr))
+                               continue;
+                       writer.write("  api." + methods[i].getName() + " = &" + 
methods[i].getName() + ";\n");
+               }
+               
+               writer.write("  return &api;\n");
+               writer.write("}\n");
+               writer.write("\n");
+               writer.write("void release_facade_" + 
CPluginLoader.getServiceName(c).toLowerCase() + "() {\n");
+               writer.write("  ActiveThreadList * t;\n");
+               writer.write("  JNIEnv * env;\n");
+               writer.write("  t = findThread();\n");
+               writer.write("  env = t->env;\n");
+               writer.write("  GNUNET_ASSERT(env != NULL);\n");
+               writer.write("  //release java stats service\n");
+               writer.write("  (*env)->DeleteGlobalRef(env, myObject);\n");
+               writer.write("}\n");
+       }
+       
        public static String cleanClassName(String input, HashMap importMap) {
                int lastDot = input.lastIndexOf(".");
                if(lastDot <= 1)
@@ -631,8 +976,10 @@
                String nameEnd = input.substring(lastDot + 1);
                if("java.lang".equals(nameStart))
                        return nameEnd; // already included
-               if(importMap == null || importMap.containsKey(nameEnd)) {
-                       if(importMap == null || input.equals((String) 
importMap.get(nameEnd)))
+               if(importMap == null)
+                       return nameEnd;
+               if(importMap.containsKey(nameEnd)) {
+                       if(input.equals((String) importMap.get(nameEnd)))
                                return nameEnd; // already imported or we have 
no list of imported classes
                        else
                                return input; // another class with the same 
name has already been imported
@@ -653,8 +1000,12 @@
        public static int getFunctionType(Method m) {
                Class[] args = m.getParameterTypes();
                int ret = 0;
-               for (int i=0;i<args.length;i++)
-                       ret = ret * CWrapper.MAX_KIND + 
getArgumentType(args[i]);
+               int temp = 0;
+               for (int i=0;i<args.length;i++) {
+                       temp = getArgumentType(args[i]);
+                       System.err.println("argument type " + temp + " is " + 
Math.max(1, (int) Math.floor(Math.log(temp + 1) / Math.log(CWrapper.MAX_KIND - 
1))) + " wide");
+                       ret = ret * CWrapper.MAX_KIND * Math.max(1, (int) 
Math.floor(Math.log(temp + 1) / Math.log(CWrapper.MAX_KIND - 1))) + temp;
+               }
                return ret * CWrapper.MAX_KIND + 
getArgumentType(m.getReturnType());
        }
        

Modified: freeway/src/org/gnu/freeway/server/CPluginLoader.java
===================================================================
--- freeway/src/org/gnu/freeway/server/CPluginLoader.java       2007-05-04 
06:57:57 UTC (rev 4784)
+++ freeway/src/org/gnu/freeway/server/CPluginLoader.java       2007-05-08 
00:05:37 UTC (rev 4785)
@@ -123,6 +123,8 @@
        private static native int cCallBufferFillCallback(CoreAPI capi, long 
fptr, byte[] receiver, byte[] buf, int size);
        private static native void cCallClientExitHandler(CoreAPI capi, long 
handle, CSSession client);
        private static native void cSetIdentity(CoreAPI capi);
+       private static native long cLoadFacade(Object obj, String name, CoreAPI 
capi);
+       private static native void cUnloadFacade(long modulePtr, CoreAPI capi);
 
        /**
         * This method is used by the generated "services.impl"
@@ -268,10 +270,21 @@
         * @param the Java class
         * @return a Handle to the facade
         */
-       public Handle getFacade(Object c) {
-               //TODO: not implemented
-               return Handle.NULL;
+       public Handle getFacade(Object o) {
+               Handle handle = new Handle(cLoadFacade(o, 
getServiceName(o.getClass()).toLowerCase(), CoreAPI._));
+               //System.out.println("loaded " + handle + " from C for " + 
getServiceName(o.getClass()).toLowerCase());
+               return handle;
        }
+       
+       /**
+        * Unloads C facade for a Java service.
+        * @param the Java class
+        * @return a Handle to the facade
+        */
+       public void unloadFacade(Handle h) {
+               cUnloadFacade(h._, CoreAPI._);
+               //System.out.println("unloaded " + handle + " from C for " + 
getServiceName(o.getClass()).toLowerCase());
+       }
 
        public static final class Handle {
                public static final Handle NULL = new Handle(0);
@@ -280,9 +293,19 @@
                Handle(long value) {
                        _ = value;
                }
+               
+               public String toString() {
+                       return new String("Handle: " + _);
+               }
        }
+       
+       public static String getServiceName(Class c) {
+               String r = c.getSimpleName();
+               if(r.endsWith("Service"))
+                       r = r.substring(0, r.length() - 7);
+               return r;
+       }
 
-
        public boolean callCSHandle(Handle handle, CSSession session, 
CSNativeMessage message) {
                return CoreAPI.OK.getValue() == cCallCSHandle(CoreAPI._, 
handle._, session, message.arr);
        }

Modified: freeway/src/org/gnu/freeway/server/CoreAPI.java
===================================================================
--- freeway/src/org/gnu/freeway/server/CoreAPI.java     2007-05-04 06:57:57 UTC 
(rev 4784)
+++ freeway/src/org/gnu/freeway/server/CoreAPI.java     2007-05-08 00:05:37 UTC 
(rev 4785)
@@ -90,12 +90,18 @@
                return 
serviceCore.getApplication().getPreferences().getString(section, option, null);
        }
        
+       private String capitalizeServiceName(String name) {
+               if(name.equals("sqstore"))
+                       return "SQstore";
+               return name.substring(0, 1).toUpperCase() + name.substring(1);
+       }
+       
        public CPluginLoader.Handle requestService(CString iname) {
                Class c = null;
                try {
-                       c = Class.forName("org.gnu.freeway.services." + 
iname.getValue().substring(0, 1).toUpperCase() + iname.getValue().substring(1) 
+ "Service");
+                       c = Class.forName("org.gnu.freeway.services." + 
capitalizeServiceName(iname.getValue()) + "Service");
                } catch (ClassNotFoundException e) {
-                       System.err.println("org.gnu.freeway.services." + 
iname.getValue().substring(0, 1).toUpperCase() + iname.getValue().substring(1) 
+ "Service was not found");
+                       System.err.println("org.gnu.freeway.services." + 
capitalizeServiceName(iname.getValue()) + "Service was not found");
                        return CPluginLoader.Handle.NULL;
                }
                if(!NativeService.class.isAssignableFrom(c)) {

Modified: freeway/src/org/gnu/freeway/services/SqstoreService.java
===================================================================
--- freeway/src/org/gnu/freeway/services/SqstoreService.java    2007-05-04 
06:57:57 UTC (rev 4784)
+++ freeway/src/org/gnu/freeway/services/SqstoreService.java    2007-05-08 
00:05:37 UTC (rev 4785)
@@ -31,7 +31,7 @@
  * @brief 
  * @author mdonoughe
  */
-public interface SqstoreService extends NativeService {
+public interface SQstoreService extends NativeService {
        public CLong getSize();
 
        public CInt put(CHashCode512 key, CDatastoreValue value);

Modified: freeway/src/org/gnu/freeway/services/c/DatastoreService.java
===================================================================
--- freeway/src/org/gnu/freeway/services/c/DatastoreService.java        
2007-05-04 06:57:57 UTC (rev 4784)
+++ freeway/src/org/gnu/freeway/services/c/DatastoreService.java        
2007-05-08 00:05:37 UTC (rev 4785)
@@ -1,13 +1,13 @@
 // This class was autogenerated by SwitchTableGenerator
 package org.gnu.freeway.services.c;
 
+import org.gnu.freeway.cwrappers.ConstCHashCode512;
+import org.gnu.freeway.server.CPluginLoader;
+import org.gnu.freeway.util.AbstractNativeService;
+import org.gnu.freeway.cwrappers.CInt;
 import org.gnu.freeway.util.NativeService;
-import org.gnu.freeway.cwrappers.CInt;
+import org.gnu.freeway.cwrappers.ConstCDatastoreValue;
 import org.gnu.freeway.cwrappers.CLong;
-import org.gnu.freeway.util.AbstractNativeService;
-import org.gnu.freeway.cwrappers.ConstCHashCode512;
-import org.gnu.freeway.cwrappers.ConstCDatastoreValue;
-import org.gnu.freeway.server.CPluginLoader;
 
 public class DatastoreService extends AbstractNativeService implements 
NativeService, org.gnu.freeway.services.DatastoreService {
 

Modified: freeway/src/org/gnu/freeway/services/c/IdentityService.java
===================================================================
--- freeway/src/org/gnu/freeway/services/c/IdentityService.java 2007-05-04 
06:57:57 UTC (rev 4784)
+++ freeway/src/org/gnu/freeway/services/c/IdentityService.java 2007-05-08 
00:05:37 UTC (rev 4785)
@@ -1,9 +1,9 @@
 // This class was autogenerated by SwitchTableGenerator
 package org.gnu.freeway.services.c;
 
+import org.gnu.freeway.server.CPluginLoader;
+import org.gnu.freeway.util.AbstractNativeService;
 import org.gnu.freeway.util.NativeService;
-import org.gnu.freeway.util.AbstractNativeService;
-import org.gnu.freeway.server.CPluginLoader;
 
 public class IdentityService extends AbstractNativeService implements 
NativeService, org.gnu.freeway.services.IdentityService {
 

Modified: freeway/src/org/gnu/freeway/services/c/SqstoreService.java
===================================================================
--- freeway/src/org/gnu/freeway/services/c/SqstoreService.java  2007-05-04 
06:57:57 UTC (rev 4784)
+++ freeway/src/org/gnu/freeway/services/c/SqstoreService.java  2007-05-08 
00:05:37 UTC (rev 4785)
@@ -1,15 +1,15 @@
 // This class was autogenerated by SwitchTableGenerator
 package org.gnu.freeway.services.c;
 
-import org.gnu.freeway.util.NativeService;
-import org.gnu.freeway.cwrappers.CInt;
 import org.gnu.freeway.cwrappers.CDatastoreValue;
-import org.gnu.freeway.cwrappers.CLong;
 import org.gnu.freeway.cwrappers.CHashCode512;
+import org.gnu.freeway.server.CPluginLoader;
 import org.gnu.freeway.util.AbstractNativeService;
-import org.gnu.freeway.server.CPluginLoader;
+import org.gnu.freeway.cwrappers.CInt;
+import org.gnu.freeway.util.NativeService;
+import org.gnu.freeway.cwrappers.CLong;
 
-public class SqstoreService extends AbstractNativeService implements 
NativeService, org.gnu.freeway.services.SqstoreService {
+public class SQstoreService extends AbstractNativeService implements 
NativeService, org.gnu.freeway.services.SQstoreService {
 
        public CLong getSize() {
                return (CLong) loader.callC(handle, 0, 4, new Object[] {});
@@ -31,11 +31,11 @@
                loader.callC(handle, 4, 0, new Object[] {});
        }
 
-       public SqstoreService() {
+       public SQstoreService() {
                this(CPluginLoader._);
        }
 
-       public SqstoreService(CPluginLoader loader) {
+       public SQstoreService(CPluginLoader loader) {
                super(loader);
        }
 }

Modified: freeway/src/org/gnu/freeway/services/c/StatsService.java
===================================================================
--- freeway/src/org/gnu/freeway/services/c/StatsService.java    2007-05-04 
06:57:57 UTC (rev 4784)
+++ freeway/src/org/gnu/freeway/services/c/StatsService.java    2007-05-08 
00:05:37 UTC (rev 4785)
@@ -1,14 +1,14 @@
 // This class was autogenerated by SwitchTableGenerator
 package org.gnu.freeway.services.c;
 
+import org.gnu.freeway.cwrappers.ConstCString;
+import org.gnu.freeway.server.CPluginLoader;
+import org.gnu.freeway.util.AbstractNativeService;
+import org.gnu.freeway.cwrappers.CInt;
 import org.gnu.freeway.util.NativeService;
-import org.gnu.freeway.cwrappers.CInt;
 import org.gnu.freeway.cwrappers.ConstCLong;
+import org.gnu.freeway.cwrappers.ConstCInt;
 import org.gnu.freeway.cwrappers.CLong;
-import org.gnu.freeway.util.AbstractNativeService;
-import org.gnu.freeway.cwrappers.ConstCInt;
-import org.gnu.freeway.cwrappers.ConstCString;
-import org.gnu.freeway.server.CPluginLoader;
 
 public class StatsService extends AbstractNativeService implements 
NativeService, org.gnu.freeway.services.StatsService {
 

Modified: freeway/src/org/gnu/freeway/services/c/TrafficService.java
===================================================================
--- freeway/src/org/gnu/freeway/services/c/TrafficService.java  2007-05-04 
06:57:57 UTC (rev 4784)
+++ freeway/src/org/gnu/freeway/services/c/TrafficService.java  2007-05-08 
00:05:37 UTC (rev 4785)
@@ -1,13 +1,13 @@
 // This class was autogenerated by SwitchTableGenerator
 package org.gnu.freeway.services.c;
 
-import org.gnu.freeway.util.NativeService;
-import org.gnu.freeway.cwrappers.CInt;
-import org.gnu.freeway.util.AbstractNativeService;
+import org.gnu.freeway.cwrappers.CUnsignedIntPtr;
 import org.gnu.freeway.cwrappers.CShort;
 import org.gnu.freeway.cwrappers.CUnsignedInt;
 import org.gnu.freeway.server.CPluginLoader;
-import org.gnu.freeway.cwrappers.CUnsignedIntPtr;
+import org.gnu.freeway.util.AbstractNativeService;
+import org.gnu.freeway.cwrappers.CInt;
+import org.gnu.freeway.util.NativeService;
 
 public class TrafficService extends AbstractNativeService implements 
NativeService, org.gnu.freeway.services.TrafficService {
 

Modified: freeway/src/org/gnu/freeway/services/java/StatsService.java
===================================================================
--- freeway/src/org/gnu/freeway/services/java/StatsService.java 2007-05-04 
06:57:57 UTC (rev 4784)
+++ freeway/src/org/gnu/freeway/services/java/StatsService.java 2007-05-08 
00:05:37 UTC (rev 4785)
@@ -27,6 +27,7 @@
        }
 
        public void set(ConstCInt key, ConstCLong value) {
+               System.err.println("Setting \"" + ((Entry) 
stats.get(key.getValue())).key + "\" to " + value.getValue());
                ((Entry) stats.get(key.getValue())).value = value;
        }
 

Added: freeway/stg.sh
===================================================================
--- freeway/stg.sh                              (rev 0)
+++ freeway/stg.sh      2007-05-08 00:05:37 UTC (rev 4785)
@@ -0,0 +1,2 @@
+#!/bin/sh
+java -classpath build/freeway.jar 
org.gnu.freeway.cwrappers.util.SwitchTableGenerator $*





reply via email to

[Prev in Thread] Current Thread [Next in Thread]