| 1 | #include <stdio.h> |
|---|
| 2 | #include <jni.h> |
|---|
| 3 | #include <string.h> |
|---|
| 4 | #include "p2pproxy.h" |
|---|
| 5 | |
|---|
| 6 | #ifndef P2PPROXY_JMX_PORT |
|---|
| 7 | #define P2PPROXY_JMX_PORT "5678" |
|---|
| 8 | #endif |
|---|
| 9 | #ifndef P2PPROXY_INSTALLDIR |
|---|
| 10 | #define P2PPROXY_INSTALLDIR "/usr/local/share/java" |
|---|
| 11 | #endif |
|---|
| 12 | #ifndef P2PPROXY_BUILDDIR |
|---|
| 13 | #define P2PPROXY_BUILDDIR "../antbuild/dist/p2pproxy_0.1" |
|---|
| 14 | #endif |
|---|
| 15 | #define NUMBER_OF_OPTION 7 |
|---|
| 16 | JavaVM* p2pproxy_application_jvm = 0; |
|---|
| 17 | |
|---|
| 18 | #define GET_JNI_ENV \ |
|---|
| 19 | jint lResut = 0 ;\ |
|---|
| 20 | JNIEnv* lJniEnv = 0;\ |
|---|
| 21 | jclass lMainClass = 0;\ |
|---|
| 22 | lResut = (*p2pproxy_application_jvm)->AttachCurrentThread(p2pproxy_application_jvm,&lJniEnv,NULL);\ |
|---|
| 23 | if (lResut != 0) { \ |
|---|
| 24 | fprintf(stderr,"cannot attach VM\n");\ |
|---|
| 25 | return P2PPROXY_ERROR;\ |
|---|
| 26 | }\ |
|---|
| 27 | lMainClass = (*lJniEnv)->FindClass(lJniEnv, "org/linphone/p2pproxy/core/P2pProxyMain");\ |
|---|
| 28 | if (lMainClass == 0) { \ |
|---|
| 29 | fprintf(stderr,"cannot load class org/linphone/p2pproxy/core/P2pProxyMain\n");\ |
|---|
| 30 | return P2PPROXY_ERROR; \ |
|---|
| 31 | } \ |
|---|
| 32 | |
|---|
| 33 | |
|---|
| 34 | int p2pproxy_application_start(int argc, char **argv) { |
|---|
| 35 | JNIEnv* lJniEnv = 0; |
|---|
| 36 | jclass lMainClass = 0; |
|---|
| 37 | |
|---|
| 38 | JavaVMInitArgs args; |
|---|
| 39 | JavaVMOption options[NUMBER_OF_OPTION]; |
|---|
| 40 | jint res=-1; |
|---|
| 41 | jmethodID mainMethod; |
|---|
| 42 | jobjectArray applicationArgsList; |
|---|
| 43 | jstring applicationArg; |
|---|
| 44 | int i=0; |
|---|
| 45 | int optioncount=0; |
|---|
| 46 | |
|---|
| 47 | if (p2pproxy_application_jvm != 0) { |
|---|
| 48 | fprintf(stderr,"p2pproxy already started"); |
|---|
| 49 | return P2PPROXY_ERROR_APPLICATION_ALREADY_STARTED; |
|---|
| 50 | } |
|---|
| 51 | args.version = JNI_VERSION_1_4; |
|---|
| 52 | |
|---|
| 53 | /*options[optioncount++].optionString = "-verbose:jni";*/ |
|---|
| 54 | /*options[optioncount++].optionString = "-verbose:class";*/ |
|---|
| 55 | /*options[optioncount++].optionString = "-verbose:class";*/ |
|---|
| 56 | options[optioncount++].optionString = "-Djava.class.path="P2PPROXY_BUILDDIR"/p2pproxy.jar:"\ |
|---|
| 57 | P2PPROXY_INSTALLDIR"/p2pproxy.jar:"\ |
|---|
| 58 | P2PPROXY_BUILDDIR"/log4j.jar:"\ |
|---|
| 59 | P2PPROXY_INSTALLDIR"/log4j.jar"; |
|---|
| 60 | |
|---|
| 61 | |
|---|
| 62 | |
|---|
| 63 | options[optioncount++].optionString = "-Dcom.sun.management.jmxremote"; |
|---|
| 64 | options[optioncount++].optionString = "-Dcom.sun.management.jmxremote.port="P2PPROXY_JMX_PORT; |
|---|
| 65 | options[optioncount++].optionString = "-Dcom.sun.management.jmxremote.authenticate=false"; |
|---|
| 66 | options[optioncount++].optionString = "-Dcom.sun.management.jmxremote.ssl=false"; |
|---|
| 67 | options[optioncount++].optionString = "-Dorg.linphone.p2pproxy.install.dir="P2PPROXY_INSTALLDIR; |
|---|
| 68 | options[optioncount++].optionString = "-Dorg.linphone.p2pproxy.build.dir="P2PPROXY_BUILDDIR; |
|---|
| 69 | |
|---|
| 70 | args.nOptions = NUMBER_OF_OPTION; |
|---|
| 71 | args.options = options; |
|---|
| 72 | args.ignoreUnrecognized = JNI_FALSE; int lResult; |
|---|
| 73 | |
|---|
| 74 | |
|---|
| 75 | res = JNI_CreateJavaVM(&p2pproxy_application_jvm, (void **)&lJniEnv, &args); |
|---|
| 76 | if (res < 0) { |
|---|
| 77 | fprintf(stderr,"cannot start p2pproxy vm [%i]",res); |
|---|
| 78 | return P2PPROXY_ERROR; |
|---|
| 79 | } |
|---|
| 80 | |
|---|
| 81 | lMainClass = (*lJniEnv)->FindClass(lJniEnv, "org/linphone/p2pproxy/core/P2pProxyMain"); |
|---|
| 82 | |
|---|
| 83 | if (lMainClass == 0) { |
|---|
| 84 | fprintf(stderr,"cannot load class org/linphone/p2pproxy/core/P2pProxyMain\n"); |
|---|
| 85 | return P2PPROXY_ERROR; |
|---|
| 86 | } |
|---|
| 87 | mainMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "main", "([Ljava/lang/String;)V"); |
|---|
| 88 | |
|---|
| 89 | applicationArgsList = (*lJniEnv)->NewObjectArray(lJniEnv, argc, (*lJniEnv)->FindClass(lJniEnv, "java/lang/String"), NULL); |
|---|
| 90 | |
|---|
| 91 | for (i=0;i<argc;i++) { |
|---|
| 92 | applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, argv[i]); |
|---|
| 93 | (*lJniEnv)->SetObjectArrayElement(lJniEnv, applicationArgsList, i, applicationArg); |
|---|
| 94 | |
|---|
| 95 | } |
|---|
| 96 | |
|---|
| 97 | (*lJniEnv)->CallStaticVoidMethod(lJniEnv, lMainClass, mainMethod, applicationArgsList); |
|---|
| 98 | |
|---|
| 99 | return P2PPROXY_NO_ERROR; |
|---|
| 100 | } |
|---|
| 101 | int lResult; |
|---|
| 102 | |
|---|
| 103 | |
|---|
| 104 | const char* p2pproxy_status_string(int status_code) { |
|---|
| 105 | return 0; |
|---|
| 106 | } |
|---|
| 107 | |
|---|
| 108 | |
|---|
| 109 | int p2pproxy_accountmgt_createAccount(const char* user_name) { |
|---|
| 110 | jmethodID createAccountMethod; |
|---|
| 111 | jstring applicationArg; |
|---|
| 112 | GET_JNI_ENV |
|---|
| 113 | createAccountMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "createAccount", "(Ljava/lang/String;)I"); |
|---|
| 114 | applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, user_name); |
|---|
| 115 | lResult = (*lJniEnv)->CallStaticIntMethod(lJniEnv, lMainClass, createAccountMethod, applicationArg); |
|---|
| 116 | (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm); |
|---|
| 117 | return lResult; |
|---|
| 118 | } |
|---|
| 119 | |
|---|
| 120 | int p2pproxy_accountmgt_isValidAccount(const char* user_name) { |
|---|
| 121 | jmethodID isValidAccountMethod; |
|---|
| 122 | jstring applicationArg; |
|---|
| 123 | GET_JNI_ENV |
|---|
| 124 | isValidAccountMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "isValidAccount", "(Ljava/lang/String;)I"); |
|---|
| 125 | applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, user_name); |
|---|
| 126 | lResult = (*lJniEnv)->CallStaticIntMethod(lJniEnv, lMainClass, isValidAccountMethod, applicationArg); |
|---|
| 127 | (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm); |
|---|
| 128 | return lResult; |
|---|
| 129 | } |
|---|
| 130 | |
|---|
| 131 | int p2pproxy_accountmgt_deleteAccount(const char* user_name) { |
|---|
| 132 | jmethodID deleteAccountMethod; |
|---|
| 133 | jstring applicationArg; |
|---|
| 134 | GET_JNI_ENV |
|---|
| 135 | deleteAccountMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "deleteAccount", "(Ljava/lang/String;)I"); |
|---|
| 136 | applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, user_name); |
|---|
| 137 | lResult = (*lJniEnv)->CallStaticIntMethod(lJniEnv, lMainClass, deleteAccountMethod, applicationArg); |
|---|
| 138 | (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm); |
|---|
| 139 | return lResult; |
|---|
| 140 | } |
|---|
| 141 | |
|---|
| 142 | int p2pproxy_resourcemgt_lookup_sip_proxy(char* proxy_uri,size_t size, char* domaine) { |
|---|
| 143 | jmethodID lLookupSipProxyUriMethod; |
|---|
| 144 | jstring lJStringResult; |
|---|
| 145 | const jbyte* lString; |
|---|
| 146 | jboolean lIsCopy; |
|---|
| 147 | jstring applicationArg; |
|---|
| 148 | |
|---|
| 149 | GET_JNI_ENV |
|---|
| 150 | |
|---|
| 151 | |
|---|
| 152 | applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, domaine); |
|---|
| 153 | lLookupSipProxyUriMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "lookupSipProxyUri", "(Ljava/lang/String;)Ljava/lang/String;"); |
|---|
| 154 | lJStringResult = (*lJniEnv)->CallStaticObjectMethod(lJniEnv, lMainClass, lLookupSipProxyUriMethod, applicationArg); |
|---|
| 155 | if (lJStringResult == 0) { |
|---|
| 156 | return P2PPROXY_RESOURCEMGT_SERVER_NOT_FOUND; |
|---|
| 157 | } |
|---|
| 158 | lString = (*lJniEnv)->GetStringUTFChars(lJniEnv, lJStringResult, &lIsCopy); |
|---|
| 159 | memcpy(proxy_uri,lString,size); |
|---|
| 160 | (*lJniEnv)->ReleaseStringUTFChars(lJniEnv, lJStringResult, lString); |
|---|
| 161 | (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm); |
|---|
| 162 | return P2PPROXY_NO_ERROR; |
|---|
| 163 | } |
|---|
| 164 | |
|---|
| 165 | int p2pproxy_resourcemgt_revoke_sip_proxy(char* proxy_uri) { |
|---|
| 166 | jmethodID revokeProxyMethod; |
|---|
| 167 | jstring lJStringResult; |
|---|
| 168 | const jbyte* lString; |
|---|
| 169 | jboolean lIsCopy; |
|---|
| 170 | GET_JNI_ENV |
|---|
| 171 | |
|---|
| 172 | revokeProxyMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "revokeSipProxy", "(Ljava/lang/String;)V"); |
|---|
| 173 | (*lJniEnv)->CallStaticVoidMethod(lJniEnv, lMainClass, revokeProxyMethod); |
|---|
| 174 | if (lJStringResult == 0) { |
|---|
| 175 | return P2PPROXY_ERROR; |
|---|
| 176 | } |
|---|
| 177 | return P2PPROXY_NO_ERROR; |
|---|
| 178 | } |
|---|
| 179 | int p2pproxy_application_get_state() { |
|---|
| 180 | jmethodID stateMethod; |
|---|
| 181 | GET_JNI_ENV |
|---|
| 182 | |
|---|
| 183 | stateMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "getState", "()I"); |
|---|
| 184 | lResult = (*lJniEnv)->CallStaticIntMethod(lJniEnv, lMainClass, stateMethod); |
|---|
| 185 | (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm); |
|---|
| 186 | return lResult; |
|---|
| 187 | |
|---|
| 188 | } |
|---|
| 189 | void p2pproxy_application_stop() { |
|---|
| 190 | jmethodID stopMethod = 0; |
|---|
| 191 | GET_JNI_ENV |
|---|
| 192 | |
|---|
| 193 | stopMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "stop", "()V"); |
|---|
| 194 | (*lJniEnv)->CallStaticVoidMethod(lJniEnv, lMainClass, stopMethod); |
|---|
| 195 | (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm); |
|---|
| 196 | (*p2pproxy_application_jvm)->DestroyJavaVM(p2pproxy_application_jvm); |
|---|
| 197 | p2pproxy_application_jvm = 0; |
|---|
| 198 | return; |
|---|
| 199 | |
|---|
| 200 | } |
|---|
| 201 | |
|---|
| 202 | |
|---|