ACLOCAL_FLAGS=-I$(top_srcdir)/m4
-
-INSTALLDIR=$(shell cd $(top_builddir) && pwd)/linphone-install
-INSTALLDIR_WITH_PREFIX=$(INSTALLDIR)/$(prefix)
-ZIPFILE=$(shell cd $(top_builddir) && pwd)/$(PACKAGE)-win32-$(VERSION).zip
-ZIP_EXCLUDED=include lib \
+OPTIONAL_SOUNDS=\
share/sounds/linphone/rings/synth.wav \
share/sounds/linphone/rings/tapping.wav \
share/sounds/linphone/rings/orig.wav \
share/sounds/linphone/rings/rock.wav
+INSTALLDIR=$(shell cd $(top_builddir) && pwd)/linphone-install
+INSTALLDIR_WITH_PREFIX=$(INSTALLDIR)/$(prefix)
+ZIPFILE=$(shell cd $(top_builddir) && pwd)/$(PACKAGE)-win32-$(VERSION).zip
+ZIP_EXCLUDED=include lib \
+ $(OPTIONAL_SOUNDS)
+
+SDK_ZIPFILE=$(shell cd $(top_builddir) && pwd)/lib$(PACKAGE)-win32-$(VERSION).zip
+SDK_EXCLUDED= \
+ bin/linphone-3.exe \
+ lib/*.la \
+ share/linphone \
+ share/pixmaps \
+ share/locale \
+ share/gnome \
+ $(OPTIONAL_SOUNDS)
+
+
GTK_PREFIX=/usr
GTK_FILELIST=gtk+-2.18.5.filelist
GTK_FILELIST_PATH=$(shell cd $(top_srcdir) && pwd)/$(GTK_FILELIST)
cp -f $(top_srcdir)/COPYING $(INSTALLDIR_WITH_PREFIX)/.
cd $(INSTALLDIR_WITH_PREFIX) && zip -r $(ZIPFILE) *
+sdk:
+ rm -f $(SDK_ZIPFILE)
+ rm -rf $(INSTALLDIR)
+ mkdir -p $(INSTALLDIR)
+ make install DESTDIR=$(INSTALLDIR)
+# remove unwanted stuff (gtk interface)
+ cd $(INSTALLDIR_WITH_PREFIX) && rm -rf $(SDK_EXCLUDED)
+ make other-cherrypick
+ cp -f $(top_srcdir)/README $(INSTALLDIR_WITH_PREFIX)/.
+ cp -f $(top_srcdir)/COPYING $(INSTALLDIR_WITH_PREFIX)/.
+ cd $(INSTALLDIR_WITH_PREFIX) && zip -r $(SDK_ZIPFILE) *
+
filelist: zip
cd $(INSTALLDIR_WITH_PREFIX) && \
rm -f $(PACKAGE_WIN32_FILELIST) && \
-linphone-3.3.0 -- May 10, 2010
+linphone-3.3.0 -- May 19, 2010
* liblinphone is ported to iphoneOS and Google Android
* Internal refactoring of liblinphone (code factorisation, encapsulation
of signaling)
libeXosip2 \
libosip2 \
libgsm
-
+# libmsilbc \
LOCAL_MODULE_CLASS = SHARED_LIBRARIES
include $(BUILD_SHARED_LIBRARY)
return sal_address_get_display_name(u);
}
+/**
+ * Returns the display name without quotes.
+ * @note WARNING: the returned string must be freed by user.
+**/
+char *linphone_address_get_display_name_unquoted(const LinphoneAddress *addr){
+ return sal_address_get_display_name_unquoted(addr);
+}
+
/**
* Returns the username.
**/
return tmp;
}
+/**
+ * Returns RTP statistics computed locally regarding the call.
+ *
+**/
+const rtp_stats_t *linphone_call_log_get_local_stats(const LinphoneCallLog *cl){
+ return &cl->local_stats;
+}
+
+/**
+ * Returns RTP statistics computed by remote end and sent back via RTCP.
+ *
+ * @note Not implemented yet.
+**/
+const rtp_stats_t *linphone_call_log_get_remote_stats(const LinphoneCallLog *cl){
+ return &cl->remote_stats;
+}
+
void linphone_call_log_set_user_pointer(LinphoneCallLog *cl, void *up){
cl->user_pointer=up;
}
lp_config_get_int(lc->config,"sip","register_only_when_network_is_up",1);
lc->sip_conf.ping_with_options=lp_config_get_int(lc->config,"sip","ping_with_options",1);
lc->sip_conf.auto_net_state_mon=lp_config_get_int(lc->config,"sip","auto_net_state_mon",1);
+ lc->sip_conf.keepalive_period=lp_config_get_int(lc->config,"sip","keepalive_period",10000);
+ sal_set_keepalive_period(lc->sal,lc->sip_conf.keepalive_period);
}
static void rtp_config_read(LinphoneCore *lc)
call->state=LinphoneCallAVRunning;
}
+static void linphone_call_log_fill_stats(LinphoneCallLog *log, AudioStream *st){
+ audio_stream_get_local_rtp_stats (st,&log->local_stats);
+}
+
void linphone_core_stop_media_streams(LinphoneCore *lc, LinphoneCall *call){
#ifdef PRINTF_DEBUG
printf("%s(%d)\n",__FUNCTION__,__LINE__);
#endif
if (lc->audiostream!=NULL) {
+ linphone_call_log_fill_stats (call->log,lc->audiostream);
audio_stream_stop(lc->audiostream);
lc->audiostream=NULL;
}
lc->a_rtcp=rtcp;
}
+/**
+ * Retrieve RTP statistics regarding current call.
+ * @param local RTP statistics computed locally.
+ * @param remote RTP statistics computed by far end (obtained via RTCP feedback).
+ *
+ * @note Remote RTP statistics is not implemented yet.
+ *
+ * @returns 0 or -1 if no call is running.
+**/
+
+int linphone_core_get_current_call_stats(LinphoneCore *lc, rtp_stats_t *local, rtp_stats_t *remote){
+ LinphoneCall *call=linphone_core_get_current_call (lc);
+ if (call!=NULL){
+ if (lc->audiostream!=NULL){
+ memset(remote,0,sizeof(*remote));
+ audio_stream_get_local_rtp_stats (lc->audiostream,local);
+ return 0;
+ }
+ }
+ return -1;
+}
+
void net_config_uninit(LinphoneCore *lc)
{
net_config_t *config=&lc->net_conf;
lp_config_set_int(lc->config,"sip","use_ipv6",config->ipv6_enabled);
lp_config_set_int(lc->config,"sip","register_only_when_network_is_up",config->register_only_when_network_is_up);
+
lp_config_set_int(lc->config,"sip","default_proxy",linphone_core_get_default_proxy(lc,NULL));
for(elem=config->proxies,i=0;elem!=NULL;elem=ms_list_next(elem),i++){
lp_config_set_int(lc->config,key,"enabled",linphone_core_payload_type_enabled(lc,pt));
index++;
}
+ sprintf(key,"audio_codec_%i",index);
+ lp_config_clean_section (lc->config,key);
+
index=0;
for(node=config->video_codecs;node!=NULL;node=ms_list_next(node)){
pt=(PayloadType*)(node->data);
lp_config_set_string(lc->config,key,"recv_fmtp",pt->recv_fmtp);
index++;
}
+ sprintf(key,"video_codec_%i",index);
+ lp_config_clean_section (lc->config,key);
+
ms_list_free(lc->codecs_conf.audio_codecs);
ms_list_free(lc->codecs_conf.video_codecs);
}
/*
linphone
-Copyright (C) 2000 Simon MORLAT (simon.morlat@linphone.org)
+Copyright (C) 2000 - 2010 Simon MORLAT (simon.morlat@linphone.org)
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
LinphoneAddress * linphone_address_clone(const LinphoneAddress *uri);
const char *linphone_address_get_scheme(const LinphoneAddress *u);
const char *linphone_address_get_display_name(const LinphoneAddress* u);
+char *linphone_address_get_display_name_unquoted(const LinphoneAddress *u);
const char *linphone_address_get_username(const LinphoneAddress *u);
const char *linphone_address_get_domain(const LinphoneAddress *u);
void linphone_address_set_display_name(LinphoneAddress *u, const char *display_name);
int duration; /**<Duration of the call in seconds*/
char *refkey;
void *user_pointer;
+ rtp_stats_t local_stats;
+ rtp_stats_t remote_stats;
struct _LinphoneCore *lc;
} LinphoneCallLog;
void *linphone_call_log_get_user_pointer(const LinphoneCallLog *cl);
void linphone_call_log_set_ref_key(LinphoneCallLog *cl, const char *refkey);
const char *linphone_call_log_get_ref_key(const LinphoneCallLog *cl);
+const rtp_stats_t *linphone_call_log_get_local_stats(const LinphoneCallLog *cl);
+const rtp_stats_t *linphone_call_log_get_remote_stats(const LinphoneCallLog *cl);
char * linphone_call_log_to_str(LinphoneCallLog *cl);
typedef enum{
/*for advanced users:*/
void linphone_core_set_audio_transports(LinphoneCore *lc, RtpTransport *rtp, RtpTransport *rtcp);
+int linphone_core_get_current_call_stats(LinphoneCore *lc, rtp_stats_t *local, rtp_stats_t *remote);
+
#ifdef __cplusplus
}
#endif
#include "linphonecore.h"
#ifdef ANDROID
#include <android/log.h>
+extern "C" void libmsilbc_init();
#endif /*ANDROID*/
extern "C" void ms_andsnd_register_card(JavaVM *jvm) ;
LinphoneCoreData* ldata = new LinphoneCoreData(env,thiz,jlistener,juserdata);
#ifdef ANDROID
ms_andsnd_register_card(jvm);
+ // requires an fpu libmsilbc_init();
#endif /*ANDROID*/
+
jlong nativePtr = (jlong)linphone_core_new( &ldata->vTable
,userConfig
,factoryConfig
bool_t register_only_when_network_is_up;
bool_t ping_with_options;
bool_t auto_net_state_mon;
+ unsigned int keepalive_period; /* interval in ms between keep alive messages sent to the proxy server*/
} sip_config_t;
typedef struct rtp_config
SalAddress * sal_address_clone(const SalAddress *addr);
const char *sal_address_get_scheme(const SalAddress *addr);
const char *sal_address_get_display_name(const SalAddress* addr);
+char *sal_address_get_display_name_unquoted(const SalAddress *addr);
const char *sal_address_get_username(const SalAddress *addr);
const char *sal_address_get_domain(const SalAddress *addr);
void sal_address_set_display_name(SalAddress *addr, const char *display_name);
int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure);
ortp_socket_t sal_get_socket(Sal *ctx);
void sal_set_user_agent(Sal *ctx, const char *user_agent);
+/*keepalive period in ms*/
+void sal_set_keepalive_period(Sal *ctx,unsigned int value);
void sal_use_session_timers(Sal *ctx, int expires);
int sal_iterate(Sal *sal);
MSList * sal_get_pending_auths(Sal *sal);
return 0;
}
-
+static void sal_address_quote_displayname(SalAddress *addr){
+ osip_from_t *u=(osip_from_t*)addr;
+ if (u->displayname!=NULL && u->displayname[0]!='\0'
+ && u->displayname[0]!='"'){
+ int len=strlen(u->displayname)+1+2;
+ char *quoted=osip_malloc(len);
+ snprintf(quoted,len,"\"%s\"",u->displayname);
+ osip_free(u->displayname);
+ u->displayname=quoted;
+ }
+}
SalAddress * sal_address_new(const char *uri){
osip_from_t *from;
osip_from_free(from);
return NULL;
}
+ sal_address_quote_displayname ((SalAddress*)from);
return (SalAddress*)from;
}
return null_if_empty(u->displayname);
}
+char *sal_address_get_display_name_unquoted(const SalAddress *addr){
+ const osip_from_t *u=(const osip_from_t*)addr;
+ const char *dn=null_if_empty(u->displayname);
+ char *ret=NULL;
+ if (dn!=NULL) {
+ char *tmp=osip_strdup_without_quote(dn);
+ ret=ms_strdup(tmp);
+ osip_free(tmp);
+ }
+ return ret;
+}
+
const char *sal_address_get_username(const SalAddress *addr){
const osip_from_t *u=(const osip_from_t*)addr;
return null_if_empty(u->url->username);
osip_free(u->displayname);
u->displayname=NULL;
}
- if (display_name!=NULL)
+ if (display_name!=NULL && display_name[0]!='\0'){
u->displayname=osip_strdup(display_name);
+ sal_address_quote_displayname(addr);
+ }
}
void sal_address_set_username(SalAddress *addr, const char *username){
void sal_address_destroy(SalAddress *u){
osip_from_free((osip_from_t*)u);
}
+void sal_set_keepalive_period(Sal *ctx,unsigned int value) {
+ eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value);
+}
/**
* Send a re-Invite used to hold the current call
LinphoneFriend *lf=(LinphoneFriend*)itf->data;
const LinphoneAddress *f_uri=linphone_friend_get_address(lf);
char *uri=linphone_address_as_string(f_uri);
- const char *name=linphone_address_get_display_name(f_uri);
+ char *name=linphone_address_get_display_name_unquoted (f_uri);
const char *display=name;
char *escaped=NULL;
if (lookup){
}
}
ms_free(uri);
+ if (name!=NULL) ms_free(name);
}
}
void linphone_gtk_show_contact(LinphoneFriend *lf){
GtkWidget *w=linphone_gtk_create_window("contact");
char *uri;
- const char *name;
+ char *name;
const LinphoneAddress *f_uri=linphone_friend_get_address(lf);
uri=linphone_address_as_string_uri_only(f_uri);
- name=linphone_address_get_display_name(f_uri);
+ name=linphone_address_get_display_name_unquoted (f_uri);
if (uri) {
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"sip_address")),uri);
ms_free(uri);
}
if (name){
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"name")),name);
+ ms_free(name);
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"show_presence")),
linphone_friend_get_send_subscribe(lf));
void display_peer_name_in_label(GtkWidget *label, const char *uri){
LinphoneAddress *from;
- const char *displayname=NULL;
+ char *displayname=NULL;
char *id=NULL;
char *uri_label;
from=linphone_address_new(uri);
if (from!=NULL){
-
- if (linphone_address_get_display_name(from))
- displayname=linphone_address_get_display_name(from);
-
+ displayname=linphone_address_get_display_name_unquoted (from);
id=linphone_address_as_string_uri_only(from);
-
}else id=ms_strdup(uri);
- if (displayname!=NULL)
+ if (displayname!=NULL){
uri_label=g_markup_printf_escaped("<span size=\"large\">%s</span>\n<i>%s</i>",
displayname,id);
- else
+ ms_free(displayname);
+ }else
uri_label=g_markup_printf_escaped("<span size=\"large\"><i>%s</i></span>\n",id);
gtk_label_set_markup(GTK_LABEL(label),uri_label);
ms_free(id);
linphone_address_clean(uri);
if (linphone_address_get_display_name(uri)!=NULL){
- display_name=ms_strdup(linphone_address_get_display_name(uri));
+ display_name=linphone_address_get_display_name_unquoted (uri);
}else{
display_name=linphone_address_as_string(uri);
}
/* SIP CONFIG */
contact=linphone_core_get_primary_contact_parsed(lc);
if (contact){
- if (linphone_address_get_display_name(contact))
- gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"displayname")),linphone_address_get_display_name(contact));
+ if (linphone_address_get_display_name(contact)) {
+ char *dn=linphone_address_get_display_name_unquoted (contact);
+ gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"displayname")),dn);
+ ms_free(dn);
+ }
if (linphone_address_get_username(contact))
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"username")),linphone_address_get_username(contact));
}
* {@link LinphoneCoreListener#inviteReceived(LinphoneCore, String)} listener.
* The application can later respond positively to the call using
* this method.
+ * @throws LinphoneCoreException
*/
- public void acceptCall();
+ public void acceptCall() throws LinphoneCoreException;
/**
* @param enable
*/
abstract public void setDebugMode(boolean enable);
-
+
+ abstract public void setLogHandler(LinphoneLogHandler handler);
}
--- /dev/null
+/*
+LinphoneLogHandler.java
+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.
+*/
+package org.linphone.core;
+
+public interface LinphoneLogHandler {
+ public static final int Fatal=1<<4;
+ public static final int Error=1<<3|Fatal;
+ public static final int Warn=1<<2|Error;
+ public static final int Info=1<<1|Warn;
+ public static final int Debug=1|Info;
+
+ public void log(String loggerName, int level, String levelString, String msg, Throwable e);
+}
}
public LinphoneCoreException(Throwable e) {
+ this(e.getClass().getName()+" "+ e.getMessage());
mE = e;
}
public void printStackTrace() {
super.printStackTrace();
- mE.printStackTrace();
+ if (mE!=null) mE.printStackTrace();
}
mediastreamer2/src/void.c
mediastreamer2/src/equalizer.c
mediastreamer2/src/msdscap-mingw.cc
+mediastreamer2/src/drawdib-display.c