linphonecore_jni.cc 85.6 KB
Newer Older
jehan's avatar
jehan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
linphonecore_jni.cc
Copyright (C) 2010  Belledonne Communications, Grenoble, France

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
#include <jni.h>
jehan's avatar
jehan committed
20
#include "linphonecore_utils.h"
21
#include <ortp/zrtp.h>
jehan's avatar
jehan committed
22

Guillaume Beraudo's avatar
Guillaume Beraudo committed
23
#ifdef TUNNEL_ENABLED
jehan's avatar
jehan committed
24
#include "linphone_tunnel.h"
Guillaume Beraudo's avatar
Guillaume Beraudo committed
25 26
#endif

27 28 29
extern "C" {
#include "mediastreamer2/mediastream.h"
}
Simon Morlat's avatar
Simon Morlat committed
30
#include "mediastreamer2/msjava.h"
31
#include "private.h"
32 33
#include <cpu-features.h>

jehan's avatar
jehan committed
34 35
#ifdef ANDROID
#include <android/log.h>
36
extern "C" void libmsilbc_init();
37
#ifdef HAVE_X264
Simon Morlat's avatar
Simon Morlat committed
38
extern "C" void libmsx264_init();
39
#endif
Simon Morlat's avatar
Simon Morlat committed
40 41 42
#ifdef HAVE_AMR
extern "C" void libmsamr_init();
#endif
43 44 45
#ifdef HAVE_SILK
extern "C" void libmssilk_init();
#endif
jehan's avatar
jehan committed
46 47 48
#ifdef HAVE_G729
extern "C" void libmsbcg729_init();
#endif
jehan's avatar
jehan committed
49 50 51 52 53 54 55
#endif /*ANDROID*/

static JavaVM *jvm=0;

#ifdef ANDROID
static void linphone_android_log_handler(OrtpLogLevel lev, const char *fmt, va_list args){
	int prio;
56 57 58
 	char str[4096];
	char *current;
	char *next;
jehan's avatar
jehan committed
59 60 61 62 63 64 65 66
	switch(lev){
	case ORTP_DEBUG:	prio = ANDROID_LOG_DEBUG;	break;
	case ORTP_MESSAGE:	prio = ANDROID_LOG_INFO;	break;
	case ORTP_WARNING:	prio = ANDROID_LOG_WARN;	break;
	case ORTP_ERROR:	prio = ANDROID_LOG_ERROR;	break;
	case ORTP_FATAL:	prio = ANDROID_LOG_FATAL;	break;
	default:		prio = ANDROID_LOG_DEFAULT;	break;
	}
67 68 69 70 71 72 73 74 75 76 77 78 79
 	vsnprintf(str, sizeof(str) - 1, fmt, args);
 	str[sizeof(str) - 1] = '\0';
 	if (strlen(str) < 512) {
		__android_log_write(prio, LOG_DOMAIN, str);
	} else {
		current = str;
		while ((next = strchr(current, '\n')) != NULL) {
			*next = '\0';
			__android_log_write(prio, LOG_DOMAIN, current);
			current = next + 1;
		}
		__android_log_write(prio, LOG_DOMAIN, current);
	}
jehan's avatar
jehan committed
80
}
81 82 83 84

int dumbMethodForAllowingUsageOfCpuFeaturesFromStaticLibMediastream() {
	return (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM && (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0);
}
jehan's avatar
jehan committed
85 86 87 88
#endif /*ANDROID*/

JNIEXPORT jint JNICALL  JNI_OnLoad(JavaVM *ajvm, void *reserved)
{
jehan's avatar
jehan committed
89
#ifdef ANDROID
Simon Morlat's avatar
Simon Morlat committed
90
	ms_set_jvm(ajvm);
jehan's avatar
jehan committed
91 92 93 94 95 96
#endif /*ANDROID*/
	jvm=ajvm;
	return JNI_VERSION_1_2;
}


jehan's avatar
jehan committed
97
//LinphoneFactory
jehan's avatar
jehan committed
98
extern "C" void Java_org_linphone_core_LinphoneCoreFactoryImpl_setDebugMode(JNIEnv*  env
jehan's avatar
jehan committed
99 100 101 102 103 104 105 106
		,jobject  thiz
		,jboolean isDebug) {
	if (isDebug) {
		linphone_core_enable_logs_with_cb(linphone_android_log_handler);
	} else {
		linphone_core_disable_logs();
	}
}
jehan's avatar
jehan committed
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
// LinphoneCore

class LinphoneCoreData {
public:
	LinphoneCoreData(JNIEnv*  env, jobject lc,jobject alistener, jobject auserdata) {

		core = env->NewGlobalRef(lc);
		listener = env->NewGlobalRef(alistener);
		userdata = auserdata?env->NewGlobalRef(auserdata):0;
		memset(&vTable,0,sizeof(vTable));
		vTable.show = showInterfaceCb;
		vTable.auth_info_requested = authInfoRequested;
		vTable.display_status = displayStatusCb;
		vTable.display_message = displayMessageCb;
		vTable.display_warning = displayMessageCb;
122
		vTable.global_state_changed = globalStateChange;
jehan's avatar
jehan committed
123 124
		vTable.registration_state_changed = registrationStateChange;
		vTable.call_state_changed = callStateChange;
125
		vTable.call_encryption_changed = callEncryptionChange;
126
		vTable.text_received = text_received;
127
		vTable.message_received = message_received;
Sylvain Berfini's avatar
Sylvain Berfini committed
128
		vTable.dtmf_received = dtmf_received;
129 130
		vTable.new_subscription_request = new_subscription_request;
		vTable.notify_presence_recv = notify_presence_recv;
131
		vTable.call_stats_updated = callStatsUpdated;
jehan's avatar
jehan committed
132

133
		listenerClass = (jclass)env->NewGlobalRef(env->GetObjectClass( alistener));
134

jehan's avatar
jehan committed
135
		/*displayStatus(LinphoneCore lc,String message);*/
136
		displayStatusId = env->GetMethodID(listenerClass,"displayStatus","(Lorg/linphone/core/LinphoneCore;Ljava/lang/String;)V");
137

jehan's avatar
jehan committed
138
		/*void generalState(LinphoneCore lc,int state); */
139
		globalStateId = env->GetMethodID(listenerClass,"globalState","(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneCore$GlobalState;Ljava/lang/String;)V");
140 141
		globalStateClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneCore$GlobalState"));
		globalStateFromIntId = env->GetStaticMethodID(globalStateClass,"fromInt","(I)Lorg/linphone/core/LinphoneCore$GlobalState;");
142

143
		/*registrationState(LinphoneCore lc, LinphoneProxyConfig cfg, LinphoneCore.RegistrationState cstate, String smessage);*/
144
		registrationStateId = env->GetMethodID(listenerClass,"registrationState","(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneProxyConfig;Lorg/linphone/core/LinphoneCore$RegistrationState;Ljava/lang/String;)V");
145 146
		registrationStateClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneCore$RegistrationState"));
		registrationStateFromIntId = env->GetStaticMethodID(registrationStateClass,"fromInt","(I)Lorg/linphone/core/LinphoneCore$RegistrationState;");
147

148
		/*callState(LinphoneCore lc, LinphoneCall call, LinphoneCall.State cstate,String message);*/
149
		callStateId = env->GetMethodID(listenerClass,"callState","(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneCall;Lorg/linphone/core/LinphoneCall$State;Ljava/lang/String;)V");
150 151
		callStateClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneCall$State"));
		callStateFromIntId = env->GetStaticMethodID(callStateClass,"fromInt","(I)Lorg/linphone/core/LinphoneCall$State;");
152

153 154 155
		/*callStatsUpdated(LinphoneCore lc, LinphoneCall call, LinphoneCallStats stats);*/
		callStatsUpdatedId = env->GetMethodID(listenerClass, "callStatsUpdated", "(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneCall;Lorg/linphone/core/LinphoneCallStats;)V");

156 157 158
		chatMessageStateClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneChatMessage$State"));
		chatMessageStateFromIntId = env->GetStaticMethodID(chatMessageStateClass,"fromInt","(I)Lorg/linphone/core/LinphoneChatMessage$State;");

159
		/*callEncryption(LinphoneCore lc, LinphoneCall call, boolean encrypted,String auth_token);*/
160
		callEncryptionChangedId=env->GetMethodID(listenerClass,"callEncryptionChanged","(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneCall;ZLjava/lang/String;)V");
161

jehan's avatar
jehan committed
162
		/*void ecCalibrationStatus(LinphoneCore.EcCalibratorStatus status, int delay_ms, Object data);*/
163
		ecCalibrationStatusId = env->GetMethodID(listenerClass,"ecCalibrationStatus","(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneCore$EcCalibratorStatus;ILjava/lang/Object;)V");
jehan's avatar
jehan committed
164 165
		ecCalibratorStatusClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneCore$EcCalibratorStatus"));
		ecCalibratorStatusFromIntId = env->GetStaticMethodID(ecCalibratorStatusClass,"fromInt","(I)Lorg/linphone/core/LinphoneCore$EcCalibratorStatus;");
166

167
		/*void newSubscriptionRequest(LinphoneCore lc, LinphoneFriend lf, String url)*/
168
		newSubscriptionRequestId = env->GetMethodID(listenerClass,"newSubscriptionRequest","(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneFriend;Ljava/lang/String;)V");
169 170

		/*void notifyPresenceReceived(LinphoneCore lc, LinphoneFriend lf);*/
171
		notifyPresenceReceivedId = env->GetMethodID(listenerClass,"notifyPresenceReceived","(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneFriend;)V");
172 173

		/*void textReceived(LinphoneCore lc, LinphoneChatRoom cr,LinphoneAddress from,String message);*/
174
		textReceivedId = env->GetMethodID(listenerClass,"textReceived","(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneChatRoom;Lorg/linphone/core/LinphoneAddress;Ljava/lang/String;)V");
Simon Morlat's avatar
Simon Morlat committed
175
		messageReceivedId = env->GetMethodID(listenerClass,"messageReceived","(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneChatRoom;Lorg/linphone/core/LinphoneChatMessage;)V");
Sylvain Berfini's avatar
Sylvain Berfini committed
176
		dtmfReceivedId = env->GetMethodID(listenerClass,"dtmfReceived","(Lorg/linphone/core/LinphoneCore;Lorg/linphone/core/LinphoneCall;I)V");
177

178 179 180 181 182
		proxyClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneProxyConfigImpl"));
		proxyCtrId = env->GetMethodID(proxyClass,"<init>", "(J)V");

		callClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneCallImpl"));
		callCtrId = env->GetMethodID(callClass,"<init>", "(J)V");
jehan's avatar
jehan committed
183

184
		chatMessageClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneChatMessageImpl"));
Simon Morlat's avatar
Simon Morlat committed
185
		if (chatMessageClass) chatMessageCtrId = env->GetMethodID(chatMessageClass,"<init>", "(J)V");
186

187 188 189 190 191 192
		chatRoomClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneChatRoomImpl"));
		chatRoomCtrId = env->GetMethodID(chatRoomClass,"<init>", "(J)V");

		friendClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneFriendImpl"));;
		friendCtrId =env->GetMethodID(friendClass,"<init>", "(J)V");

jehan's avatar
jehan committed
193 194 195
		addressClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneAddressImpl"));
		addressCtrId =env->GetMethodID(addressClass,"<init>", "(J)V");

196 197 198 199
		callStatsClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneCallStatsImpl"));
		callStatsId = env->GetMethodID(callStatsClass, "<init>", "(JJ)V");
		callSetAudioStatsId = env->GetMethodID(callClass, "setAudioStats", "(Lorg/linphone/core/LinphoneCallStats;)V");
		callSetVideoStatsId = env->GetMethodID(callClass, "setVideoStats", "(Lorg/linphone/core/LinphoneCallStats;)V");
jehan's avatar
jehan committed
200 201 202 203 204 205 206 207
	}

	~LinphoneCoreData() {
		JNIEnv *env = 0;
		jvm->AttachCurrentThread(&env,NULL);
		env->DeleteGlobalRef(core);
		env->DeleteGlobalRef(listener);
		if (userdata) env->DeleteGlobalRef(userdata);
208
		env->DeleteGlobalRef(listenerClass);
jehan's avatar
jehan committed
209 210 211
		env->DeleteGlobalRef(globalStateClass);
		env->DeleteGlobalRef(registrationStateClass);
		env->DeleteGlobalRef(callStateClass);
212
		env->DeleteGlobalRef(callStatsClass);
213
		env->DeleteGlobalRef(chatMessageStateClass);
jehan's avatar
jehan committed
214 215
		env->DeleteGlobalRef(proxyClass);
		env->DeleteGlobalRef(callClass);
216
		env->DeleteGlobalRef(chatMessageClass);
217 218
		env->DeleteGlobalRef(chatRoomClass);
		env->DeleteGlobalRef(friendClass);
jehan's avatar
jehan committed
219

jehan's avatar
jehan committed
220 221 222 223 224
	}
	jobject core;
	jobject listener;
	jobject userdata;

225
	jclass listenerClass;
jehan's avatar
jehan committed
226
	jmethodID displayStatusId;
227 228 229
	jmethodID newSubscriptionRequestId;
	jmethodID notifyPresenceReceivedId;
	jmethodID textReceivedId;
230
	jmethodID messageReceivedId;
Sylvain Berfini's avatar
Sylvain Berfini committed
231
	jmethodID dtmfReceivedId;
232
	jmethodID callStatsUpdatedId;
233 234 235 236 237 238 239 240 241 242 243 244 245

	jclass globalStateClass;
	jmethodID globalStateId;
	jmethodID globalStateFromIntId;

	jclass registrationStateClass;
	jmethodID registrationStateId;
	jmethodID registrationStateFromIntId;

	jclass callStateClass;
	jmethodID callStateId;
	jmethodID callStateFromIntId;

246 247 248 249 250
	jclass callStatsClass;
	jmethodID callStatsId;
	jmethodID callSetAudioStatsId;
	jmethodID callSetVideoStatsId;

251 252 253
	jclass chatMessageStateClass;
	jmethodID chatMessageStateFromIntId;

254 255
	jmethodID callEncryptionChangedId;

jehan's avatar
jehan committed
256 257 258 259
	jclass ecCalibratorStatusClass;
	jmethodID ecCalibrationStatusId;
	jmethodID ecCalibratorStatusFromIntId;

260 261 262 263 264 265
	jclass proxyClass;
	jmethodID proxyCtrId;

	jclass callClass;
	jmethodID callCtrId;

266 267 268
	jclass chatMessageClass;
	jmethodID chatMessageCtrId;

269 270 271 272 273 274
	jclass chatRoomClass;
	jmethodID chatRoomCtrId;

	jclass friendClass;
	jmethodID friendCtrId;

jehan's avatar
jehan committed
275 276 277
	jclass addressClass;
	jmethodID addressCtrId;

jehan's avatar
jehan committed
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
	LinphoneCoreVTable vTable;

	static void showInterfaceCb(LinphoneCore *lc) {

	}
	static void byeReceivedCb(LinphoneCore *lc, const char *from) {

	}
	static void displayStatusCb(LinphoneCore *lc, const char *message) {
		JNIEnv *env = 0;
		jint result = jvm->AttachCurrentThread(&env,NULL);
		if (result != 0) {
			ms_error("cannot attach VM\n");
			return;
		}
		LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
Sylvain Berfini's avatar
Sylvain Berfini committed
294
		env->CallVoidMethod(lcData->listener,lcData->displayStatusId,lcData->core,message ? env->NewStringUTF(message) : NULL);
jehan's avatar
jehan committed
295 296 297 298 299 300 301
	}
	static void displayMessageCb(LinphoneCore *lc, const char *message) {

	}
	static void authInfoRequested(LinphoneCore *lc, const char *realm, const char *username) {

	}
302 303 304 305 306 307 308 309 310 311 312
	static void globalStateChange(LinphoneCore *lc, LinphoneGlobalState gstate,const char* message) {
		JNIEnv *env = 0;
		jint result = jvm->AttachCurrentThread(&env,NULL);
		if (result != 0) {
			ms_error("cannot attach VM\n");
			return;
		}
		LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
		env->CallVoidMethod(lcData->listener
							,lcData->globalStateId
							,lcData->core
jehan's avatar
jehan committed
313
							,env->CallStaticObjectMethod(lcData->globalStateClass,lcData->globalStateFromIntId,(jint)gstate),
314 315
							message ? env->NewStringUTF(message) : NULL);
	}
jehan's avatar
jehan committed
316
	static void registrationStateChange(LinphoneCore *lc, LinphoneProxyConfig* proxy,LinphoneRegistrationState state,const char* message) {
jehan's avatar
jehan committed
317 318 319 320 321 322 323 324
		JNIEnv *env = 0;
		jint result = jvm->AttachCurrentThread(&env,NULL);
		if (result != 0) {
			ms_error("cannot attach VM\n");
			return;
		}
		LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
		env->CallVoidMethod(lcData->listener
325
							,lcData->registrationStateId
jehan's avatar
jehan committed
326
							,lcData->core
jehan's avatar
jehan committed
327 328
							,env->NewObject(lcData->proxyClass,lcData->proxyCtrId,(jlong)proxy)
							,env->CallStaticObjectMethod(lcData->registrationStateClass,lcData->registrationStateFromIntId,(jint)state),
329
							message ? env->NewStringUTF(message) : NULL);
jehan's avatar
jehan committed
330
	}
331 332 333 334 335 336 337 338
	jobject getCall(JNIEnv *env , LinphoneCall *call){
		jobject jobj=0;

		if (call!=NULL){
			void *up=linphone_call_get_user_pointer(call);
			
			if (up==NULL){
				jobj=env->NewObject(callClass,callCtrId,(jlong)call);
339
				jobj=env->NewGlobalRef(jobj);
340 341 342 343 344 345 346 347 348
				linphone_call_set_user_pointer(call,(void*)jobj);
				linphone_call_ref(call);
			}else{
				jobj=(jobject)up;
			}
		}
		return jobj;
	}

jehan's avatar
jehan committed
349
	static void callStateChange(LinphoneCore *lc, LinphoneCall* call,LinphoneCallState state,const char* message) {
350 351
		JNIEnv *env = 0;
		jint result = jvm->AttachCurrentThread(&env,NULL);
352
		jobject jcall;
353 354 355 356 357 358 359 360
		if (result != 0) {
			ms_error("cannot attach VM\n");
			return;
		}
		LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
		env->CallVoidMethod(lcData->listener
							,lcData->callStateId
							,lcData->core
361
							,(jcall=lcData->getCall(env,call))
jehan's avatar
jehan committed
362
							,env->CallStaticObjectMethod(lcData->callStateClass,lcData->callStateFromIntId,(jint)state),
363
							message ? env->NewStringUTF(message) : NULL);
364 365 366 367
		if (state==LinphoneCallReleased){
			linphone_call_set_user_pointer(call,NULL);
			env->DeleteGlobalRef(jcall);
		}
368
	}
369 370 371 372 373 374 375 376 377 378 379
	static void callEncryptionChange(LinphoneCore *lc, LinphoneCall* call, bool_t encrypted,const char* authentication_token) {
		JNIEnv *env = 0;
		jint result = jvm->AttachCurrentThread(&env,NULL);
		if (result != 0) {
			ms_error("cannot attach VM\n");
			return;
		}
		LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
		env->CallVoidMethod(lcData->listener
							,lcData->callEncryptionChangedId
							,lcData->core
380
							,lcData->getCall(env,call)
381 382 383
							,encrypted
							,authentication_token ? env->NewStringUTF(authentication_token) : NULL);
	}
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
	static void notify_presence_recv (LinphoneCore *lc,  LinphoneFriend *my_friend) {
		JNIEnv *env = 0;
		jint result = jvm->AttachCurrentThread(&env,NULL);
		if (result != 0) {
			ms_error("cannot attach VM\n");
			return;
		}
		LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
		env->CallVoidMethod(lcData->listener
							,lcData->notifyPresenceReceivedId
							,lcData->core
							,env->NewObject(lcData->friendClass,lcData->friendCtrId,(jlong)my_friend));
	}
	static void new_subscription_request (LinphoneCore *lc,  LinphoneFriend *my_friend, const char* url) {
		JNIEnv *env = 0;
		jint result = jvm->AttachCurrentThread(&env,NULL);
		if (result != 0) {
			ms_error("cannot attach VM\n");
			return;
		}
		LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
		env->CallVoidMethod(lcData->listener
							,lcData->newSubscriptionRequestId
							,lcData->core
							,env->NewObject(lcData->friendClass,lcData->friendCtrId,(jlong)my_friend)
							,url ? env->NewStringUTF(url) : NULL);
	}
Sylvain Berfini's avatar
Sylvain Berfini committed
411 412 413 414 415 416 417 418 419 420 421 422 423 424
	static void dtmf_received(LinphoneCore *lc, LinphoneCall *call, int dtmf) {
		JNIEnv *env = 0;
		jint result = jvm->AttachCurrentThread(&env,NULL);
		if (result != 0) {
			ms_error("cannot attach VM\n");
			return;
		}
		LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
		env->CallVoidMethod(lcData->listener
							,lcData->dtmfReceivedId
							,lcData->core
							,lcData->getCall(env,call)
							,dtmf);
	}
425 426 427 428 429 430 431 432 433 434 435 436
	static void text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message) {
		JNIEnv *env = 0;
		jint result = jvm->AttachCurrentThread(&env,NULL);
		if (result != 0) {
			ms_error("cannot attach VM\n");
			return;
		}
		LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
		env->CallVoidMethod(lcData->listener
							,lcData->textReceivedId
							,lcData->core
							,env->NewObject(lcData->chatRoomClass,lcData->chatRoomCtrId,(jlong)room)
jehan's avatar
jehan committed
437
							,env->NewObject(lcData->addressClass,lcData->addressCtrId,(jlong)from)
438 439
							,message ? env->NewStringUTF(message) : NULL);
	}
Sylvain Berfini's avatar
Sylvain Berfini committed
440
	static void message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg) {
441 442 443 444 445 446 447 448 449 450 451 452 453
			JNIEnv *env = 0;
			jint result = jvm->AttachCurrentThread(&env,NULL);
			if (result != 0) {
				ms_error("cannot attach VM\n");
				return;
			}
			LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
			env->CallVoidMethod(lcData->listener
								,lcData->messageReceivedId
								,lcData->core
								,env->NewObject(lcData->chatRoomClass,lcData->chatRoomCtrId,(jlong)room)
								,env->NewObject(lcData->chatMessageClass,lcData->chatMessageCtrId,(jlong)msg));
		}
jehan's avatar
jehan committed
454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473
	static void ecCalibrationStatus(LinphoneCore *lc, LinphoneEcCalibratorStatus status, int delay_ms, void *data) {
		JNIEnv *env = 0;
		jint result = jvm->AttachCurrentThread(&env,NULL);
		if (result != 0) {
			ms_error("cannot attach VM\n");
			return;
		}
		LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
		env->CallVoidMethod(lcData->listener
							,lcData->ecCalibrationStatusId
							,lcData->core
							,env->CallStaticObjectMethod(lcData->ecCalibratorStatusClass,lcData->ecCalibratorStatusFromIntId,(jint)status)
							,delay_ms
							,data ? data : NULL);
		if (data != NULL &&status !=LinphoneEcCalibratorInProgress ) {
			//final state, releasing global ref
			env->DeleteGlobalRef((jobject)data);
		}

	}
474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491
	static void callStatsUpdated(LinphoneCore *lc, LinphoneCall* call, const LinphoneCallStats *stats) {
		JNIEnv *env = 0;
		jobject statsobj;
		jobject callobj;
		jint result = jvm->AttachCurrentThread(&env,NULL);
		if (result != 0) {
			ms_error("cannot attach VM\n");
			return;
		}
		LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data(lc);
		statsobj = env->NewObject(lcData->callStatsClass, lcData->callStatsId, (jlong)call, (jlong)stats);
		callobj = lcData->getCall(env, call);
		if (stats->type == LINPHONE_CALL_STATS_AUDIO)
			env->CallVoidMethod(callobj, lcData->callSetAudioStatsId, statsobj);
		else
			env->CallVoidMethod(callobj, lcData->callSetVideoStatsId, statsobj);
		env->CallVoidMethod(lcData->listener, lcData->callStatsUpdatedId, lcData->core, callobj, statsobj);
	}
492

jehan's avatar
jehan committed
493 494 495 496 497 498 499 500 501

};
extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_newLinphoneCore(JNIEnv*  env
		,jobject  thiz
		,jobject jlistener
		,jstring juserConfig
		,jstring jfactoryConfig
		,jobject  juserdata){

502 503
	const char* userConfig = juserConfig?env->GetStringUTFChars(juserConfig, NULL):NULL;
	const char* factoryConfig = jfactoryConfig?env->GetStringUTFChars(jfactoryConfig, NULL):NULL;
jehan's avatar
jehan committed
504
	LinphoneCoreData* ldata = new LinphoneCoreData(env,thiz,jlistener,juserdata);
505

jehan's avatar
jehan committed
506 507
#ifdef HAVE_ILBC
	libmsilbc_init(); // requires an fpu
Simon Morlat's avatar
Simon Morlat committed
508
#endif
509
#ifdef HAVE_X264
Simon Morlat's avatar
Simon Morlat committed
510
	libmsx264_init();
Simon Morlat's avatar
Simon Morlat committed
511 512 513
#endif
#ifdef HAVE_AMR
	libmsamr_init();
514 515 516
#endif
#ifdef HAVE_SILK
	libmssilk_init();
jehan's avatar
jehan committed
517 518 519
#endif
#ifdef HAVE_G729
	libmsbcg729_init();
jehan's avatar
jehan committed
520
#endif
jehan's avatar
jehan committed
521 522 523 524 525 526 527 528 529
	jlong nativePtr = (jlong)linphone_core_new(	&ldata->vTable
			,userConfig
			,factoryConfig
			,ldata);
	//clear auth info list
	linphone_core_clear_all_auth_info((LinphoneCore*) nativePtr);
	//clear existing proxy config
	linphone_core_clear_proxy_config((LinphoneCore*) nativePtr);

530 531
	if (userConfig) env->ReleaseStringUTFChars(juserConfig, userConfig);
	if (factoryConfig) env->ReleaseStringUTFChars(jfactoryConfig, factoryConfig);
jehan's avatar
jehan committed
532 533
	return nativePtr;
}
Ghislain MARY's avatar
Ghislain MARY committed
534
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_delete(JNIEnv*  env
jehan's avatar
jehan committed
535 536 537 538 539 540 541
		,jobject  thiz
		,jlong lc) {
	LinphoneCoreData* lcData = (LinphoneCoreData*)linphone_core_get_user_data((LinphoneCore*)lc);
	linphone_core_destroy((LinphoneCore*)lc);
	delete lcData;
}

