Commit 2f4c187e authored by jehan's avatar jehan
Browse files

Merge branch 'master' of git://git.linphone.org/linphone

parents 6a53afc4 0bd44b5c
linphone-3.xxx --
linphone-3.6.0 -- May 27, 2013
UI:
* new friend list and chat messaging UI
* enhanced call history
* call and conference audio recording
* persistent chat history
* DSCP settings for SIP and RTP
* display of call statistics (when clicking on the quality indicator bar)
core:
* ICE for efficient RTP exchange
* fix bug in zRTP support (upgrade required)
*
* call recording
* uPnP
* call statistics
* adaptive bitrate control improvements
* faster call quality indicator feedback
* DSCP settings for SIP and RTP
* detailed call statistics feedback API
Requires: mediastreamer2 = 2.9.0 and ortp = 0.22.0
linphone-3.5.2 -- February 22, 2012
* updated oRTP to 0.20.0
......
......@@ -8,29 +8,35 @@ This is Linphone, a free (GPL) video softphone based on the SIP protocol.
- intltool
- you need at least:
- libosip2>=3.0.3
- libeXosip2>=3.0.3
- libosip2>=3.5.0
- libeXosip2>=3.5.0
- speex>=1.2.0 (including libspeexdsp part)
+ if you want the gtk/glade interface:
- libgtk >=2.16.0
+ if you want video support:
- SDL>=1.2.10
- libvpx (VP8 codec)
- libavcodec (ffmpeg)
- libswscale (part of ffmpeg too) for better scaling performance
- libxv (x11 video extension)
- ligl1-mesa (OpenGL API -- GLX development files)
- libglew (OpenGL Extension Wrangler library)
- libv4l (Video for linux)
- libx11 (x11)
- ligl1-mesa (OpenGL API -- GLX development files)
- libglew (OpenGL Extension Wrangler library)
- libv4l (Video for linux)
- libx11 (x11)
- theora (optional)
+ gsm codec (gsm source package or libgsm-dev or gsm-devel) (optional)
+ libreadline (optional: for convenient command line in linphonec)
+ libsoup (optional: for wizard - account creation assistant)
+ libsqlite3 (optional : for a local history of messages)
+ libsqlite3 (optional : for a local history of chat messages)
+ if you want uPnP support (optional):
- libupnp (version 1.6 branch (not patched with 18-url-upnpstrings.patch))
Here is the command line to get these dependencies installed for Ubuntu && Debian
$ sudo apt-get install libtool intltool libgtk2.0-dev libosip2-dev libexosip2-dev libspeexdsp-dev libavcodec-dev libswscale-dev libx11-dev libvx-dev ligl1-mesa-dev libglew-dev libv4l-dev
+ for optional library
$ sudo apt-get install libreadline-dev liggsm1-dev libtheora-dev libsoup2.4-dev libsqlit3-dev libupnp6-dev
+ Install srtp (optional) for call encryption :
$ git clone git://git.linphone.org/srtp.git
......@@ -43,22 +49,15 @@ This is Linphone, a free (GPL) video softphone based on the SIP protocol.
$ cd zrtpcpp && cmake -Denable-ccrtp=false . && make
$ sudo make install
with their corresponding -dev or -devel package if you don't use source packages.
- Compile linphone
$ ./autogen.sh
$ ./configure
$ sudo make install
$ make && sudo make install
$ sudo ldconfig
- Command line for Ubuntu && Debian
$ sudo apt-get install libtool intltool libgtk2.0-dev libosip2-dev libexosip2-dev libspeexdsp-dev libavcodec-dev libswscale-dev libx11-dev libvx-dev ligl1-mesa-dev libglew-dev libv4l-dev
+ for optional library
$ sudo apt-get install libreadline-dev liggsm1-dev libtheora-dev libsoup2.4-dev libsqlit3-dev libupnp6-dev
For windows compilation see README.mingw.
For macOS X, see README.macos
......
......@@ -136,11 +136,21 @@ libgnutls (from the web)
libgsm (from the web)
libxml2 (compiled)
libsoup (compiled)
libsqlite3 (compiled)
Remarks:
For every package compiled that goes into linphone-deps, .la files (libtool files) must be removed to avoid libtool errors.
When running "make install DESTDIR=<somepath>", somepath must be absolute and should not contain any ~ or space.
- building sqlite3
* download the sources on the following website:
http://www.sqlite.org/download.html (choose the sqlite-autoconf-3XXX.tar.gz)
* install:
./configure
make && make install DESTDIR=/home/<myuser>/sqlite3-install
then copy the content of ~/sqlite3-install/usr/local/ into linphone-deps/.
- building ffmpeg
./configure --enable-shared --disable-static --enable-memalign-hack --extra-cflags="-fno-common" --enable-gpl && make
make install DESTDIR=/home/<myuser>/ffmpeg-install
......@@ -152,6 +162,7 @@ When running "make install DESTDIR=<somepath>", somepath must be absolute and sh
./configure --enable-shared --disable-static && make && make install DESTDIR=/home/<myuser>/libxml2-install
copy ~/libxml2-install/usr/local/* into linphone-deps/.
- building x264:
* download yasm normal version windows executable from yasm project page:
......
......@@ -35,7 +35,13 @@ endif
LOCAL_MODULE := liblinphonenoneon
ifeq ($(TARGET_ARCH_ABI),armeabi)
LOCAL_MODULE_FILENAME := liblinphonearmv5
LOCAL_MODULE_FILENAME := liblinphonearmv5noneon
endif
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_MODULE_FILENAME := liblinphonearmv7noneon
endif
ifeq ($(TARGET_ARCH_ABI),x86)
LOCAL_MODULE_FILENAME := liblinphonex86
endif
include $(BUILD_SHARED_LIBRARY)
......
......@@ -34,6 +34,9 @@ LOCAL_SHARED_LIBRARIES += \
endif
LOCAL_MODULE := liblinphone
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_MODULE_FILENAME := liblinphonearmv7
endif
include $(BUILD_SHARED_LIBRARY)
......
dnl Process this file with autoconf to produce a configure script.
AC_INIT([linphone],[3.5.99.0],[linphone-developers@nongnu.org])
AC_INIT([linphone],[3.6.0],[linphone-developers@nongnu.org])
AC_CANONICAL_SYSTEM
AC_CONFIG_SRCDIR([coreapi/linphonecore.c])
......@@ -656,9 +656,7 @@ AC_ARG_ENABLE(tunnel,
AM_CONDITIONAL(BUILD_TUNNEL, test x$enable_tunnel = xtrue)
if test x$enable_tunnel = xtrue; then
PKG_CHECK_MODULES(TUNNEL, tunnel >= 0.3.3)
TUNNEL_CFLAGS+="-DTUNNEL_ENABLED"
AC_SUBST(TUNNEL_CFLAGS)
AC_SUBST(TUNNEL_LIBS)
AC_DEFINE(TUNNEL_ENABLED,1,[Tells tunnel extension is built-in])
fi
AC_ARG_ENABLE(msg-storage,
......
......@@ -1400,6 +1400,7 @@ copy_file(const char *from, const char *to)
snprintf(message, 255, "Can't open %s for writing: %s\n",
to, strerror(errno));
fprintf(stderr, "%s", message);
fclose(in);
return 0;
}
......@@ -1408,6 +1409,8 @@ copy_file(const char *from, const char *to)
{
if ( ! fwrite(buf, 1, n, out) )
{
fclose(in);
fclose(out);
return 0;
}
}
......
......@@ -189,7 +189,7 @@ bool TunnelManager::isStarted() {
}
bool TunnelManager::isReady() const {
return mTunnelClient && mTunnelClient->isReady();
return mTunnelClient && mTunnelClient->isReady() && mReady;
}
int TunnelManager::customSendto(struct _RtpTransport *t, mblk_t *msg , int flags, const struct sockaddr *to, socklen_t tolen){
......@@ -214,6 +214,7 @@ TunnelManager::TunnelManager(LinphoneCore* lc) :TunnelClientController()
,mEnabled(false)
,mTunnelClient(NULL)
,mAutoDetectStarted(false)
,mReady(false)
,mHttpProxyPort(0){
mExosipTransport.data=this;
......@@ -271,6 +272,7 @@ void TunnelManager::processTunnelEvent(const Event &ev){
if (lProxy) {
linphone_proxy_config_done(lProxy);
}
mReady=true;
}else if (mEnabled && !mTunnelClient->isReady()){
/* we got disconnected from the tunnel */
if (lProxy && linphone_proxy_config_is_registered(lProxy)) {
......@@ -278,6 +280,7 @@ void TunnelManager::processTunnelEvent(const Event &ev){
linphone_proxy_config_edit(lProxy);
linphone_core_iterate(mCore);
}
mReady=false;
}
}
......@@ -317,7 +320,7 @@ void TunnelManager::enable(bool isEnable) {
mEnabled=false;
stopClient();
mReady=false;
linphone_core_set_rtp_transport_factories(mCore,NULL);
eXosip_transport_hook_register(NULL);
......
......@@ -129,6 +129,7 @@ class UdpMirrorClient;
*/
LinphoneCore *getLinphoneCore();
virtual void setHttpProxy(const char *host,int port, const char *username, const char *passwd);
virtual bool isReady() const;
private:
enum EventType{
UdpMirrorClientEvent,
......@@ -143,7 +144,6 @@ class UdpMirrorClient;
};
typedef std::list<UdpMirrorClient> UdpMirrorClientList;
virtual bool isStarted();
virtual bool isReady() const;
void onIterate();
static int customSendto(struct _RtpTransport *t, mblk_t *msg , int flags, const struct sockaddr *to, socklen_t tolen);
static int customRecvfrom(struct _RtpTransport *t, mblk_t *msg, int flags, struct sockaddr *from, socklen_t *fromlen);
......@@ -173,6 +173,7 @@ class UdpMirrorClient;
Mutex mMutex;
static Mutex sMutex;
bool mAutoDetectStarted;
bool mReady;
LinphoneRtpTransportFactories mTransportFactories;
std::string mHttpUserName;
std::string mHttpPasswd;
......
......@@ -351,7 +351,8 @@ static void call_accepted(SalOp *op){
#endif //BUILD_UPNP
md=sal_call_get_final_media_description(op);
call->params.has_video &= linphone_core_media_description_contains_video_stream(md);
if (md)
call->params.has_video &= linphone_core_media_description_contains_video_stream(md);
if (call->state==LinphoneCallOutgoingProgress ||
call->state==LinphoneCallOutgoingRinging ||
......
......@@ -182,7 +182,6 @@ float linphone_core_get_conference_local_input_volume(LinphoneCore *lc){
* @returns 0 if successful, -1 otherwise.
**/
int linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call){
LinphoneCallParams params;
LinphoneConference *conf=&lc->conf_ctx;
if (call->current_params.in_conference){
......@@ -190,21 +189,25 @@ int linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call){
return -1;
}
conference_check_init(&lc->conf_ctx, lp_config_get_int(lc->config, "sound","conference_rate",16000));
call->params.in_conference=TRUE;
call->params.has_video=FALSE;
call->params.media_encryption=LinphoneMediaEncryptionNone;
params=call->params;
if (call->state==LinphoneCallPaused)
if (call->state==LinphoneCallPaused){
call->params.in_conference=TRUE;
call->params.has_video=FALSE;
linphone_core_resume_call(lc,call);
else if (call->state==LinphoneCallStreamsRunning){
/*this will trigger a reINVITE that will later redraw the streams */
}else if (call->state==LinphoneCallStreamsRunning){
LinphoneCallParams *params=linphone_call_params_copy(linphone_call_get_current_params(call));
params->in_conference=TRUE;
params->has_video=FALSE;
if (call->audiostream || call->videostream){
linphone_call_stop_media_streams (call); /*free the audio & video local resources*/
}
if (call==lc->current_call){
lc->current_call=NULL;
}
linphone_core_update_call(lc,call,&params);
/*this will trigger a reINVITE that will later redraw the streams */
linphone_core_update_call(lc,call,params);
linphone_call_params_destroy(params);
add_local_endpoint(conf,lc);
}else{
ms_error("Call is in state %s, it cannot be added to the conference.",linphone_call_state_to_string(call->state));
......@@ -231,13 +234,16 @@ static int remove_from_conference(LinphoneCore *lc, LinphoneCall *call, bool_t a
ms_message("%s will be removed from conference", str);
ms_free(str);
if (active){
LinphoneCallParams *params=linphone_call_params_copy(linphone_call_get_current_params(call));
params->in_conference=FALSE;
// reconnect local audio with this call
if (linphone_core_is_in_conference(lc)){
ms_message("Leaving conference for reconnecting with unique call.");
linphone_core_leave_conference(lc);
}
ms_message("Updating call to actually remove from conference");
err=linphone_core_update_call(lc,call,&call->params);
err=linphone_core_update_call(lc,call,params);
linphone_call_params_destroy(params);
} else{
ms_message("Pausing call to actually remove from conference");
err=_linphone_core_pause_call(lc,call);
......
......@@ -36,7 +36,7 @@ static void ecc_init_filters(EcCalibrator *ecc){
params.prio=MS_TICKER_PRIO_HIGH;
ecc->ticker=ms_ticker_new_with_params(&params);
ecc->sndread=ms_snd_card_create_reader(ecc->play_card);
ecc->sndread=ms_snd_card_create_reader(ecc->capt_card);
ms_filter_call_method(ecc->sndread,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate);
ms_filter_call_method(ecc->sndread,MS_FILTER_GET_SAMPLE_RATE,&rate);
ms_filter_call_method(ecc->sndread,MS_FILTER_SET_NCHANNELS,&ecc_channels);
......@@ -50,7 +50,7 @@ static void ecc_init_filters(EcCalibrator *ecc){
ecc->det=ms_filter_new(MS_TONE_DETECTOR_ID);
ms_filter_call_method(ecc->det,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate);
ecc->rec=ms_filter_new(MS_FILE_REC_ID);
ecc->rec=ms_filter_new(MS_VOID_SINK_ID);
ms_filter_link(ecc->sndread,0,ecc->read_resampler,0);
ms_filter_link(ecc->read_resampler,0,ecc->det,0);
......@@ -60,7 +60,7 @@ static void ecc_init_filters(EcCalibrator *ecc){
ecc->gen=ms_filter_new(MS_DTMF_GEN_ID);
ms_filter_call_method(ecc->gen,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate);
ecc->write_resampler=ms_filter_new(MS_RESAMPLE_ID);
ecc->sndwrite=ms_snd_card_create_writer(ecc->capt_card);
ecc->sndwrite=ms_snd_card_create_writer(ecc->play_card);
ms_filter_call_method(ecc->sndwrite,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate);
ms_filter_call_method(ecc->sndwrite,MS_FILTER_GET_SAMPLE_RATE,&rate);
......
......@@ -233,6 +233,10 @@ bool_t linphone_tunnel_enabled(LinphoneTunnel *tunnel){
return bcTunnel(tunnel)->isEnabled();
}
bool_t linphone_tunnel_connected(LinphoneTunnel *tunnel){
return bcTunnel(tunnel)->isReady();
}
static OrtpLogFunc tunnelOrtpLogHandler=NULL;
/*
......
......@@ -165,6 +165,12 @@ void linphone_tunnel_enable(LinphoneTunnel *tunnel, bool_t enabled);
**/
bool_t linphone_tunnel_enabled(LinphoneTunnel *tunnel);
/**
* @param tunnel object
* Returns a boolean indicating whether tunnel is connected successfully.
**/
bool_t linphone_tunnel_connected(LinphoneTunnel *tunnel);
/**
* @param tunnel object
* Forces reconnection to the tunnel server.
......
......@@ -59,6 +59,10 @@ bool_t linphone_tunnel_enabled(LinphoneTunnel *tunnel){
return FALSE;
}
bool_t linphone_tunnel_connected(LinphoneTunnel *tunnel){
return FALSE;
}
void linphone_tunnel_enable_logs_with_handler(LinphoneTunnel *tunnel, bool_t enabled, OrtpLogFunc logHandler){
}
......
......@@ -84,9 +84,11 @@ static bool_t linphone_call_are_all_streams_encrypted(LinphoneCall *call) {
#ifdef VIDEO_ENABLED
// If video enabled, check ZRTP encryption in videostream
const LinphoneCallParams *params=linphone_call_get_current_params(call);
if (params->has_video && !call->videostream_encrypted) {
return FALSE;
{
const LinphoneCallParams *params=linphone_call_get_current_params(call);
if (params->has_video && !call->videostream_encrypted) {
return FALSE;
}
}
#endif
......@@ -110,9 +112,9 @@ void propagate_encryption_changed(LinphoneCall *call){
#ifdef VIDEO_ENABLED
static void linphone_call_videostream_encryption_changed(void *data, bool_t encrypted){
ms_message("Video stream is %s", encrypted ? "encrypted" : "not encrypted");
LinphoneCall *call = (LinphoneCall *)data;
ms_message("Video stream is %s", encrypted ? "encrypted" : "not encrypted");
call->videostream_encrypted=encrypted;
propagate_encryption_changed(call);
}
......@@ -135,12 +137,14 @@ static void linphone_call_audiostream_encryption_changed(void *data, bool_t encr
#ifdef VIDEO_ENABLED
// Enable video encryption
const LinphoneCallParams *params=linphone_call_get_current_params(call);
if (params->has_video) {
ms_message("Trying to enable encryption on video stream");
OrtpZrtpParams params;
params.zid_file=NULL; //unused
video_stream_enable_zrtp(call->videostream,call->audiostream,&params);
{
const LinphoneCallParams *params=linphone_call_get_current_params(call);
if (params->has_video) {
OrtpZrtpParams params;
ms_message("Trying to enable encryption on video stream");
params.zid_file=NULL; //unused
video_stream_enable_zrtp(call->videostream,call->audiostream,&params);
}
}
#endif
}
......@@ -1627,11 +1631,11 @@ static void linphone_call_start_video_stream(LinphoneCall *call, const char *cna
const char *rtcp_addr=vstream->rtcp_addr[0]!='\0' ? vstream->rtcp_addr : call->resultdesc->addr;
call->video_profile=make_profile(call,call->resultdesc,vstream,&used_pt);
if (used_pt!=-1){
call->current_params.video_codec = rtp_profile_get_payload(call->video_profile, used_pt);
VideoStreamDir dir=VideoStreamSendRecv;
MSWebCam *cam=lc->video_conf.device;
bool_t is_inactive=FALSE;
call->current_params.video_codec = rtp_profile_get_payload(call->video_profile, used_pt);
call->current_params.has_video=TRUE;
video_stream_enable_adaptive_bitrate_control(call->videostream,
......@@ -1701,9 +1705,6 @@ static void linphone_call_start_video_stream(LinphoneCall *call, const char *cna
void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_muted, bool_t send_ringbacktone){
LinphoneCore *lc=call->core;
call->current_params.audio_codec = NULL;
call->current_params.video_codec = NULL;
LinphoneAddress *me=linphone_core_get_primary_contact_parsed(lc);
char *cname;
bool_t use_arc=linphone_core_adaptive_rate_control_enabled(lc);
......@@ -1712,6 +1713,9 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut
SalProtoRtpAvp,SalVideo);
#endif
call->current_params.audio_codec = NULL;
call->current_params.video_codec = NULL;
if ((call->audiostream == NULL) && (call->videostream == NULL)) {
ms_fatal("start_media_stream() called without prior init !");
return;
......
......@@ -825,6 +825,7 @@ typedef struct codec_desc{
}codec_desc_t;
static codec_desc_t codec_pref_order[]={
{"opus", 48000},
{"SILK", 16000},
{"speex", 16000},
{"speex", 8000},
......@@ -1285,8 +1286,9 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta
linphone_core_assign_payload_type(lc,&payload_type_silk_wb,-1,NULL);
linphone_core_assign_payload_type(lc,&payload_type_silk_swb,-1,NULL);
linphone_core_assign_payload_type(lc,&payload_type_g729,18,"annexb=no");
linphone_core_assign_payload_type(lc,&payload_type_aaceld_22k,-1,"config=F8EE2000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=24; sizeLength=13; streamType=5");
linphone_core_assign_payload_type(lc,&payload_type_aaceld_44k,-1,"config=F8E82000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=24; sizeLength=13; streamType=5");
linphone_core_assign_payload_type(lc,&payload_type_aaceld_22k,-1,"config=F8EE2000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=76; sizeLength=13; streamType=5");
linphone_core_assign_payload_type(lc,&payload_type_aaceld_44k,-1,"config=F8E82000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=76; sizeLength=13; streamType=5");
linphone_core_assign_payload_type(lc,&payload_type_opus,-1,"useinbandfec=1; usedtx=1");
linphone_core_handle_static_payloads(lc);
ms_init();
......@@ -2838,10 +2840,13 @@ int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call){
**/
int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params){
int err=0;
#ifdef VIDEO_ENABLED
bool_t has_video = FALSE;
#endif
if (params!=NULL){
linphone_call_set_state(call,LinphoneCallUpdating,"Updating call");
#ifdef VIDEO_ENABLED
bool_t has_video = call->params.has_video;
has_video = call->params.has_video;
// Video removing
if((call->videostream != NULL) && !params->has_video) {
......@@ -4190,7 +4195,7 @@ const char * linphone_core_get_stun_server(const LinphoneCore *lc){
return lc->net_conf.stun_server;
}
bool_t linphone_core_upnp_available(const LinphoneCore *lc){
bool_t linphone_core_upnp_available(){
#ifdef BUILD_UPNP
return TRUE;
#else
......@@ -4677,9 +4682,9 @@ unsigned long linphone_core_get_native_preview_window_id(const LinphoneCore *lc)
* If not set the core will create its own window.
**/
void linphone_core_set_native_preview_window_id(LinphoneCore *lc, unsigned long id){
lc->preview_window_id=id;
#ifdef VIDEO_ENABLED
LinphoneCall *call=linphone_core_get_current_call(lc);
lc->preview_window_id=id;
if (call!=NULL && call->videostream){
video_stream_set_native_preview_window_id(call->videostream,id);
}else if (lc->previewstream){
......@@ -4693,8 +4698,8 @@ void linphone_core_set_native_preview_window_id(LinphoneCore *lc, unsigned long
**/
void linphone_core_show_video(LinphoneCore *lc, bool_t show){
#ifdef VIDEO_ENABLED
ms_error("linphone_core_show_video %d", show);
LinphoneCall *call=linphone_core_get_current_call(lc);
ms_error("linphone_core_show_video %d", show);
if (call!=NULL && call->videostream){
video_stream_show_video(call->videostream,show);
}
......@@ -4730,9 +4735,11 @@ void linphone_core_set_device_rotation(LinphoneCore *lc, int rotation) {
ms_message("%s : rotation=%d\n", __FUNCTION__, rotation);
lc->device_rotation = rotation;
#ifdef VIDEO_ENABLED
LinphoneCall *call=linphone_core_get_current_call(lc);
if (call!=NULL && call->videostream){
video_stream_set_device_rotation(call->videostream,rotation);
{
LinphoneCall *call=linphone_core_get_current_call(lc);
if (call!=NULL && call->videostream){
video_stream_set_device_rotation(call->videostream,rotation);
}
}
#endif
}
......
......@@ -1199,10 +1199,9 @@ const char * linphone_core_get_stun_server(const LinphoneCore *lc);
* @ingroup network_parameters
* Return the availability of uPnP.
*
* @param lc #LinphoneCore
* @return true if uPnP is available otherwise return false.
*/
bool_t linphone_core_upnp_available(const LinphoneCore *lc);
bool_t linphone_core_upnp_available();
/**
* @ingroup network_parameters
......
......@@ -2491,7 +2491,7 @@ extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_getConfig(JNIEnv *env,
}
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_upnpAvailable(JNIEnv *env, jobject thiz, jlong lc) {
return (jboolean) linphone_core_upnp_available((LinphoneCore *)lc);
return (jboolean) linphone_core_upnp_available();
}
extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getUpnpState(JNIEnv *env, jobject thiz, jlong lc) {
......
......@@ -204,13 +204,13 @@ void linphone_create_table(sqlite3* db){
void linphone_core_message_storage_init(LinphoneCore *lc){
int ret;
char *errmsg=NULL;
const char *errmsg;
sqlite3 *db;
ret=sqlite3_open(lc->chat_db_file,&db);
if(ret != SQLITE_OK) {
errmsg=sqlite3_errmsg(db);
printf("Error in the opening: %s.\n", errmsg);
sqlite3_close(db);
sqlite3_free(errmsg);
}
linphone_create_table(db);
lc->db=db;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment