liblinphone_la_SOURCES+=sipwizard.c
endif
++liblinphone_la_SOURCES+=linphone_tunnel_config.c
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
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 {
+ belledonnecomm::TunnelManager *manager;
+ MSList *config_list;
+ };
+
+ extern "C" LinphoneTunnel* linphone_core_tunnel_new(LinphoneCore *lc){
+ LinphoneTunnel* tunnel = ms_new0(LinphoneTunnel, 1);
+ tunnel->manager = new belledonnecomm::TunnelManager(lc);
+ return tunnel;
+ }
+
static inline belledonnecomm::TunnelManager *bcTunnel(LinphoneTunnel *tunnel){
- return (belledonnecomm::TunnelManager *)tunnel;
+ return tunnel->manager;
}
static inline _LpConfig *config(LinphoneTunnel *tunnel){
- return ((belledonnecomm::TunnelManager *)tunnel)->getLinphoneCore()->config;
+ return tunnel->manager->getLinphoneCore()->config;
}
- extern "C" LinphoneTunnel* linphone_core_tunnel_new(LinphoneCore *lc){
- LinphoneTunnel* tunnel= (LinphoneTunnel*) new belledonnecomm::TunnelManager(lc);
- return tunnel;
+ void linphone_tunnel_destroy(LinphoneTunnel *tunnel){
+ delete tunnel->manager;
+ ms_free(tunnel);
}
- void linphone_tunnel_destroy(LinphoneTunnel *tunnel){
- delete bcTunnel(tunnel);
+ static char *linphone_tunnel_config_to_string(const LinphoneTunnelConfig *tunnel_config) {
+ 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",
- tunnel_config->host,
- tunnel_config->port,
- tunnel_config->remote_udp_mirror_port,
- tunnel_config->delay);
++ linphone_tunnel_config_get_host(tunnel_config),
++ linphone_tunnel_config_get_port(tunnel_config),
++ linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config),
++ linphone_tunnel_config_get_delay(tunnel_config));
+ } else {
+ str = ms_strdup_printf("%s:%d",
- tunnel_config->host,
- tunnel_config->port);
++ linphone_tunnel_config_get_host(tunnel_config),
++ linphone_tunnel_config_get_port(tunnel_config));
+ }
+ return str;
+ }
+
+ static LinphoneTunnelConfig *linphone_tunnel_config_from_string(const char *str) {
+ LinphoneTunnelConfig *tunnel_config = NULL;
+ char * dstr = ms_strdup(str);
+ const char *host = NULL;
+ int port = -1;
+ int remote_udp_mirror_port = -1;
+ int delay = -1;
+ int pos = 0;
+ char *pch;
+ pch = strtok(dstr, ":");
+ while(pch != NULL) {
+ switch(pos) {
+ case 0:
+ host = pch;
+ break;
+ case 1:
+ port = atoi(pch);
+ break;
+ case 2:
+ remote_udp_mirror_port = atoi(pch);
+ break;
+ case 3:
+ delay = atoi(pch);
+ break;
+ default:
+ // Abort
+ pos = 0;
+ break;
+
+ }
+ ++pos;
+ pch = strtok(NULL, ":");
+ }
+ if(pos >= 2) {
+ tunnel_config = linphone_tunnel_config_new();
+ linphone_tunnel_config_set_host(tunnel_config, host);
+ linphone_tunnel_config_set_port(tunnel_config, port);
+ }
+ if(pos >= 3) {
+ linphone_tunnel_config_set_remote_udp_mirror_port(tunnel_config, remote_udp_mirror_port);
+ }
+ if(pos == 4) {
+ linphone_tunnel_config_set_delay(tunnel_config, delay);
+ }
+ ms_free(dstr);
+ return tunnel_config;
}
- static void add_server_to_config(LinphoneTunnel *tunnel, const char *host, int port){
- const char *orig=lp_config_get_string(config(tunnel),"tunnel","server_addresses", NULL);
+
+ static void linphone_tunnel_save_config(LinphoneTunnel *tunnel) {
+ MSList *elem = tunnel->config_list;
+ char *tmp = NULL, *old_tmp = NULL, *tc_str = NULL;
+ while(elem != NULL) {
+ LinphoneTunnelConfig *tunnel_config = (LinphoneTunnelConfig *)elem->data;
+ tc_str = linphone_tunnel_config_to_string(tunnel_config);
+ if(tmp != NULL) {
+ old_tmp = tmp;
+ tmp = ms_strdup_printf("%s %s", old_tmp, tc_str);
+ ms_free(old_tmp);
+ ms_free(tc_str);
+ } else {
+ tmp = tc_str;
+ }
+ elem = elem->next;
+ }
+ lp_config_set_string(config(tunnel), "tunnel", "server_addresses", tmp);
+ if(tmp != NULL) {
+ ms_free(tmp);
+ }
+ }
+
+
+ static void linphone_tunnel_add_server_intern(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config) {
- if(tunnel_config->remote_udp_mirror_port == -1) {
- bcTunnel(tunnel)->addServer(tunnel_config->host, tunnel_config->port);
++ if(linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config) == -1) {
++ bcTunnel(tunnel)->addServer(linphone_tunnel_config_get_host(tunnel_config),
++ linphone_tunnel_config_get_port(tunnel_config));
+ } else {
- bcTunnel(tunnel)->addServer(tunnel_config->host, tunnel_config->port,
- tunnel_config->remote_udp_mirror_port, tunnel_config->delay);
++ bcTunnel(tunnel)->addServer(linphone_tunnel_config_get_host(tunnel_config),
++ 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);
+ }
+
+
+ static void linphone_tunnel_load_config(LinphoneTunnel *tunnel){
+ const char * confaddress = lp_config_get_string(config(tunnel), "tunnel", "server_addresses", NULL);
char *tmp;
- if (orig){
- tmp=ms_strdup_printf("%s %s:%i",orig,host,port);
- }else tmp=ms_strdup_printf("%s:%i",host, port);
- lp_config_set_string(config(tunnel),"tunnel","server_addresses",tmp);
- ms_free(tmp);
+ const char *it;
+ LinphoneTunnelConfig *tunnel_config;
+ int adv;
+ if(confaddress != NULL) {
+ tmp = ms_strdup(confaddress);
+ it = confaddress;
+ while(confaddress[0] != '\0') {
+ int ret = sscanf(it,"%s%n", tmp, &adv);
+ if (ret >= 1){
+ it += adv;
+ tunnel_config = linphone_tunnel_config_from_string(tmp);
+ if(tunnel_config != NULL) {
+ linphone_tunnel_add_server_intern(tunnel, tunnel_config);
+ } else {
+ ms_error("Tunnel server address incorrectly specified from config file: %s", tmp);
+ }
+ } else break;
+ }
+ ms_free(tmp);
+ }
+ }
+
+ static void linphone_tunnel_refresh_config(LinphoneTunnel *tunnel) {
+ MSList *old_list = tunnel->config_list;
+ tunnel->config_list = NULL;
+ bcTunnel(tunnel)->cleanServers();
+ while(old_list != NULL) {
+ LinphoneTunnelConfig *tunnel_config = (LinphoneTunnelConfig *)old_list->data;
+ linphone_tunnel_add_server_intern(tunnel, tunnel_config);
+ old_list = old_list->next;
+ }
}
- void linphone_tunnel_add_server(LinphoneTunnel *tunnel, const char *host, int port){
- bcTunnel(tunnel)->addServer(host, port);
- add_server_to_config(tunnel,host,port);
+ void linphone_tunnel_add_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config) {
+ linphone_tunnel_add_server_intern(tunnel, tunnel_config);
+ linphone_tunnel_save_config(tunnel);
}
- void linphone_tunnel_add_server_and_mirror(LinphoneTunnel *tunnel, const char *host, int port, int remote_udp_mirror, int delay){
- bcTunnel(tunnel)->addServer(host, port, remote_udp_mirror, delay);
- /*FIXME, udp-mirror feature not saved in config*/
- add_server_to_config(tunnel,host,port);
+ void linphone_tunnel_remove_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config) {
+ MSList *elem = ms_list_find(tunnel->config_list, tunnel_config);
+ if(elem != NULL) {
+ tunnel->config_list = ms_list_remove(tunnel->config_list, tunnel_config);
+ linphone_tunnel_config_destroy(tunnel_config);
+ linphone_tunnel_refresh_config(tunnel);
+ linphone_tunnel_save_config(tunnel);
+ }
}
- char *linphone_tunnel_get_servers(LinphoneTunnel *tunnel){
- const char *tmp=lp_config_get_string(config(tunnel),"tunnel","server_addresses",NULL);
- if (tmp) return ms_strdup(tmp);
- return NULL;
+ const MSList *linphone_tunnel_get_servers(LinphoneTunnel *tunnel){
+ return tunnel->config_list;
}
void linphone_tunnel_clean_servers(LinphoneTunnel *tunnel){
{
#endif
+ typedef struct _LinphoneTunnelConfig LinphoneTunnelConfig;
+
/**
- * Add a tunnel server. At least one should be provided to be able to connect.
- * When several addresses are provided, the tunnel client may try each of them until it gets connected.
- * @param tunnel object
- * @param host server ip address
- * @param port tunnel server tls port, recommended value is 443
+ * Create a new tunnel configuration
*/
- void linphone_tunnel_add_server(LinphoneTunnel *tunnel, const char *host, int port);
+ LinphoneTunnelConfig *linphone_tunnel_config_new();
+
/**
- *Add tunnel server with auto detection capabilities
+ * Set address of server.
*
- * @param tunnel object
+ * @param tunnel configuration object
* @param host tunnel server ip address
-const char *linphone_tunnel_config_get_host(LinphoneTunnelConfig *tunnel);
+ */
+ void linphone_tunnel_config_set_host(LinphoneTunnelConfig *tunnel, const char *host);
+
+ /**
+ * Get address of server.
+ *
+ * @param tunnel configuration object
+ */
++const char *linphone_tunnel_config_get_host(const LinphoneTunnelConfig *tunnel);
+
+ /**
+ * Set tls port of server.
+ *
+ * @param tunnel configuration object
* @param port tunnel server tls port, recommended value is 443
- * @param remote_udp_mirror_port remote port on the tunnel server side used to test udp reachability
+ */
+ void linphone_tunnel_config_set_port(LinphoneTunnelConfig *tunnel, int port);
+
+ /**
+ * Get tls port of server.
+ *
+ * @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.
+ *
+ * @param tunnel configuration object
+ * @param remote_udp_mirror_port remote port on the tunnel server side used to test udp reachability, set to -1 to disable the feature
+ */
+ void linphone_tunnel_config_set_remote_udp_mirror_port(LinphoneTunnelConfig *tunnel, int remote_udp_mirror_port);
+
+ /**
+ * Get the remote port on the tunnel server side used to test udp reachability.
+ *
+ * @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.
+ *
+ * @param tunnel configuration object
* @param delay udp packet round trip delay in ms considered as acceptable. recommended value is 1000 ms.
*/
- void linphone_tunnel_add_server_and_mirror(LinphoneTunnel *tunnel, const char *host, int port, int remote_udp_mirror_port, int delay);
+ void linphone_tunnel_config_set_delay(LinphoneTunnelConfig *tunnel, int delay);
+
+ /**
+ * Get the udp packet round trip delay in ms for a tunnel configuration.
+ *
+ * @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
+ *
+ * @param tunnel configuration object
+ */
+ void linphone_tunnel_config_destroy(LinphoneTunnelConfig *tunnel);
+
+ /**
+ * Add tunnel server configuration
+ *
+ * @param tunnel object
+ * @param tunnel_config object
+ */
+ void linphone_tunnel_add_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config);
+
+ /**
+ * Remove tunnel server configuration
+ *
+ * @param tunnel object
+ * @param tunnel_config object
+ */
+ void linphone_tunnel_remove_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config);
+
/**
* @param tunnel object
* returns a string of space separated list of host:port of tunnel server addresses
--- /dev/null
--- /dev/null
++/***************************************************************************
++ * 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);
++}
++
--- /dev/null
- void linphone_tunnel_add_server(LinphoneTunnel *tunnel, const char *host, int port){
+/***************************************************************************
+ * 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_and_mirror(LinphoneTunnel *tunnel, const char *host, int port, int remote_udp_mirror, int delay){
++
++void linphone_tunnel_add_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config){
+}
+
- char *linphone_tunnel_get_servers(LinphoneTunnel *tunnel){
- return NULL;
++void linphone_tunnel_remove_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config){
+}
+
- return FALSE;
++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){
+}
+
static void linphone_core_free_hooks(LinphoneCore *lc);
#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);
/* relative path where is stored local ring*/
- Subproject commit b8dffb2741223e13baa4c9d1514a1911d070b0e7
-Subproject commit d5811e376759433da3c19585b2d8d0329e1c06b2
++Subproject commit 1cf3b8e36d832d763220b762c6bceef0db88c04c