]> sjero.net Git - linphone/blob - p2pproxy/launcher/src/p2pproxy.c
remove mediastreamer2 and add it as a submodule instead.
[linphone] / p2pproxy / launcher / src / p2pproxy.c
1 #include <stdio.h>
2 #include <jni.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include "p2pproxy.h"
6
7 #ifndef P2PPROXY_JMX_PORT
8         #define P2PPROXY_JMX_PORT "5678"
9 #endif
10 #ifndef P2PPROXY_INSTALLDIR
11         #define P2PPROXY_INSTALLDIR "/usr/share/java/fonis"
12 #endif 
13 #ifndef P2PPROXY_BUILDDIR
14         #define P2PPROXY_BUILDDIR "../antbuild/dist/p2pproxy_0.1"
15 #endif
16 #define NUMBER_OF_OPTION 7
17 JavaVM *p2pproxy_application_jvm = 0;
18
19 #define GET_JNI_ENV \
20         jint lResult = 0 ;\
21         JNIEnv *lJniEnv = 0;\
22         jclass  lMainClass = 0;\
23         if (p2pproxy_application_jvm==0) return P2PPROXY_ERROR_APPLICATION_NOT_STARTED; \
24         lResult = (*p2pproxy_application_jvm)->AttachCurrentThread(p2pproxy_application_jvm,(void**)&lJniEnv,NULL);\
25         if (lResult != 0) { \
26                 fprintf(stderr,"cannot attach VM\n");\
27                 return P2PPROXY_ERROR;\
28         }\
29         lMainClass = (*lJniEnv)->FindClass(lJniEnv, "org/linphone/p2pproxy/core/P2pProxyMain");\
30         if (lMainClass == 0) { \
31                 fprintf(stderr,"cannot load class org/linphone/p2pproxy/core/P2pProxyMain\n");\
32                 return P2PPROXY_ERROR; \
33         } \
34
35
36 int p2pproxy_application_start(int argc, char **argv) {
37         JNIEnv *lJniEnv = 0;
38         jclass  lMainClass = 0;
39         JavaVMInitArgs args;
40         JavaVMOption options[NUMBER_OF_OPTION];
41         jint res=-1;
42         jmethodID mainMethod;
43         jobjectArray applicationArgsList;
44         jstring applicationArg;
45         int i=0;
46         int optioncount=0;
47
48         if (p2pproxy_application_jvm != 0) {
49                 fprintf(stderr,"p2pproxy already started");
50                 return P2PPROXY_ERROR_APPLICATION_ALREADY_STARTED;
51         }
52         args.version = JNI_VERSION_1_4;
53         
54         /*options[optioncount++].optionString = "-verbose:jni";*/
55         /*options[optioncount++].optionString = "-verbose:class";*/
56         /*options[optioncount++].optionString = "-verbose:class";*/
57         options[optioncount++].optionString = "-Djava.class.path="P2PPROXY_BUILDDIR"/p2pproxy.jar:"\
58                                                                 P2PPROXY_INSTALLDIR"/p2pproxy.jar:"\
59                                                                 P2PPROXY_BUILDDIR"/log4j.jar:"\
60                                                                 P2PPROXY_INSTALLDIR"/log4j.jar";
61
62
63
64         options[optioncount++].optionString = "-Dcom.sun.management.jmxremote";
65         options[optioncount++].optionString = "-Dcom.sun.management.jmxremote.port="P2PPROXY_JMX_PORT;
66         options[optioncount++].optionString = "-Dcom.sun.management.jmxremote.authenticate=false";
67         options[optioncount++].optionString = "-Dcom.sun.management.jmxremote.ssl=false";
68         options[optioncount++].optionString = "-Dorg.linphone.p2pproxy.install.dir="P2PPROXY_INSTALLDIR;
69         options[optioncount++].optionString = "-Dorg.linphone.p2pproxy.build.dir="P2PPROXY_BUILDDIR;
70
71         args.nOptions = NUMBER_OF_OPTION;
72         args.options = options;
73         args.ignoreUnrecognized = JNI_FALSE;
74         
75
76         res = JNI_CreateJavaVM(&p2pproxy_application_jvm,  (void**)& lJniEnv, &args);
77         if (res < 0) {
78                 fprintf(stderr,"cannot start p2pproxy vm [%i]",res);
79                 return P2PPROXY_ERROR;
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         (*p2pproxy_application_jvm)->DestroyJavaVM(p2pproxy_application_jvm);
99         p2pproxy_application_jvm = 0;
100         return P2PPROXY_NO_ERROR;
101 }
102         
103
104
105 const char* p2pproxy_status_string(int status_code) {
106         return 0;
107 }
108
109
110 int p2pproxy_accountmgt_createAccount(const char* user_name) {
111         jmethodID createAccountMethod;
112         jstring applicationArg;
113         GET_JNI_ENV
114         createAccountMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "createAccount", "(Ljava/lang/String;)I");
115         applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, user_name);
116         lResult = (*lJniEnv)->CallStaticIntMethod(lJniEnv, lMainClass, createAccountMethod, applicationArg);
117         (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm);
118         return lResult;
119 }
120
121 int p2pproxy_accountmgt_isValidAccount(const char* user_name) {
122         jmethodID isValidAccountMethod;
123         jstring applicationArg; 
124         GET_JNI_ENV
125         isValidAccountMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "isValidAccount", "(Ljava/lang/String;)I");
126         applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, user_name);
127         lResult = (*lJniEnv)->CallStaticIntMethod(lJniEnv, lMainClass, isValidAccountMethod, applicationArg);
128         (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm);
129         return lResult;
130 }
131
132 int p2pproxy_accountmgt_deleteAccount(const char* user_name) {
133         jmethodID deleteAccountMethod;
134         jstring applicationArg; 
135         GET_JNI_ENV
136         deleteAccountMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "deleteAccount", "(Ljava/lang/String;)I");
137         applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, user_name);
138         lResult = (*lJniEnv)->CallStaticIntMethod(lJniEnv, lMainClass, deleteAccountMethod, applicationArg);
139         (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm);
140         return lResult;
141 }
142
143 int p2pproxy_resourcemgt_lookup_sip_proxy(char* proxy_uri,size_t size, const char* domain) {
144         jmethodID lLookupSipProxyUriMethod;
145         jstring lJStringResult; 
146         const char* lString;
147         jboolean  lIsCopy;
148         jstring applicationArg;
149         
150         GET_JNI_ENV
151          
152         
153         applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, domain);
154         lLookupSipProxyUriMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "lookupSipProxyUri", "(Ljava/lang/String;)Ljava/lang/String;");
155         lJStringResult = (*lJniEnv)->CallStaticObjectMethod(lJniEnv, lMainClass, lLookupSipProxyUriMethod, applicationArg);
156         if (lJStringResult == 0) {
157                 return P2PPROXY_RESOURCEMGT_SERVER_NOT_FOUND;
158         }
159         lString =  (*lJniEnv)->GetStringUTFChars(lJniEnv, lJStringResult, &lIsCopy);
160         memcpy(proxy_uri,lString,size);
161         (*lJniEnv)->ReleaseStringUTFChars(lJniEnv, lJStringResult, lString);
162         (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm);
163         return P2PPROXY_NO_ERROR;
164 }
165
166 int p2pproxy_resourcemgt_revoke_sip_proxy(const char* proxy_uri) {
167         jmethodID revokeProxyMethod;
168         jstring applicationArg;
169         GET_JNI_ENV
170         
171         applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, proxy_uri);
172         revokeProxyMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "revokeSipProxy", "(Ljava/lang/String;)I");
173         lResult = (*lJniEnv)->CallStaticIntMethod(lJniEnv, lMainClass, revokeProxyMethod,applicationArg);
174         (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm);
175         return lResult;
176 }
177
178 int p2pproxy_application_get_state() {
179         jmethodID stateMethod;
180         GET_JNI_ENV
181         stateMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "getState", "()I");
182         if (stateMethod==NULL) {
183                 lResult=P2PPROXY_ERROR_APPLICATION_NOT_STARTED;
184                 goto end;
185         }
186         lResult = (*lJniEnv)->CallStaticIntMethod(lJniEnv, lMainClass, stateMethod);
187         goto end;
188         end:
189         (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm);
190         return lResult;
191         
192 }
193
194 int p2pproxy_application_stop() {
195         jmethodID stopMethod = 0;
196         GET_JNI_ENV
197         
198         stopMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "stop", "()V");
199         (*lJniEnv)->CallStaticVoidMethod(lJniEnv, lMainClass, stopMethod);
200         (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm);
201         return 0;
202 }
203
204
205 p2pproxy_resourcemgt_resource_list_t* p2pproxy_resourcemgt_new_resource_list() {
206         p2pproxy_resourcemgt_resource_list_t* resource_list = malloc(sizeof (p2pproxy_resourcemgt_resource_list_t));
207         resource_list->size = 0;
208         return resource_list;
209 }
210
211 void p2pproxy_resourcemgt_delete_resource_list(p2pproxy_resourcemgt_resource_list_t* resource_list) {
212         int i;
213         if (resource_list == 0 ) {
214                 return;
215         }
216         for (i=0;i<resource_list->size;i++) {
217                 free(resource_list->resource_uri[i]);
218         }
219         resource_list->size = 0;
220         free(resource_list);  
221 }
222
223 int p2pproxy_resourcemgt_lookup_media_resource(p2pproxy_resourcemgt_resource_list_t* resource_list, const char* domain)  {
224         jmethodID lLookupMediaResourceMethod;
225         jarray lJStringResults;
226         jstring lResourceInstance; 
227         const char* lString;
228         jboolean  lIsCopy;
229         jstring applicationArg;
230         int i;
231         jsize lStringSize;
232         jsize lArraySize;
233         
234         GET_JNI_ENV
235          
236         
237         applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, domain);
238         lLookupMediaResourceMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "lookupMediaServerAddress", "(Ljava/lang/String;)[Ljava/lang/String;");
239         lJStringResults = (*lJniEnv)->CallStaticObjectMethod(lJniEnv, lMainClass, lLookupMediaResourceMethod, applicationArg);
240         if (lJStringResults == 0) {
241                 return P2PPROXY_RESOURCEMGT_SERVER_NOT_FOUND;
242         }
243         
244         lArraySize = (*lJniEnv)->GetArrayLength(lJniEnv, lJStringResults);
245         for (i=0;i<lArraySize & i<P2PPROXY_MAX_RESOURCE_LIST_SIZE; i++) {
246                 lResourceInstance =  (*lJniEnv)->GetObjectArrayElement(lJniEnv,lJStringResults, i);
247                 lString =  (*lJniEnv)->GetStringUTFChars(lJniEnv, lResourceInstance, &lIsCopy);
248                 lStringSize = (*lJniEnv)->GetStringLength(lJniEnv, lResourceInstance);
249                 resource_list->resource_uri[i] = malloc(lStringSize);
250                 strcpy(resource_list->resource_uri[i],lString);
251                 resource_list->size=i;
252                 (*lJniEnv)->ReleaseStringUTFChars(lJniEnv, lResourceInstance, lString);
253         }
254         
255         (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm);
256         return P2PPROXY_NO_ERROR;
257 }
258 int p2pproxy_resourcemgt_revoke_media_resource(const char* resource_uri) {
259         jmethodID revokeMediaResourceMethod;
260         jstring applicationArg;
261         GET_JNI_ENV
262         
263         applicationArg = (*lJniEnv)->NewStringUTF(lJniEnv, resource_uri);
264         revokeMediaResourceMethod = (*lJniEnv)->GetStaticMethodID(lJniEnv, lMainClass, "revokeMediaServer", "(Ljava/lang/String;)I");
265         lResult = (*lJniEnv)->CallStaticIntMethod(lJniEnv, lMainClass, revokeMediaResourceMethod,applicationArg);
266         (*p2pproxy_application_jvm)->DetachCurrentThread(p2pproxy_application_jvm);
267         return lResult;
268 }