Ghislain MARY's avatar
Ghislain MARY committed
542
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_clearProxyConfigs(JNIEnv* env, jobject thiz,jlong lc) {
jehan's avatar
jehan committed
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
	linphone_core_clear_proxy_config((LinphoneCore*)lc);
}

extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setDefaultProxyConfig(	JNIEnv*  env
		,jobject  thiz
		,jlong lc
		,jlong pc) {
	linphone_core_set_default_proxy((LinphoneCore*)lc,(LinphoneProxyConfig*)pc);
}
extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_getDefaultProxyConfig(	JNIEnv*  env
		,jobject  thiz
		,jlong lc) {
	LinphoneProxyConfig *config=0;
	linphone_core_get_default_proxy((LinphoneCore*)lc,&config);
	return (jlong)config;
}

560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
extern "C" jlongArray Java_org_linphone_core_LinphoneCoreImpl_getProxyConfigList(JNIEnv* env, jobject thiz, jlong lc) {
	const MSList* proxies = linphone_core_get_proxy_config_list((LinphoneCore*)lc);
	int proxyCount = ms_list_size(proxies);
	jlongArray jProxies = env->NewLongArray(proxyCount);
	jlong *jInternalArray = env->GetLongArrayElements(jProxies, NULL);

	for (int i = 0; i < proxyCount; i++ ) {
		jInternalArray[i] = (unsigned long) (proxies->data);
		proxies = proxies->next;
	}

	env->ReleaseLongArrayElements(jProxies, jInternalArray, 0);

	return jProxies;
}

Ghislain MARY's avatar
Ghislain MARY committed
576
extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_addProxyConfig(	JNIEnv*  env
jehan's avatar
jehan committed
577
		,jobject  thiz
jehan's avatar
jehan committed
578
		,jobject jproxyCfg
jehan's avatar
jehan committed
579 580
		,jlong lc
		,jlong pc) {
jehan's avatar
jehan committed
581
	LinphoneProxyConfig* proxy = (LinphoneProxyConfig*)pc;
jehan's avatar
jehan committed
582
	linphone_proxy_config_set_user_data(proxy, env->NewGlobalRef(jproxyCfg));
jehan's avatar
jehan committed
583

Ghislain MARY's avatar
Ghislain MARY committed
584
	return (jint)linphone_core_add_proxy_config((LinphoneCore*)lc,(LinphoneProxyConfig*)pc);
jehan's avatar
jehan committed
585 586
}

Ghislain MARY's avatar
Ghislain MARY committed
587
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_clearAuthInfos(JNIEnv* env, jobject thiz,jlong lc) {
jehan's avatar
jehan committed
588 589 590
	linphone_core_clear_all_auth_info((LinphoneCore*)lc);
}

591 592 593 594
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_refreshRegisters(JNIEnv* env, jobject thiz,jlong lc) {
	linphone_core_refresh_registers((LinphoneCore*)lc);
}

jehan's avatar
jehan committed
595 596 597 598 599 600 601 602 603 604 605
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_addAuthInfo(	JNIEnv*  env
		,jobject  thiz
		,jlong lc
		,jlong pc) {
	linphone_core_add_auth_info((LinphoneCore*)lc,(LinphoneAuthInfo*)pc);
}
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_iterate(	JNIEnv*  env
		,jobject  thiz
		,jlong lc) {
	linphone_core_iterate((LinphoneCore*)lc);
}
606
extern "C" jobject Java_org_linphone_core_LinphoneCoreImpl_invite(	JNIEnv*  env
jehan's avatar
jehan committed
607 608 609 610
		,jobject  thiz
		,jlong lc
		,jstring juri) {
	const char* uri = env->GetStringUTFChars(juri, NULL);
611
	LinphoneCoreData *lcd=(LinphoneCoreData*)linphone_core_get_user_data((LinphoneCore*)lc);
jehan's avatar
jehan committed
612
	LinphoneCall* lCall = linphone_core_invite((LinphoneCore*)lc,uri);
jehan's avatar
jehan committed
613
	env->ReleaseStringUTFChars(juri, uri);
614
	return lcd->getCall(env,lCall);
jehan's avatar
jehan committed
615
}
616
extern "C" jobject Java_org_linphone_core_LinphoneCoreImpl_inviteAddress(	JNIEnv*  env
jehan's avatar
jehan committed
617 618 619
		,jobject  thiz
		,jlong lc
		,jlong to) {
620 621
	LinphoneCoreData *lcd=(LinphoneCoreData*)linphone_core_get_user_data((LinphoneCore*)lc);
	return lcd->getCall(env, linphone_core_invite_address((LinphoneCore*)lc,(LinphoneAddress*)to));
jehan's avatar
jehan committed
622
}
jehan's avatar
jehan committed
623 624 625

