mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-01-19 20:18:09 +00:00
Merge branch 'master' of git.savannah.nongnu.org:/srv/git/linphone
This commit is contained in:
commit
b5d536b8a4
29 changed files with 11756 additions and 5289 deletions
|
|
@ -62,9 +62,6 @@ PACKAGE_WIN32_FILELIST=$(PACKAGE)-win32.filelist
|
|||
PACKAGE_BUNDLE_FILE=$(top_srcdir)/build/macos/$(PACKAGE).bundle
|
||||
|
||||
EXTRA_DIST = config.rpath BUGS linphone.kdevelop \
|
||||
intltool-extract.in \
|
||||
intltool-merge.in \
|
||||
intltool-update.in \
|
||||
README.arm \
|
||||
README.mingw \
|
||||
README.macos \
|
||||
|
|
@ -75,7 +72,7 @@ EXTRA_DIST = config.rpath BUGS linphone.kdevelop \
|
|||
$(LINPHONEDEPS_FILELIST) \
|
||||
$(ISS_SCRIPT).in
|
||||
|
||||
DISTCLEANFILES= intltool-extract intltool-merge intltool-update po/stamp-it po/.intltool-merge-cache $(ISS_SCRIPT) $(PACKAGE_WIN32_FILELIST)
|
||||
DISTCLEANFILES= $(ISS_SCRIPT) $(PACKAGE_WIN32_FILELIST)
|
||||
|
||||
CLEANFILES=Portfile Portfile-devel
|
||||
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ fi
|
|||
|
||||
dnl Add the languages which your application supports here.
|
||||
PKG_PROG_PKG_CONFIG
|
||||
ALL_LINGUAS="fr it de ja es pl cs nl sv pt_BR hu ru zh_CN"
|
||||
ALL_LINGUAS="fr it de ja es pl cs nl sv pt_BR hu ru zh_CN nb_NO"
|
||||
AC_SUBST(ALL_LINGUAS)
|
||||
AC_DEFINE_UNQUOTED(LINPHONE_ALL_LANGS, "$ALL_LINGUAS", [All supported languages])
|
||||
|
||||
|
|
@ -239,7 +239,9 @@ fi
|
|||
if test "$relativeprefix" = "auto" ; then
|
||||
case $target_os in
|
||||
*darwin*)
|
||||
relativeprefix=yes
|
||||
if test "$enable_x11" = "false" ; then
|
||||
relativeprefix=yes
|
||||
fi
|
||||
;;
|
||||
*mingw*)
|
||||
relativeprefix=yes
|
||||
|
|
|
|||
|
|
@ -205,7 +205,7 @@ void text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddre
|
|||
* @ingroup port
|
||||
*<br>
|
||||
<b>Multitasking</b>
|
||||
<br> liblinphone for IOS natively supports multitasking assuming application follows multitasking guides provided by Apple. First step is to declare application as multitasked. It means adding background mode for both audio and voip to Info.plist file.
|
||||
<br> Liblinphone for IOS natively supports multitasking assuming application follows multitasking guides provided by Apple. First step is to declare application as multitasked. It means adding background mode for both audio and voip to Info.plist file.
|
||||
<br>
|
||||
\code
|
||||
<key>UIBackgroundModes</key>
|
||||
|
|
@ -216,9 +216,9 @@ void text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddre
|
|||
\endcode
|
||||
<br>
|
||||
<ul>
|
||||
<li><b>SIP socket </b> Recommanded mode is TCP, because UDP requires keep alives for maintaining NAT association at the IP router level.
|
||||
Unfortunnatly, UDP keep alives are not possible on IOS. For TCP, liblinphone automatically configures SIP socket for voip (I.E kCFStreamNetworkServiceType set to kCFStreamNetworkServiceTypeVoIP).
|
||||
For UDP, it is the responsability of application to set this property of the UDP SIP socket before entering in background. For UDP, the application can access the SIP socket from method #linphone_core_get_sip_socket(). Note this property is only settable on a connected socket. As liblinphone UDP socket are not connected, application willing to enable UDP bacground mode must first connect the UDP sip socket before configuring the voip mode. Pseudo code belows show the different steps:
|
||||
<li><b>SIP socket </b><br>Recommended mode is SIP over TCP, because UDP usually requires frequent keep alives for maintaining NAT association at the IP router level. This can be as frequent as one UDP packet every 15 seconds to maintain the NAT association accross NAT routers. Doing such drains the battery very fast, and furthermore the iOS keep-alive designed by Apple to handle this task can only be called with a minimum of 10 minutes interval.<br>
|
||||
For TCP, liblinphone automatically configures SIP socket for voip (I.E kCFStreamNetworkServiceType set to kCFStreamNetworkServiceTypeVoIP). <br>
|
||||
In the event that an application really wants to use UDP, it is the responsability of application to set this property to the UDP SIP socket before entering in background. It can access the SIP socket from method #linphone_core_get_sip_socket(). Note this property is only settable on a connected socket. As liblinphone UDP sockets are not connected, application willing to enable UDP background mode must first connect the UDP sip socket before configuring the voip mode. Pseudo code below shows the different steps:
|
||||
\code
|
||||
//get sip socket
|
||||
CFReadStreamRef mReadStream
|
||||
|
|
@ -254,10 +254,11 @@ For UDP, it is the responsability of application to set this property of the UDP
|
|||
|
||||
\endcode
|
||||
<br> Note this operation has to be performed every time the application enters in background mode.
|
||||
<br> Anyway, for battery saving, UDP background mode is not recomnmanded
|
||||
<li><b>Entering bacground mode</b>
|
||||
<br> Before entering in background mode \code - (void)applicationDidEnterBackground:(UIApplication *)application \endcode The application must first refresh sip registration using function #linphone_core_refresh_registers();
|
||||
and register a Keep alive handler for periodically refreshing registration. The speudo code below show how to register a keep alive handler:
|
||||
<br> Anyway, for battery saving and interoperability with NAT routers reasons, <b>UDP background mode is not recomended</b>.<br>
|
||||
The choice between UDP and TCP transport for sip can be configured with linphone_core_set_sip_transports().
|
||||
<li><b>Entering background mode</b>
|
||||
<br> Before entering in background mode (through \code - (void)applicationDidEnterBackground:(UIApplication *)application \endcode ), the application must first refresh sip registration using function #linphone_core_refresh_registers();
|
||||
and register a keep-alive handler for periodically refreshing the registration. The speudo code below shows how to register a keep alive handler:
|
||||
\code
|
||||
//First refresh registration
|
||||
linphone_core_refresh_registers(theLinphoneCore);
|
||||
|
|
@ -272,12 +273,12 @@ and register a Keep alive handler for periodically refreshing registration. The
|
|||
handler:^{
|
||||
//refresh sip registration
|
||||
linphone_core_refresh_registers(theLinphoneCore);
|
||||
//make sure sip REGISTER
|
||||
//make sure sip REGISTER is sent
|
||||
linphone_core_iterate(theLinphoneCore);
|
||||
}];
|
||||
\endcode
|
||||
<li><b>Incoming call notification while in background mode</b>
|
||||
<br>Assuming application using liblinphone is well configured for multitasking, incoming calls arriving while liblinphone is in background mode will simply wakeup liblinphone thread but not resume GUI. To wakeup GUI, it is recommanded to send a Local Notification to the user from the #LinphoneCallStateCb. Here under a speudo code for this operation:
|
||||
<br>Assuming application using liblinphone is well configured for multitasking, incoming calls arriving while liblinphone is in background mode will simply wakeup liblinphone thread but not resume GUI. To wakeup GUI, it is recommended to send a Local Notification to the user from the #LinphoneCallStateCb. Here under a speudo code for this operation:
|
||||
\code
|
||||
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) {
|
||||
// Create a new notification
|
||||
|
|
@ -295,7 +296,7 @@ and register a Keep alive handler for periodically refreshing registration. The
|
|||
<b>Networking</b>
|
||||
<br>
|
||||
<ul><li><b>WWAN connection</b>
|
||||
<br>liblinphone relies on bsd socket for sip/rtp networking. On IOS, WWAN connection is supposed to automatically setup on any networking resquest issued by an application. At least on iPhone OS 3.x, BSD sockets do not automaticaly bring up the WWAN interface. So it is recommanded to add a special code to make sure the WWAN connection is properly setup. Speudo code belows describe a way to force WWAN connection.
|
||||
<br>Liblinphone relies on iOS's standard BSD socket layer for sip/rtp networking. On IOS, WWAN connection is supposed to automatically bring up on any networking resquest issued by an application. At least on iPhone OS 3.x, BSD sockets do not implement this behavior. So it is recomended to add a special code to make sure the WWAN connection is properly setup. Pseudo code below describes a way to force WWAN connection by setting up a dummy TCP connection.
|
||||
\code
|
||||
/*start a new thread to avoid blocking the main ui in case of peer host failure*/
|
||||
[NSThread detachNewThreadSelector:@selector(runNetworkConnection) toTarget:self withObject:nil];
|
||||
|
|
@ -310,9 +311,9 @@ and register a Keep alive handler for periodically refreshing registration. The
|
|||
CFWriteStreamClose (writeStream);
|
||||
}
|
||||
\endcode
|
||||
It is recommanded to perform this task each time the application is waked up, including keep alive handler.
|
||||
It is recommanded to perform this task each time the application is woken up, including keep alive handler.
|
||||
<li><b>Managing IP connection state</b>
|
||||
<br>liblinphone for IOS relies on the application to be informed of network changes. Network state change when the IP connection move from DOWN to UP, or from WIFI to WWAN. Applications using liblinphone must inform libliblinphone of this changes using function #linphone_core_set_network_reachable(). Usually this method is called from the IOS NetworkReachability callback. Here under a sample code:
|
||||
<br>Liblinphone for IOS relies on the application to be informed of network connectivity changes. Network state changes when the IP connection moves from DOWN to UP, or from WIFI to WWAN. Applications using liblinphone must inform libliblinphone of this changes using function #linphone_core_set_network_reachable(). Usually this method is called from the IOS NetworkReachability callback. Here under a sample code:
|
||||
\code
|
||||
//typical reachability callback
|
||||
void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void * info) {
|
||||
|
|
@ -339,7 +340,7 @@ void networkReachabilityCallBack(SCNetworkReachabilityRef target, SCNetworkReach
|
|||
\endcode
|
||||
</ul>
|
||||
<b>DTMF feebacks</b>
|
||||
<br>liblinphone provides functions \link #linphone_core_play_dtmf() to play dtmf \endlink . Usually this is used to play a sound when the a user type a digit. On IOS, libLinphone relies on Audio unit for interfacing with the audio system. Audio unit initialization is a quit long operation that may trigger a bad user experience if performed each time a DTMF is played. On IOS, liblinphone introduce 2 functions for \link linphone_core_start_dtmf_stream() preloading \endlink \link #linphone_core_start_dtmf_stream() unloading \endlink underlying audio graph responsible of playing DTMFs.
|
||||
<br> For application using function #linphone_core_play_dtmf() , it is recommanded to call #linphone_core_start_dtmf_stream() when entering in foreground and #linphone_core_stop_dtmf_stream() upon entering background mode.
|
||||
<br>Liblinphone provides functions \link #linphone_core_play_dtmf() to play dtmf \endlink to the local user. Usually this is used to play a sound when the user presses a digit, inside or outside of any call. On IOS, libLinphone relies on AudioUnits for interfacing with the audio system. Unfortunately the Audio Unit initialization is a quite long operation that may trigger a bad user experience if performed each time a DTMF is played, the sound being delayed half a second after the press. To solve this issue and thus insure real-time precision, liblinphone introduces 2 functions for \link linphone_core_start_dtmf_stream() preloading \endlink and \link #linphone_core_start_dtmf_stream() unloading \endlink the underlying audio graph responsible for playing DTMFs.
|
||||
<br> For an application using function #linphone_core_play_dtmf(), it is recommanded to call #linphone_core_start_dtmf_stream() when entering in foreground and #linphone_core_stop_dtmf_stream() upon entering background mode.
|
||||
*/
|
||||
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ static const char *liblinphone_version=LIBLINPHONE_VERSION;
|
|||
static void set_network_reachable(LinphoneCore* lc,bool_t isReachable, time_t curtime);
|
||||
|
||||
#include "enum.h"
|
||||
|
||||
const char *linphone_core_get_nat_address_resolved(LinphoneCore *lc);
|
||||
void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result);
|
||||
static void toggle_video_preview(LinphoneCore *lc, bool_t val);
|
||||
|
||||
|
|
@ -358,6 +358,7 @@ static void net_config_read (LinphoneCore *lc)
|
|||
const char *tmpstr;
|
||||
LpConfig *config=lc->config;
|
||||
|
||||
lc->net_conf.nat_address_ip = NULL;
|
||||
tmp=lp_config_get_int(config,"net","download_bw",0);
|
||||
linphone_core_set_download_bandwidth(lc,tmp);
|
||||
tmp=lp_config_get_int(config,"net","upload_bw",0);
|
||||
|
|
@ -489,6 +490,8 @@ static void sip_config_read(LinphoneCore *lc)
|
|||
sal_use_session_timers(lc->sal,200);
|
||||
}
|
||||
|
||||
sal_use_rport(lc->sal,lp_config_get_int(lc->config,"sip","use_rport",1));
|
||||
|
||||
tmp=lp_config_get_int(lc->config,"sip","use_rfc2833",0);
|
||||
linphone_core_set_use_rfc2833_for_dtmf(lc,tmp);
|
||||
|
||||
|
|
@ -1078,9 +1081,10 @@ int linphone_core_set_primary_contact(LinphoneCore *lc, const char *contact)
|
|||
|
||||
/*result must be an array of chars at least LINPHONE_IPADDR_SIZE */
|
||||
void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result){
|
||||
const char *ip;
|
||||
if (linphone_core_get_firewall_policy(lc)==LinphonePolicyUseNatAddress
|
||||
&& linphone_core_get_nat_address(lc)!=NULL){
|
||||
strncpy(result,linphone_core_get_nat_address(lc),LINPHONE_IPADDR_SIZE);
|
||||
&& (ip=linphone_core_get_nat_address_resolved(lc))!=NULL){
|
||||
strncpy(result,ip,LINPHONE_IPADDR_SIZE);
|
||||
return;
|
||||
}
|
||||
if (linphone_core_get_local_ip_for(lc->sip_conf.ipv6_enabled ? AF_INET6 : AF_INET,dest,result)==0)
|
||||
|
|
@ -1892,7 +1896,7 @@ static char *get_fixed_contact(LinphoneCore *lc, LinphoneCall *call , LinphonePr
|
|||
if (linphone_core_get_firewall_policy(lc)==LinphonePolicyUseNatAddress){
|
||||
ctt=linphone_core_get_primary_contact_parsed(lc);
|
||||
return ms_strdup_printf("sip:%s@%s",linphone_address_get_username(ctt),
|
||||
linphone_core_get_nat_address(lc));
|
||||
linphone_core_get_nat_address_resolved(lc));
|
||||
}
|
||||
|
||||
/* if already choosed, don't change it */
|
||||
|
|
@ -3090,11 +3094,34 @@ void linphone_core_set_nat_address(LinphoneCore *lc, const char *addr)
|
|||
if (lc->sip_conf.contact) update_primary_contact(lc);
|
||||
}
|
||||
|
||||
const char *linphone_core_get_nat_address(const LinphoneCore *lc)
|
||||
{
|
||||
const char *linphone_core_get_nat_address(const LinphoneCore *lc) {
|
||||
return lc->net_conf.nat_address;
|
||||
}
|
||||
|
||||
const char *linphone_core_get_nat_address_resolved(LinphoneCore *lc)
|
||||
{
|
||||
struct sockaddr_storage ss;
|
||||
socklen_t ss_len;
|
||||
int error;
|
||||
char ipstring [INET6_ADDRSTRLEN];
|
||||
|
||||
if (parse_hostname_to_addr (lc->net_conf.nat_address, &ss, &ss_len)<0) {
|
||||
return lc->net_conf.nat_address;
|
||||
}
|
||||
|
||||
error = getnameinfo((struct sockaddr *)&ss, ss_len,
|
||||
ipstring, sizeof(ipstring), NULL, 0, NI_NUMERICHOST);
|
||||
if (error) {
|
||||
return lc->net_conf.nat_address;
|
||||
}
|
||||
|
||||
if (lc->net_conf.nat_address_ip!=NULL){
|
||||
ms_free(lc->net_conf.nat_address_ip);
|
||||
}
|
||||
lc->net_conf.nat_address_ip = ms_strdup (ipstring);
|
||||
return lc->net_conf.nat_address_ip;
|
||||
}
|
||||
|
||||
void linphone_core_set_firewall_policy(LinphoneCore *lc, LinphoneFirewallPolicy pol){
|
||||
lc->net_conf.firewall_policy=pol;
|
||||
if (lc->sip_conf.contact) update_primary_contact(lc);
|
||||
|
|
@ -3713,6 +3740,9 @@ void net_config_uninit(LinphoneCore *lc)
|
|||
lp_config_set_string(lc->config,"net","nat_address",config->nat_address);
|
||||
ms_free(lc->net_conf.nat_address);
|
||||
}
|
||||
if (lc->net_conf.nat_address_ip !=NULL){
|
||||
ms_free(lc->net_conf.nat_address_ip);
|
||||
}
|
||||
lp_config_set_int(lc->config,"net","firewall_policy",config->firewall_policy);
|
||||
lp_config_set_int(lc->config,"net","mtu",config->mtu);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -994,6 +994,9 @@ LinphoneGlobalState linphone_core_get_global_state(const LinphoneCore *lc);
|
|||
* @ingroup proxies
|
||||
*/
|
||||
void linphone_core_refresh_registers(LinphoneCore* lc);
|
||||
|
||||
int parse_hostname_to_addr(const char *server, struct sockaddr_storage *ss, socklen_t *socklen);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -396,7 +396,7 @@ static int sendStunRequest(int sock, const struct sockaddr *server, socklen_t ad
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int parse_stun_server_addr(const char *server, struct sockaddr_storage *ss, socklen_t *socklen){
|
||||
int parse_hostname_to_addr(const char *server, struct sockaddr_storage *ss, socklen_t *socklen){
|
||||
struct addrinfo hints,*res=NULL;
|
||||
int ret;
|
||||
const char *port;
|
||||
|
|
@ -466,7 +466,7 @@ void linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call){
|
|||
ac=&call->localdesc->streams[0].candidates[0];
|
||||
vc=&call->localdesc->streams[1].candidates[0];
|
||||
|
||||
if (parse_stun_server_addr(server,&ss,&ss_len)<0){
|
||||
if (parse_hostname_to_addr(server,&ss,&ss_len)<0){
|
||||
ms_error("Fail to parser stun server address: %s",server);
|
||||
return;
|
||||
}
|
||||
|
|
@ -596,7 +596,7 @@ int linphone_core_wake_up_possible_already_running_instance(
|
|||
socklen_t sslen;
|
||||
char tmp[100];
|
||||
snprintf(tmp,sizeof(tmp),"127.0.0.1:%i",port);
|
||||
if (parse_stun_server_addr(tmp,&ss,&sslen)==0){
|
||||
if (parse_hostname_to_addr(tmp,&ss,&sslen)==0){
|
||||
int locport=57123;
|
||||
ortp_socket_t sock=create_socket(locport);
|
||||
if (sock<0) sock=create_socket(++locport);
|
||||
|
|
|
|||
|
|
@ -311,7 +311,8 @@ typedef struct rtp_config
|
|||
|
||||
typedef struct net_config
|
||||
{
|
||||
char *nat_address;
|
||||
char *nat_address; /* may be IP or host name */
|
||||
char *nat_address_ip; /* ip translated from nat_address */
|
||||
char *stun_server;
|
||||
char *relay;
|
||||
int download_bw;
|
||||
|
|
|
|||
|
|
@ -262,6 +262,8 @@ unsigned int sal_get_keepalive_period(Sal *ctx);
|
|||
void sal_use_session_timers(Sal *ctx, int expires);
|
||||
void sal_use_double_registrations(Sal *ctx, bool_t enabled);
|
||||
void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec);
|
||||
void sal_use_rport(Sal *ctx, bool_t use_rports);
|
||||
|
||||
int sal_iterate(Sal *sal);
|
||||
MSList * sal_get_pending_auths(Sal *sal);
|
||||
|
||||
|
|
|
|||
|
|
@ -273,6 +273,7 @@ Sal * sal_init(){
|
|||
sal=ms_new0(Sal,1);
|
||||
sal->keepalive_period=30;
|
||||
sal->double_reg=TRUE;
|
||||
sal->use_rports=TRUE;
|
||||
return sal;
|
||||
}
|
||||
|
||||
|
|
@ -366,6 +367,7 @@ int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int i
|
|||
eXosip_set_option(13,&err); /*13=EXOSIP_OPT_SRV_WITH_NAPTR, as it is an enum value, we can't use it unless we are sure of the
|
||||
version of eXosip, which is not the case*/
|
||||
/*see if it looks like an IPv6 address*/
|
||||
eXosip_set_option(EXOSIP_OPT_USE_RPORT,&ctx->use_rports);
|
||||
ipv6=strchr(addr,':')!=NULL;
|
||||
eXosip_enable_ipv6(ipv6);
|
||||
|
||||
|
|
@ -411,6 +413,10 @@ void sal_use_double_registrations(Sal *ctx, bool_t enabled){
|
|||
ctx->double_reg=enabled;
|
||||
}
|
||||
|
||||
void sal_use_rport(Sal *ctx, bool_t use_rports){
|
||||
ctx->use_rports=use_rports;
|
||||
}
|
||||
|
||||
static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval){
|
||||
osip_via_t *via=NULL;
|
||||
osip_generic_param_t *param=NULL;
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ struct Sal{
|
|||
void *up;
|
||||
bool_t one_matching_codec;
|
||||
bool_t double_reg;
|
||||
bool_t use_rports;
|
||||
};
|
||||
|
||||
struct SalOp{
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg){
|
|||
|
||||
/*presence Subscribe/notify*/
|
||||
int sal_subscribe_presence(SalOp *op, const char *from, const char *to){
|
||||
osip_message_t *msg;
|
||||
osip_message_t *msg=NULL;
|
||||
if (from)
|
||||
sal_op_set_from(op,from);
|
||||
if (to)
|
||||
|
|
@ -136,6 +136,11 @@ int sal_subscribe_presence(SalOp *op, const char *from, const char *to){
|
|||
eXosip_lock();
|
||||
eXosip_subscribe_build_initial_request(&msg,sal_op_get_to(op),sal_op_get_from(op),
|
||||
sal_op_get_route(op),"presence",600);
|
||||
if (msg==NULL){
|
||||
ms_error("Could not build subscribe request to %s",to);
|
||||
eXosip_unlock();
|
||||
return -1;
|
||||
}
|
||||
if (op->base.contact){
|
||||
_osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
|
||||
osip_message_set_contact(msg,op->base.contact);
|
||||
|
|
@ -168,9 +173,14 @@ int sal_unsubscribe(SalOp *op){
|
|||
}
|
||||
|
||||
int sal_subscribe_accept(SalOp *op){
|
||||
osip_message_t *msg;
|
||||
osip_message_t *msg=NULL;
|
||||
eXosip_lock();
|
||||
eXosip_insubscription_build_answer(op->tid,202,&msg);
|
||||
if (msg==NULL){
|
||||
ms_error("Fail to build answer to subscribe.");
|
||||
eXosip_unlock();
|
||||
return -1;
|
||||
}
|
||||
if (op->base.contact){
|
||||
_osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free);
|
||||
osip_message_set_contact(msg,op->base.contact);
|
||||
|
|
@ -558,7 +568,7 @@ static void add_presence_body(osip_message_t *notify, SalPresenceStatus online_s
|
|||
|
||||
|
||||
int sal_notify_presence(SalOp *op, SalPresenceStatus status, const char *status_message){
|
||||
osip_message_t *msg;
|
||||
osip_message_t *msg=NULL;
|
||||
eXosip_ss_t ss=EXOSIP_SUBCRSTATE_ACTIVE;
|
||||
if (op->nid==-1){
|
||||
ms_warning("Cannot notify, subscription was closed.");
|
||||
|
|
|
|||
|
|
@ -1266,7 +1266,7 @@ gboolean linphone_gtk_close(GtkWidget *mw){
|
|||
linphone_core_terminate_all_calls(lc);
|
||||
}
|
||||
linphone_core_enable_video_preview(lc,FALSE);
|
||||
#ifdef HAVE_GTK_OSX
|
||||
#ifdef __APPLE__ /*until with have a better option*/
|
||||
gtk_window_iconify(GTK_WINDOW(mw));
|
||||
#else
|
||||
gtk_widget_hide(mw);
|
||||
|
|
@ -1431,8 +1431,11 @@ int main(int argc, char *argv[]){
|
|||
g_object_set(settings, "gtk-menu-images", TRUE, NULL);
|
||||
g_object_set(settings, "gtk-button-images", TRUE, NULL);
|
||||
|
||||
if (workingdir!=NULL)
|
||||
chdir(workingdir);
|
||||
if (workingdir!=NULL){
|
||||
if (chdir(workingdir)==-1){
|
||||
g_error("Could not change directory to %s : %s",workingdir,strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
/* Now, look for the factory configuration file, we do it this late
|
||||
since we want to have had time to change directory and to parse
|
||||
|
|
|
|||
|
|
@ -433,7 +433,6 @@
|
|||
<property name="vscrollbar_policy">automatic</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="contact_list">
|
||||
<property name="height_request">120</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||
|
|
@ -461,9 +460,9 @@
|
|||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="invisible_char">●</property>
|
||||
<signal name="focus_in_event" handler="linphone_gtk_directory_search_focus_in"/>
|
||||
<signal name="activate" handler="linphone_gtk_directory_search_activate"/>
|
||||
<signal name="icon_press" handler="linphone_gtk_directory_search_activate"/>
|
||||
<signal name="focus_in_event" handler="linphone_gtk_directory_search_focus_in"/>
|
||||
<signal name="focus_out_event" handler="linphone_gtk_directory_search_focus_out"/>
|
||||
</object>
|
||||
<packing>
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 39a3f4ddd4a0f60cdd563fdef1d1b7d6e04d140d
|
||||
Subproject commit f5aeb6f365a85888c1049c346af6f7912cc4f4f1
|
||||
|
|
@ -11,18 +11,18 @@ gtk/buddylookup.c
|
|||
gtk/setupwizard.c
|
||||
gtk/incall_view.c
|
||||
gtk/loginframe.c
|
||||
gtk/main.ui
|
||||
gtk/about.ui
|
||||
gtk/contact.ui
|
||||
gtk/log.ui
|
||||
gtk/password.ui
|
||||
gtk/call_logs.ui
|
||||
gtk/main.ui
|
||||
gtk/sip_account.ui
|
||||
gtk/chatroom.ui
|
||||
gtk/parameters.ui
|
||||
gtk/buddylookup.ui
|
||||
gtk/waiting.ui
|
||||
[type: gettext/glade]gtk/main.ui
|
||||
[type: gettext/glade]gtk/about.ui
|
||||
[type: gettext/glade]gtk/contact.ui
|
||||
[type: gettext/glade]gtk/log.ui
|
||||
[type: gettext/glade]gtk/password.ui
|
||||
[type: gettext/glade]gtk/call_logs.ui
|
||||
[type: gettext/glade]gtk/main.ui
|
||||
[type: gettext/glade]gtk/sip_account.ui
|
||||
[type: gettext/glade]gtk/chatroom.ui
|
||||
[type: gettext/glade]gtk/parameters.ui
|
||||
[type: gettext/glade]gtk/buddylookup.ui
|
||||
[type: gettext/glade]gtk/waiting.ui
|
||||
coreapi/linphonecore.c
|
||||
coreapi/misc.c
|
||||
coreapi/presence.c
|
||||
|
|
|
|||
1805
po/nb_NO.po
Normal file
1805
po/nb_NO.po
Normal file
File diff suppressed because it is too large
Load diff
1065
po/pt_BR.po
1065
po/pt_BR.po
File diff suppressed because it is too large
Load diff
1270
po/zh_CN.po
1270
po/zh_CN.po
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue