mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-05-07 05:53:06 +00:00
Merge branch 'upnp'
Conflicts: coreapi/callbacks.c coreapi/linphonecore.c gtk/Makefile.am mediastreamer2
This commit is contained in:
commit
5c939acd69
21 changed files with 1724 additions and 251 deletions
26
configure.ac
26
configure.ac
|
|
@ -161,6 +161,32 @@ AC_ARG_ENABLE(tools,
|
||||||
*) AC_MSG_ERROR(bad value ${enableval} for --enable-tools) ;;
|
*) AC_MSG_ERROR(bad value ${enableval} for --enable-tools) ;;
|
||||||
esac],[build_tools=check])
|
esac],[build_tools=check])
|
||||||
|
|
||||||
|
dnl check for installed version of libupnp
|
||||||
|
AC_ARG_ENABLE(upnp,
|
||||||
|
[AS_HELP_STRING([--disable-upnp], [Disable uPnP support])],
|
||||||
|
[case "${enableval}" in
|
||||||
|
yes) build_upnp=true ;;
|
||||||
|
no) build_upnp=false ;;
|
||||||
|
*) AC_MSG_ERROR(bad value ${enableval} for --disable-upnp) ;;
|
||||||
|
esac],[build_upnp=auto])
|
||||||
|
|
||||||
|
if test "$build_upnp" != "false" ; then
|
||||||
|
PKG_CHECK_MODULES([LIBUPNP], [libupnp], [build_upnp=true],
|
||||||
|
[
|
||||||
|
if test "$build_upnp" == "true" ; then
|
||||||
|
AC_MSG_ERROR([libupnp not found.])
|
||||||
|
else
|
||||||
|
build_upnp=false
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
AM_CONDITIONAL(BUILD_UPNP, test x$build_upnp != xfalse)
|
||||||
|
if test "$build_upnp" != "false" ; then
|
||||||
|
AC_DEFINE(BUILD_UPNP, 1, [Define if upnp enabled])
|
||||||
|
fi
|
||||||
|
|
||||||
dnl check libxml2 (needed for tools)
|
dnl check libxml2 (needed for tools)
|
||||||
if test "$build_tools" != "false" ; then
|
if test "$build_tools" != "false" ; then
|
||||||
PKG_CHECK_MODULES(LIBXML2, [libxml-2.0],[],
|
PKG_CHECK_MODULES(LIBXML2, [libxml-2.0],[],
|
||||||
|
|
|
||||||
|
|
@ -206,7 +206,7 @@ static LPC_COMMAND commands[] = {
|
||||||
{ "autoanswer", lpc_cmd_autoanswer, "Show/set auto-answer mode",
|
{ "autoanswer", lpc_cmd_autoanswer, "Show/set auto-answer mode",
|
||||||
"'autoanswer' \t: show current autoanswer mode\n"
|
"'autoanswer' \t: show current autoanswer mode\n"
|
||||||
"'autoanswer enable'\t: enable autoanswer mode\n"
|
"'autoanswer enable'\t: enable autoanswer mode\n"
|
||||||
"'autoanswer disable'\t: disable autoanswer mode \n"},
|
"'autoanswer disable'\t: disable autoanswer mode<EFBFBD><EFBFBD>\n"},
|
||||||
{ "proxy", lpc_cmd_proxy, "Manage proxies",
|
{ "proxy", lpc_cmd_proxy, "Manage proxies",
|
||||||
"'proxy list' : list all proxy setups.\n"
|
"'proxy list' : list all proxy setups.\n"
|
||||||
"'proxy add' : add a new proxy setup.\n"
|
"'proxy add' : add a new proxy setup.\n"
|
||||||
|
|
@ -896,6 +896,9 @@ lpc_cmd_firewall(LinphoneCore *lc, char *args)
|
||||||
case LinphonePolicyUseIce:
|
case LinphonePolicyUseIce:
|
||||||
linphonec_out("Using ice with stun server %s to discover firewall address\n", setting ? setting : linphone_core_get_stun_server(lc));
|
linphonec_out("Using ice with stun server %s to discover firewall address\n", setting ? setting : linphone_core_get_stun_server(lc));
|
||||||
break;
|
break;
|
||||||
|
case LinphonePolicyUseUpnp:
|
||||||
|
linphonec_out("Using uPnP IGD protocol\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -47,15 +47,21 @@ liblinphone_la_SOURCES=\
|
||||||
lsd.c linphonecore_utils.h \
|
lsd.c linphonecore_utils.h \
|
||||||
ec-calibrator.c \
|
ec-calibrator.c \
|
||||||
conference.c \
|
conference.c \
|
||||||
linphone_tunnel.cc \
|
|
||||||
$(GITVERSION_FILE)
|
$(GITVERSION_FILE)
|
||||||
|
|
||||||
|
if BUILD_UPNP
|
||||||
|
liblinphone_la_SOURCES+=upnp.c upnp.h
|
||||||
|
endif
|
||||||
|
|
||||||
if BUILD_WIZARD
|
if BUILD_WIZARD
|
||||||
liblinphone_la_SOURCES+=sipwizard.c
|
liblinphone_la_SOURCES+=sipwizard.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
liblinphone_la_SOURCES+=linphone_tunnel_config.c
|
||||||
if BUILD_TUNNEL
|
if BUILD_TUNNEL
|
||||||
liblinphone_la_SOURCES+=TunnelManager.cc TunnelManager.hh
|
liblinphone_la_SOURCES+=linphone_tunnel.cc TunnelManager.cc TunnelManager.hh
|
||||||
|
else
|
||||||
|
liblinphone_la_SOURCES+=linphone_tunnel_stubs.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -261,6 +261,13 @@ static void call_received(SalOp *h){
|
||||||
ms_message("Defer ringing to gather ICE candidates");
|
ms_message("Defer ringing to gather ICE candidates");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if ((linphone_core_get_firewall_policy(lc) == LinphonePolicyUseUpnp) && (call->upnp_session != NULL)) {
|
||||||
|
/* Defer ringing until the end of the ICE candidates gathering process. */
|
||||||
|
ms_message("Defer ringing to gather uPnP candidates");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
|
||||||
linphone_core_notify_incoming_call(lc,call);
|
linphone_core_notify_incoming_call(lc,call);
|
||||||
}
|
}
|
||||||
|
|
@ -334,6 +341,11 @@ static void call_accepted(SalOp *op){
|
||||||
if (call->ice_session != NULL) {
|
if (call->ice_session != NULL) {
|
||||||
linphone_core_update_ice_from_remote_media_description(call, sal_call_get_remote_media_description(op));
|
linphone_core_update_ice_from_remote_media_description(call, sal_call_get_remote_media_description(op));
|
||||||
}
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if (call->upnp_session != NULL) {
|
||||||
|
linphone_core_update_upnp_from_remote_media_description(call, sal_call_get_remote_media_description(op));
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
|
||||||
md=sal_call_get_final_media_description(op);
|
md=sal_call_get_final_media_description(op);
|
||||||
call->params.has_video &= linphone_core_media_description_contains_video_stream(md);
|
call->params.has_video &= linphone_core_media_description_contains_video_stream(md);
|
||||||
|
|
@ -426,6 +438,12 @@ static void call_accept_update(LinphoneCore *lc, LinphoneCall *call){
|
||||||
linphone_core_update_ice_from_remote_media_description(call,rmd);
|
linphone_core_update_ice_from_remote_media_description(call,rmd);
|
||||||
linphone_core_update_local_media_description_from_ice(call->localdesc,call->ice_session);
|
linphone_core_update_local_media_description_from_ice(call->localdesc,call->ice_session);
|
||||||
}
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if(call->upnp_session != NULL) {
|
||||||
|
linphone_core_update_upnp_from_remote_media_description(call, rmd);
|
||||||
|
linphone_core_update_local_media_description_from_upnp(call->localdesc,call->upnp_session);
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
linphone_call_update_remote_session_id_and_ver(call);
|
linphone_call_update_remote_session_id_and_ver(call);
|
||||||
sal_call_accept(call->op);
|
sal_call_accept(call->op);
|
||||||
md=sal_call_get_final_media_description(call->op);
|
md=sal_call_get_final_media_description(call->op);
|
||||||
|
|
@ -522,6 +540,10 @@ static void call_terminated(SalOp *op, const char *from){
|
||||||
if (lc->vtable.display_status!=NULL)
|
if (lc->vtable.display_status!=NULL)
|
||||||
lc->vtable.display_status(lc,_("Call terminated."));
|
lc->vtable.display_status(lc,_("Call terminated."));
|
||||||
|
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
linphone_call_delete_upnp_session(call);
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
|
||||||
linphone_call_set_state(call, LinphoneCallEnd,"Call ended");
|
linphone_call_set_state(call, LinphoneCallEnd,"Call ended");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -618,6 +640,11 @@ static void call_failure(SalOp *op, SalError error, SalReason sr, const char *de
|
||||||
/*resume to the call that send us the refer automatically*/
|
/*resume to the call that send us the refer automatically*/
|
||||||
linphone_core_resume_call(lc,call->referer);
|
linphone_core_resume_call(lc,call->referer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
linphone_call_delete_upnp_session(call);
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
|
||||||
if (sr == SalReasonDeclined) {
|
if (sr == SalReasonDeclined) {
|
||||||
call->reason=LinphoneReasonDeclined;
|
call->reason=LinphoneReasonDeclined;
|
||||||
linphone_call_set_state(call,LinphoneCallEnd,"Call declined.");
|
linphone_call_set_state(call,LinphoneCallEnd,"Call declined.");
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef TUNNEL_ENABLED
|
|
||||||
#include "TunnelManager.hh"
|
#include "TunnelManager.hh"
|
||||||
#endif
|
|
||||||
#include "linphone_tunnel.h"
|
#include "linphone_tunnel.h"
|
||||||
#include "linphonecore.h"
|
#include "linphonecore.h"
|
||||||
#include "private.h"
|
#include "private.h"
|
||||||
|
|
@ -35,67 +33,6 @@ LinphoneTunnel* linphone_core_get_tunnel(LinphoneCore *lc){
|
||||||
return lc->tunnel;
|
return lc->tunnel;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct _LinphoneTunnelConfig {
|
|
||||||
char *host;
|
|
||||||
int port;
|
|
||||||
int remote_udp_mirror_port;
|
|
||||||
int delay;
|
|
||||||
};
|
|
||||||
|
|
||||||
LinphoneTunnelConfig *linphone_tunnel_config_new() {
|
|
||||||
LinphoneTunnelConfig *ltc = ms_new0(LinphoneTunnelConfig,1);
|
|
||||||
ltc->remote_udp_mirror_port = 12345;
|
|
||||||
ltc->delay = 1000;
|
|
||||||
return ltc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_config_set_host(LinphoneTunnelConfig *tunnel, const char *host) {
|
|
||||||
if(tunnel->host != NULL) {
|
|
||||||
ms_free(tunnel->host);
|
|
||||||
tunnel->host = NULL;
|
|
||||||
}
|
|
||||||
if(host != NULL && strlen(host)) {
|
|
||||||
tunnel->host = ms_strdup(host);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *linphone_tunnel_config_get_host(LinphoneTunnelConfig *tunnel) {
|
|
||||||
return tunnel->host;
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_config_set_port(LinphoneTunnelConfig *tunnel, int port) {
|
|
||||||
tunnel->port = port;
|
|
||||||
}
|
|
||||||
|
|
||||||
int linphone_tunnel_config_get_port(LinphoneTunnelConfig *tunnel) {
|
|
||||||
return tunnel->port;
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_config_set_remote_udp_mirror_port(LinphoneTunnelConfig *tunnel, int remote_udp_mirror_port) {
|
|
||||||
tunnel->remote_udp_mirror_port = remote_udp_mirror_port;
|
|
||||||
}
|
|
||||||
|
|
||||||
int linphone_tunnel_config_get_remote_udp_mirror_port(LinphoneTunnelConfig *tunnel) {
|
|
||||||
return tunnel->remote_udp_mirror_port;
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_config_set_delay(LinphoneTunnelConfig *tunnel, int delay) {
|
|
||||||
tunnel->delay = delay;
|
|
||||||
}
|
|
||||||
|
|
||||||
int linphone_tunnel_config_get_delay(LinphoneTunnelConfig *tunnel) {
|
|
||||||
return tunnel->delay;
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_config_destroy(LinphoneTunnelConfig *tunnel) {
|
|
||||||
if(tunnel->host != NULL) {
|
|
||||||
ms_free(tunnel->host);
|
|
||||||
}
|
|
||||||
ms_free(tunnel);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TUNNEL_ENABLED
|
|
||||||
|
|
||||||
struct _LinphoneTunnel {
|
struct _LinphoneTunnel {
|
||||||
belledonnecomm::TunnelManager *manager;
|
belledonnecomm::TunnelManager *manager;
|
||||||
MSList *config_list;
|
MSList *config_list;
|
||||||
|
|
@ -122,16 +59,16 @@ void linphone_tunnel_destroy(LinphoneTunnel *tunnel){
|
||||||
|
|
||||||
static char *linphone_tunnel_config_to_string(const LinphoneTunnelConfig *tunnel_config) {
|
static char *linphone_tunnel_config_to_string(const LinphoneTunnelConfig *tunnel_config) {
|
||||||
char *str = NULL;
|
char *str = NULL;
|
||||||
if(tunnel_config->remote_udp_mirror_port != -1) {
|
if(linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config) != -1) {
|
||||||
str = ms_strdup_printf("%s:%d:%d:%d",
|
str = ms_strdup_printf("%s:%d:%d:%d",
|
||||||
tunnel_config->host,
|
linphone_tunnel_config_get_host(tunnel_config),
|
||||||
tunnel_config->port,
|
linphone_tunnel_config_get_port(tunnel_config),
|
||||||
tunnel_config->remote_udp_mirror_port,
|
linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config),
|
||||||
tunnel_config->delay);
|
linphone_tunnel_config_get_delay(tunnel_config));
|
||||||
} else {
|
} else {
|
||||||
str = ms_strdup_printf("%s:%d",
|
str = ms_strdup_printf("%s:%d",
|
||||||
tunnel_config->host,
|
linphone_tunnel_config_get_host(tunnel_config),
|
||||||
tunnel_config->port);
|
linphone_tunnel_config_get_port(tunnel_config));
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
@ -209,11 +146,14 @@ static void linphone_tunnel_save_config(LinphoneTunnel *tunnel) {
|
||||||
|
|
||||||
|
|
||||||
static void linphone_tunnel_add_server_intern(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config) {
|
static void linphone_tunnel_add_server_intern(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config) {
|
||||||
if(tunnel_config->remote_udp_mirror_port == -1) {
|
if(linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config) == -1) {
|
||||||
bcTunnel(tunnel)->addServer(tunnel_config->host, tunnel_config->port);
|
bcTunnel(tunnel)->addServer(linphone_tunnel_config_get_host(tunnel_config),
|
||||||
|
linphone_tunnel_config_get_port(tunnel_config));
|
||||||
} else {
|
} else {
|
||||||
bcTunnel(tunnel)->addServer(tunnel_config->host, tunnel_config->port,
|
bcTunnel(tunnel)->addServer(linphone_tunnel_config_get_host(tunnel_config),
|
||||||
tunnel_config->remote_udp_mirror_port, tunnel_config->delay);
|
linphone_tunnel_config_get_port(tunnel_config),
|
||||||
|
linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config),
|
||||||
|
linphone_tunnel_config_get_delay(tunnel_config));
|
||||||
}
|
}
|
||||||
tunnel->config_list = ms_list_append(tunnel->config_list, tunnel_config);
|
tunnel->config_list = ms_list_append(tunnel->config_list, tunnel_config);
|
||||||
}
|
}
|
||||||
|
|
@ -385,60 +325,3 @@ void linphone_tunnel_configure(LinphoneTunnel *tunnel){
|
||||||
linphone_tunnel_enable(tunnel, enabled);
|
linphone_tunnel_enable(tunnel, enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/*stubs to avoid to have #ifdef TUNNEL_ENABLED in upper layers*/
|
|
||||||
|
|
||||||
void linphone_tunnel_destroy(LinphoneTunnel *tunnel){
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void linphone_tunnel_add_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config){
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_remove_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config){
|
|
||||||
}
|
|
||||||
|
|
||||||
const MSList *linphone_tunnel_get_servers(LinphoneTunnel *tunnel){
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_clean_servers(LinphoneTunnel *tunnel){
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_enable(LinphoneTunnel *tunnel, bool_t enabled){
|
|
||||||
}
|
|
||||||
|
|
||||||
bool_t linphone_tunnel_enabled(LinphoneTunnel *tunnel){
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void linphone_tunnel_enable_logs_with_handler(LinphoneTunnel *tunnel, bool_t enabled, OrtpLogFunc logHandler){
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_set_http_proxy_auth_info(LinphoneTunnel *tunnel, const char* username,const char* passwd){
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_set_http_proxy(LinphoneTunnel*tunnel, const char *host, int port, const char* username,const char* passwd){
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_get_http_proxy(LinphoneTunnel*tunnel,const char **host, int *port, const char **username, const char **passwd){
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_reconnect(LinphoneTunnel *tunnel){
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_auto_detect(LinphoneTunnel *tunnel){
|
|
||||||
}
|
|
||||||
|
|
||||||
void linphone_tunnel_configure(LinphoneTunnel *tunnel){
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ void linphone_tunnel_config_set_host(LinphoneTunnelConfig *tunnel, const char *h
|
||||||
*
|
*
|
||||||
* @param tunnel configuration object
|
* @param tunnel configuration object
|
||||||
*/
|
*/
|
||||||
const char *linphone_tunnel_config_get_host(LinphoneTunnelConfig *tunnel);
|
const char *linphone_tunnel_config_get_host(const LinphoneTunnelConfig *tunnel);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set tls port of server.
|
* Set tls port of server.
|
||||||
|
|
@ -83,7 +83,7 @@ void linphone_tunnel_config_set_port(LinphoneTunnelConfig *tunnel, int port);
|
||||||
*
|
*
|
||||||
* @param tunnel configuration object
|
* @param tunnel configuration object
|
||||||
*/
|
*/
|
||||||
int linphone_tunnel_config_get_port(LinphoneTunnelConfig *tunnel);
|
int linphone_tunnel_config_get_port(const LinphoneTunnelConfig *tunnel);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the remote port on the tunnel server side used to test udp reachability.
|
* Set the remote port on the tunnel server side used to test udp reachability.
|
||||||
|
|
@ -98,7 +98,7 @@ void linphone_tunnel_config_set_remote_udp_mirror_port(LinphoneTunnelConfig *tun
|
||||||
*
|
*
|
||||||
* @param tunnel configuration object
|
* @param tunnel configuration object
|
||||||
*/
|
*/
|
||||||
int linphone_tunnel_config_get_remote_udp_mirror_port(LinphoneTunnelConfig *tunnel);
|
int linphone_tunnel_config_get_remote_udp_mirror_port(const LinphoneTunnelConfig *tunnel);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the udp packet round trip delay in ms for a tunnel configuration.
|
* Set the udp packet round trip delay in ms for a tunnel configuration.
|
||||||
|
|
@ -113,7 +113,7 @@ void linphone_tunnel_config_set_delay(LinphoneTunnelConfig *tunnel, int delay);
|
||||||
*
|
*
|
||||||
* @param tunnel configuration object
|
* @param tunnel configuration object
|
||||||
*/
|
*/
|
||||||
int linphone_tunnel_config_get_delay(LinphoneTunnelConfig *tunnel);
|
int linphone_tunnel_config_get_delay(const LinphoneTunnelConfig *tunnel);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy a tunnel configuration
|
* Destroy a tunnel configuration
|
||||||
|
|
|
||||||
83
coreapi/linphone_tunnel_config.c
Normal file
83
coreapi/linphone_tunnel_config.c
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* linphone_tunnel_config.c
|
||||||
|
*
|
||||||
|
* Copyright 2012 Belledonne Communications
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 "linphone_tunnel.h"
|
||||||
|
|
||||||
|
struct _LinphoneTunnelConfig {
|
||||||
|
char *host;
|
||||||
|
int port;
|
||||||
|
int remote_udp_mirror_port;
|
||||||
|
int delay;
|
||||||
|
};
|
||||||
|
|
||||||
|
LinphoneTunnelConfig *linphone_tunnel_config_new() {
|
||||||
|
LinphoneTunnelConfig *ltc = ms_new0(LinphoneTunnelConfig,1);
|
||||||
|
ltc->remote_udp_mirror_port = 12345;
|
||||||
|
ltc->delay = 1000;
|
||||||
|
return ltc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_config_set_host(LinphoneTunnelConfig *tunnel, const char *host) {
|
||||||
|
if(tunnel->host != NULL) {
|
||||||
|
ms_free(tunnel->host);
|
||||||
|
tunnel->host = NULL;
|
||||||
|
}
|
||||||
|
if(host != NULL && strlen(host)) {
|
||||||
|
tunnel->host = ms_strdup(host);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *linphone_tunnel_config_get_host(const LinphoneTunnelConfig *tunnel) {
|
||||||
|
return tunnel->host;
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_config_set_port(LinphoneTunnelConfig *tunnel, int port) {
|
||||||
|
tunnel->port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
int linphone_tunnel_config_get_port(const LinphoneTunnelConfig *tunnel) {
|
||||||
|
return tunnel->port;
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_config_set_remote_udp_mirror_port(LinphoneTunnelConfig *tunnel, int remote_udp_mirror_port) {
|
||||||
|
tunnel->remote_udp_mirror_port = remote_udp_mirror_port;
|
||||||
|
}
|
||||||
|
|
||||||
|
int linphone_tunnel_config_get_remote_udp_mirror_port(const LinphoneTunnelConfig *tunnel) {
|
||||||
|
return tunnel->remote_udp_mirror_port;
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_config_set_delay(LinphoneTunnelConfig *tunnel, int delay) {
|
||||||
|
tunnel->delay = delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
int linphone_tunnel_config_get_delay(const LinphoneTunnelConfig *tunnel) {
|
||||||
|
return tunnel->delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_config_destroy(LinphoneTunnelConfig *tunnel) {
|
||||||
|
if(tunnel->host != NULL) {
|
||||||
|
ms_free(tunnel->host);
|
||||||
|
}
|
||||||
|
ms_free(tunnel);
|
||||||
|
}
|
||||||
|
|
||||||
83
coreapi/linphone_tunnel_stubs.c
Normal file
83
coreapi/linphone_tunnel_stubs.c
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
/***************************************************************************
|
||||||
|
* linphone_tunnel.cc
|
||||||
|
*
|
||||||
|
* Fri Dec 9, 2011
|
||||||
|
* Copyright 2011 Belledonne Communications
|
||||||
|
* Author: Guillaume Beraudo
|
||||||
|
* Email: guillaume dot beraudo at linphone dot org
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 "linphone_tunnel.h"
|
||||||
|
#include "linphonecore.h"
|
||||||
|
#include "private.h"
|
||||||
|
#include "lpconfig.h"
|
||||||
|
|
||||||
|
|
||||||
|
LinphoneTunnel* linphone_core_get_tunnel(LinphoneCore *lc){
|
||||||
|
return lc->tunnel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*stubs to avoid to have #ifdef TUNNEL_ENABLED in upper layers*/
|
||||||
|
|
||||||
|
void linphone_tunnel_destroy(LinphoneTunnel *tunnel){
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void linphone_tunnel_add_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config){
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_remove_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config){
|
||||||
|
}
|
||||||
|
|
||||||
|
const MSList *linphone_tunnel_get_servers(LinphoneTunnel *tunnel){
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_clean_servers(LinphoneTunnel *tunnel){
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_enable(LinphoneTunnel *tunnel, bool_t enabled){
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t linphone_tunnel_enabled(LinphoneTunnel *tunnel){
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void linphone_tunnel_enable_logs_with_handler(LinphoneTunnel *tunnel, bool_t enabled, OrtpLogFunc logHandler){
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_set_http_proxy_auth_info(LinphoneTunnel *tunnel, const char* username,const char* passwd){
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_set_http_proxy(LinphoneTunnel*tunnel, const char *host, int port, const char* username,const char* passwd){
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_get_http_proxy(LinphoneTunnel*tunnel,const char **host, int *port, const char **username, const char **passwd){
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_reconnect(LinphoneTunnel *tunnel){
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_auto_detect(LinphoneTunnel *tunnel){
|
||||||
|
}
|
||||||
|
|
||||||
|
void linphone_tunnel_configure(LinphoneTunnel *tunnel){
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -302,6 +302,12 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *
|
||||||
linphone_core_update_local_media_description_from_ice(md, call->ice_session);
|
linphone_core_update_local_media_description_from_ice(md, call->ice_session);
|
||||||
linphone_core_update_ice_state_in_call_stats(call);
|
linphone_core_update_ice_state_in_call_stats(call);
|
||||||
}
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if(call->upnp_session != NULL) {
|
||||||
|
linphone_core_update_local_media_description_from_upnp(md, call->upnp_session);
|
||||||
|
linphone_core_update_upnp_state_in_call_stats(call);
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
linphone_address_destroy(addr);
|
linphone_address_destroy(addr);
|
||||||
call->localdesc=md;
|
call->localdesc=md;
|
||||||
if (old_md) sal_media_description_unref(old_md);
|
if (old_md) sal_media_description_unref(old_md);
|
||||||
|
|
@ -435,6 +441,11 @@ void linphone_call_init_stats(LinphoneCallStats *stats, int type) {
|
||||||
stats->received_rtcp = NULL;
|
stats->received_rtcp = NULL;
|
||||||
stats->sent_rtcp = NULL;
|
stats->sent_rtcp = NULL;
|
||||||
stats->ice_state = LinphoneIceStateNotActivated;
|
stats->ice_state = LinphoneIceStateNotActivated;
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
stats->upnp_state = LinphoneUpnpStateIdle;
|
||||||
|
#else
|
||||||
|
stats->upnp_state = LinphoneUpnpStateNotAvailable;
|
||||||
|
#endif //BUILD_UPNP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -468,6 +479,11 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr
|
||||||
if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseStun) {
|
if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseStun) {
|
||||||
call->ping_time=linphone_core_run_stun_tests(call->core,call);
|
call->ping_time=linphone_core_run_stun_tests(call->core,call);
|
||||||
}
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseUpnp) {
|
||||||
|
call->upnp_session = linphone_upnp_session_new(call);
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
call->camera_active=params->has_video;
|
call->camera_active=params->has_video;
|
||||||
|
|
||||||
discover_mtu(lc,linphone_address_get_domain (to));
|
discover_mtu(lc,linphone_address_get_domain (to));
|
||||||
|
|
@ -529,6 +545,19 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro
|
||||||
case LinphonePolicyUseStun:
|
case LinphonePolicyUseStun:
|
||||||
call->ping_time=linphone_core_run_stun_tests(call->core,call);
|
call->ping_time=linphone_core_run_stun_tests(call->core,call);
|
||||||
/* No break to also destroy ice session in this case. */
|
/* No break to also destroy ice session in this case. */
|
||||||
|
break;
|
||||||
|
case LinphonePolicyUseUpnp:
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
call->upnp_session = linphone_upnp_session_new(call);
|
||||||
|
if (call->upnp_session != NULL) {
|
||||||
|
linphone_call_init_media_streams(call);
|
||||||
|
if (linphone_core_update_upnp_from_remote_media_description(call, sal_call_get_remote_media_description(op))<0) {
|
||||||
|
/* uPnP port mappings failed, proceed with the call anyway. */
|
||||||
|
linphone_call_delete_upnp_session(call);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -677,6 +706,9 @@ void linphone_call_set_state(LinphoneCall *call, LinphoneCallState cstate, const
|
||||||
|
|
||||||
static void linphone_call_destroy(LinphoneCall *obj)
|
static void linphone_call_destroy(LinphoneCall *obj)
|
||||||
{
|
{
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
linphone_call_delete_upnp_session(obj);
|
||||||
|
#endif //BUILD_UPNP
|
||||||
linphone_call_delete_ice_session(obj);
|
linphone_call_delete_ice_session(obj);
|
||||||
if (obj->op!=NULL) {
|
if (obj->op!=NULL) {
|
||||||
sal_op_release(obj->op);
|
sal_op_release(obj->op);
|
||||||
|
|
@ -1746,6 +1778,15 @@ void linphone_call_delete_ice_session(LinphoneCall *call){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
void linphone_call_delete_upnp_session(LinphoneCall *call){
|
||||||
|
if(call->upnp_session!=NULL) {
|
||||||
|
linphone_upnp_session_destroy(call->upnp_session);
|
||||||
|
call->upnp_session=NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
|
||||||
static void linphone_call_log_fill_stats(LinphoneCallLog *log, AudioStream *st){
|
static void linphone_call_log_fill_stats(LinphoneCallLog *log, AudioStream *st){
|
||||||
audio_stream_get_local_rtp_stats (st,&log->local_stats);
|
audio_stream_get_local_rtp_stats (st,&log->local_stats);
|
||||||
log->quality=audio_stream_get_average_quality_rating(st);
|
log->quality=audio_stream_get_average_quality_rating(st);
|
||||||
|
|
@ -2056,6 +2097,11 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse
|
||||||
report_bandwidth(call,as,vs);
|
report_bandwidth(call,as,vs);
|
||||||
ms_message("Thread processing load: audio=%f\tvideo=%f",audio_load,video_load);
|
ms_message("Thread processing load: audio=%f\tvideo=%f",audio_load,video_load);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
linphone_upnp_call_process(call);
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
|
||||||
#ifdef VIDEO_ENABLED
|
#ifdef VIDEO_ENABLED
|
||||||
if (call->videostream!=NULL) {
|
if (call->videostream!=NULL) {
|
||||||
OrtpEvent *ev;
|
OrtpEvent *ev;
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,6 @@ static void linphone_core_free_hooks(LinphoneCore *lc);
|
||||||
#include "enum.h"
|
#include "enum.h"
|
||||||
|
|
||||||
const char *linphone_core_get_nat_address_resolved(LinphoneCore *lc);
|
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);
|
static void toggle_video_preview(LinphoneCore *lc, bool_t val);
|
||||||
|
|
||||||
/* relative path where is stored local ring*/
|
/* relative path where is stored local ring*/
|
||||||
|
|
@ -1237,6 +1236,9 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta
|
||||||
lc->tunnel=linphone_core_tunnel_new(lc);
|
lc->tunnel=linphone_core_tunnel_new(lc);
|
||||||
if (lc->tunnel) linphone_tunnel_configure(lc->tunnel);
|
if (lc->tunnel) linphone_tunnel_configure(lc->tunnel);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
lc->upnp = linphone_upnp_context_new(lc);
|
||||||
|
#endif //BUILD_UPNP
|
||||||
if (lc->vtable.display_status)
|
if (lc->vtable.display_status)
|
||||||
lc->vtable.display_status(lc,_("Ready"));
|
lc->vtable.display_status(lc,_("Ready"));
|
||||||
lc->auto_net_state_mon=lc->sip_conf.auto_net_state_mon;
|
lc->auto_net_state_mon=lc->sip_conf.auto_net_state_mon;
|
||||||
|
|
@ -1332,6 +1334,14 @@ void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result
|
||||||
strncpy(result,ip,LINPHONE_IPADDR_SIZE);
|
strncpy(result,ip,LINPHONE_IPADDR_SIZE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
else if (lc->upnp != NULL && linphone_core_get_firewall_policy(lc)==LinphonePolicyUseUpnp &&
|
||||||
|
linphone_upnp_context_get_state(lc->upnp) == LinphoneUpnpStateOk) {
|
||||||
|
ip = linphone_upnp_context_get_external_ipaddress(lc->upnp);
|
||||||
|
strncpy(result,ip,LINPHONE_IPADDR_SIZE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
if (linphone_core_get_local_ip_for(lc->sip_conf.ipv6_enabled ? AF_INET6 : AF_INET,dest,result)==0)
|
if (linphone_core_get_local_ip_for(lc->sip_conf.ipv6_enabled ? AF_INET6 : AF_INET,dest,result)==0)
|
||||||
return;
|
return;
|
||||||
/*else fallback to SAL routine that will attempt to find the most realistic interface */
|
/*else fallback to SAL routine that will attempt to find the most realistic interface */
|
||||||
|
|
@ -2025,6 +2035,12 @@ void linphone_core_iterate(LinphoneCore *lc){
|
||||||
linphone_call_delete_ice_session(call);
|
linphone_call_delete_ice_session(call);
|
||||||
linphone_call_stop_media_streams_for_ice_gathering(call);
|
linphone_call_stop_media_streams_for_ice_gathering(call);
|
||||||
}
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if (call->upnp_session != NULL) {
|
||||||
|
ms_warning("uPnP mapping has not finished yet, proceeded with the call without uPnP anyway.");
|
||||||
|
linphone_call_delete_upnp_session(call);
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
linphone_core_start_invite(lc,call);
|
linphone_core_start_invite(lc,call);
|
||||||
}
|
}
|
||||||
if (call->state==LinphoneCallIncomingReceived){
|
if (call->state==LinphoneCallIncomingReceived){
|
||||||
|
|
@ -2280,6 +2296,7 @@ static char *get_fixed_contact(LinphoneCore *lc, LinphoneCall *call , LinphonePr
|
||||||
|
|
||||||
int linphone_core_proceed_with_invite_if_ready(LinphoneCore *lc, LinphoneCall *call, LinphoneProxyConfig *dest_proxy){
|
int linphone_core_proceed_with_invite_if_ready(LinphoneCore *lc, LinphoneCall *call, LinphoneProxyConfig *dest_proxy){
|
||||||
bool_t ice_ready = FALSE;
|
bool_t ice_ready = FALSE;
|
||||||
|
bool_t upnp_ready = FALSE;
|
||||||
bool_t ping_ready = FALSE;
|
bool_t ping_ready = FALSE;
|
||||||
|
|
||||||
if (call->ice_session != NULL) {
|
if (call->ice_session != NULL) {
|
||||||
|
|
@ -2287,13 +2304,20 @@ int linphone_core_proceed_with_invite_if_ready(LinphoneCore *lc, LinphoneCall *c
|
||||||
} else {
|
} else {
|
||||||
ice_ready = TRUE;
|
ice_ready = TRUE;
|
||||||
}
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if (call->upnp_session != NULL) {
|
||||||
|
if (linphone_upnp_session_get_state(call->upnp_session) == LinphoneUpnpStateOk) upnp_ready = TRUE;
|
||||||
|
} else {
|
||||||
|
upnp_ready = TRUE;
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
if (call->ping_op != NULL) {
|
if (call->ping_op != NULL) {
|
||||||
if (call->ping_replied == TRUE) ping_ready = TRUE;
|
if (call->ping_replied == TRUE) ping_ready = TRUE;
|
||||||
} else {
|
} else {
|
||||||
ping_ready = TRUE;
|
ping_ready = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ice_ready == TRUE) && (ping_ready == TRUE)) {
|
if ((ice_ready == TRUE) && (upnp_ready == TRUE) && (ping_ready == TRUE)) {
|
||||||
return linphone_core_start_invite(lc, call);
|
return linphone_core_start_invite(lc, call);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -2441,7 +2465,7 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const
|
||||||
LinphoneAddress *parsed_url2=NULL;
|
LinphoneAddress *parsed_url2=NULL;
|
||||||
char *real_url=NULL;
|
char *real_url=NULL;
|
||||||
LinphoneCall *call;
|
LinphoneCall *call;
|
||||||
bool_t use_ice = FALSE;
|
bool_t defer = FALSE;
|
||||||
|
|
||||||
linphone_core_preempt_sound_resources(lc);
|
linphone_core_preempt_sound_resources(lc);
|
||||||
|
|
||||||
|
|
@ -2494,9 +2518,21 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const
|
||||||
linphone_call_delete_ice_session(call);
|
linphone_call_delete_ice_session(call);
|
||||||
linphone_call_stop_media_streams_for_ice_gathering(call);
|
linphone_call_stop_media_streams_for_ice_gathering(call);
|
||||||
} else {
|
} else {
|
||||||
use_ice = TRUE;
|
defer = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseUpnp) {
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
linphone_call_init_media_streams(call);
|
||||||
|
call->start_time=time(NULL);
|
||||||
|
if (linphone_core_update_upnp(lc,call)<0) {
|
||||||
|
/* uPnP port mappings failed, proceed with the call anyway. */
|
||||||
|
linphone_call_delete_upnp_session(call);
|
||||||
|
} else {
|
||||||
|
defer = TRUE;
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
}
|
||||||
|
|
||||||
if (call->dest_proxy==NULL && lc->sip_conf.ping_with_options==TRUE){
|
if (call->dest_proxy==NULL && lc->sip_conf.ping_with_options==TRUE){
|
||||||
/*defer the start of the call after the OPTIONS ping*/
|
/*defer the start of the call after the OPTIONS ping*/
|
||||||
|
|
@ -2506,7 +2542,7 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const
|
||||||
sal_op_set_user_pointer(call->ping_op,call);
|
sal_op_set_user_pointer(call->ping_op,call);
|
||||||
call->start_time=time(NULL);
|
call->start_time=time(NULL);
|
||||||
}else{
|
}else{
|
||||||
if (use_ice==FALSE) linphone_core_start_invite(lc,call);
|
if (defer==FALSE) linphone_core_start_invite(lc,call);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (real_url!=NULL) ms_free(real_url);
|
if (real_url!=NULL) ms_free(real_url);
|
||||||
|
|
@ -2663,9 +2699,14 @@ void linphone_core_notify_incoming_call(LinphoneCore *lc, LinphoneCall *call){
|
||||||
int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call){
|
int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call){
|
||||||
const char *subject;
|
const char *subject;
|
||||||
call->camera_active=call->params.has_video;
|
call->camera_active=call->params.has_video;
|
||||||
if (call->ice_session != NULL)
|
if (call->ice_session != NULL) {
|
||||||
linphone_core_update_local_media_description_from_ice(call->localdesc, call->ice_session);
|
linphone_core_update_local_media_description_from_ice(call->localdesc, call->ice_session);
|
||||||
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if(call->upnp_session != NULL) {
|
||||||
|
linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session);
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
if (call->params.in_conference){
|
if (call->params.in_conference){
|
||||||
subject="Conference";
|
subject="Conference";
|
||||||
}else{
|
}else{
|
||||||
|
|
@ -2697,21 +2738,53 @@ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const Linpho
|
||||||
linphone_call_set_state(call,LinphoneCallUpdating,"Updating call");
|
linphone_call_set_state(call,LinphoneCallUpdating,"Updating call");
|
||||||
#ifdef VIDEO_ENABLED
|
#ifdef VIDEO_ENABLED
|
||||||
bool_t has_video = call->params.has_video;
|
bool_t has_video = call->params.has_video;
|
||||||
if ((call->ice_session != NULL) && (call->videostream != NULL) && !params->has_video) {
|
|
||||||
ice_session_remove_check_list(call->ice_session, call->videostream->ms.ice_check_list);
|
// Video removing
|
||||||
call->videostream->ms.ice_check_list = NULL;
|
if((call->videostream != NULL) && !params->has_video) {
|
||||||
|
if (call->ice_session != NULL) {
|
||||||
|
ice_session_remove_check_list(call->ice_session, call->videostream->ms.ice_check_list);
|
||||||
|
call->videostream->ms.ice_check_list = NULL;
|
||||||
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if(call->upnp_session != NULL) {
|
||||||
|
if (linphone_core_update_upnp(lc, call)<0) {
|
||||||
|
/* uPnP port mappings failed, proceed with the call anyway. */
|
||||||
|
linphone_call_delete_upnp_session(call);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
}
|
}
|
||||||
|
|
||||||
call->params = *params;
|
call->params = *params;
|
||||||
linphone_call_make_local_media_description(lc, call);
|
linphone_call_make_local_media_description(lc, call);
|
||||||
if ((call->ice_session != NULL) && !has_video && call->params.has_video) {
|
|
||||||
/* Defer call update until the ICE candidates gathering process has finished. */
|
// Video adding
|
||||||
ms_message("Defer call update to gather ICE candidates");
|
if (!has_video && call->params.has_video) {
|
||||||
linphone_call_init_video_stream(call);
|
if (call->ice_session != NULL) {
|
||||||
video_stream_prepare_video(call->videostream);
|
/* Defer call update until the ICE candidates gathering process has finished. */
|
||||||
if (linphone_core_gather_ice_candidates(lc,call)<0) {
|
ms_message("Defer call update to gather ICE candidates");
|
||||||
/* Ice candidates gathering failed, proceed with the call anyway. */
|
linphone_call_init_video_stream(call);
|
||||||
linphone_call_delete_ice_session(call);
|
video_stream_prepare_video(call->videostream);
|
||||||
} else return err;
|
if (linphone_core_gather_ice_candidates(lc,call)<0) {
|
||||||
|
/* Ice candidates gathering failed, proceed with the call anyway. */
|
||||||
|
linphone_call_delete_ice_session(call);
|
||||||
|
} else {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if(call->upnp_session != NULL) {
|
||||||
|
ms_message("Defer call update to add uPnP port mappings");
|
||||||
|
linphone_call_init_video_stream(call);
|
||||||
|
video_stream_prepare_video(call->videostream);
|
||||||
|
if (linphone_core_update_upnp(lc, call)<0) {
|
||||||
|
/* uPnP port mappings failed, proceed with the call anyway. */
|
||||||
|
linphone_call_delete_upnp_session(call);
|
||||||
|
} else {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
err = linphone_core_start_update_call(lc, call);
|
err = linphone_core_start_update_call(lc, call);
|
||||||
|
|
@ -2761,6 +2834,11 @@ int linphone_core_start_accept_call_update(LinphoneCore *lc, LinphoneCall *call)
|
||||||
}
|
}
|
||||||
linphone_core_update_local_media_description_from_ice(call->localdesc, call->ice_session);
|
linphone_core_update_local_media_description_from_ice(call->localdesc, call->ice_session);
|
||||||
}
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if(call->upnp_session != NULL) {
|
||||||
|
linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session);
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
linphone_call_update_remote_session_id_and_ver(call);
|
linphone_call_update_remote_session_id_and_ver(call);
|
||||||
sal_call_set_local_media_description(call->op,call->localdesc);
|
sal_call_set_local_media_description(call->op,call->localdesc);
|
||||||
sal_call_accept(call->op);
|
sal_call_accept(call->op);
|
||||||
|
|
@ -2839,8 +2917,25 @@ int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const
|
||||||
} else return 0;
|
} else return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif //VIDEO_ENABLED
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if BUILD_UPNP
|
||||||
|
if(call->upnp_session != NULL) {
|
||||||
|
linphone_core_update_upnp_from_remote_media_description(call, sal_call_get_remote_media_description(call->op));
|
||||||
|
#ifdef VIDEO_ENABLED
|
||||||
|
if ((call->params.has_video) && (call->params.has_video != old_has_video)) {
|
||||||
|
linphone_call_init_video_stream(call);
|
||||||
|
video_stream_prepare_video(call->videostream);
|
||||||
|
if (linphone_core_update_upnp(lc, call)<0) {
|
||||||
|
/* uPnP update failed, proceed with the call anyway. */
|
||||||
|
linphone_call_delete_upnp_session(call);
|
||||||
|
} else return 0;
|
||||||
|
}
|
||||||
|
#endif //VIDEO_ENABLED
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
|
||||||
linphone_core_start_accept_call_update(lc, call);
|
linphone_core_start_accept_call_update(lc, call);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -2979,6 +3074,11 @@ int linphone_core_abort_call(LinphoneCore *lc, LinphoneCall *call, const char *e
|
||||||
lc->ringstream=NULL;
|
lc->ringstream=NULL;
|
||||||
}
|
}
|
||||||
linphone_call_stop_media_streams(call);
|
linphone_call_stop_media_streams(call);
|
||||||
|
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
linphone_call_delete_upnp_session(call);
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
|
||||||
if (lc->vtable.display_status!=NULL)
|
if (lc->vtable.display_status!=NULL)
|
||||||
lc->vtable.display_status(lc,_("Call aborted") );
|
lc->vtable.display_status(lc,_("Call aborted") );
|
||||||
linphone_call_set_state(call,LinphoneCallError,error);
|
linphone_call_set_state(call,LinphoneCallError,error);
|
||||||
|
|
@ -2997,6 +3097,11 @@ static void terminate_call(LinphoneCore *lc, LinphoneCall *call){
|
||||||
}
|
}
|
||||||
|
|
||||||
linphone_call_stop_media_streams(call);
|
linphone_call_stop_media_streams(call);
|
||||||
|
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
linphone_call_delete_upnp_session(call);
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
|
||||||
if (lc->vtable.display_status!=NULL)
|
if (lc->vtable.display_status!=NULL)
|
||||||
lc->vtable.display_status(lc,_("Call ended") );
|
lc->vtable.display_status(lc,_("Call ended") );
|
||||||
linphone_call_set_state(call,LinphoneCallEnd,"Call terminated");
|
linphone_call_set_state(call,LinphoneCallEnd,"Call terminated");
|
||||||
|
|
@ -3139,8 +3244,14 @@ int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
linphone_call_make_local_media_description(lc,call);
|
linphone_call_make_local_media_description(lc,call);
|
||||||
if (call->ice_session != NULL)
|
if (call->ice_session != NULL) {
|
||||||
linphone_core_update_local_media_description_from_ice(call->localdesc, call->ice_session);
|
linphone_core_update_local_media_description_from_ice(call->localdesc, call->ice_session);
|
||||||
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if(call->upnp_session != NULL) {
|
||||||
|
linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session);
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
if (sal_media_description_has_dir(call->resultdesc,SalStreamSendRecv)){
|
if (sal_media_description_has_dir(call->resultdesc,SalStreamSendRecv)){
|
||||||
sal_media_description_set_dir(call->localdesc,SalStreamSendOnly);
|
sal_media_description_set_dir(call->localdesc,SalStreamSendOnly);
|
||||||
subject="Call on hold";
|
subject="Call on hold";
|
||||||
|
|
@ -3219,8 +3330,14 @@ int linphone_core_resume_call(LinphoneCore *lc, LinphoneCall *the_call)
|
||||||
if (call->audiostream) audio_stream_play(call->audiostream, NULL);
|
if (call->audiostream) audio_stream_play(call->audiostream, NULL);
|
||||||
|
|
||||||
linphone_call_make_local_media_description(lc,the_call);
|
linphone_call_make_local_media_description(lc,the_call);
|
||||||
if (call->ice_session != NULL)
|
if (call->ice_session != NULL) {
|
||||||
linphone_core_update_local_media_description_from_ice(call->localdesc, call->ice_session);
|
linphone_core_update_local_media_description_from_ice(call->localdesc, call->ice_session);
|
||||||
|
}
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
if(call->upnp_session != NULL) {
|
||||||
|
linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session);
|
||||||
|
}
|
||||||
|
#endif //BUILD_UPNP
|
||||||
sal_call_set_local_media_description(call->op,call->localdesc);
|
sal_call_set_local_media_description(call->op,call->localdesc);
|
||||||
sal_media_description_set_dir(call->localdesc,SalStreamSendRecv);
|
sal_media_description_set_dir(call->localdesc,SalStreamSendRecv);
|
||||||
if (call->params.in_conference && !call->current_params.in_conference) subject="Conference";
|
if (call->params.in_conference && !call->current_params.in_conference) subject="Conference";
|
||||||
|
|
@ -4949,6 +5066,12 @@ static void linphone_core_uninit(LinphoneCore *lc)
|
||||||
usleep(50000);
|
usleep(50000);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
linphone_upnp_context_destroy(lc->upnp);
|
||||||
|
lc->upnp = NULL;
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
|
||||||
if (lc->friends)
|
if (lc->friends)
|
||||||
ms_list_for_each(lc->friends,(void (*)(void *))linphone_friend_close_subscriptions);
|
ms_list_for_each(lc->friends,(void (*)(void *))linphone_friend_close_subscriptions);
|
||||||
linphone_core_set_state(lc,LinphoneGlobalShutdown,"Shutting down");
|
linphone_core_set_state(lc,LinphoneGlobalShutdown,"Shutting down");
|
||||||
|
|
|
||||||
|
|
@ -284,6 +284,27 @@ enum _LinphoneIceState{
|
||||||
**/
|
**/
|
||||||
typedef enum _LinphoneIceState LinphoneIceState;
|
typedef enum _LinphoneIceState LinphoneIceState;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum describing uPnP states.
|
||||||
|
* @ingroup initializing
|
||||||
|
**/
|
||||||
|
enum _LinphoneUpnpState{
|
||||||
|
LinphoneUpnpStateIdle, /**< uPnP is not activate */
|
||||||
|
LinphoneUpnpStatePending, /**< uPnP process is in progress */
|
||||||
|
LinphoneUpnpStateAdding, /**< Internal use: Only used by port binding */
|
||||||
|
LinphoneUpnpStateRemoving, /**< Internal use: Only used by port binding */
|
||||||
|
LinphoneUpnpStateNotAvailable, /**< uPnP is not available */
|
||||||
|
LinphoneUpnpStateOk, /**< uPnP is enabled */
|
||||||
|
LinphoneUpnpStateKo, /**< uPnP processing has failed */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum describing uPnP states.
|
||||||
|
* @ingroup initializing
|
||||||
|
**/
|
||||||
|
typedef enum _LinphoneUpnpState LinphoneUpnpState;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The LinphoneCallStats objects carries various statistic informations regarding quality of audio or video streams.
|
* The LinphoneCallStats objects carries various statistic informations regarding quality of audio or video streams.
|
||||||
*
|
*
|
||||||
|
|
@ -309,6 +330,7 @@ struct _LinphoneCallStats {
|
||||||
mblk_t* sent_rtcp;/**<Last RTCP packet sent, as a mblk_t structure. See oRTP documentation for details how to extract information from it*/
|
mblk_t* sent_rtcp;/**<Last RTCP packet sent, as a mblk_t structure. See oRTP documentation for details how to extract information from it*/
|
||||||
float round_trip_delay; /**<Round trip propagation time in seconds if known, -1 if unknown.*/
|
float round_trip_delay; /**<Round trip propagation time in seconds if known, -1 if unknown.*/
|
||||||
LinphoneIceState ice_state; /**< State of ICE processing. */
|
LinphoneIceState ice_state; /**< State of ICE processing. */
|
||||||
|
LinphoneUpnpState upnp_state; /**< State of uPnP processing. */
|
||||||
float download_bandwidth; /**<Download bandwidth measurement of received stream, expressed in kbit/s, including IP/UDP/RTP headers*/
|
float download_bandwidth; /**<Download bandwidth measurement of received stream, expressed in kbit/s, including IP/UDP/RTP headers*/
|
||||||
float upload_bandwidth; /**<Download bandwidth measurement of sent stream, expressed in kbit/s, including IP/UDP/RTP headers*/
|
float upload_bandwidth; /**<Download bandwidth measurement of sent stream, expressed in kbit/s, including IP/UDP/RTP headers*/
|
||||||
};
|
};
|
||||||
|
|
@ -885,7 +907,8 @@ typedef enum _LinphoneFirewallPolicy{
|
||||||
LinphonePolicyNoFirewall,
|
LinphonePolicyNoFirewall,
|
||||||
LinphonePolicyUseNatAddress,
|
LinphonePolicyUseNatAddress,
|
||||||
LinphonePolicyUseStun,
|
LinphonePolicyUseStun,
|
||||||
LinphonePolicyUseIce
|
LinphonePolicyUseIce,
|
||||||
|
LinphonePolicyUseUpnp,
|
||||||
} LinphoneFirewallPolicy;
|
} LinphoneFirewallPolicy;
|
||||||
|
|
||||||
typedef enum _LinphoneWaitingState{
|
typedef enum _LinphoneWaitingState{
|
||||||
|
|
|
||||||
|
|
@ -1021,14 +1021,15 @@ static int get_local_ip_with_getifaddrs(int type, char *address, int size)
|
||||||
if (ifp->ifa_addr && ifp->ifa_addr->sa_family == type
|
if (ifp->ifa_addr && ifp->ifa_addr->sa_family == type
|
||||||
&& (ifp->ifa_flags & UP_FLAG) && !(ifp->ifa_flags & IFF_LOOPBACK))
|
&& (ifp->ifa_flags & UP_FLAG) && !(ifp->ifa_flags & IFF_LOOPBACK))
|
||||||
{
|
{
|
||||||
getnameinfo(ifp->ifa_addr,
|
if(getnameinfo(ifp->ifa_addr,
|
||||||
(type == AF_INET6) ?
|
(type == AF_INET6) ?
|
||||||
sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in),
|
sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in),
|
||||||
address, size, NULL, 0, NI_NUMERICHOST);
|
address, size, NULL, 0, NI_NUMERICHOST) == 0) {
|
||||||
if (strchr(address, '%') == NULL) { /*avoid ipv6 link-local addresses */
|
if (strchr(address, '%') == NULL) { /*avoid ipv6 link-local addresses */
|
||||||
/*ms_message("getifaddrs() found %s",address);*/
|
/*ms_message("getifaddrs() found %s",address);*/
|
||||||
ret++;
|
ret++;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1099,26 +1100,26 @@ static int get_local_ip_for_with_connect(int type, const char *dest, char *resul
|
||||||
}
|
}
|
||||||
|
|
||||||
int linphone_core_get_local_ip_for(int type, const char *dest, char *result){
|
int linphone_core_get_local_ip_for(int type, const char *dest, char *result){
|
||||||
strcpy(result,type==AF_INET ? "127.0.0.1" : "::1");
|
strcpy(result,type==AF_INET ? "127.0.0.1" : "::1");
|
||||||
#ifdef HAVE_GETIFADDRS
|
#ifdef HAVE_GETIFADDRS
|
||||||
if (dest==NULL) {
|
if (dest==NULL) {
|
||||||
/*we use getifaddrs for lookup of default interface */
|
/*we use getifaddrs for lookup of default interface */
|
||||||
int found_ifs;
|
int found_ifs;
|
||||||
|
|
||||||
found_ifs=get_local_ip_with_getifaddrs(type,result,LINPHONE_IPADDR_SIZE);
|
found_ifs=get_local_ip_with_getifaddrs(type,result,LINPHONE_IPADDR_SIZE);
|
||||||
if (found_ifs==1){
|
if (found_ifs==1){
|
||||||
return 0;
|
return 0;
|
||||||
}else if (found_ifs<=0){
|
}else if (found_ifs<=0){
|
||||||
/*absolutely no network on this machine */
|
/*absolutely no network on this machine */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*else use connect to find the best local ip address */
|
/*else use connect to find the best local ip address */
|
||||||
if (type==AF_INET)
|
if (type==AF_INET)
|
||||||
dest="87.98.157.38"; /*a public IP address*/
|
dest="87.98.157.38"; /*a public IP address*/
|
||||||
else dest="2a00:1450:8002::68";
|
else dest="2a00:1450:8002::68";
|
||||||
return get_local_ip_for_with_connect(type,dest,result);
|
return get_local_ip_for_with_connect(type,dest,result);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
|
|
|
||||||
|
|
@ -28,9 +28,11 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#include "linphonecore.h"
|
#include "linphonecore.h"
|
||||||
|
#include "linphonefriend.h"
|
||||||
#include "linphone_tunnel.h"
|
#include "linphone_tunnel.h"
|
||||||
#include "linphonecore_utils.h"
|
#include "linphonecore_utils.h"
|
||||||
#include "sal.h"
|
#include "sal.h"
|
||||||
|
#include "sipsetup.h"
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
@ -38,6 +40,9 @@ extern "C" {
|
||||||
#include "mediastreamer2/ice.h"
|
#include "mediastreamer2/ice.h"
|
||||||
#include "mediastreamer2/mediastream.h"
|
#include "mediastreamer2/mediastream.h"
|
||||||
#include "mediastreamer2/msconference.h"
|
#include "mediastreamer2/msconference.h"
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
#include "upnp.h"
|
||||||
|
#endif //BUILD_UPNP
|
||||||
|
|
||||||
#ifndef LIBLINPHONE_VERSION
|
#ifndef LIBLINPHONE_VERSION
|
||||||
#define LIBLINPHONE_VERSION LINPHONE_VERSION
|
#define LIBLINPHONE_VERSION LINPHONE_VERSION
|
||||||
|
|
@ -145,6 +150,9 @@ struct _LinphoneCall
|
||||||
OrtpEvQueue *videostream_app_evq;
|
OrtpEvQueue *videostream_app_evq;
|
||||||
CallCallbackObj nextVideoFrameDecoded;
|
CallCallbackObj nextVideoFrameDecoded;
|
||||||
LinphoneCallStats stats[2];
|
LinphoneCallStats stats[2];
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
UpnpSession *upnp_session;
|
||||||
|
#endif //BUILD_UPNP
|
||||||
IceSession *ice_session;
|
IceSession *ice_session;
|
||||||
LinphoneChatMessage* pending_message;
|
LinphoneChatMessage* pending_message;
|
||||||
int ping_time;
|
int ping_time;
|
||||||
|
|
@ -286,6 +294,7 @@ void linphone_call_stop_audio_stream(LinphoneCall *call);
|
||||||
void linphone_call_stop_video_stream(LinphoneCall *call);
|
void linphone_call_stop_video_stream(LinphoneCall *call);
|
||||||
void linphone_call_stop_media_streams(LinphoneCall *call);
|
void linphone_call_stop_media_streams(LinphoneCall *call);
|
||||||
void linphone_call_delete_ice_session(LinphoneCall *call);
|
void linphone_call_delete_ice_session(LinphoneCall *call);
|
||||||
|
void linphone_call_delete_upnp_session(LinphoneCall *call);
|
||||||
void linphone_call_stop_media_streams_for_ice_gathering(LinphoneCall *call);
|
void linphone_call_stop_media_streams_for_ice_gathering(LinphoneCall *call);
|
||||||
void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescription *old_md, SalMediaDescription *new_md);
|
void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescription *old_md, SalMediaDescription *new_md);
|
||||||
void linphone_call_update_remote_session_id_and_ver(LinphoneCall *call);
|
void linphone_call_update_remote_session_id_and_ver(LinphoneCall *call);
|
||||||
|
|
@ -565,8 +574,8 @@ struct _LinphoneCore
|
||||||
bool_t network_reachable;
|
bool_t network_reachable;
|
||||||
bool_t use_preview_window;
|
bool_t use_preview_window;
|
||||||
|
|
||||||
time_t network_last_check;
|
time_t network_last_check;
|
||||||
bool_t network_last_status;
|
bool_t network_last_status;
|
||||||
|
|
||||||
bool_t ringstream_autorelease;
|
bool_t ringstream_autorelease;
|
||||||
bool_t pad[3];
|
bool_t pad[3];
|
||||||
|
|
@ -575,6 +584,9 @@ struct _LinphoneCore
|
||||||
LinphoneTunnel *tunnel;
|
LinphoneTunnel *tunnel;
|
||||||
char* device_id;
|
char* device_id;
|
||||||
MSList *last_recv_msg_ids;
|
MSList *last_recv_msg_ids;
|
||||||
|
#ifdef BUILD_UPNP
|
||||||
|
UpnpContext *upnp;
|
||||||
|
#endif //BUILD_UPNP
|
||||||
};
|
};
|
||||||
|
|
||||||
LinphoneTunnel *linphone_core_tunnel_new(LinphoneCore *lc);
|
LinphoneTunnel *linphone_core_tunnel_new(LinphoneCore *lc);
|
||||||
|
|
@ -649,6 +661,9 @@ void call_logs_write_to_config_file(LinphoneCore *lc);
|
||||||
int linphone_core_get_edge_bw(LinphoneCore *lc);
|
int linphone_core_get_edge_bw(LinphoneCore *lc);
|
||||||
int linphone_core_get_edge_ptime(LinphoneCore *lc);
|
int linphone_core_get_edge_ptime(LinphoneCore *lc);
|
||||||
|
|
||||||
|
int linphone_upnp_init(LinphoneCore *lc);
|
||||||
|
void linphone_upnp_destroy(LinphoneCore *lc);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -427,7 +427,7 @@ static dial_plan_t const dial_plans[]={
|
||||||
{"Congo Democratic Republic" ,"CD" , "243" , 9 , "00" },
|
{"Congo Democratic Republic" ,"CD" , "243" , 9 , "00" },
|
||||||
{"Cook Islands" ,"CK" , "682" , 5 , "00" },
|
{"Cook Islands" ,"CK" , "682" , 5 , "00" },
|
||||||
{"Costa Rica" ,"CR" , "506" , 8 , "00" },
|
{"Costa Rica" ,"CR" , "506" , 8 , "00" },
|
||||||
{"C™te d'Ivoire" ,"AD" , "225" , 8 , "00" },
|
{"C<EFBFBD>te d'Ivoire" ,"AD" , "225" , 8 , "00" },
|
||||||
{"Croatia" ,"HR" , "385" , 9 , "00" },
|
{"Croatia" ,"HR" , "385" , 9 , "00" },
|
||||||
{"Cuba" ,"CU" , "53" , 8 , "119" },
|
{"Cuba" ,"CU" , "53" , 8 , "119" },
|
||||||
{"Cyprus" ,"CY" , "357" , 8 , "00" },
|
{"Cyprus" ,"CY" , "357" , 8 , "00" },
|
||||||
|
|
@ -545,7 +545,7 @@ static dial_plan_t const dial_plans[]={
|
||||||
{"Portugal" ,"PT" , "351" , 9 , "00" },
|
{"Portugal" ,"PT" , "351" , 9 , "00" },
|
||||||
{"Puerto Rico" ,"PR" , "1" , 10 , "011" },
|
{"Puerto Rico" ,"PR" , "1" , 10 , "011" },
|
||||||
{"Qatar" ,"QA" , "974" , 8 , "00" },
|
{"Qatar" ,"QA" , "974" , 8 , "00" },
|
||||||
{"RŽunion Island" ,"RE" , "262" , 9 , "011" },
|
{"R<EFBFBD>union Island" ,"RE" , "262" , 9 , "011" },
|
||||||
{"Romania" ,"RO" , "40" , 9 , "00" },
|
{"Romania" ,"RO" , "40" , 9 , "00" },
|
||||||
{"Russian Federation" ,"RU" , "7" , 10 , "8" },
|
{"Russian Federation" ,"RU" , "7" , 10 , "8" },
|
||||||
{"Rwanda" ,"RW" , "250" , 9 , "00" },
|
{"Rwanda" ,"RW" , "250" , 9 , "00" },
|
||||||
|
|
@ -556,7 +556,7 @@ static dial_plan_t const dial_plans[]={
|
||||||
{"Saint Vincent and the Grenadines","VC" , "1" , 10 , "011" },
|
{"Saint Vincent and the Grenadines","VC" , "1" , 10 , "011" },
|
||||||
{"Samoa" ,"WS" , "685" , 7 , "0" },
|
{"Samoa" ,"WS" , "685" , 7 , "0" },
|
||||||
{"San Marino" ,"SM" , "378" , 10 , "00" },
|
{"San Marino" ,"SM" , "378" , 10 , "00" },
|
||||||
{"S‹o TomŽ and Pr’ncipe" ,"ST" , "239" , 7 , "00" },
|
{"S<EFBFBD>o Tom<6F> and Pr<50>ncipe" ,"ST" , "239" , 7 , "00" },
|
||||||
{"Saudi Arabia" ,"SA" , "966" , 9 , "00" },
|
{"Saudi Arabia" ,"SA" , "966" , 9 , "00" },
|
||||||
{"Senegal" ,"SN" , "221" , 9 , "00" },
|
{"Senegal" ,"SN" , "221" , 9 , "00" },
|
||||||
{"Serbia" ,"RS" , "381" , 9 , "00" },
|
{"Serbia" ,"RS" , "381" , 9 , "00" },
|
||||||
|
|
|
||||||
1058
coreapi/upnp.c
Normal file
1058
coreapi/upnp.c
Normal file
File diff suppressed because it is too large
Load diff
45
coreapi/upnp.h
Normal file
45
coreapi/upnp.h
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
linphone
|
||||||
|
Copyright (C) 2012 Belledonne Communications SARL
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LINPHONE_UPNP_H
|
||||||
|
#define LINPHONE_UPNP_H
|
||||||
|
|
||||||
|
#include "mediastreamer2/upnp_igd.h"
|
||||||
|
#include "linphonecore.h"
|
||||||
|
#include "sal.h"
|
||||||
|
|
||||||
|
typedef struct _UpnpSession UpnpSession;
|
||||||
|
typedef struct _UpnpContext UpnpContext;
|
||||||
|
|
||||||
|
int linphone_core_update_local_media_description_from_upnp(SalMediaDescription *desc, UpnpSession *session);
|
||||||
|
int linphone_core_update_upnp_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md);
|
||||||
|
int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call);
|
||||||
|
|
||||||
|
int linphone_upnp_call_process(LinphoneCall *call);
|
||||||
|
UpnpSession* linphone_upnp_session_new(LinphoneCall *call);
|
||||||
|
void linphone_upnp_session_destroy(UpnpSession* session);
|
||||||
|
LinphoneUpnpState linphone_upnp_session_get_state(UpnpSession *session);
|
||||||
|
|
||||||
|
UpnpContext *linphone_upnp_context_new(LinphoneCore *lc);
|
||||||
|
void linphone_upnp_context_destroy(UpnpContext *ctx);
|
||||||
|
LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *ctx);
|
||||||
|
const char *linphone_upnp_context_get_external_ipaddress(UpnpContext *ctx);
|
||||||
|
void linphone_core_update_upnp_state_in_call_stats(LinphoneCall *call);
|
||||||
|
|
||||||
|
#endif //LINPHONE_UPNP_H
|
||||||
|
|
@ -1,71 +1,34 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0"?>
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="2.24"/>
|
<requires lib="gtk+" version="2.24"/>
|
||||||
<!-- interface-naming-policy project-wide -->
|
<!-- interface-naming-policy project-wide -->
|
||||||
<object class="GtkDialog" id="call_statistics">
|
<object class="GtkDialog" id="call_statistics">
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="border_width">5</property>
|
<property name="border_width">5</property>
|
||||||
<property name="title" translatable="yes">Call statistics</property>
|
<property name="title" translatable="yes">Call statistics</property>
|
||||||
<property name="type_hint">dialog</property>
|
<property name="type_hint">dialog</property>
|
||||||
<signal name="response" handler="linphone_gtk_call_statistics_closed" swapped="no"/>
|
<signal name="response" handler="linphone_gtk_call_statistics_closed"/>
|
||||||
<child internal-child="vbox">
|
<child internal-child="vbox">
|
||||||
<object class="GtkVBox" id="dialog-vbox1">
|
<object class="GtkVBox" id="dialog-vbox1">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="spacing">2</property>
|
<property name="spacing">2</property>
|
||||||
<child internal-child="action_area">
|
|
||||||
<object class="GtkHButtonBox" id="dialog-action_area1">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="layout_style">end</property>
|
|
||||||
<child>
|
|
||||||
<placeholder/>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkButton" id="button1">
|
|
||||||
<property name="label">gtk-close</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="receives_default">True</property>
|
|
||||||
<property name="use_action_appearance">False</property>
|
|
||||||
<property name="use_stock">True</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">False</property>
|
|
||||||
<property name="position">1</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="pack_type">end</property>
|
|
||||||
<property name="position">0</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkFrame" id="frame1">
|
<object class="GtkFrame" id="frame1">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label_xalign">0</property>
|
<property name="label_xalign">0</property>
|
||||||
<property name="shadow_type">none</property>
|
<property name="shadow_type">none</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkAlignment" id="alignment1">
|
<object class="GtkAlignment" id="alignment1">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="left_padding">12</property>
|
<property name="left_padding">12</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkTable" id="table1">
|
<object class="GtkTable" id="table1">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="n_rows">6</property>
|
<property name="n_rows">6</property>
|
||||||
<property name="n_columns">2</property>
|
<property name="n_columns">2</property>
|
||||||
<property name="homogeneous">True</property>
|
<property name="homogeneous">True</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="audio_codec_label">
|
<object class="GtkLabel" id="audio_codec_label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label" translatable="yes">Audio codec</property>
|
<property name="label" translatable="yes">Audio codec</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
|
|
@ -75,7 +38,6 @@
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="video_codec_label">
|
<object class="GtkLabel" id="video_codec_label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label" translatable="yes">Video codec</property>
|
<property name="label" translatable="yes">Video codec</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
|
|
@ -87,7 +49,6 @@
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="label3">
|
<object class="GtkLabel" id="label3">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label" translatable="yes">Audio IP bandwidth usage</property>
|
<property name="label" translatable="yes">Audio IP bandwidth usage</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
|
|
@ -99,7 +60,6 @@
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="audio_codec">
|
<object class="GtkLabel" id="audio_codec">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
|
@ -109,7 +69,6 @@
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="video_codec">
|
<object class="GtkLabel" id="video_codec">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
|
@ -121,7 +80,6 @@
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="audio_bandwidth_usage">
|
<object class="GtkLabel" id="audio_bandwidth_usage">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
|
@ -133,8 +91,7 @@
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="label4">
|
<object class="GtkLabel" id="label4">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="label" translatable="yes">Audio Media connectivity</property>
|
||||||
<property name="label" translatable="yes">Media connectivity</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="top_attach">4</property>
|
<property name="top_attach">4</property>
|
||||||
|
|
@ -143,15 +100,8 @@
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<placeholder/>
|
<object class="GtkLabel" id="audio_media_connectivity">
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<placeholder/>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkLabel" id="media_connectivity">
|
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
|
@ -163,7 +113,6 @@
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="label1">
|
<object class="GtkLabel" id="label1">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label" translatable="yes">Video IP bandwidth usage</property>
|
<property name="label" translatable="yes">Video IP bandwidth usage</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
|
|
@ -175,7 +124,6 @@
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="video_bandwidth_usage">
|
<object class="GtkLabel" id="video_bandwidth_usage">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="left_attach">1</property>
|
<property name="left_attach">1</property>
|
||||||
|
|
@ -184,6 +132,27 @@
|
||||||
<property name="bottom_attach">4</property>
|
<property name="bottom_attach">4</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label" translatable="yes">Video Media connectivity</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="top_attach">5</property>
|
||||||
|
<property name="bottom_attach">6</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="video_media_connectivity">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="right_attach">2</property>
|
||||||
|
<property name="top_attach">5</property>
|
||||||
|
<property name="bottom_attach">6</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|
@ -191,7 +160,6 @@
|
||||||
<child type="label">
|
<child type="label">
|
||||||
<object class="GtkLabel" id="call_statistics_label">
|
<object class="GtkLabel" id="call_statistics_label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label" translatable="yes"><b>Call statistics and information</b></property>
|
<property name="label" translatable="yes"><b>Call statistics and information</b></property>
|
||||||
<property name="use_markup">True</property>
|
<property name="use_markup">True</property>
|
||||||
</object>
|
</object>
|
||||||
|
|
@ -203,6 +171,34 @@
|
||||||
<property name="position">1</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child internal-child="action_area">
|
||||||
|
<object class="GtkHButtonBox" id="dialog-action_area1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="layout_style">end</property>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="button1">
|
||||||
|
<property name="label">gtk-close</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="use_stock">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="pack_type">end</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<action-widgets>
|
<action-widgets>
|
||||||
|
|
|
||||||
|
|
@ -231,10 +231,29 @@ static const char *ice_state_to_string(LinphoneIceState ice_state){
|
||||||
return "invalid";
|
return "invalid";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *upnp_state_to_string(LinphoneUpnpState ice_state){
|
||||||
|
switch(ice_state){
|
||||||
|
case LinphoneUpnpStateIdle:
|
||||||
|
return _("uPnP not activated");
|
||||||
|
case LinphoneUpnpStatePending:
|
||||||
|
return _("uPnP in progress");
|
||||||
|
case LinphoneUpnpStateNotAvailable:
|
||||||
|
return _("uPnp not available");
|
||||||
|
case LinphoneUpnpStateOk:
|
||||||
|
return _("uPnP is running");
|
||||||
|
case LinphoneUpnpStateKo:
|
||||||
|
return _("uPnP failed");
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "invalid";
|
||||||
|
}
|
||||||
|
|
||||||
static void _refresh_call_stats(GtkWidget *callstats, LinphoneCall *call){
|
static void _refresh_call_stats(GtkWidget *callstats, LinphoneCall *call){
|
||||||
const LinphoneCallStats *as=linphone_call_get_audio_stats(call);
|
const LinphoneCallStats *as=linphone_call_get_audio_stats(call);
|
||||||
const LinphoneCallStats *vs=linphone_call_get_video_stats(call);
|
const LinphoneCallStats *vs=linphone_call_get_video_stats(call);
|
||||||
LinphoneIceState ice_state=as->ice_state;
|
const char *audio_media_connectivity = _("Direct");
|
||||||
|
const char *video_media_connectivity = _("Direct");
|
||||||
gchar *tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"),
|
gchar *tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"),
|
||||||
as->download_bandwidth,as->upload_bandwidth);
|
as->download_bandwidth,as->upload_bandwidth);
|
||||||
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"audio_bandwidth_usage")),tmp);
|
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"audio_bandwidth_usage")),tmp);
|
||||||
|
|
@ -243,7 +262,18 @@ static void _refresh_call_stats(GtkWidget *callstats, LinphoneCall *call){
|
||||||
vs->download_bandwidth,vs->upload_bandwidth);
|
vs->download_bandwidth,vs->upload_bandwidth);
|
||||||
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"video_bandwidth_usage")),tmp);
|
gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"video_bandwidth_usage")),tmp);
|
||||||
g_free(tmp);
|
g_free(tmp);
|
||||||
gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"media_connectivity")),ice_state_to_string(ice_state));
|
if(as->upnp_state != LinphoneUpnpStateNotAvailable && as->upnp_state != LinphoneUpnpStateIdle) {
|
||||||
|
audio_media_connectivity = upnp_state_to_string(as->upnp_state);
|
||||||
|
} else if(as->ice_state != LinphoneIceStateNotActivated) {
|
||||||
|
audio_media_connectivity = ice_state_to_string(as->ice_state);
|
||||||
|
}
|
||||||
|
gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"audio_media_connectivity")),audio_media_connectivity);
|
||||||
|
if(vs->upnp_state != LinphoneUpnpStateNotAvailable && vs->upnp_state != LinphoneUpnpStateIdle) {
|
||||||
|
video_media_connectivity = upnp_state_to_string(vs->upnp_state);
|
||||||
|
} else if(vs->ice_state != LinphoneIceStateNotActivated) {
|
||||||
|
video_media_connectivity = ice_state_to_string(vs->ice_state);
|
||||||
|
}
|
||||||
|
gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"video_media_connectivity")),video_media_connectivity);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean refresh_call_stats(GtkWidget *callstats){
|
static gboolean refresh_call_stats(GtkWidget *callstats){
|
||||||
|
|
|
||||||
|
|
@ -765,6 +765,23 @@
|
||||||
<property name="position">3</property>
|
<property name="position">3</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkRadioButton" id="use_upnp">
|
||||||
|
<property name="label" translatable="yes">Behind NAT / Firewall (use uPnP)</property>
|
||||||
|
<property name="use_action_appearance">False</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">False</property>
|
||||||
|
<property name="draw_indicator">True</property>
|
||||||
|
<property name="group">no_nat</property>
|
||||||
|
<signal name="toggled" handler="linphone_gtk_use_upnp_toggled" swapped="no"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">True</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkHBox" id="hbox24">
|
<object class="GtkHBox" id="hbox24">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
|
|
||||||
|
|
@ -236,6 +236,11 @@ void linphone_gtk_use_ice_toggled(GtkWidget *w){
|
||||||
linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseIce);
|
linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseIce);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void linphone_gtk_use_upnp_toggled(GtkWidget *w){
|
||||||
|
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
|
||||||
|
linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseUpnp);
|
||||||
|
}
|
||||||
|
|
||||||
void linphone_gtk_mtu_changed(GtkWidget *w){
|
void linphone_gtk_mtu_changed(GtkWidget *w){
|
||||||
if (GTK_WIDGET_SENSITIVE(w))
|
if (GTK_WIDGET_SENSITIVE(w))
|
||||||
linphone_core_set_mtu(linphone_gtk_get_core(),gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)));
|
linphone_core_set_mtu(linphone_gtk_get_core(),gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)));
|
||||||
|
|
@ -1074,6 +1079,9 @@ void linphone_gtk_show_parameters(void){
|
||||||
case LinphonePolicyUseIce:
|
case LinphonePolicyUseIce:
|
||||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_ice")),TRUE);
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_ice")),TRUE);
|
||||||
break;
|
break;
|
||||||
|
case LinphonePolicyUseUpnp:
|
||||||
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_upnp")),TRUE);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
mtu=linphone_core_get_mtu(lc);
|
mtu=linphone_core_get_mtu(lc);
|
||||||
if (mtu<=0){
|
if (mtu<=0){
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 3a231efb89305d775ab39a6866ee981a891aed7e
|
Subproject commit 2e0ef7e31e919b524cfbe1ff4ffbc409fce3599c
|
||||||
Loading…
Add table
Reference in a new issue