extern "C" void Java_org_linphone_core_LinphoneCoreImpl_terminateCall(	JNIEnv*  env
		,jobject  thiz
626 627 628
		,jlong lc
		,jlong call) {
	linphone_core_terminate_call((LinphoneCore*)lc,(LinphoneCall*)call);
jehan's avatar
jehan committed
629
}
jehan's avatar
jehan committed
630

jehan's avatar
jehan committed
631 632 633
extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_getRemoteAddress(	JNIEnv*  env
		,jobject  thiz
		,jlong lc) {
jehan's avatar
jehan committed
634
	return (jlong)linphone_core_get_current_call_remote_address((LinphoneCore*)lc);
jehan's avatar
jehan committed
635
}
jehan's avatar
jehan committed
636 637 638
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_isInCall(	JNIEnv*  env
		,jobject  thiz
		,jlong lc) {
jehan's avatar
jehan committed
639

Ghislain MARY's avatar
Ghislain MARY committed
640
	return (jboolean)linphone_core_in_call((LinphoneCore*)lc);
jehan's avatar
jehan committed
641 642 643 644
}
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_isInComingInvitePending(	JNIEnv*  env
		,jobject  thiz
		,jlong lc) {
jehan's avatar
jehan committed
645

Ghislain MARY's avatar
Ghislain MARY committed
646
	return (jboolean)linphone_core_inc_invite_pending((LinphoneCore*)lc);
jehan's avatar
jehan committed
647 648 649
}
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_acceptCall(	JNIEnv*  env
		,jobject  thiz
650 651
		,jlong lc
		,jlong call) {
jehan's avatar
jehan committed
652

653
	linphone_core_accept_call((LinphoneCore*)lc,(LinphoneCall*)call);
jehan's avatar
jehan committed
654
}
jehan's avatar
jehan committed
655

656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_acceptCallWithParams(JNIEnv *env,
		jobject thiz,
		jlong lc,
		jlong call,
		jlong params){
	linphone_core_accept_call_with_params((LinphoneCore*)lc,(LinphoneCall*)call, (LinphoneCallParams*)params);
}

extern "C" void Java_org_linphone_core_LinphoneCoreImpl_acceptCallUpdate(JNIEnv *env,
		jobject thiz,
		jlong lc,
		jlong call,
		jlong params){
	linphone_core_accept_call_update((LinphoneCore*)lc,(LinphoneCall*)call, (LinphoneCallParams*)params);
}

extern "C" void Java_org_linphone_core_LinphoneCoreImpl_deferCallUpdate(JNIEnv *env,
		jobject thiz,
		jlong lc,
675
		jlong call){
676 677 678
	linphone_core_defer_call_update((LinphoneCore*)lc,(LinphoneCall*)call);
}

jehan's avatar
jehan committed
679 680 681 682 683 684 685 686 687
extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_getCallLog(	JNIEnv*  env
		,jobject  thiz
		,jlong lc
		,jint position) {
		return (jlong)ms_list_nth_data(linphone_core_get_call_logs((LinphoneCore*)lc),position);
}
extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getNumberOfCallLogs(	JNIEnv*  env
		,jobject  thiz
		,jlong lc) {
Ghislain MARY's avatar
Ghislain MARY committed
688
		return (jint)ms_list_size(linphone_core_get_call_logs((LinphoneCore*)lc));
jehan's avatar
jehan committed
689
}
jehan's avatar
jehan committed
690 691 692 693 694 695
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setNetworkStateReachable(	JNIEnv*  env
		,jobject  thiz
		,jlong lc
		,jboolean isReachable) {
		linphone_core_set_network_reachable((LinphoneCore*)lc,isReachable);
}
jehan's avatar
jehan committed
696

697 698 699
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_isNetworkStateReachable(	JNIEnv*  env
		,jobject  thiz
		,jlong lc) {
Ghislain MARY's avatar
Ghislain MARY committed
700
		return (jboolean)linphone_core_is_network_reachable((LinphoneCore*)lc);
701 702
}

jehan's avatar
jehan committed
703
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setPlaybackGain(	JNIEnv*  env
704 705 706
		,jobject  thiz
		,jlong lc
		,jfloat gain) {
jehan's avatar
jehan committed
707
		linphone_core_set_playback_gain_db((LinphoneCore*)lc,gain);
708 709
}

Ghislain MARY's avatar
Ghislain MARY committed
710
extern "C" jfloat Java_org_linphone_core_LinphoneCoreImpl_getPlaybackGain(	JNIEnv*  env
711 712
		,jobject  thiz
		,jlong lc) {
Ghislain MARY's avatar
Ghislain MARY committed
713
		return (jfloat)linphone_core_get_playback_gain_db((LinphoneCore*)lc);
714
}
jehan's avatar
jehan committed
715

jehan's avatar
jehan committed
716 717 718 719 720 721
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_muteMic(	JNIEnv*  env
		,jobject  thiz
		,jlong lc
		,jboolean isMuted) {
		linphone_core_mute_mic((LinphoneCore*)lc,isMuted);
}
jehan's avatar
jehan committed
722 723 724 725 726 727 728 729 730 731

extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_interpretUrl(	JNIEnv*  env
		,jobject  thiz
		,jlong lc
		,jstring jurl) {
	const char* url = env->GetStringUTFChars(jurl, NULL);
	jlong result = (jlong)linphone_core_interpret_url((LinphoneCore*)lc,url);
	env->ReleaseStringUTFChars(jurl, url);
	return result;
}
jehan's avatar
jehan committed
732 733 734 735 736 737
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_sendDtmf(	JNIEnv*  env
		,jobject  thiz
		,jlong lc
		,jchar dtmf) {
	linphone_core_send_dtmf((LinphoneCore*)lc,dtmf);
}
jehan's avatar
jehan committed
738 739 740 741
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_playDtmf(	JNIEnv*  env
		,jobject  thiz
		,jlong lc
		,jchar dtmf
Guillaume Beraudo's avatar
Guillaume Beraudo committed
742 743
		,jint duration) {
	linphone_core_play_dtmf((LinphoneCore*)lc,dtmf,duration);
jehan's avatar
jehan committed
744 745 746 747 748 749 750
}
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_stopDtmf(	JNIEnv*  env
		,jobject  thiz
		,jlong lc) {
	linphone_core_stop_dtmf((LinphoneCore*)lc);
}

Ghislain MARY's avatar
Ghislain MARY committed
751
extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getMissedCallsCount(JNIEnv*  env
752 753
																		,jobject  thiz
																		,jlong lc) {
Ghislain MARY's avatar
Ghislain MARY committed
754
	return (jint)linphone_core_get_missed_calls_count((LinphoneCore*)lc);
755 756
}

757 758 759 760 761 762
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_resetMissedCallsCount(JNIEnv*  env
																		,jobject  thiz
																		,jlong lc) {
	linphone_core_reset_missed_calls_count((LinphoneCore*)lc);
}

763 764 765
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_removeCallLog(JNIEnv*  env
																		,jobject  thiz
																		,jlong lc, jlong log) {
Sylvain Berfini's avatar
Sylvain Berfini committed
766
	linphone_core_remove_call_log((LinphoneCore*)lc, (LinphoneCallLog*) log);
767 768
}

jehan's avatar
jehan committed
769 770 771 772 773
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_clearCallLogs(JNIEnv*  env
																		,jobject  thiz
																		,jlong lc) {
	linphone_core_clear_call_logs((LinphoneCore*)lc);
}
jehan's avatar
jehan committed
774 775 776
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_isMicMuted(	JNIEnv*  env
		,jobject  thiz
		,jlong lc) {
Ghislain MARY's avatar
Ghislain MARY committed
777
	return (jboolean)linphone_core_is_mic_muted((LinphoneCore*)lc);
jehan's avatar
jehan committed
778
}
jehan's avatar
jehan committed
779 780 781 782
extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_findPayloadType(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			,jstring jmime
783 784
																			,jint rate
																			,jint channels) {
jehan's avatar
jehan committed
785
	const char* mime = env->GetStringUTFChars(jmime, NULL);
786
	jlong result = (jlong)linphone_core_find_payload_type((LinphoneCore*)lc,mime,rate,channels);
jehan's avatar
jehan committed
787 788 789
	env->ReleaseStringUTFChars(jmime, mime);
	return result;
}
790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807
extern "C" jlongArray Java_org_linphone_core_LinphoneCoreImpl_listVideoPayloadTypes(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc) {
	const MSList* codecs = linphone_core_get_video_codecs((LinphoneCore*)lc);
	int codecsCount = ms_list_size(codecs);
	jlongArray jCodecs = env->NewLongArray(codecsCount);
	jlong *jInternalArray = env->GetLongArrayElements(jCodecs, NULL);

	for (int i = 0; i < codecsCount; i++ ) {
		jInternalArray[i] = (unsigned long) (codecs->data);
		codecs = codecs->next;
	}

	env->ReleaseLongArrayElements(jCodecs, jInternalArray, 0);

	return jCodecs;
}

Simon Morlat's avatar
Simon Morlat committed
808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
extern "C" jlongArray Java_org_linphone_core_LinphoneCoreImpl_listAudioPayloadTypes(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc) {
	const MSList* codecs = linphone_core_get_audio_codecs((LinphoneCore*)lc);
	int codecsCount = ms_list_size(codecs);
	jlongArray jCodecs = env->NewLongArray(codecsCount);
	jlong *jInternalArray = env->GetLongArrayElements(jCodecs, NULL);

	for (int i = 0; i < codecsCount; i++ ) {
		jInternalArray[i] = (unsigned long) (codecs->data);
		codecs = codecs->next;
	}

	env->ReleaseLongArrayElements(jCodecs, jInternalArray, 0);

	return jCodecs;
}

Ghislain MARY's avatar
Ghislain MARY committed
826
extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_enablePayloadType(JNIEnv*  env
jehan's avatar
jehan committed
827 828 829 830
																			,jobject  thiz
																			,jlong lc
																			,jlong pt
																			,jboolean enable) {
Ghislain MARY's avatar
Ghislain MARY committed
831
	return (jint)linphone_core_enable_payload_type((LinphoneCore*)lc,(PayloadType*)pt,enable);
jehan's avatar
jehan committed
832
}
jehan's avatar
jehan committed
833 834 835 836 837
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_enableEchoCancellation(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			,jboolean enable) {
	linphone_core_enable_echo_cancellation((LinphoneCore*)lc,enable);
Simon Morlat's avatar
Simon Morlat committed
838 839 840 841 842 843
}
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_enableEchoLimiter(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			,jboolean enable) {
	linphone_core_enable_echo_limiter((LinphoneCore*)lc,enable);
jehan's avatar
jehan committed
844 845 846 847 848
}
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_isEchoCancellationEnabled(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			) {
Ghislain MARY's avatar
Ghislain MARY committed
849
	return (jboolean)linphone_core_echo_cancellation_enabled((LinphoneCore*)lc);
jehan's avatar
jehan committed
850
}
jehan's avatar
jehan committed
851

852 853 854 855
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_isEchoLimiterEnabled(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			) {
Ghislain MARY's avatar
Ghislain MARY committed
856
	return (jboolean)linphone_core_echo_limiter_enabled((LinphoneCore*)lc);
857 858
}

