| 1 | #include <stdio.h> |
|---|
| 2 | #include <jni.h> |
|---|
| 3 | #include "p2pproxy.h" |
|---|
| 4 | |
|---|
| 5 | #ifndef P2PPROXY_JMX_PORT |
|---|
| 6 | #define P2PPROXY_JMX_PORT "5678" |
|---|
| 7 | #endif |
|---|
| 8 | #ifndef P2PPROXY_INSTALLDIR |
|---|
| 9 | #define P2PPROXY_INSTALLDIR "/usr/local/share/java" |
|---|
| 10 | #endif |
|---|
| 11 | #ifndef P2PPROXY_BUILDDIR |
|---|
| 12 | #define P2PPROXY_BUILDDIR "../antbuild/dist/p2pproxy_0.1" |
|---|
| 13 | #endif |
|---|
| 14 | #define NUMBER_OF_OPTION 7 |
|---|
| 15 | JNIEnv* p2pproxy_application_jnienv = 0; |
|---|
| 16 | JavaVM* p2pproxy_application_jvm = 0; |
|---|
| 17 | jclass p2pproxy_proxy_main_class = 0; |
|---|
| 18 | |
|---|
| 19 | int p2pproxy_application_start(int argc, char **argv) { |
|---|
| 20 | |
|---|
| 21 | JavaVMInitArgs args; |
|---|
| 22 | JavaVMOption options[NUMBER_OF_OPTION]; |
|---|
| 23 | jint res=-1; |
|---|
| 24 | jmethodID mainMethod; |
|---|
| 25 | jobjectArray applicationArgsList; |
|---|
| 26 | jstring applicationArg; |
|---|
| 27 | int i=0; |
|---|
| 28 | int optioncount=0; |
|---|
| 29 | |
|---|
| 30 | if (p2pproxy_application_jnienv != 0) { |
|---|
| 31 | fprintf(stderr,"p2pproxy already started"); |
|---|
| 32 | return P2PPROXY_ERROR_APPLICATION_ALREADY_STARTED; |
|---|
| 33 | } |
|---|
| 34 | args.version = JNI_VERSION_1_4; |
|---|
| 35 | |
|---|
| 36 | /*options[optioncount++].optionString = "-verbose:jni";*/ |
|---|
| 37 | /*options[optioncount++].optionString = "-verbose:class";*/ |
|---|
| 38 | /*options[optioncount++].optionString = "-verbose:class";*/ |
|---|
| 39 | options[optioncount++].optionString = "-Djava.class.path="P2PPROXY_BUILDDIR"/p2pproxy.jar:"\ |
|---|
| 40 | P2PPROXY_INSTALLDIR"/p2pproxy.jar:"\ |
|---|
| 41 | P2PPROXY_BUILDDIR"/log4j.jar:"\ |
|---|
| 42 | P2PPROXY_INSTALLDIR"/log4j.jar"; |
|---|
| 43 | |
|---|
| 44 | |
|---|
| 45 | |
|---|
| 46 | options[optioncount++].optionString = "-Dcom.sun.management.jmxremote"; |
|---|
| 47 | options[optioncount++].optionString = "-Dcom.sun.management.jmxremote.port="P2PPROXY_JMX_PORT; |
|---|
| 48 | options[optioncount++].optionString = "-Dcom.sun.management.jmxremote.authenticate=false"; |
|---|
| 49 | options[optioncount++].optionString = "-Dcom.sun.management.jmxremote.ssl=false"; |
|---|
| 50 | options[optioncount++].optionString = "-Dorg.linphone.p2pproxy.install.dir="P2PPROXY_INSTALLDIR; |
|---|
| 51 | options[optioncount++].optionString = "-Dorg.linphone.p2pproxy.build.dir="P2PPROXY_BUILDDIR; |
|---|
| 52 | |
|---|
| 53 | args.nOptions = NUMBER_OF_OPTION; |
|---|
| 54 | args.options = options; |
|---|
| 55 | args.ignoreUnrecognized = JNI_FALSE; |
|---|
| 56 | |
|---|
| 57 | res = JNI_CreateJavaVM(&p2pproxy_application_jvm, (void **)&p2pproxy_application_jnienv, &args); |
|---|
| 58 | if (res < 0) { |
|---|
| 59 | fprintf(stderr,"cannot start p2pproxy vm [%i]",res); |
|---|
| 60 | return P2PPROXY_ERROR; |
|---|
| 61 | } |
|---|
| 62 | |
|---|
| 63 | p2pproxy_proxy_main_class = (*p2pproxy_application_jnienv)->FindClass(p2pproxy_application_jnienv, "org/linphone/p2pproxy/core/P2pProxyMain"); |
|---|
| 64 | |
|---|
| 65 | if (p2pproxy_proxy_main_class == 0) { |
|---|
| 66 | fprintf(stderr,"cannot load class org/linphone/p2pproxy/core/P2pProxyMain\n"); |
|---|
| 67 | return P2PPROXY_ERROR; |
|---|
| 68 | } |
|---|
| 69 | mainMethod = (*p2pproxy_application_jnienv)->GetStaticMethodID(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, "main", "([Ljava/lang/String;)V"); |
|---|
| 70 | |
|---|
| 71 | applicationArgsList = (*p2pproxy_application_jnienv)->NewObjectArray(p2pproxy_application_jnienv, argc, (*p2pproxy_application_jnienv)->FindClass(p2pproxy_application_jnienv, "java/lang/String"), NULL); |
|---|
| 72 | |
|---|
| 73 | for (i=0;i<argc;i++) { |
|---|
| 74 | applicationArg = (*p2pproxy_application_jnienv)->NewStringUTF(p2pproxy_application_jnienv, argv[i]); |
|---|
| 75 | (*p2pproxy_application_jnienv)->SetObjectArrayElement(p2pproxy_application_jnienv, applicationArgsList, 0, applicationArg); |
|---|
| 76 | |
|---|
| 77 | } |
|---|
| 78 | |
|---|
| 79 | (*p2pproxy_application_jnienv)->CallStaticVoidMethod(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, mainMethod, applicationArgsList); |
|---|
| 80 | |
|---|
| 81 | return P2PPROXY_NO_ERROR; |
|---|
| 82 | } |
|---|
| 83 | |
|---|
| 84 | |
|---|
| 85 | const char* p2pproxy_status_string(int status_code) { |
|---|
| 86 | return 0; |
|---|
| 87 | } |
|---|
| 88 | |
|---|
| 89 | |
|---|
| 90 | int p2pproxy_accountmgt_createAccount(const char* user_name) { |
|---|
| 91 | jmethodID createAccountMethod; |
|---|
| 92 | jstring applicationArg; |
|---|
| 93 | |
|---|
| 94 | createAccountMethod = (*p2pproxy_application_jnienv)->GetStaticMethodID(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, "createAccount", "([java/lang/String;)I"); |
|---|
| 95 | applicationArg = (*p2pproxy_application_jnienv)->NewStringUTF(p2pproxy_application_jnienv, user_name); |
|---|
| 96 | return (*p2pproxy_application_jnienv)->CallStaticIntMethod(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, createAccountMethod, applicationArg); |
|---|
| 97 | } |
|---|
| 98 | |
|---|
| 99 | int p2pproxy_accountmgt_isValidAccount(const char* user_name) { |
|---|
| 100 | jmethodID isValidAccountMethod; |
|---|
| 101 | jstring applicationArg; |
|---|
| 102 | |
|---|
| 103 | isValidAccountMethod = (*p2pproxy_application_jnienv)->GetStaticMethodID(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, "isValidAccount", "([java/lang/String;)I"); |
|---|
| 104 | applicationArg = (*p2pproxy_application_jnienv)->NewStringUTF(p2pproxy_application_jnienv, user_name); |
|---|
| 105 | return (*p2pproxy_application_jnienv)->CallStaticIntMethod(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, isValidAccountMethod, applicationArg); |
|---|
| 106 | } |
|---|
| 107 | |
|---|
| 108 | int p2pproxy_accountmgt_deleteAccount(const char* user_name) { |
|---|
| 109 | jmethodID deleteAccountMethod; |
|---|
| 110 | jstring applicationArg; |
|---|
| 111 | |
|---|
| 112 | deleteAccountMethod = (*p2pproxy_application_jnienv)->GetStaticMethodID(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, "deleteAccount", "([java/lang/String;)I"); |
|---|
| 113 | applicationArg = (*p2pproxy_application_jnienv)->NewStringUTF(p2pproxy_application_jnienv, user_name); |
|---|
| 114 | return (*p2pproxy_application_jnienv)->CallStaticIntMethod(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, deleteAccountMethod, applicationArg); |
|---|
| 115 | } |
|---|
| 116 | |
|---|
| 117 | int p2pproxy_resourcelocation_get_sip_proxyregistrar_uri(char* aStringArray, size_t aSize) { |
|---|
| 118 | jmethodID getSipProxyRegistrarUriMethod; |
|---|
| 119 | jstring lJStringResult; |
|---|
| 120 | const jbyte* lString; |
|---|
| 121 | jboolean lIsCopy; |
|---|
| 122 | |
|---|
| 123 | getSipProxyRegistrarUriMethod = (*p2pproxy_application_jnienv)->GetStaticMethodID(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, "getSipProxyRegistrarUriMethod", "()[java/lang/String;"); |
|---|
| 124 | lJStringResult = (*p2pproxy_application_jnienv)->CallStaticObjectMethod(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, getSipProxyRegistrarUriMethod); |
|---|
| 125 | if (lJStringResult == 0) { |
|---|
| 126 | return P2PPROXY_ERROR_RESOURCELOCATOR_SERVER_NOT_FOUND; |
|---|
| 127 | } |
|---|
| 128 | lString = (*p2pproxy_application_jnienv)->GetStringUTFChars(p2pproxy_application_jnienv, lJStringResult, &lIsCopy); |
|---|
| 129 | memcpy(aStringArray,lString,aSize); |
|---|
| 130 | (*p2pproxy_application_jnienv)->ReleaseStringUTFChars(p2pproxy_application_jnienv, lJStringResult, lString); |
|---|
| 131 | return P2PPROXY_NO_ERROR; |
|---|
| 132 | } |
|---|
| 133 | |
|---|
| 134 | int p2pproxy_application_get_state() { |
|---|
| 135 | jmethodID stateMethod; |
|---|
| 136 | |
|---|
| 137 | stateMethod = (*p2pproxy_application_jnienv)->GetStaticMethodID(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, "getState", "()I"); |
|---|
| 138 | return (*p2pproxy_application_jnienv)->CallStaticIntMethod(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, stateMethod); |
|---|
| 139 | |
|---|
| 140 | } |
|---|
| 141 | void p2pproxy_application_stop() { |
|---|
| 142 | jmethodID stopMethod; |
|---|
| 143 | |
|---|
| 144 | stopMethod = (*p2pproxy_application_jnienv)->GetStaticMethodID(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, "stop", "()V"); |
|---|
| 145 | (*p2pproxy_application_jnienv)->CallStaticVoidMethod(p2pproxy_application_jnienv, p2pproxy_proxy_main_class, stopMethod); |
|---|
| 146 | return; |
|---|
| 147 | |
|---|
| 148 | } |
|---|
| 149 | |
|---|
| 150 | |
|---|