859
extern "C" jobject Java_org_linphone_core_LinphoneCoreImpl_getCurrentCall(JNIEnv*  env
jehan's avatar
jehan committed
860 861 862
																			,jobject  thiz
																			,jlong lc
																			) {
863 864 865
	LinphoneCoreData *lcdata=(LinphoneCoreData*)linphone_core_get_user_data((LinphoneCore*)lc);
	
	return lcdata->getCall(env,linphone_core_get_current_call((LinphoneCore*)lc));
jehan's avatar
jehan committed
866
}
867 868 869 870 871 872 873 874 875 876 877 878 879
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_addFriend(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			,jlong aFriend
																			) {
	linphone_core_add_friend((LinphoneCore*)lc,(LinphoneFriend*)aFriend);
}
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setPresenceInfo(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			,jint minute_away
																			,jstring jalternative_contact
																			,jint status) {
880
	const char* alternative_contact = jalternative_contact?env->GetStringUTFChars(jalternative_contact, NULL):NULL;
jehan's avatar
jehan committed
881
	linphone_core_set_presence_info((LinphoneCore*)lc,minute_away,alternative_contact,(LinphoneOnlineStatus)status);
882
	if (alternative_contact) env->ReleaseStringUTFChars(jalternative_contact, alternative_contact);
883
}
jehan's avatar
jehan committed
884

Ghislain MARY's avatar
Ghislain MARY committed
885
extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_createChatRoom(JNIEnv*  env
886 887 888 889 890 891 892
																			,jobject  thiz
																			,jlong lc
																			,jstring jto) {

	const char* to = env->GetStringUTFChars(jto, NULL);
	LinphoneChatRoom* lResult = linphone_core_create_chat_room((LinphoneCore*)lc,to);
	env->ReleaseStringUTFChars(jto, to);
Ghislain MARY's avatar
Ghislain MARY committed
893
	return (jlong)lResult;
894
}
jehan's avatar
jehan committed
895

896 897 898 899 900 901 902 903 904 905 906
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_enableVideo(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			,jboolean vcap_enabled
																			,jboolean display_enabled) {
	linphone_core_enable_video((LinphoneCore*)lc, vcap_enabled,display_enabled);

}
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_isVideoEnabled(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc) {
Ghislain MARY's avatar
Ghislain MARY committed
907
	return (jboolean)linphone_core_video_enabled((LinphoneCore*)lc);
908
}
909 910 911 912 913 914 915 916
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setPlayFile(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			,jstring jpath) {
	const char* path = jpath?env->GetStringUTFChars(jpath, NULL):NULL;
	linphone_core_set_play_file((LinphoneCore*)lc,path);
	if (path) env->ReleaseStringUTFChars(jpath, path);
}
jehan's avatar
jehan committed
917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setRing(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			,jstring jpath) {
	const char* path = jpath?env->GetStringUTFChars(jpath, NULL):NULL;
	linphone_core_set_ring((LinphoneCore*)lc,path);
	if (path) env->ReleaseStringUTFChars(jpath, path);
}
extern "C" jstring Java_org_linphone_core_LinphoneCoreImpl_getRing(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			) {
	const char* path = linphone_core_get_ring((LinphoneCore*)lc);
	if (path) {
		return env->NewStringUTF(path);
	} else {
		return NULL;
	}
}
936 937 938 939 940 941 942 943
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setRootCA(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			,jstring jpath) {
	const char* path = jpath?env->GetStringUTFChars(jpath, NULL):NULL;
	linphone_core_set_root_ca((LinphoneCore*)lc,path);
	if (path) env->ReleaseStringUTFChars(jpath, path);
}
jehan's avatar
jehan committed
944 945 946 947 948
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_enableKeepAlive(JNIEnv*  env
																,jobject  thiz
																,jlong lc
																,jboolean enable) {
	linphone_core_enable_keep_alive((LinphoneCore*)lc,enable);
jehan's avatar
jehan committed
949

jehan's avatar
jehan committed
950 951 952 953
}
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_isKeepAliveEnabled(JNIEnv*  env
																,jobject  thiz
																,jlong lc) {
Ghislain MARY's avatar
Ghislain MARY committed
954
	return (jboolean)linphone_core_keep_alive_enabled((LinphoneCore*)lc);
955

jehan's avatar
jehan committed
956
}
jehan's avatar
jehan committed
957 958 959 960
extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_startEchoCalibration(JNIEnv*  env
																				,jobject  thiz
																				,jlong lc
																				,jobject data) {
Ghislain MARY's avatar
Ghislain MARY committed
961
	return (jint)linphone_core_start_echo_calibration((LinphoneCore*)lc
jehan's avatar
jehan committed
962 963 964 965 966
													, LinphoneCoreData::ecCalibrationStatus
													, data?env->NewGlobalRef(data):NULL);

}

Ghislain MARY's avatar
Ghislain MARY committed
967
extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getMediaEncryption(JNIEnv*  env
968 969 970
																			,jobject  thiz
																			,jlong lc
																			) {
Ghislain MARY's avatar
Ghislain MARY committed
971
	return (jint)linphone_core_get_media_encryption((LinphoneCore*)lc);
972
}
973

974 975 976
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setMediaEncryption(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
Ghislain MARY's avatar
Ghislain MARY committed
977
																			,jint menc) {
978 979
	linphone_core_set_media_encryption((LinphoneCore*)lc,(LinphoneMediaEncryption)menc);
}
980

981
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_mediaEncryptionSupported(JNIEnv*  env
982
																			,jobject  thiz
983
																			,jlong lc, jint menc
984
																			) {
Ghislain MARY's avatar
Ghislain MARY committed
985
	return (jboolean)linphone_core_media_encryption_supported((LinphoneCore*)lc,(LinphoneMediaEncryption)menc);
986
}
987

Ghislain MARY's avatar
Ghislain MARY committed
988
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_isMediaEncryptionMandatory(JNIEnv*  env
989 990 991
																			,jobject  thiz
																			,jlong lc
																			) {
Ghislain MARY's avatar
Ghislain MARY committed
992
	return (jboolean)linphone_core_is_media_encryption_mandatory((LinphoneCore*)lc);
993 994 995 996 997 998 999 1000 1001
}

extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setMediaEncryptionMandatory(JNIEnv*  env
																			,jobject  thiz
																			,jlong lc
																			, jboolean yesno
																			) {
	linphone_core_set_media_encryption_mandatory((LinphoneCore*)lc, yesno);
}
1002

jehan's avatar
jehan committed
1003 1004 1005
//ProxyConfig

extern "C" jlong Java_org_linphone_core_LinphoneProxyConfigImpl_newLinphoneProxyConfig(JNIEnv*  env,jobject  thiz) {
jehan's avatar
jehan committed
1006 1007
	LinphoneProxyConfig* proxy = linphone_proxy_config_new();
	return  (jlong) proxy;