From deccbd69636e4181e22cb5288ff494169494064e Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 19 Dec 2012 15:41:23 +0100 Subject: [PATCH 001/281] Start including upnp --- configure.ac | 26 +++++++++++++++++++++++ coreapi/Makefile.am | 4 ++++ coreapi/private.h | 13 ++++++++++-- coreapi/upnp.c | 51 +++++++++++++++++++++++++++++++++++++++++++++ mediastreamer2 | 2 +- 5 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 coreapi/upnp.c diff --git a/configure.ac b/configure.ac index 1005ab2f5..659a872b4 100644 --- a/configure.ac +++ b/configure.ac @@ -149,6 +149,32 @@ AC_ARG_ENABLE(tools, *) AC_MSG_ERROR(bad value ${enableval} for --enable-tools) ;; 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) if test "$build_tools" != "false" ; then PKG_CHECK_MODULES(LIBXML2, [libxml-2.0],[], diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index 790612cab..6d55a731f 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -49,6 +49,10 @@ liblinphone_la_SOURCES=\ conference.c \ linphone_tunnel.cc \ $(GITVERSION_FILE) + +if BUILD_UPNP +liblinphone_la_SOURCES+=upnp.c +endif if BUILD_WIZARD liblinphone_la_SOURCES+=sipwizard.c diff --git a/coreapi/private.h b/coreapi/private.h index 925a30360..f69eb2ff0 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -38,6 +38,9 @@ extern "C" { #include "mediastreamer2/ice.h" #include "mediastreamer2/mediastream.h" #include "mediastreamer2/msconference.h" +#ifdef BUILD_UPNP +#include "mediastreamer2/upnp_igd.h" +#endif #ifndef LIBLINPHONE_VERSION #define LIBLINPHONE_VERSION LINPHONE_VERSION @@ -558,8 +561,8 @@ struct _LinphoneCore bool_t network_reachable; bool_t use_preview_window; - time_t network_last_check; - bool_t network_last_status; + time_t network_last_check; + bool_t network_last_status; bool_t ringstream_autorelease; bool_t pad[3]; @@ -568,6 +571,9 @@ struct _LinphoneCore LinphoneTunnel *tunnel; char* device_id; MSList *last_recv_msg_ids; +#ifdef BUILD_UPNP + upnp_igd_context *upnp_igd_ctxt; +#endif }; LinphoneTunnel *linphone_core_tunnel_new(LinphoneCore *lc); @@ -642,6 +648,9 @@ void call_logs_write_to_config_file(LinphoneCore *lc); int linphone_core_get_edge_bw(LinphoneCore *lc); int linphone_core_get_edge_ptime(LinphoneCore *lc); +int linphone_upnp_init(LinphoneCore *lc); +void linphone_upnp_destroy(LinphoneCore *lc); + #ifdef __cplusplus } #endif diff --git a/coreapi/upnp.c b/coreapi/upnp.c new file mode 100644 index 000000000..31fb5c5f1 --- /dev/null +++ b/coreapi/upnp.c @@ -0,0 +1,51 @@ +/* +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. +*/ + +#include "private.h" +#include "mediastreamer2/upnp_igd.h" + +/* Convert uPnP IGD logs to ortp logs */ +void linphone_upnp_igd_print(void *cookie, upnp_igd_print_level level, const char *fmt, va_list list) { + int ortp_level = ORTP_DEBUG; + switch(level) { + case UPNP_IGD_MESSAGE: + ortp_level = ORTP_MESSAGE; + break; + case UPNP_IGD_WARNING: + ortp_level = ORTP_WARNING; + break; + case UPNP_IGD_ERROR: + ortp_level = ORTP_ERROR; + break; + default: + break; + } + ortp_logv(level, fmt, list); +} + +void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { +} + +int linphone_upnp_init(LinphoneCore *lc) { + lc->upnp_igd_ctxt = NULL; + return 0; +} +void linphone_upnp_destroy(LinphoneCore *lc) { + +} diff --git a/mediastreamer2 b/mediastreamer2 index 9c3f1bdf1..2093868ac 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 9c3f1bdf1f7b51c5eeb020f68ef9a4019c66cc52 +Subproject commit 2093868ac68ffe62310cd0ad20b58ffa6860d7e3 From 8ef5af3e1bf7b2f8484d9e89e77974348b2a3183 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 20 Dec 2012 17:09:44 +0100 Subject: [PATCH 002/281] Fix static build in gtk --- gtk/Makefile.am | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gtk/Makefile.am b/gtk/Makefile.am index d31a05bfe..111be5cb8 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -54,10 +54,11 @@ linphone_SOURCES+= \ setupwizard.c endif -linphone_LDADD=$(ORTP_LIBS) \ - $(MEDIASTREAMER_LIBS) \ +linphone_LDADD=\ $(top_builddir)/coreapi/liblinphone.la \ - $(LIBGTK_LIBS) $(NOTIFY1_LIBS) $(NOTIFY4_LIBS) $(LIBGTKMAC_LIBS) $(INTLLIBS) + $(ORTP_LIBS) \ + $(MEDIASTREAMER_LIBS) \ + $(LIBGTK_LIBS) $(NOTIFY1_LIBS) $(NOTIFY4_LIBS) $(LIBGTKMAC_LIBS) $(INTLLIBS) if BUILD_WIN32 From 9898c4beec0ce507becb1493b02ad2965f20a116 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 20 Dec 2012 17:34:36 +0100 Subject: [PATCH 003/281] Fix static build split tunnel stubs --- coreapi/Makefile.am | 5 +- coreapi/linphone_tunnel.cc | 61 ------------------------- coreapi/linphone_tunnel_stubs.c | 81 +++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 63 deletions(-) create mode 100644 coreapi/linphone_tunnel_stubs.c diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index 6d55a731f..822c0b836 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -47,7 +47,6 @@ liblinphone_la_SOURCES=\ lsd.c linphonecore_utils.h \ ec-calibrator.c \ conference.c \ - linphone_tunnel.cc \ $(GITVERSION_FILE) if BUILD_UPNP @@ -59,7 +58,9 @@ liblinphone_la_SOURCES+=sipwizard.c endif 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 diff --git a/coreapi/linphone_tunnel.cc b/coreapi/linphone_tunnel.cc index f5a5d361f..18fabbbe9 100644 --- a/coreapi/linphone_tunnel.cc +++ b/coreapi/linphone_tunnel.cc @@ -23,9 +23,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef TUNNEL_ENABLED #include "TunnelManager.hh" -#endif #include "linphone_tunnel.h" #include "linphonecore.h" #include "private.h" @@ -36,8 +34,6 @@ LinphoneTunnel* linphone_core_get_tunnel(LinphoneCore *lc){ return lc->tunnel; } -#ifdef TUNNEL_ENABLED - static inline belledonnecomm::TunnelManager *bcTunnel(LinphoneTunnel *tunnel){ return (belledonnecomm::TunnelManager *)tunnel; } @@ -212,60 +208,3 @@ void linphone_tunnel_configure(LinphoneTunnel *tunnel){ 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, const char *host, int port){ -} - -void linphone_tunnel_add_server_and_mirror(LinphoneTunnel *tunnel, const char *host, int port, int remote_udp_mirror, int delay){ -} - -char *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 - - - - - diff --git a/coreapi/linphone_tunnel_stubs.c b/coreapi/linphone_tunnel_stubs.c new file mode 100644 index 000000000..d7fb27796 --- /dev/null +++ b/coreapi/linphone_tunnel_stubs.c @@ -0,0 +1,81 @@ +/*************************************************************************** + * 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, const char *host, int port){ +} + +void linphone_tunnel_add_server_and_mirror(LinphoneTunnel *tunnel, const char *host, int port, int remote_udp_mirror, int delay){ +} + +char *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){ +} + From 8026b597a768480a062b0cb43dcee6db84f8c939 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 21 Dec 2012 10:11:06 +0100 Subject: [PATCH 004/281] Starting uPNP integration --- coreapi/Makefile.am | 2 +- coreapi/linphonecall.c | 5 +++++ coreapi/linphonecore.c | 6 ++++++ coreapi/linphonecore.h | 3 ++- coreapi/private.h | 13 +++++++++---- coreapi/upnp.c | 35 ++++++++++++++++++++++++++++++----- coreapi/upnp.h | 38 ++++++++++++++++++++++++++++++++++++++ mediastreamer2 | 2 +- 8 files changed, 92 insertions(+), 12 deletions(-) create mode 100644 coreapi/upnp.h diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index 822c0b836..c5abd0360 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -50,7 +50,7 @@ liblinphone_la_SOURCES=\ $(GITVERSION_FILE) if BUILD_UPNP -liblinphone_la_SOURCES+=upnp.c +liblinphone_la_SOURCES+=upnp.c upnp.h endif if BUILD_WIZARD diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 5a18a0525..6c8b4a743 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -449,6 +449,11 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseStun) { 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 = upnp_session_new(); + } +#endif //BUILD_UPNP call->camera_active=params->has_video; discover_mtu(lc,linphone_address_get_domain (to)); diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index e52fff00e..8619552fa 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1217,6 +1217,9 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta #ifdef TUNNEL_ENABLED lc->tunnel=linphone_core_tunnel_new(lc); if (lc->tunnel) linphone_tunnel_configure(lc->tunnel); +#endif +#ifdef BUILD_UPNP + upnp_context_init(lc); #endif if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Ready")); @@ -4901,6 +4904,9 @@ static void linphone_core_uninit(LinphoneCore *lc) #ifdef TUNNEL_ENABLED if (lc->tunnel) linphone_tunnel_destroy(lc->tunnel); #endif +#ifdef BUILD_UPNP + upnp_context_uninit(lc); +#endif } static void set_network_reachable(LinphoneCore* lc,bool_t isReachable, time_t curtime){ diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index f1a9174c8..b4c25380a 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -885,7 +885,8 @@ typedef enum _LinphoneFirewallPolicy{ LinphonePolicyNoFirewall, LinphonePolicyUseNatAddress, LinphonePolicyUseStun, - LinphonePolicyUseIce + LinphonePolicyUseIce, + LinphonePolicyUseUpnp, } LinphoneFirewallPolicy; typedef enum _LinphoneWaitingState{ diff --git a/coreapi/private.h b/coreapi/private.h index f69eb2ff0..6af7e09ee 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -28,9 +28,11 @@ extern "C" { #endif #include "linphonecore.h" +#include "linphonefriend.h" #include "linphone_tunnel.h" #include "linphonecore_utils.h" #include "sal.h" +#include "sipsetup.h" #ifdef HAVE_CONFIG_H #include "config.h" @@ -39,7 +41,7 @@ extern "C" { #include "mediastreamer2/mediastream.h" #include "mediastreamer2/msconference.h" #ifdef BUILD_UPNP -#include "mediastreamer2/upnp_igd.h" +#include "upnp.h" #endif #ifndef LIBLINPHONE_VERSION @@ -148,6 +150,9 @@ struct _LinphoneCall OrtpEvQueue *videostream_app_evq; CallCallbackObj nextVideoFrameDecoded; LinphoneCallStats stats[2]; +#ifdef BUILD_UPNP + UpnpSession *upnp_session; +#endif //BUILD_UPNP IceSession *ice_session; LinphoneChatMessage* pending_message; int ping_time; @@ -572,15 +577,15 @@ struct _LinphoneCore char* device_id; MSList *last_recv_msg_ids; #ifdef BUILD_UPNP - upnp_igd_context *upnp_igd_ctxt; -#endif + UpnpContext upnp; +#endif //BUILD_UPNP }; LinphoneTunnel *linphone_core_tunnel_new(LinphoneCore *lc); void linphone_tunnel_destroy(LinphoneTunnel *tunnel); void linphone_tunnel_configure(LinphoneTunnel *tunnel); void linphone_tunnel_enable_logs_with_handler(LinphoneTunnel *tunnel, bool_t enabled, OrtpLogFunc logHandler); - + bool_t linphone_core_can_we_add_call(LinphoneCore *lc); int linphone_core_add_call( LinphoneCore *lc, LinphoneCall *call); int linphone_core_del_call( LinphoneCore *lc, LinphoneCall *call); diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 31fb5c5f1..34622bf51 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -17,8 +17,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "upnp.h" #include "private.h" -#include "mediastreamer2/upnp_igd.h" /* Convert uPnP IGD logs to ortp logs */ void linphone_upnp_igd_print(void *cookie, upnp_igd_print_level level, const char *fmt, va_list list) { @@ -36,16 +36,41 @@ void linphone_upnp_igd_print(void *cookie, upnp_igd_print_level level, const cha default: break; } - ortp_logv(level, fmt, list); + ortp_logv(ortp_level, fmt, list); } void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { + LinphoneCore *lc = (LinphoneCore *)cookie; + UpnpContext *lupnp = &lc->upnp; + switch(event) { + case UPNP_IGD_EXTERNAL_IPADDRESS_CHANGED: + case UPNP_IGD_NAT_ENABLED_CHANGED: + case UPNP_IGD_CONNECTION_STATUS_CHANGED: + break; + + default: + break; + } } -int linphone_upnp_init(LinphoneCore *lc) { - lc->upnp_igd_ctxt = NULL; +int upnp_context_init(LinphoneCore *lc) { + UpnpContext *lupnp = &lc->upnp; + lupnp->upnp_igd_ctxt = NULL; + lupnp->upnp_igd_ctxt = upnp_igd_create(linphone_upnp_igd_callback, linphone_upnp_igd_print, lc); + if(lupnp->upnp_igd_ctxt == NULL) { + ms_error("Can't create uPnP IGD context"); + return -1; + } return 0; } -void linphone_upnp_destroy(LinphoneCore *lc) { +void upnp_context_uninit(LinphoneCore *lc) { + UpnpContext *lupnp = &lc->upnp; + if(lupnp->upnp_igd_ctxt != NULL) { + upnp_igd_destroy(lupnp->upnp_igd_ctxt); + } +} + +UpnpSession* upnp_session_new() { + return NULL; } diff --git a/coreapi/upnp.h b/coreapi/upnp.h new file mode 100644 index 000000000..c5ff5eca0 --- /dev/null +++ b/coreapi/upnp.h @@ -0,0 +1,38 @@ +/* +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" + +typedef struct _UpnpSession { + +} UpnpSession; + +typedef struct _UpnpContext { + upnp_igd_context *upnp_igd_ctxt; +} UpnpContext; + +UpnpSession* upnp_session_new(); +int upnp_context_init(LinphoneCore *lc); +void upnp_context_uninit(LinphoneCore *lc); + +#endif //LINPHONE_UPNP_H diff --git a/mediastreamer2 b/mediastreamer2 index 2093868ac..a1f113529 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 2093868ac68ffe62310cd0ad20b58ffa6860d7e3 +Subproject commit a1f113529f506aa178765cf70773db80e5768139 From 806203ca0a5ba0cf0df7f31b2f8ee51544bcd0fa Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 21 Dec 2012 16:21:41 +0100 Subject: [PATCH 005/281] uPnP in progress --- console/commands.c | 5 +- coreapi/linphonecall.c | 32 ++++- coreapi/linphonecore.c | 67 +++++++++-- coreapi/private.h | 1 + coreapi/upnp.c | 268 ++++++++++++++++++++++++++++++++++++++++- coreapi/upnp.h | 38 +++++- gtk/parameters.ui | 17 +++ gtk/propertybox.c | 8 ++ mediastreamer2 | 2 +- 9 files changed, 419 insertions(+), 19 deletions(-) diff --git a/console/commands.c b/console/commands.c index 472531795..3ec2ed65b 100644 --- a/console/commands.c +++ b/console/commands.c @@ -206,7 +206,7 @@ static LPC_COMMAND commands[] = { { "autoanswer", lpc_cmd_autoanswer, "Show/set auto-answer mode", "'autoanswer' \t: show current autoanswer mode\n" "'autoanswer enable'\t: enable autoanswer mode\n" - "'autoanswer disable'\t: disable autoanswer mode \n"}, + "'autoanswer disable'\t: disable autoanswer mode��\n"}, { "proxy", lpc_cmd_proxy, "Manage proxies", "'proxy list' : list all proxy setups.\n" "'proxy add' : add a new proxy setup.\n" @@ -896,6 +896,9 @@ lpc_cmd_firewall(LinphoneCore *lc, char *args) case LinphonePolicyUseIce: linphonec_out("Using ice with stun server %s to discover firewall address\n", setting ? setting : linphone_core_get_stun_server(lc)); break; + case LinphonePolicyUseUpnp: + linphonec_out("Using uPnP IGD protocol\n"); + break; } return 1; } diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 6c8b4a743..8af948df5 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -451,7 +451,7 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr } #ifdef BUILD_UPNP if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseUpnp) { - call->upnp_session = upnp_session_new(); + call->upnp_session = upnp_session_new(call); } #endif //BUILD_UPNP call->camera_active=params->has_video; @@ -515,6 +515,19 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro case LinphonePolicyUseStun: call->ping_time=linphone_core_run_stun_tests(call->core,call); /* No break to also destroy ice session in this case. */ + break; + case LinphonePolicyUseUpnp: +#ifdef BUILD_UPNP + call->upnp_session = upnp_session_new(call); + if (call->ice_session != NULL) { + linphone_call_init_media_streams(call); + if (linphone_core_update_upnp(call->core,call)<0) { + /* uPnP port mappings failed, proceed with the call anyway. */ + linphone_call_delete_upnp_session(call); + } + } +#endif //BUILD_UPNP + break; default: break; } @@ -663,6 +676,9 @@ void linphone_call_set_state(LinphoneCall *call, LinphoneCallState cstate, const 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); if (obj->op!=NULL) { sal_op_release(obj->op); @@ -1674,6 +1690,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) { + upnp_session_destroy(call->upnp_session); + call->upnp_session=NULL; + } +} +#endif //BUILD_UPNP + static void linphone_call_log_fill_stats(LinphoneCallLog *log, AudioStream *st){ audio_stream_get_local_rtp_stats (st,&log->local_stats); log->quality=audio_stream_get_average_quality_rating(st); @@ -1984,6 +2009,11 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse report_bandwidth(call,as,vs); ms_message("Thread processing load: audio=%f\tvideo=%f",audio_load,video_load); } + +#ifdef BUILD_UPNP + upnp_call_process(call); +#endif //BUILD_UPNP + #ifdef VIDEO_ENABLED if (call->videostream!=NULL) { OrtpEvent *ev; diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 8619552fa..82e39685f 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2005,6 +2005,10 @@ void linphone_core_iterate(LinphoneCore *lc){ linphone_call_delete_ice_session(call); linphone_call_stop_media_streams_for_ice_gathering(call); } + if (call->upnp_session != NULL) { + ms_warning("uPnP mapping has not finished yet, proceeded with the call withoutt uPnP anyway."); + linphone_call_delete_upnp_session(call); + } linphone_core_start_invite(lc,call); } if (call->state==LinphoneCallIncomingReceived){ @@ -2419,7 +2423,7 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const LinphoneAddress *parsed_url2=NULL; char *real_url=NULL; LinphoneCall *call; - bool_t use_ice = FALSE; + bool_t defer = FALSE; linphone_core_preempt_sound_resources(lc); @@ -2472,9 +2476,21 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const linphone_call_delete_ice_session(call); linphone_call_stop_media_streams_for_ice_gathering(call); } 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 + } if (call->dest_proxy==NULL && lc->sip_conf.ping_with_options==TRUE){ /*defer the start of the call after the OPTIONS ping*/ @@ -2484,7 +2500,7 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const sal_op_set_user_pointer(call->ping_op,call); call->start_time=time(NULL); }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); @@ -2657,22 +2673,41 @@ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const Linpho linphone_call_set_state(call,LinphoneCallUpdating,"Updating call"); #ifdef VIDEO_ENABLED 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->ice_check_list); - call->videostream->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->ice_check_list); + call->videostream->ice_check_list = NULL; + } } call->params = *params; 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. */ - ms_message("Defer call update to gather ICE candidates"); + if (!has_video && call->params.has_video) { + if (call->ice_session != NULL) { + /* Defer call update until the ICE candidates gathering process has finished. */ + ms_message("Defer call update to gather ICE candidates"); + linphone_call_init_video_stream(call); + video_stream_prepare_video(call->videostream); + 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_gather_ice_candidates(lc,call)<0) { - /* Ice candidates gathering failed, proceed with the call anyway. */ - linphone_call_delete_ice_session(call); - } else return err; + 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 err = linphone_core_start_update_call(lc, call); }else{ @@ -2789,6 +2824,12 @@ int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const } #endif } + +#if BUILD_UPNP + if(call->upnp_session != NULL) { + } +#endif //BUILD_UPNP + linphone_core_start_accept_call_update(lc, call); return 0; } diff --git a/coreapi/private.h b/coreapi/private.h index 6af7e09ee..d4abf16ca 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -292,6 +292,7 @@ void linphone_call_stop_audio_stream(LinphoneCall *call); void linphone_call_stop_video_stream(LinphoneCall *call); void linphone_call_stop_media_streams(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); const char * linphone_core_get_identity(LinphoneCore *lc); diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 34622bf51..d0b71b3e4 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -20,6 +20,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "upnp.h" #include "private.h" +#define UPNP_MAX_RETRY 4 + +UpnpPortBinding *upnp_port_binding_new(); +UpnpPortBinding * upnp_port_binding_retain(UpnpPortBinding *port); +void upnp_port_binding_release(UpnpPortBinding *port); + +int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *port); +int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port); + /* Convert uPnP IGD logs to ortp logs */ void linphone_upnp_igd_print(void *cookie, upnp_igd_print_level level, const char *fmt, va_list list) { int ortp_level = ORTP_DEBUG; @@ -42,35 +51,292 @@ void linphone_upnp_igd_print(void *cookie, upnp_igd_print_level level, const cha void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { LinphoneCore *lc = (LinphoneCore *)cookie; UpnpContext *lupnp = &lc->upnp; + upnp_igd_port_mapping *mapping = NULL; + UpnpPortBinding *port_mapping = NULL; + const char *ip_address = NULL; + const char *connection_status = NULL; + bool_t nat_enabled = FALSE; + + ms_mutex_lock(&lupnp->mutex); + switch(event) { case UPNP_IGD_EXTERNAL_IPADDRESS_CHANGED: case UPNP_IGD_NAT_ENABLED_CHANGED: case UPNP_IGD_CONNECTION_STATUS_CHANGED: + ip_address = upnp_igd_get_external_ipaddress(lupnp->upnp_igd_ctxt); + connection_status = upnp_igd_get_connection_status(lupnp->upnp_igd_ctxt); + nat_enabled = upnp_igd_get_nat_enabled(lupnp->upnp_igd_ctxt); + + if(ip_address == NULL || connection_status == NULL) { + lupnp->state = UPNP_Pending; + } else if(strcasecmp(connection_status, "Connected") || !nat_enabled) { + lupnp->state = UPNP_Ko; + } else { + // Emit add port binding + // Emit remove old port binding + lupnp->state = UPNP_Ok; + } + + break; + + case UPNP_IGD_PORT_MAPPING_ADD_SUCCESS: + mapping = (upnp_igd_port_mapping *) arg; + port_mapping = (UpnpPortBinding*) mapping->cookie; + port_mapping->remote_port = mapping->remote_port; + port_mapping->state = UPNP_Ok; + // TODO: SAVE IN CONFIG THE PORT + upnp_port_binding_release(port_mapping); + break; + + case UPNP_IGD_PORT_MAPPING_ADD_FAILURE: + mapping = (upnp_igd_port_mapping *) arg; + port_mapping = (UpnpPortBinding*) mapping->cookie; + upnp_context_send_add_port_binding(lc, port_mapping); + upnp_port_binding_release(port_mapping); + break; + + case UPNP_IGD_PORT_MAPPING_REMOVE_SUCCESS: + mapping = (upnp_igd_port_mapping *) arg; + port_mapping = (UpnpPortBinding*) mapping->cookie; + port_mapping->remote_port = -1; + port_mapping->state = UPNP_Idle; + // TODO: REMOVE FROM CONFIG THE PORT + upnp_port_binding_release(port_mapping); + break; + + case UPNP_IGD_PORT_MAPPING_REMOVE_FAILURE: + mapping = (upnp_igd_port_mapping *) arg; + port_mapping = (UpnpPortBinding*) mapping->cookie; + upnp_context_send_remove_port_binding(lc, port_mapping); + // TODO: REMOVE FROM CONFIG THE PORT (DON'T TRY ANYMORE) + upnp_port_binding_release(port_mapping); break; default: break; } + + ms_mutex_unlock(&lupnp->mutex); +} + +int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port) { + UpnpContext *lupnp = &lc->upnp; + upnp_igd_port_mapping mapping; + char * local_host = NULL; + int ret; + if(port->state == UPNP_Idle) { + port->remote_port = -1; + port->retry = 0; + port->state = UPNP_Pending; + } + if(port->retry >= UPNP_MAX_RETRY) { + ret = -1; + } else { + local_host = upnp_igd_get_local_ipaddress(lupnp->upnp_igd_ctxt); + mapping.cookie = upnp_port_binding_retain(port); + mapping.local_port = port->local_port; + mapping.local_host = local_host; + mapping.remote_port = rand()%1024 + 1024; + mapping.remote_host = ""; + mapping.description = PACKAGE_NAME; + mapping.protocol = port->protocol; + + port->retry++; + ret = upnp_igd_add_port_mapping(lupnp->upnp_igd_ctxt, &mapping); + if(local_host != NULL) { + free(local_host); + } + } + if(ret != 0) { + port->state = UPNP_Ko; + } + return ret; +} + +int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *port) { + UpnpContext *lupnp = &lc->upnp; + upnp_igd_port_mapping mapping; + int ret; + if(port->state == UPNP_Idle) { + port->retry = 0; + port->state = UPNP_Pending; + } + if(port->retry >= UPNP_MAX_RETRY) { + ret = -1; + } else { + mapping.cookie = upnp_port_binding_retain(port); + mapping.remote_port = port->remote_port; + mapping.remote_host = ""; + mapping.protocol = port->protocol; + port->retry++; + ret = upnp_igd_delete_port_mapping(lupnp->upnp_igd_ctxt, &mapping); + } + if(ret != 0) { + port->state = UPNP_Ko; + } + return ret; +} + +int upnp_call_process(LinphoneCall *call) { + LinphoneCore *lc = call->core; + UpnpContext *lupnp = &lc->upnp; + int ret = -1; + + ms_mutex_lock(&lupnp->mutex); + // Don't handle when the call + if(lupnp->state != UPNP_Ko && call->upnp_session != NULL) { + ret = 0; + + /* + * Audio part + */ + call->upnp_session->audio_rtp->local_port = call->audio_port; + call->upnp_session->audio_rtcp->local_port = call->audio_port+1; + if(call->upnp_session->audio_rtp->state == UPNP_Idle && call->audiostream != NULL) { + // Add audio port binding + upnp_context_send_add_port_binding(lc, call->upnp_session->audio_rtp); + } else if(call->upnp_session->audio_rtp->state == UPNP_Ok && call->audiostream == NULL) { + // Remove audio port binding + upnp_context_send_remove_port_binding(lc, call->upnp_session->audio_rtp); + } + if(call->upnp_session->audio_rtcp->state == UPNP_Idle && call->audiostream != NULL) { + // Add audio port binding + upnp_context_send_add_port_binding(lc, call->upnp_session->audio_rtcp); + } else if(call->upnp_session->audio_rtcp->state == UPNP_Ok && call->audiostream == NULL) { + // Remove audio port binding + upnp_context_send_remove_port_binding(lc, call->upnp_session->audio_rtcp); + } + + /* + * Video part + */ + call->upnp_session->video_rtp->local_port = call->video_port; + call->upnp_session->video_rtcp->local_port = call->video_port+1; + if(call->upnp_session->video_rtp->state == UPNP_Idle && call->videostream != NULL) { + // Add video port binding + upnp_context_send_add_port_binding(lc, call->upnp_session->video_rtp); + } else if(call->upnp_session->video_rtp->state == UPNP_Ok && call->videostream == NULL) { + // Remove video port binding + upnp_context_send_remove_port_binding(lc, call->upnp_session->video_rtp); + } + if(call->upnp_session->video_rtcp->state == UPNP_Idle && call->videostream != NULL) { + // Add video port binding + upnp_context_send_add_port_binding(lc, call->upnp_session->video_rtcp); + } else if(call->upnp_session->video_rtcp->state == UPNP_Ok && call->videostream == NULL) { + // Remove video port binding + upnp_context_send_remove_port_binding(lc, call->upnp_session->video_rtcp); + } + } + ms_mutex_unlock(&lupnp->mutex); + return ret; +} + +int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call) { + return upnp_call_process(call); } int upnp_context_init(LinphoneCore *lc) { + LCSipTransports transport; UpnpContext *lupnp = &lc->upnp; + ms_mutex_init(&lupnp->mutex, NULL); + lupnp->state = UPNP_Idle; + + linphone_core_get_sip_transports(lc, &transport); + if(transport.udp_port != 0) { + lupnp->sip_udp = upnp_port_binding_new(); + lupnp->sip_udp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; + } else { + lupnp->sip_udp = NULL; + } + if(transport.tcp_port != 0) { + lupnp->sip_tcp = upnp_port_binding_new(); + lupnp->sip_tcp->protocol = UPNP_IGD_IP_PROTOCOL_TCP; + } else { + lupnp->sip_tcp = NULL; + } + if(transport.tls_port != 0) { + lupnp->sip_tls = upnp_port_binding_new(); + lupnp->sip_tls->protocol = UPNP_IGD_IP_PROTOCOL_TCP; + } else { + lupnp->sip_tls = NULL; + } lupnp->upnp_igd_ctxt = NULL; lupnp->upnp_igd_ctxt = upnp_igd_create(linphone_upnp_igd_callback, linphone_upnp_igd_print, lc); - if(lupnp->upnp_igd_ctxt == NULL) { + if(lupnp->upnp_igd_ctxt == NULL ) { + lupnp->state = UPNP_Ko; ms_error("Can't create uPnP IGD context"); return -1; } + lupnp->state = UPNP_Pending; return 0; } void upnp_context_uninit(LinphoneCore *lc) { + // Emit remove port (sip & saved) UpnpContext *lupnp = &lc->upnp; + if(lupnp->sip_udp != NULL) { + upnp_port_binding_release(lupnp->sip_udp); + } + if(lupnp->sip_tcp != NULL) { + upnp_port_binding_release(lupnp->sip_tcp); + } + if(lupnp->sip_tls != NULL) { + upnp_port_binding_release(lupnp->sip_tls); + } if(lupnp->upnp_igd_ctxt != NULL) { upnp_igd_destroy(lupnp->upnp_igd_ctxt); } + ms_mutex_destroy(&lupnp->mutex); +} + +UpnpPortBinding *upnp_port_binding_new() { + UpnpPortBinding *port = NULL; + port = ms_new0(UpnpPortBinding,1); + ms_mutex_init(&port->mutex, NULL); + port->state = UPNP_Idle; + port->local_port = -1; + port->remote_port = -1; + port->ref = 1; + return port; +} + +UpnpPortBinding *upnp_port_binding_retain(UpnpPortBinding *port) { + ms_mutex_lock(&port->mutex); + port->ref++; + ms_mutex_unlock(&port->mutex); + return port; +} + +void upnp_port_binding_release(UpnpPortBinding *port) { + ms_mutex_lock(&port->mutex); + if(--port->ref == 0) { + ms_mutex_unlock(&port->mutex); + ms_mutex_destroy(&port->mutex); + ms_free(port); + return; + } + ms_mutex_unlock(&port->mutex); } UpnpSession* upnp_session_new() { + UpnpSession *session = ms_new0(UpnpSession,1); + session->state = UPNP_Idle; + session->audio_rtp = upnp_port_binding_new(); + session->audio_rtp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; + session->audio_rtcp = upnp_port_binding_new(); + session->audio_rtcp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; + session->video_rtp = upnp_port_binding_new(); + session->video_rtp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; + session->video_rtcp = upnp_port_binding_new(); + session->video_rtcp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; return NULL; } + +void upnp_session_destroy(UpnpSession* session) { + upnp_port_binding_release(session->audio_rtp); + upnp_port_binding_release(session->audio_rtcp); + upnp_port_binding_release(session->video_rtp); + upnp_port_binding_release(session->video_rtp); + // TODO: send remove + ms_free(session); +} diff --git a/coreapi/upnp.h b/coreapi/upnp.h index c5ff5eca0..f0a93d1d6 100644 --- a/coreapi/upnp.h +++ b/coreapi/upnp.h @@ -23,15 +23,49 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "mediastreamer2/upnp_igd.h" #include "linphonecore.h" -typedef struct _UpnpSession { +typedef enum { + UPNP_Idle, + UPNP_Pending, + UPNP_Ok, + UPNP_Ko, +} UpnpState; -} UpnpSession; +typedef struct _UpnpSession UpnpSession; + +typedef struct _UpnpPortBinding { + ms_mutex_t mutex; + UpnpState state; + upnp_igd_ip_protocol protocol; + int local_port; + int remote_port; + int retry; + int ref; +} UpnpPortBinding; + +struct _UpnpSession { + UpnpPortBinding *audio_rtp; + UpnpPortBinding *audio_rtcp; + UpnpPortBinding *video_rtp; + UpnpPortBinding *video_rtcp; + UpnpState state; +}; typedef struct _UpnpContext { upnp_igd_context *upnp_igd_ctxt; + UpnpPortBinding *sip_tcp; + UpnpPortBinding *sip_tls; + UpnpPortBinding *sip_udp; + UpnpState state; + MSList *pending_bindinds; + ms_mutex_t mutex; } UpnpContext; + +int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call); +int upnp_call_process(LinphoneCall *call); UpnpSession* upnp_session_new(); +void upnp_session_destroy(UpnpSession* session); + int upnp_context_init(LinphoneCore *lc); void upnp_context_uninit(LinphoneCore *lc); diff --git a/gtk/parameters.ui b/gtk/parameters.ui index d6d2e4927..3af59e11e 100644 --- a/gtk/parameters.ui +++ b/gtk/parameters.ui @@ -749,6 +749,23 @@ 3 + + + Behind NAT / Firewall (use uPnP) + False + True + True + False + True + no_nat + + + + True + True + 4 + + True diff --git a/gtk/propertybox.c b/gtk/propertybox.c index 03092a0a5..a26d744e5 100644 --- a/gtk/propertybox.c +++ b/gtk/propertybox.c @@ -236,6 +236,11 @@ void linphone_gtk_use_ice_toggled(GtkWidget *w){ 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){ if (GTK_WIDGET_SENSITIVE(w)) linphone_core_set_mtu(linphone_gtk_get_core(),gtk_spin_button_get_value(GTK_SPIN_BUTTON(w))); @@ -1038,6 +1043,9 @@ void linphone_gtk_show_parameters(void){ case LinphonePolicyUseIce: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_ice")),TRUE); 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); if (mtu<=0){ diff --git a/mediastreamer2 b/mediastreamer2 index a1f113529..39998cb24 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit a1f113529f506aa178765cf70773db80e5768139 +Subproject commit 39998cb245606b904a77e093db168057f87bf8b0 From 9567e2bf62e4957ec110d5227f908bdb30f51027 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 3 Jan 2013 15:38:03 +0100 Subject: [PATCH 006/281] Working sip upnp --- coreapi/callbacks.c | 5 + coreapi/linphonecall.c | 11 +- coreapi/linphonecore.c | 44 ++- coreapi/private.h | 5 +- coreapi/proxy.c | 8 +- coreapi/upnp.c | 750 ++++++++++++++++++++++++++++++++--------- coreapi/upnp.h | 41 ++- mediastreamer2 | 2 +- 8 files changed, 679 insertions(+), 187 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 134c336ab..b3d1a6bb7 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -416,6 +416,11 @@ static void call_accept_update(LinphoneCore *lc, LinphoneCall *call){ linphone_core_update_ice_from_remote_media_description(call,rmd); 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 sal_call_accept(call->op); md=sal_call_get_final_media_description(call->op); if (md && !sal_media_description_empty(md)) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 8af948df5..2ab398ba5 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -283,6 +283,11 @@ 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_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); + } +#endif linphone_address_destroy(addr); call->localdesc=md; if (old_md) sal_media_description_unref(old_md); @@ -439,7 +444,7 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr call->op=sal_op_new(lc->sal); sal_op_set_user_pointer(call->op,call); call->core=lc; - linphone_core_get_local_ip(lc,linphone_address_get_domain(to),call->localip); + linphone_core_get_public_ip(lc,linphone_address_get_domain(to),call->localip); linphone_call_init_common(call,from,to); call->params=*params; if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseIce) { @@ -486,7 +491,7 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro } linphone_address_clean(from); - linphone_core_get_local_ip(lc,linphone_address_get_domain(from),call->localip); + linphone_core_get_public_ip(lc,linphone_address_get_domain(from),call->localip); linphone_call_init_common(call, from, to); call->log->call_id=ms_strdup(sal_op_get_call_id(op)); /*must be known at that time*/ linphone_core_init_default_params(lc, &call->params); @@ -1693,7 +1698,7 @@ void linphone_call_delete_ice_session(LinphoneCall *call){ #ifdef BUILD_UPNP void linphone_call_delete_upnp_session(LinphoneCall *call){ if(call->upnp_session!=NULL) { - upnp_session_destroy(call->upnp_session); + upnp_session_destroy(call); call->upnp_session=NULL; } } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 82e39685f..ddd9eaea6 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -66,7 +66,6 @@ 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*/ @@ -1307,13 +1306,20 @@ int linphone_core_set_primary_contact(LinphoneCore *lc, const char *contact) /*result must be an array of chars at least LINPHONE_IPADDR_SIZE */ -void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result){ +void linphone_core_get_public_ip(LinphoneCore *lc, const char *dest, char *result){ const char *ip; if (linphone_core_get_firewall_policy(lc)==LinphonePolicyUseNatAddress && (ip=linphone_core_get_nat_address_resolved(lc))!=NULL){ strncpy(result,ip,LINPHONE_IPADDR_SIZE); return; } +#ifdef BUILD_UPNP + else if (linphone_core_get_firewall_policy(lc)==LinphonePolicyUseUpnp + && lc->upnp.state == LinphoneUpnpStateOk) { + ip = upnp_igd_get_external_ipaddress(lc->upnp.upnp_igd_ctxt); + strncpy(result,ip,LINPHONE_IPADDR_SIZE); + } +#endif if (linphone_core_get_local_ip_for(lc->sip_conf.ipv6_enabled ? AF_INET6 : AF_INET,dest,result)==0) return; /*else fallback to SAL routine that will attempt to find the most realistic interface */ @@ -1334,7 +1340,7 @@ static void update_primary_contact(LinphoneCore *lc){ ms_error("Could not parse identity contact !"); url=linphone_address_new("sip:unknown@unkwownhost"); } - linphone_core_get_local_ip(lc, NULL, tmp); + linphone_core_get_public_ip(lc, NULL, tmp); if (strcmp(tmp,"127.0.0.1")==0 || strcmp(tmp,"::1")==0 ){ ms_warning("Local loopback network only !"); lc->sip_conf.loopback_only=TRUE; @@ -2006,7 +2012,7 @@ void linphone_core_iterate(LinphoneCore *lc){ linphone_call_stop_media_streams_for_ice_gathering(call); } if (call->upnp_session != NULL) { - ms_warning("uPnP mapping has not finished yet, proceeded with the call withoutt uPnP anyway."); + ms_warning("uPnP mapping has not finished yet, proceeded with the call without uPnP anyway."); linphone_call_delete_upnp_session(call); } linphone_core_start_invite(lc,call); @@ -2639,9 +2645,14 @@ void linphone_core_notify_incoming_call(LinphoneCore *lc, LinphoneCall *call){ int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call){ const char *subject; 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); - + } +#ifdef BUILD_UPNP + if(call->upnp_session != NULL) { + linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session); + } +#endif if (call->params.in_conference){ subject="Conference"; }else{ @@ -2756,6 +2767,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); } +#ifdef BUILD_UPNP + if(call->upnp_session != NULL) { + linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session); + } +#endif sal_call_set_local_media_description(call->op,call->localdesc); sal_call_accept(call->op); md=sal_call_get_final_media_description(call->op); @@ -3124,8 +3140,14 @@ int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call) return -1; } 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); + } +#ifdef BUILD_UPNP + if(call->upnp_session != NULL) { + linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session); + } +#endif if (sal_media_description_has_dir(call->resultdesc,SalStreamSendRecv)){ sal_media_description_set_dir(call->localdesc,SalStreamSendOnly); subject="Call on hold"; @@ -3203,8 +3225,14 @@ int linphone_core_resume_call(LinphoneCore *lc, LinphoneCall *the_call) if (call->audiostream) audio_stream_play(call->audiostream, NULL); 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); + } +#ifdef BUILD_UPNP + if(call->upnp_session != NULL) { + linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session); + } +#endif sal_call_set_local_media_description(call->op,call->localdesc); sal_media_description_set_dir(call->localdesc,SalStreamSendRecv); if (call->params.in_conference && !call->current_params.in_conference) subject="Conference"; diff --git a/coreapi/private.h b/coreapi/private.h index d4abf16ca..e110a03e3 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -206,7 +206,7 @@ int set_lock_file(); int get_lock_file(); int remove_lock_file(); void check_sound_device(LinphoneCore *lc); -void linphone_core_get_local_ip(LinphoneCore *lc, const char *to, char *result); +void linphone_core_get_public_ip(LinphoneCore *lc, const char *to, char *result); bool_t host_has_ipv6_network(); bool_t lp_spawn_command_line_sync(const char *command, char **result,int *command_ret); @@ -593,6 +593,9 @@ int linphone_core_del_call( LinphoneCore *lc, LinphoneCall *call); int linphone_core_set_as_current_call(LinphoneCore *lc, LinphoneCall *call); int linphone_core_get_calls_nb(const LinphoneCore *lc); +void linphone_core_add_iterate_hook(LinphoneCore *lc, LinphoneCoreIterateHook hook, void *hook_data); +void linphone_core_remove_iterate_hook(LinphoneCore *lc, LinphoneCoreIterateHook hook, void *hook_data); + void linphone_core_set_state(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message); void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *call); void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMediaDescription *new_md); diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 3b47af42c..ff046f92e 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -268,7 +268,7 @@ static char *guess_contact_for_register(LinphoneProxyConfig *obj){ LCSipTransports tr; LinphoneAddress *contact; - linphone_core_get_local_ip(obj->lc,host,localip); + linphone_core_get_public_ip(obj->lc,host,localip); contact=linphone_address_new(obj->reg_identity); linphone_address_set_domain (contact,localip); linphone_address_set_port_int(contact,linphone_core_get_sip_port(obj->lc)); @@ -427,7 +427,7 @@ static dial_plan_t const dial_plans[]={ {"Congo Democratic Republic" ,"CD" , "243" , 9 , "00" }, {"Cook Islands" ,"CK" , "682" , 5 , "00" }, {"Costa Rica" ,"CR" , "506" , 8 , "00" }, - {"Cte d'Ivoire" ,"AD" , "225" , 8 , "00" }, + {"C�te d'Ivoire" ,"AD" , "225" , 8 , "00" }, {"Croatia" ,"HR" , "385" , 9 , "00" }, {"Cuba" ,"CU" , "53" , 8 , "119" }, {"Cyprus" ,"CY" , "357" , 8 , "00" }, @@ -545,7 +545,7 @@ static dial_plan_t const dial_plans[]={ {"Portugal" ,"PT" , "351" , 9 , "00" }, {"Puerto Rico" ,"PR" , "1" , 10 , "011" }, {"Qatar" ,"QA" , "974" , 8 , "00" }, - {"Runion Island" ,"RE" , "262" , 9 , "011" }, + {"R�union Island" ,"RE" , "262" , 9 , "011" }, {"Romania" ,"RO" , "40" , 9 , "00" }, {"Russian Federation" ,"RU" , "7" , 10 , "8" }, {"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" }, {"Samoa" ,"WS" , "685" , 7 , "0" }, {"San Marino" ,"SM" , "378" , 10 , "00" }, - {"So Tom and Prncipe" ,"ST" , "239" , 7 , "00" }, + {"S�o Tom� and Pr�ncipe" ,"ST" , "239" , 7 , "00" }, {"Saudi Arabia" ,"SA" , "966" , 9 , "00" }, {"Senegal" ,"SN" , "221" , 9 , "00" }, {"Serbia" ,"RS" , "381" , 9 , "00" }, diff --git a/coreapi/upnp.c b/coreapi/upnp.c index d0b71b3e4..0de861210 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -21,14 +21,51 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "private.h" #define UPNP_MAX_RETRY 4 +#define UPNP_SECTION_NAME "uPnP" + +/* Define private types */ +typedef struct _LpItem{ + char *key; + char *value; +} LpItem; + +typedef struct _LpSection{ + char *name; + MSList *items; +} LpSection; + +typedef struct _LpConfig{ + FILE *file; + char *filename; + MSList *sections; + int modified; + int readonly; +} LpConfig; + +/* Declare private functions */ +LpSection *lp_config_find_section(LpConfig *lpconfig, const char *name); +void lp_section_remove_item(LpSection *sec, LpItem *item); +void lp_config_set_string(LpConfig *lpconfig,const char *section, const char *key, const char *value); + +bool_t linphone_core_upnp_hook(void *data); UpnpPortBinding *upnp_port_binding_new(); -UpnpPortBinding * upnp_port_binding_retain(UpnpPortBinding *port); +UpnpPortBinding *upnp_port_binding_copy(const UpnpPortBinding *port); +bool_t upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2); +UpnpPortBinding *upnp_port_binding_retain(UpnpPortBinding *port); void upnp_port_binding_release(UpnpPortBinding *port); +MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc); +int upnp_config_add_port_binding(LinphoneCore *lc, const UpnpPortBinding *port); +int upnp_config_remove_port_binding(LinphoneCore *lc, const UpnpPortBinding *port); + int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *port); int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port); +/** + * uPnP Callbacks + */ + /* Convert uPnP IGD logs to ortp logs */ void linphone_upnp_igd_print(void *cookie, upnp_igd_print_level level, const char *fmt, va_list list) { int ortp_level = ORTP_DEBUG; @@ -56,7 +93,6 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { const char *ip_address = NULL; const char *connection_status = NULL; bool_t nat_enabled = FALSE; - ms_mutex_lock(&lupnp->mutex); switch(event) { @@ -68,13 +104,14 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { nat_enabled = upnp_igd_get_nat_enabled(lupnp->upnp_igd_ctxt); if(ip_address == NULL || connection_status == NULL) { - lupnp->state = UPNP_Pending; + ms_message("uPnP IGD: Pending"); + lupnp->state = LinphoneUpnpStatePending; } else if(strcasecmp(connection_status, "Connected") || !nat_enabled) { - lupnp->state = UPNP_Ko; + ms_message("uPnP IGD: Not Available"); + lupnp->state = LinphoneUpnpStateNotAvailable; } else { - // Emit add port binding - // Emit remove old port binding - lupnp->state = UPNP_Ok; + ms_message("uPnP IGD: Connected"); + lupnp->state = LinphoneUpnpStateOk; } break; @@ -82,33 +119,56 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { case UPNP_IGD_PORT_MAPPING_ADD_SUCCESS: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; - port_mapping->remote_port = mapping->remote_port; - port_mapping->state = UPNP_Ok; - // TODO: SAVE IN CONFIG THE PORT + port_mapping->external_port = mapping->remote_port; + port_mapping->state = LinphoneUpnpStateOk; + ms_message("uPnP IGD: Added port binding %s|%d->%s:%d", + (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port_mapping->external_port, + port_mapping->local_addr, + port_mapping->local_port); + upnp_config_add_port_binding(lc, port_mapping); + upnp_port_binding_release(port_mapping); break; case UPNP_IGD_PORT_MAPPING_ADD_FAILURE: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; - upnp_context_send_add_port_binding(lc, port_mapping); + if(upnp_context_send_add_port_binding(lc, port_mapping) != 0) { + ms_error("uPnP IGD: Can't add port binding %s|%d->%s:%d", + (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port_mapping->external_port, + port_mapping->local_addr, + port_mapping->local_port); + } + upnp_port_binding_release(port_mapping); break; case UPNP_IGD_PORT_MAPPING_REMOVE_SUCCESS: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; - port_mapping->remote_port = -1; - port_mapping->state = UPNP_Idle; - // TODO: REMOVE FROM CONFIG THE PORT + port_mapping->state = LinphoneUpnpStateIdle; + ms_message("uPnP IGD: Removed port binding %s|%d->%d", + (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port_mapping->external_port, + port_mapping->local_port); + upnp_config_remove_port_binding(lc, port_mapping); + upnp_port_binding_release(port_mapping); break; case UPNP_IGD_PORT_MAPPING_REMOVE_FAILURE: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; - upnp_context_send_remove_port_binding(lc, port_mapping); - // TODO: REMOVE FROM CONFIG THE PORT (DON'T TRY ANYMORE) + if(upnp_context_send_remove_port_binding(lc, port_mapping) != 0) { + ms_error("uPnP IGD: Can't remove port binding %s|%d->%d", + (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port_mapping->external_port, + port_mapping->local_port); + upnp_config_remove_port_binding(lc, port_mapping); + } + upnp_port_binding_release(port_mapping); break; @@ -119,161 +179,74 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { ms_mutex_unlock(&lupnp->mutex); } -int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port) { - UpnpContext *lupnp = &lc->upnp; - upnp_igd_port_mapping mapping; - char * local_host = NULL; - int ret; - if(port->state == UPNP_Idle) { - port->remote_port = -1; - port->retry = 0; - port->state = UPNP_Pending; - } - if(port->retry >= UPNP_MAX_RETRY) { - ret = -1; - } else { - local_host = upnp_igd_get_local_ipaddress(lupnp->upnp_igd_ctxt); - mapping.cookie = upnp_port_binding_retain(port); - mapping.local_port = port->local_port; - mapping.local_host = local_host; - mapping.remote_port = rand()%1024 + 1024; - mapping.remote_host = ""; - mapping.description = PACKAGE_NAME; - mapping.protocol = port->protocol; - port->retry++; - ret = upnp_igd_add_port_mapping(lupnp->upnp_igd_ctxt, &mapping); - if(local_host != NULL) { - free(local_host); - } - } - if(ret != 0) { - port->state = UPNP_Ko; - } - return ret; -} - -int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *port) { - UpnpContext *lupnp = &lc->upnp; - upnp_igd_port_mapping mapping; - int ret; - if(port->state == UPNP_Idle) { - port->retry = 0; - port->state = UPNP_Pending; - } - if(port->retry >= UPNP_MAX_RETRY) { - ret = -1; - } else { - mapping.cookie = upnp_port_binding_retain(port); - mapping.remote_port = port->remote_port; - mapping.remote_host = ""; - mapping.protocol = port->protocol; - port->retry++; - ret = upnp_igd_delete_port_mapping(lupnp->upnp_igd_ctxt, &mapping); - } - if(ret != 0) { - port->state = UPNP_Ko; - } - return ret; -} - -int upnp_call_process(LinphoneCall *call) { - LinphoneCore *lc = call->core; - UpnpContext *lupnp = &lc->upnp; - int ret = -1; - - ms_mutex_lock(&lupnp->mutex); - // Don't handle when the call - if(lupnp->state != UPNP_Ko && call->upnp_session != NULL) { - ret = 0; - - /* - * Audio part - */ - call->upnp_session->audio_rtp->local_port = call->audio_port; - call->upnp_session->audio_rtcp->local_port = call->audio_port+1; - if(call->upnp_session->audio_rtp->state == UPNP_Idle && call->audiostream != NULL) { - // Add audio port binding - upnp_context_send_add_port_binding(lc, call->upnp_session->audio_rtp); - } else if(call->upnp_session->audio_rtp->state == UPNP_Ok && call->audiostream == NULL) { - // Remove audio port binding - upnp_context_send_remove_port_binding(lc, call->upnp_session->audio_rtp); - } - if(call->upnp_session->audio_rtcp->state == UPNP_Idle && call->audiostream != NULL) { - // Add audio port binding - upnp_context_send_add_port_binding(lc, call->upnp_session->audio_rtcp); - } else if(call->upnp_session->audio_rtcp->state == UPNP_Ok && call->audiostream == NULL) { - // Remove audio port binding - upnp_context_send_remove_port_binding(lc, call->upnp_session->audio_rtcp); - } - - /* - * Video part - */ - call->upnp_session->video_rtp->local_port = call->video_port; - call->upnp_session->video_rtcp->local_port = call->video_port+1; - if(call->upnp_session->video_rtp->state == UPNP_Idle && call->videostream != NULL) { - // Add video port binding - upnp_context_send_add_port_binding(lc, call->upnp_session->video_rtp); - } else if(call->upnp_session->video_rtp->state == UPNP_Ok && call->videostream == NULL) { - // Remove video port binding - upnp_context_send_remove_port_binding(lc, call->upnp_session->video_rtp); - } - if(call->upnp_session->video_rtcp->state == UPNP_Idle && call->videostream != NULL) { - // Add video port binding - upnp_context_send_add_port_binding(lc, call->upnp_session->video_rtcp); - } else if(call->upnp_session->video_rtcp->state == UPNP_Ok && call->videostream == NULL) { - // Remove video port binding - upnp_context_send_remove_port_binding(lc, call->upnp_session->video_rtcp); - } - } - ms_mutex_unlock(&lupnp->mutex); - return ret; -} - -int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call) { - return upnp_call_process(call); -} +/** + * uPnP Context + */ int upnp_context_init(LinphoneCore *lc) { LCSipTransports transport; UpnpContext *lupnp = &lc->upnp; + const char *ip_address; + ms_mutex_init(&lupnp->mutex, NULL); - lupnp->state = UPNP_Idle; + lupnp->pending_configs = NULL; + lupnp->state = LinphoneUpnpStateIdle; + lupnp->old_state = LinphoneUpnpStateIdle; + ms_message("uPnP IGD: Init"); linphone_core_get_sip_transports(lc, &transport); if(transport.udp_port != 0) { lupnp->sip_udp = upnp_port_binding_new(); lupnp->sip_udp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; + lupnp->sip_udp->local_port = transport.udp_port; } else { lupnp->sip_udp = NULL; } if(transport.tcp_port != 0) { lupnp->sip_tcp = upnp_port_binding_new(); lupnp->sip_tcp->protocol = UPNP_IGD_IP_PROTOCOL_TCP; + lupnp->sip_tcp->local_port = transport.tcp_port; } else { lupnp->sip_tcp = NULL; } if(transport.tls_port != 0) { lupnp->sip_tls = upnp_port_binding_new(); lupnp->sip_tls->protocol = UPNP_IGD_IP_PROTOCOL_TCP; + lupnp->sip_tls->local_port = transport.tls_port; } else { lupnp->sip_tls = NULL; } + + linphone_core_add_iterate_hook(lc, linphone_core_upnp_hook, lc); + lupnp->upnp_igd_ctxt = NULL; lupnp->upnp_igd_ctxt = upnp_igd_create(linphone_upnp_igd_callback, linphone_upnp_igd_print, lc); - if(lupnp->upnp_igd_ctxt == NULL ) { - lupnp->state = UPNP_Ko; + if(lupnp->upnp_igd_ctxt == NULL) { + lupnp->state = LinphoneUpnpStateKo; ms_error("Can't create uPnP IGD context"); return -1; } - lupnp->state = UPNP_Pending; + + ip_address = upnp_igd_get_local_ipaddress(lupnp->upnp_igd_ctxt); + if(lupnp->sip_udp != NULL) { + strncpy(lupnp->sip_udp->local_addr, ip_address, sizeof(lupnp->sip_udp->local_addr)); + } + if(lupnp->sip_tcp != NULL) { + strncpy(lupnp->sip_tcp->local_addr, ip_address, sizeof(lupnp->sip_tcp->local_addr)); + } + if(lupnp->sip_tls != NULL) { + strncpy(lupnp->sip_tls->local_addr, ip_address, sizeof(lupnp->sip_tls->local_addr)); + } + + lupnp->state = LinphoneUpnpStatePending; return 0; } void upnp_context_uninit(LinphoneCore *lc) { - // Emit remove port (sip & saved) UpnpContext *lupnp = &lc->upnp; + linphone_core_remove_iterate_hook(lc, linphone_core_upnp_hook, lc); + if(lupnp->sip_udp != NULL) { upnp_port_binding_release(lupnp->sip_udp); } @@ -287,19 +260,334 @@ void upnp_context_uninit(LinphoneCore *lc) { upnp_igd_destroy(lupnp->upnp_igd_ctxt); } ms_mutex_destroy(&lupnp->mutex); + + ms_message("uPnP IGD: Uninit"); } +int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port) { + UpnpContext *lupnp = &lc->upnp; + upnp_igd_port_mapping mapping; + int ret; + if(port->state == LinphoneUpnpStateIdle) { + port->external_port = -1; + port->retry = 0; + port->state = LinphoneUpnpStateAdding; + } else if(port->state != LinphoneUpnpStateAdding) { + ms_error("uPnP: try to add a port binding in wrong state: %d", port->state); + return -2; + } + + if(port->retry >= UPNP_MAX_RETRY) { + ret = -1; + } else { + mapping.cookie = upnp_port_binding_retain(port); + mapping.local_port = port->local_port; + mapping.local_host = port->local_addr; + if(port->external_port == -1) + mapping.remote_port = rand()%1024 + 1024; // TODO: use better method + else + mapping.remote_port = port->external_port; + mapping.remote_host = ""; + mapping.description = PACKAGE_NAME; + mapping.protocol = port->protocol; + + port->retry++; + ret = upnp_igd_add_port_mapping(lupnp->upnp_igd_ctxt, &mapping); + } + if(ret != 0) { + port->state = LinphoneUpnpStateKo; + } + return ret; +} + +int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *port) { + UpnpContext *lupnp = &lc->upnp; + upnp_igd_port_mapping mapping; + int ret; + if(port->state == LinphoneUpnpStateIdle) { + port->retry = 0; + port->state = LinphoneUpnpStateRemoving; + } else if(port->state != LinphoneUpnpStateRemoving) { + ms_error("uPnP: try to remove a port binding in wrong state: %d", port->state); + return -2; + } + + if(port->retry >= UPNP_MAX_RETRY) { + ret = -1; + } else { + mapping.cookie = upnp_port_binding_retain(port); + mapping.remote_port = port->external_port; + mapping.remote_host = ""; + mapping.protocol = port->protocol; + port->retry++; + ret = upnp_igd_delete_port_mapping(lupnp->upnp_igd_ctxt, &mapping); + } + if(ret != 0) { + port->state = LinphoneUpnpStateKo; + } + return ret; +} + +/* + * uPnP Core interfaces + */ + +int upnp_call_process(LinphoneCall *call) { + LinphoneCore *lc = call->core; + UpnpContext *lupnp = &lc->upnp; + int ret = -1; + UpnpState oldState; + const char *local_addr, *external_addr; + + ms_mutex_lock(&lupnp->mutex); + // Don't handle when the call + if(lupnp->state == LinphoneUpnpStateOk && call->upnp_session != NULL) { + ret = 0; + local_addr = upnp_igd_get_local_ipaddress(lupnp->upnp_igd_ctxt); + external_addr = upnp_igd_get_external_ipaddress(lupnp->upnp_igd_ctxt); + + /* + * Audio part + */ + strncpy(call->upnp_session->audio->rtp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); + strncpy(call->upnp_session->audio->rtp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); + call->upnp_session->audio->rtp->local_port = call->audio_port; + strncpy(call->upnp_session->audio->rtcp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); + strncpy(call->upnp_session->audio->rtcp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); + call->upnp_session->audio->rtcp->local_port = call->audio_port+1; + if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateIdle && call->audiostream != NULL) { + // Add audio port binding + upnp_context_send_add_port_binding(lc, call->upnp_session->audio->rtp); + } else if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateOk && call->audiostream == NULL) { + // Remove audio port binding + upnp_context_send_remove_port_binding(lc, call->upnp_session->audio->rtp); + } + if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateIdle && call->audiostream != NULL) { + // Add audio port binding + upnp_context_send_add_port_binding(lc, call->upnp_session->audio->rtcp); + } else if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateOk && call->audiostream == NULL) { + // Remove audio port binding + upnp_context_send_remove_port_binding(lc, call->upnp_session->audio->rtcp); + } + if((call->upnp_session->audio->rtp->state == LinphoneUpnpStateOk || call->upnp_session->audio->rtp->state == LinphoneUpnpStateIdle) && + (call->upnp_session->audio->rtcp->state == LinphoneUpnpStateOk || call->upnp_session->audio->rtcp->state == LinphoneUpnpStateIdle)) { + call->upnp_session->audio->state = LinphoneUpnpStateOk; + } else if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateAdding || + call->upnp_session->audio->rtp->state == LinphoneUpnpStateRemoving || + call->upnp_session->audio->rtcp->state == LinphoneUpnpStateAdding || + call->upnp_session->audio->rtcp->state == LinphoneUpnpStateRemoving) { + call->upnp_session->audio->state = LinphoneUpnpStatePending; + } else if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateKo || + call->upnp_session->audio->rtp->state == LinphoneUpnpStateKo) { + call->upnp_session->audio->state = LinphoneUpnpStateKo; + } else { + call->upnp_session->audio->state = LinphoneUpnpStateIdle; + } + + /* + * Video part + */ + strncpy(call->upnp_session->video->rtp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); + strncpy(call->upnp_session->video->rtp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); + call->upnp_session->video->rtp->local_port = call->video_port; + strncpy(call->upnp_session->video->rtcp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); + strncpy(call->upnp_session->video->rtcp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); + call->upnp_session->video->rtcp->local_port = call->video_port+1; + if(call->upnp_session->video->rtp->state == LinphoneUpnpStateIdle && call->videostream != NULL) { + // Add video port binding + upnp_context_send_add_port_binding(lc, call->upnp_session->video->rtp); + } else if(call->upnp_session->video->rtp->state == LinphoneUpnpStateOk && call->videostream == NULL) { + // Remove video port binding + upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtp); + } + if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateIdle && call->videostream != NULL) { + // Add video port binding + upnp_context_send_add_port_binding(lc, call->upnp_session->video->rtcp); + } else if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateOk && call->videostream == NULL) { + // Remove video port binding + upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtcp); + } + if((call->upnp_session->video->rtp->state == LinphoneUpnpStateOk || call->upnp_session->video->rtp->state == LinphoneUpnpStateIdle) && + (call->upnp_session->video->rtcp->state == LinphoneUpnpStateOk || call->upnp_session->video->rtcp->state == LinphoneUpnpStateIdle)) { + call->upnp_session->video->state = LinphoneUpnpStateOk; + } else if(call->upnp_session->video->rtp->state == LinphoneUpnpStateAdding || + call->upnp_session->video->rtp->state == LinphoneUpnpStateRemoving || + call->upnp_session->video->rtcp->state == LinphoneUpnpStateAdding || + call->upnp_session->video->rtcp->state == LinphoneUpnpStateRemoving) { + call->upnp_session->video->state = LinphoneUpnpStatePending; + } else if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateKo || + call->upnp_session->video->rtp->state == LinphoneUpnpStateKo) { + call->upnp_session->video->state = LinphoneUpnpStateKo; + } else { + call->upnp_session->video->state = LinphoneUpnpStateIdle; + } + + /* + * Update session state + */ + oldState = call->upnp_session->state; + if(call->upnp_session->audio->state == LinphoneUpnpStateOk && + call->upnp_session->video->state == LinphoneUpnpStateOk) { + call->upnp_session->state = LinphoneUpnpStateOk; + } else if(call->upnp_session->audio->state == LinphoneUpnpStatePending || + call->upnp_session->video->state == LinphoneUpnpStatePending) { + call->upnp_session->state = LinphoneUpnpStatePending; + } else if(call->upnp_session->audio->state == LinphoneUpnpStateKo || + call->upnp_session->video->state == LinphoneUpnpStateKo) { + call->upnp_session->state = LinphoneUpnpStateKo; + } else { + call->upnp_session->state = LinphoneUpnpStateIdle; + } + + /* When change is done proceed update */ + if(oldState != LinphoneUpnpStateOk && oldState != LinphoneUpnpStateKo && + (call->upnp_session->state == LinphoneUpnpStateOk || call->upnp_session->state == LinphoneUpnpStateKo)) { + switch (call->state) { + case LinphoneCallUpdating: + linphone_core_start_update_call(call->core, call); + break; + case LinphoneCallUpdatedByRemote: + linphone_core_start_accept_call_update(call->core, call); + break; + case LinphoneCallOutgoingInit: + linphone_core_proceed_with_invite_if_ready(call->core, call, NULL); + break; + case LinphoneCallIdle: + linphone_core_notify_incoming_call(call->core, call); + break; + default: + break; + } + } + } + + ms_mutex_unlock(&lupnp->mutex); + return ret; +} + +int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call) { + return upnp_call_process(call); +} + +bool_t linphone_core_upnp_hook(void *data) { + char key[64]; + MSList *port_bindings = NULL; + MSList *port_bindings_item; + UpnpPortBinding *port_mapping; + LinphoneCore *lc = (LinphoneCore *)data; + UpnpContext *lupnp = &lc->upnp; + ms_mutex_lock(&lupnp->mutex); + + if(lupnp->state == LinphoneUpnpStateOk && lupnp->old_state != LinphoneUpnpStateOk) { + // Remove old mapping + port_bindings = upnp_config_list_port_bindings(lc->config); + if(port_bindings != NULL) { + for(port_bindings_item = port_bindings;port_bindings_item!=NULL;port_bindings_item=port_bindings_item->next) { + port_mapping = (UpnpPortBinding *)port_bindings_item->data; + upnp_context_send_remove_port_binding(lc, port_mapping); + } + ms_list_for_each(port_bindings,(void (*)(void*))upnp_port_binding_release); + port_bindings = ms_list_free(port_bindings); + } + } + + if(lupnp->state == LinphoneUpnpStateOk && lupnp->old_state != LinphoneUpnpStateOk) { + // Add port bindings + if(lupnp->sip_udp != NULL) { + upnp_context_send_add_port_binding(lc, lupnp->sip_udp); + } + if(lupnp->sip_tcp != NULL) { + upnp_context_send_add_port_binding(lc, lupnp->sip_tcp); + } + if(lupnp->sip_tls != NULL) { + upnp_context_send_add_port_binding(lc, lupnp->sip_tls); + } + } + + /* Update configs */ + for(port_bindings_item = lupnp->pending_configs;port_bindings_item!=NULL;port_bindings_item=port_bindings_item->next) { + port_mapping = (UpnpPortBinding *)port_bindings_item->data; + if(port_mapping->state == LinphoneUpnpStateAdding) { + snprintf(key, sizeof(key), "%s-%d-%d", + (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port_mapping->external_port, + port_mapping->local_port); + lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, ""); + } + if(port_mapping->state == LinphoneUpnpStateRemoving) { + snprintf(key, sizeof(key), "%s-%d-%d", + (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port_mapping->external_port, + port_mapping->local_port); + lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, NULL); + } + } + ms_list_for_each(lupnp->pending_configs,(void (*)(void*))upnp_port_binding_release); + lupnp->pending_configs = ms_list_free(lupnp->pending_configs); + + lupnp->old_state = lupnp->state; + ms_mutex_unlock(&lupnp->mutex); + return TRUE; +} + +void linphone_core_update_local_media_description_from_upnp(SalMediaDescription *desc, UpnpSession *session) { + int i; + SalStreamDescription *stream; + UpnpStream *upnpStream; + + for (i = 0; i < desc->nstreams; i++) { + stream = &desc->streams[i]; + upnpStream = NULL; + if(stream->type == SalAudio) { + upnpStream = session->audio; + } else if(stream->type == SalVideo) { + upnpStream = session->video; + } + if(upnpStream != NULL) { + if(upnpStream->rtp->state == LinphoneUpnpStateOk) { + strncpy(stream->rtp_addr, upnpStream->rtp->external_addr, LINPHONE_IPADDR_SIZE); + stream->rtp_port = upnpStream->rtp->external_port; + } + if(upnpStream->rtcp->state == LinphoneUpnpStateOk) { + strncpy(stream->rtcp_addr, upnpStream->rtcp->external_addr, LINPHONE_IPADDR_SIZE); + stream->rtcp_port = upnpStream->rtcp->external_port; + } + } + } +} + + +/* + * uPnP Port Binding + */ + UpnpPortBinding *upnp_port_binding_new() { UpnpPortBinding *port = NULL; port = ms_new0(UpnpPortBinding,1); ms_mutex_init(&port->mutex, NULL); - port->state = UPNP_Idle; + port->state = LinphoneUpnpStateIdle; + port->local_addr[0] = '\0'; port->local_port = -1; - port->remote_port = -1; + port->external_addr[0] = '\0'; + port->external_port = -1; port->ref = 1; return port; } +UpnpPortBinding *upnp_port_binding_copy(const UpnpPortBinding *port) { + UpnpPortBinding *new_port = NULL; + new_port = ms_new0(UpnpPortBinding,1); + memcpy(new_port, port, sizeof(UpnpPortBinding)); + ms_mutex_init(&new_port->mutex, NULL); + new_port->ref = 1; + return new_port; +} + +bool_t upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2) { + return port1->protocol == port2->protocol && port1->local_port == port2->local_port && + port1->external_port && port2->external_port; +} + UpnpPortBinding *upnp_port_binding_retain(UpnpPortBinding *port) { ms_mutex_lock(&port->mutex); port->ref++; @@ -318,25 +606,177 @@ void upnp_port_binding_release(UpnpPortBinding *port) { ms_mutex_unlock(&port->mutex); } -UpnpSession* upnp_session_new() { - UpnpSession *session = ms_new0(UpnpSession,1); - session->state = UPNP_Idle; - session->audio_rtp = upnp_port_binding_new(); - session->audio_rtp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; - session->audio_rtcp = upnp_port_binding_new(); - session->audio_rtcp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; - session->video_rtp = upnp_port_binding_new(); - session->video_rtp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; - session->video_rtcp = upnp_port_binding_new(); - session->video_rtcp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; +/* + * uPnP Stream + */ + +UpnpStream* upnp_stream_new() { + UpnpStream *stream = ms_new0(UpnpStream,1); + stream->state = LinphoneUpnpStateIdle; + stream->rtp = upnp_port_binding_new(); + stream->rtp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; + stream->rtcp = upnp_port_binding_new(); + stream->rtcp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; return NULL; } -void upnp_session_destroy(UpnpSession* session) { - upnp_port_binding_release(session->audio_rtp); - upnp_port_binding_release(session->audio_rtcp); - upnp_port_binding_release(session->video_rtp); - upnp_port_binding_release(session->video_rtp); - // TODO: send remove - ms_free(session); +void upnp_stream_destroy(UpnpStream* stream) { + upnp_port_binding_release(stream->rtp); + upnp_port_binding_release(stream->rtcp); + ms_free(stream); +} + + +/* + * uPnP Session + */ + +UpnpSession* upnp_session_new() { + UpnpSession *session = ms_new0(UpnpSession,1); + session->state = LinphoneUpnpStateIdle; + session->audio = upnp_stream_new(); + session->video = upnp_stream_new(); + return NULL; +} + +void upnp_session_destroy(LinphoneCall* call) { + LinphoneCore *lc = call->core; + + /* Remove bindings */ + if(call->upnp_session->audio->rtp->state != LinphoneUpnpStateKo && call->upnp_session->audio->rtp->state != LinphoneUpnpStateIdle) { + upnp_context_send_remove_port_binding(lc, call->upnp_session->audio->rtp); + } + if(call->upnp_session->audio->rtcp->state != LinphoneUpnpStateKo && call->upnp_session->audio->rtcp->state != LinphoneUpnpStateIdle) { + upnp_context_send_remove_port_binding(lc, call->upnp_session->audio->rtcp); + } + if(call->upnp_session->video->rtp->state != LinphoneUpnpStateKo && call->upnp_session->video->rtp->state != LinphoneUpnpStateIdle) { + upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtp); + } + if(call->upnp_session->video->rtcp->state != LinphoneUpnpStateKo && call->upnp_session->video->rtcp->state != LinphoneUpnpStateIdle) { + upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtcp); + } + + upnp_stream_destroy(call->upnp_session->audio); + upnp_stream_destroy(call->upnp_session->video); + ms_free(call->upnp_session); + call->upnp_session = NULL; +} + + +/* + * uPnP Config + */ + +MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc) { + char protocol_str[4]; // TCP or UDP + upnp_igd_ip_protocol protocol; + int external_port; + int local_port; + MSList *retList = NULL; + UpnpPortBinding *port; + bool_t valid; + MSList *elem; + MSList *prev_elem; + LpItem *item; + LpSection *sec=lp_config_find_section(lpc, UPNP_SECTION_NAME); + if(sec == NULL) + return retList; + + elem = sec->items; + while(elem != NULL) { + item=(LpItem*)elem->data; + valid = TRUE; + if(sscanf(item->key, "%3s-%i-%i", protocol_str, &external_port, &local_port) == 3) { + if(strcasecmp(protocol_str, "TCP") == 0) { + protocol = UPNP_IGD_IP_PROTOCOL_TCP; + } else if(strcasecmp(protocol_str, "UDP") == 0) { + protocol = UPNP_IGD_IP_PROTOCOL_UDP; + } else { + valid = FALSE; + } + if(valid) { + port = upnp_port_binding_new(); + port->protocol = protocol; + port->external_port = external_port; + port->local_port = local_port; + retList = ms_list_append(retList, port); + } + } else { + valid = FALSE; + } + prev_elem = elem; + elem = ms_list_next(elem); + if(!valid) { + ms_warning("uPnP configuration invalid line: %s", item->key); + lp_section_remove_item(sec, item); + } + } + + return retList; +} + +int upnp_config_add_port_binding(LinphoneCore *lc, const UpnpPortBinding *port) { + UpnpContext *lupnp = &lc->upnp; + MSList *list = lupnp->pending_configs; + UpnpPortBinding *list_port; + bool_t remove; + bool_t add = TRUE; + while(list != NULL) { + remove = FALSE; + list_port = (UpnpPortBinding *)list->data; + if(upnp_port_binding_equal(list_port, port) == TRUE) { + if(list_port->state == LinphoneUpnpStateAdding) { + add = FALSE; + break; + } + if(list_port->state == LinphoneUpnpStateRemoving) { + remove = TRUE; + break; + } + } + list = ms_list_next(list); + } + + if(remove) { + lupnp->pending_configs = ms_list_remove(list, list_port); + } else if(add) { + list_port = upnp_port_binding_copy(port); + list_port->state = LinphoneUpnpStateAdding; + lupnp->pending_configs = ms_list_append(list, list_port); + } + + return 0; +} + +int upnp_config_remove_port_binding(LinphoneCore *lc, const UpnpPortBinding *port) { + UpnpContext *lupnp = &lc->upnp; + MSList *list = lupnp->pending_configs; + UpnpPortBinding *list_port; + bool_t remove; + bool_t add = TRUE; + while(list != NULL) { + remove = FALSE; + list_port = (UpnpPortBinding *)list->data; + if(upnp_port_binding_equal(list_port, port)) { + if(list_port->state == LinphoneUpnpStateRemoving) { + add = FALSE; + break; + } + if(list_port->state == LinphoneUpnpStateAdding) { + remove = TRUE; + break; + } + } + list = ms_list_next(list); + } + + if(remove) { + lupnp->pending_configs = ms_list_remove(list, list_port); + } else if(add) { + list_port = upnp_port_binding_copy(port); + list_port->state = LinphoneUpnpStateRemoving; + lupnp->pending_configs = ms_list_append(list, list_port); + } + + return 0; } diff --git a/coreapi/upnp.h b/coreapi/upnp.h index f0a93d1d6..492b35234 100644 --- a/coreapi/upnp.h +++ b/coreapi/upnp.h @@ -22,33 +22,42 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "mediastreamer2/upnp_igd.h" #include "linphonecore.h" +#include "sal.h" typedef enum { - UPNP_Idle, - UPNP_Pending, - UPNP_Ok, - UPNP_Ko, + LinphoneUpnpStateIdle, + LinphoneUpnpStatePending, + LinphoneUpnpStateAdding, // Only used by port binding + LinphoneUpnpStateRemoving, // Only used by port binding + LinphoneUpnpStateNotAvailable, // Only used by uPnP context + LinphoneUpnpStateOk, + LinphoneUpnpStateKo, } UpnpState; -typedef struct _UpnpSession UpnpSession; typedef struct _UpnpPortBinding { ms_mutex_t mutex; UpnpState state; upnp_igd_ip_protocol protocol; + char local_addr[LINPHONE_IPADDR_SIZE]; int local_port; - int remote_port; + char external_addr[LINPHONE_IPADDR_SIZE]; + int external_port; int retry; int ref; } UpnpPortBinding; -struct _UpnpSession { - UpnpPortBinding *audio_rtp; - UpnpPortBinding *audio_rtcp; - UpnpPortBinding *video_rtp; - UpnpPortBinding *video_rtcp; +typedef struct _UpnpStream { + UpnpPortBinding *rtp; + UpnpPortBinding *rtcp; UpnpState state; -}; +} UpnpStream; + +typedef struct _UpnpSession { + UpnpStream *audio; + UpnpStream *video; + UpnpState state; +} UpnpSession; typedef struct _UpnpContext { upnp_igd_context *upnp_igd_ctxt; @@ -56,15 +65,17 @@ typedef struct _UpnpContext { UpnpPortBinding *sip_tls; UpnpPortBinding *sip_udp; UpnpState state; - MSList *pending_bindinds; + UpnpState old_state; + MSList *pending_configs; + ms_mutex_t mutex; } UpnpContext; - +void linphone_core_update_local_media_description_from_upnp(SalMediaDescription *desc, UpnpSession *session); int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call); int upnp_call_process(LinphoneCall *call); UpnpSession* upnp_session_new(); -void upnp_session_destroy(UpnpSession* session); +void upnp_session_destroy(LinphoneCall* call); int upnp_context_init(LinphoneCore *lc); void upnp_context_uninit(LinphoneCore *lc); diff --git a/mediastreamer2 b/mediastreamer2 index 39998cb24..34de96d6b 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 39998cb245606b904a77e093db168057f87bf8b0 +Subproject commit 34de96d6b33f58b248f7d46e9c25edb11e6a5426 From f3805137e6c2f4821450ed6391ebc92a727ec7fd Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 4 Jan 2013 16:19:13 +0100 Subject: [PATCH 007/281] Working call with uPnP --- coreapi/callbacks.c | 16 ++++ coreapi/linphonecall.c | 8 +- coreapi/linphonecore.c | 30 ++++++-- coreapi/misc.c | 49 ++++++------ coreapi/private.h | 5 +- coreapi/proxy.c | 2 +- coreapi/upnp.c | 171 +++++++++++++++++++++++++++-------------- coreapi/upnp.h | 1 + 8 files changed, 184 insertions(+), 98 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index b3d1a6bb7..4eec5be3d 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -253,6 +253,12 @@ static void call_received(SalOp *h){ return; } + 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; + } + linphone_core_notify_incoming_call(lc,call); } @@ -325,6 +331,11 @@ static void call_accepted(SalOp *op){ if (call->ice_session != NULL) { 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); call->params.has_video &= linphone_core_media_description_contains_video_stream(md); @@ -418,6 +429,7 @@ static void call_accept_update(LinphoneCore *lc, LinphoneCall *call){ } #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 @@ -516,6 +528,10 @@ static void call_terminated(SalOp *op, const char *from){ if (lc->vtable.display_status!=NULL) 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"); } diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 2ab398ba5..ec76311a6 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -444,7 +444,7 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr call->op=sal_op_new(lc->sal); sal_op_set_user_pointer(call->op,call); call->core=lc; - linphone_core_get_public_ip(lc,linphone_address_get_domain(to),call->localip); + linphone_core_get_local_ip(lc,linphone_address_get_domain(to),call->localip); linphone_call_init_common(call,from,to); call->params=*params; if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseIce) { @@ -491,7 +491,7 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro } linphone_address_clean(from); - linphone_core_get_public_ip(lc,linphone_address_get_domain(from),call->localip); + linphone_core_get_local_ip(lc,linphone_address_get_domain(from),call->localip); linphone_call_init_common(call, from, to); call->log->call_id=ms_strdup(sal_op_get_call_id(op)); /*must be known at that time*/ linphone_core_init_default_params(lc, &call->params); @@ -524,9 +524,9 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro case LinphonePolicyUseUpnp: #ifdef BUILD_UPNP call->upnp_session = upnp_session_new(call); - if (call->ice_session != NULL) { + if (call->upnp_session != NULL) { linphone_call_init_media_streams(call); - if (linphone_core_update_upnp(call->core,call)<0) { + 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); } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index ddd9eaea6..7abce8e96 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1306,7 +1306,7 @@ int linphone_core_set_primary_contact(LinphoneCore *lc, const char *contact) /*result must be an array of chars at least LINPHONE_IPADDR_SIZE */ -void linphone_core_get_public_ip(LinphoneCore *lc, const char *dest, char *result){ +void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result){ const char *ip; if (linphone_core_get_firewall_policy(lc)==LinphonePolicyUseNatAddress && (ip=linphone_core_get_nat_address_resolved(lc))!=NULL){ @@ -1318,6 +1318,7 @@ void linphone_core_get_public_ip(LinphoneCore *lc, const char *dest, char *resul && lc->upnp.state == LinphoneUpnpStateOk) { ip = upnp_igd_get_external_ipaddress(lc->upnp.upnp_igd_ctxt); strncpy(result,ip,LINPHONE_IPADDR_SIZE); + return; } #endif if (linphone_core_get_local_ip_for(lc->sip_conf.ipv6_enabled ? AF_INET6 : AF_INET,dest,result)==0) @@ -1340,7 +1341,7 @@ static void update_primary_contact(LinphoneCore *lc){ ms_error("Could not parse identity contact !"); url=linphone_address_new("sip:unknown@unkwownhost"); } - linphone_core_get_public_ip(lc, NULL, tmp); + linphone_core_get_local_ip(lc, NULL, tmp); if (strcmp(tmp,"127.0.0.1")==0 || strcmp(tmp,"::1")==0 ){ ms_warning("Local loopback network only !"); lc->sip_conf.loopback_only=TRUE; @@ -2268,6 +2269,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){ bool_t ice_ready = FALSE; + bool_t upnp_ready = FALSE; bool_t ping_ready = FALSE; if (call->ice_session != NULL) { @@ -2275,13 +2277,20 @@ int linphone_core_proceed_with_invite_if_ready(LinphoneCore *lc, LinphoneCall *c } else { ice_ready = TRUE; } +#ifdef BUILD_UPNP + if (call->upnp_session != NULL) { + if (call->upnp_session->state == LinphoneUpnpStateOk) upnp_ready = TRUE; + } else { + upnp_ready = TRUE; + } +#endif //BUILD_UPNP if (call->ping_op != NULL) { if (call->ping_replied == TRUE) ping_ready = TRUE; } else { 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 0; @@ -2843,6 +2852,14 @@ int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const #if BUILD_UPNP if(call->upnp_session != NULL) { + 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_from_remote_media_description(call, sal_call_get_remote_media_description(call->op))<0) { + /* uPnP update failed, proceed with the call anyway. */ + linphone_call_delete_upnp_session(call); + } else return 0; + } } #endif //BUILD_UPNP @@ -4961,6 +4978,10 @@ static void linphone_core_uninit(LinphoneCore *lc) lc->config = NULL; /* Mark the config as NULL to block further calls */ sip_setup_unregister_all(); +#ifdef BUILD_UPNP + upnp_context_uninit(lc); +#endif + ms_list_for_each(lc->call_logs,(void (*)(void*))linphone_call_log_destroy); lc->call_logs=ms_list_free(lc->call_logs); @@ -4973,9 +4994,6 @@ static void linphone_core_uninit(LinphoneCore *lc) #ifdef TUNNEL_ENABLED if (lc->tunnel) linphone_tunnel_destroy(lc->tunnel); #endif -#ifdef BUILD_UPNP - upnp_context_uninit(lc); -#endif } static void set_network_reachable(LinphoneCore* lc,bool_t isReachable, time_t curtime){ diff --git a/coreapi/misc.c b/coreapi/misc.c index d75722138..6e49d56a5 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -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 && (ifp->ifa_flags & UP_FLAG) && !(ifp->ifa_flags & IFF_LOOPBACK)) { - getnameinfo(ifp->ifa_addr, + if(getnameinfo(ifp->ifa_addr, (type == AF_INET6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in), - address, size, NULL, 0, NI_NUMERICHOST); - if (strchr(address, '%') == NULL) { /*avoid ipv6 link-local addresses */ - /*ms_message("getifaddrs() found %s",address);*/ - ret++; - break; + address, size, NULL, 0, NI_NUMERICHOST) == 0) { + if (strchr(address, '%') == NULL) { /*avoid ipv6 link-local addresses */ + /*ms_message("getifaddrs() found %s",address);*/ + ret++; + 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){ - strcpy(result,type==AF_INET ? "127.0.0.1" : "::1"); + strcpy(result,type==AF_INET ? "127.0.0.1" : "::1"); #ifdef HAVE_GETIFADDRS - if (dest==NULL) { - /*we use getifaddrs for lookup of default interface */ - int found_ifs; - - found_ifs=get_local_ip_with_getifaddrs(type,result,LINPHONE_IPADDR_SIZE); - if (found_ifs==1){ - return 0; - }else if (found_ifs<=0){ - /*absolutely no network on this machine */ - return -1; - } - } + if (dest==NULL) { + /*we use getifaddrs for lookup of default interface */ + int found_ifs; + + found_ifs=get_local_ip_with_getifaddrs(type,result,LINPHONE_IPADDR_SIZE); + if (found_ifs==1){ + return 0; + }else if (found_ifs<=0){ + /*absolutely no network on this machine */ + return -1; + } + } #endif - /*else use connect to find the best local ip address */ - if (type==AF_INET) - dest="87.98.157.38"; /*a public IP address*/ - else dest="2a00:1450:8002::68"; - return get_local_ip_for_with_connect(type,dest,result); + /*else use connect to find the best local ip address */ + if (type==AF_INET) + dest="87.98.157.38"; /*a public IP address*/ + else dest="2a00:1450:8002::68"; + return get_local_ip_for_with_connect(type,dest,result); } #ifndef WIN32 diff --git a/coreapi/private.h b/coreapi/private.h index e110a03e3..d4abf16ca 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -206,7 +206,7 @@ int set_lock_file(); int get_lock_file(); int remove_lock_file(); void check_sound_device(LinphoneCore *lc); -void linphone_core_get_public_ip(LinphoneCore *lc, const char *to, char *result); +void linphone_core_get_local_ip(LinphoneCore *lc, const char *to, char *result); bool_t host_has_ipv6_network(); bool_t lp_spawn_command_line_sync(const char *command, char **result,int *command_ret); @@ -593,9 +593,6 @@ int linphone_core_del_call( LinphoneCore *lc, LinphoneCall *call); int linphone_core_set_as_current_call(LinphoneCore *lc, LinphoneCall *call); int linphone_core_get_calls_nb(const LinphoneCore *lc); -void linphone_core_add_iterate_hook(LinphoneCore *lc, LinphoneCoreIterateHook hook, void *hook_data); -void linphone_core_remove_iterate_hook(LinphoneCore *lc, LinphoneCoreIterateHook hook, void *hook_data); - void linphone_core_set_state(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message); void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *call); void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMediaDescription *new_md); diff --git a/coreapi/proxy.c b/coreapi/proxy.c index ff046f92e..82b3b3000 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -268,7 +268,7 @@ static char *guess_contact_for_register(LinphoneProxyConfig *obj){ LCSipTransports tr; LinphoneAddress *contact; - linphone_core_get_public_ip(obj->lc,host,localip); + linphone_core_get_local_ip(obj->lc,host,localip); contact=linphone_address_new(obj->reg_identity); linphone_address_set_domain (contact,localip); linphone_address_set_port_int(contact,linphone_core_get_sip_port(obj->lc)); diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 0de861210..4cb41d7ae 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -53,6 +53,7 @@ UpnpPortBinding *upnp_port_binding_new(); UpnpPortBinding *upnp_port_binding_copy(const UpnpPortBinding *port); bool_t upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2); UpnpPortBinding *upnp_port_binding_retain(UpnpPortBinding *port); +void upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *port); void upnp_port_binding_release(UpnpPortBinding *port); MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc); @@ -62,6 +63,7 @@ int upnp_config_remove_port_binding(LinphoneCore *lc, const UpnpPortBinding *por int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *port); int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port); + /** * uPnP Callbacks */ @@ -74,10 +76,10 @@ void linphone_upnp_igd_print(void *cookie, upnp_igd_print_level level, const cha ortp_level = ORTP_MESSAGE; break; case UPNP_IGD_WARNING: - ortp_level = ORTP_WARNING; + ortp_level = ORTP_DEBUG; // Too verbose otherwise break; case UPNP_IGD_ERROR: - ortp_level = ORTP_ERROR; + ortp_level = ORTP_DEBUG; // Too verbose otherwise break; default: break; @@ -121,11 +123,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { port_mapping = (UpnpPortBinding*) mapping->cookie; port_mapping->external_port = mapping->remote_port; port_mapping->state = LinphoneUpnpStateOk; - ms_message("uPnP IGD: Added port binding %s|%d->%s:%d", - (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", - port_mapping->external_port, - port_mapping->local_addr, - port_mapping->local_port); + upnp_port_binding_log(ORTP_MESSAGE, "Added port binding", port_mapping); upnp_config_add_port_binding(lc, port_mapping); upnp_port_binding_release(port_mapping); @@ -135,11 +133,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; if(upnp_context_send_add_port_binding(lc, port_mapping) != 0) { - ms_error("uPnP IGD: Can't add port binding %s|%d->%s:%d", - (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", - port_mapping->external_port, - port_mapping->local_addr, - port_mapping->local_port); + upnp_port_binding_log(ORTP_ERROR, "Can't add port binding", port_mapping); } upnp_port_binding_release(port_mapping); @@ -149,10 +143,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; port_mapping->state = LinphoneUpnpStateIdle; - ms_message("uPnP IGD: Removed port binding %s|%d->%d", - (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", - port_mapping->external_port, - port_mapping->local_port); + upnp_port_binding_log(ORTP_MESSAGE, "Removed port binding", port_mapping); upnp_config_remove_port_binding(lc, port_mapping); upnp_port_binding_release(port_mapping); @@ -162,10 +153,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; if(upnp_context_send_remove_port_binding(lc, port_mapping) != 0) { - ms_error("uPnP IGD: Can't remove port binding %s|%d->%d", - (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", - port_mapping->external_port, - port_mapping->local_port); + upnp_port_binding_log(ORTP_ERROR, "Can't remove port binding", port_mapping); upnp_config_remove_port_binding(lc, port_mapping); } @@ -304,7 +292,7 @@ int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *por UpnpContext *lupnp = &lc->upnp; upnp_igd_port_mapping mapping; int ret; - if(port->state == LinphoneUpnpStateIdle) { + if(port->state == LinphoneUpnpStateOk) { port->retry = 0; port->state = LinphoneUpnpStateRemoving; } else if(port->state != LinphoneUpnpStateRemoving) { @@ -332,11 +320,10 @@ int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *por * uPnP Core interfaces */ -int upnp_call_process(LinphoneCall *call) { +int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool_t video) { LinphoneCore *lc = call->core; UpnpContext *lupnp = &lc->upnp; int ret = -1; - UpnpState oldState; const char *local_addr, *external_addr; ms_mutex_lock(&lupnp->mutex); @@ -355,20 +342,88 @@ int upnp_call_process(LinphoneCall *call) { strncpy(call->upnp_session->audio->rtcp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); strncpy(call->upnp_session->audio->rtcp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); call->upnp_session->audio->rtcp->local_port = call->audio_port+1; - if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateIdle && call->audiostream != NULL) { + if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateIdle && audio) { // Add audio port binding upnp_context_send_add_port_binding(lc, call->upnp_session->audio->rtp); - } else if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateOk && call->audiostream == NULL) { + } else if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateOk && !audio) { // Remove audio port binding upnp_context_send_remove_port_binding(lc, call->upnp_session->audio->rtp); } - if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateIdle && call->audiostream != NULL) { + if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateIdle && audio) { // Add audio port binding upnp_context_send_add_port_binding(lc, call->upnp_session->audio->rtcp); - } else if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateOk && call->audiostream == NULL) { + } else if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateOk && !audio) { // Remove audio port binding upnp_context_send_remove_port_binding(lc, call->upnp_session->audio->rtcp); } + + /* + * Video part + */ + strncpy(call->upnp_session->video->rtp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); + strncpy(call->upnp_session->video->rtp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); + call->upnp_session->video->rtp->local_port = call->video_port; + strncpy(call->upnp_session->video->rtcp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); + strncpy(call->upnp_session->video->rtcp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); + call->upnp_session->video->rtcp->local_port = call->video_port+1; + if(call->upnp_session->video->rtp->state == LinphoneUpnpStateIdle && video) { + // Add video port binding + upnp_context_send_add_port_binding(lc, call->upnp_session->video->rtp); + } else if(call->upnp_session->video->rtp->state == LinphoneUpnpStateOk && !video) { + // Remove video port binding + upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtp); + } + if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateIdle && video) { + // Add video port binding + upnp_context_send_add_port_binding(lc, call->upnp_session->video->rtcp); + } else if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateOk && !video) { + // Remove video port binding + upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtcp); + } + } + + ms_mutex_unlock(&lupnp->mutex); + return ret; +} + + +int linphone_core_update_upnp_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md) { + bool_t audio = FALSE; + bool_t video = FALSE; + int i; + const SalStreamDescription *stream; + + for (i = 0; i < md->nstreams; i++) { + stream = &md->streams[i]; + if(stream->type == SalAudio) { + audio = TRUE; + } else if(stream->type == SalVideo) { + video = TRUE; + } + } + + return linphone_core_update_upnp_audio_video(call, audio, video); +} + +int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call) { + return linphone_core_update_upnp_audio_video(call, call->audiostream!=NULL, call->videostream!=NULL); +} + +int upnp_call_process(LinphoneCall *call) { + LinphoneCore *lc = call->core; + UpnpContext *lupnp = &lc->upnp; + int ret = -1; + UpnpState oldState; + + ms_mutex_lock(&lupnp->mutex); + + // Don't handle when the call + if(lupnp->state == LinphoneUpnpStateOk && call->upnp_session != NULL) { + ret = 0; + + /* + * Update Audio state + */ if((call->upnp_session->audio->rtp->state == LinphoneUpnpStateOk || call->upnp_session->audio->rtp->state == LinphoneUpnpStateIdle) && (call->upnp_session->audio->rtcp->state == LinphoneUpnpStateOk || call->upnp_session->audio->rtcp->state == LinphoneUpnpStateIdle)) { call->upnp_session->audio->state = LinphoneUpnpStateOk; @@ -385,28 +440,8 @@ int upnp_call_process(LinphoneCall *call) { } /* - * Video part + * Update Video state */ - strncpy(call->upnp_session->video->rtp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); - strncpy(call->upnp_session->video->rtp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); - call->upnp_session->video->rtp->local_port = call->video_port; - strncpy(call->upnp_session->video->rtcp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); - strncpy(call->upnp_session->video->rtcp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); - call->upnp_session->video->rtcp->local_port = call->video_port+1; - if(call->upnp_session->video->rtp->state == LinphoneUpnpStateIdle && call->videostream != NULL) { - // Add video port binding - upnp_context_send_add_port_binding(lc, call->upnp_session->video->rtp); - } else if(call->upnp_session->video->rtp->state == LinphoneUpnpStateOk && call->videostream == NULL) { - // Remove video port binding - upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtp); - } - if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateIdle && call->videostream != NULL) { - // Add video port binding - upnp_context_send_add_port_binding(lc, call->upnp_session->video->rtcp); - } else if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateOk && call->videostream == NULL) { - // Remove video port binding - upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtcp); - } if((call->upnp_session->video->rtp->state == LinphoneUpnpStateOk || call->upnp_session->video->rtp->state == LinphoneUpnpStateIdle) && (call->upnp_session->video->rtcp->state == LinphoneUpnpStateOk || call->upnp_session->video->rtcp->state == LinphoneUpnpStateIdle)) { call->upnp_session->video->state = LinphoneUpnpStateOk; @@ -442,18 +477,23 @@ int upnp_call_process(LinphoneCall *call) { /* When change is done proceed update */ if(oldState != LinphoneUpnpStateOk && oldState != LinphoneUpnpStateKo && (call->upnp_session->state == LinphoneUpnpStateOk || call->upnp_session->state == LinphoneUpnpStateKo)) { + if(call->upnp_session->state == LinphoneUpnpStateOk) + ms_message("uPnP IGD: uPnP for Call %p is ok", call); + else + ms_message("uPnP IGD: uPnP for Call %p is ko", call); + switch (call->state) { case LinphoneCallUpdating: - linphone_core_start_update_call(call->core, call); + linphone_core_start_update_call(lc, call); break; case LinphoneCallUpdatedByRemote: - linphone_core_start_accept_call_update(call->core, call); + linphone_core_start_accept_call_update(lc, call); break; case LinphoneCallOutgoingInit: - linphone_core_proceed_with_invite_if_ready(call->core, call, NULL); + linphone_core_proceed_with_invite_if_ready(lc, call, NULL); break; case LinphoneCallIdle: - linphone_core_notify_incoming_call(call->core, call); + linphone_core_notify_incoming_call(lc, call); break; default: break; @@ -465,10 +505,6 @@ int upnp_call_process(LinphoneCall *call) { return ret; } -int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call) { - return upnp_call_process(call); -} - bool_t linphone_core_upnp_hook(void *data) { char key[64]; MSList *port_bindings = NULL; @@ -512,7 +548,7 @@ bool_t linphone_core_upnp_hook(void *data) { (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", port_mapping->external_port, port_mapping->local_port); - lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, ""); + lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, "uPnP"); } if(port_mapping->state == LinphoneUpnpStateRemoving) { snprintf(key, sizeof(key), "%s-%d-%d", @@ -583,6 +619,21 @@ UpnpPortBinding *upnp_port_binding_copy(const UpnpPortBinding *port) { return new_port; } +void upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *port) { + if(strlen(port->local_addr)) { + ortp_log(level, "uPnP IGD: %s %s|%d->%s:%d", msg, + (port->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port->external_port, + port->local_addr, + port->local_port); + } else { + ortp_log(level, "uPnP IGD: %s %s|%d->%d", msg, + (port->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port->external_port, + port->local_port); + } +} + bool_t upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2) { return port1->protocol == port2->protocol && port1->local_port == port2->local_port && port1->external_port && port2->external_port; @@ -606,6 +657,7 @@ void upnp_port_binding_release(UpnpPortBinding *port) { ms_mutex_unlock(&port->mutex); } + /* * uPnP Stream */ @@ -617,7 +669,7 @@ UpnpStream* upnp_stream_new() { stream->rtp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; stream->rtcp = upnp_port_binding_new(); stream->rtcp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; - return NULL; + return stream; } void upnp_stream_destroy(UpnpStream* stream) { @@ -636,7 +688,7 @@ UpnpSession* upnp_session_new() { session->state = LinphoneUpnpStateIdle; session->audio = upnp_stream_new(); session->video = upnp_stream_new(); - return NULL; + return session; } void upnp_session_destroy(LinphoneCall* call) { @@ -696,6 +748,7 @@ MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc) { } if(valid) { port = upnp_port_binding_new(); + port->state = LinphoneUpnpStateOk; port->protocol = protocol; port->external_port = external_port; port->local_port = local_port; diff --git a/coreapi/upnp.h b/coreapi/upnp.h index 492b35234..b515d0410 100644 --- a/coreapi/upnp.h +++ b/coreapi/upnp.h @@ -72,6 +72,7 @@ typedef struct _UpnpContext { } UpnpContext; void 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 upnp_call_process(LinphoneCall *call); UpnpSession* upnp_session_new(); From 9c3097ab3d44d0a27ef783327acebb6ece8a2edf Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 7 Jan 2013 09:50:25 +0100 Subject: [PATCH 008/281] Fix invalid port binding comparaison --- coreapi/upnp.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 4cb41d7ae..94072a4fc 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -549,6 +549,7 @@ bool_t linphone_core_upnp_hook(void *data) { port_mapping->external_port, port_mapping->local_port); lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, "uPnP"); + upnp_port_binding_log(ORTP_DEBUG, "Configuration: Added port binding", port_mapping); } if(port_mapping->state == LinphoneUpnpStateRemoving) { snprintf(key, sizeof(key), "%s-%d-%d", @@ -556,6 +557,7 @@ bool_t linphone_core_upnp_hook(void *data) { port_mapping->external_port, port_mapping->local_port); lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, NULL); + upnp_port_binding_log(ORTP_DEBUG, "Configuration: Removed port binding", port_mapping); } } ms_list_for_each(lupnp->pending_configs,(void (*)(void*))upnp_port_binding_release); @@ -635,8 +637,9 @@ void upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *po } bool_t upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2) { - return port1->protocol == port2->protocol && port1->local_port == port2->local_port && - port1->external_port && port2->external_port; + return port1->protocol == port2->protocol && + port1->local_port == port2->local_port && + port1->external_port == port2->external_port; } UpnpPortBinding *upnp_port_binding_retain(UpnpPortBinding *port) { @@ -772,10 +775,9 @@ int upnp_config_add_port_binding(LinphoneCore *lc, const UpnpPortBinding *port) UpnpContext *lupnp = &lc->upnp; MSList *list = lupnp->pending_configs; UpnpPortBinding *list_port; - bool_t remove; + bool_t remove = FALSE; bool_t add = TRUE; while(list != NULL) { - remove = FALSE; list_port = (UpnpPortBinding *)list->data; if(upnp_port_binding_equal(list_port, port) == TRUE) { if(list_port->state == LinphoneUpnpStateAdding) { @@ -805,10 +807,9 @@ int upnp_config_remove_port_binding(LinphoneCore *lc, const UpnpPortBinding *por UpnpContext *lupnp = &lc->upnp; MSList *list = lupnp->pending_configs; UpnpPortBinding *list_port; - bool_t remove; + bool_t remove = FALSE; bool_t add = TRUE; while(list != NULL) { - remove = FALSE; list_port = (UpnpPortBinding *)list->data; if(upnp_port_binding_equal(list_port, port)) { if(list_port->state == LinphoneUpnpStateRemoving) { From 92a7d6695ccc350bfc1eae2cadc797edf3baae98 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 7 Jan 2013 16:08:09 +0100 Subject: [PATCH 009/281] Set external port equal to local port the first time --- coreapi/callbacks.c | 2 +- coreapi/linphonecall.c | 2 +- coreapi/linphonecore.c | 16 ++++++++-------- coreapi/private.h | 2 +- coreapi/upnp.c | 11 +++++++++-- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 4eec5be3d..3a21e5a6d 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -432,7 +432,7 @@ static void call_accept_update(LinphoneCore *lc, LinphoneCall *call){ linphone_core_update_upnp_from_remote_media_description(call, rmd); linphone_core_update_local_media_description_from_upnp(call->localdesc,call->upnp_session); } -#endif +#endif //BUILD_UPNP sal_call_accept(call->op); md=sal_call_get_final_media_description(call->op); if (md && !sal_media_description_empty(md)) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index ec76311a6..d8de9659c 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -287,7 +287,7 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * if(call->upnp_session != NULL) { linphone_core_update_local_media_description_from_upnp(md, call->upnp_session); } -#endif +#endif //BUILD_UPNP linphone_address_destroy(addr); call->localdesc=md; if (old_md) sal_media_description_unref(old_md); diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 7abce8e96..1da9ad5cd 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1219,7 +1219,7 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta #endif #ifdef BUILD_UPNP upnp_context_init(lc); -#endif +#endif //BUILD_UPNP if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Ready")); lc->auto_net_state_mon=lc->sip_conf.auto_net_state_mon; @@ -1320,7 +1320,7 @@ void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result strncpy(result,ip,LINPHONE_IPADDR_SIZE); return; } -#endif +#endif //BUILD_UPNP if (linphone_core_get_local_ip_for(lc->sip_conf.ipv6_enabled ? AF_INET6 : AF_INET,dest,result)==0) return; /*else fallback to SAL routine that will attempt to find the most realistic interface */ @@ -2504,7 +2504,7 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const } else { defer = TRUE; } -#endif +#endif //BUILD_UPNP } if (call->dest_proxy==NULL && lc->sip_conf.ping_with_options==TRUE){ @@ -2661,7 +2661,7 @@ int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call){ if(call->upnp_session != NULL) { linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session); } -#endif +#endif //BUILD_UPNP if (call->params.in_conference){ subject="Conference"; }else{ @@ -2780,7 +2780,7 @@ int linphone_core_start_accept_call_update(LinphoneCore *lc, LinphoneCall *call) if(call->upnp_session != NULL) { linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session); } -#endif +#endif //BUILD_UPNP sal_call_set_local_media_description(call->op,call->localdesc); sal_call_accept(call->op); md=sal_call_get_final_media_description(call->op); @@ -3164,7 +3164,7 @@ int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call) if(call->upnp_session != NULL) { linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session); } -#endif +#endif //BUILD_UPNP if (sal_media_description_has_dir(call->resultdesc,SalStreamSendRecv)){ sal_media_description_set_dir(call->localdesc,SalStreamSendOnly); subject="Call on hold"; @@ -3249,7 +3249,7 @@ int linphone_core_resume_call(LinphoneCore *lc, LinphoneCall *the_call) if(call->upnp_session != NULL) { linphone_core_update_local_media_description_from_upnp(call->localdesc, call->upnp_session); } -#endif +#endif //BUILD_UPNP sal_call_set_local_media_description(call->op,call->localdesc); sal_media_description_set_dir(call->localdesc,SalStreamSendRecv); if (call->params.in_conference && !call->current_params.in_conference) subject="Conference"; @@ -4980,7 +4980,7 @@ static void linphone_core_uninit(LinphoneCore *lc) #ifdef BUILD_UPNP upnp_context_uninit(lc); -#endif +#endif //BUILD_UPNP ms_list_for_each(lc->call_logs,(void (*)(void*))linphone_call_log_destroy); lc->call_logs=ms_list_free(lc->call_logs); diff --git a/coreapi/private.h b/coreapi/private.h index d4abf16ca..b2b724d83 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -42,7 +42,7 @@ extern "C" { #include "mediastreamer2/msconference.h" #ifdef BUILD_UPNP #include "upnp.h" -#endif +#endif //BUILD_UPNP #ifndef LIBLINPHONE_VERSION #define LIBLINPHONE_VERSION LINPHONE_VERSION diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 94072a4fc..530bf1bf1 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -132,6 +132,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { case UPNP_IGD_PORT_MAPPING_ADD_FAILURE: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; + port_mapping->external_port = -1; //Force a new random port if(upnp_context_send_add_port_binding(lc, port_mapping) != 0) { upnp_port_binding_log(ORTP_ERROR, "Can't add port binding", port_mapping); } @@ -188,6 +189,7 @@ int upnp_context_init(LinphoneCore *lc) { lupnp->sip_udp = upnp_port_binding_new(); lupnp->sip_udp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; lupnp->sip_udp->local_port = transport.udp_port; + lupnp->sip_udp->external_port = transport.udp_port; } else { lupnp->sip_udp = NULL; } @@ -195,6 +197,7 @@ int upnp_context_init(LinphoneCore *lc) { lupnp->sip_tcp = upnp_port_binding_new(); lupnp->sip_tcp->protocol = UPNP_IGD_IP_PROTOCOL_TCP; lupnp->sip_tcp->local_port = transport.tcp_port; + lupnp->sip_tcp->external_port = transport.tcp_port; } else { lupnp->sip_tcp = NULL; } @@ -202,6 +205,7 @@ int upnp_context_init(LinphoneCore *lc) { lupnp->sip_tls = upnp_port_binding_new(); lupnp->sip_tls->protocol = UPNP_IGD_IP_PROTOCOL_TCP; lupnp->sip_tls->local_port = transport.tls_port; + lupnp->sip_tls->external_port = transport.tls_port; } else { lupnp->sip_tls = NULL; } @@ -257,7 +261,6 @@ int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port) upnp_igd_port_mapping mapping; int ret; if(port->state == LinphoneUpnpStateIdle) { - port->external_port = -1; port->retry = 0; port->state = LinphoneUpnpStateAdding; } else if(port->state != LinphoneUpnpStateAdding) { @@ -272,7 +275,7 @@ int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port) mapping.local_port = port->local_port; mapping.local_host = port->local_addr; if(port->external_port == -1) - mapping.remote_port = rand()%1024 + 1024; // TODO: use better method + mapping.remote_port = rand()%(0xffff - 1024) + 1024; // TODO: use better method else mapping.remote_port = port->external_port; mapping.remote_host = ""; @@ -339,9 +342,11 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool strncpy(call->upnp_session->audio->rtp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); strncpy(call->upnp_session->audio->rtp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); call->upnp_session->audio->rtp->local_port = call->audio_port; + call->upnp_session->audio->rtp->external_port = call->audio_port; strncpy(call->upnp_session->audio->rtcp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); strncpy(call->upnp_session->audio->rtcp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); call->upnp_session->audio->rtcp->local_port = call->audio_port+1; + call->upnp_session->audio->rtcp->external_port = call->audio_port+1; if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateIdle && audio) { // Add audio port binding upnp_context_send_add_port_binding(lc, call->upnp_session->audio->rtp); @@ -363,9 +368,11 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool strncpy(call->upnp_session->video->rtp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); strncpy(call->upnp_session->video->rtp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); call->upnp_session->video->rtp->local_port = call->video_port; + call->upnp_session->video->rtp->external_port = call->video_port; strncpy(call->upnp_session->video->rtcp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); strncpy(call->upnp_session->video->rtcp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); call->upnp_session->video->rtcp->local_port = call->video_port+1; + call->upnp_session->video->rtcp->external_port = call->video_port+1; if(call->upnp_session->video->rtp->state == LinphoneUpnpStateIdle && video) { // Add video port binding upnp_context_send_add_port_binding(lc, call->upnp_session->video->rtp); From 4b257d3de4185e4cbbbeedccadc92393153402ac Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 7 Jan 2013 16:19:20 +0100 Subject: [PATCH 010/281] Don't remove hook (done before) Remove unused variable --- coreapi/upnp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 530bf1bf1..909fca3b3 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -237,7 +237,9 @@ int upnp_context_init(LinphoneCore *lc) { void upnp_context_uninit(LinphoneCore *lc) { UpnpContext *lupnp = &lc->upnp; - linphone_core_remove_iterate_hook(lc, linphone_core_upnp_hook, lc); + + // Not need, all hooks are removed before + //linphone_core_remove_iterate_hook(lc, linphone_core_upnp_hook, lc); if(lupnp->sip_udp != NULL) { upnp_port_binding_release(lupnp->sip_udp); @@ -738,7 +740,6 @@ MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc) { UpnpPortBinding *port; bool_t valid; MSList *elem; - MSList *prev_elem; LpItem *item; LpSection *sec=lp_config_find_section(lpc, UPNP_SECTION_NAME); if(sec == NULL) @@ -767,7 +768,6 @@ MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc) { } else { valid = FALSE; } - prev_elem = elem; elem = ms_list_next(elem); if(!valid) { ms_warning("uPnP configuration invalid line: %s", item->key); From 492f3c9b91c2b9bcb856841ae82714ba7137db75 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 8 Jan 2013 13:56:07 +0100 Subject: [PATCH 011/281] Update upnp igd, and early destroy upnp session on call fail --- coreapi/callbacks.c | 5 +++++ coreapi/upnp.c | 1 + mediastreamer2 | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 3a21e5a6d..142b4b163 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -628,6 +628,11 @@ static void call_failure(SalOp *op, SalError error, SalReason sr, const char *de /*resume to the call that send us the refer automatically*/ linphone_core_resume_call(lc,call->referer); } + +#ifdef BUILD_UPNP + linphone_call_delete_upnp_session(call); +#endif //BUILD_UPNP + if (sr == SalReasonDeclined) { call->reason=LinphoneReasonDeclined; linphone_call_set_state(call,LinphoneCallEnd,"Call declined."); diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 909fca3b3..ff4a1eae2 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -529,6 +529,7 @@ bool_t linphone_core_upnp_hook(void *data) { if(port_bindings != NULL) { for(port_bindings_item = port_bindings;port_bindings_item!=NULL;port_bindings_item=port_bindings_item->next) { port_mapping = (UpnpPortBinding *)port_bindings_item->data; + //TODO: Don't send id it's udp/tcp/tls port binding upnp_context_send_remove_port_binding(lc, port_mapping); } ms_list_for_each(port_bindings,(void (*)(void*))upnp_port_binding_release); diff --git a/mediastreamer2 b/mediastreamer2 index 34de96d6b..f9e4fed0b 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 34de96d6b33f58b248f7d46e9c25edb11e6a5426 +Subproject commit f9e4fed0b113f04895ae24a4e40f618e156b3754 From 4e90f134d58a687c553f706b93152d3b8eba9031 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 8 Jan 2013 14:33:48 +0100 Subject: [PATCH 012/281] Add another early port binding release --- coreapi/linphonecore.c | 5 +++++ coreapi/upnp.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 1da9ad5cd..b277d8ae4 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3018,6 +3018,11 @@ static void terminate_call(LinphoneCore *lc, LinphoneCall *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) lc->vtable.display_status(lc,_("Call ended") ); linphone_call_set_state(call,LinphoneCallEnd,"Call terminated"); diff --git a/coreapi/upnp.c b/coreapi/upnp.c index ff4a1eae2..336e0b78f 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -527,7 +527,7 @@ bool_t linphone_core_upnp_hook(void *data) { // Remove old mapping port_bindings = upnp_config_list_port_bindings(lc->config); if(port_bindings != NULL) { - for(port_bindings_item = port_bindings;port_bindings_item!=NULL;port_bindings_item=port_bindings_item->next) { + for(port_bindings_item = port_bindings;port_bindings_item != NULL; port_bindings_item = port_bindings_item->next) { port_mapping = (UpnpPortBinding *)port_bindings_item->data; //TODO: Don't send id it's udp/tcp/tls port binding upnp_context_send_remove_port_binding(lc, port_mapping); From 92c9faec6e9fce601a995b76b001a1a451adbdb0 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 8 Jan 2013 17:06:27 +0100 Subject: [PATCH 013/281] Improve uPnP --- coreapi/linphonecore.c | 36 ++--- coreapi/upnp.c | 289 +++++++++++++++++++++++++++-------------- coreapi/upnp.h | 11 +- 3 files changed, 222 insertions(+), 114 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index b277d8ae4..17b1c84b9 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2714,20 +2714,20 @@ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const Linpho 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; + 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 err = linphone_core_start_update_call(lc, call); }else{ @@ -3000,6 +3000,11 @@ int linphone_core_abort_call(LinphoneCore *lc, LinphoneCall *call, const char *e lc->ringstream=NULL; } linphone_call_stop_media_streams(call); + +#ifdef BUILD_UPNP + linphone_call_delete_upnp_session(call); +#endif //BUILD_UPNP + if (lc->vtable.display_status!=NULL) lc->vtable.display_status(lc,_("Call aborted") ); linphone_call_set_state(call,LinphoneCallError,error); @@ -4958,6 +4963,11 @@ static void linphone_core_uninit(LinphoneCore *lc) usleep(50000); #endif } + +#ifdef BUILD_UPNP + upnp_context_uninit(lc); +#endif //BUILD_UPNP + if (lc->friends) ms_list_for_each(lc->friends,(void (*)(void *))linphone_friend_close_subscriptions); linphone_core_set_state(lc,LinphoneGlobalShutdown,"Shutting down"); @@ -4983,10 +4993,6 @@ static void linphone_core_uninit(LinphoneCore *lc) lc->config = NULL; /* Mark the config as NULL to block further calls */ sip_setup_unregister_all(); -#ifdef BUILD_UPNP - upnp_context_uninit(lc); -#endif //BUILD_UPNP - ms_list_for_each(lc->call_logs,(void (*)(void*))linphone_call_log_destroy); lc->call_logs=ms_list_free(lc->call_logs); diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 336e0b78f..3a68cbcbe 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -20,7 +20,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "upnp.h" #include "private.h" -#define UPNP_MAX_RETRY 4 +#define UPNP_ADD_MAX_RETRY 4 +#define UPNP_REMOVE_MAX_RETRY 4 #define UPNP_SECTION_NAME "uPnP" /* Define private types */ @@ -57,8 +58,8 @@ void upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *po void upnp_port_binding_release(UpnpPortBinding *port); MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc); -int upnp_config_add_port_binding(LinphoneCore *lc, const UpnpPortBinding *port); -int upnp_config_remove_port_binding(LinphoneCore *lc, const UpnpPortBinding *port); +void upnp_config_add_port_binding(LinphoneCore *lc, const UpnpPortBinding *port); +void upnp_config_remove_port_binding(LinphoneCore *lc, const UpnpPortBinding *port); int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *port); int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port); @@ -113,6 +114,9 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { lupnp->state = LinphoneUpnpStateNotAvailable; } else { ms_message("uPnP IGD: Connected"); + if(lupnp->state != LinphoneUpnpStateOk) { + lupnp->clean = TRUE; // Remove saved port mapping configurations + } lupnp->state = LinphoneUpnpStateOk; } @@ -126,17 +130,18 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { upnp_port_binding_log(ORTP_MESSAGE, "Added port binding", port_mapping); upnp_config_add_port_binding(lc, port_mapping); + lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); upnp_port_binding_release(port_mapping); break; case UPNP_IGD_PORT_MAPPING_ADD_FAILURE: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; - port_mapping->external_port = -1; //Force a new random port if(upnp_context_send_add_port_binding(lc, port_mapping) != 0) { upnp_port_binding_log(ORTP_ERROR, "Can't add port binding", port_mapping); } + lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); upnp_port_binding_release(port_mapping); break; @@ -147,6 +152,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { upnp_port_binding_log(ORTP_MESSAGE, "Removed port binding", port_mapping); upnp_config_remove_port_binding(lc, port_mapping); + lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); upnp_port_binding_release(port_mapping); break; @@ -158,6 +164,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { upnp_config_remove_port_binding(lc, port_mapping); } + lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); upnp_port_binding_release(port_mapping); break; @@ -165,6 +172,13 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { break; } + if(lupnp->pending_bindings == NULL) { + if(lupnp->cleaning == TRUE) { + lupnp->emit = TRUE; // Emit port bindings + lupnp->cleaning = FALSE; + } + pthread_cond_signal(&lupnp->cond); + } ms_mutex_unlock(&lupnp->mutex); } @@ -179,9 +193,15 @@ int upnp_context_init(LinphoneCore *lc) { const char *ip_address; ms_mutex_init(&lupnp->mutex, NULL); - lupnp->pending_configs = NULL; + ms_cond_init(&lupnp->cond, NULL); + + lupnp->pending_bindings = NULL; + lupnp->adding_configs = NULL; + lupnp->removing_configs = NULL; + lupnp->clean = FALSE; + lupnp->cleaning = FALSE; + lupnp->emit = FALSE; lupnp->state = LinphoneUpnpStateIdle; - lupnp->old_state = LinphoneUpnpStateIdle; ms_message("uPnP IGD: Init"); linphone_core_get_sip_transports(lc, &transport); @@ -238,22 +258,62 @@ int upnp_context_init(LinphoneCore *lc) { void upnp_context_uninit(LinphoneCore *lc) { UpnpContext *lupnp = &lc->upnp; - // Not need, all hooks are removed before - //linphone_core_remove_iterate_hook(lc, linphone_core_upnp_hook, lc); + /* + * Not need, all hooks are removed before + * linphone_core_remove_iterate_hook(lc, linphone_core_upnp_hook, lc); + */ + /* Send port binding removes */ if(lupnp->sip_udp != NULL) { - upnp_port_binding_release(lupnp->sip_udp); + upnp_context_send_remove_port_binding(lc, lupnp->sip_udp); + lupnp->sip_udp = NULL; } if(lupnp->sip_tcp != NULL) { - upnp_port_binding_release(lupnp->sip_tcp); + upnp_context_send_remove_port_binding(lc, lupnp->sip_tcp); + lupnp->sip_tcp = NULL; } if(lupnp->sip_tls != NULL) { - upnp_port_binding_release(lupnp->sip_tls); + upnp_context_send_remove_port_binding(lc, lupnp->sip_tls); + lupnp->sip_tcp = NULL; } + + /* Wait all pending bindings are done */ + ms_message("uPnP IGD: Wait all pending port bindings ..."); + ms_mutex_lock(&lupnp->mutex); + ms_cond_wait(&lupnp->cond, &lupnp->mutex); + ms_mutex_unlock(&lupnp->mutex); + if(lupnp->upnp_igd_ctxt != NULL) { upnp_igd_destroy(lupnp->upnp_igd_ctxt); } + + /* Run one time the hook for configuration update */ + linphone_core_upnp_hook(lc); + + /* Release port bindings */ + if(lupnp->sip_udp != NULL) { + upnp_port_binding_release(lupnp->sip_udp); + lupnp->sip_udp = NULL; + } + if(lupnp->sip_tcp != NULL) { + upnp_port_binding_release(lupnp->sip_tcp); + lupnp->sip_tcp = NULL; + } + if(lupnp->sip_tls != NULL) { + upnp_port_binding_release(lupnp->sip_tls); + lupnp->sip_tcp = NULL; + } + + /* Release lists */ + ms_list_for_each(lupnp->adding_configs,(void (*)(void*))upnp_port_binding_release); + lupnp->adding_configs = ms_list_free(lupnp->adding_configs); + ms_list_for_each(lupnp->removing_configs,(void (*)(void*))upnp_port_binding_release); + lupnp->removing_configs = ms_list_free(lupnp->removing_configs); + ms_list_for_each(lupnp->pending_bindings,(void (*)(void*))upnp_port_binding_release); + lupnp->pending_bindings = ms_list_free(lupnp->pending_bindings); + ms_mutex_destroy(&lupnp->mutex); + ms_cond_destroy(&lupnp->cond); ms_message("uPnP IGD: Uninit"); } @@ -270,10 +330,12 @@ int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port) return -2; } - if(port->retry >= UPNP_MAX_RETRY) { + if(port->retry >= UPNP_ADD_MAX_RETRY) { ret = -1; } else { mapping.cookie = upnp_port_binding_retain(port); + lupnp->pending_bindings = ms_list_append(lupnp->pending_bindings, mapping.cookie); + mapping.local_port = port->local_port; mapping.local_host = port->local_addr; if(port->external_port == -1) @@ -305,10 +367,12 @@ int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *por return -2; } - if(port->retry >= UPNP_MAX_RETRY) { + if(port->retry >= UPNP_REMOVE_MAX_RETRY) { ret = -1; } else { mapping.cookie = upnp_port_binding_retain(port); + lupnp->pending_bindings = ms_list_append(lupnp->pending_bindings, mapping.cookie); + mapping.remote_port = port->external_port; mapping.remote_host = ""; mapping.protocol = port->protocol; @@ -344,11 +408,15 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool strncpy(call->upnp_session->audio->rtp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); strncpy(call->upnp_session->audio->rtp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); call->upnp_session->audio->rtp->local_port = call->audio_port; - call->upnp_session->audio->rtp->external_port = call->audio_port; + if(call->upnp_session->audio->rtp->external_port == -1) { + call->upnp_session->audio->rtp->external_port = call->audio_port; + } strncpy(call->upnp_session->audio->rtcp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); strncpy(call->upnp_session->audio->rtcp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); call->upnp_session->audio->rtcp->local_port = call->audio_port+1; - call->upnp_session->audio->rtcp->external_port = call->audio_port+1; + if(call->upnp_session->audio->rtcp->external_port == -1) { + call->upnp_session->audio->rtcp->external_port = call->audio_port+1; + } if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateIdle && audio) { // Add audio port binding upnp_context_send_add_port_binding(lc, call->upnp_session->audio->rtp); @@ -370,11 +438,15 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool strncpy(call->upnp_session->video->rtp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); strncpy(call->upnp_session->video->rtp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); call->upnp_session->video->rtp->local_port = call->video_port; - call->upnp_session->video->rtp->external_port = call->video_port; + if(call->upnp_session->video->rtp->external_port == -1) { + call->upnp_session->video->rtp->external_port = call->video_port; + } strncpy(call->upnp_session->video->rtcp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); strncpy(call->upnp_session->video->rtcp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); call->upnp_session->video->rtcp->local_port = call->video_port+1; - call->upnp_session->video->rtcp->external_port = call->video_port+1; + if(call->upnp_session->video->rtcp->external_port == -1) { + call->upnp_session->video->rtcp->external_port = call->video_port+1; + } if(call->upnp_session->video->rtp->state == LinphoneUpnpStateIdle && video) { // Add video port binding upnp_context_send_add_port_binding(lc, call->upnp_session->video->rtp); @@ -392,6 +464,12 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool } ms_mutex_unlock(&lupnp->mutex); + + /* + * Update uPnP call state + */ + upnp_call_process(call); + return ret; } @@ -516,64 +594,85 @@ int upnp_call_process(LinphoneCall *call) { bool_t linphone_core_upnp_hook(void *data) { char key[64]; - MSList *port_bindings = NULL; - MSList *port_bindings_item; + MSList *list = NULL; + MSList *item; UpnpPortBinding *port_mapping; LinphoneCore *lc = (LinphoneCore *)data; + LinphoneCall *call; UpnpContext *lupnp = &lc->upnp; ms_mutex_lock(&lupnp->mutex); - if(lupnp->state == LinphoneUpnpStateOk && lupnp->old_state != LinphoneUpnpStateOk) { + if(lupnp->clean && !lupnp->cleaning) { + lupnp->clean = FALSE; // Remove old mapping - port_bindings = upnp_config_list_port_bindings(lc->config); - if(port_bindings != NULL) { - for(port_bindings_item = port_bindings;port_bindings_item != NULL; port_bindings_item = port_bindings_item->next) { - port_mapping = (UpnpPortBinding *)port_bindings_item->data; - //TODO: Don't send id it's udp/tcp/tls port binding + list = upnp_config_list_port_bindings(lc->config); + if(list == NULL) { + lupnp->emit = TRUE; + } else { + lupnp->cleaning = TRUE; + for(item = list;item != NULL; item = item->next) { + port_mapping = (UpnpPortBinding *)item->data; upnp_context_send_remove_port_binding(lc, port_mapping); } - ms_list_for_each(port_bindings,(void (*)(void*))upnp_port_binding_release); - port_bindings = ms_list_free(port_bindings); + ms_list_for_each(list,(void (*)(void*))upnp_port_binding_release); + list = ms_list_free(list); } } - if(lupnp->state == LinphoneUpnpStateOk && lupnp->old_state != LinphoneUpnpStateOk) { - // Add port bindings + if(lupnp->emit) { + lupnp->emit = FALSE; + + /* Force port bindings */ if(lupnp->sip_udp != NULL) { + lupnp->sip_udp->state = LinphoneUpnpStateIdle; upnp_context_send_add_port_binding(lc, lupnp->sip_udp); } if(lupnp->sip_tcp != NULL) { + lupnp->sip_udp->state = LinphoneUpnpStateIdle; upnp_context_send_add_port_binding(lc, lupnp->sip_tcp); } if(lupnp->sip_tls != NULL) { + lupnp->sip_udp->state = LinphoneUpnpStateIdle; upnp_context_send_add_port_binding(lc, lupnp->sip_tls); } - } - - /* Update configs */ - for(port_bindings_item = lupnp->pending_configs;port_bindings_item!=NULL;port_bindings_item=port_bindings_item->next) { - port_mapping = (UpnpPortBinding *)port_bindings_item->data; - if(port_mapping->state == LinphoneUpnpStateAdding) { - snprintf(key, sizeof(key), "%s-%d-%d", - (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", - port_mapping->external_port, - port_mapping->local_port); - lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, "uPnP"); - upnp_port_binding_log(ORTP_DEBUG, "Configuration: Added port binding", port_mapping); - } - if(port_mapping->state == LinphoneUpnpStateRemoving) { - snprintf(key, sizeof(key), "%s-%d-%d", - (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", - port_mapping->external_port, - port_mapping->local_port); - lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, NULL); - upnp_port_binding_log(ORTP_DEBUG, "Configuration: Removed port binding", port_mapping); + list = lc->calls; + while(list != NULL) { + call = (LinphoneCall *)list->data; + call->upnp_session->audio->rtp->state = LinphoneUpnpStateIdle; + call->upnp_session->audio->rtcp->state = LinphoneUpnpStateIdle; + call->upnp_session->video->rtp->state = LinphoneUpnpStateIdle; + call->upnp_session->video->rtcp->state = LinphoneUpnpStateIdle; + linphone_core_update_upnp_audio_video(call, call->audiostream!=NULL, call->videostream!=NULL); + list = list->next; } } - ms_list_for_each(lupnp->pending_configs,(void (*)(void*))upnp_port_binding_release); - lupnp->pending_configs = ms_list_free(lupnp->pending_configs); - lupnp->old_state = lupnp->state; + /* Add configs */ + for(item = lupnp->adding_configs;item!=NULL;item=item->next) { + port_mapping = (UpnpPortBinding *)item->data; + snprintf(key, sizeof(key), "%s-%d-%d", + (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port_mapping->external_port, + port_mapping->local_port); + lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, "uPnP"); + upnp_port_binding_log(ORTP_DEBUG, "Configuration: Added port binding", port_mapping); + } + ms_list_for_each(lupnp->adding_configs,(void (*)(void*))upnp_port_binding_release); + lupnp->adding_configs = ms_list_free(lupnp->adding_configs); + + /* Remove configs */ + for(item = lupnp->removing_configs;item!=NULL;item=item->next) { + port_mapping = (UpnpPortBinding *)item->data; + snprintf(key, sizeof(key), "%s-%d-%d", + (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port_mapping->external_port, + port_mapping->local_port); + lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, NULL); + upnp_port_binding_log(ORTP_DEBUG, "Configuration: Removed port binding", port_mapping); + } + ms_list_for_each(lupnp->removing_configs,(void (*)(void*))upnp_port_binding_release); + lupnp->removing_configs = ms_list_free(lupnp->removing_configs); + ms_mutex_unlock(&lupnp->mutex); return TRUE; } @@ -687,7 +786,9 @@ UpnpStream* upnp_stream_new() { void upnp_stream_destroy(UpnpStream* stream) { upnp_port_binding_release(stream->rtp); + stream->rtp = NULL; upnp_port_binding_release(stream->rtcp); + stream->rtcp = NULL; ms_free(stream); } @@ -779,66 +880,60 @@ MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc) { return retList; } -int upnp_config_add_port_binding(LinphoneCore *lc, const UpnpPortBinding *port) { +void upnp_config_add_port_binding(LinphoneCore *lc, const UpnpPortBinding *port) { UpnpContext *lupnp = &lc->upnp; - MSList *list = lupnp->pending_configs; + MSList *list; UpnpPortBinding *list_port; - bool_t remove = FALSE; - bool_t add = TRUE; + + list = lupnp->removing_configs; while(list != NULL) { list_port = (UpnpPortBinding *)list->data; if(upnp_port_binding_equal(list_port, port) == TRUE) { - if(list_port->state == LinphoneUpnpStateAdding) { - add = FALSE; - break; - } - if(list_port->state == LinphoneUpnpStateRemoving) { - remove = TRUE; - break; - } + lupnp->removing_configs = ms_list_remove(lupnp->removing_configs, list_port); + upnp_port_binding_release(list_port); + return; } list = ms_list_next(list); } - if(remove) { - lupnp->pending_configs = ms_list_remove(list, list_port); - } else if(add) { - list_port = upnp_port_binding_copy(port); - list_port->state = LinphoneUpnpStateAdding; - lupnp->pending_configs = ms_list_append(list, list_port); - } - - return 0; -} - -int upnp_config_remove_port_binding(LinphoneCore *lc, const UpnpPortBinding *port) { - UpnpContext *lupnp = &lc->upnp; - MSList *list = lupnp->pending_configs; - UpnpPortBinding *list_port; - bool_t remove = FALSE; - bool_t add = TRUE; + list = lupnp->adding_configs; while(list != NULL) { list_port = (UpnpPortBinding *)list->data; - if(upnp_port_binding_equal(list_port, port)) { - if(list_port->state == LinphoneUpnpStateRemoving) { - add = FALSE; - break; - } - if(list_port->state == LinphoneUpnpStateAdding) { - remove = TRUE; - break; - } + if(upnp_port_binding_equal(list_port, port) == TRUE) { + return; } list = ms_list_next(list); } - if(remove) { - lupnp->pending_configs = ms_list_remove(list, list_port); - } else if(add) { - list_port = upnp_port_binding_copy(port); - list_port->state = LinphoneUpnpStateRemoving; - lupnp->pending_configs = ms_list_append(list, list_port); + list_port = upnp_port_binding_copy(port); + lupnp->adding_configs = ms_list_append(lupnp->adding_configs, list_port); +} + +void upnp_config_remove_port_binding(LinphoneCore *lc, const UpnpPortBinding *port) { + UpnpContext *lupnp = &lc->upnp; + MSList *list; + UpnpPortBinding *list_port; + + list = lupnp->adding_configs; + while(list != NULL) { + list_port = (UpnpPortBinding *)list->data; + if(upnp_port_binding_equal(list_port, port) == TRUE) { + lupnp->adding_configs = ms_list_remove(lupnp->adding_configs, list_port); + upnp_port_binding_release(list_port); + return; + } + list = ms_list_next(list); } - return 0; + list = lupnp->removing_configs; + while(list != NULL) { + list_port = (UpnpPortBinding *)list->data; + if(upnp_port_binding_equal(list_port, port) == TRUE) { + return; + } + list = ms_list_next(list); + } + + list_port = upnp_port_binding_copy(port); + lupnp->removing_configs = ms_list_append(lupnp->removing_configs, list_port); } diff --git a/coreapi/upnp.h b/coreapi/upnp.h index b515d0410..04281c737 100644 --- a/coreapi/upnp.h +++ b/coreapi/upnp.h @@ -65,10 +65,17 @@ typedef struct _UpnpContext { UpnpPortBinding *sip_tls; UpnpPortBinding *sip_udp; UpnpState state; - UpnpState old_state; - MSList *pending_configs; + MSList *removing_configs; + MSList *adding_configs; + MSList *pending_bindings; + + bool_t clean; // True if at the next loop clean the port bindings + bool_t cleaning; // True if the cleaning processing; + bool_t emit; // True if at the next loop emit the port bindings ms_mutex_t mutex; + ms_cond_t cond; + } UpnpContext; void linphone_core_update_local_media_description_from_upnp(SalMediaDescription *desc, UpnpSession *session); From 215b566b2c4eedd2401a329696bba44a4fda2938 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 8 Jan 2013 17:15:46 +0100 Subject: [PATCH 014/281] Add debug log on port mapping add/remove send --- coreapi/upnp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 3a68cbcbe..30e313459 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -347,6 +347,7 @@ int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port) mapping.protocol = port->protocol; port->retry++; + upnp_port_binding_log(ORTP_DEBUG, "Adding port binding...", port); ret = upnp_igd_add_port_mapping(lupnp->upnp_igd_ctxt, &mapping); } if(ret != 0) { @@ -377,6 +378,7 @@ int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *por mapping.remote_host = ""; mapping.protocol = port->protocol; port->retry++; + upnp_port_binding_log(ORTP_DEBUG, "Removing port binding...", port); ret = upnp_igd_delete_port_mapping(lupnp->upnp_igd_ctxt, &mapping); } if(ret != 0) { From cc592dec5dd244d421fac15db0926eca2a9b8612 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 8 Jan 2013 17:28:01 +0100 Subject: [PATCH 015/281] Add better uPnP description --- coreapi/upnp.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 30e313459..bb7dcd8df 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -321,6 +321,7 @@ void upnp_context_uninit(LinphoneCore *lc) { int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port) { UpnpContext *lupnp = &lc->upnp; upnp_igd_port_mapping mapping; + char description[128]; int ret; if(port->state == LinphoneUpnpStateIdle) { port->retry = 0; @@ -339,11 +340,15 @@ int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port) mapping.local_port = port->local_port; mapping.local_host = port->local_addr; if(port->external_port == -1) - mapping.remote_port = rand()%(0xffff - 1024) + 1024; // TODO: use better method + mapping.remote_port = rand()%(0xffff - 1024) + 1024; else mapping.remote_port = port->external_port; mapping.remote_host = ""; - mapping.description = PACKAGE_NAME; + snprintf(description, 128, "%s %s at %s:%d", + PACKAGE_NAME, + (port->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP": "UDP", + port->local_addr, port->local_port); + mapping.description = description; mapping.protocol = port->protocol; port->retry++; From ce87dab6378ec0e03fa44d6e8e4a9d1aa5bf83b6 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 8 Jan 2013 17:29:58 +0100 Subject: [PATCH 016/281] Add message on port mapping update/clean --- coreapi/upnp.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index bb7dcd8df..8827880db 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -610,6 +610,7 @@ bool_t linphone_core_upnp_hook(void *data) { ms_mutex_lock(&lupnp->mutex); if(lupnp->clean && !lupnp->cleaning) { + ms_message("uPnP IGD: Clean port mappings"); lupnp->clean = FALSE; // Remove old mapping list = upnp_config_list_port_bindings(lc->config); @@ -627,6 +628,7 @@ bool_t linphone_core_upnp_hook(void *data) { } if(lupnp->emit) { + ms_message("uPnP IGD: Update port mappings"); lupnp->emit = FALSE; /* Force port bindings */ From 33bab1941e1c37a9a3c42ea711fe19bd4bda5492 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 9 Jan 2013 10:28:18 +0100 Subject: [PATCH 017/281] Improve uPnP api --- coreapi/linphonecall.c | 2 +- coreapi/linphonecore.c | 13 +-- coreapi/private.h | 2 +- coreapi/upnp.c | 216 +++++++++++++++++++++++++++-------------- coreapi/upnp.h | 61 +++--------- 5 files changed, 163 insertions(+), 131 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index d8de9659c..4899fab57 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1698,7 +1698,7 @@ void linphone_call_delete_ice_session(LinphoneCall *call){ #ifdef BUILD_UPNP void linphone_call_delete_upnp_session(LinphoneCall *call){ if(call->upnp_session!=NULL) { - upnp_session_destroy(call); + upnp_session_destroy(call->upnp_session); call->upnp_session=NULL; } } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 17b1c84b9..12a104e76 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1218,7 +1218,7 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta if (lc->tunnel) linphone_tunnel_configure(lc->tunnel); #endif #ifdef BUILD_UPNP - upnp_context_init(lc); + lc->upnp = upnp_context_new(lc); #endif //BUILD_UPNP if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Ready")); @@ -1314,9 +1314,9 @@ void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result return; } #ifdef BUILD_UPNP - else if (linphone_core_get_firewall_policy(lc)==LinphonePolicyUseUpnp - && lc->upnp.state == LinphoneUpnpStateOk) { - ip = upnp_igd_get_external_ipaddress(lc->upnp.upnp_igd_ctxt); + else if (lc->upnp != NULL && linphone_core_get_firewall_policy(lc)==LinphonePolicyUseUpnp && + upnp_context_get_state(lc->upnp) == LinphoneUpnpStateOk) { + ip = upnp_context_get_external_ipaddress(lc->upnp); strncpy(result,ip,LINPHONE_IPADDR_SIZE); return; } @@ -2279,7 +2279,7 @@ int linphone_core_proceed_with_invite_if_ready(LinphoneCore *lc, LinphoneCall *c } #ifdef BUILD_UPNP if (call->upnp_session != NULL) { - if (call->upnp_session->state == LinphoneUpnpStateOk) upnp_ready = TRUE; + if (upnp_session_get_state(call->upnp_session) == LinphoneUpnpStateOk) upnp_ready = TRUE; } else { upnp_ready = TRUE; } @@ -4965,7 +4965,8 @@ static void linphone_core_uninit(LinphoneCore *lc) } #ifdef BUILD_UPNP - upnp_context_uninit(lc); + upnp_context_destroy(lc->upnp); + lc->upnp = NULL; #endif //BUILD_UPNP if (lc->friends) diff --git a/coreapi/private.h b/coreapi/private.h index b2b724d83..c9d771450 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -578,7 +578,7 @@ struct _LinphoneCore char* device_id; MSList *last_recv_msg_ids; #ifdef BUILD_UPNP - UpnpContext upnp; + UpnpContext *upnp; #endif //BUILD_UPNP }; diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 8827880db..70a03a7ae 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -48,6 +48,57 @@ LpSection *lp_config_find_section(LpConfig *lpconfig, const char *name); void lp_section_remove_item(LpSection *sec, LpItem *item); void lp_config_set_string(LpConfig *lpconfig,const char *section, const char *key, const char *value); + +/* + * uPnP Definitions + */ + +typedef struct _UpnpPortBinding { + ms_mutex_t mutex; + UpnpState state; + upnp_igd_ip_protocol protocol; + char local_addr[LINPHONE_IPADDR_SIZE]; + int local_port; + char external_addr[LINPHONE_IPADDR_SIZE]; + int external_port; + int retry; + int ref; +} UpnpPortBinding; + +typedef struct _UpnpStream { + UpnpPortBinding *rtp; + UpnpPortBinding *rtcp; + UpnpState state; +} UpnpStream; + +struct _UpnpSession { + LinphoneCall *call; + UpnpStream *audio; + UpnpStream *video; + UpnpState state; +}; + +struct _UpnpContext { + LinphoneCore *lc; + upnp_igd_context *upnp_igd_ctxt; + UpnpPortBinding *sip_tcp; + UpnpPortBinding *sip_tls; + UpnpPortBinding *sip_udp; + UpnpState state; + MSList *removing_configs; + MSList *adding_configs; + MSList *pending_bindings; + + bool_t clean; // True if at the next loop clean the port bindings + bool_t cleaning; // True if the cleaning processing; + bool_t emit; // True if at the next loop emit the port bindings + + ms_mutex_t mutex; + ms_cond_t cond; + +}; + + bool_t linphone_core_upnp_hook(void *data); UpnpPortBinding *upnp_port_binding_new(); @@ -58,11 +109,11 @@ void upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *po void upnp_port_binding_release(UpnpPortBinding *port); MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc); -void upnp_config_add_port_binding(LinphoneCore *lc, const UpnpPortBinding *port); -void upnp_config_remove_port_binding(LinphoneCore *lc, const UpnpPortBinding *port); +void upnp_config_add_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port); +void upnp_config_remove_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port); -int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *port); -int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port); +int upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port); +int upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port); /** @@ -89,8 +140,7 @@ void linphone_upnp_igd_print(void *cookie, upnp_igd_print_level level, const cha } void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { - LinphoneCore *lc = (LinphoneCore *)cookie; - UpnpContext *lupnp = &lc->upnp; + UpnpContext *lupnp = (UpnpContext *)cookie; upnp_igd_port_mapping *mapping = NULL; UpnpPortBinding *port_mapping = NULL; const char *ip_address = NULL; @@ -128,7 +178,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { port_mapping->external_port = mapping->remote_port; port_mapping->state = LinphoneUpnpStateOk; upnp_port_binding_log(ORTP_MESSAGE, "Added port binding", port_mapping); - upnp_config_add_port_binding(lc, port_mapping); + upnp_config_add_port_binding(lupnp, port_mapping); lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); upnp_port_binding_release(port_mapping); @@ -137,7 +187,8 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { case UPNP_IGD_PORT_MAPPING_ADD_FAILURE: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; - if(upnp_context_send_add_port_binding(lc, port_mapping) != 0) { + port_mapping->external_port = -1; //Force random external port + if(upnp_context_send_add_port_binding(lupnp, port_mapping) != 0) { upnp_port_binding_log(ORTP_ERROR, "Can't add port binding", port_mapping); } @@ -150,7 +201,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { port_mapping = (UpnpPortBinding*) mapping->cookie; port_mapping->state = LinphoneUpnpStateIdle; upnp_port_binding_log(ORTP_MESSAGE, "Removed port binding", port_mapping); - upnp_config_remove_port_binding(lc, port_mapping); + upnp_config_remove_port_binding(lupnp, port_mapping); lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); upnp_port_binding_release(port_mapping); @@ -159,9 +210,9 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { case UPNP_IGD_PORT_MAPPING_REMOVE_FAILURE: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; - if(upnp_context_send_remove_port_binding(lc, port_mapping) != 0) { + if(upnp_context_send_remove_port_binding(lupnp, port_mapping) != 0) { upnp_port_binding_log(ORTP_ERROR, "Can't remove port binding", port_mapping); - upnp_config_remove_port_binding(lc, port_mapping); + upnp_config_remove_port_binding(lupnp, port_mapping); } lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); @@ -187,14 +238,15 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { * uPnP Context */ -int upnp_context_init(LinphoneCore *lc) { +UpnpContext* upnp_context_new(LinphoneCore *lc) { LCSipTransports transport; - UpnpContext *lupnp = &lc->upnp; + UpnpContext *lupnp = (UpnpContext *)ms_new0(UpnpContext,1); const char *ip_address; ms_mutex_init(&lupnp->mutex, NULL); ms_cond_init(&lupnp->cond, NULL); + lupnp->lc = lc; lupnp->pending_bindings = NULL; lupnp->adding_configs = NULL; lupnp->removing_configs = NULL; @@ -202,7 +254,7 @@ int upnp_context_init(LinphoneCore *lc) { lupnp->cleaning = FALSE; lupnp->emit = FALSE; lupnp->state = LinphoneUpnpStateIdle; - ms_message("uPnP IGD: Init"); + ms_message("uPnP IGD: New %p for core %p", lupnp, lc); linphone_core_get_sip_transports(lc, &transport); if(transport.udp_port != 0) { @@ -230,14 +282,14 @@ int upnp_context_init(LinphoneCore *lc) { lupnp->sip_tls = NULL; } - linphone_core_add_iterate_hook(lc, linphone_core_upnp_hook, lc); + linphone_core_add_iterate_hook(lc, linphone_core_upnp_hook, lupnp); lupnp->upnp_igd_ctxt = NULL; - lupnp->upnp_igd_ctxt = upnp_igd_create(linphone_upnp_igd_callback, linphone_upnp_igd_print, lc); + lupnp->upnp_igd_ctxt = upnp_igd_create(linphone_upnp_igd_callback, linphone_upnp_igd_print, lupnp); if(lupnp->upnp_igd_ctxt == NULL) { lupnp->state = LinphoneUpnpStateKo; ms_error("Can't create uPnP IGD context"); - return -1; + return NULL; } ip_address = upnp_igd_get_local_ipaddress(lupnp->upnp_igd_ctxt); @@ -252,12 +304,10 @@ int upnp_context_init(LinphoneCore *lc) { } lupnp->state = LinphoneUpnpStatePending; - return 0; + return lupnp; } -void upnp_context_uninit(LinphoneCore *lc) { - UpnpContext *lupnp = &lc->upnp; - +void upnp_context_destroy(UpnpContext *lupnp) { /* * Not need, all hooks are removed before * linphone_core_remove_iterate_hook(lc, linphone_core_upnp_hook, lc); @@ -265,15 +315,15 @@ void upnp_context_uninit(LinphoneCore *lc) { /* Send port binding removes */ if(lupnp->sip_udp != NULL) { - upnp_context_send_remove_port_binding(lc, lupnp->sip_udp); + upnp_context_send_remove_port_binding(lupnp, lupnp->sip_udp); lupnp->sip_udp = NULL; } if(lupnp->sip_tcp != NULL) { - upnp_context_send_remove_port_binding(lc, lupnp->sip_tcp); + upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tcp); lupnp->sip_tcp = NULL; } if(lupnp->sip_tls != NULL) { - upnp_context_send_remove_port_binding(lc, lupnp->sip_tls); + upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tls); lupnp->sip_tcp = NULL; } @@ -288,7 +338,7 @@ void upnp_context_uninit(LinphoneCore *lc) { } /* Run one time the hook for configuration update */ - linphone_core_upnp_hook(lc); + linphone_core_upnp_hook(lupnp); /* Release port bindings */ if(lupnp->sip_udp != NULL) { @@ -315,11 +365,19 @@ void upnp_context_uninit(LinphoneCore *lc) { ms_mutex_destroy(&lupnp->mutex); ms_cond_destroy(&lupnp->cond); - ms_message("uPnP IGD: Uninit"); + ms_message("uPnP IGD: destroy %p", lupnp); + ms_free(lupnp); } -int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port) { - UpnpContext *lupnp = &lc->upnp; +UpnpState upnp_context_get_state(UpnpContext *ctx) { + return ctx->state; +} + +const char* upnp_context_get_external_ipaddress(UpnpContext *ctx) { + return upnp_igd_get_external_ipaddress(ctx->upnp_igd_ctxt); +} + +int upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port) { upnp_igd_port_mapping mapping; char description[128]; int ret; @@ -361,8 +419,7 @@ int upnp_context_send_add_port_binding(LinphoneCore *lc, UpnpPortBinding *port) return ret; } -int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *port) { - UpnpContext *lupnp = &lc->upnp; +int upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port) { upnp_igd_port_mapping mapping; int ret; if(port->state == LinphoneUpnpStateOk) { @@ -398,10 +455,14 @@ int upnp_context_send_remove_port_binding(LinphoneCore *lc, UpnpPortBinding *por int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool_t video) { LinphoneCore *lc = call->core; - UpnpContext *lupnp = &lc->upnp; + UpnpContext *lupnp = lc->upnp; int ret = -1; const char *local_addr, *external_addr; + if(lupnp == NULL) { + return ret; + } + ms_mutex_lock(&lupnp->mutex); // Don't handle when the call if(lupnp->state == LinphoneUpnpStateOk && call->upnp_session != NULL) { @@ -426,17 +487,17 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool } if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateIdle && audio) { // Add audio port binding - upnp_context_send_add_port_binding(lc, call->upnp_session->audio->rtp); + upnp_context_send_add_port_binding(lupnp, call->upnp_session->audio->rtp); } else if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateOk && !audio) { // Remove audio port binding - upnp_context_send_remove_port_binding(lc, call->upnp_session->audio->rtp); + upnp_context_send_remove_port_binding(lupnp, call->upnp_session->audio->rtp); } if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateIdle && audio) { // Add audio port binding - upnp_context_send_add_port_binding(lc, call->upnp_session->audio->rtcp); + upnp_context_send_add_port_binding(lupnp, call->upnp_session->audio->rtcp); } else if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateOk && !audio) { // Remove audio port binding - upnp_context_send_remove_port_binding(lc, call->upnp_session->audio->rtcp); + upnp_context_send_remove_port_binding(lupnp, call->upnp_session->audio->rtcp); } /* @@ -456,17 +517,17 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool } if(call->upnp_session->video->rtp->state == LinphoneUpnpStateIdle && video) { // Add video port binding - upnp_context_send_add_port_binding(lc, call->upnp_session->video->rtp); + upnp_context_send_add_port_binding(lupnp, call->upnp_session->video->rtp); } else if(call->upnp_session->video->rtp->state == LinphoneUpnpStateOk && !video) { // Remove video port binding - upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtp); + upnp_context_send_remove_port_binding(lupnp, call->upnp_session->video->rtp); } if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateIdle && video) { // Add video port binding - upnp_context_send_add_port_binding(lc, call->upnp_session->video->rtcp); + upnp_context_send_add_port_binding(lupnp, call->upnp_session->video->rtcp); } else if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateOk && !video) { // Remove video port binding - upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtcp); + upnp_context_send_remove_port_binding(lupnp, call->upnp_session->video->rtcp); } } @@ -505,10 +566,14 @@ int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call) { int upnp_call_process(LinphoneCall *call) { LinphoneCore *lc = call->core; - UpnpContext *lupnp = &lc->upnp; + UpnpContext *lupnp = lc->upnp; int ret = -1; UpnpState oldState; + if(lupnp == NULL) { + return ret; + } + ms_mutex_lock(&lupnp->mutex); // Don't handle when the call @@ -604,23 +669,22 @@ bool_t linphone_core_upnp_hook(void *data) { MSList *list = NULL; MSList *item; UpnpPortBinding *port_mapping; - LinphoneCore *lc = (LinphoneCore *)data; + UpnpContext *lupnp = (UpnpContext *)data; LinphoneCall *call; - UpnpContext *lupnp = &lc->upnp; ms_mutex_lock(&lupnp->mutex); if(lupnp->clean && !lupnp->cleaning) { ms_message("uPnP IGD: Clean port mappings"); lupnp->clean = FALSE; // Remove old mapping - list = upnp_config_list_port_bindings(lc->config); + list = upnp_config_list_port_bindings(lupnp->lc->config); if(list == NULL) { lupnp->emit = TRUE; } else { lupnp->cleaning = TRUE; for(item = list;item != NULL; item = item->next) { port_mapping = (UpnpPortBinding *)item->data; - upnp_context_send_remove_port_binding(lc, port_mapping); + upnp_context_send_remove_port_binding(lupnp, port_mapping); } ms_list_for_each(list,(void (*)(void*))upnp_port_binding_release); list = ms_list_free(list); @@ -634,17 +698,17 @@ bool_t linphone_core_upnp_hook(void *data) { /* Force port bindings */ if(lupnp->sip_udp != NULL) { lupnp->sip_udp->state = LinphoneUpnpStateIdle; - upnp_context_send_add_port_binding(lc, lupnp->sip_udp); + upnp_context_send_add_port_binding(lupnp, lupnp->sip_udp); } if(lupnp->sip_tcp != NULL) { lupnp->sip_udp->state = LinphoneUpnpStateIdle; - upnp_context_send_add_port_binding(lc, lupnp->sip_tcp); + upnp_context_send_add_port_binding(lupnp, lupnp->sip_tcp); } if(lupnp->sip_tls != NULL) { lupnp->sip_udp->state = LinphoneUpnpStateIdle; - upnp_context_send_add_port_binding(lc, lupnp->sip_tls); + upnp_context_send_add_port_binding(lupnp, lupnp->sip_tls); } - list = lc->calls; + list = lupnp->lc->calls; while(list != NULL) { call = (LinphoneCall *)list->data; call->upnp_session->audio->rtp->state = LinphoneUpnpStateIdle; @@ -663,7 +727,7 @@ bool_t linphone_core_upnp_hook(void *data) { (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", port_mapping->external_port, port_mapping->local_port); - lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, "uPnP"); + lp_config_set_string(lupnp->lc->config, UPNP_SECTION_NAME, key, "uPnP"); upnp_port_binding_log(ORTP_DEBUG, "Configuration: Added port binding", port_mapping); } ms_list_for_each(lupnp->adding_configs,(void (*)(void*))upnp_port_binding_release); @@ -676,7 +740,7 @@ bool_t linphone_core_upnp_hook(void *data) { (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", port_mapping->external_port, port_mapping->local_port); - lp_config_set_string(lc->config, UPNP_SECTION_NAME, key, NULL); + lp_config_set_string(lupnp->lc->config, UPNP_SECTION_NAME, key, NULL); upnp_port_binding_log(ORTP_DEBUG, "Configuration: Removed port binding", port_mapping); } ms_list_for_each(lupnp->removing_configs,(void (*)(void*))upnp_port_binding_release); @@ -686,7 +750,7 @@ bool_t linphone_core_upnp_hook(void *data) { return TRUE; } -void linphone_core_update_local_media_description_from_upnp(SalMediaDescription *desc, UpnpSession *session) { +int linphone_core_update_local_media_description_from_upnp(SalMediaDescription *desc, UpnpSession *session) { int i; SalStreamDescription *stream; UpnpStream *upnpStream; @@ -710,6 +774,7 @@ void linphone_core_update_local_media_description_from_upnp(SalMediaDescription } } } + return 0; } @@ -806,37 +871,42 @@ void upnp_stream_destroy(UpnpStream* stream) { * uPnP Session */ -UpnpSession* upnp_session_new() { +UpnpSession* upnp_session_new(LinphoneCall* call) { UpnpSession *session = ms_new0(UpnpSession,1); + session->call = call; session->state = LinphoneUpnpStateIdle; session->audio = upnp_stream_new(); session->video = upnp_stream_new(); return session; } -void upnp_session_destroy(LinphoneCall* call) { - LinphoneCore *lc = call->core; +void upnp_session_destroy(UpnpSession *session) { + LinphoneCore *lc = session->call->core; - /* Remove bindings */ - if(call->upnp_session->audio->rtp->state != LinphoneUpnpStateKo && call->upnp_session->audio->rtp->state != LinphoneUpnpStateIdle) { - upnp_context_send_remove_port_binding(lc, call->upnp_session->audio->rtp); - } - if(call->upnp_session->audio->rtcp->state != LinphoneUpnpStateKo && call->upnp_session->audio->rtcp->state != LinphoneUpnpStateIdle) { - upnp_context_send_remove_port_binding(lc, call->upnp_session->audio->rtcp); - } - if(call->upnp_session->video->rtp->state != LinphoneUpnpStateKo && call->upnp_session->video->rtp->state != LinphoneUpnpStateIdle) { - upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtp); - } - if(call->upnp_session->video->rtcp->state != LinphoneUpnpStateKo && call->upnp_session->video->rtcp->state != LinphoneUpnpStateIdle) { - upnp_context_send_remove_port_binding(lc, call->upnp_session->video->rtcp); + if(lc->upnp != NULL) { + /* Remove bindings */ + if(session->audio->rtp->state != LinphoneUpnpStateKo && session->audio->rtp->state != LinphoneUpnpStateIdle) { + upnp_context_send_remove_port_binding(lc->upnp, session->audio->rtp); + } + if(session->audio->rtcp->state != LinphoneUpnpStateKo && session->audio->rtcp->state != LinphoneUpnpStateIdle) { + upnp_context_send_remove_port_binding(lc->upnp, session->audio->rtcp); + } + if(session->video->rtp->state != LinphoneUpnpStateKo && session->video->rtp->state != LinphoneUpnpStateIdle) { + upnp_context_send_remove_port_binding(lc->upnp, session->video->rtp); + } + if(session->video->rtcp->state != LinphoneUpnpStateKo && session->video->rtcp->state != LinphoneUpnpStateIdle) { + upnp_context_send_remove_port_binding(lc->upnp, session->video->rtcp); + } } - upnp_stream_destroy(call->upnp_session->audio); - upnp_stream_destroy(call->upnp_session->video); - ms_free(call->upnp_session); - call->upnp_session = NULL; + upnp_stream_destroy(session->audio); + upnp_stream_destroy(session->video); + ms_free(session); } +UpnpState upnp_session_get_state(UpnpSession *session) { + return session->state; +} /* * uPnP Config @@ -889,8 +959,7 @@ MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc) { return retList; } -void upnp_config_add_port_binding(LinphoneCore *lc, const UpnpPortBinding *port) { - UpnpContext *lupnp = &lc->upnp; +void upnp_config_add_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port) { MSList *list; UpnpPortBinding *list_port; @@ -918,8 +987,7 @@ void upnp_config_add_port_binding(LinphoneCore *lc, const UpnpPortBinding *port) lupnp->adding_configs = ms_list_append(lupnp->adding_configs, list_port); } -void upnp_config_remove_port_binding(LinphoneCore *lc, const UpnpPortBinding *port) { - UpnpContext *lupnp = &lc->upnp; +void upnp_config_remove_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port) { MSList *list; UpnpPortBinding *list_port; diff --git a/coreapi/upnp.h b/coreapi/upnp.h index 04281c737..64ccc88e9 100644 --- a/coreapi/upnp.h +++ b/coreapi/upnp.h @@ -34,58 +34,21 @@ typedef enum { LinphoneUpnpStateKo, } UpnpState; +typedef struct _UpnpSession UpnpSession; +typedef struct _UpnpContext UpnpContext; -typedef struct _UpnpPortBinding { - ms_mutex_t mutex; - UpnpState state; - upnp_igd_ip_protocol protocol; - char local_addr[LINPHONE_IPADDR_SIZE]; - int local_port; - char external_addr[LINPHONE_IPADDR_SIZE]; - int external_port; - int retry; - int ref; -} UpnpPortBinding; - -typedef struct _UpnpStream { - UpnpPortBinding *rtp; - UpnpPortBinding *rtcp; - UpnpState state; -} UpnpStream; - -typedef struct _UpnpSession { - UpnpStream *audio; - UpnpStream *video; - UpnpState state; -} UpnpSession; - -typedef struct _UpnpContext { - upnp_igd_context *upnp_igd_ctxt; - UpnpPortBinding *sip_tcp; - UpnpPortBinding *sip_tls; - UpnpPortBinding *sip_udp; - UpnpState state; - MSList *removing_configs; - MSList *adding_configs; - MSList *pending_bindings; - - bool_t clean; // True if at the next loop clean the port bindings - bool_t cleaning; // True if the cleaning processing; - bool_t emit; // True if at the next loop emit the port bindings - - ms_mutex_t mutex; - ms_cond_t cond; - -} UpnpContext; - -void linphone_core_update_local_media_description_from_upnp(SalMediaDescription *desc, UpnpSession *session); +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 upnp_call_process(LinphoneCall *call); -UpnpSession* upnp_session_new(); -void upnp_session_destroy(LinphoneCall* call); -int upnp_context_init(LinphoneCore *lc); -void upnp_context_uninit(LinphoneCore *lc); +int upnp_call_process(LinphoneCall *call); +UpnpSession* upnp_session_new(LinphoneCall *call); +void upnp_session_destroy(UpnpSession* session); +UpnpState upnp_session_get_state(UpnpSession *session); + +UpnpContext *upnp_context_new(LinphoneCore *lc); +void upnp_context_destroy(UpnpContext *ctx); +UpnpState upnp_context_get_state(UpnpContext *ctx); +const char *upnp_context_get_external_ipaddress(UpnpContext *ctx); #endif //LINPHONE_UPNP_H From a87c70e44ae50f19fdb48d9c8e666ecc2c9223bb Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 9 Jan 2013 11:56:55 +0100 Subject: [PATCH 018/281] Improve uPnP API and uPnP mechanism --- coreapi/linphonecall.c | 8 +- coreapi/linphonecore.c | 10 +- coreapi/upnp.c | 458 ++++++++++++++++++++++------------------- coreapi/upnp.h | 20 +- mediastreamer2 | 2 +- 5 files changed, 271 insertions(+), 227 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 4899fab57..11d3f43c7 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -456,7 +456,7 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr } #ifdef BUILD_UPNP if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseUpnp) { - call->upnp_session = upnp_session_new(call); + call->upnp_session = linphone_upnp_session_new(call); } #endif //BUILD_UPNP call->camera_active=params->has_video; @@ -523,7 +523,7 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro break; case LinphonePolicyUseUpnp: #ifdef BUILD_UPNP - call->upnp_session = upnp_session_new(call); + 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) { @@ -1698,7 +1698,7 @@ void linphone_call_delete_ice_session(LinphoneCall *call){ #ifdef BUILD_UPNP void linphone_call_delete_upnp_session(LinphoneCall *call){ if(call->upnp_session!=NULL) { - upnp_session_destroy(call->upnp_session); + linphone_upnp_session_destroy(call->upnp_session); call->upnp_session=NULL; } } @@ -2016,7 +2016,7 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse } #ifdef BUILD_UPNP - upnp_call_process(call); + linphone_upnp_call_process(call); #endif //BUILD_UPNP #ifdef VIDEO_ENABLED diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 12a104e76..f02ab1868 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1218,7 +1218,7 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta if (lc->tunnel) linphone_tunnel_configure(lc->tunnel); #endif #ifdef BUILD_UPNP - lc->upnp = upnp_context_new(lc); + lc->upnp = linphone_upnp_context_new(lc); #endif //BUILD_UPNP if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Ready")); @@ -1315,8 +1315,8 @@ void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result } #ifdef BUILD_UPNP else if (lc->upnp != NULL && linphone_core_get_firewall_policy(lc)==LinphonePolicyUseUpnp && - upnp_context_get_state(lc->upnp) == LinphoneUpnpStateOk) { - ip = upnp_context_get_external_ipaddress(lc->upnp); + linphone_upnp_context_get_state(lc->upnp) == LinphoneUpnpStateOk) { + ip = linphone_upnp_context_get_external_ipaddress(lc->upnp); strncpy(result,ip,LINPHONE_IPADDR_SIZE); return; } @@ -2279,7 +2279,7 @@ int linphone_core_proceed_with_invite_if_ready(LinphoneCore *lc, LinphoneCall *c } #ifdef BUILD_UPNP if (call->upnp_session != NULL) { - if (upnp_session_get_state(call->upnp_session) == LinphoneUpnpStateOk) upnp_ready = TRUE; + if (linphone_upnp_session_get_state(call->upnp_session) == LinphoneUpnpStateOk) upnp_ready = TRUE; } else { upnp_ready = TRUE; } @@ -4965,7 +4965,7 @@ static void linphone_core_uninit(LinphoneCore *lc) } #ifdef BUILD_UPNP - upnp_context_destroy(lc->upnp); + linphone_upnp_context_destroy(lc->upnp); lc->upnp = NULL; #endif //BUILD_UPNP diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 70a03a7ae..d2a9a2423 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -48,14 +48,13 @@ LpSection *lp_config_find_section(LpConfig *lpconfig, const char *name); void lp_section_remove_item(LpSection *sec, LpItem *item); void lp_config_set_string(LpConfig *lpconfig,const char *section, const char *key, const char *value); - /* * uPnP Definitions */ typedef struct _UpnpPortBinding { ms_mutex_t mutex; - UpnpState state; + LinphoneUpnpState state; upnp_igd_ip_protocol protocol; char local_addr[LINPHONE_IPADDR_SIZE]; int local_port; @@ -63,19 +62,21 @@ typedef struct _UpnpPortBinding { int external_port; int retry; int ref; + bool_t to_remove; + bool_t to_add; } UpnpPortBinding; typedef struct _UpnpStream { UpnpPortBinding *rtp; UpnpPortBinding *rtcp; - UpnpState state; + LinphoneUpnpState state; } UpnpStream; struct _UpnpSession { LinphoneCall *call; UpnpStream *audio; UpnpStream *video; - UpnpState state; + LinphoneUpnpState state; }; struct _UpnpContext { @@ -84,36 +85,34 @@ struct _UpnpContext { UpnpPortBinding *sip_tcp; UpnpPortBinding *sip_tls; UpnpPortBinding *sip_udp; - UpnpState state; + LinphoneUpnpState state; MSList *removing_configs; MSList *adding_configs; MSList *pending_bindings; - bool_t clean; // True if at the next loop clean the port bindings - bool_t cleaning; // True if the cleaning processing; - bool_t emit; // True if at the next loop emit the port bindings - ms_mutex_t mutex; - ms_cond_t cond; + ms_cond_t empty_cond; }; bool_t linphone_core_upnp_hook(void *data); +void linphone_core_upnp_refresh(UpnpContext *ctx); -UpnpPortBinding *upnp_port_binding_new(); -UpnpPortBinding *upnp_port_binding_copy(const UpnpPortBinding *port); -bool_t upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2); -UpnpPortBinding *upnp_port_binding_retain(UpnpPortBinding *port); -void upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *port); -void upnp_port_binding_release(UpnpPortBinding *port); +UpnpPortBinding *linphone_upnp_port_binding_new(); +UpnpPortBinding *linphone_upnp_port_binding_copy(const UpnpPortBinding *port); +bool_t linphone_upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2); +UpnpPortBinding *linphone_upnp_port_binding_equivalent_in_list(MSList *list, const UpnpPortBinding *port); +UpnpPortBinding *linphone_upnp_port_binding_retain(UpnpPortBinding *port); +void linphone_upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *port); +void linphone_upnp_port_binding_release(UpnpPortBinding *port); -MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc); -void upnp_config_add_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port); -void upnp_config_remove_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port); +MSList *linphone_upnp_config_list_port_bindings(struct _LpConfig *lpc); +void linphone_upnp_config_add_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port); +void linphone_upnp_config_remove_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port); -int upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port); -int upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port); +int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port); +int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port); /** @@ -147,6 +146,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { const char *connection_status = NULL; bool_t nat_enabled = FALSE; ms_mutex_lock(&lupnp->mutex); + LinphoneUpnpState old_state = lupnp->state; switch(event) { case UPNP_IGD_EXTERNAL_IPADDRESS_CHANGED: @@ -164,10 +164,10 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { lupnp->state = LinphoneUpnpStateNotAvailable; } else { ms_message("uPnP IGD: Connected"); - if(lupnp->state != LinphoneUpnpStateOk) { - lupnp->clean = TRUE; // Remove saved port mapping configurations - } lupnp->state = LinphoneUpnpStateOk; + if(old_state != LinphoneUpnpStateOk) { + linphone_core_upnp_refresh(lupnp); + } } break; @@ -177,58 +177,72 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { port_mapping = (UpnpPortBinding*) mapping->cookie; port_mapping->external_port = mapping->remote_port; port_mapping->state = LinphoneUpnpStateOk; - upnp_port_binding_log(ORTP_MESSAGE, "Added port binding", port_mapping); - upnp_config_add_port_binding(lupnp, port_mapping); + linphone_upnp_port_binding_log(ORTP_MESSAGE, "Added port binding", port_mapping); + linphone_upnp_config_add_port_binding(lupnp, port_mapping); - lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); - upnp_port_binding_release(port_mapping); break; case UPNP_IGD_PORT_MAPPING_ADD_FAILURE: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; port_mapping->external_port = -1; //Force random external port - if(upnp_context_send_add_port_binding(lupnp, port_mapping) != 0) { - upnp_port_binding_log(ORTP_ERROR, "Can't add port binding", port_mapping); + if(linphone_upnp_context_send_add_port_binding(lupnp, port_mapping) != 0) { + linphone_upnp_port_binding_log(ORTP_ERROR, "Can't add port binding", port_mapping); } - lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); - upnp_port_binding_release(port_mapping); break; case UPNP_IGD_PORT_MAPPING_REMOVE_SUCCESS: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; port_mapping->state = LinphoneUpnpStateIdle; - upnp_port_binding_log(ORTP_MESSAGE, "Removed port binding", port_mapping); - upnp_config_remove_port_binding(lupnp, port_mapping); + linphone_upnp_port_binding_log(ORTP_MESSAGE, "Removed port binding", port_mapping); + linphone_upnp_config_remove_port_binding(lupnp, port_mapping); - lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); - upnp_port_binding_release(port_mapping); break; case UPNP_IGD_PORT_MAPPING_REMOVE_FAILURE: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; - if(upnp_context_send_remove_port_binding(lupnp, port_mapping) != 0) { - upnp_port_binding_log(ORTP_ERROR, "Can't remove port binding", port_mapping); - upnp_config_remove_port_binding(lupnp, port_mapping); + if(linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping) != 0) { + linphone_upnp_port_binding_log(ORTP_ERROR, "Can't remove port binding", port_mapping); + linphone_upnp_config_remove_port_binding(lupnp, port_mapping); } - lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); - upnp_port_binding_release(port_mapping); break; default: break; } - if(lupnp->pending_bindings == NULL) { - if(lupnp->cleaning == TRUE) { - lupnp->emit = TRUE; // Emit port bindings - lupnp->cleaning = FALSE; + if(port_mapping != NULL) { + /* + * Execute delayed actions + */ + if(port_mapping->to_remove) { + if(port_mapping->state == LinphoneUpnpStateOk) { + port_mapping->to_remove = FALSE; + linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping); + } else if(port_mapping->state == LinphoneUpnpStateKo) { + port_mapping->to_remove = FALSE; + } } - pthread_cond_signal(&lupnp->cond); + if(port_mapping->to_add) { + if(port_mapping->state == LinphoneUpnpStateIdle || port_mapping->state == LinphoneUpnpStateKo) { + port_mapping->to_add = FALSE; + linphone_upnp_context_send_add_port_binding(lupnp, port_mapping); + } + } + + lupnp->pending_bindings = ms_list_remove(lupnp->pending_bindings, port_mapping); + linphone_upnp_port_binding_release(port_mapping); + } + + /* + * If there is no pending binding emit a signal + */ + if(lupnp->pending_bindings == NULL) { + pthread_cond_signal(&lupnp->empty_cond); } ms_mutex_unlock(&lupnp->mutex); } @@ -238,27 +252,24 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { * uPnP Context */ -UpnpContext* upnp_context_new(LinphoneCore *lc) { +UpnpContext* linphone_upnp_context_new(LinphoneCore *lc) { LCSipTransports transport; UpnpContext *lupnp = (UpnpContext *)ms_new0(UpnpContext,1); const char *ip_address; ms_mutex_init(&lupnp->mutex, NULL); - ms_cond_init(&lupnp->cond, NULL); + ms_cond_init(&lupnp->empty_cond, NULL); lupnp->lc = lc; lupnp->pending_bindings = NULL; lupnp->adding_configs = NULL; lupnp->removing_configs = NULL; - lupnp->clean = FALSE; - lupnp->cleaning = FALSE; - lupnp->emit = FALSE; lupnp->state = LinphoneUpnpStateIdle; ms_message("uPnP IGD: New %p for core %p", lupnp, lc); linphone_core_get_sip_transports(lc, &transport); if(transport.udp_port != 0) { - lupnp->sip_udp = upnp_port_binding_new(); + lupnp->sip_udp = linphone_upnp_port_binding_new(); lupnp->sip_udp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; lupnp->sip_udp->local_port = transport.udp_port; lupnp->sip_udp->external_port = transport.udp_port; @@ -266,7 +277,7 @@ UpnpContext* upnp_context_new(LinphoneCore *lc) { lupnp->sip_udp = NULL; } if(transport.tcp_port != 0) { - lupnp->sip_tcp = upnp_port_binding_new(); + lupnp->sip_tcp = linphone_upnp_port_binding_new(); lupnp->sip_tcp->protocol = UPNP_IGD_IP_PROTOCOL_TCP; lupnp->sip_tcp->local_port = transport.tcp_port; lupnp->sip_tcp->external_port = transport.tcp_port; @@ -274,7 +285,7 @@ UpnpContext* upnp_context_new(LinphoneCore *lc) { lupnp->sip_tcp = NULL; } if(transport.tls_port != 0) { - lupnp->sip_tls = upnp_port_binding_new(); + lupnp->sip_tls = linphone_upnp_port_binding_new(); lupnp->sip_tls->protocol = UPNP_IGD_IP_PROTOCOL_TCP; lupnp->sip_tls->local_port = transport.tls_port; lupnp->sip_tls->external_port = transport.tls_port; @@ -307,7 +318,7 @@ UpnpContext* upnp_context_new(LinphoneCore *lc) { return lupnp; } -void upnp_context_destroy(UpnpContext *lupnp) { +void linphone_upnp_context_destroy(UpnpContext *lupnp) { /* * Not need, all hooks are removed before * linphone_core_remove_iterate_hook(lc, linphone_core_upnp_hook, lc); @@ -315,22 +326,22 @@ void upnp_context_destroy(UpnpContext *lupnp) { /* Send port binding removes */ if(lupnp->sip_udp != NULL) { - upnp_context_send_remove_port_binding(lupnp, lupnp->sip_udp); + linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_udp); lupnp->sip_udp = NULL; } if(lupnp->sip_tcp != NULL) { - upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tcp); + linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tcp); lupnp->sip_tcp = NULL; } if(lupnp->sip_tls != NULL) { - upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tls); + linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tls); lupnp->sip_tcp = NULL; } /* Wait all pending bindings are done */ ms_message("uPnP IGD: Wait all pending port bindings ..."); ms_mutex_lock(&lupnp->mutex); - ms_cond_wait(&lupnp->cond, &lupnp->mutex); + ms_cond_wait(&lupnp->empty_cond, &lupnp->mutex); ms_mutex_unlock(&lupnp->mutex); if(lupnp->upnp_igd_ctxt != NULL) { @@ -342,57 +353,70 @@ void upnp_context_destroy(UpnpContext *lupnp) { /* Release port bindings */ if(lupnp->sip_udp != NULL) { - upnp_port_binding_release(lupnp->sip_udp); + linphone_upnp_port_binding_release(lupnp->sip_udp); lupnp->sip_udp = NULL; } if(lupnp->sip_tcp != NULL) { - upnp_port_binding_release(lupnp->sip_tcp); + linphone_upnp_port_binding_release(lupnp->sip_tcp); lupnp->sip_tcp = NULL; } if(lupnp->sip_tls != NULL) { - upnp_port_binding_release(lupnp->sip_tls); + linphone_upnp_port_binding_release(lupnp->sip_tls); lupnp->sip_tcp = NULL; } /* Release lists */ - ms_list_for_each(lupnp->adding_configs,(void (*)(void*))upnp_port_binding_release); + ms_list_for_each(lupnp->adding_configs,(void (*)(void*))linphone_upnp_port_binding_release); lupnp->adding_configs = ms_list_free(lupnp->adding_configs); - ms_list_for_each(lupnp->removing_configs,(void (*)(void*))upnp_port_binding_release); + ms_list_for_each(lupnp->removing_configs,(void (*)(void*))linphone_upnp_port_binding_release); lupnp->removing_configs = ms_list_free(lupnp->removing_configs); - ms_list_for_each(lupnp->pending_bindings,(void (*)(void*))upnp_port_binding_release); + ms_list_for_each(lupnp->pending_bindings,(void (*)(void*))linphone_upnp_port_binding_release); lupnp->pending_bindings = ms_list_free(lupnp->pending_bindings); ms_mutex_destroy(&lupnp->mutex); - ms_cond_destroy(&lupnp->cond); + ms_cond_destroy(&lupnp->empty_cond); ms_message("uPnP IGD: destroy %p", lupnp); ms_free(lupnp); } -UpnpState upnp_context_get_state(UpnpContext *ctx) { +LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *ctx) { return ctx->state; } -const char* upnp_context_get_external_ipaddress(UpnpContext *ctx) { +const char* linphone_upnp_context_get_external_ipaddress(UpnpContext *ctx) { return upnp_igd_get_external_ipaddress(ctx->upnp_igd_ctxt); } -int upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port) { +int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port) { upnp_igd_port_mapping mapping; char description[128]; int ret; - if(port->state == LinphoneUpnpStateIdle) { - port->retry = 0; - port->state = LinphoneUpnpStateAdding; - } else if(port->state != LinphoneUpnpStateAdding) { - ms_error("uPnP: try to add a port binding in wrong state: %d", port->state); - return -2; + + // Compute port binding state + if(port->state != LinphoneUpnpStateAdding) { + port->to_remove = FALSE; + switch(port->state) { + case LinphoneUpnpStateKo: + case LinphoneUpnpStateIdle: { + port->retry = 0; + port->state = LinphoneUpnpStateAdding; + } + break; + case LinphoneUpnpStateRemoving: { + port->to_add = TRUE; + return 0; + } + break; + default: + return 0; + } } if(port->retry >= UPNP_ADD_MAX_RETRY) { ret = -1; } else { - mapping.cookie = upnp_port_binding_retain(port); + mapping.cookie = linphone_upnp_port_binding_retain(port); lupnp->pending_bindings = ms_list_append(lupnp->pending_bindings, mapping.cookie); mapping.local_port = port->local_port; @@ -410,7 +434,7 @@ int upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port mapping.protocol = port->protocol; port->retry++; - upnp_port_binding_log(ORTP_DEBUG, "Adding port binding...", port); + linphone_upnp_port_binding_log(ORTP_MESSAGE, "Try to add port binding", port); ret = upnp_igd_add_port_mapping(lupnp->upnp_igd_ctxt, &mapping); } if(ret != 0) { @@ -419,28 +443,40 @@ int upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port return ret; } -int upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port) { +int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port) { upnp_igd_port_mapping mapping; int ret; - if(port->state == LinphoneUpnpStateOk) { - port->retry = 0; - port->state = LinphoneUpnpStateRemoving; - } else if(port->state != LinphoneUpnpStateRemoving) { - ms_error("uPnP: try to remove a port binding in wrong state: %d", port->state); - return -2; + + // Compute port binding state + if(port->state != LinphoneUpnpStateRemoving) { + port->to_add = FALSE; + switch(port->state) { + case LinphoneUpnpStateOk: { + port->retry = 0; + port->state = LinphoneUpnpStateRemoving; + } + break; + case LinphoneUpnpStateAdding: { + port->to_remove = TRUE; + return 0; + } + break; + default: + return 0; + } } if(port->retry >= UPNP_REMOVE_MAX_RETRY) { ret = -1; } else { - mapping.cookie = upnp_port_binding_retain(port); + mapping.cookie = linphone_upnp_port_binding_retain(port); lupnp->pending_bindings = ms_list_append(lupnp->pending_bindings, mapping.cookie); mapping.remote_port = port->external_port; mapping.remote_host = ""; mapping.protocol = port->protocol; port->retry++; - upnp_port_binding_log(ORTP_DEBUG, "Removing port binding...", port); + linphone_upnp_port_binding_log(ORTP_MESSAGE, "Try to remove port binding", port); ret = upnp_igd_delete_port_mapping(lupnp->upnp_igd_ctxt, &mapping); } if(ret != 0) { @@ -485,19 +521,14 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool if(call->upnp_session->audio->rtcp->external_port == -1) { call->upnp_session->audio->rtcp->external_port = call->audio_port+1; } - if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateIdle && audio) { + if(audio) { // Add audio port binding - upnp_context_send_add_port_binding(lupnp, call->upnp_session->audio->rtp); - } else if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateOk && !audio) { + linphone_upnp_context_send_add_port_binding(lupnp, call->upnp_session->audio->rtp); + linphone_upnp_context_send_add_port_binding(lupnp, call->upnp_session->audio->rtcp); + } else { // Remove audio port binding - upnp_context_send_remove_port_binding(lupnp, call->upnp_session->audio->rtp); - } - if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateIdle && audio) { - // Add audio port binding - upnp_context_send_add_port_binding(lupnp, call->upnp_session->audio->rtcp); - } else if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateOk && !audio) { - // Remove audio port binding - upnp_context_send_remove_port_binding(lupnp, call->upnp_session->audio->rtcp); + linphone_upnp_context_send_remove_port_binding(lupnp, call->upnp_session->audio->rtp); + linphone_upnp_context_send_remove_port_binding(lupnp, call->upnp_session->audio->rtcp); } /* @@ -515,19 +546,14 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool if(call->upnp_session->video->rtcp->external_port == -1) { call->upnp_session->video->rtcp->external_port = call->video_port+1; } - if(call->upnp_session->video->rtp->state == LinphoneUpnpStateIdle && video) { + if(video) { // Add video port binding - upnp_context_send_add_port_binding(lupnp, call->upnp_session->video->rtp); - } else if(call->upnp_session->video->rtp->state == LinphoneUpnpStateOk && !video) { + linphone_upnp_context_send_add_port_binding(lupnp, call->upnp_session->video->rtp); + linphone_upnp_context_send_add_port_binding(lupnp, call->upnp_session->video->rtcp); + } else { // Remove video port binding - upnp_context_send_remove_port_binding(lupnp, call->upnp_session->video->rtp); - } - if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateIdle && video) { - // Add video port binding - upnp_context_send_add_port_binding(lupnp, call->upnp_session->video->rtcp); - } else if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateOk && !video) { - // Remove video port binding - upnp_context_send_remove_port_binding(lupnp, call->upnp_session->video->rtcp); + linphone_upnp_context_send_remove_port_binding(lupnp, call->upnp_session->video->rtp); + linphone_upnp_context_send_remove_port_binding(lupnp, call->upnp_session->video->rtcp); } } @@ -536,7 +562,7 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool /* * Update uPnP call state */ - upnp_call_process(call); + linphone_upnp_call_process(call); return ret; } @@ -564,11 +590,11 @@ int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call) { return linphone_core_update_upnp_audio_video(call, call->audiostream!=NULL, call->videostream!=NULL); } -int upnp_call_process(LinphoneCall *call) { +int linphone_upnp_call_process(LinphoneCall *call) { LinphoneCore *lc = call->core; UpnpContext *lupnp = lc->upnp; int ret = -1; - UpnpState oldState; + LinphoneUpnpState oldState; if(lupnp == NULL) { return ret; @@ -664,62 +690,73 @@ int upnp_call_process(LinphoneCall *call) { return ret; } +void linphone_core_upnp_refresh(UpnpContext *lupnp) { + MSList *global_list = NULL; + MSList *list = NULL; + MSList *item; + LinphoneCall *call; + UpnpPortBinding *port_mapping, *port_mapping2; + + ms_message("uPnP IGD: Refresh mappings"); + + /* Remove context port bindings */ + if(lupnp->sip_udp != NULL) { + global_list = ms_list_append(global_list, lupnp->sip_udp); + } + if(lupnp->sip_tcp != NULL) { + global_list = ms_list_append(global_list, lupnp->sip_tcp); + } + if(lupnp->sip_tls != NULL) { + global_list = ms_list_append(global_list, lupnp->sip_tls); + } + + /* Remove call port bindings */ + list = lupnp->lc->calls; + while(list != NULL) { + call = (LinphoneCall *)list->data; + if(call->upnp_session != NULL) { + global_list = ms_list_append(global_list, call->upnp_session->audio->rtp); + global_list = ms_list_append(global_list, call->upnp_session->audio->rtcp); + global_list = ms_list_append(global_list, call->upnp_session->video->rtp); + global_list = ms_list_append(global_list, call->upnp_session->video->rtcp); + } + list = list->next; + } + + // Remove port binding configurations + list = linphone_upnp_config_list_port_bindings(lupnp->lc->config); + for(item = list;item != NULL; item = item->next) { + port_mapping = (UpnpPortBinding *)item->data; + port_mapping2 = linphone_upnp_port_binding_equivalent_in_list(global_list, port_mapping); + if(port_mapping2 == NULL) { + linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping); + } else if(port_mapping2->state == LinphoneUpnpStateIdle){ + /* Force to remove */ + port_mapping2->state = LinphoneUpnpStateOk; + } + } + ms_list_for_each(list, (void (*)(void*))linphone_upnp_port_binding_release); + list = ms_list_free(list); + + + // (Re)Add removed port bindings + list = global_list; + while(list != NULL) { + port_mapping = (UpnpPortBinding *)list->data; + linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping); + linphone_upnp_context_send_add_port_binding(lupnp, port_mapping); + list = list->next; + } + global_list = ms_list_free(global_list); +} + bool_t linphone_core_upnp_hook(void *data) { char key[64]; - MSList *list = NULL; MSList *item; UpnpPortBinding *port_mapping; UpnpContext *lupnp = (UpnpContext *)data; - LinphoneCall *call; ms_mutex_lock(&lupnp->mutex); - if(lupnp->clean && !lupnp->cleaning) { - ms_message("uPnP IGD: Clean port mappings"); - lupnp->clean = FALSE; - // Remove old mapping - list = upnp_config_list_port_bindings(lupnp->lc->config); - if(list == NULL) { - lupnp->emit = TRUE; - } else { - lupnp->cleaning = TRUE; - for(item = list;item != NULL; item = item->next) { - port_mapping = (UpnpPortBinding *)item->data; - upnp_context_send_remove_port_binding(lupnp, port_mapping); - } - ms_list_for_each(list,(void (*)(void*))upnp_port_binding_release); - list = ms_list_free(list); - } - } - - if(lupnp->emit) { - ms_message("uPnP IGD: Update port mappings"); - lupnp->emit = FALSE; - - /* Force port bindings */ - if(lupnp->sip_udp != NULL) { - lupnp->sip_udp->state = LinphoneUpnpStateIdle; - upnp_context_send_add_port_binding(lupnp, lupnp->sip_udp); - } - if(lupnp->sip_tcp != NULL) { - lupnp->sip_udp->state = LinphoneUpnpStateIdle; - upnp_context_send_add_port_binding(lupnp, lupnp->sip_tcp); - } - if(lupnp->sip_tls != NULL) { - lupnp->sip_udp->state = LinphoneUpnpStateIdle; - upnp_context_send_add_port_binding(lupnp, lupnp->sip_tls); - } - list = lupnp->lc->calls; - while(list != NULL) { - call = (LinphoneCall *)list->data; - call->upnp_session->audio->rtp->state = LinphoneUpnpStateIdle; - call->upnp_session->audio->rtcp->state = LinphoneUpnpStateIdle; - call->upnp_session->video->rtp->state = LinphoneUpnpStateIdle; - call->upnp_session->video->rtcp->state = LinphoneUpnpStateIdle; - linphone_core_update_upnp_audio_video(call, call->audiostream!=NULL, call->videostream!=NULL); - list = list->next; - } - } - /* Add configs */ for(item = lupnp->adding_configs;item!=NULL;item=item->next) { port_mapping = (UpnpPortBinding *)item->data; @@ -728,9 +765,9 @@ bool_t linphone_core_upnp_hook(void *data) { port_mapping->external_port, port_mapping->local_port); lp_config_set_string(lupnp->lc->config, UPNP_SECTION_NAME, key, "uPnP"); - upnp_port_binding_log(ORTP_DEBUG, "Configuration: Added port binding", port_mapping); + linphone_upnp_port_binding_log(ORTP_DEBUG, "Configuration: Added port binding", port_mapping); } - ms_list_for_each(lupnp->adding_configs,(void (*)(void*))upnp_port_binding_release); + ms_list_for_each(lupnp->adding_configs,(void (*)(void*))linphone_upnp_port_binding_release); lupnp->adding_configs = ms_list_free(lupnp->adding_configs); /* Remove configs */ @@ -741,9 +778,9 @@ bool_t linphone_core_upnp_hook(void *data) { port_mapping->external_port, port_mapping->local_port); lp_config_set_string(lupnp->lc->config, UPNP_SECTION_NAME, key, NULL); - upnp_port_binding_log(ORTP_DEBUG, "Configuration: Removed port binding", port_mapping); + linphone_upnp_port_binding_log(ORTP_DEBUG, "Configuration: Removed port binding", port_mapping); } - ms_list_for_each(lupnp->removing_configs,(void (*)(void*))upnp_port_binding_release); + ms_list_for_each(lupnp->removing_configs,(void (*)(void*))linphone_upnp_port_binding_release); lupnp->removing_configs = ms_list_free(lupnp->removing_configs); ms_mutex_unlock(&lupnp->mutex); @@ -782,7 +819,7 @@ int linphone_core_update_local_media_description_from_upnp(SalMediaDescription * * uPnP Port Binding */ -UpnpPortBinding *upnp_port_binding_new() { +UpnpPortBinding *linphone_upnp_port_binding_new() { UpnpPortBinding *port = NULL; port = ms_new0(UpnpPortBinding,1); ms_mutex_init(&port->mutex, NULL); @@ -791,11 +828,13 @@ UpnpPortBinding *upnp_port_binding_new() { port->local_port = -1; port->external_addr[0] = '\0'; port->external_port = -1; + port->to_remove = FALSE; + port->to_add = FALSE; port->ref = 1; return port; } -UpnpPortBinding *upnp_port_binding_copy(const UpnpPortBinding *port) { +UpnpPortBinding *linphone_upnp_port_binding_copy(const UpnpPortBinding *port) { UpnpPortBinding *new_port = NULL; new_port = ms_new0(UpnpPortBinding,1); memcpy(new_port, port, sizeof(UpnpPortBinding)); @@ -804,7 +843,7 @@ UpnpPortBinding *upnp_port_binding_copy(const UpnpPortBinding *port) { return new_port; } -void upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *port) { +void linphone_upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *port) { if(strlen(port->local_addr)) { ortp_log(level, "uPnP IGD: %s %s|%d->%s:%d", msg, (port->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", @@ -819,20 +858,33 @@ void upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *po } } -bool_t upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2) { +bool_t linphone_upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2) { return port1->protocol == port2->protocol && port1->local_port == port2->local_port && port1->external_port == port2->external_port; } -UpnpPortBinding *upnp_port_binding_retain(UpnpPortBinding *port) { +UpnpPortBinding *linphone_upnp_port_binding_equivalent_in_list(MSList *list, const UpnpPortBinding *port) { + UpnpPortBinding *port_mapping; + while(list != NULL) { + port_mapping = (UpnpPortBinding *)list->data; + if(linphone_upnp_port_binding_equal(port, port_mapping)) { + return port_mapping; + } + list = list->next; + } + + return NULL; +} + +UpnpPortBinding *linphone_upnp_port_binding_retain(UpnpPortBinding *port) { ms_mutex_lock(&port->mutex); port->ref++; ms_mutex_unlock(&port->mutex); return port; } -void upnp_port_binding_release(UpnpPortBinding *port) { +void linphone_upnp_port_binding_release(UpnpPortBinding *port) { ms_mutex_lock(&port->mutex); if(--port->ref == 0) { ms_mutex_unlock(&port->mutex); @@ -848,20 +900,20 @@ void upnp_port_binding_release(UpnpPortBinding *port) { * uPnP Stream */ -UpnpStream* upnp_stream_new() { +UpnpStream* linphone_upnp_stream_new() { UpnpStream *stream = ms_new0(UpnpStream,1); stream->state = LinphoneUpnpStateIdle; - stream->rtp = upnp_port_binding_new(); + stream->rtp = linphone_upnp_port_binding_new(); stream->rtp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; - stream->rtcp = upnp_port_binding_new(); + stream->rtcp = linphone_upnp_port_binding_new(); stream->rtcp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; return stream; } -void upnp_stream_destroy(UpnpStream* stream) { - upnp_port_binding_release(stream->rtp); +void linphone_upnp_stream_destroy(UpnpStream* stream) { + linphone_upnp_port_binding_release(stream->rtp); stream->rtp = NULL; - upnp_port_binding_release(stream->rtcp); + linphone_upnp_port_binding_release(stream->rtcp); stream->rtcp = NULL; ms_free(stream); } @@ -871,40 +923,32 @@ void upnp_stream_destroy(UpnpStream* stream) { * uPnP Session */ -UpnpSession* upnp_session_new(LinphoneCall* call) { +UpnpSession* linphone_upnp_session_new(LinphoneCall* call) { UpnpSession *session = ms_new0(UpnpSession,1); session->call = call; session->state = LinphoneUpnpStateIdle; - session->audio = upnp_stream_new(); - session->video = upnp_stream_new(); + session->audio = linphone_upnp_stream_new(); + session->video = linphone_upnp_stream_new(); return session; } -void upnp_session_destroy(UpnpSession *session) { +void linphone_upnp_session_destroy(UpnpSession *session) { LinphoneCore *lc = session->call->core; if(lc->upnp != NULL) { /* Remove bindings */ - if(session->audio->rtp->state != LinphoneUpnpStateKo && session->audio->rtp->state != LinphoneUpnpStateIdle) { - upnp_context_send_remove_port_binding(lc->upnp, session->audio->rtp); - } - if(session->audio->rtcp->state != LinphoneUpnpStateKo && session->audio->rtcp->state != LinphoneUpnpStateIdle) { - upnp_context_send_remove_port_binding(lc->upnp, session->audio->rtcp); - } - if(session->video->rtp->state != LinphoneUpnpStateKo && session->video->rtp->state != LinphoneUpnpStateIdle) { - upnp_context_send_remove_port_binding(lc->upnp, session->video->rtp); - } - if(session->video->rtcp->state != LinphoneUpnpStateKo && session->video->rtcp->state != LinphoneUpnpStateIdle) { - upnp_context_send_remove_port_binding(lc->upnp, session->video->rtcp); - } + linphone_upnp_context_send_remove_port_binding(lc->upnp, session->audio->rtp); + linphone_upnp_context_send_remove_port_binding(lc->upnp, session->audio->rtcp); + linphone_upnp_context_send_remove_port_binding(lc->upnp, session->video->rtp); + linphone_upnp_context_send_remove_port_binding(lc->upnp, session->video->rtcp); } - upnp_stream_destroy(session->audio); - upnp_stream_destroy(session->video); + linphone_upnp_stream_destroy(session->audio); + linphone_upnp_stream_destroy(session->video); ms_free(session); } -UpnpState upnp_session_get_state(UpnpSession *session) { +LinphoneUpnpState linphone_upnp_session_get_state(UpnpSession *session) { return session->state; } @@ -912,7 +956,7 @@ UpnpState upnp_session_get_state(UpnpSession *session) { * uPnP Config */ -MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc) { +MSList *linphone_upnp_config_list_port_bindings(struct _LpConfig *lpc) { char protocol_str[4]; // TCP or UDP upnp_igd_ip_protocol protocol; int external_port; @@ -939,7 +983,7 @@ MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc) { valid = FALSE; } if(valid) { - port = upnp_port_binding_new(); + port = linphone_upnp_port_binding_new(); port->state = LinphoneUpnpStateOk; port->protocol = protocol; port->external_port = external_port; @@ -959,16 +1003,16 @@ MSList *upnp_config_list_port_bindings(struct _LpConfig *lpc) { return retList; } -void upnp_config_add_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port) { +void linphone_upnp_config_add_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port) { MSList *list; UpnpPortBinding *list_port; list = lupnp->removing_configs; while(list != NULL) { list_port = (UpnpPortBinding *)list->data; - if(upnp_port_binding_equal(list_port, port) == TRUE) { + if(linphone_upnp_port_binding_equal(list_port, port) == TRUE) { lupnp->removing_configs = ms_list_remove(lupnp->removing_configs, list_port); - upnp_port_binding_release(list_port); + linphone_upnp_port_binding_release(list_port); return; } list = ms_list_next(list); @@ -977,26 +1021,26 @@ void upnp_config_add_port_binding(UpnpContext *lupnp, const UpnpPortBinding *por list = lupnp->adding_configs; while(list != NULL) { list_port = (UpnpPortBinding *)list->data; - if(upnp_port_binding_equal(list_port, port) == TRUE) { + if(linphone_upnp_port_binding_equal(list_port, port) == TRUE) { return; } list = ms_list_next(list); } - list_port = upnp_port_binding_copy(port); + list_port = linphone_upnp_port_binding_copy(port); lupnp->adding_configs = ms_list_append(lupnp->adding_configs, list_port); } -void upnp_config_remove_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port) { +void linphone_upnp_config_remove_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port) { MSList *list; UpnpPortBinding *list_port; list = lupnp->adding_configs; while(list != NULL) { list_port = (UpnpPortBinding *)list->data; - if(upnp_port_binding_equal(list_port, port) == TRUE) { + if(linphone_upnp_port_binding_equal(list_port, port) == TRUE) { lupnp->adding_configs = ms_list_remove(lupnp->adding_configs, list_port); - upnp_port_binding_release(list_port); + linphone_upnp_port_binding_release(list_port); return; } list = ms_list_next(list); @@ -1005,12 +1049,12 @@ void upnp_config_remove_port_binding(UpnpContext *lupnp, const UpnpPortBinding * list = lupnp->removing_configs; while(list != NULL) { list_port = (UpnpPortBinding *)list->data; - if(upnp_port_binding_equal(list_port, port) == TRUE) { + if(linphone_upnp_port_binding_equal(list_port, port) == TRUE) { return; } list = ms_list_next(list); } - list_port = upnp_port_binding_copy(port); + list_port = linphone_upnp_port_binding_copy(port); lupnp->removing_configs = ms_list_append(lupnp->removing_configs, list_port); } diff --git a/coreapi/upnp.h b/coreapi/upnp.h index 64ccc88e9..a98e15574 100644 --- a/coreapi/upnp.h +++ b/coreapi/upnp.h @@ -26,13 +26,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. typedef enum { LinphoneUpnpStateIdle, - LinphoneUpnpStatePending, + LinphoneUpnpStatePending, // Only used by uPnP context LinphoneUpnpStateAdding, // Only used by port binding LinphoneUpnpStateRemoving, // Only used by port binding LinphoneUpnpStateNotAvailable, // Only used by uPnP context LinphoneUpnpStateOk, LinphoneUpnpStateKo, -} UpnpState; +} LinphoneUpnpState; typedef struct _UpnpSession UpnpSession; typedef struct _UpnpContext UpnpContext; @@ -41,14 +41,14 @@ int linphone_core_update_local_media_description_from_upnp(SalMediaDescription * int linphone_core_update_upnp_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md); int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call); -int upnp_call_process(LinphoneCall *call); -UpnpSession* upnp_session_new(LinphoneCall *call); -void upnp_session_destroy(UpnpSession* session); -UpnpState upnp_session_get_state(UpnpSession *session); +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 *upnp_context_new(LinphoneCore *lc); -void upnp_context_destroy(UpnpContext *ctx); -UpnpState upnp_context_get_state(UpnpContext *ctx); -const char *upnp_context_get_external_ipaddress(UpnpContext *ctx); +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); #endif //LINPHONE_UPNP_H diff --git a/mediastreamer2 b/mediastreamer2 index f9e4fed0b..07ca1256c 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit f9e4fed0b113f04895ae24a4e40f618e156b3754 +Subproject commit 07ca1256c7dc9ea15831d7f348b4104ccef162d3 From 3500af3adf56561f70e497e4dcf6c50c2af320fd Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 9 Jan 2013 16:57:41 +0100 Subject: [PATCH 019/281] Do not update session version in SDP when remote send re-invite without updating it. --- coreapi/callbacks.c | 2 ++ coreapi/linphonecall.c | 10 ++++++++++ coreapi/linphonecore.c | 17 +++++++++++++++-- coreapi/private.h | 3 +++ coreapi/sal_eXosip2_sdp.c | 7 +++++++ 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 2f0d25b0d..032218a2e 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -345,6 +345,7 @@ static void call_accepted(SalOp *op){ if (call->referer) linphone_core_notify_refer_state(lc,call->referer,call); } if (md && !sal_media_description_empty(md)){ + linphone_call_update_remote_session_id_and_ver(call); if (sal_media_description_has_dir(md,SalStreamSendOnly) || sal_media_description_has_dir(md,SalStreamInactive)){ if (lc->vtable.display_status){ @@ -425,6 +426,7 @@ static void call_accept_update(LinphoneCore *lc, LinphoneCall *call){ linphone_core_update_ice_from_remote_media_description(call,rmd); linphone_core_update_local_media_description_from_ice(call->localdesc,call->ice_session); } + linphone_call_update_remote_session_id_and_ver(call); sal_call_accept(call->op); md=sal_call_get_final_media_description(call->op); if (md && !sal_media_description_empty(md)) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 3bf93f78e..663e552a9 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1704,6 +1704,16 @@ void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescript #endif } +void linphone_call_update_remote_session_id_and_ver(LinphoneCall *call) { + SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); + if (remote_desc) { + ms_warning("linphone_call_update_remote_session_id_and_ver(): id=%u, ver=%u", + remote_desc->session_id, remote_desc->session_ver); + call->remote_session_id = remote_desc->session_id; + call->remote_session_ver = remote_desc->session_ver; + } +} + void linphone_call_delete_ice_session(LinphoneCall *call){ if (call->ice_session != NULL) { ice_session_destroy(call->ice_session); diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index c6fc73590..2336dbfe1 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2722,6 +2722,7 @@ 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_call_update_remote_session_id_and_ver(call); sal_call_set_local_media_description(call->op,call->localdesc); sal_call_accept(call->op); md=sal_call_get_final_media_description(call->op); @@ -2751,6 +2752,7 @@ int linphone_core_start_accept_call_update(LinphoneCore *lc, LinphoneCall *call) * @return 0 if sucessful, -1 otherwise (actually when this function call is performed outside ot #LinphoneCallUpdatedByRemote state). **/ int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params){ + SalMediaDescription *remote_desc; #ifdef VIDEO_ENABLED bool_t old_has_video = call->params.has_video; #endif @@ -2759,6 +2761,16 @@ int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const linphone_call_state_to_string(call->state)); return -1; } + remote_desc = sal_call_get_remote_media_description(call->op); + ms_warning("linphone_core_accept_update(): rmt_id=%u, rmt_ver=%u, call->rmt_id=%u, call->rmt_ver=%u", + remote_desc->session_id, remote_desc->session_ver, call->remote_session_id, call->remote_session_ver); + if ((remote_desc->session_id == call->remote_session_id) && (remote_desc->session_ver == call->remote_session_ver)) { + /* Remote has sent an INVITE with the same SDP as before, so send a 200 OK with the same SDP as before. */ + ms_warning("Send same SDP as before!"); + sal_call_accept(call->op); + linphone_call_set_state(call,LinphoneCallStreamsRunning,"Connected (streams running)"); + return 0; + } if (params==NULL){ call->params.has_video=lc->video_policy.automatically_accept || call->current_params.has_video; }else @@ -2772,11 +2784,11 @@ int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const ms_warning("Video isn't supported in conference"); call->params.has_video = FALSE; } - call->params.has_video &= linphone_core_media_description_contains_video_stream(sal_call_get_remote_media_description(call->op)); + call->params.has_video &= linphone_core_media_description_contains_video_stream(remote_desc); call->camera_active=call->params.has_video; linphone_call_make_local_media_description(lc,call); if (call->ice_session != NULL) { - linphone_core_update_ice_from_remote_media_description(call, sal_call_get_remote_media_description(call->op)); + linphone_core_update_ice_from_remote_media_description(call, remote_desc); #ifdef VIDEO_ENABLED if ((call->ice_session != NULL) &&!ice_session_candidates_gathered(call->ice_session)) { if ((call->params.has_video) && (call->params.has_video != old_has_video)) { @@ -2903,6 +2915,7 @@ int linphone_core_accept_call_with_params(LinphoneCore *lc, LinphoneCall *call, audio_stream_prepare_sound(call->audiostream,lc->sound_conf.play_sndcard,lc->sound_conf.capt_sndcard); } + linphone_call_update_remote_session_id_and_ver(call); sal_call_accept(call->op); if (lc->vtable.display_status!=NULL) lc->vtable.display_status(lc,_("Connected.")); diff --git a/coreapi/private.h b/coreapi/private.h index c171fac88..93baf7e44 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -148,6 +148,8 @@ struct _LinphoneCall IceSession *ice_session; LinphoneChatMessage* pending_message; int ping_time; + unsigned int remote_session_id; + unsigned int remote_session_ver; bool_t refer_pending; bool_t media_pending; bool_t audio_muted; @@ -286,6 +288,7 @@ void linphone_call_stop_media_streams(LinphoneCall *call); void linphone_call_delete_ice_session(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_remote_session_id_and_ver(LinphoneCall *call); const char * linphone_core_get_identity(LinphoneCore *lc); const char * linphone_core_get_route(LinphoneCore *lc); diff --git a/coreapi/sal_eXosip2_sdp.c b/coreapi/sal_eXosip2_sdp.c index 050a53a76..4aad14863 100644 --- a/coreapi/sal_eXosip2_sdp.c +++ b/coreapi/sal_eXosip2_sdp.c @@ -434,10 +434,17 @@ static int payload_type_fill_from_rtpmap(PayloadType *pt, const char *rtpmap){ int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){ int i,j; const char *mtype,*proto,*rtp_port,*rtp_addr,*number; + const char *sess; sdp_bandwidth_t *sbw=NULL; sdp_attribute_t *attr; int nb_ice_candidates; + /* Get session information. */ + sess = sdp_message_o_sess_id_get(msg); + if (sess) desc->session_id = strtoul(sess, NULL, 10); + sess = sdp_message_o_sess_version_get(msg); + if (sess) desc->session_ver = strtoul(sess, NULL, 10); + rtp_addr=sdp_message_c_addr_get (msg, -1, 0); if (rtp_addr) strncpy(desc->addr,rtp_addr,sizeof(desc->addr)); From 3c00bb1195fc52fc15cefc29509b456aaf513f00 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 10 Jan 2013 11:17:35 +0100 Subject: [PATCH 020/281] Call upnp update on video remove --- coreapi/linphonecore.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index bef4a1be5..04d80612d 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2016,10 +2016,12 @@ void linphone_core_iterate(LinphoneCore *lc){ linphone_call_delete_ice_session(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); } if (call->state==LinphoneCallIncomingReceived){ @@ -2697,9 +2699,19 @@ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const Linpho linphone_call_set_state(call,LinphoneCallUpdating,"Updating call"); #ifdef VIDEO_ENABLED 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); - 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; linphone_call_make_local_media_description(lc, call); From 12d8590df4f22de4ed6478eaa144550196c8fd22 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 10 Jan 2013 11:24:09 +0100 Subject: [PATCH 021/281] Fix upnp on call update --- coreapi/linphonecore.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 04d80612d..b1b6e6c6b 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2699,6 +2699,8 @@ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const Linpho linphone_call_set_state(call,LinphoneCallUpdating,"Updating call"); #ifdef VIDEO_ENABLED bool_t has_video = call->params.has_video; + + // Video removing 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); @@ -2713,8 +2715,11 @@ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const Linpho } #endif //BUILD_UPNP } + call->params = *params; linphone_call_make_local_media_description(lc, call); + + // Video adding if (!has_video && call->params.has_video) { if (call->ice_session != NULL) { /* Defer call update until the ICE candidates gathering process has finished. */ @@ -2861,19 +2866,22 @@ int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const } 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_from_remote_media_description(call, sal_call_get_remote_media_description(call->op))<0) { + 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 From a1645810cbca630763cf79207f32af954b49c921 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 10 Jan 2013 12:47:57 +0100 Subject: [PATCH 022/281] Add missing BUILD_UPNP preprocessor condition --- coreapi/callbacks.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 901f23f24..f166bc49f 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -261,12 +261,13 @@ static void call_received(SalOp *h){ ms_message("Defer ringing to gather ICE candidates"); 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); } From 56470e4ddd4e8fe214e45f5890ac7f3e77bce5ea Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 17 Jan 2013 10:56:20 +0100 Subject: [PATCH 023/281] Add notification message sending and name in the chat tab --- gtk/chat.c | 43 +++++++++++++++++++++++++++++-------------- gtk/friendlist.c | 33 ++++++++++++++++++++++++++++++--- gtk/linphone.h | 3 ++- 3 files changed, 61 insertions(+), 18 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index 868937573..b63144b17 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -31,7 +31,7 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { int idx = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"idx")); g_return_if_fail(w!=NULL); gtk_notebook_remove_page (GTK_NOTEBOOK(nb),idx); - linphone_gtk_update_chat_picture(FALSE); + linphone_gtk_create_chat_picture(FALSE); g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); g_object_set_data(G_OBJECT(w),"from_message",NULL); g_object_set_data(G_OBJECT(w),"cr",NULL); @@ -98,7 +98,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, const cha int off; gtk_text_buffer_get_end_iter(buffer,&iter); off=gtk_text_iter_get_offset(&iter); - //GList *list=g_object_get_data(G_OBJECT(w),"list"); + GList *list=g_object_get_data(G_OBJECT(w),"list"); if(g_strcmp0((char *)g_object_get_data(G_OBJECT(w),"from_message"),linphone_address_as_string(from))!=0){ gtk_text_buffer_get_iter_at_offset(buffer,&iter,off); @@ -129,7 +129,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, const cha } g_object_set_data(G_OBJECT(linphone_gtk_get_main_window()),"history",hash); - /*if(me){ + if(me){ gtk_text_buffer_get_end_iter(buffer,&iter); list=g_list_append(list,GINT_TO_POINTER(gtk_text_iter_get_line(&iter))); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Message in progress.. ",-1, @@ -137,7 +137,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, const cha gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); g_object_set_data(G_OBJECT(w),"list",list); - }*/ + } GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); gtk_text_view_scroll_mark_onscreen(text,mark); @@ -154,7 +154,7 @@ const LinphoneAddress* linphone_gtk_get_used_identity(){ /* function in dev for displaying ack*/ void update_chat_state_message(LinphoneChatMessageState state){ - /* GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *main_window=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *page=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); GList *list=g_object_get_data(G_OBJECT(page),"list"); @@ -193,11 +193,17 @@ void update_chat_state_message(LinphoneChatMessageState state){ break; default : result="Message in progress.. "; } - gtk_text_buffer_insert_with_tags_by_name(b,&iter,result,-1, + + GDateTime *dt=g_date_time_new_now_local(); + char *time=g_date_time_format(dt,"%k:%M"); + gchar result2[80]; + sprintf(result2,"%s %s",result,time); + + gtk_text_buffer_insert_with_tags_by_name(b,&iter,result2,-1, "italic","right","small","font_grey",NULL); list=g_list_remove(list,g_list_nth_data(list,0)); g_object_set_data(G_OBJECT(page),"list",list); - } */ + } } static void on_chat_state_changed(LinphoneChatMessage *msg, LinphoneChatMessageState state, void *user_pointer){ @@ -247,7 +253,7 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres g_object_set_data(G_OBJECT(chat_view),"cr",cr); g_object_set_data(G_OBJECT(chat_view),"idx",GINT_TO_POINTER(idx)); g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); - g_object_set_data(G_OBJECT(chat_view),"from_chatroom",linphone_address_as_string_uri_only(with)); + g_object_set_data(G_OBJECT(chat_view),"from_chatroom",(gpointer) with); GList *list=NULL; g_object_set_data(G_OBJECT(chat_view),"list",list); @@ -295,8 +301,8 @@ LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with){ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri,GtkWidget *chat_view){ GtkWidget *main_window=linphone_gtk_get_main_window (); GHashTable *hash=g_object_get_data(G_OBJECT(main_window),"history"); - if(g_strcmp0((char *)g_object_get_data(G_OBJECT(chat_view),"from_chatroom"), - linphone_address_as_string_uri_only(uri))!=0) + LinphoneAddress *from=(LinphoneAddress *)g_object_get_data(G_OBJECT(chat_view),"from_chatroom"); + if(g_strcmp0(linphone_address_as_string(from),linphone_address_as_string(uri))!=0) { GtkTextView *text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); GtkTextIter start; @@ -315,7 +321,7 @@ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri, udpate_tab_chat_header(chat_view,uri,cr); g_object_set_data(G_OBJECT(chat_view),"cr",cr); - g_object_set_data(G_OBJECT(chat_view),"from_chatroom",linphone_address_as_string_uri_only(uri)); + g_object_set_data(G_OBJECT(chat_view),"from_chatroom",(gpointer) uri); g_object_set_data(G_OBJECT(chat_view),"from_message",linphone_address_as_string_uri_only(uri)); g_object_set_data(G_OBJECT(linphone_gtk_get_widget(main_window,"contact_list")),"chatview",(gpointer)chat_view); } @@ -336,6 +342,8 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const GtkWidget *main_window=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *w; + GDateTime *dt=g_date_time_new_now_local(); + char *time=g_date_time_format(dt,"%k:%M"); w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); if(w!=NULL){ @@ -344,14 +352,21 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const w=linphone_gtk_init_chatroom(room,from); g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); } + + const char *display=linphone_address_get_display_name(from); + if (display==NULL || display[0]=='\0') { + display=linphone_address_get_username(from); + } - #ifdef HAVE_GTK_OSX + #ifdef HAVE_GTK_OSXs /* Notified when a new message is sent */ linphone_gtk_status_icon_set_blinking(TRUE); #else if(!gtk_window_is_active(GTK_WINDOW(main_window))){ if(!GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_notified"))){ - linphone_gtk_notify(NULL,message); + gchar result2[80]; + sprintf(result2,"%s \n %s sent at %s",message,display,time); + linphone_gtk_notify(NULL,result2); g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(TRUE)); } else { g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(FALSE)); @@ -359,7 +374,7 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const } #endif linphone_gtk_push_text(w,from,message,FALSE,room); - //linphone_gtk_update_chat_picture(TRUE); + linphone_gtk_update_chat_picture(); //gtk_window_present(GTK_WINDOW(w)); /*gtk_window_set_urgency_hint(GTK_WINDOW(w),TRUE);*/ } diff --git a/gtk/friendlist.c b/gtk/friendlist.c index 9aabe597a..88204a102 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -171,7 +171,7 @@ static void linphone_gtk_call_selected(GtkTreeView *treeview){ "start_call")); } -void linphone_gtk_update_chat_picture(gboolean active){ +void linphone_gtk_create_chat_picture(gboolean active){ GtkTreeIter iter; GtkWidget *w = linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); @@ -187,6 +187,31 @@ void linphone_gtk_update_chat_picture(gboolean active){ } } +void linphone_gtk_update_chat_picture(){ + GtkTreeIter iter; + GtkListStore *store=NULL; + GtkWidget *w = linphone_gtk_get_main_window(); + GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); + GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)); + GtkWidget *chat_view=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + LinphoneFriend *lf=NULL; + LinphoneAddress *uri=(LinphoneAddress *)g_object_get_data(G_OBJECT(friendlist),"from"); + store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))); + if (gtk_tree_model_get_iter_first(model,&iter)) { + do{ + gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); + if(chat_view!=NULL){ + if(g_strcmp0(linphone_address_as_string(linphone_friend_get_address(lf)), + linphone_address_as_string(uri))==0){ + gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); + } else { + gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); + } + } + }while(gtk_tree_model_iter_next(model,&iter)); + } +} + static gboolean grab_focus(GtkWidget *w){ gtk_widget_grab_focus(w); return FALSE; @@ -214,6 +239,7 @@ void linphone_gtk_chat_selected(GtkWidget *item){ cr=linphone_gtk_create_chatroom(uri); } page=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + g_object_set_data(G_OBJECT(friendlist),"from",(gpointer)uri); if(page==NULL){ page=linphone_gtk_init_chatroom(cr,uri); g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)page); @@ -221,7 +247,7 @@ void linphone_gtk_chat_selected(GtkWidget *item){ linphone_gtk_load_chatroom(cr,uri,page); } gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,page)); - linphone_gtk_update_chat_picture(FALSE); + linphone_gtk_create_chat_picture(FALSE); g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(page,"text_entry")); gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); } @@ -669,6 +695,7 @@ void linphone_gtk_show_friends(void){ escaped=g_markup_escape_text(uri,-1); gtk_list_store_set(store,&iter,FRIEND_SIP_ADDRESS,escaped,-1); g_free(escaped); + linphone_gtk_update_chat_picture(); //bi=linphone_friend_get_info(lf); /*if (bi!=NULL && bi->image_data!=NULL){ GdkPixbuf *pbuf= @@ -890,7 +917,7 @@ static gint tree_view_get_cell_from_pos(GtkTreeView *view, guint x, guint y){ for (node = columns; node != NULL && col == NULL; node = node->next){ GtkTreeViewColumn *checkcol = (GtkTreeViewColumn*) node->data; gtk_tree_view_column_cell_get_size(checkcol,NULL,NULL,NULL,NULL,&height); - if (x >= colx && x < (colx + checkcol->width) && y < height*coly){ + if (x >= colx && x < (colx + checkcol->width) && y < (height+2)*coly){ col = checkcol; gint num = get_col_number_from_tree_view_column(col); return num; diff --git a/gtk/linphone.h b/gtk/linphone.h index f2b02aace..367b18c26 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -109,7 +109,8 @@ LinphoneChatRoom *linphone_gtk_start_chat(GtkTreeView* t); void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri,GtkWidget *chat_view); void linphone_gtk_send_text(); GtkWidget * linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddress *with); -void linphone_gtk_update_chat_picture(gboolean active); +void linphone_gtk_create_chat_picture(gboolean active); +void linphone_gtk_update_chat_picture(); void linphone_gtk_chat_set_conversation(const LinphoneAddress *uri,gchar *conversation); gchar * linphone_gtk_chat_get_conversation(const LinphoneAddress *uri); From 3016ec37d0ec238b5c70a61d9b52fe39973db56b Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 17 Jan 2013 10:57:59 +0100 Subject: [PATCH 024/281] Fix lpc2xml for old libxml version --- configure.ac | 2 +- tools/lpc2xml.c | 10 +++++++--- tools/lpc2xml.h | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index dc411434a..1d8f92278 100644 --- a/configure.ac +++ b/configure.ac @@ -150,7 +150,7 @@ AC_ARG_ENABLE(tools, dnl check libxml2 (needed for tools) if test "$build_tools" != "false" ; then - PKG_CHECK_MODULES(LIBXML2, [libxml-2.0 >= 2.9 ],[], + PKG_CHECK_MODULES(LIBXML2, [libxml-2.0],[], [ if test "$build_tools" = "true" ; then AC_MSG_ERROR([Could not found libxml2, tools cannot be compiled.]) diff --git a/tools/lpc2xml.c b/tools/lpc2xml.c index 12af75322..feabdde2e 100644 --- a/tools/lpc2xml.c +++ b/tools/lpc2xml.c @@ -21,7 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "lpc2xml.h" #include #include - +#include #define LPC2XML_BZ 2048 @@ -216,7 +216,7 @@ int lpc2xml_convert_fd(lpc2xml_context* context, int fd) { return ret; } -int lpc2xml_convert_string(lpc2xml_context* context, unsigned char **content) { +int lpc2xml_convert_string(lpc2xml_context* context, char **content) { int ret = 0; xmlBufferPtr buffer = xmlBufferCreate(); xmlSaveCtxtPtr save_ctx = xmlSaveToBuffer(buffer, "UTF-8", XML_SAVE_FORMAT); @@ -226,7 +226,11 @@ int lpc2xml_convert_string(lpc2xml_context* context, unsigned char **content) { } xmlSaveClose(save_ctx); if(ret == 0) { - *content = xmlBufferDetach(buffer); +#if LIBXML_VERSION >= 20800 + *content = (char *)xmlBufferDetach(buffer); +#else + *content = strdup((const char *)xmlBufferContent(buffer)); +#endif } xmlBufferFree(buffer); return ret; diff --git a/tools/lpc2xml.h b/tools/lpc2xml.h index f1583109b..025400907 100644 --- a/tools/lpc2xml.h +++ b/tools/lpc2xml.h @@ -40,7 +40,7 @@ int lpc2xml_set_lpc(lpc2xml_context* context, const LpConfig *lpc); int lpc2xml_convert_file(lpc2xml_context* context, const char *filename); int lpc2xml_convert_fd(lpc2xml_context* context, int fd); -int lpc2xml_convert_string(lpc2xml_context* context, unsigned char **content); +int lpc2xml_convert_string(lpc2xml_context* context, char **content); #endif //LPC2XML_H_ From 46ce83799ee2e00281c49c2374bb1d86f9196724 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 17 Jan 2013 11:32:00 +0100 Subject: [PATCH 025/281] Add check to prevent crash. --- coreapi/TunnelManager.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/coreapi/TunnelManager.cc b/coreapi/TunnelManager.cc index 8ce6da7e5..5b1b6dddb 100644 --- a/coreapi/TunnelManager.cc +++ b/coreapi/TunnelManager.cc @@ -107,6 +107,10 @@ void TunnelManager::addServer(const char *ip, int port,unsigned int udpMirrorPor } void TunnelManager::addServer(const char *ip, int port) { + if (ip == NULL) { + ip = ""; + ms_warning("Adding tunnel server with empty ip, it will not work!"); + } mServerAddrs.push_back(ServerAddr(ip,port)); if (mTunnelClient) mTunnelClient->addServer(ip,port); } From 09016bd6cd42fe6b847a5d323bb13058573f7529 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 17 Jan 2013 13:01:11 +0100 Subject: [PATCH 026/281] modified chat_picture update --- gtk/friendlist.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/gtk/friendlist.c b/gtk/friendlist.c index 88204a102..8bdd88ffa 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -188,28 +188,28 @@ void linphone_gtk_create_chat_picture(gboolean active){ } void linphone_gtk_update_chat_picture(){ - GtkTreeIter iter; + /*GtkTreeIter iter; GtkListStore *store=NULL; GtkWidget *w = linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)); GtkWidget *chat_view=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); LinphoneFriend *lf=NULL; - LinphoneAddress *uri=(LinphoneAddress *)g_object_get_data(G_OBJECT(friendlist),"from"); + //LinphoneAddress *uri=(LinphoneAddress *)g_object_get_data(G_OBJECT(friendlist),"from"); store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))); if (gtk_tree_model_get_iter_first(model,&iter)) { do{ gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); if(chat_view!=NULL){ - if(g_strcmp0(linphone_address_as_string(linphone_friend_get_address(lf)), - linphone_address_as_string(uri))==0){ + //if(g_strcmp0(linphone_address_as_string(linphone_friend_get_address(lf)), + // linphone_address_as_string(uri))==0){ gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); - } else { - gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); - } + //} else { + //gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); + //} } }while(gtk_tree_model_iter_next(model,&iter)); - } + }*/ } static gboolean grab_focus(GtkWidget *w){ From d55c0fbf6e48ebe1e14a4ad8772b6d9710f96584 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 17 Jan 2013 13:42:15 +0100 Subject: [PATCH 027/281] fix chat picture update --- gtk/chat.c | 3 ++- gtk/friendlist.c | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index b63144b17..257a55758 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -279,7 +279,7 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), "italic","style", PANGO_STYLE_ITALIC,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), - "small","size",8*PANGO_SCALE,NULL); + "small","size",9*PANGO_SCALE,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), "font_grey","foreground-gdk",&color,NULL); @@ -351,6 +351,7 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const } else { w=linphone_gtk_init_chatroom(room,from); g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); + g_object_set_data(G_OBJECT(friendlist),"from",(gpointer)from); } const char *display=linphone_address_get_display_name(from); diff --git a/gtk/friendlist.c b/gtk/friendlist.c index 8bdd88ffa..5ce869b46 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -188,28 +188,30 @@ void linphone_gtk_create_chat_picture(gboolean active){ } void linphone_gtk_update_chat_picture(){ - /*GtkTreeIter iter; + GtkTreeIter iter; GtkListStore *store=NULL; GtkWidget *w = linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)); GtkWidget *chat_view=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); LinphoneFriend *lf=NULL; - //LinphoneAddress *uri=(LinphoneAddress *)g_object_get_data(G_OBJECT(friendlist),"from"); + LinphoneAddress *uri=(LinphoneAddress *)g_object_get_data(G_OBJECT(friendlist),"from"); store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))); if (gtk_tree_model_get_iter_first(model,&iter)) { do{ gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); if(chat_view!=NULL){ - //if(g_strcmp0(linphone_address_as_string(linphone_friend_get_address(lf)), - // linphone_address_as_string(uri))==0){ - gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); - //} else { - //gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); - //} + if(uri !=NULL) { + if(g_strcmp0(linphone_address_as_string(linphone_friend_get_address(lf)), + linphone_address_as_string(uri))==0){ + gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); + } else { + gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); + } + } } }while(gtk_tree_model_iter_next(model,&iter)); - }*/ + } } static gboolean grab_focus(GtkWidget *w){ From d496d958452a3147eeefb9ba01be233b5b4f0b58 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 17 Jan 2013 16:27:39 +0100 Subject: [PATCH 028/281] Prevent crash when updating SRTP keys if a media is disabled. --- coreapi/linphonecall.c | 52 +++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 3bf93f78e..4465d6f8e 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1667,18 +1667,20 @@ void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescript new_stream = sal_media_description_find_stream(new_md, SalProtoRtpSavp, SalAudio); if (old_stream && new_stream) { const SalStreamDescription *local_st_desc = sal_media_description_find_stream(call->localdesc, SalProtoRtpSavp, SalAudio); - int crypto_idx = find_crypto_index_from_tag(local_st_desc->crypto, new_stream->crypto_local_tag); - if (crypto_idx >= 0) { - audio_stream_enable_srtp(call->audiostream, new_stream->crypto[0].algo, local_st_desc->crypto[crypto_idx].master_key, new_stream->crypto[0].master_key); - call->audiostream_encrypted = TRUE; - } else { - ms_warning("Failed to find local crypto algo with tag: %d", new_stream->crypto_local_tag); - call->audiostream_encrypted = FALSE; - } - for (i = 0; i < SAL_CRYPTO_ALGO_MAX; i++) { - old_stream->crypto[i].tag = new_stream->crypto[i].tag; - old_stream->crypto[i].algo = new_stream->crypto[i].algo; - strncpy(old_stream->crypto[i].master_key, new_stream->crypto[i].master_key, sizeof(old_stream->crypto[i].master_key) - 1); + if (local_st_desc) { + int crypto_idx = find_crypto_index_from_tag(local_st_desc->crypto, new_stream->crypto_local_tag); + if (crypto_idx >= 0) { + audio_stream_enable_srtp(call->audiostream, new_stream->crypto[0].algo, local_st_desc->crypto[crypto_idx].master_key, new_stream->crypto[0].master_key); + call->audiostream_encrypted = TRUE; + } else { + ms_warning("Failed to find local crypto algo with tag: %d", new_stream->crypto_local_tag); + call->audiostream_encrypted = FALSE; + } + for (i = 0; i < SAL_CRYPTO_ALGO_MAX; i++) { + old_stream->crypto[i].tag = new_stream->crypto[i].tag; + old_stream->crypto[i].algo = new_stream->crypto[i].algo; + strncpy(old_stream->crypto[i].master_key, new_stream->crypto[i].master_key, sizeof(old_stream->crypto[i].master_key) - 1); + } } } @@ -1687,18 +1689,20 @@ void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescript new_stream = sal_media_description_find_stream(new_md, SalProtoRtpSavp, SalVideo); if (old_stream && new_stream) { const SalStreamDescription *local_st_desc = sal_media_description_find_stream(call->localdesc, SalProtoRtpSavp, SalVideo); - int crypto_idx = find_crypto_index_from_tag(local_st_desc->crypto, new_stream->crypto_local_tag); - if (crypto_idx >= 0) { - video_stream_enable_strp(call->videostream, new_stream->crypto[0].algo, local_st_desc->crypto[crypto_idx].master_key, new_stream->crypto[0].master_key); - call->videostream_encrypted = TRUE; - } else { - ms_warning("Failed to find local crypto algo with tag: %d", new_stream->crypto_local_tag); - call->videostream_encrypted = FALSE; - } - for (i = 0; i < SAL_CRYPTO_ALGO_MAX; i++) { - old_stream->crypto[i].tag = new_stream->crypto[i].tag; - old_stream->crypto[i].algo = new_stream->crypto[i].algo; - strncpy(old_stream->crypto[i].master_key, new_stream->crypto[i].master_key, sizeof(old_stream->crypto[i].master_key) - 1); + if (local_st_desc) { + int crypto_idx = find_crypto_index_from_tag(local_st_desc->crypto, new_stream->crypto_local_tag); + if (crypto_idx >= 0) { + video_stream_enable_strp(call->videostream, new_stream->crypto[0].algo, local_st_desc->crypto[crypto_idx].master_key, new_stream->crypto[0].master_key); + call->videostream_encrypted = TRUE; + } else { + ms_warning("Failed to find local crypto algo with tag: %d", new_stream->crypto_local_tag); + call->videostream_encrypted = FALSE; + } + for (i = 0; i < SAL_CRYPTO_ALGO_MAX; i++) { + old_stream->crypto[i].tag = new_stream->crypto[i].tag; + old_stream->crypto[i].algo = new_stream->crypto[i].algo; + strncpy(old_stream->crypto[i].master_key, new_stream->crypto[i].master_key, sizeof(old_stream->crypto[i].master_key) - 1); + } } } #endif From ef0eb806a760ae08b09975305092b45e8fbaa3f4 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 17 Jan 2013 18:07:59 +0100 Subject: [PATCH 029/281] Fix uPnP: Better handling of protocol --- coreapi/upnp.c | 99 ++++++++++++++++++++------------------------------ mediastreamer2 | 2 +- 2 files changed, 41 insertions(+), 60 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index d2a9a2423..a3581c2ed 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -19,35 +19,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "upnp.h" #include "private.h" +#include "lpconfig.h" #define UPNP_ADD_MAX_RETRY 4 #define UPNP_REMOVE_MAX_RETRY 4 #define UPNP_SECTION_NAME "uPnP" -/* Define private types */ -typedef struct _LpItem{ - char *key; - char *value; -} LpItem; - -typedef struct _LpSection{ - char *name; - MSList *items; -} LpSection; - -typedef struct _LpConfig{ - FILE *file; - char *filename; - MSList *sections; - int modified; - int readonly; -} LpConfig; - -/* Declare private functions */ -LpSection *lp_config_find_section(LpConfig *lpconfig, const char *name); -void lp_section_remove_item(LpSection *sec, LpItem *item); -void lp_config_set_string(LpConfig *lpconfig,const char *section, const char *key, const char *value); - /* * uPnP Definitions */ @@ -145,8 +122,15 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { const char *ip_address = NULL; const char *connection_status = NULL; bool_t nat_enabled = FALSE; + LinphoneUpnpState old_state; + + if(lupnp == NULL || lupnp->upnp_igd_ctxt == NULL) { + ms_error("uPnP IGD: Invalid context in callback"); + return; + } + ms_mutex_lock(&lupnp->mutex); - LinphoneUpnpState old_state = lupnp->state; + old_state = lupnp->state; switch(event) { case UPNP_IGD_EXTERNAL_IPADDRESS_CHANGED: @@ -315,6 +299,8 @@ UpnpContext* linphone_upnp_context_new(LinphoneCore *lc) { } lupnp->state = LinphoneUpnpStatePending; + upnp_igd_start(lupnp->upnp_igd_ctxt); + return lupnp; } @@ -956,51 +942,46 @@ LinphoneUpnpState linphone_upnp_session_get_state(UpnpSession *session) { * uPnP Config */ -MSList *linphone_upnp_config_list_port_bindings(struct _LpConfig *lpc) { +struct linphone_upnp_config_list_port_bindings_struct { + struct _LpConfig *lpc; + MSList *retList; +}; + +static void linphone_upnp_config_list_port_bindings_cb(const char *entry, struct linphone_upnp_config_list_port_bindings_struct *cookie) { char protocol_str[4]; // TCP or UDP upnp_igd_ip_protocol protocol; int external_port; int local_port; - MSList *retList = NULL; + bool_t valid = TRUE; UpnpPortBinding *port; - bool_t valid; - MSList *elem; - LpItem *item; - LpSection *sec=lp_config_find_section(lpc, UPNP_SECTION_NAME); - if(sec == NULL) - return retList; - - elem = sec->items; - while(elem != NULL) { - item=(LpItem*)elem->data; - valid = TRUE; - if(sscanf(item->key, "%3s-%i-%i", protocol_str, &external_port, &local_port) == 3) { - if(strcasecmp(protocol_str, "TCP") == 0) { - protocol = UPNP_IGD_IP_PROTOCOL_TCP; - } else if(strcasecmp(protocol_str, "UDP") == 0) { - protocol = UPNP_IGD_IP_PROTOCOL_UDP; - } else { - valid = FALSE; - } - if(valid) { - port = linphone_upnp_port_binding_new(); - port->state = LinphoneUpnpStateOk; - port->protocol = protocol; - port->external_port = external_port; - port->local_port = local_port; - retList = ms_list_append(retList, port); - } + if(sscanf(entry, "%3s-%i-%i", protocol_str, &external_port, &local_port) == 3) { + if(strcasecmp(protocol_str, "TCP") == 0) { + protocol = UPNP_IGD_IP_PROTOCOL_TCP; + } else if(strcasecmp(protocol_str, "UDP") == 0) { + protocol = UPNP_IGD_IP_PROTOCOL_UDP; } else { valid = FALSE; } - elem = ms_list_next(elem); - if(!valid) { - ms_warning("uPnP configuration invalid line: %s", item->key); - lp_section_remove_item(sec, item); + if(valid) { + port = linphone_upnp_port_binding_new(); + port->state = LinphoneUpnpStateOk; + port->protocol = protocol; + port->external_port = external_port; + port->local_port = local_port; + cookie->retList = ms_list_append(cookie->retList, port); } + } else { + valid = FALSE; } + if(!valid) { + ms_warning("uPnP configuration invalid line: %s", entry); + } +} - return retList; +MSList *linphone_upnp_config_list_port_bindings(struct _LpConfig *lpc) { + struct linphone_upnp_config_list_port_bindings_struct cookie = {lpc, NULL}; + lp_config_for_each_entry(lpc, UPNP_SECTION_NAME, (void(*)(const char *, void*))linphone_upnp_config_list_port_bindings_cb, &cookie); + return cookie.retList; } void linphone_upnp_config_add_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port) { diff --git a/mediastreamer2 b/mediastreamer2 index 1cf3b8e36..710c3da85 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 1cf3b8e36d832d763220b762c6bceef0db88c04c +Subproject commit 710c3da85157d4db17bfce21e7d2b7853377fa4e From ebfa43d5b22d986b5d0076cd04a8d0e8fbfd7fd8 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 18 Jan 2013 11:48:14 +0100 Subject: [PATCH 030/281] Updated FactoryImpl to change Neon detection in CPUs --- .../core/LinphoneCoreFactoryImpl.java | 28 ++++--------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java index b719f0f70..04b6af1cf 100644 --- a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java @@ -20,8 +20,8 @@ package org.linphone.core; import java.io.File; import java.io.IOException; -import java.io.InputStream; +import org.linphone.CpuUtils; import org.linphone.mediastream.Version; import android.util.Log; @@ -43,6 +43,8 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { loadOptionalLibrary("avutil"); loadOptionalLibrary("swscale"); loadOptionalLibrary("avcore"); + + System.loadLibrary("neon"); if (!hasNeonInCpuFeatures()) { boolean noNeonLibrariesLoaded = loadOptionalLibrary("avcodecnoneon"); @@ -151,28 +153,8 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { public static boolean hasNeonInCpuFeatures() { - ProcessBuilder cmd; - boolean result = false; - - try { - String[] args = {"/system/bin/cat", "/proc/cpuinfo"}; - cmd = new ProcessBuilder(args); - - Process process = cmd.start(); - InputStream in = process.getInputStream(); - byte[] re = new byte[1024]; - while(in.read(re) != -1){ - String line = new String(re); - if (line.contains("Features")) { - result = line.contains("neon"); - break; - } - } - in.close(); - } catch(IOException ex){ - ex.printStackTrace(); - } - return result; + CpuUtils cpu = new CpuUtils(); + return cpu.isCpuNeon(); } public static boolean isArmv7() From 848c200eb156b827a1b8c1345ff357677467a8f3 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 18 Jan 2013 11:57:44 +0100 Subject: [PATCH 031/281] Add "keep_sdp_version" option. --- coreapi/linphonecall.c | 2 -- coreapi/linphonecore.c | 8 ++++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 663e552a9..285678f3a 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1707,8 +1707,6 @@ void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescript void linphone_call_update_remote_session_id_and_ver(LinphoneCall *call) { SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op); if (remote_desc) { - ms_warning("linphone_call_update_remote_session_id_and_ver(): id=%u, ver=%u", - remote_desc->session_id, remote_desc->session_ver); call->remote_session_id = remote_desc->session_id; call->remote_session_ver = remote_desc->session_ver; } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 2336dbfe1..d38b681c1 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2753,6 +2753,7 @@ int linphone_core_start_accept_call_update(LinphoneCore *lc, LinphoneCall *call) **/ int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params){ SalMediaDescription *remote_desc; + bool_t keep_sdp_version; #ifdef VIDEO_ENABLED bool_t old_has_video = call->params.has_video; #endif @@ -2762,11 +2763,10 @@ int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const return -1; } remote_desc = sal_call_get_remote_media_description(call->op); - ms_warning("linphone_core_accept_update(): rmt_id=%u, rmt_ver=%u, call->rmt_id=%u, call->rmt_ver=%u", - remote_desc->session_id, remote_desc->session_ver, call->remote_session_id, call->remote_session_ver); - if ((remote_desc->session_id == call->remote_session_id) && (remote_desc->session_ver == call->remote_session_ver)) { + keep_sdp_version = lp_config_get_int(lc->config, "sip", "keep_sdp_version", 0); + if (keep_sdp_version &&(remote_desc->session_id == call->remote_session_id) && (remote_desc->session_ver == call->remote_session_ver)) { /* Remote has sent an INVITE with the same SDP as before, so send a 200 OK with the same SDP as before. */ - ms_warning("Send same SDP as before!"); + ms_warning("SDP version has not changed, send same SDP as before."); sal_call_accept(call->op); linphone_call_set_state(call,LinphoneCallStreamsRunning,"Connected (streams running)"); return 0; From ade529b01ce4d8554635781846c8dc029426b49b Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 18 Jan 2013 12:06:43 +0100 Subject: [PATCH 032/281] Update ms2 submodule. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index d5811e376..2b00fd885 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit d5811e376759433da3c19585b2d8d0329e1c06b2 +Subproject commit 2b00fd8850748f53404a109473f0243b591ae87b From 2c5cef3bb325535aa66cda0870b6ebb643d5cab9 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 18 Jan 2013 16:04:58 +0100 Subject: [PATCH 033/281] Fix library dependencies linking on Debian based systems. --- configure.ac | 13 +++++++++++++ console/Makefile.am | 7 ++----- gtk/Makefile.am | 6 ++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/configure.ac b/configure.ac index 1d8f92278..10370968c 100644 --- a/configure.ac +++ b/configure.ac @@ -84,6 +84,19 @@ IT_PROG_INTLTOOL([0.40], [no-xml]) AM_CONDITIONAL(BUILD_TESTS,test x$build_tests != xno) dnl Initialize libtool LT_INIT([win32-dll shared disable-static]) +dnl Enable library dependencies linking +AC_ARG_ENABLE(deplibs-link, + [AS_HELP_STRING([--disable-deplibs-link ], [Disable library dependencies linking (might break builds)])], + [enable_deplibs_linking="$enableval"], + [enable_deplibs_linking="yes"]) +AC_MSG_NOTICE([Enable library dependencies linking: $enable_interlib_deps]) +if test "${enable_deplibs_linking}" == "yes"; then + link_all_deplibs=yes + link_all_deplibs_CXX=yes +else + link_all_deplibs=no + link_all_deplibs_CXX=no +fi AC_CONFIG_COMMANDS([libtool-hacking],[ if test "$mingw_found" = "yes" ; then diff --git a/console/Makefile.am b/console/Makefile.am index 23a7635d1..82ce998e5 100644 --- a/console/Makefile.am +++ b/console/Makefile.am @@ -26,11 +26,8 @@ endif linphonec_SOURCES=linphonec.c linphonec.h commands.c linphonec_CFLAGS=$(COMMON_CFLAGS) $(CONSOLE_FLAGS) -linphonec_LDADD=$(top_builddir)/coreapi/liblinphone.la $(READLINE_LIBS) \ - $(MEDIASTREAMER_LIBS) \ - $(ORTP_LIBS) \ - $(SPEEX_LIBS) \ - $(OSIP_LIBS) \ +linphonec_LDADD=$(top_builddir)/coreapi/liblinphone.la \ + $(READLINE_LIBS) \ $(X11_LIBS) if BUILD_WIN32 diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 78f5d0de7..1caded7c6 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -53,10 +53,8 @@ linphone_SOURCES+= \ setupwizard.c endif -linphone_LDADD=$(ORTP_LIBS) \ - $(MEDIASTREAMER_LIBS) \ - $(top_builddir)/coreapi/liblinphone.la \ - $(LIBGTK_LIBS) $(NOTIFY1_LIBS) $(NOTIFY4_LIBS) $(LIBGTKMAC_LIBS) $(INTLLIBS) +linphone_LDADD= $(top_builddir)/coreapi/liblinphone.la \ + $(LIBGTK_LIBS) $(NOTIFY1_LIBS) $(NOTIFY4_LIBS) $(LIBGTKMAC_LIBS) $(INTLLIBS) if BUILD_WIN32 From 622af47cb2f519b832a72049ddd2fdc4ea32cce4 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 21 Jan 2013 11:25:38 +0100 Subject: [PATCH 034/281] Add tcp_tls_keepalive configuration option to (de)activate SIP keepalive for TCP/TLS. --- coreapi/linphonecore.c | 4 +++- coreapi/private.h | 1 + coreapi/sal.h | 1 + coreapi/sal_eXosip2.c | 24 ++++++++++++++++++++---- coreapi/sal_eXosip2.h | 2 ++ 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 28488e1dd..3904afc9b 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -635,7 +635,8 @@ static void sip_config_read(LinphoneCore *lc) lc->sip_conf.ping_with_options=lp_config_get_int(lc->config,"sip","ping_with_options",1); lc->sip_conf.auto_net_state_mon=lp_config_get_int(lc->config,"sip","auto_net_state_mon",1); lc->sip_conf.keepalive_period=lp_config_get_int(lc->config,"sip","keepalive_period",10000); - sal_set_keepalive_period(lc->sal,lc->sip_conf.keepalive_period); + lc->sip_conf.tcp_tls_keepalive=lp_config_get_int(lc->config,"sip","tcp_tls_keepalive",0); + linphone_core_enable_keep_alive(lc, (lc->sip_conf.keepalive_period > 0)); sal_use_one_matching_codec_policy(lc->sal,lp_config_get_int(lc->config,"sip","only_one_codec",0)); sal_use_double_registrations(lc->sal,lp_config_get_int(lc->config,"sip","use_double_registrations",1)); sal_use_dates(lc->sal,lp_config_get_int(lc->config,"sip","put_date",0)); @@ -5170,6 +5171,7 @@ const char *linphone_error_to_string(LinphoneReason err){ */ void linphone_core_enable_keep_alive(LinphoneCore* lc,bool_t enable) { if (enable > 0) { + sal_use_tcp_tls_keepalive(lc->sal,lc->sip_conf.tcp_tls_keepalive); sal_set_keepalive_period(lc->sal,lc->sip_conf.keepalive_period); } else { sal_set_keepalive_period(lc->sal,0); diff --git a/coreapi/private.h b/coreapi/private.h index 5c09974b7..edb717ae3 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -399,6 +399,7 @@ typedef struct sip_config bool_t register_only_when_network_is_up; bool_t ping_with_options; bool_t auto_net_state_mon; + bool_t tcp_tls_keepalive; } sip_config_t; typedef struct rtp_config diff --git a/coreapi/sal.h b/coreapi/sal.h index 9c0ceca76..ba6daa221 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -343,6 +343,7 @@ ortp_socket_t sal_get_socket(Sal *ctx); void sal_set_user_agent(Sal *ctx, const char *user_agent); /*keepalive period in ms*/ void sal_set_keepalive_period(Sal *ctx,unsigned int value); +void sal_use_tcp_tls_keepalive(Sal *ctx, bool_t enabled); /** * returns keepalive period in ms * 0 desactiaved diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 93686a75e..d8332621d 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -397,7 +397,8 @@ int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int i bool_t ipv6; int proto=IPPROTO_UDP; int keepalive = ctx->keepalive_period; - + + ctx->transport = tr; switch (tr) { case SalTransportUDP: proto=IPPROTO_UDP; @@ -406,7 +407,7 @@ int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int i case SalTransportTCP: case SalTransportTLS: proto= IPPROTO_TCP; - keepalive=-1; + if (!ctx->tcp_tls_keepalive) keepalive=-1; eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive); set_tls_options(ctx); break; @@ -2512,9 +2513,24 @@ void sal_address_destroy(SalAddress *u){ osip_from_free((osip_from_t*)u); } +void sal_use_tcp_tls_keepalive(Sal *ctx, bool_t enabled) { + ctx->tcp_tls_keepalive = enabled; +} + void sal_set_keepalive_period(Sal *ctx,unsigned int value) { - ctx->keepalive_period=value; - eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value); + switch (ctx->transport) { + case SalTransportUDP: + ctx->keepalive_period = value; + break; + case SalTransportTCP: + case SalTransportTLS: + if (ctx->tcp_tls_keepalive) ctx->keepalive_period = value; + else ctx->keepalive_period = -1; + break; + default: + break; + } + eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &ctx->keepalive_period); } unsigned int sal_get_keepalive_period(Sal *ctx) { return ctx->keepalive_period; diff --git a/coreapi/sal_eXosip2.h b/coreapi/sal_eXosip2.h index 89ac93abf..81e3ed9a7 100644 --- a/coreapi/sal_eXosip2.h +++ b/coreapi/sal_eXosip2.h @@ -30,6 +30,7 @@ int sdp_to_media_description(sdp_message_t *sdp, SalMediaDescription *desc); struct Sal{ SalCallbacks callbacks; + SalTransport transport; MSList *calls; /*MSList of SalOp */ MSList *registers;/*MSList of SalOp */ MSList *out_subscribes;/*MSList of SalOp */ @@ -51,6 +52,7 @@ struct Sal{ bool_t verify_server_cn; bool_t expire_old_contact; bool_t add_dates; + bool_t tcp_tls_keepalive; }; struct SalOp{ From a6c141062397872c64e17ad6b8360888d3c3e6f0 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 21 Jan 2013 12:01:41 +0100 Subject: [PATCH 035/281] Use random port instead of fixed 15060 for tunnel transport. --- coreapi/TunnelManager.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/TunnelManager.cc b/coreapi/TunnelManager.cc index 5b1b6dddb..4828bf114 100644 --- a/coreapi/TunnelManager.cc +++ b/coreapi/TunnelManager.cc @@ -257,7 +257,7 @@ void TunnelManager::processTunnelEvent(const Event &ev){ //force transport to udp LCSipTransports lTransport; - lTransport.udp_port=15060; + lTransport.udp_port=(0xDFFF&random())+1024; lTransport.tcp_port=0; lTransport.tls_port=0; lTransport.dtls_port=0; From a2019a94f33c22668ed0ab3c7f849564206aadb0 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 21 Jan 2013 12:02:40 +0100 Subject: [PATCH 036/281] Update ms2 submodule. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 2b00fd885..3a231efb8 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 2b00fd8850748f53404a109473f0243b591ae87b +Subproject commit 3a231efb89305d775ab39a6866ee981a891aed7e From 7e06844a252e4e55355076ffecf4c434b297e13e Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 21 Jan 2013 12:41:46 +0100 Subject: [PATCH 037/281] enhance liblinphone documentation --- coreapi/linphonecore.c | 59 ++++++++++++++++++++++++++++++++++++------ coreapi/linphonecore.h | 12 ++------- 2 files changed, 53 insertions(+), 18 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 3904afc9b..1ed5ef62f 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -922,11 +922,14 @@ bool_t linphone_core_tunnel_available(void){ } /** - * Enable adaptive rate control (experimental feature, audio-only). + * Enable adaptive rate control. + * + * @ingroup media_parameters * * Adaptive rate control consists in using RTCP feedback provided information to dynamically - * control the output bitrate of the encoders, so that we can adapt to the network conditions and - * available bandwidth. + * control the output bitrate of the audio and video encoders, so that we can adapt to the network conditions and + * available bandwidth. Control of the audio encoder is done in case of audio-only call, and control of the video encoder is done for audio & video calls. + * Adaptive rate control feature is enabled by default. **/ void linphone_core_enable_adaptive_rate_control(LinphoneCore *lc, bool_t enabled){ lp_config_set_int(lc->config,"net","adaptive_rate_control",(int)enabled); @@ -934,6 +937,8 @@ void linphone_core_enable_adaptive_rate_control(LinphoneCore *lc, bool_t enabled /** * Returns whether adaptive rate control is enabled. + * + * @ingroup media_parameters * * See linphone_core_enable_adaptive_rate_control(). **/ @@ -1006,14 +1011,18 @@ int linphone_core_get_upload_bandwidth(const LinphoneCore *lc){ return lc->net_conf.upload_bw; } /** - * Set audio packetization time linphone expects to receive from peer + * Set audio packetization time linphone expects to receive from peer. + * A value of zero means that ptime is not specified. + * @ingroup media_parameters */ void linphone_core_set_download_ptime(LinphoneCore *lc, int ptime) { lp_config_set_int(lc->config,"rtp","download_ptime",ptime); } /** - * Get audio packetization time linphone expects to receive from peer + * Get audio packetization time linphone expects to receive from peer. + * A value of zero means that ptime is not specified. + * @ingroup media_parameters */ int linphone_core_get_download_ptime(LinphoneCore *lc) { return lp_config_get_int(lc->config,"rtp","download_ptime",0); @@ -1023,6 +1032,7 @@ int linphone_core_get_download_ptime(LinphoneCore *lc) { * Set audio packetization time linphone will send (in absence of requirement from peer) * A value of 0 stands for the current codec default packetization time. * + * @ingroup media_parameters **/ void linphone_core_set_upload_ptime(LinphoneCore *lc, int ptime){ lp_config_set_int(lc->config,"rtp","upload_ptime",ptime); @@ -1032,6 +1042,8 @@ void linphone_core_set_upload_ptime(LinphoneCore *lc, int ptime){ * Set audio packetization time linphone will send (in absence of requirement from peer) * A value of 0 stands for the current codec default packetization time. * + * + * @ingroup media_parameters **/ int linphone_core_get_upload_ptime(LinphoneCore *lc){ return lp_config_get_int(lc->config,"rtp","upload_ptime",0); @@ -1265,6 +1277,7 @@ LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable, * structure holding the codec information. * It is possible to make copy of the list with ms_list_copy() in order to modify it * (such as the order of codecs). + * @ingroup media_parameters **/ const MSList *linphone_core_get_audio_codecs(const LinphoneCore *lc) { @@ -1278,6 +1291,7 @@ const MSList *linphone_core_get_audio_codecs(const LinphoneCore *lc) * structure holding the codec information. * It is possible to make copy of the list with ms_list_copy() in order to modify it * (such as the order of codecs). + * @ingroup media_parameters **/ const MSList *linphone_core_get_video_codecs(const LinphoneCore *lc) { @@ -1567,6 +1581,7 @@ void linphone_core_set_audio_port(LinphoneCore *lc, int port) /** * Sets the UDP port range from which to randomly select the port used for audio streaming. + * @ingroup media_parameters */ void linphone_core_set_audio_port_range(LinphoneCore *lc, int min_port, int max_port) { @@ -1585,6 +1600,7 @@ void linphone_core_set_video_port(LinphoneCore *lc, int port){ /** * Sets the UDP port range from which to randomly select the port used for video streaming. + * @ingroup media_parameters */ void linphone_core_set_video_port_range(LinphoneCore *lc, int min_port, int max_port) { @@ -2054,6 +2070,8 @@ void linphone_core_iterate(LinphoneCore *lc){ /** * Interpret a call destination as supplied by the user, and returns a fully qualified * LinphoneAddress. + * + * @ingroup call_control * * A sip address should look like DisplayName . * Basically this function performs the following tasks @@ -2498,6 +2516,7 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const /** * Performs a simple call transfer to the specified destination. * + * @ingroup call_control * The remote endpoint is expected to issue a new call to the specified destination. * The current call remains active and thus can be later paused or terminated. **/ @@ -2528,6 +2547,8 @@ int linphone_core_transfer_call(LinphoneCore *lc, LinphoneCall *call, const char * @param lc linphone core object * @param call a running call you want to transfer * @param dest a running call whose remote person will receive the transfer + * + * @ingroup call_control * * The transfered call is supposed to be in paused state, so that it is able to accept the transfer immediately. * The destination call is a call previously established to introduce the transfered person. @@ -3024,6 +3045,9 @@ int linphone_core_terminate_call(LinphoneCore *lc, LinphoneCall *the_call) /** * Decline a pending incoming call, with a reason. + * + * @ingroup call_control + * * @param lc the linphone core * @param call the LinphoneCall, must be in the IncomingReceived state. * @param reason the reason for rejecting the call: LinphoneReasonDeclined or LinphoneReasonBusy @@ -3143,6 +3167,7 @@ int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call) /** * Pause all currently running calls. + * @ingroup call_control **/ int linphone_core_pause_all_calls(LinphoneCore *lc){ const MSList *elem; @@ -3219,6 +3244,8 @@ static int remote_address_compare(LinphoneCall *call, const LinphoneAddress *rad * @param lc * @param remote_address * @return the LinphoneCall of the call if found + * + * @ingroup call_control */ LinphoneCall *linphone_core_get_call_by_remote_address(LinphoneCore *lc, const char *remote_address){ LinphoneAddress *raddr=linphone_address_new(remote_address); @@ -3692,18 +3719,18 @@ const char *linphone_core_get_ring(const LinphoneCore *lc){ * @param path * @param lc The LinphoneCore object * - * @ingroup media_parameters + * @ingroup initializing **/ void linphone_core_set_root_ca(LinphoneCore *lc,const char *path){ sal_set_root_ca(lc->sal, path); } /** - * Gets the path to a file or folder containing trusted root CAs (PEM format) + * Gets the path to a file or folder containing the trusted root CAs (PEM format) * * @param lc The LinphoneCore object * - * @ingroup media_parameters + * @ingroup initializing **/ const char *linphone_core_get_root_ca(LinphoneCore *lc){ return sal_get_root_ca(lc->sal); @@ -3711,6 +3738,8 @@ const char *linphone_core_get_root_ca(LinphoneCore *lc){ /** * Specify whether the tls server certificate must be verified when connecting to a SIP/TLS server. + * + * @ingroup initializing **/ void linphone_core_verify_server_certificates(LinphoneCore *lc, bool_t yesno){ sal_verify_server_certificates(lc->sal,yesno); @@ -3718,6 +3747,7 @@ void linphone_core_verify_server_certificates(LinphoneCore *lc, bool_t yesno){ /** * Specify whether the tls server certificate common name must be verified when connecting to a SIP/TLS server. + * @ingroup initializing **/ void linphone_core_verify_server_cn(LinphoneCore *lc, bool_t yesno){ sal_verify_server_cn(lc->sal,yesno); @@ -4641,6 +4671,12 @@ void *linphone_core_get_user_data(LinphoneCore *lc){ return lc->data; } + +/** + * Associate a user pointer to the linphone core. + * + * @ingroup initializing +**/ void linphone_core_set_user_data(LinphoneCore *lc, void *userdata){ lc->data=userdata; } @@ -4649,6 +4685,13 @@ int linphone_core_get_mtu(const LinphoneCore *lc){ return lc->net_conf.mtu; } +/** + * Sets the maximum transmission unit size in bytes. + * This information is useful for sending RTP packets. + * Default value is 1500. + * + * @ingroup media_parameters +**/ void linphone_core_set_mtu(LinphoneCore *lc, int mtu){ lc->net_conf.mtu=mtu; if (mtu>0){ diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 55198e319..3acac8fde 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1006,16 +1006,8 @@ int linphone_core_get_upload_bandwidth(const LinphoneCore *lc); void linphone_core_enable_adaptive_rate_control(LinphoneCore *lc, bool_t enabled); bool_t linphone_core_adaptive_rate_control_enabled(const LinphoneCore *lc); -/** - * set audio packetization time linphone expect to receive from peer - * @ingroup media_parameters - * - */ + void linphone_core_set_download_ptime(LinphoneCore *lc, int ptime); -/** - * get audio packetization time linphone expect to receive from peer, 0 means unspecified - * @ingroup media_parameters - */ int linphone_core_get_download_ptime(LinphoneCore *lc); void linphone_core_set_upload_ptime(LinphoneCore *lc, int ptime); @@ -1046,7 +1038,7 @@ int linphone_core_enable_payload_type(LinphoneCore *lc, PayloadType *pt, bool_t */ #define LINPHONE_FIND_PAYLOAD_IGNORE_CHANNELS -1 /** - * Get payload type from mime type and clock rate + * Get payload type from mime type and clock rate * @ingroup media_parameters * This function searches in audio and video codecs for the given payload type name and clockrate. * @param lc #LinphoneCore object From 83ea53b5998131177ca37009f6dbb06736f39709 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Tue, 22 Jan 2013 18:10:45 +0100 Subject: [PATCH 038/281] Patch preventing chmod on /dev/null --- coreapi/lpconfig.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/coreapi/lpconfig.c b/coreapi/lpconfig.c index 8457cf650..4608beecf 100644 --- a/coreapi/lpconfig.c +++ b/coreapi/lpconfig.c @@ -215,14 +215,17 @@ LpConfig * lp_config_new(const char *filename){ lpconfig->filename=ortp_strdup(filename); lpconfig->file=fopen(filename,"rw"); if (lpconfig->file!=NULL){ + struct stat fileStat; lp_config_parse(lpconfig,lpconfig->file); - fclose(lpconfig->file); + fclose(lpconfig->file); #if !defined(_WIN32_WCE) - /* make existing configuration files non-group/world-accessible */ - if (chmod(filename, S_IRUSR | S_IWUSR) == -1) - ms_warning("unable to correct permissions on " - "configuration file: %s", - strerror(errno)); + if ((stat(filename,&fileStat) == 0) && (S_ISREG(fileStat.st_mode))) { + /* make existing configuration files non-group/world-accessible */ + if (chmod(filename, S_IRUSR | S_IWUSR) == -1) { + ms_warning("unable to correct permissions on " + "configuration file: %s", strerror(errno)); + } + } #endif /*_WIN32_WCE*/ lpconfig->file=NULL; lpconfig->modified=0; From 39bbe2656bec0e51b8b0c7cffd92faf38de2cd7a Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 22 Jan 2013 11:39:05 +0100 Subject: [PATCH 039/281] Keep the total number of streams and the number of active streams in the media description. This is to respect section 8 of RFC 3264 ("Modifying the Session"). The number of streams in the SDP MUST NOT decrease. --- coreapi/callbacks.c | 6 ++--- coreapi/linphonecall.c | 55 ++++++++++++++++++++++++++------------- coreapi/linphonecore.c | 2 +- coreapi/misc.c | 14 +++++----- coreapi/offeranswer.c | 28 +++++++++++--------- coreapi/sal.c | 16 +++++------- coreapi/sal.h | 3 ++- coreapi/sal_eXosip2.c | 21 +++++++-------- coreapi/sal_eXosip2_sdp.c | 8 ++++-- 9 files changed, 87 insertions(+), 66 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 7985f3658..784c1f1bd 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -41,14 +41,14 @@ void linphone_core_update_streams_destinations(LinphoneCore *lc, LinphoneCall *c char *rtp_addr, *rtcp_addr; int i; - for (i = 0; i < old_md->nstreams; i++) { + for (i = 0; i < old_md->n_active_streams; i++) { if (old_md->streams[i].type == SalAudio) { old_audiodesc = &old_md->streams[i]; } else if (old_md->streams[i].type == SalVideo) { old_videodesc = &old_md->streams[i]; } } - for (i = 0; i < new_md->nstreams; i++) { + for (i = 0; i < new_md->n_active_streams; i++) { if (new_md->streams[i].type == SalAudio) { new_audiodesc = &new_md->streams[i]; } else if (new_md->streams[i].type == SalVideo) { @@ -591,7 +591,7 @@ static void call_failure(SalOp *op, SalError error, SalReason sr, const char *de if (call->state==LinphoneCallOutgoingInit || call->state==LinphoneCallOutgoingProgress){ /* clear SRTP local params */ call->params.media_encryption = LinphoneMediaEncryptionNone; - for(i=0; ilocaldesc->nstreams; i++) { + for(i=0; ilocaldesc->n_active_streams; i++) { call->localdesc->streams[i].proto = SalProtoRtpAvp; memset(call->localdesc->streams[i].crypto, 0, sizeof(call->localdesc->streams[i].crypto)); } diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 6ef8e0c55..d918057e9 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -173,9 +173,10 @@ void linphone_call_set_authentication_token_verified(LinphoneCall *call, bool_t propagate_encryption_changed(call); } -static MSList *make_codec_list(LinphoneCore *lc, const MSList *codecs, int bandwidth_limit,int* max_sample_rate){ +static MSList *make_codec_list(LinphoneCore *lc, const MSList *codecs, int bandwidth_limit,int* max_sample_rate, int nb_codecs_limit){ MSList *l=NULL; const MSList *it; + int nb = 0; if (max_sample_rate) *max_sample_rate=0; for(it=codecs;it!=NULL;it=it->next){ PayloadType *pt=(PayloadType*)it->data; @@ -186,26 +187,30 @@ static MSList *make_codec_list(LinphoneCore *lc, const MSList *codecs, int bandw } if (linphone_core_check_payload_type_usability(lc,pt)){ l=ms_list_append(l,payload_type_clone(pt)); + nb++; if (max_sample_rate && payload_type_get_rate(pt)>*max_sample_rate) *max_sample_rate=payload_type_get_rate(pt); } } + if ((nb_codecs_limit > 0) && (nb >= nb_codecs_limit)) break; } return l; } static void update_media_description_from_stun(SalMediaDescription *md, const StunCandidate *ac, const StunCandidate *vc){ - if (ac->port!=0){ - strcpy(md->streams[0].rtp_addr,ac->addr); - md->streams[0].rtp_port=ac->port; - if ((ac->addr[0]!='\0' && vc->addr[0]!='\0' && strcmp(ac->addr,vc->addr)==0) || md->nstreams==1){ - strcpy(md->addr,ac->addr); + int i; + for (i = 0; i < md->n_active_streams; i++) { + if ((md->streams[i].type == SalAudio) && (ac->port != 0)) { + strcpy(md->streams[0].rtp_addr,ac->addr); + md->streams[0].rtp_port=ac->port; + if ((ac->addr[0]!='\0' && vc->addr[0]!='\0' && strcmp(ac->addr,vc->addr)==0) || md->n_active_streams==1){ + strcpy(md->addr,ac->addr); + } + } + if ((md->streams[i].type == SalVideo) && (vc->port != 0)) { + strcpy(md->streams[1].rtp_addr,vc->addr); + md->streams[1].rtp_port=vc->port; } } - if (vc->port!=0){ - strcpy(md->streams[1].rtp_addr,vc->addr); - md->streams[1].rtp_port=vc->port; - } - } void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *call){ @@ -218,12 +223,13 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * const char *username=linphone_address_get_username (addr); SalMediaDescription *md=sal_media_description_new(); bool_t keep_srtp_keys=lp_config_get_int(lc->config,"sip","keep_srtp_keys",0); - + linphone_core_adapt_to_network(lc,call->ping_time,&call->params); md->session_id=(old_md ? old_md->session_id : (rand() & 0xfff)); md->session_ver=(old_md ? (old_md->session_ver+1) : (rand() & 0xfff)); - md->nstreams=1; + md->n_total_streams=(old_md ? old_md->n_total_streams : 1); + md->n_active_streams=1; strncpy(md->addr,call->localip,sizeof(md->addr)); strncpy(md->username,username,sizeof(md->username)); @@ -243,22 +249,35 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * md->streams[0].ptime=call->params.down_ptime; else md->streams[0].ptime=linphone_core_get_download_ptime(lc); - l=make_codec_list(lc,lc->codecs_conf.audio_codecs,call->params.audio_bw,&md->streams[0].max_rate); + l=make_codec_list(lc,lc->codecs_conf.audio_codecs,call->params.audio_bw,&md->streams[0].max_rate,-1); pt=payload_type_clone(rtp_profile_get_payload_from_mime(lc->default_profile,"telephone-event")); l=ms_list_append(l,pt); md->streams[0].payloads=l; if (call->params.has_video){ - md->nstreams++; + md->n_active_streams++; md->streams[1].rtp_port=call->video_port; md->streams[1].rtcp_port=call->video_port+1; md->streams[1].proto=md->streams[0].proto; md->streams[1].type=SalVideo; - l=make_codec_list(lc,lc->codecs_conf.video_codecs,0,NULL); + l=make_codec_list(lc,lc->codecs_conf.video_codecs,0,NULL,-1); md->streams[1].payloads=l; } - - for(i=0; instreams; i++) { + if (md->n_total_streams < md->n_active_streams) + md->n_total_streams = md->n_active_streams; + + /* Deactivate inactive streams. */ + for (i = md->n_active_streams; i < md->n_total_streams; i++) { + md->streams[i].rtp_port = 0; + md->streams[i].rtcp_port = 0; + md->streams[i].proto = SalProtoRtpAvp; + md->streams[i].type = old_md->streams[i].type; + md->streams[i].dir = SalStreamInactive; + l = make_codec_list(lc, lc->codecs_conf.video_codecs, 0, NULL, 1); + md->streams[i].payloads = l; + } + + for(i=0; in_active_streams; i++) { if (md->streams[i].proto == SalProtoRtpSavp) { if (keep_srtp_keys && old_md && old_md->streams[i].proto==SalProtoRtpSavp){ int j; diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 1ed5ef62f..20788eb16 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2576,7 +2576,7 @@ bool_t linphone_core_inc_invite_pending(LinphoneCore*lc){ bool_t linphone_core_incompatible_security(LinphoneCore *lc, SalMediaDescription *md){ if (linphone_core_is_media_encryption_mandatory(lc) && linphone_core_get_media_encryption(lc)==LinphoneMediaEncryptionSRTP){ int i; - for(i=0;instreams;i++){ + for(i=0;in_active_streams;i++){ SalStreamDescription *sd=&md->streams[i]; if (sd->proto!=SalProtoRtpSavp){ return TRUE; diff --git a/coreapi/misc.c b/coreapi/misc.c index 53f0d65cf..b8041c433 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -734,7 +734,7 @@ void linphone_core_update_local_media_description_from_ice(SalMediaDescription * } strncpy(desc->ice_pwd, ice_session_local_pwd(session), sizeof(desc->ice_pwd)); strncpy(desc->ice_ufrag, ice_session_local_ufrag(session), sizeof(desc->ice_ufrag)); - for (i = 0; i < desc->nstreams; i++) { + for (i = 0; i < desc->n_active_streams; i++) { SalStreamDescription *stream = &desc->streams[i]; IceCheckList *cl = ice_session_check_list(session, i); nb_candidates = 0; @@ -838,7 +838,7 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call, ice_session_restart(call->ice_session); ice_restarted = TRUE; } else { - for (i = 0; i < md->nstreams; i++) { + for (i = 0; i < md->n_total_streams; i++) { const SalStreamDescription *stream = &md->streams[i]; IceCheckList *cl = ice_session_check_list(call->ice_session, i); if (cl && (strcmp(stream->rtp_addr, "0.0.0.0") == 0)) { @@ -857,7 +857,7 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call, } ice_session_set_remote_credentials(call->ice_session, md->ice_ufrag, md->ice_pwd); } - for (i = 0; i < md->nstreams; i++) { + for (i = 0; i < md->n_total_streams; i++) { const SalStreamDescription *stream = &md->streams[i]; IceCheckList *cl = ice_session_check_list(call->ice_session, i); if (cl && (stream->ice_pwd[0] != '\0') && (stream->ice_ufrag[0] != '\0')) { @@ -873,7 +873,7 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call, } /* Create ICE check lists if needed and parse ICE attributes. */ - for (i = 0; i < md->nstreams; i++) { + for (i = 0; i < md->n_total_streams; i++) { const SalStreamDescription *stream = &md->streams[i]; IceCheckList *cl = ice_session_check_list(call->ice_session, i); if (cl == NULL) { @@ -930,7 +930,7 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call, } } } - for (i = ice_session_nb_check_lists(call->ice_session); i > md->nstreams; i--) { + for (i = ice_session_nb_check_lists(call->ice_session); i > md->n_active_streams; i--) { ice_session_remove_check_list(call->ice_session, ice_session_check_list(call->ice_session, i - 1)); } ice_session_check_mismatch(call->ice_session); @@ -948,8 +948,8 @@ bool_t linphone_core_media_description_contains_video_stream(const SalMediaDescr { int i; - for (i = 0; i < md->nstreams; i++) { - if ((md->streams[i].type == SalVideo) && (md->streams[i].rtp_port != 0)) + for (i = 0; i < md->n_active_streams; i++) { + if (md->streams[i].type == SalVideo) return TRUE; } return FALSE; diff --git a/coreapi/offeranswer.c b/coreapi/offeranswer.c index 541a1eee3..ab38f7636 100644 --- a/coreapi/offeranswer.c +++ b/coreapi/offeranswer.c @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "sal.h" #include "offeranswer.h" +#include "private.h" static bool_t only_telephone_event(const MSList *l){ for(;l!=NULL;l=l->next){ @@ -267,22 +268,23 @@ static void initiate_incoming(const SalStreamDescription *local_cap, * and the returned response (remote). **/ int offer_answer_initiate_outgoing(const SalMediaDescription *local_offer, - const SalMediaDescription *remote_answer, - SalMediaDescription *result){ - int i,j; - + const SalMediaDescription *remote_answer, + SalMediaDescription *result){ + int i,j; + const SalStreamDescription *ls,*rs; - for(i=0,j=0;instreams;++i){ + for(i=0,j=0;in_total_streams;++i){ ms_message("Processing for stream %i",i); ls=&local_offer->streams[i]; rs=sal_media_description_find_stream((SalMediaDescription*)remote_answer,ls->proto,ls->type); - if (rs) { + if (rs) { initiate_outgoing(ls,rs,&result->streams[j]); ++j; } else ms_warning("No matching stream for %i",i); } - result->nstreams=j; + result->n_active_streams=j; + result->n_total_streams=local_offer->n_total_streams; result->bandwidth=remote_answer->bandwidth; strcpy(result->addr,remote_answer->addr); return 0; @@ -294,12 +296,13 @@ int offer_answer_initiate_outgoing(const SalMediaDescription *local_offer, * The returned media description is an answer and should be sent to the offerer. **/ int offer_answer_initiate_incoming(const SalMediaDescription *local_capabilities, - const SalMediaDescription *remote_offer, - SalMediaDescription *result, bool_t one_matching_codec){ + const SalMediaDescription *remote_offer, + SalMediaDescription *result, bool_t one_matching_codec){ int i; const SalStreamDescription *ls=NULL,*rs; - - for(i=0;instreams;++i){ + + result->n_active_streams=0; + for(i=0;in_total_streams;++i){ rs=&remote_offer->streams[i]; if (rs->proto!=SalProtoUnknown){ ls=sal_media_description_find_stream((SalMediaDescription*)local_capabilities,rs->proto,rs->type); @@ -310,6 +313,7 @@ int offer_answer_initiate_incoming(const SalMediaDescription *local_capabilities }else ms_warning("Unknown protocol for mline %i, declining",i); if (ls){ initiate_incoming(ls,rs,&result->streams[i],one_matching_codec); + result->n_active_streams++; } else { /* create an inactive stream for the answer, as there where no matching stream a local capability */ @@ -322,7 +326,7 @@ int offer_answer_initiate_incoming(const SalMediaDescription *local_capabilities } } } - result->nstreams=i; + result->n_total_streams=i; strcpy(result->username, local_capabilities->username); strcpy(result->addr,local_capabilities->addr); result->bandwidth=local_capabilities->bandwidth; diff --git a/coreapi/sal.c b/coreapi/sal.c index 2b09212aa..05d03499d 100644 --- a/coreapi/sal.c +++ b/coreapi/sal.c @@ -76,7 +76,7 @@ void sal_media_description_unref(SalMediaDescription *md){ SalStreamDescription *sal_media_description_find_stream(SalMediaDescription *md, SalMediaProto proto, SalStreamType type){ int i; - for(i=0;instreams;++i){ + for(i=0;in_active_streams;++i){ SalStreamDescription *ss=&md->streams[i]; if (ss->proto==proto && ss->type==type) return ss; } @@ -84,17 +84,13 @@ SalStreamDescription *sal_media_description_find_stream(SalMediaDescription *md, } bool_t sal_media_description_empty(const SalMediaDescription *md){ - int i; - for(i=0;instreams;++i){ - const SalStreamDescription *ss=&md->streams[i]; - if (ss->rtp_port!=0) return FALSE; - } + if (md->n_active_streams > 0) return FALSE; return TRUE; } void sal_media_description_set_dir(SalMediaDescription *md, SalStreamDir stream_dir){ int i; - for(i=0;instreams;++i){ + for(i=0;in_active_streams;++i){ SalStreamDescription *ss=&md->streams[i]; ss->dir=stream_dir; } @@ -110,7 +106,7 @@ static bool_t has_dir(const SalMediaDescription *md, SalStreamDir stream_dir){ int i; /* we are looking for at least one stream with requested direction, inactive streams are ignored*/ - for(i=0;instreams;++i){ + for(i=0;in_active_streams;++i){ const SalStreamDescription *ss=&md->streams[i]; if (ss->dir==stream_dir) return TRUE; /*compatibility check for phones that only used the null address and no attributes */ @@ -224,9 +220,9 @@ int sal_media_description_equals(const SalMediaDescription *md1, const SalMediaD int i; if (strcmp(md1->addr, md2->addr) != 0) result |= SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED; - if (md1->nstreams != md2->nstreams) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED; + if (md1->n_total_streams != md2->n_total_streams) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED; if (md1->bandwidth != md2->bandwidth) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED; - for(i = 0; i < md1->nstreams; ++i){ + for(i = 0; i < md1->n_total_streams; ++i){ result |= sal_stream_description_equals(&md1->streams[i], &md2->streams[i]); } return result; diff --git a/coreapi/sal.h b/coreapi/sal.h index ba6daa221..6baae97ae 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -178,7 +178,8 @@ typedef struct SalMediaDescription{ int refcount; char addr[64]; char username[64]; - int nstreams; + int n_active_streams; + int n_total_streams; int bandwidth; unsigned int session_ver; unsigned int session_id; diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index d8332621d..1cbecb638 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -589,18 +589,15 @@ static void sdp_process(SalOp *h){ strcpy(h->result->addr,h->base.remote_media->addr); h->result->bandwidth=h->base.remote_media->bandwidth; - for(i=0;iresult->nstreams;++i){ - if (h->result->streams[i].rtp_port>0){ - strcpy(h->result->streams[i].rtp_addr,h->base.remote_media->streams[i].rtp_addr); - strcpy(h->result->streams[i].rtcp_addr,h->base.remote_media->streams[i].rtcp_addr); - h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime; - h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth; - h->result->streams[i].rtp_port=h->base.remote_media->streams[i].rtp_port; - h->result->streams[i].rtcp_port=h->base.remote_media->streams[i].rtcp_port; - - if (h->result->streams[i].proto == SalProtoRtpSavp) { - h->result->streams[i].crypto[0] = h->base.remote_media->streams[i].crypto[0]; - } + for(i=0;iresult->n_active_streams;++i){ + strcpy(h->result->streams[i].rtp_addr,h->base.remote_media->streams[i].rtp_addr); + strcpy(h->result->streams[i].rtcp_addr,h->base.remote_media->streams[i].rtcp_addr); + h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime; + h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth; + h->result->streams[i].rtp_port=h->base.remote_media->streams[i].rtp_port; + h->result->streams[i].rtcp_port=h->base.remote_media->streams[i].rtcp_port; + if (h->result->streams[i].proto == SalProtoRtpSavp) { + h->result->streams[i].crypto[0] = h->base.remote_media->streams[i].crypto[0]; } } } diff --git a/coreapi/sal_eXosip2_sdp.c b/coreapi/sal_eXosip2_sdp.c index 4aad14863..9297077e6 100644 --- a/coreapi/sal_eXosip2_sdp.c +++ b/coreapi/sal_eXosip2_sdp.c @@ -394,7 +394,7 @@ static void add_line(sdp_message_t *msg, int lineno, const SalStreamDescription sdp_message_t *media_description_to_sdp(const SalMediaDescription *desc){ int i; sdp_message_t *msg=create_generic_sdp(desc); - for(i=0;instreams;++i){ + for(i=0;in_total_streams;++i){ add_line(msg,i,&desc->streams[i]); } return msg; @@ -463,6 +463,8 @@ int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){ } } + desc->n_active_streams = 0; + /* for each m= line */ for (i=0; !sdp_message_endof_media (msg, i) && irtp_addr,rtp_addr,sizeof(stream->rtp_addr)); if (rtp_port) stream->rtp_port=atoi(rtp_port); + if (stream->rtp_port > 0) + desc->n_active_streams++; stream->ptime=_sdp_message_get_a_ptime(msg,i); if (strcasecmp("audio", mtype) == 0){ @@ -609,6 +613,6 @@ int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){ } } } - desc->nstreams=i; + desc->n_total_streams=i; return 0; } From be6d786ba2798aed2a746b8ecda9a1c6513b3793 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 24 Jan 2013 15:59:42 +0100 Subject: [PATCH 040/281] Add upnp call stats --- coreapi/linphonecall.c | 6 +++ coreapi/linphonecore.h | 22 +++++++++ coreapi/upnp.c | 16 +++++- coreapi/upnp.h | 11 +---- gtk/call_statistics.ui | 110 ++++++++++++++++++++--------------------- gtk/incall_view.c | 34 ++++++++++++- 6 files changed, 129 insertions(+), 70 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index f4525399b..eece911b4 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -286,6 +286,7 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * #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); @@ -421,6 +422,11 @@ void linphone_call_init_stats(LinphoneCallStats *stats, int type) { stats->received_rtcp = NULL; stats->sent_rtcp = NULL; stats->ice_state = LinphoneIceStateNotActivated; +#ifdef BUILD_UPNP + stats->upnp_state = LinphoneUpnpStateIdle; +#else + stats->upnp_state = LinphoneUpnpStateNotAvailable; +#endif //BUILD_UPNP } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 1003e9546..6af0bad34 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -284,6 +284,27 @@ enum _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. * @@ -309,6 +330,7 @@ struct _LinphoneCallStats { mblk_t* sent_rtcp;/**audiostream!=NULL, call->videostream!=NULL); } +void linphone_core_update_upnp_state_in_call_stats(LinphoneCall *call) { + call->stats[LINPHONE_CALL_STATS_AUDIO].upnp_state = call->upnp_session->audio->state; + call->stats[LINPHONE_CALL_STATS_VIDEO].upnp_state = call->upnp_session->video->state; +} + int linphone_upnp_call_process(LinphoneCall *call) { LinphoneCore *lc = call->core; UpnpContext *lupnp = lc->upnp; int ret = -1; - LinphoneUpnpState oldState; + LinphoneUpnpState oldState, newState; if(lupnp == NULL) { return ret; @@ -644,6 +649,7 @@ int linphone_upnp_call_process(LinphoneCall *call) { } else { call->upnp_session->state = LinphoneUpnpStateIdle; } + newState = call->upnp_session->state; /* When change is done proceed update */ if(oldState != LinphoneUpnpStateOk && oldState != LinphoneUpnpStateKo && @@ -673,6 +679,14 @@ int linphone_upnp_call_process(LinphoneCall *call) { } ms_mutex_unlock(&lupnp->mutex); + + /* + * Update uPnP call stats + */ + if(oldState != newState) { + linphone_core_update_upnp_state_in_call_stats(call); + } + return ret; } diff --git a/coreapi/upnp.h b/coreapi/upnp.h index a98e15574..b3a5b9e49 100644 --- a/coreapi/upnp.h +++ b/coreapi/upnp.h @@ -24,16 +24,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "linphonecore.h" #include "sal.h" -typedef enum { - LinphoneUpnpStateIdle, - LinphoneUpnpStatePending, // Only used by uPnP context - LinphoneUpnpStateAdding, // Only used by port binding - LinphoneUpnpStateRemoving, // Only used by port binding - LinphoneUpnpStateNotAvailable, // Only used by uPnP context - LinphoneUpnpStateOk, - LinphoneUpnpStateKo, -} LinphoneUpnpState; - typedef struct _UpnpSession UpnpSession; typedef struct _UpnpContext UpnpContext; @@ -50,5 +40,6 @@ 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 diff --git a/gtk/call_statistics.ui b/gtk/call_statistics.ui index 444710472..6ed8bd9bd 100644 --- a/gtk/call_statistics.ui +++ b/gtk/call_statistics.ui @@ -1,71 +1,34 @@ - + - False 5 Call statistics dialog - + True - False 2 - - - True - False - end - - - - - - gtk-close - True - True - True - False - True - - - False - False - 1 - - - - - False - True - end - 0 - - True - False 0 none True - False 12 True - False 6 2 True True - False Audio codec @@ -75,7 +38,6 @@ True - False Video codec @@ -87,7 +49,6 @@ True - False Audio IP bandwidth usage @@ -99,7 +60,6 @@ True - False 1 @@ -109,7 +69,6 @@ True - False 1 @@ -121,7 +80,6 @@ True - False 1 @@ -133,8 +91,7 @@ True - False - Media connectivity + Audio Media connectivity 4 @@ -143,15 +100,8 @@ - - - - - - - + True - False 1 @@ -163,7 +113,6 @@ True - False Video IP bandwidth usage @@ -175,7 +124,6 @@ True - False 1 @@ -184,6 +132,27 @@ 4 + + + True + Video Media connectivity + + + 5 + 6 + + + + + True + + + 1 + 2 + 5 + 6 + + @@ -191,7 +160,6 @@ True - False <b>Call statistics and information</b> True @@ -203,6 +171,34 @@ 1 + + + True + end + + + + + + gtk-close + True + True + True + True + + + False + False + 1 + + + + + False + end + 0 + + diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 192e92fab..8bf19c19c 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -231,10 +231,29 @@ static const char *ice_state_to_string(LinphoneIceState ice_state){ 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){ const LinphoneCallStats *as=linphone_call_get_audio_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)"), as->download_bandwidth,as->upload_bandwidth); 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); gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"video_bandwidth_usage")),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){ From 06c24da6ea4a9a38e07237c0690af3b661151d8d Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 24 Jan 2013 17:32:00 +0100 Subject: [PATCH 041/281] Update ms2 for upnp improvement --- coreapi/upnp.c | 2 +- mediastreamer2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 5684fc270..631d6545b 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -585,7 +585,7 @@ int linphone_upnp_call_process(LinphoneCall *call) { LinphoneCore *lc = call->core; UpnpContext *lupnp = lc->upnp; int ret = -1; - LinphoneUpnpState oldState, newState; + LinphoneUpnpState oldState = 0, newState = 0; if(lupnp == NULL) { return ret; diff --git a/mediastreamer2 b/mediastreamer2 index 710c3da85..b21f30429 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 710c3da85157d4db17bfce21e7d2b7853377fa4e +Subproject commit b21f304297319e15fbe0beb3509592022eb8e88a From 8fed4df37f8c49addf3607fd5d6df829da0614fd Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 24 Jan 2013 17:43:05 +0100 Subject: [PATCH 042/281] uPnP: Don't wait if there is no pending bindings --- coreapi/upnp.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 631d6545b..a05e1e0f2 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -308,8 +308,10 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) { /* * Not need, all hooks are removed before * linphone_core_remove_iterate_hook(lc, linphone_core_upnp_hook, lc); - */ + */ + ms_mutex_lock(&lupnp->mutex); + /* Send port binding removes */ if(lupnp->sip_udp != NULL) { linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_udp); @@ -325,9 +327,10 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) { } /* Wait all pending bindings are done */ - ms_message("uPnP IGD: Wait all pending port bindings ..."); - ms_mutex_lock(&lupnp->mutex); - ms_cond_wait(&lupnp->empty_cond, &lupnp->mutex); + if(lupnp->pending_bindings != NULL) { + ms_message("uPnP IGD: Wait all pending port bindings ..."); + ms_cond_wait(&lupnp->empty_cond, &lupnp->mutex); + } ms_mutex_unlock(&lupnp->mutex); if(lupnp->upnp_igd_ctxt != NULL) { From 36ba86e451f2d38697cd4dbcab0b7b06c31572cf Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 25 Jan 2013 12:07:00 +0100 Subject: [PATCH 043/281] Fix previous merge --- coreapi/upnp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index a05e1e0f2..5ef70ba25 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -563,7 +563,7 @@ int linphone_core_update_upnp_from_remote_media_description(LinphoneCall *call, int i; const SalStreamDescription *stream; - for (i = 0; i < md->nstreams; i++) { + for (i = 0; i < md->n_total_streams; i++) { stream = &md->streams[i]; if(stream->type == SalAudio) { audio = TRUE; @@ -795,7 +795,7 @@ int linphone_core_update_local_media_description_from_upnp(SalMediaDescription * SalStreamDescription *stream; UpnpStream *upnpStream; - for (i = 0; i < desc->nstreams; i++) { + for (i = 0; i < desc->n_active_streams; i++) { stream = &desc->streams[i]; upnpStream = NULL; if(stream->type == SalAudio) { From c83e7a60068d33b79658c9f21b04f2a01d031c52 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 28 Jan 2013 12:08:05 +0100 Subject: [PATCH 044/281] Update ms2 submodule. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 2e0ef7e31..17fa1d38a 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 2e0ef7e31e919b524cfbe1ff4ffbc409fce3599c +Subproject commit 17fa1d38a456460d2ec727c14540b99ea2e9cb8f From 2ffe75737083f1a813a54d783ab5a8ccc8f606a7 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 28 Jan 2013 14:13:14 +0100 Subject: [PATCH 045/281] Fix android build. --- build/android/common.mk | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build/android/common.mk b/build/android/common.mk index d629b54af..86475081e 100644 --- a/build/android/common.mk +++ b/build/android/common.mk @@ -44,7 +44,7 @@ LOCAL_SRC_FILES := \ linphonecall.c \ conference.c \ ec-calibrator.c \ - linphone_tunnel.cc + linphone_tunnel_config.c ifndef LINPHONE_VERSION LINPHONE_VERSION = "Devel" @@ -100,12 +100,14 @@ LOCAL_STATIC_LIBRARIES := \ ifeq ($(BUILD_TUNNEL),1) LOCAL_CFLAGS +=-DTUNNEL_ENABLED LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../tunnel/include $(LOCAL_PATH)/../../tunnel/src -LOCAL_SRC_FILES += TunnelManager.cc +LOCAL_SRC_FILES += linphone_tunnel.cc TunnelManager.cc ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) LOCAL_SHARED_LIBRARIES += libtunnelclient else LOCAL_STATIC_LIBRARIES += libtunnelclient endif +else +LOCAL_SRC_FILES += linphone_tunnel_stubs.c endif From 0a7832f19e1f875cc39deb3d7a684b754000b174 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 30 Jan 2013 09:18:52 +0100 Subject: [PATCH 046/281] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 17fa1d38a..97e002ca2 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 17fa1d38a456460d2ec727c14540b99ea2e9cb8f +Subproject commit 97e002ca2fd4273f7a229caf9fee2d9487814c91 From 3b722ada225c8adfcb19a0784f05288f8abfcada Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 30 Jan 2013 10:49:02 +0100 Subject: [PATCH 047/281] Add missing busy test on call failure --- coreapi/callbacks.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 948fc720b..8baad9af2 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -651,6 +651,9 @@ static void call_failure(SalOp *op, SalError error, SalReason sr, const char *de } else if (sr == SalReasonNotFound) { call->reason=LinphoneReasonNotFound; linphone_call_set_state(call,LinphoneCallError,"User not found."); + } else if (sr == SalReasonBusy) { + call->reason=LinphoneReasonBusy; + linphone_call_set_state(call,LinphoneCallError,"User is busy."); } else { linphone_call_set_state(call,LinphoneCallError,msg); } From e2707b8d5c4f7caf65627a9822ee8e9af3dd85cd Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 30 Jan 2013 12:05:09 +0100 Subject: [PATCH 048/281] add get_remote_contact() api and clean java API. --- coreapi/linphonecall.c | 10 +++++++ coreapi/linphonecore.h | 1 + coreapi/linphonecore_jni.cc | 12 +++++++- coreapi/sal.c | 13 +++++++- coreapi/sal.h | 7 +++-- coreapi/sal_eXosip2.c | 30 ++++++++++++++++--- .../org/linphone/core/LinphoneCall.java | 30 +++++++++---------- .../org/linphone/core/LinphoneCallImpl.java | 5 ++++ 8 files changed, 84 insertions(+), 24 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 11be247c2..3bfa7d9d4 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -898,6 +898,16 @@ const char *linphone_call_get_remote_user_agent(LinphoneCall *call){ return NULL; } +/** + * Returns the far end's sip contact as a string, if available. +**/ +const char *linphone_call_get_remote_contact(LinphoneCall *call){ + if (call->op){ + return sal_op_get_remote_contact(call->op); + } + return NULL; +} + /** * Returns true if this calls has received a transfer that has not been * executed yet. diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 1f49cce46..6eb401638 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -396,6 +396,7 @@ bool_t linphone_call_camera_enabled(const LinphoneCall *lc); int linphone_call_take_video_snapshot(LinphoneCall *call, const char *file); LinphoneReason linphone_call_get_reason(const LinphoneCall *call); const char *linphone_call_get_remote_user_agent(LinphoneCall *call); +const char *linphone_call_get_remote_contact(LinphoneCall *call); float linphone_call_get_play_volume(LinphoneCall *call); float linphone_call_get_record_volume(LinphoneCall *call); float linphone_call_get_current_quality(LinphoneCall *call); diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 4144c1441..6c2135203 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1508,7 +1508,17 @@ extern "C" jlong Java_org_linphone_core_LinphoneCallImpl_getRemoteAddress( JNIEn extern "C" jstring Java_org_linphone_core_LinphoneCallImpl_getRemoteUserAgent(JNIEnv *env, jobject thiz, jlong ptr) { LinphoneCall *call = (LinphoneCall *)ptr; - jstring jvalue = env->NewStringUTF(linphone_call_get_remote_user_agent(call)); + const char *value=linphone_call_get_remote_user_agent(call); + jstring jvalue=NULL; + if (value) jvalue=env->NewStringUTF(); + return jvalue; +} + +extern "C" jstring Java_org_linphone_core_LinphoneCallImpl_getRemoteContact(JNIEnv *env, jobject thiz, jlong ptr) { + LinphoneCall *call = (LinphoneCall *)ptr; + const char *value=linphone_call_get_remote_contact(call); + jstring jvalue = NULL; + if (value) jvalue=env->NewStringUTF(value); return jvalue; } diff --git a/coreapi/sal.c b/coreapi/sal.c index 05d03499d..d91be1cb6 100644 --- a/coreapi/sal.c +++ b/coreapi/sal.c @@ -273,6 +273,10 @@ const char *sal_op_get_contact(const SalOp *op){ return ((SalOpBase*)op)->contact; } +const char *sal_op_get_remote_contact(const SalOp *op){ + return ((SalOpBase*)op)->remote_contact; +} + const char *sal_op_get_route(const SalOp *op){ return ((SalOpBase*)op)->route; } @@ -304,6 +308,9 @@ void __sal_op_set_network_origin(SalOp *op, const char *origin){ assign_string(&((SalOpBase*)op)->origin,origin); } +void __sal_op_set_remote_contact(SalOp *op, const char *ct){ + assign_string(&((SalOpBase*)op)->remote_contact,ct); +} void __sal_op_free(SalOp *op){ SalOpBase *b=(SalOpBase *)op; @@ -331,12 +338,16 @@ void __sal_op_free(SalOp *op){ ms_free(b->remote_ua); b->remote_ua=NULL; } + if (b->remote_contact){ + ms_free(b->remote_contact); + b->remote_contact=NULL; + } if (b->local_media) sal_media_description_unref(b->local_media); if (b->remote_media) sal_media_description_unref(b->remote_media); if (b->call_id) - ms_free((void*)b->call_id); + ms_free(b->call_id); ms_free(op); } diff --git a/coreapi/sal.h b/coreapi/sal.h index 6baae97ae..b751dfc0d 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -221,7 +221,8 @@ typedef struct SalOpBase{ SalMediaDescription *local_media; SalMediaDescription *remote_media; void *user_pointer; - const char* call_id; + char* call_id; + char *remote_contact; } SalOpBase; @@ -385,6 +386,7 @@ const char *sal_op_get_to(const SalOp *op); const char *sal_op_get_contact(const SalOp *op); const char *sal_op_get_route(const SalOp *op); const char *sal_op_get_proxy(const SalOp *op); +const char *sal_op_get_remote_contact(const SalOp *op); /*for incoming requests, returns the origin of the packet as a sip uri*/ const char *sal_op_get_network_origin(const SalOp *op); /*returns far-end "User-Agent" string */ @@ -442,7 +444,7 @@ int sal_ping(SalOp *op, const char *from, const char *to); -#define payload_type_set_number(pt,n) (pt)->user_data=(void*)((long)n); +#define payload_type_set_number(pt,n) (pt)->user_data=(void*)((long)n); #define payload_type_get_number(pt) ((int)(long)(pt)->user_data) /*misc*/ @@ -452,6 +454,7 @@ void sal_get_default_local_ip(Sal *sal, int address_family, char *ip, size_t ipl /*internal API */ void __sal_op_init(SalOp *b, Sal *sal); void __sal_op_set_network_origin(SalOp *op, const char *origin /*a sip uri*/); +void __sal_op_set_remote_contact(SalOp *op, const char *ct); void __sal_op_free(SalOp *b); #endif diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 1cbecb638..076f3d934 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -671,8 +671,11 @@ int sal_call(SalOp *h, const char *from, const char *to){ ms_error("Fail to send invite ! Error code %d", err); return -1; }else{ + char *tmp=NULL; callid=osip_message_get_call_id(invite); - osip_call_id_to_str(callid,(char **)(&h->base.call_id)); + osip_call_id_to_str(callid,&tmp); + h->base.call_id=ms_strdup(tmp); + osip_free(tmp); sal_add_call(h->base.root,h); } return 0; @@ -1014,6 +1017,19 @@ static void set_remote_ua(SalOp* op, osip_message_t *req){ } } +static void set_remote_contact(SalOp* op, osip_message_t *req){ + if (op->base.remote_contact==NULL){ + osip_contact_t *h=NULL; + osip_message_get_contact(req,0,&h); + if (h){ + char *tmp=NULL; + osip_contact_to_str(h,&tmp); + __sal_op_set_remote_contact(op,tmp); + osip_free(tmp); + } + } +} + static void set_replaces(SalOp *op, osip_message_t *req){ osip_header_t *h=NULL; @@ -1051,12 +1067,17 @@ static void inc_new_call(Sal *sal, eXosip_event_t *ev){ SalOp *op=sal_op_new(sal); osip_from_t *from,*to; osip_call_info_t *call_info; - char *tmp; + char *tmp=NULL; sdp_message_t *sdp=eXosip_get_sdp_info(ev->request); + osip_call_id_t *callid=osip_message_get_call_id(ev->request); - osip_call_id_to_str(callid,(char**)(&op->base.call_id)); - + + osip_call_id_to_str(callid,&tmp); + op->base.call_id=ms_strdup(tmp); + osip_free(tmp); + set_network_origin(op,ev->request); + set_remote_contact(op,ev->request); set_remote_ua(op,ev->request); set_replaces(op,ev->request); @@ -1234,6 +1255,7 @@ static void call_accepted(Sal *sal, eXosip_event_t *ev){ op->did=ev->did; set_remote_ua(op,ev->response); + set_remote_contact(op,ev->response); sdp=eXosip_get_sdp_info(ev->response); if (sdp){ diff --git a/java/common/org/linphone/core/LinphoneCall.java b/java/common/org/linphone/core/LinphoneCall.java index ac7b14d8d..79f38633b 100644 --- a/java/common/org/linphone/core/LinphoneCall.java +++ b/java/common/org/linphone/core/LinphoneCall.java @@ -102,22 +102,22 @@ public interface LinphoneCall { /** * The call's parameters are updated, used for example when video is asked by remote */ - public static final State CallUpdatedByRemote = new State(15, "CallUpdatedByRemote"); + public static final State CallUpdatedByRemote = new State(15, "UpdatedByRemote"); /** * We are proposing early media to an incoming call */ - public static final State CallIncomingEarlyMedia = new State(16,"CallIncomingEarlyMedia"); + public static final State CallIncomingEarlyMedia = new State(16,"IncomingEarlyMedia"); /** - * The remote accepted the call update initiated by us + * We have initiated a call update. When the remote accepts the call update, state will move to StreamsRunning. */ - public static final State CallUpdated = new State(17, "CallUpdated"); + public static final State CallUpdating = new State(17, "Updating"); /** * The call object is now released. */ - public static final State CallReleased = new State(18,"CallReleased"); + public static final State CallReleased = new State(18,"Released"); private State(int value,String stringValue) { @@ -160,17 +160,6 @@ public interface LinphoneCall { **/ LinphoneCallLog getCallLog(); - /** - * Set the audio statistics associated with this call. - * @return LinphoneCallStats - */ - void setAudioStats(LinphoneCallStats stats); - - /** - * Set the video statistics associated with this call. - * @return LinphoneCallStats - */ - void setVideoStats(LinphoneCallStats stats); /** * Get the audio statistics associated with this call. @@ -184,6 +173,10 @@ public interface LinphoneCall { */ LinphoneCallStats getVideoStats(); + /** + * Get call's remote parameters, as proposed by far end. + * This is useful for example to know if far end supports video or encryption. + **/ LinphoneCallParams getRemoteParams(); LinphoneCallParams getCurrentParamsCopy(); @@ -273,6 +266,11 @@ public interface LinphoneCall { * Obtain the remote user agent string. */ String getRemoteUserAgent(); + + /** + * Obtain the remote sip contact string. + **/ + String getRemoteContact(); /** * Take a photo of currently received video and write it into a jpeg file. diff --git a/java/impl/org/linphone/core/LinphoneCallImpl.java b/java/impl/org/linphone/core/LinphoneCallImpl.java index 6a91438ac..45c905dbb 100644 --- a/java/impl/org/linphone/core/LinphoneCallImpl.java +++ b/java/impl/org/linphone/core/LinphoneCallImpl.java @@ -179,6 +179,11 @@ class LinphoneCallImpl implements LinphoneCall { public String getRemoteUserAgent() { return getRemoteUserAgent(nativePtr); } + + private native String getRemoteContact(long nativePtr); + public String getRemoteContact() { + return getRemoteContact(nativePtr); + } private native void takeSnapshot(long nativePtr, String path); public void takeSnapshot(String path) { From 77a03fbdb1ee31de5203aced075271ed0f9273c7 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 30 Jan 2013 12:32:19 +0100 Subject: [PATCH 049/281] fix mistake --- coreapi/linphonecore_jni.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 6c2135203..8b2d2b519 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1510,7 +1510,7 @@ extern "C" jstring Java_org_linphone_core_LinphoneCallImpl_getRemoteUserAgent(JN LinphoneCall *call = (LinphoneCall *)ptr; const char *value=linphone_call_get_remote_user_agent(call); jstring jvalue=NULL; - if (value) jvalue=env->NewStringUTF(); + if (value) jvalue=env->NewStringUTF(value); return jvalue; } From 199133a740e39cd91df4ccb560668f31fc41df0e Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 24 Jan 2013 15:05:17 +0100 Subject: [PATCH 050/281] removed keypad --- gtk/Makefile.am | 1 + gtk/chat.c | 16 +- gtk/incall_view.c | 15 + gtk/linphone.h | 2 +- gtk/main.c | 38 ++- gtk/main.ui | 683 ++++++++++++++-------------------------------- 6 files changed, 254 insertions(+), 501 deletions(-) diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 1caded7c6..831c69a8c 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -5,6 +5,7 @@ UI_FILES= about.ui \ parameters.ui \ sip_account.ui \ call_logs.ui \ + keypad.ui \ log.ui \ buddylookup.ui \ tunnel_config.ui \ diff --git a/gtk/chat.c b/gtk/chat.c index 257a55758..19bcc3429 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -194,12 +194,12 @@ void update_chat_state_message(LinphoneChatMessageState state){ default : result="Message in progress.. "; } - GDateTime *dt=g_date_time_new_now_local(); + /*GDateTime *dt=g_date_time_new_now_local(); char *time=g_date_time_format(dt,"%k:%M"); gchar result2[80]; - sprintf(result2,"%s %s",result,time); + sprintf(result2,"%s %s",result,time);*/ - gtk_text_buffer_insert_with_tags_by_name(b,&iter,result2,-1, + gtk_text_buffer_insert_with_tags_by_name(b,&iter,result,-1, "italic","right","small","font_grey",NULL); list=g_list_remove(list,g_list_nth_data(list,0)); g_object_set_data(G_OBJECT(page),"list",list); @@ -342,8 +342,8 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const GtkWidget *main_window=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *w; - GDateTime *dt=g_date_time_new_now_local(); - char *time=g_date_time_format(dt,"%k:%M"); + /*GDateTime *dt=g_date_time_new_now_local(); + char *time=g_date_time_format(dt,"%k:%M");*/ w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); if(w!=NULL){ @@ -365,9 +365,9 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const #else if(!gtk_window_is_active(GTK_WINDOW(main_window))){ if(!GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_notified"))){ - gchar result2[80]; - sprintf(result2,"%s \n %s sent at %s",message,display,time); - linphone_gtk_notify(NULL,result2); + /*gchar result2[80]; + sprintf(result2,"%s \n %s sent at %s",message,display,time);*/ + linphone_gtk_notify(NULL,message); g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(TRUE)); } else { g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(FALSE)); diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 8bf19c19c..2b115a564 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -361,6 +361,13 @@ void linphone_gtk_create_in_call_view(LinphoneCall *call){ g_signal_connect(G_OBJECT(transfer),"clicked",(GCallback)transfer_button_clicked,call); gtk_widget_hide(transfer); + GtkWidget *keypad = linphone_gtk_get_widget(call_view,"keypad"); + //gtk_button_set_image(GTK_BUTTON(keypad),gtk_image_new_from_stock + // (GTK_STOCK_GO_FORWARD,GTK_ICON_SIZE_BUTTON)); + + g_signal_connect_swapped(G_OBJECT(keypad),"clicked",(GCallback)linphone_gtk_create_keypad,call); + gtk_widget_hide(keypad); + GtkWidget *conf = linphone_gtk_get_widget(call_view,"conference_button"); gtk_button_set_image(GTK_BUTTON(conf),gtk_image_new_from_stock (GTK_STOCK_ADD,GTK_ICON_SIZE_BUTTON)); g_signal_connect(G_OBJECT(conf),"clicked",(GCallback)conference_button_clicked,call); @@ -673,6 +680,9 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ gtk_widget_hide(linphone_gtk_get_widget(callview,"answer_decline_panel")); gtk_label_set_markup(GTK_LABEL(status),in_conf ? _("In conference") : _("In call")); + /** keypad button **/ + //gtk_widget_set_visible(linphone_gtk_get_widget(callview,"keypad"),!in_conf); + gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"conference_button"),!in_conf); gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"transfer_button"),!in_conf); @@ -745,10 +755,15 @@ void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_m gtk_widget_hide(linphone_gtk_get_widget(callview,"video_button")); gtk_widget_hide(linphone_gtk_get_widget(callview,"transfer_button")); gtk_widget_hide(linphone_gtk_get_widget(callview,"conference_button")); + gtk_widget_hide(linphone_gtk_get_widget(callview,"keypad")); linphone_gtk_enable_mute_button( GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),FALSE); linphone_gtk_enable_hold_button(call,FALSE,TRUE); + GtkWidget *keypad=(GtkWidget *)g_object_get_data(G_OBJECT(callview),"keypad"); + if(keypad!=NULL) + gtk_widget_destroy(keypad); + if (taskid!=0) g_source_remove(taskid); g_timeout_add_seconds(2,(GSourceFunc)in_call_view_terminated,call); if (in_conf) diff --git a/gtk/linphone.h b/gtk/linphone.h index 367b18c26..ee584b038 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -89,6 +89,7 @@ int linphone_gtk_get_ui_config_int(const char *key, int def); void linphone_gtk_set_ui_config_int(const char *key , int val); void linphone_gtk_visibility_set(const char *hiddens, const char *window_name, GtkWidget *w, gboolean show); +void linphone_gtk_create_keypad(LinphoneCall *call); void linphone_gtk_open_browser(const char *url); void linphone_gtk_check_for_new_version(void); const char *linphone_gtk_get_lang(const char *config_file); @@ -102,7 +103,6 @@ void linphone_gtk_terminate_call(GtkWidget *button); void update_tab_header(LinphoneCall *call,gboolean pause); void linphone_gtk_show_directory_search(void); - void linphone_gtk_status_icon_set_blinking(gboolean val); void linphone_gtk_notify(LinphoneCall *call, const char *msg); LinphoneChatRoom *linphone_gtk_start_chat(GtkTreeView* t); diff --git a/gtk/main.c b/gtk/main.c index 12e84bc97..bc333645b 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -744,7 +744,9 @@ static void linphone_gtk_update_call_buttons(LinphoneCall *call){ linphone_gtk_enable_conference_button(lc,FALSE); } update_video_title(); - if (call) linphone_gtk_update_video_button(call); + if (call) { + linphone_gtk_update_video_button(call); + } } static gboolean linphone_gtk_start_call_do(GtkWidget *uri_bar){ @@ -1444,7 +1446,7 @@ void linphone_gtk_load_identities(void){ static void linphone_gtk_dtmf_pressed(GtkButton *button){ const char *label=(char *)g_object_get_data(G_OBJECT(button),"label"); - GtkWidget *uri_bar=linphone_gtk_get_widget(gtk_widget_get_toplevel(GTK_WIDGET(button)),"uribar"); + GtkWidget *uri_bar=linphone_gtk_get_widget(linphone_gtk_get_main_window(),"uribar"); int pos=-1; gtk_editable_insert_text(GTK_EDITABLE(uri_bar),label,1,&pos); linphone_core_play_dtmf (linphone_gtk_get_core(),label[0],-1); @@ -1458,8 +1460,8 @@ static void linphone_gtk_dtmf_released(GtkButton *button){ } -static void linphone_gtk_connect_digits(void){ - GtkContainer *cont=GTK_CONTAINER(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"dtmf_table")); +static void linphone_gtk_connect_digits(GtkWidget *w){ + GtkContainer *cont=GTK_CONTAINER(linphone_gtk_get_widget(w,"dtmf_table")); GList *children=gtk_container_get_children(cont); GList *elem; for(elem=children;elem!=NULL;elem=elem->next){ @@ -1497,11 +1499,10 @@ static void linphone_gtk_configure_main_window(){ static const char *home; static const char *start_call_icon; static const char *add_call_icon; - //static const char *stop_call_icon; static const char *search_icon; static gboolean update_check_menu; static gboolean buttons_have_borders; - static gboolean show_abcd; + //static gboolean show_abcd; GtkWidget *w=linphone_gtk_get_main_window(); GHashTable *contacts_history; @@ -1513,11 +1514,10 @@ static void linphone_gtk_configure_main_window(){ home=linphone_gtk_get_ui_config("home","http://www.linphone.org"); start_call_icon=linphone_gtk_get_ui_config("start_call_icon","startcall-green.png"); add_call_icon=linphone_gtk_get_ui_config("add_call_icon","addcall-green.png"); - //stop_call_icon=linphone_gtk_get_ui_config("stop_call_icon","stopcall-small.png"); search_icon=linphone_gtk_get_ui_config("directory_search_icon",NULL); update_check_menu=linphone_gtk_get_ui_config_int("update_check_menu",0); buttons_have_borders=linphone_gtk_get_ui_config_int("buttons_border",1); - show_abcd=linphone_gtk_get_ui_config_int("show_abcd",1); + //show_abcd=linphone_gtk_get_ui_config_int("show_abcd",1); config_loaded=TRUE; } linphone_gtk_configure_window(w,"main_window"); @@ -1558,7 +1558,7 @@ static void linphone_gtk_configure_main_window(){ } */ } - { + /*{ GdkPixbuf *pbuf=create_pixbuf("dialer-orange.png"); if (pbuf) { GtkImage *img=GTK_IMAGE(linphone_gtk_get_widget(w,"keypad_tab_icon")); @@ -1570,20 +1570,20 @@ static void linphone_gtk_configure_main_window(){ g_object_unref(G_OBJECT(scaled)); g_object_unref(G_OBJECT(pbuf)); } - } + }*/ if (linphone_gtk_can_manage_accounts()) { gtk_widget_show(linphone_gtk_get_widget(w,"assistant_item")); } if (update_check_menu){ gtk_widget_show(linphone_gtk_get_widget(w,"versioncheck_item")); } - if (!show_abcd){ + /*if (!show_abcd){ gtk_widget_hide(linphone_gtk_get_widget(w,"dtmf_A")); gtk_widget_hide(linphone_gtk_get_widget(w,"dtmf_B")); gtk_widget_hide(linphone_gtk_get_widget(w,"dtmf_C")); gtk_widget_hide(linphone_gtk_get_widget(w,"dtmf_D")); gtk_table_resize(GTK_TABLE(linphone_gtk_get_widget(w,"dtmf_table")),4,3); - } + }*/ } void linphone_gtk_manage_login(void){ @@ -1647,7 +1647,16 @@ void linphone_gtk_init_dtmf_table(GtkWidget *mw){ g_object_set_data(G_OBJECT(linphone_gtk_get_widget(mw,"dtmf_0")),"label","0"); g_object_set_data(G_OBJECT(linphone_gtk_get_widget(mw,"dtmf_#")),"label","#"); g_object_set_data(G_OBJECT(linphone_gtk_get_widget(mw,"dtmf_*")),"label","*"); - +} + + +void linphone_gtk_create_keypad(LinphoneCall *call){ + GtkWidget *w=(GtkWidget*)linphone_call_get_user_pointer(call); + GtkWidget *keypad=linphone_gtk_create_window("keypad"); + linphone_gtk_connect_digits(keypad); + linphone_gtk_init_dtmf_table(keypad); + g_object_set_data(G_OBJECT(w),"keypad",(gpointer)keypad); + gtk_widget_show(keypad); } static void linphone_gtk_init_main_window(){ @@ -1659,11 +1668,10 @@ static void linphone_gtk_init_main_window(){ linphone_gtk_load_identities(); linphone_gtk_set_my_presence(linphone_core_get_presence_info(linphone_gtk_get_core())); linphone_gtk_show_friends(); - linphone_gtk_connect_digits(); main_window=linphone_gtk_get_main_window(); linphone_gtk_call_log_update(main_window); - linphone_gtk_init_dtmf_table(main_window); + //linphone_gtk_init_dtmf_table(main_window); linphone_gtk_update_call_buttons (NULL); g_object_set_data(G_OBJECT(main_window),"is_conf",GINT_TO_POINTER(FALSE)); /*prevent the main window from being destroyed by a user click on WM controls, instead we hide it*/ diff --git a/gtk/main.ui b/gtk/main.ui index f82875cb6..97e9b4701 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -70,13 +70,13 @@ 90 - 10 + 30 True False False - False + True 2 @@ -155,7 +155,7 @@ True False - + True False gtk-ok @@ -273,7 +273,17 @@ True False - + + True + False + label + center + + + True + True + 0 + @@ -282,19 +292,6 @@ 0 - - - True - False - label - center - - - True - True - 1 - - False @@ -354,6 +351,32 @@ False True + 1 + + + + + True + False + + + :: + True + True + True + False + bottom + + + False + False + 0 + + + + + False + False 2 @@ -640,6 +663,26 @@ False gtk-connect + + True + False + gtk-add + + + True + False + gtk-add + + + True + False + gtk-add + + + True + False + gtk-add + True False @@ -1082,453 +1125,10 @@ True True - - True - False - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - False - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - False - 0.5 - none - - - True - False - 0 - 0 - - - True - False - 0 - - - True - False - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 4 - 4 - 4 - True - - - D - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 3 - 4 - 3 - 4 - - - - - # - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 2 - 3 - 3 - 4 - - - - - 0 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 1 - 2 - 3 - 4 - - - - - * - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 3 - 4 - - - - - C - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 3 - 4 - 2 - 3 - - - - - 9 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 2 - 3 - 2 - 3 - - - - - 8 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 1 - 2 - 2 - 3 - - - - - 7 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 2 - 3 - - - - - B - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 3 - 4 - 1 - 2 - - - - - 6 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 2 - 3 - 1 - 2 - - - - - 5 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 1 - 2 - 1 - 2 - - - - - 4 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 1 - 2 - - - - - A - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 3 - 4 - - - - - 3 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 2 - 3 - - - - - 2 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - 1 - 2 - - - - - 1 - 40 - 40 - True - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - False - - - - - - - - - - - - - - True - True - 0 - - - - - False - 0 - none - - - False - - - True - True - - True - False - False - True - True - - - True - True - 0 - - - - - True - True - True - False - none - - - - True - False - - - True - False - gtk-find - - - True - True - 0 - - - - - True - False - Search - - - True - True - 1 - - - - - - - False - True - 1 - - - - - - - True - False - <b>Add contacts from directory</b> - True - - - - - False - False - 5 - 2 - - - - - True - False - - - Add contact - True - True - False - image10 - - - - False - False - 0 - - - - - False - False - 3 - - - - - True - True - 0 - - - + - - True - False - - - True - False - gtk-missing-image - 1 - - - True - True - 0 - - - - - True - False - Keypad - - - True - True - 1 - - - - - False - + @@ -1539,6 +1139,28 @@ True False 2 + + + True + True + never + + + 350 + True + True + False + + + + + + + True + True + 0 + + True @@ -1571,29 +1193,137 @@ False True end - 0 + 1 - + True - True - never + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - 350 - True - True - False - - + + + + + False + 0 + none + + + False + + + True + True + + True + False + False + True + True + + + True + True + 0 + + + + + True + True + True + False + none + + + + True + False + + + True + False + gtk-find + + + True + True + 0 + + + + + True + False + Search + + + True + True + 1 + + + + + + + False + True + 1 + + + + + + + True + False + <b>Add contacts from directory</b> + True + + + + False + False + 5 + 2 + + + + + True + False + + + Add contact + True + True + False + image16 + + + + False + False + 0 + + + + + False + False + 3 + - True - True - 1 + False + False + end + 2 @@ -1654,7 +1384,6 @@ True True - 4 1 From 1f089fd82f19b27281639c5d04d0c3a7ef935652 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 30 Jan 2013 15:46:28 +0100 Subject: [PATCH 051/281] Add time in LinphoneChatMessage and SalMessage --- coreapi/callbacks.c | 2 +- coreapi/chat.c | 17 ++++++++---- coreapi/linphonecore.h | 9 ++++++- coreapi/private.h | 3 ++- coreapi/sal.h | 1 + coreapi/sal_eXosip2.c | 25 ++++++++++++++++- coreapi/sal_eXosip2_presence.c | 4 +++ gtk/chat.c | 49 +++++++++++++++++----------------- gtk/linphone.h | 2 +- gtk/main.c | 3 ++- gtk/main.ui | 5 +++- 11 files changed, 83 insertions(+), 37 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 8baad9af2..552d34804 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -845,7 +845,7 @@ static bool_t is_duplicate_msg(LinphoneCore *lc, const char *msg_id){ static void text_received(Sal *sal, const SalMessage *msg){ LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal); if (is_duplicate_msg(lc,msg->message_id)==FALSE){ - linphone_core_message_received(lc,msg->from,msg->text,msg->url); + linphone_core_message_received(lc,msg); } } diff --git a/coreapi/chat.c b/coreapi/chat.c index 00f237377..c502efa9f 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -103,13 +103,13 @@ void linphone_chat_room_message_received(LinphoneChatRoom *cr, LinphoneCore *lc, } -void linphone_core_message_received(LinphoneCore *lc, const char *from, const char *raw_msg,const char* external_url){ +void linphone_core_message_received(LinphoneCore *lc, const SalMessage *sal_msg){ MSList *elem; LinphoneChatRoom *cr=NULL; LinphoneAddress *addr; char *cleanfrom; LinphoneChatMessage* msg; - addr=linphone_address_new(from); + addr=linphone_address_new(sal_msg->from); linphone_address_clean(addr); for(elem=lc->chatrooms;elem!=NULL;elem=ms_list_next(elem)){ cr=(LinphoneChatRoom*)elem->data; @@ -123,10 +123,12 @@ void linphone_core_message_received(LinphoneCore *lc, const char *from, const ch /* create a new chat room */ cr=linphone_core_create_chat_room(lc,cleanfrom); } - msg = linphone_chat_room_create_message(cr, raw_msg); + msg = linphone_chat_room_create_message(cr, sal_msg->text); linphone_chat_message_set_from(msg, cr->peer_url); - if (external_url) { - linphone_chat_message_set_external_body_url(msg, external_url); + msg->time=sal_msg->time; + + if (sal_msg->url) { + linphone_chat_message_set_external_body_url(msg, sal_msg->url); } linphone_address_destroy(addr); linphone_chat_room_message_received(cr,lc,msg); @@ -221,6 +223,11 @@ void linphone_chat_message_set_from(LinphoneChatMessage* message, const Linphone LinphoneAddress* linphone_chat_message_get_from(const LinphoneChatMessage* message) { return message->from; } + +time_t linphone_chat_message_get_time(const LinphoneChatMessage* message) { + return message->time; +} + const char * linphone_chat_message_get_text(const LinphoneChatMessage* message) { return message->message; } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 6eb401638..f780d2f65 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -735,7 +735,14 @@ void linphone_chat_message_set_external_body_url(LinphoneChatMessage* message,co * Get text part of this message * @return text or NULL if no text. */ -const char * linphone_chat_message_get_text(const LinphoneChatMessage* message); +const char * linphone_chat_message_get_text(const LinphoneChatMessage* message); + +/** + * Get the time the message was sent + * @return time_t or NULL if no time + */ +time_t linphone_chat_message_get_time(const LinphoneChatMessage* message); + /** * user pointer get function */ diff --git a/coreapi/private.h b/coreapi/private.h index c421b2bc6..ca79a722f 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -103,6 +103,7 @@ struct _LinphoneChatMessage { void* message_userdata; char* external_body_url; LinphoneAddress* from; + time_t time; }; typedef struct StunCandidate{ @@ -279,7 +280,7 @@ void linphone_proxy_config_write_to_config_file(struct _LpConfig* config,Linphon int linphone_proxy_config_normalize_number(LinphoneProxyConfig *cfg, const char *username, char *result, size_t result_len); -void linphone_core_message_received(LinphoneCore *lc, const char *from, const char *raw_msg,const char* external_url); +void linphone_core_message_received(LinphoneCore *lc, const SalMessage *msg); void linphone_core_play_tone(LinphoneCore *lc); diff --git a/coreapi/sal.h b/coreapi/sal.h index b751dfc0d..46294b603 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -195,6 +195,7 @@ typedef struct SalMessage{ const char *text; const char *url; const char *message_id; + time_t time; }SalMessage; #define SAL_MEDIA_DESCRIPTION_MAX_MESSAGE_ATTRIBUTES 5 diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 076f3d934..91ec04679 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -52,7 +52,6 @@ void sal_get_default_local_ip(Sal *sal, int address_family,char *ip, size_t iple } } - static SalOp * sal_find_call(Sal *sal, int cid){ const MSList *elem; SalOp *op; @@ -1766,6 +1765,9 @@ static bool_t comes_from_local_if(osip_message_t *msg){ return FALSE; } +static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; +static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; + static void text_received(Sal *sal, eXosip_event_t *ev){ osip_body_t *body=NULL; char *from=NULL,*msg=NULL; @@ -1775,6 +1777,26 @@ static void text_received(Sal *sal, eXosip_event_t *ev){ int external_body_size=0; SalMessage salmsg; char message_id[256]={0}; + osip_header_t *date=NULL; + struct tm ret={}; + char tmp1[80]={0}; + char tmp2[80]={0}; + int i,j; + + osip_message_get_date(ev->request,0,&date); + if(date==NULL){ + ms_error("Could not get the date of message"); + return; + } + sscanf(date->hvalue,"%3c,%d%s%d%d:%d:%d",tmp1,&ret.tm_mday,tmp2, + &ret.tm_year,&ret.tm_hour,&ret.tm_min,&ret.tm_sec); + ret.tm_year-=1900; + for(i=0;i<7;i++) { + if(strcmp(tmp1,days[i])==0) ret.tm_wday=i; + } + for(j=0;j<12;j++) { + if(strcmp(tmp2,months[j])==0) ret.tm_mon=j; + } content_type= osip_message_get_content_type(ev->request); if (!content_type) { @@ -1815,6 +1837,7 @@ static void text_received(Sal *sal, eXosip_event_t *ev){ salmsg.text=msg; salmsg.url=external_body_size>0 ? unquoted_external_body_url : NULL; salmsg.message_id=message_id; + salmsg.time=mktime(&ret); sal->callbacks.text_received(sal,&salmsg); osip_free(from); } diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index 078ec24b4..870d9670e 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -83,6 +83,9 @@ void sal_remove_in_subscribe(Sal *sal, SalOp *op){ int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg){ osip_message_t *sip=NULL; + time_t t; + time(&t); + char buf[26]; if(op->cid == -1) { @@ -97,6 +100,7 @@ int sal_message_send(SalOp *op, const char *from, const char *to, const char* co eXosip_message_build_request(&sip,"MESSAGE",sal_op_get_to(op), sal_op_get_from(op),sal_op_get_route(op)); if (sip!=NULL){ + osip_message_set_date(sip,ctime_r(&t,buf)); osip_message_set_content_type(sip,content_type); if (msg) osip_message_set_body(sip,msg,strlen(msg)); sal_add_other(op->base.root,op,sip); diff --git a/gtk/chat.c b/gtk/chat.c index 19bcc3429..3eea9255c 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -90,7 +90,8 @@ void udpate_tab_chat_header(GtkWidget *chat_view,const LinphoneAddress *uri,Linp } -void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, const char *message, gboolean me,LinphoneChatRoom *cr){ +void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, + const char *message, gboolean me,LinphoneChatRoom *cr, time_t t){ GtkTextView *text=GTK_TEXT_VIEW(linphone_gtk_get_widget(w,"textview")); GtkTextBuffer *buffer=gtk_text_view_get_buffer(text); GtkTextIter iter,begin,end; @@ -129,15 +130,19 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, const cha } g_object_set_data(G_OBJECT(linphone_gtk_get_main_window()),"history",hash); + + gtk_text_buffer_get_end_iter(buffer,&iter); + list=g_list_append(list,GINT_TO_POINTER(gtk_text_iter_get_line(&iter))); if(me){ - gtk_text_buffer_get_end_iter(buffer,&iter); - list=g_list_append(list,GINT_TO_POINTER(gtk_text_iter_get_line(&iter))); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Message in progress.. ",-1, "italic","right","small","font_grey",NULL); - gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert(buffer,&iter,"\n",-1); - g_object_set_data(G_OBJECT(w),"list",list); + } else { + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,ctime(&t),-1, + "italic","right","small","font_grey",NULL); } + gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_insert(buffer,&iter,"\n",-1); + g_object_set_data(G_OBJECT(w),"list",list); GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); gtk_text_view_scroll_mark_onscreen(text,mark); @@ -193,11 +198,6 @@ void update_chat_state_message(LinphoneChatMessageState state){ break; default : result="Message in progress.. "; } - - /*GDateTime *dt=g_date_time_new_now_local(); - char *time=g_date_time_format(dt,"%k:%M"); - gchar result2[80]; - sprintf(result2,"%s %s",result,time);*/ gtk_text_buffer_insert_with_tags_by_name(b,&iter,result,-1, "italic","right","small","font_grey",NULL); @@ -221,10 +221,10 @@ void linphone_gtk_send_text(){ entered=gtk_entry_get_text(GTK_ENTRY(entry)); if (strlen(entered)>0) { LinphoneChatMessage *msg; + msg=linphone_chat_room_create_message(cr,entered); linphone_gtk_push_text(w, linphone_gtk_get_used_identity(), - entered,TRUE,cr); - msg=linphone_chat_room_create_message(cr,entered); + entered,TRUE,cr,linphone_chat_message_get_time(msg)); linphone_chat_room_send_message2(cr,msg,on_chat_state_changed,NULL); gtk_entry_set_text(GTK_ENTRY(entry),""); } @@ -338,25 +338,25 @@ void linphone_gtk_chat_close(GtkWidget *button){ } -void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message){ +void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, + LinphoneChatMessage *msg){ GtkWidget *main_window=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *w; - /*GDateTime *dt=g_date_time_new_now_local(); - char *time=g_date_time_format(dt,"%k:%M");*/ + w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); if(w!=NULL){ - linphone_gtk_load_chatroom(room,from,w); + linphone_gtk_load_chatroom(room,linphone_chat_message_get_from(msg),w); } else { - w=linphone_gtk_init_chatroom(room,from); + w=linphone_gtk_init_chatroom(room,linphone_chat_message_get_from(msg)); g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); - g_object_set_data(G_OBJECT(friendlist),"from",(gpointer)from); + g_object_set_data(G_OBJECT(friendlist),"from",(gpointer)linphone_chat_message_get_from(msg)); } - const char *display=linphone_address_get_display_name(from); + const char *display=linphone_address_get_display_name(linphone_chat_message_get_from(msg)); if (display==NULL || display[0]=='\0') { - display=linphone_address_get_username(from); + display=linphone_address_get_username(linphone_chat_message_get_from(msg)); } #ifdef HAVE_GTK_OSXs @@ -365,16 +365,15 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const #else if(!gtk_window_is_active(GTK_WINDOW(main_window))){ if(!GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_notified"))){ - /*gchar result2[80]; - sprintf(result2,"%s \n %s sent at %s",message,display,time);*/ - linphone_gtk_notify(NULL,message); + linphone_gtk_notify(NULL,linphone_chat_message_get_text(msg)); g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(TRUE)); } else { g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(FALSE)); } } #endif - linphone_gtk_push_text(w,from,message,FALSE,room); + linphone_gtk_push_text(w,linphone_chat_message_get_from(msg), + linphone_chat_message_get_text(msg),FALSE,room,linphone_chat_message_get_time(msg)); linphone_gtk_update_chat_picture(); //gtk_window_present(GTK_WINDOW(w)); /*gtk_window_set_urgency_hint(GTK_WINDOW(w),TRUE);*/ diff --git a/gtk/linphone.h b/gtk/linphone.h index ee584b038..55b30c829 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -74,7 +74,7 @@ void linphone_gtk_fill_soundcards(GtkWidget *pb); void linphone_gtk_fill_webcams(GtkWidget *pb); void linphone_gtk_load_identities(void); LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with); -void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message); +void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg); void linphone_gtk_call_log_update(GtkWidget *w); void linphone_gtk_create_log_window(void); void linphone_gtk_log_show(void); diff --git a/gtk/main.c b/gtk/main.c index bc333645b..a2461269c 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -230,7 +230,8 @@ static void linphone_gtk_init_liblinphone(const char *config_file, vtable.display_warning=linphone_gtk_display_warning; vtable.display_url=linphone_gtk_display_url; vtable.call_log_updated=linphone_gtk_call_log_updated; - vtable.text_received=linphone_gtk_text_received; + //vtable.text_received=linphone_gtk_text_received; + vtable.message_received=linphone_gtk_text_received; vtable.refer_received=linphone_gtk_refer_received; vtable.buddy_info_updated=linphone_gtk_buddy_info_updated; vtable.call_encryption_changed=linphone_gtk_call_encryption_changed; diff --git a/gtk/main.ui b/gtk/main.ui index 97e9b4701..76e96e808 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -959,6 +959,7 @@ True True + 2 0 @@ -987,6 +988,7 @@ False True + 6 2 @@ -1116,7 +1118,7 @@ False False - 12 + 6 0 @@ -1384,6 +1386,7 @@ True True + 6 1 From c7946c6225741cbda9ecd919e8f5d555e376bd47 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 30 Jan 2013 17:14:14 +0100 Subject: [PATCH 052/281] Keypad in another frame --- gtk/chat.c | 5 +- gtk/incall_view.c | 15 --- gtk/keypad.ui | 277 ++++++++++++++++++++++++++++++++++++++++++++++ gtk/linphone.h | 1 - gtk/main.c | 13 ++- gtk/main.ui | 58 +++++----- 6 files changed, 318 insertions(+), 51 deletions(-) create mode 100644 gtk/keypad.ui diff --git a/gtk/chat.c b/gtk/chat.c index 3eea9255c..5eaf79e93 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -137,7 +137,10 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Message in progress.. ",-1, "italic","right","small","font_grey",NULL); } else { - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,ctime(&t),-1, + struct tm *tm=localtime(&t); + char buf[80]; + strftime(buf,80,"%H:%M",tm); + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,buf,-1, "italic","right","small","font_grey",NULL); } gtk_text_buffer_get_end_iter(buffer,&iter); diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 2b115a564..65446d696 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -361,13 +361,6 @@ void linphone_gtk_create_in_call_view(LinphoneCall *call){ g_signal_connect(G_OBJECT(transfer),"clicked",(GCallback)transfer_button_clicked,call); gtk_widget_hide(transfer); - GtkWidget *keypad = linphone_gtk_get_widget(call_view,"keypad"); - //gtk_button_set_image(GTK_BUTTON(keypad),gtk_image_new_from_stock - // (GTK_STOCK_GO_FORWARD,GTK_ICON_SIZE_BUTTON)); - - g_signal_connect_swapped(G_OBJECT(keypad),"clicked",(GCallback)linphone_gtk_create_keypad,call); - gtk_widget_hide(keypad); - GtkWidget *conf = linphone_gtk_get_widget(call_view,"conference_button"); gtk_button_set_image(GTK_BUTTON(conf),gtk_image_new_from_stock (GTK_STOCK_ADD,GTK_ICON_SIZE_BUTTON)); g_signal_connect(G_OBJECT(conf),"clicked",(GCallback)conference_button_clicked,call); @@ -679,9 +672,6 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ gtk_widget_hide(linphone_gtk_get_widget(callview,"answer_decline_panel")); gtk_label_set_markup(GTK_LABEL(status),in_conf ? _("In conference") : _("In call")); - - /** keypad button **/ - //gtk_widget_set_visible(linphone_gtk_get_widget(callview,"keypad"),!in_conf); gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"conference_button"),!in_conf); gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"transfer_button"),!in_conf); @@ -755,15 +745,10 @@ void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_m gtk_widget_hide(linphone_gtk_get_widget(callview,"video_button")); gtk_widget_hide(linphone_gtk_get_widget(callview,"transfer_button")); gtk_widget_hide(linphone_gtk_get_widget(callview,"conference_button")); - gtk_widget_hide(linphone_gtk_get_widget(callview,"keypad")); linphone_gtk_enable_mute_button( GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),FALSE); linphone_gtk_enable_hold_button(call,FALSE,TRUE); - GtkWidget *keypad=(GtkWidget *)g_object_get_data(G_OBJECT(callview),"keypad"); - if(keypad!=NULL) - gtk_widget_destroy(keypad); - if (taskid!=0) g_source_remove(taskid); g_timeout_add_seconds(2,(GSourceFunc)in_call_view_terminated,call); if (in_conf) diff --git a/gtk/keypad.ui b/gtk/keypad.ui new file mode 100644 index 000000000..6b5376762 --- /dev/null +++ b/gtk/keypad.ui @@ -0,0 +1,277 @@ + + + + + + False + + + True + False + 0.5 + none + + + True + False + 0 + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 4 + 4 + 4 + True + + + D + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 3 + 4 + 3 + 4 + + + + + # + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 2 + 3 + 3 + 4 + + + + + 0 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 1 + 2 + 3 + 4 + + + + + * + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 3 + 4 + + + + + C + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 3 + 4 + 2 + 3 + + + + + 9 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 2 + 3 + 2 + 3 + + + + + 8 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 1 + 2 + 2 + 3 + + + + + 7 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 2 + 3 + + + + + B + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 3 + 4 + 1 + 2 + + + + + 6 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 2 + 3 + 1 + 2 + + + + + 5 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 1 + 2 + 1 + 2 + + + + + 4 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 1 + 2 + + + + + A + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 3 + 4 + + + + + 3 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 2 + 3 + + + + + 2 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + 1 + 2 + + + + + 1 + 40 + 40 + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + + + + + + + + + + + + + diff --git a/gtk/linphone.h b/gtk/linphone.h index 55b30c829..abb395127 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -89,7 +89,6 @@ int linphone_gtk_get_ui_config_int(const char *key, int def); void linphone_gtk_set_ui_config_int(const char *key , int val); void linphone_gtk_visibility_set(const char *hiddens, const char *window_name, GtkWidget *w, gboolean show); -void linphone_gtk_create_keypad(LinphoneCall *call); void linphone_gtk_open_browser(const char *url); void linphone_gtk_check_for_new_version(void); const char *linphone_gtk_get_lang(const char *config_file); diff --git a/gtk/main.c b/gtk/main.c index a2461269c..165a70689 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1651,18 +1651,21 @@ void linphone_gtk_init_dtmf_table(GtkWidget *mw){ } -void linphone_gtk_create_keypad(LinphoneCall *call){ - GtkWidget *w=(GtkWidget*)linphone_call_get_user_pointer(call); +void linphone_gtk_create_keypad(GtkWidget *button){ + GtkWidget *mw=linphone_gtk_get_main_window(); + GtkWidget *k=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"keypad"); + if(k!=NULL){ + gtk_widget_destroy(k); + } GtkWidget *keypad=linphone_gtk_create_window("keypad"); linphone_gtk_connect_digits(keypad); linphone_gtk_init_dtmf_table(keypad); - g_object_set_data(G_OBJECT(w),"keypad",(gpointer)keypad); + g_object_set_data(G_OBJECT(mw),"keypad",(gpointer)keypad); gtk_widget_show(keypad); } static void linphone_gtk_init_main_window(){ GtkWidget *main_window; - linphone_gtk_configure_main_window(); linphone_gtk_manage_login(); load_uri_history(); @@ -1672,8 +1675,8 @@ static void linphone_gtk_init_main_window(){ main_window=linphone_gtk_get_main_window(); linphone_gtk_call_log_update(main_window); - //linphone_gtk_init_dtmf_table(main_window); linphone_gtk_update_call_buttons (NULL); + g_object_set_data(G_OBJECT(main_window),"keypad",NULL); g_object_set_data(G_OBJECT(main_window),"is_conf",GINT_TO_POINTER(FALSE)); /*prevent the main window from being destroyed by a user click on WM controls, instead we hide it*/ g_signal_connect (G_OBJECT (main_window), "delete-event", diff --git a/gtk/main.ui b/gtk/main.ui index 76e96e808..50883c3f0 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -354,32 +354,6 @@ 1 - - - True - False - - - :: - True - True - True - False - bottom - - - False - False - 0 - - - - - False - False - 2 - - False @@ -442,7 +416,7 @@ False False - 3 + 2 @@ -483,7 +457,7 @@ False False - 4 + 3 @@ -579,7 +553,7 @@ False False 7 - 5 + 4 @@ -683,6 +657,16 @@ False gtk-add + + True + False + gtk-missing-image + + + True + False + gtk-select-color + True False @@ -1107,6 +1091,22 @@ 2 + + + True + True + True + False + image18 + + + + False + False + end + 3 + + False From ea5e02935e7328dd8073ff9e07c5de3c21b2e807 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 31 Jan 2013 10:18:13 +0100 Subject: [PATCH 053/281] correction notification message --- gtk/chat.c | 6 +++--- gtk/main.c | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index 5eaf79e93..2b3a969ed 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -132,10 +132,11 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_get_end_iter(buffer,&iter); - list=g_list_append(list,GINT_TO_POINTER(gtk_text_iter_get_line(&iter))); if(me){ + list=g_list_append(list,GINT_TO_POINTER(gtk_text_iter_get_line(&iter))); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Message in progress.. ",-1, "italic","right","small","font_grey",NULL); + g_object_set_data(G_OBJECT(w),"list",list); } else { struct tm *tm=localtime(&t); char buf[80]; @@ -145,7 +146,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, } gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); - g_object_set_data(G_OBJECT(w),"list",list); + GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); gtk_text_view_scroll_mark_onscreen(text,mark); @@ -201,7 +202,6 @@ void update_chat_state_message(LinphoneChatMessageState state){ break; default : result="Message in progress.. "; } - gtk_text_buffer_insert_with_tags_by_name(b,&iter,result,-1, "italic","right","small","font_grey",NULL); list=g_list_remove(list,g_list_nth_data(list,0)); diff --git a/gtk/main.c b/gtk/main.c index 165a70689..114a7244f 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1650,7 +1650,6 @@ void linphone_gtk_init_dtmf_table(GtkWidget *mw){ g_object_set_data(G_OBJECT(linphone_gtk_get_widget(mw,"dtmf_*")),"label","*"); } - void linphone_gtk_create_keypad(GtkWidget *button){ GtkWidget *mw=linphone_gtk_get_main_window(); GtkWidget *k=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"keypad"); From a3f4d58da17ea31e6d9bd3939895340735c90f96 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 31 Jan 2013 11:54:25 +0100 Subject: [PATCH 054/281] Fix name of adaptive jitter buffer compensation configuration. --- coreapi/linphonecore.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index c6a2857fc..673131218 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -4962,8 +4962,8 @@ void rtp_config_uninit(LinphoneCore *lc) lp_config_set_int(lc->config,"rtp","audio_jitt_comp",config->audio_jitt_comp); lp_config_set_int(lc->config,"rtp","video_jitt_comp",config->video_jitt_comp); lp_config_set_int(lc->config,"rtp","nortp_timeout",config->nortp_timeout); - lp_config_set_int(lc->config,"rtp","audio_jitt_comp_enabled",config->audio_adaptive_jitt_comp_enabled); - lp_config_set_int(lc->config,"rtp","video_jitt_comp_enabled",config->video_adaptive_jitt_comp_enabled); + lp_config_set_int(lc->config,"rtp","audio_adaptive_jitt_comp_enabled",config->audio_adaptive_jitt_comp_enabled); + lp_config_set_int(lc->config,"rtp","video_adaptive_jitt_comp_enabled",config->video_adaptive_jitt_comp_enabled); } static void sound_config_uninit(LinphoneCore *lc) From 66b5069dffeca8159f840f67fabae16ff8ec0fec Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 31 Jan 2013 16:31:54 +0100 Subject: [PATCH 055/281] Clean configure.ac --- configure.ac | 595 ++++++++++++++++++++++++++----------------------- mediastreamer2 | 2 +- oRTP | 2 +- 3 files changed, 321 insertions(+), 278 deletions(-) diff --git a/configure.ac b/configure.ac index 3526920fc..1372c5af3 100644 --- a/configure.ac +++ b/configure.ac @@ -46,12 +46,12 @@ AM_CONDITIONAL(HAVE_MD5SUM,test -n $MD5SUM) case $target in *mingw32ce) - CFLAGS="$CFLAGS -D_WIN32_WCE -DORTP_STATIC -D_WIN32_WINNT=0x0501" - CXXFLAGS="$CXXFLAGS -DORTP_STATIC -D_WIN32_WINNT=0x0501" - LIBS="$LIBS -lws2 -liphlpapi" + CFLAGS="$CFLAGS -D_WIN32_WCE -DORTP_STATIC -D_WIN32_WINNT=0x0501" + CXXFLAGS="$CXXFLAGS -DORTP_STATIC -D_WIN32_WINNT=0x0501" + LIBS="$LIBS -lws2 -liphlpapi" mingw_found=yes mingwce_found=yes - ;; + ;; *mingw*) CFLAGS="$CFLAGS -DORTP_STATIC -D_WIN32_WINNT=0x0501 " CXXFLAGS="$CXXFLAGS -DORTP_STATIC -D_WIN32_WINNT=0x0501" @@ -60,17 +60,17 @@ case $target in CONSOLE_FLAGS="-mconsole" mingw_found=yes ;; - armv6-apple-darwin|armv7-apple-darwin|i386-apple-darwin|armv7s-apple-darwin) - CFLAGS="$CFLAGS -DTARGET_OS_IPHONE " - build_tests=no - ios_found=yes - ;; - x86_64-apple-darwin*|i686-apple-darwin*) - MSPLUGINS_CFLAGS="" + armv6-apple-darwin|armv7-apple-darwin|i386-apple-darwin|armv7s-apple-darwin) + CFLAGS="$CFLAGS -DTARGET_OS_IPHONE " + build_tests=no + ios_found=yes + ;; + x86_64-apple-darwin*|i686-apple-darwin*) + MSPLUGINS_CFLAGS="" dnl use macport installation ACLOCAL_MACOS_FLAGS="-I /opt/local/share/aclocal" build_macos=yes - ;; + ;; esac @@ -82,30 +82,34 @@ dnl localization tools IT_PROG_INTLTOOL([0.40], [no-xml]) AM_CONDITIONAL(BUILD_TESTS,test x$build_tests != xno) + dnl Initialize libtool LT_INIT([win32-dll shared disable-static]) + dnl Enable library dependencies linking AC_ARG_ENABLE(deplibs-link, - [AS_HELP_STRING([--disable-deplibs-link ], [Disable library dependencies linking (might break builds)])], - [enable_deplibs_linking="$enableval"], - [enable_deplibs_linking="yes"]) + [AS_HELP_STRING([--disable-deplibs-link ], [Disable library dependencies linking (might break builds)])], + [enable_deplibs_linking="$enableval"], + [enable_deplibs_linking="yes"] +) AC_MSG_NOTICE([Enable library dependencies linking: $enable_interlib_deps]) if test "${enable_deplibs_linking}" == "yes"; then - link_all_deplibs=yes - link_all_deplibs_CXX=yes + link_all_deplibs=yes + link_all_deplibs_CXX=yes else - link_all_deplibs=no - link_all_deplibs_CXX=no + link_all_deplibs=no + link_all_deplibs_CXX=no fi -AC_CONFIG_COMMANDS([libtool-hacking],[ -if test "$mingw_found" = "yes" ; then - echo "Hacking libtool to work with mingw..." - sed -e 's/\*\" \$a_deplib \"\*/\*/' < ./libtool > libtool.tmp - cp -f ./libtool.tmp ./libtool - rm -f ./libtool.tmp -fi -],[mingw_found=$mingw_found]) +AC_CONFIG_COMMANDS([libtool-hacking], + [if test "$mingw_found" = "yes" ; then + echo "Hacking libtool to work with mingw..." + sed -e 's/\*\" \$a_deplib \"\*/\*/' < ./libtool > libtool.tmp + cp -f ./libtool.tmp ./libtool + rm -f ./libtool.tmp + fi], + [mingw_found=$mingw_found] +) dnl Add the languages which your application supports here. PKG_PROG_PKG_CONFIG @@ -136,49 +140,56 @@ dnl AC_CHECK_LIB(intl,libintl_gettext) AC_CHECK_FUNCS([get_current_dir_name strndup stpcpy] ) AC_ARG_ENABLE(x11, - [AS_HELP_STRING([--disable-x11], [Disable X11 support (default=no)])], - [case "${enableval}" in - yes) enable_x11=true ;; - no) enable_x11=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --disable-x11) ;; - esac],[enable_x11=true]) + [AS_HELP_STRING([--disable-x11], [Disable X11 support (default=no)])], + [case "${enableval}" in + yes) enable_x11=true ;; + no) enable_x11=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-x11) ;; + esac], + [enable_x11=true] +) dnl conditionnal build of console interface. AC_ARG_ENABLE(console_ui, - [AS_HELP_STRING([--enable-console_ui=[yes/no]], [Turn on or off compilation of console interface (default=yes)])], - [case "${enableval}" in - yes) console_ui=true ;; - no) console_ui=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-console_ui) ;; - esac],[console_ui=true]) + [AS_HELP_STRING([--enable-console_ui=[yes/no]], [Turn on or off compilation of console interface (default=yes)])], + [case "${enableval}" in + yes) console_ui=true ;; + no) console_ui=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-console_ui) ;; + esac], + [console_ui=true] +) dnl conditionnal build of tools. AC_ARG_ENABLE(tools, - [AS_HELP_STRING([--enable-tools=[yes/no]], [Turn on or off compilation of console interface (default=yes)])], - [case "${enableval}" in - yes) build_tools=true ;; - no) build_tools=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-tools) ;; - esac],[build_tools=check]) + [AS_HELP_STRING([--enable-tools=[yes/no]], [Turn on or off compilation of console interface (default=yes)])], + [case "${enableval}" in + yes) build_tools=true ;; + no) build_tools=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-tools) ;; + 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]) + [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 + 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] + ) fi @@ -190,29 +201,30 @@ fi dnl check libxml2 (needed for tools) if test "$build_tools" != "false" ; then PKG_CHECK_MODULES(LIBXML2, [libxml-2.0],[], - [ - if test "$build_tools" = "true" ; then + [if test "$build_tools" = "true" ; then AC_MSG_ERROR([Could not found libxml2, tools cannot be compiled.]) else build_tools=false - fi - ]) + fi] + ) fi AM_CONDITIONAL(BUILD_TOOLS, test x$build_tools != xfalse) if test "$build_tools" != "false" ; then - build_tools=true - AC_DEFINE(BUILD_TOOLS, 1, [Define if tools enabled] ) + build_tools=true + AC_DEFINE(BUILD_TOOLS, 1, [Define if tools enabled] ) fi dnl conditionnal build of gtk interface. AC_ARG_ENABLE(gtk_ui, - [AS_HELP_STRING([--enable-gtk_ui=[yes/no]], [Turn on or off compilation of gtk interface (default=yes)])], - [case "${enableval}" in - yes) gtk_ui=true ;; - no) gtk_ui=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-gtk_ui) ;; - esac],[gtk_ui=true]) + [AS_HELP_STRING([--enable-gtk_ui=[yes/no]], [Turn on or off compilation of gtk interface (default=yes)])], + [case "${enableval}" in + yes) gtk_ui=true ;; + no) gtk_ui=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-gtk_ui) ;; + esac], + [gtk_ui=true] +) if test "$gtk_ui" = "true" ; then PKG_CHECK_MODULES(LIBGTK, gtk+-2.0 >= 2.18.0 gthread-2.0) @@ -225,33 +237,35 @@ else fi AC_ARG_ENABLE(notify, - [AS_HELP_STRING([--enable-notify=[yes/no]], [Enable libnotify support (default=yes)])], - [case "${enableval}" in - yes) notify=true ;; - no) notify=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-notify) ;; - esac],[notify=true]) + [AS_HELP_STRING([--enable-notify=[yes/no]], [Enable libnotify support (default=yes)])], + [case "${enableval}" in + yes) notify=true ;; + no) notify=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-notify) ;; + esac], + [notify=true] +) dnl conditionnal build of the notify library if test "$gtk_ui" = "true" ; then if test "$notify" = "true"; then PKG_CHECK_MODULES([NOTIFY4], [libnotify >= 0.7.0 ], [found_notify4=yes], foo=bar) case "$found_notify4" in - yes) + yes) AC_SUBST(NOTIFY4_CFLAGS) AC_SUBST(NOTIFY4_LIBS) AC_DEFINE([HAVE_NOTIFY4],[1],[NOTIFY4 support]) esac - PKG_CHECK_MODULES([NOTIFY1], [libnotify < 0.7.0], [found_notify1=yes], foo=bar) - case "$found_notify1" in - yes) - AC_SUBST(NOTIFY1_CFLAGS) - AC_SUBST(NOTIFY1_LIBS) - AC_DEFINE([HAVE_NOTIFY1],[1],[NOTIFY1 support]) - esac + PKG_CHECK_MODULES([NOTIFY1], [libnotify < 0.7.0], [found_notify1=yes], foo=bar) + case "$found_notify1" in + yes) + AC_SUBST(NOTIFY1_CFLAGS) + AC_SUBST(NOTIFY1_LIBS) + AC_DEFINE([HAVE_NOTIFY1],[1],[NOTIFY1 support]) + esac else - NotifyNotification *n; + NotifyNotification *n; echo "Libnotify support is disabled." fi fi @@ -260,37 +274,41 @@ dnl os-specific problems not handled by existing macros. case "$host_os" in *freebsd*) LDFLAGS="$LDFLAGS -pthread" - ;; + ;; esac case "$host_cpu" in *arm*) AC_DEFINE(__ARM__,1,[Defined if we are compiling for arm processor]) use_arm_toolchain=yes - ;; + ;; esac AC_ARG_WITH(configdir, - [AS_HELP_STRING([--with-configdir], [Set a APPDATA subdir where linphone is supposed to find its config (windows only)])], - [ configdir=${withval}],[ configdir="Linphone" ]) + [AS_HELP_STRING([--with-configdir], [Set a APPDATA subdir where linphone is supposed to find its config (windows only)])], + [ configdir=${withval}],[ configdir="Linphone" ]) AC_DEFINE_UNQUOTED(LINPHONE_CONFIG_DIR,"$configdir",[Windows appdata subdir where linphonerc can be found]) AC_ARG_ENABLE(relativeprefix, - [AS_HELP_STRING([--enable-relativeprefix], [Build a linphone that finds its resources relatively to the directory where it is installed])], - [case "${enableval}" in - yes) relativeprefix=yes ;; - no) relativeprefix=no ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-relativeprefix) ;; - esac],[relativeprefix=guess]) + [AS_HELP_STRING([--enable-relativeprefix], [Build a linphone that finds its resources relatively to the directory where it is installed])], + [case "${enableval}" in + yes) relativeprefix=yes ;; + no) relativeprefix=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-relativeprefix) ;; + esac], + [relativeprefix=guess] +) AC_ARG_ENABLE(date, - [AS_HELP_STRING([--enable-date], [Use build date in internal version number])], - [case "${enableval}" in - yes) use_date=yes ;; - no) use_date=no ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-date) ;; - esac],[use_date=no]) + [AS_HELP_STRING([--enable-date], [Use build date in internal version number])], + [case "${enableval}" in + yes) use_date=yes ;; + no) use_date=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-date) ;; + esac], + [use_date=no] +) if test x$use_date = xyes ; then AC_DEFINE(USE_BUILDDATE_VERSION,1,[Tell whether date_version.h must be used]) @@ -299,12 +317,14 @@ fi dnl enable ipv6 support AC_ARG_ENABLE(ipv6, - [AS_HELP_STRING([--enable-ipv6], [Turn on ipv6 support])], - [case "${enableval}" in - yes) ipv6=true;; - no) ipv6=false;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-ipv6) ;; - esac],[ipv6=true]) + [AS_HELP_STRING([--enable-ipv6], [Turn on ipv6 support])], + [case "${enableval}" in + yes) ipv6=true;; + no) ipv6=false;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ipv6) ;; + esac], + [ipv6=true] +) IPV6_CFLAGS= if test x$ipv6 = xtrue ; then IPV6_CFLAGS=-DINET6 @@ -313,29 +333,35 @@ AC_SUBST(IPV6_CFLAGS) dnl enable timestamp support AC_ARG_ENABLE(ntp-timestamp, - [AS_HELP_STRING([--enable-ntp-timestamp], [Turn on NTP timestamping on received packet])], - [case "${enableval}" in - yes) ntptimestamp=true;; - no) ntptimestamp=false;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-ntp-timestamp) ;; - esac],[ntptimestamp=false]) + [AS_HELP_STRING([--enable-ntp-timestamp], [Turn on NTP timestamping on received packet])], + [case "${enableval}" in + yes) ntptimestamp=true;; + no) ntptimestamp=false;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ntp-timestamp) ;; + esac], + [ntptimestamp=false] +) AC_ARG_ENABLE(debug, - [AS_HELP_STRING([--enable-debug=[yes/no]], [Enables the display of traces showing the execution of the library. (default=yes)])], - [case "${enableval}" in - yes) debug_enabled=yes;; - no) debug_enabled=no;; - *) AC_MSG_ERROR("Bad value for --enable-debug");; - esac],[debug_enabled=no]) + [AS_HELP_STRING([--enable-debug=[yes/no]], [Enables the display of traces showing the execution of the library. (default=yes)])], + [case "${enableval}" in + yes) debug_enabled=yes;; + no) debug_enabled=no;; + *) AC_MSG_ERROR("Bad value for --enable-debug");; + esac], + [debug_enabled=no] +) dnl enable truespeech codec support AC_ARG_ENABLE(truespeech, - [AS_HELP_STRING([--enable-truespeech], [Turn on TrueSpeech support (x86 only)])], - [case "${enableval}" in - yes) truespeech=true;; - no) truespeech=false;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-truespeech) ;; - esac],[truespeech=false]) + [AS_HELP_STRING([--enable-truespeech], [Turn on TrueSpeech support (x86 only)])], + [case "${enableval}" in + yes) truespeech=true;; + no) truespeech=false;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-truespeech) ;; + esac], + [truespeech=false] +) TRUESPEECH_CFLAGS= if test x$truespeech = xtrue ; then TRUESPEECH_CFLAGS=-DTRUESPEECH @@ -344,21 +370,24 @@ AC_SUBST(TRUESPEECH_CFLAGS) AM_CONDITIONAL([BUILD_TRUESPEECH], [test x$truespeech = xtrue]) AC_ARG_ENABLE(nonstandard-gsm, - [AS_HELP_STRING([--enable-nonstandard-gsm], [Enable GSM codec at nonstandard rates (11025hz, 16000hz)])], - [case "${enableval}" in - yes) exotic_gsm=yes - AC_DEFINE(ENABLE_NONSTANDARD_GSM,1,[Defined when using gsm at nonstandard rates]) - ;; - no) exotic_gsm=no ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-nonstandard-gsm) ;; - esac],[exotic_gsm=no]) + [AS_HELP_STRING([--enable-nonstandard-gsm], [Enable GSM codec at nonstandard rates (11025hz, 16000hz)])], + [case "${enableval}" in + yes) + exotic_gsm=yes + AC_DEFINE(ENABLE_NONSTANDARD_GSM,1,[Defined when using gsm at nonstandard rates]) + ;; + no) exotic_gsm=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-nonstandard-gsm) ;; + esac], + [exotic_gsm=no] +) dnl support for RSVP (by Vincent Maury) AC_ARG_ENABLE(rsvp, -[AS_HELP_STRING([--enable-rsvp], [Enable support for QoS reservations.])], -AC_DEFINE(VINCENT_MAURY_RSVP,1,[Tell whether RSVP support -should be compiled.]) ) + [AS_HELP_STRING([--enable-rsvp], [Enable support for QoS reservations.])], + AC_DEFINE(VINCENT_MAURY_RSVP,1,[Tell whether RSVP support should be compiled.]) +) if test "x${prefix}" = "xNONE"; then package_prefix=${ac_default_prefix} @@ -395,12 +424,14 @@ LP_CHECK_OSIP2 dnl conditionnal build for ssl AC_ARG_ENABLE(ssl, - [AS_HELP_STRING([--enable-ssl], [Turn on ssl support compiling. Required for sip tls. (default=false)])], - [case "${enableval}" in - yes) build_ssl=true ;; - no) build_ssl=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-ssl) ;; - esac],[build_ssl=false]) + [AS_HELP_STRING([--enable-ssl], [Turn on ssl support compiling. Required for sip tls. (default=false)])], + [case "${enableval}" in + yes) build_ssl=true ;; + no) build_ssl=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ssl) ;; + esac], + [build_ssl=false] +) if test "$build_ssl" = "true"; then PKG_CHECK_MODULES(OPENSSL, libssl >= 0.9.8) @@ -411,26 +442,30 @@ LP_SETUP_EXOSIP dnl check exosip support of DSCP in exosip AC_MSG_CHECKING([for DSCP support in exosip]) AC_TRY_COMPILE([#include ], -[int dscp=0;eXosip_set_option(EXOSIP_OPT_SET_DSCP,&dscp);], -has_exosip_dscp=yes,has_exosip_dscp=no) + [int dscp=0;eXosip_set_option(EXOSIP_OPT_SET_DSCP,&dscp);], + has_exosip_dscp=yes, + has_exosip_dscp=no +) AC_MSG_RESULT($has_exosip_dscp) if test "$has_exosip_dscp" = "yes" ; then - AC_DEFINE( HAVE_EXOSIP_DSCP, 1, [Define if exosip dscp available] ) + AC_DEFINE( HAVE_EXOSIP_DSCP, 1, [Define if exosip dscp available] ) fi if test "$console_ui" = "true" ; then -dnl check gnu readline -LP_CHECK_READLINE + dnl check gnu readline + LP_CHECK_READLINE else -echo "Console interface compilation is disabled." + echo "Console interface compilation is disabled." fi AC_WORDS_BIGENDIAN AC_ARG_ENABLE([speex], - AS_HELP_STRING([--disable-speex], [Disable speex support]), - [], [enable_speex=yes]) + AS_HELP_STRING([--disable-speex], [Disable speex support]), + [], + [enable_speex=yes] +) if test "x$enable_speex" = "xyes"; then dnl normaly this should only by done by mediastreamer2/configure.ac dnl but to workaround bugs when cross-compiling for arm-linux, @@ -442,16 +477,20 @@ fi dnl conditionnal build of video support AC_ARG_ENABLE(video, - [AS_HELP_STRING([--enable-video], [Turn on video support compiling])], - [case "${enableval}" in - yes) video=true ;; - no) video=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-video) ;; - esac],[video=true]) + [AS_HELP_STRING([--enable-video], [Turn on video support compiling])], + [case "${enableval}" in + yes) video=true ;; + no) video=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-video) ;; + esac], + [video=true] +) -AC_ARG_WITH( ffmpeg, - [AS_HELP_STRING([--with-ffmpeg], [Sets the installation prefix of ffmpeg, needed for video support. (default=/usr)])], - [ ffmpegdir=${withval}],[ ffmpegdir=/usr ]) +AC_ARG_WITH(ffmpeg, + [AS_HELP_STRING([--with-ffmpeg], [Sets the installation prefix of ffmpeg, needed for video support. (default=/usr)])], + [ ffmpegdir=${withval}], + [ ffmpegdir=/usr ] +) if test "$video" = "true"; then @@ -468,29 +507,35 @@ if test "$video" = "true"; then fi AC_ARG_ENABLE(alsa, - [AS_HELP_STRING([--enable-alsa], [Turn on alsa native support compiling])], - [case "${enableval}" in - yes) alsa=true ;; - no) alsa=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-alsa) ;; - esac],[alsa=true]) + [AS_HELP_STRING([--enable-alsa], [Turn on alsa native support compiling])], + [case "${enableval}" in + yes) alsa=true ;; + no) alsa=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-alsa) ;; + esac], + [alsa=true] +) AC_ARG_ENABLE(zrtp, - [AS_HELP_STRING([--enable-zrtp], [Turn on zrtp support])], - [case "${enableval}" in - yes) zrtp=true ;; - no) zrtp=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-zrtp) ;; - esac],[zrtp=false]) + [AS_HELP_STRING([--enable-zrtp], [Turn on zrtp support])], + [case "${enableval}" in + yes) zrtp=true ;; + no) zrtp=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-zrtp) ;; + esac], + [zrtp=false] +) AC_ARG_ENABLE(portaudio, - [AS_HELP_STRING([--enable-portaudio], [Turn on portaudio native support compiling])], - [case "${enableval}" in - yes) portaudio=true ;; - no) portaudio=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-portaudio) ;; - esac],[portaudio=false]) + [AS_HELP_STRING([--enable-portaudio], [Turn on portaudio native support compiling])], + [case "${enableval}" in + yes) portaudio=true ;; + no) portaudio=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-portaudio) ;; + esac], + [portaudio=false] +) dnl build console if required AM_CONDITIONAL(BUILD_CONSOLE, test x$console_ui = xtrue) @@ -513,44 +558,44 @@ AC_TRY_COMPILE([#include ],[sighandler_t *f;], has_sighandler_t=yes,has_sighandler_t=no) AC_MSG_RESULT($has_sighandler_t) if test "$has_sighandler_t" = "yes" ; then - AC_DEFINE( HAVE_SIGHANDLER_T, 1, [Define if sighandler_t available] ) + AC_DEFINE( HAVE_SIGHANDLER_T, 1, [Define if sighandler_t available] ) fi AC_ARG_ENABLE(assistant, - [AS_HELP_STRING([--enable-assistant], [Turn on assistant compiling])], - [case "${enableval}" in - yes) build_wizard=true ;; - no) build_wizard=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-assistant) ;; - esac],[build_wizard=check]) + [AS_HELP_STRING([--enable-assistant], [Turn on assistant compiling])], + [case "${enableval}" in + yes) build_wizard=true ;; + no) build_wizard=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-assistant) ;; + esac], + [build_wizard=check] +) dnl check libsoup (needed for wizard) if test "$build_wizard" != "false" ; then PKG_CHECK_MODULES(LIBSOUP, [libsoup-2.4 >= 2.26],[], - [ - if test "$build_wizard" = "true" ; then + [if test "$build_wizard" = "true" ; then AC_MSG_ERROR([Could not found libsoup, assistant cannot be compiled.]) else build_wizard=false - fi - ]) + fi] + ) fi if test "$build_wizard" != "false" ; then PKG_CHECK_MODULES(LIBGTKWIZARD, [gtk+-2.0 >= 2.22.0],[], - [ - if test "$build_wizard" = "true" ; then + [if test "$build_wizard" = "true" ; then AC_MSG_ERROR([gtk+-2.0 < 2.22.0, assistant cannot be compiled.]) else build_wizard=false - fi - ]) + fi] + ) fi AC_SUBST(LIBSOUP_CFLAGS) AC_SUBST(LIBSOUP_LIBS) AM_CONDITIONAL(BUILD_WIZARD, test x$build_wizard != xfalse) if test "$build_wizard" != "false" ; then - build_wizard=true - AC_DEFINE(BUILD_WIZARD, 1, [Define if wizard enabled] ) + build_wizard=true + AC_DEFINE(BUILD_WIZARD, 1, [Define if wizard enabled] ) fi AC_CHECK_HEADERS(libudev.h) @@ -562,9 +607,9 @@ AC_CHECK_LIB(udev,udev_new) AC_ARG_ENABLE(strict, - AC_HELP_STRING([--enable-strict], - [Build with stricter options (gcc only) @<:@yes@:>@]),[ - strictness="${enableval}"],[strictness=yes] + AC_HELP_STRING([--enable-strict], [Build with stricter options (gcc only) @<:@yes@:>@]), + [strictness="${enableval}"], + [strictness=yes] ) STRICT_OPTIONS="-Wall " @@ -579,26 +624,26 @@ AC_SUBST(STRICT_OPTIONS) top_srcdir=`dirname $0` AC_ARG_ENABLE([external-mediastreamer], - [AS_HELP_STRING([--enable-external-mediastreamer],[Use external mediastreamer library])],, - [enable_external_mediastreamer=no]) + [AS_HELP_STRING([--enable-external-mediastreamer],[Use external mediastreamer library])],, + [enable_external_mediastreamer=no] +) AS_CASE($enable_external_mediastreamer, - [yes],[ - PKG_CHECK_MODULES([MEDIASTREAMER], [mediastreamer]) - MS2_VERSION=`$PKG_CONFIG --modversion mediastreamer` - ], - [no],[ - AC_CONFIG_SUBDIRS( mediastreamer2 ) - MEDIASTREAMER_DIR=${top_srcdir}/mediastreamer2 - MEDIASTREAMER_CFLAGS="-I\$(top_srcdir)/mediastreamer2/include" - MEDIASTREAMER_LIBS="\$(top_builddir)/mediastreamer2/src/libmediastreamer_base.la \$(top_builddir)/mediastreamer2/src/libmediastreamer_voip.la" + [yes], + [PKG_CHECK_MODULES([MEDIASTREAMER], [mediastreamer]) + MS2_VERSION=`$PKG_CONFIG --modversion mediastreamer`], + [no], + [AC_CONFIG_SUBDIRS( mediastreamer2 ) + MEDIASTREAMER_DIR=${top_srcdir}/mediastreamer2 + MEDIASTREAMER_CFLAGS="-I\$(top_srcdir)/mediastreamer2/include" + MEDIASTREAMER_LIBS="\$(top_builddir)/mediastreamer2/src/libmediastreamer_base.la \$(top_builddir)/mediastreamer2/src/libmediastreamer_voip.la" dnl need to temporary change quotes to allow square brackets - changequote(<<, >>) - MS2_VERSION=`grep -e '^.C_INIT(' $MEDIASTREAMER_DIR/configure.ac | sed -e 's:\([^(]\+\)(\[mediastreamer\],\[\(.*\)\]):\2:g'` - changequote([, ]) - MS2_DIR=mediastreamer2 - ], - [AC_MSG_ERROR([bad value '${enable_external_mediastreamer}' for --enable-external-mediastreamer])]) + changequote(<<, >>) + MS2_VERSION=`grep -e '^.C_INIT(' $MEDIASTREAMER_DIR/configure.ac | sed -e 's:\([^(]\+\)(\[mediastreamer\],\[\(.*\)\]):\2:g'` + changequote([, ]) + MS2_DIR=mediastreamer2], + [AC_MSG_ERROR([bad value '${enable_external_mediastreamer}' for --enable-external-mediastreamer])] +) AC_SUBST(MEDIASTREAMER_CFLAGS) AC_SUBST(MEDIASTREAMER_LIBS) @@ -608,31 +653,25 @@ AC_SUBST([MS2_DIR]) AC_ARG_ENABLE(tunnel, - [AS_HELP_STRING([--enable-tunnel=[yes/no]], [Turn on compilation of tunnel support (default=no)])], - [case "${enableval}" in - yes) enable_tunnel=true ;; - no) enable_tunnel=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-tunnel) ;; - esac],[enable_tunnel=false]) + [AS_HELP_STRING([--enable-tunnel=[yes/no]], [Turn on compilation of tunnel support (default=no)])], + [case "${enableval}" in + yes) enable_tunnel=true ;; + no) enable_tunnel=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-tunnel) ;; + esac], + [enable_tunnel=false] +) AM_CONDITIONAL(BUILD_TUNNEL, test x$enable_tunnel = xtrue) if test x$enable_tunnel = xtrue; then - PKG_CHECK_MODULES(TUNNEL, tunnel >= 0.3.3) - TUNNEL_CFLAGS+="-DTUNNEL_ENABLED" - AC_SUBST(TUNNEL_CFLAGS) - AC_SUBST(TUNNEL_LIBS) + PKG_CHECK_MODULES(TUNNEL, tunnel >= 0.3.3) + TUNNEL_CFLAGS+="-DTUNNEL_ENABLED" + AC_SUBST(TUNNEL_CFLAGS) + AC_SUBST(TUNNEL_LIBS) fi - - - - - - - - dnl check for db2html (docbook) to generate html user manual -AC_CHECK_PROG(have_sgmltools,sgmltools, yes, no) +AC_CHECK_PROG(have_sgmltools, sgmltools, yes, no) AM_CONDITIONAL(ENABLE_MANUAL, test x$have_sgmltools$build_manual = xyesyes ) dnl for external use of linphone libs @@ -645,19 +684,21 @@ fi AC_SUBST(LINPHONE_CFLAGS) AC_SUBST(LINPHONE_LIBS) -AC_DEFINE_UNQUOTED(LINPHONE_VERSION,"$PACKAGE_VERSION",[Linphone's version number]) +AC_DEFINE_UNQUOTED(LINPHONE_VERSION, "$PACKAGE_VERSION", [Linphone\'s version number]) AC_DEFINE_UNQUOTED(LINPHONE_PLUGINS_DIR, "${package_prefix}/lib/liblinphone/plugins" ,[path of liblinphone plugins, not mediastreamer2 plugins]) LINPHONE_PLUGINS_DIR="${package_prefix}/lib/liblinphone/plugins" AC_SUBST(LINPHONE_PLUGINS_DIR) AC_ARG_ENABLE(external-ortp, - [AS_HELP_STRING([--enable-external-ortp], [Use external oRTP library])], - [case "${enableval}" in - yes) external_ortp=true ;; - no) external_ortp=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --enable-external-ortp) ;; - esac],[external_ortp=false]) + [AS_HELP_STRING([--enable-external-ortp], [Use external oRTP library])], + [case "${enableval}" in + yes) external_ortp=true ;; + no) external_ortp=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-external-ortp) ;; + esac], + [external_ortp=false] +) if test "$external_ortp" = 'true'; then PKG_CHECK_MODULES([ORTP], [ortp]) @@ -670,7 +711,7 @@ else ORTP_CFLAGS="$ORTP_CFLAGS -DORTP_BIGENDIAN" fi if test x$ntptimestamp = xtrue ; then - ORTP_CFLAGS="$ORTP_CFLAGS -DORTP_TIMESTAMP" + ORTP_CFLAGS="$ORTP_CFLAGS -DORTP_TIMESTAMP" fi ORTP_DIR=oRTP changequote(<<, >>) @@ -683,12 +724,14 @@ AC_SUBST([ORTP_VERSION]) AC_SUBST([ORTP_DIR]) AC_ARG_ENABLE(tests_enabled, - [AS_HELP_STRING([--disable-tests], [Disable compilation of tests])], - [case "${enableval}" in - yes) tests_enabled=true ;; - no) tests_enabled=false ;; - *) AC_MSG_ERROR(bad value ${enableval} for --disable-tests) ;; - esac],[tests_enabled=false]) + [AS_HELP_STRING([--disable-tests], [Disable compilation of tests])], + [case "${enableval}" in + yes) tests_enabled=true ;; + no) tests_enabled=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-tests) ;; + esac], + [tests_enabled=false] +) AM_CONDITIONAL(ENABLE_TESTS, test x$tests_enabled = xyes) @@ -702,43 +745,43 @@ AM_CONDITIONAL(HAVE_DOXYGEN, test $DOXYGEN != false) AC_CONFIG_FILES([ -Makefile -build/Makefile -build/macos/Makefile -build/macos/Info-linphone.plist -m4/Makefile -po/Makefile.in -pixmaps/Makefile -coreapi/Makefile -coreapi/help/Makefile -coreapi/help/Doxyfile -gtk/Makefile -console/Makefile -share/Makefile -share/C/Makefile -share/fr/Makefile -share/it/Makefile -share/ja/Makefile -share/cs/Makefile -share/xml/Makefile -share/linphone.pc -share/linphone.desktop -scripts/Makefile -tools/Makefile -linphone.spec -linphone.iss + Makefile + build/Makefile + build/macos/Makefile + build/macos/Info-linphone.plist + m4/Makefile + po/Makefile.in + pixmaps/Makefile + coreapi/Makefile + coreapi/help/Makefile + coreapi/help/Doxyfile + gtk/Makefile + console/Makefile + share/Makefile + share/C/Makefile + share/fr/Makefile + share/it/Makefile + share/ja/Makefile + share/cs/Makefile + share/xml/Makefile + share/linphone.pc + share/linphone.desktop + scripts/Makefile + tools/Makefile + linphone.spec + linphone.iss ]) AC_OUTPUT echo "Linphone build configuration ended." echo "Summary of build options:" -printf "* Video support\t\t\t%s\n" $video -printf "* GTK interface\t\t\t%s\n" $gtk_ui -printf "* Account assistant\t\t%s\n" $build_wizard -printf "* Console interface\t\t%s\n" $console_ui -printf "* Tools\t\t\t\t%s\n" $build_tools -printf "* zRTP encryption (GPLv3)\t%s\n" $zrtp +printf "* %-30s %s\n" "Video support" $video +printf "* %-30s %s\n" "GTK interface" $gtk_ui +printf "* %-30s %s\n" "Account assistant" $build_wizard +printf "* %-30s %s\n" "Console interface" $console_ui +printf "* %-30s %s\n" "Tools" $build_tools +printf "* %-30s %s\n" "zRTP encryption (GPLv3)" $zrtp if test "$enable_tunnel" = "true" ; then printf "* Tunnel support\t\ttrue\n" diff --git a/mediastreamer2 b/mediastreamer2 index 97e002ca2..e5d529906 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 97e002ca2fd4273f7a229caf9fee2d9487814c91 +Subproject commit e5d52990695be15802741e920801f77d24bd8fba diff --git a/oRTP b/oRTP index 20abeb39e..b055a5050 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 20abeb39e1edae0f72080f7998410e9b16b9da05 +Subproject commit b055a505042c4420e104ce81a09790c5373f62bb From 740a74d12fe901ca5a11c4491e9b250eaa71904f Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 1 Feb 2013 09:06:22 +0100 Subject: [PATCH 056/281] add keypad.ui to potfiles.in --- po/POTFILES.in | 1 + 1 file changed, 1 insertion(+) diff --git a/po/POTFILES.in b/po/POTFILES.in index 1af3423bb..4a4497cbd 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -26,6 +26,7 @@ gtk/loginframe.c [type: gettext/glade]gtk/dscp_settings.ui [type: gettext/glade]gtk/call_statistics.ui [type: gettext/glade]gtk/tunnel_config.ui +[type: gettext/glade]gtk/keypad.ui coreapi/linphonecore.c coreapi/misc.c coreapi/presence.c From ad800f9976d64e78d58da7f1dc903612f774cf68 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 1 Feb 2013 09:32:59 +0100 Subject: [PATCH 057/281] fix compilation for windows --- coreapi/sal_eXosip2_presence.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index 870d9670e..ddd246a79 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -81,6 +81,17 @@ void sal_remove_in_subscribe(Sal *sal, SalOp *op){ sal->in_subscribes=ms_list_remove(sal->in_subscribes,op); } +#ifdef WIN32 + +static inline char *my_ctime_r(const time_t *t, char *buf){ + strcpy(buf,ctime_r(t)); + return buf; +} + +#else +#define my_ctime_r ctime_r +#endif + int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg){ osip_message_t *sip=NULL; time_t t; @@ -100,7 +111,7 @@ int sal_message_send(SalOp *op, const char *from, const char *to, const char* co eXosip_message_build_request(&sip,"MESSAGE",sal_op_get_to(op), sal_op_get_from(op),sal_op_get_route(op)); if (sip!=NULL){ - osip_message_set_date(sip,ctime_r(&t,buf)); + osip_message_set_date(sip,my_ctime_r(&t,buf)); osip_message_set_content_type(sip,content_type); if (msg) osip_message_set_body(sip,msg,strlen(msg)); sal_add_other(op->base.root,op,sip); From f65e26aa186167ac6ec051b61e86dffd3d93055e Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 1 Feb 2013 09:34:26 +0100 Subject: [PATCH 058/281] fix previous commit --- coreapi/sal_eXosip2_presence.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index ddd246a79..8156c3839 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -84,7 +84,7 @@ void sal_remove_in_subscribe(Sal *sal, SalOp *op){ #ifdef WIN32 static inline char *my_ctime_r(const time_t *t, char *buf){ - strcpy(buf,ctime_r(t)); + strcpy(buf,ctime(t)); return buf; } From bf0953eb1d3c83471c6950eea505bea4e67f93e6 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 5 Feb 2013 10:02:32 +0100 Subject: [PATCH 059/281] Add check in lpc2xml Add jni for lpc2xml and xml2lpc Add some jni for LPConfigImpl --- build/android/Android.mk | 9 +- build/android/lpc2xml.mk | 47 ++++++ build/android/xml2lpc.mk | 47 ++++++ coreapi/linphonecore_jni.cc | 12 ++ .../linphone/core/LinphoneCoreFactory.java | 1 + .../core/LinphoneCoreFactoryImpl.java | 5 + java/impl/org/linphone/core/LpConfigImpl.java | 9 ++ java/impl/org/linphone/tools/Lpc2Xml.java | 68 ++++++++ java/impl/org/linphone/tools/Xml2Lpc.java | 72 +++++++++ tools/Makefile.am | 2 + tools/lpc2xml.c | 85 ++++++++-- tools/lpc2xml_jni.cc | 123 +++++++++++++++ tools/my_jni.h | 108 +++++++++++++ tools/xml2lpc_jni.cc | 149 ++++++++++++++++++ 14 files changed, 719 insertions(+), 18 deletions(-) create mode 100644 build/android/lpc2xml.mk create mode 100644 build/android/xml2lpc.mk create mode 100644 java/impl/org/linphone/tools/Lpc2Xml.java create mode 100644 java/impl/org/linphone/tools/Xml2Lpc.java create mode 100644 tools/lpc2xml_jni.cc create mode 100644 tools/my_jni.h create mode 100644 tools/xml2lpc_jni.cc diff --git a/build/android/Android.mk b/build/android/Android.mk index b46664b61..7fb75d0a4 100755 --- a/build/android/Android.mk +++ b/build/android/Android.mk @@ -21,7 +21,6 @@ LOCAL_PATH:= $(call my-dir)/../../coreapi - include $(CLEAR_VARS) include $(linphone-root-dir)/submodules/linphone/build/android/common.mk @@ -39,3 +38,11 @@ LOCAL_MODULE := liblinphone include $(BUILD_SHARED_LIBRARY) $(call import-module,android/cpufeatures) + + +ifeq ($(BUILD_REMOTE_PROVISIONING),1) + +include $(linphone-root-dir)/submodules/linphone/build/android/xml2lpc.mk +include $(linphone-root-dir)/submodules/linphone/build/android/lpc2xml.mk + +endif diff --git a/build/android/lpc2xml.mk b/build/android/lpc2xml.mk new file mode 100644 index 000000000..f7858f94d --- /dev/null +++ b/build/android/lpc2xml.mk @@ -0,0 +1,47 @@ +## +## Android.mk -Android build script- +## +## +## Copyright (C) 2013 Belledonne Communications, Grenoble, France +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +## + +LOCAL_PATH:= $(call my-dir)/../../tools + +include $(CLEAR_VARS) + +LOCAL_CPP_EXTENSION := .cc + +LOCAL_SRC_FILES := \ + lpc2xml.c \ + lpc2xml_jni.cc \ + +LOCAL_CFLAGS += -DIN_LINPHONE + +LOCAL_C_INCLUDES = \ + $(LOCAL_PATH)/../coreapi \ + $(LOCAL_PATH)/../oRTP/include \ + $(LOCAL_PATH)/../mediastreamer2/include \ + $(LOCAL_PATH)/../../externals/libxml2/include \ + $(LOCAL_PATH)/../../externals/build/libxml2 \ + +LOCAL_SHARED_LIBRARIES = \ + libxml2 \ + liblinphone \ + +LOCAL_MODULE := liblpc2xml + +include $(BUILD_SHARED_LIBRARY) diff --git a/build/android/xml2lpc.mk b/build/android/xml2lpc.mk new file mode 100644 index 000000000..32bfb38c3 --- /dev/null +++ b/build/android/xml2lpc.mk @@ -0,0 +1,47 @@ +## +## Android.mk -Android build script- +## +## +## Copyright (C) 2013 Belledonne Communications, Grenoble, France +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +## + +LOCAL_PATH:= $(call my-dir)/../../tools + +include $(CLEAR_VARS) + +LOCAL_CPP_EXTENSION := .cc + +LOCAL_SRC_FILES := \ + xml2lpc.c \ + xml2lpc_jni.cc \ + +LOCAL_CFLAGS += -DIN_LINPHONE + +LOCAL_C_INCLUDES = \ + $(LOCAL_PATH)/../coreapi \ + $(LOCAL_PATH)/../oRTP/include \ + $(LOCAL_PATH)/../mediastreamer2/include \ + $(LOCAL_PATH)/../../externals/libxml2/include \ + $(LOCAL_PATH)/../../externals/build/libxml2 \ + +LOCAL_SHARED_LIBRARIES = \ + libxml2 \ + liblinphone \ + +LOCAL_MODULE := libxml2lpc + +include $(BUILD_SHARED_LIBRARY) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 8b2d2b519..9629688c7 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -2239,6 +2239,18 @@ extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_getConfig(JNIEnv *env, return (jlong) linphone_core_get_config((LinphoneCore *)lc); } +extern "C" jlong Java_org_linphone_core_LpConfigImpl_newLpConfigImpl(JNIEnv *env, jobject thiz, jstring file) { + const char *cfile = env->GetStringUTFChars(file, NULL); + LpConfig *lp = lp_config_new(cfile); + env->ReleaseStringUTFChars(file, cfile); + return (jlong) lp; +} + +extern "C" void Java_org_linphone_core_LpConfigImpl_delete(JNIEnv *env, jobject thiz, jlong lpc) { + LpConfig *lp = (LpConfig *)lpc; + lp_config_destroy(lp); +} + extern "C" void Java_org_linphone_core_LpConfigImpl_setInt(JNIEnv *env, jobject thiz, jlong lpc, jstring section, jstring key, jint value) { const char *csection = env->GetStringUTFChars(section, NULL); diff --git a/java/common/org/linphone/core/LinphoneCoreFactory.java b/java/common/org/linphone/core/LinphoneCoreFactory.java index 100794016..399b9ec8d 100644 --- a/java/common/org/linphone/core/LinphoneCoreFactory.java +++ b/java/common/org/linphone/core/LinphoneCoreFactory.java @@ -67,6 +67,7 @@ abstract public class LinphoneCoreFactory { * @return */ abstract public LinphoneAddress createLinphoneAddress(String address); + abstract public LpConfig createLpConfig(String file); abstract public LinphoneProxyConfig createProxyConfig(String identity, String proxy,String route,boolean enableRegister) throws LinphoneCoreException; /** diff --git a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java index 04b6af1cf..2e5c4cf59 100644 --- a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java @@ -105,6 +105,11 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { public LinphoneAddress createLinphoneAddress(String identity) { return new LinphoneAddressImpl(identity); } + + @Override + public LpConfig createLpConfig(String file) { + return new LpConfigImpl(file); + } @Override public LinphoneCore createLinphoneCore(LinphoneCoreListener listener, diff --git a/java/impl/org/linphone/core/LpConfigImpl.java b/java/impl/org/linphone/core/LpConfigImpl.java index 1cb705ec2..27bd63d13 100644 --- a/java/impl/org/linphone/core/LpConfigImpl.java +++ b/java/impl/org/linphone/core/LpConfigImpl.java @@ -27,6 +27,15 @@ class LpConfigImpl implements LpConfig { public LpConfigImpl(long ptr) { nativePtr=ptr; } + + private native long newLpConfigImpl(String file); + private native void delete(long ptr); + public LpConfigImpl(String file) { + nativePtr = newLpConfigImpl(file); + } + protected void finalize() throws Throwable { + delete(nativePtr); + } private native void setInt(long ptr, String section, String key, int value); public void setInt(String section, String key, int value) { diff --git a/java/impl/org/linphone/tools/Lpc2Xml.java b/java/impl/org/linphone/tools/Lpc2Xml.java new file mode 100644 index 000000000..97ef99637 --- /dev/null +++ b/java/impl/org/linphone/tools/Lpc2Xml.java @@ -0,0 +1,68 @@ +package org.linphone.tools; + +import org.linphone.core.LpConfig; +import org.linphone.mediastream.Log; + +public class Lpc2Xml { + + private enum LogLevel { + DEBUG, + MESSAGE, + WARNING, + ERROR, + } + + private static boolean mAvailable; + + private long internalPtr = 0; + + private native void init(); + private native void destroy(); + + public Lpc2Xml() { + init(); + } + + public void finalize() { + destroy(); + } + + public native int setLpc(LpConfig lpc); + + public native int convertFile(String file); + public native int convertString(StringBuffer content); + + public void printLog(int level, String message) { + if(level > 0 && level < LogLevel.values().length) { + switch(LogLevel.values()[level]) { + case DEBUG: + Log.d(message); + break; + case MESSAGE: + Log.i(message); + break; + case WARNING: + Log.w(message); + break; + case ERROR: + Log.e(message); + break; + } + } + } + + static boolean isAvailable() { + return mAvailable; + } + + // Load library + static { + try { + System.loadLibrary("xml2"); + System.loadLibrary("lpc2xml"); + mAvailable = true; + } catch (Throwable e) { + mAvailable = false; + } + } +} diff --git a/java/impl/org/linphone/tools/Xml2Lpc.java b/java/impl/org/linphone/tools/Xml2Lpc.java new file mode 100644 index 000000000..9f6cb0f27 --- /dev/null +++ b/java/impl/org/linphone/tools/Xml2Lpc.java @@ -0,0 +1,72 @@ +package org.linphone.tools; + +import org.linphone.core.LpConfig; +import org.linphone.mediastream.Log; + +public class Xml2Lpc { + + private enum LogLevel { + DEBUG, + MESSAGE, + WARNING, + ERROR + } + + private static boolean mAvailable; + + private long internalPtr = 0; + + private native void init(); + private native void destroy(); + + public Xml2Lpc() { + init(); + } + + public void finalize() { + destroy(); + } + + public native int setXmlFile(String filename); + public native int setXmlString(String content); + + public native int setXsdFile(String filename); + public native int setXsdString(String content); + + public native int validate(); + public native int convert(LpConfig config); + + public void printLog(int level, String message) { + if(level > 0 && level < LogLevel.values().length) { + switch(LogLevel.values()[level]) { + case DEBUG: + Log.d(message); + break; + case MESSAGE: + Log.i(message); + break; + case WARNING: + Log.w(message); + break; + case ERROR: + Log.e(message); + break; + } + } + } + + public static boolean isAvailable() { + return mAvailable; + } + + // Load library + static { + try { + System.loadLibrary("xml2"); + System.loadLibrary("xml2lpc"); + mAvailable = true; + } catch (Throwable e) { + mAvailable = false; + } + } +} diff --git a/tools/Makefile.am b/tools/Makefile.am index ffb469214..a93d809f1 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -11,6 +11,8 @@ COMMON_CFLAGS=\ $(STRICT_OPTIONS) \ $(LIBXML2_CFLAGS) +EXTRA_DIST=xml2lpc_jni.cc lpc2xml_jni.cc + if BUILD_TOOLS lib_LTLIBRARIES=libxml2lpc.la liblpc2xml.la diff --git a/tools/lpc2xml.c b/tools/lpc2xml.c index feabdde2e..97262861c 100644 --- a/tools/lpc2xml.c +++ b/tools/lpc2xml.c @@ -57,11 +57,11 @@ void lpc2xml_context_destroy(lpc2xml_context *ctx) { } free(ctx); } -/* + static void lpc2xml_context_clear_logs(lpc2xml_context *ctx) { ctx->errorBuffer[0]='\0'; ctx->warningBuffer[0]='\0'; -}*/ +} static void lpc2xml_log(lpc2xml_context *xmlCtx, int level, const char *fmt, ...) { va_list args; @@ -72,6 +72,24 @@ static void lpc2xml_log(lpc2xml_context *xmlCtx, int level, const char *fmt, ... va_end(args); } +static void lpc2xml_genericxml_error(void *ctx, const char *fmt, ...) { + lpc2xml_context *xmlCtx = (lpc2xml_context *)ctx; + int sl = strlen(xmlCtx->errorBuffer); + va_list args; + va_start(args, fmt); + vsnprintf(xmlCtx->errorBuffer + sl, LPC2XML_BZ-sl, fmt, args); + va_end(args); +} + +static void lpc2xml_genericxml_warning(void *ctx, const char *fmt, ...) { + lpc2xml_context *xmlCtx = (lpc2xml_context *)ctx; + int sl = strlen(xmlCtx->warningBuffer); + va_list args; + va_start(args, fmt); + vsnprintf(xmlCtx->warningBuffer + sl, LPC2XML_BZ-sl, fmt, args); + va_end(args); +} + static int processEntry(const char *section, const char *entry, xmlNode *node, lpc2xml_context *ctx) { const char *content = lp_config_get_string(ctx->lpc, section, entry, NULL); if(content == NULL) { @@ -195,36 +213,69 @@ int lpc2xml_set_lpc(lpc2xml_context* context, const LpConfig *lpc) { } int lpc2xml_convert_file(lpc2xml_context* context, const char *filename) { - int ret = 0; + int ret = -1; + lpc2xml_context_clear_logs(context); + xmlSetGenericErrorFunc(context, lpc2xml_genericxml_error); xmlSaveCtxtPtr save_ctx = xmlSaveToFilename(filename, "UTF-8", XML_SAVE_FORMAT); - ret = internal_convert_lpc2xml(context); - if(ret == 0) { - ret = xmlSaveDoc(save_ctx, context->doc); + if(save_ctx != NULL) { + ret = internal_convert_lpc2xml(context); + if(ret == 0) { + ret = xmlSaveDoc(save_ctx, context->doc); + if(ret != 0) { + lpc2xml_log(context, LPC2XML_ERROR, "Can't save document"); + lpc2xml_log(context, LPC2XML_ERROR, "%s", context->errorBuffer); + } + } + xmlSaveClose(save_ctx); + } else { + lpc2xml_log(context, LPC2XML_ERROR, "Can't open file:%s", filename); + lpc2xml_log(context, LPC2XML_ERROR, "%s", context->errorBuffer); } - xmlSaveClose(save_ctx); return ret; } int lpc2xml_convert_fd(lpc2xml_context* context, int fd) { - int ret = 0; + int ret = -1; + lpc2xml_context_clear_logs(context); + xmlSetGenericErrorFunc(context, lpc2xml_genericxml_error); xmlSaveCtxtPtr save_ctx = xmlSaveToFd(fd, "UTF-8", XML_SAVE_FORMAT); - ret = internal_convert_lpc2xml(context); - if(ret == 0) { - ret = xmlSaveDoc(save_ctx, context->doc); + if(save_ctx != NULL) { + ret = internal_convert_lpc2xml(context); + if(ret == 0) { + ret = xmlSaveDoc(save_ctx, context->doc); + if(ret != 0) { + lpc2xml_log(context, LPC2XML_ERROR, "Can't save document"); + lpc2xml_log(context, LPC2XML_ERROR, "%s", context->errorBuffer); + } + } + xmlSaveClose(save_ctx); + } else { + lpc2xml_log(context, LPC2XML_ERROR, "Can't open fd:%d", fd); + lpc2xml_log(context, LPC2XML_ERROR, "%s", context->errorBuffer); } - xmlSaveClose(save_ctx); return ret; } int lpc2xml_convert_string(lpc2xml_context* context, char **content) { - int ret = 0; + int ret = -1; xmlBufferPtr buffer = xmlBufferCreate(); + lpc2xml_context_clear_logs(context); + xmlSetGenericErrorFunc(context, lpc2xml_genericxml_error); xmlSaveCtxtPtr save_ctx = xmlSaveToBuffer(buffer, "UTF-8", XML_SAVE_FORMAT); - internal_convert_lpc2xml(context); - if(ret == 0) { - ret = xmlSaveDoc(save_ctx, context->doc); + if(save_ctx != NULL) { + ret = internal_convert_lpc2xml(context); + if(ret == 0) { + ret = xmlSaveDoc(save_ctx, context->doc); + if(ret != 0) { + lpc2xml_log(context, LPC2XML_ERROR, "Can't save document"); + lpc2xml_log(context, LPC2XML_ERROR, "%s", context->errorBuffer); + } + } + xmlSaveClose(save_ctx); + } else { + lpc2xml_log(context, LPC2XML_ERROR, "Can't initialize internal buffer"); + lpc2xml_log(context, LPC2XML_ERROR, "%s", context->errorBuffer); } - xmlSaveClose(save_ctx); if(ret == 0) { #if LIBXML_VERSION >= 20800 *content = (char *)xmlBufferDetach(buffer); diff --git a/tools/lpc2xml_jni.cc b/tools/lpc2xml_jni.cc new file mode 100644 index 000000000..c0971cbd5 --- /dev/null +++ b/tools/lpc2xml_jni.cc @@ -0,0 +1,123 @@ +/* +xml2lpc_jni.cc +Copyright (C) 2013 Belledonne Communications, Grenoble, France + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "my_jni.h" +extern "C" { +#include "lpc2xml.h" +} +#ifdef USE_JAVAH +#include "lpc2xml_jni.h" +#endif + +#include + +struct jni_lpc2xml_ctx { + JNIEnv *env; + jobject obj; + lpc2xml_context *ctx; +}; + +static bool update_and_check_context(jni_lpc2xml_ctx *jni_ctx, JNIEnv *env, jobject obj) { + if(jni_ctx != NULL && jni_ctx->ctx != NULL) { + jni_ctx->env = env; + jni_ctx->obj = obj; + return true; + } + return false; +} + +#define LPC2XML_CALLBACK_BUFFER_SIZE 1024 + +extern "C" void Java_org_linphone_tools_Lpc2Xml_callback (void *ctx, lpc2xml_log_level level, const char *fmt, va_list list) { + jni_lpc2xml_ctx *jni_ctx = (jni_lpc2xml_ctx *)ctx; + if(jni_ctx->ctx != NULL) { + JNIEnv *env = jni_ctx->env; + jobject obj = jni_ctx->obj; + + char buffer[LPC2XML_CALLBACK_BUFFER_SIZE]; + vsnprintf(buffer, LPC2XML_CALLBACK_BUFFER_SIZE, fmt, list); + jstring javaString = env->NewStringUTF(buffer); + jint javaLevel = level; + my_jni::callVoidMethod(env, obj, "Lpc2Xml", "printLog", "(ILjava/lang/String;)V", javaLevel, javaString); + } +} + +extern "C" void Java_org_linphone_tools_Lpc2Xml_init(JNIEnv *env, jobject obj) { + jni_lpc2xml_ctx *jni_ctx = new jni_lpc2xml_ctx(); + jni_ctx->env = env; + jni_ctx->obj = obj; + jni_ctx->ctx = lpc2xml_context_new(Java_org_linphone_tools_Lpc2Xml_callback, obj); + bool result = my_jni::setLongField(env, obj, "Lpc2Xml", "internalPtr", jni_ctx); + if(!result) { + lpc2xml_context_destroy(jni_ctx->ctx); + delete jni_ctx; + } +} + +extern "C" void Java_org_linphone_tools_Lpc2Xml_destroy(JNIEnv *env, jobject obj) { + jni_lpc2xml_ctx *jni_ctx = my_jni::getLongField(env, obj, "Lpc2Xml", "internalPtr"); + if(jni_ctx != NULL) { + jni_ctx->env = env; + jni_ctx->obj = obj; + + if(jni_ctx->ctx != NULL) { + lpc2xml_context_destroy(jni_ctx->ctx); + } + delete jni_ctx; + my_jni::setLongField(env, obj, "Lpc2Xml", "internalPtr", NULL); + } +} + +extern "C" jint Java_org_linphone_tools_Lpc2Xml_setLpc(JNIEnv *env, jobject obj, jobject javaLpc) { + jni_lpc2xml_ctx *jni_ctx = my_jni::getLongField(env, obj, "Lpc2Xml", "internalPtr"); + jint ret = -666; + if(update_and_check_context(jni_ctx, env, obj)) { + LpConfig *lpc = my_jni::getLongField(env, javaLpc, "LpConfigImpl", "nativePtr"); + if(lpc != NULL) { + lpc2xml_set_lpc(jni_ctx->ctx, lpc); + } + } + return ret; +} + +extern "C" jint Java_org_linphone_tools_Lpc2Xml_convertFile(JNIEnv *env, jobject obj, jstring javaFile) { + jni_lpc2xml_ctx *jni_ctx = my_jni::getLongField(env, obj, "Lpc2Xml", "internalPtr"); + jint ret = -666; + if(update_and_check_context(jni_ctx, env, obj)) { + const char *file = env->GetStringUTFChars(javaFile, 0); + ret = lpc2xml_convert_file(jni_ctx->ctx, file); + env->ReleaseStringChars(javaFile, (jchar *)file); + } + return ret; +} + +extern "C" jint Java_org_linphone_tools_Lpc2Xml_convertString(JNIEnv *env, jobject obj, jobject javaStringBuffer) { + jni_lpc2xml_ctx *jni_ctx = my_jni::getLongField(env, obj, "Lpc2Xml", "internalPtr"); + jint ret = -666; + if(update_and_check_context(jni_ctx, env, obj)) { + char *string = NULL; + ret = lpc2xml_convert_string(jni_ctx->ctx, &string); + if(string != NULL) { + jstring javaString = env->NewStringUTF(string); + my_jni::callObjectMethod(env, obj, "StringBuffer", "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;", javaString); + env->ReleaseStringChars(javaString, (jchar *)string); + } + } + return ret; +} diff --git a/tools/my_jni.h b/tools/my_jni.h new file mode 100644 index 000000000..ce56829ec --- /dev/null +++ b/tools/my_jni.h @@ -0,0 +1,108 @@ +/* +my_jni.cc +Copyright (C) 2013 Belledonne Communications, Grenoble, France + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __MY_JNI__H +#define __MY_JNI__H +#include +extern "C" { +#include "linphonecore_utils.h" +} + +#define defCallMethod(Type) \ +template \ +static ReturnType call##Type##Method(JNIEnv *env, jobject obj, const char *className, const char *methodName, \ + const char *methodSignature, ...) { \ + jclass my_class = env->GetObjectClass(obj); \ + if(my_class == 0) { \ + ms_error("Can't get %s JNI class", className); \ + return NULL; \ + } \ + jmethodID my_method = env->GetMethodID(my_class, methodName, methodSignature); \ + if(my_method == 0) { \ + ms_error("Can't get %s %s %s method", className, methodSignature); \ + return NULL; \ + } \ + va_list vl; \ + va_start(vl, methodSignature); \ + ReturnType ret = env->Call##Type##MethodV(obj, my_method, vl); \ + va_end(vl); \ + return ret; \ +} \ + +#define defGetterTypeField(Type, JavaType, JavaStringType) \ +template \ +static ValueType get##Type##Field(JNIEnv *env, jobject obj, const char *className, const char *fieldName) { \ + jclass my_class = env->GetObjectClass(obj); \ + if(my_class == 0) { \ + ms_error("Can't get %s JNI class", className); \ + return NULL; \ + } \ + jfieldID my_field = env->GetFieldID(my_class, fieldName, JavaStringType); \ + if(my_field == 0) { \ + ms_error("Can't get %s %s field", className, fieldName); \ + return NULL; \ + } \ + return (ValueType) env->Get##Type##Field(obj, my_field); \ +} \ + +#define defSetterTypeField(Type, JavaType, JavaStringType) \ +template \ +static bool set##Type##Field(JNIEnv *env, jobject obj, const char *className, const char *fieldName, ValueType val) { \ + jclass my_class = env->GetObjectClass(obj); \ + if(my_class == 0) { \ + ms_error("Can't get %s JNI class", className); \ + return false; \ + } \ + jfieldID my_field = env->GetFieldID(my_class, fieldName, JavaStringType); \ + if(my_field == 0) { \ + ms_error("Can't get %s %s field", className, fieldName); \ + return false; \ + } \ + env->Set##Type##Field(obj, my_field, (JavaType) val); \ + return true; \ +} \ + +#define defGetterAndSetterTypeField(Type, JavaType, JavaStringType) \ + defGetterTypeField(Type, JavaType, JavaStringType) \ + defSetterTypeField(Type, JavaType, JavaStringType) \ + +namespace my_jni { + template + static void callVoidMethod(JNIEnv *env, jobject obj, const char *className, const char *methodName, + const char *methodSignature, ...) { + jclass my_class = env->GetObjectClass(obj); + if(my_class == 0) { + ms_error("Can't get %s JNI class", className); + return; + } + jmethodID my_method = env->GetMethodID(my_class, methodName, methodSignature); + if(my_method == 0) { + ms_error("Can't get %s %s %s method", className, methodName, methodSignature); + return; + } + va_list vl; + va_start(vl, methodSignature); + env->CallVoidMethodV(obj, my_method, vl); + va_end(vl); + } + defCallMethod(Object) + defGetterAndSetterTypeField(Long, jlong, "J") +} + +#endif //__MY_JNI__H diff --git a/tools/xml2lpc_jni.cc b/tools/xml2lpc_jni.cc new file mode 100644 index 000000000..fd72c6895 --- /dev/null +++ b/tools/xml2lpc_jni.cc @@ -0,0 +1,149 @@ +/* +xml2lpc_jni.cc +Copyright (C) 2013 Belledonne Communications, Grenoble, France + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "my_jni.h" +extern "C" { +#include "xml2lpc.h" +} +#ifdef USE_JAVAH +#include "xml2lpc_jni.h" +#endif + +#include + +struct jni_xml2lpc_ctx { + JNIEnv *env; + jobject obj; + xml2lpc_context *ctx; +}; + +static bool update_and_check_context(jni_xml2lpc_ctx *jni_ctx, JNIEnv *env, jobject obj) { + if(jni_ctx != NULL && jni_ctx->ctx != NULL) { + jni_ctx->env = env; + jni_ctx->obj = obj; + return true; + } + return false; +} + +#define XML2LPC_CALLBACK_BUFFER_SIZE 1024 + +extern "C" void Java_org_linphone_tools_Xml2Lpc_callback (void *ctx, xml2lpc_log_level level, const char *fmt, va_list list) { + jni_xml2lpc_ctx *jni_ctx = (jni_xml2lpc_ctx *)ctx; + if(jni_ctx->ctx != NULL) { + JNIEnv *env = jni_ctx->env; + jobject obj = jni_ctx->obj; + + char buffer[XML2LPC_CALLBACK_BUFFER_SIZE]; + vsnprintf(buffer, XML2LPC_CALLBACK_BUFFER_SIZE, fmt, list); + jstring javaString = env->NewStringUTF(buffer); + jint javaLevel = level; + my_jni::callVoidMethod(env, obj, "Xml2Lpc", "printLog", "(ILjava/lang/String;)V", javaLevel, javaString); + } +} + +extern "C" void Java_org_linphone_tools_Xml2Lpc_init(JNIEnv *env, jobject obj) { + jni_xml2lpc_ctx *jni_ctx = new jni_xml2lpc_ctx(); + jni_ctx->env = env; + jni_ctx->obj = obj; + jni_ctx->ctx = xml2lpc_context_new(Java_org_linphone_tools_Xml2Lpc_callback, jni_ctx); + bool result = my_jni::setLongField(env, obj, "Xml2Lpc", "internalPtr", jni_ctx); + if(!result) { + xml2lpc_context_destroy(jni_ctx->ctx); + delete jni_ctx; + } +} + +extern "C" void Java_org_linphone_tools_Xml2Lpc_destroy(JNIEnv *env, jobject obj) { + jni_xml2lpc_ctx *jni_ctx = my_jni::getLongField(env, obj, "Xml2Lpc", "internalPtr"); + if(jni_ctx != NULL) { + jni_ctx->env = env; + jni_ctx->obj = obj; + if(jni_ctx->ctx) { + xml2lpc_context_destroy(jni_ctx->ctx); + } + delete jni_ctx; + my_jni::setLongField(env, obj, "Xml2Lpc", "internalPtr", NULL); + } +} + +extern "C" jint Java_org_linphone_tools_Xml2Lpc_setXmlFile(JNIEnv *env, jobject obj, jstring javaXmlFile) { + jni_xml2lpc_ctx *jni_ctx = my_jni::getLongField(env, obj, "Xml2Lpc", "internalPtr"); + jint ret = -666; + if(update_and_check_context(jni_ctx, env, obj)) { + const char *xmlFile = env->GetStringUTFChars(javaXmlFile, 0); + ret = xml2lpc_set_xml_file(jni_ctx->ctx, xmlFile); + env->ReleaseStringChars(javaXmlFile, (jchar *)xmlFile); + } + return ret; +} + +extern "C" jint Java_org_linphone_tools_Xml2Lpc_setXmlString(JNIEnv *env, jobject obj, jstring javaXmlString) { + jni_xml2lpc_ctx *jni_ctx = my_jni::getLongField(env, obj, "Xml2Lpc", "internalPtr"); + jint ret = -666; + if(update_and_check_context(jni_ctx, env, obj)) { + const char *xmlString = env->GetStringUTFChars(javaXmlString, 0); + ret = xml2lpc_set_xml_string(jni_ctx->ctx, xmlString); + env->ReleaseStringChars(javaXmlString, (jchar *)xmlString); + } + return ret; +} + +extern "C" jint Java_org_linphone_tools_Xml2Lpc_setXsdFile(JNIEnv *env, jobject obj, jstring javaXsdFile) { + jni_xml2lpc_ctx *jni_ctx = my_jni::getLongField(env, obj, "Xml2Lpc", "internalPtr"); + jint ret = -666; + if(update_and_check_context(jni_ctx, env, obj)) { + const char *xsdFile = env->GetStringUTFChars(javaXsdFile, 0); + ret = xml2lpc_set_xsd_file(jni_ctx->ctx, xsdFile); + env->ReleaseStringChars(javaXsdFile, (jchar *)xsdFile); + } + return ret; +} + +extern "C" jint Java_org_linphone_tools_Xml2Lpc_setXsdString(JNIEnv *env, jobject obj, jstring javaXsdString) { + jni_xml2lpc_ctx *jni_ctx = my_jni::getLongField(env, obj, "Xml2Lpc", "internalPtr"); + jint ret = -666; + if(update_and_check_context(jni_ctx, env, obj)) { + const char *xsdString = env->GetStringUTFChars(javaXsdString, 0); + ret = xml2lpc_set_xsd_string(jni_ctx->ctx, xsdString); + env->ReleaseStringChars(javaXsdString, (jchar *)xsdString); + } + return ret; +} + +extern "C" jint Java_org_linphone_tools_Xml2Lpc_validate(JNIEnv *env, jobject obj) { + jni_xml2lpc_ctx *jni_ctx = my_jni::getLongField(env, obj, "Xml2Lpc", "internalPtr"); + jint ret = -666; + if(update_and_check_context(jni_ctx, env, obj)) { + ret = xml2lpc_validate(jni_ctx->ctx); + } + return ret; +} + +extern "C" jint Java_org_linphone_tools_Xml2Lpc_convert(JNIEnv *env, jobject obj, jobject javaLpc) { + jni_xml2lpc_ctx *jni_ctx = my_jni::getLongField(env, obj, "Xml2Lpc", "internalPtr"); + jint ret = -666; + if(update_and_check_context(jni_ctx, env, obj)) { + LpConfig *lpc = my_jni::getLongField(env, javaLpc, "LpConfigImpl", "nativePtr"); + if(lpc != NULL) { + ret = xml2lpc_convert(jni_ctx->ctx, lpc); + } + } + return ret; +} From ab1c855d650e9706b3320518c6b9df41c6ec3627 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 6 Feb 2013 09:57:43 +0100 Subject: [PATCH 060/281] tools: comment unused function in lpc2xml --- tools/lpc2xml.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/lpc2xml.c b/tools/lpc2xml.c index 97262861c..9ff7f39d2 100644 --- a/tools/lpc2xml.c +++ b/tools/lpc2xml.c @@ -81,6 +81,7 @@ static void lpc2xml_genericxml_error(void *ctx, const char *fmt, ...) { va_end(args); } +/* static void lpc2xml_genericxml_warning(void *ctx, const char *fmt, ...) { lpc2xml_context *xmlCtx = (lpc2xml_context *)ctx; int sl = strlen(xmlCtx->warningBuffer); @@ -89,6 +90,7 @@ static void lpc2xml_genericxml_warning(void *ctx, const char *fmt, ...) { vsnprintf(xmlCtx->warningBuffer + sl, LPC2XML_BZ-sl, fmt, args); va_end(args); } +*/ static int processEntry(const char *section, const char *entry, xmlNode *node, lpc2xml_context *ctx) { const char *content = lp_config_get_string(ctx->lpc, section, entry, NULL); From 2023347961b8afede8db9334c9f37b5d7ea6dddf Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 6 Feb 2013 10:22:01 +0100 Subject: [PATCH 061/281] Improve tools --- tools/lpc2xml.c | 3 +++ tools/xml2lpc.c | 15 ++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/tools/lpc2xml.c b/tools/lpc2xml.c index 9ff7f39d2..39fd62b0e 100644 --- a/tools/lpc2xml.c +++ b/tools/lpc2xml.c @@ -98,6 +98,8 @@ static int processEntry(const char *section, const char *entry, xmlNode *node, l lpc2xml_log(ctx->ctx, LPC2XML_ERROR, "Issue when reading the lpc"); return -1; } + + lpc2xml_log(ctx, LPC2XML_MESSAGE, "Set %s|%s = %s", section, entry, content); xmlNodeSetContent(node, (const xmlChar *) content); return 0; } @@ -123,6 +125,7 @@ static void processSection_cb(const char *entry, struct __processSectionCtx *ctx ctx->ret = -1; return; } + ctx->ret = processEntry(ctx->section, entry, node, ctx->ctx); } } diff --git a/tools/xml2lpc.c b/tools/xml2lpc.c index 9d720f1f3..c9a5c94e2 100644 --- a/tools/xml2lpc.c +++ b/tools/xml2lpc.c @@ -148,7 +148,7 @@ static int processEntry(xmlElement *element, const char *sectionName, xml2lpc_co if(name != NULL) { const char *str = lp_config_get_string(ctx->lpc, sectionName, name, NULL); if(str == NULL || overwrite) { - xml2lpc_log(ctx, XML2LPC_MESSAGE, "Set %s|%s = %s",sectionName, name, value); + xml2lpc_log(ctx, XML2LPC_MESSAGE, "Set %s|%s = %s", sectionName, name, value); lp_config_set_string(ctx->lpc, sectionName, name, value); } else { xml2lpc_log(ctx, XML2LPC_MESSAGE, "Don't touch %s|%s = %s",sectionName, name, str); @@ -231,8 +231,10 @@ int xml2lpc_validate(xml2lpc_context *xmlCtx) { xmlSchemaSetValidErrors(validCtx, xml2lpc_genericxml_error, xml2lpc_genericxml_warning, xmlCtx); int ret = xmlSchemaValidateDoc(validCtx, xmlCtx->doc); if(ret > 0) { - xml2lpc_log(xmlCtx, XML2LPC_WARNING, "%s", xmlCtx->warningBuffer); - xml2lpc_log(xmlCtx, XML2LPC_ERROR, "%s", xmlCtx->errorBuffer); + if(strlen(xmlCtx->warningBuffer) > 0) + xml2lpc_log(xmlCtx, XML2LPC_WARNING, "%s", xmlCtx->warningBuffer); + if(strlen(xmlCtx->errorBuffer) > 0) + xml2lpc_log(xmlCtx, XML2LPC_ERROR, "%s", xmlCtx->errorBuffer); } else if(ret < 0) { xml2lpc_log(xmlCtx, XML2LPC_ERROR, "Internal error"); } @@ -242,6 +244,13 @@ int xml2lpc_validate(xml2lpc_context *xmlCtx) { int xml2lpc_convert(xml2lpc_context *xmlCtx, LpConfig *lpc) { xml2lpc_context_clear_logs(xmlCtx); + if(xmlCtx->doc == NULL) { + xml2lpc_log(xmlCtx, XML2LPC_ERROR, "No doc set"); + return -1; + } + if(lpc == NULL) { + xml2lpc_log(xmlCtx, XML2LPC_ERROR, "Invalid lpc"); + } xmlCtx->lpc = lpc; return internal_convert_xml2lpc(xmlCtx); } From 0e31c3a918649c2b53c8137529921b2faf0b3990 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 6 Feb 2013 10:02:52 +0100 Subject: [PATCH 062/281] ui improvement --- gtk/chat.c | 10 +++++----- gtk/main.c | 20 ++++++++++---------- gtk/main.ui | 34 ++++++++++++++++++---------------- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index 2b3a969ed..bcaca1a99 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -110,12 +110,14 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,display,-1,"bold",me ? "left" : "left",NULL); gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter," : ",-1,"bold",me ? "left" : "left",NULL); + gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); g_object_set_data(G_OBJECT(w),"from_message",linphone_address_as_string(from)); } gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_get_iter_at_offset(buffer,&begin,off); - gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,message,-1,me ? "left" : "left",NULL); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); @@ -140,14 +142,12 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, } else { struct tm *tm=localtime(&t); char buf[80]; - strftime(buf,80,"%H:%M",tm); + strftime(buf,80,"Received at %H:%M",tm); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,buf,-1, - "italic","right","small","font_grey",NULL); + "italic","right","small","font_grey",NULL); } gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); - - GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); gtk_text_view_scroll_mark_onscreen(text,mark); } diff --git a/gtk/main.c b/gtk/main.c index 114a7244f..520af7b5a 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1503,7 +1503,7 @@ static void linphone_gtk_configure_main_window(){ static const char *search_icon; static gboolean update_check_menu; static gboolean buttons_have_borders; - //static gboolean show_abcd; + static gboolean show_abcd; GtkWidget *w=linphone_gtk_get_main_window(); GHashTable *contacts_history; @@ -1518,7 +1518,7 @@ static void linphone_gtk_configure_main_window(){ search_icon=linphone_gtk_get_ui_config("directory_search_icon",NULL); update_check_menu=linphone_gtk_get_ui_config_int("update_check_menu",0); buttons_have_borders=linphone_gtk_get_ui_config_int("buttons_border",1); - //show_abcd=linphone_gtk_get_ui_config_int("show_abcd",1); + show_abcd=linphone_gtk_get_ui_config_int("show_abcd",1); config_loaded=TRUE; } linphone_gtk_configure_window(w,"main_window"); @@ -1578,13 +1578,7 @@ static void linphone_gtk_configure_main_window(){ if (update_check_menu){ gtk_widget_show(linphone_gtk_get_widget(w,"versioncheck_item")); } - /*if (!show_abcd){ - gtk_widget_hide(linphone_gtk_get_widget(w,"dtmf_A")); - gtk_widget_hide(linphone_gtk_get_widget(w,"dtmf_B")); - gtk_widget_hide(linphone_gtk_get_widget(w,"dtmf_C")); - gtk_widget_hide(linphone_gtk_get_widget(w,"dtmf_D")); - gtk_table_resize(GTK_TABLE(linphone_gtk_get_widget(w,"dtmf_table")),4,3); - }*/ + g_object_set_data(G_OBJECT(w),"show_abcd",GINT_TO_POINTER(show_abcd)); } void linphone_gtk_manage_login(void){ @@ -1599,7 +1593,6 @@ void linphone_gtk_manage_login(void){ } } - gboolean linphone_gtk_close(GtkWidget *mw){ /*shutdown calls if any*/ LinphoneCore *lc=linphone_gtk_get_core(); @@ -1660,6 +1653,13 @@ void linphone_gtk_create_keypad(GtkWidget *button){ linphone_gtk_connect_digits(keypad); linphone_gtk_init_dtmf_table(keypad); g_object_set_data(G_OBJECT(mw),"keypad",(gpointer)keypad); + if(!GPOINTER_TO_INT(g_object_get_data(G_OBJECT(mw),"show_abcd"))){ + gtk_widget_hide(linphone_gtk_get_widget(keypad,"dtmf_A")); + gtk_widget_hide(linphone_gtk_get_widget(keypad,"dtmf_B")); + gtk_widget_hide(linphone_gtk_get_widget(keypad,"dtmf_C")); + gtk_widget_hide(linphone_gtk_get_widget(keypad,"dtmf_D")); + gtk_table_resize(GTK_TABLE(linphone_gtk_get_widget(keypad,"dtmf_table")),4,3); + } gtk_widget_show(keypad); } diff --git a/gtk/main.ui b/gtk/main.ui index 50883c3f0..5e84bcc21 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -282,6 +282,7 @@ True True + 2 0 @@ -329,6 +330,7 @@ True True + 2 2 @@ -416,6 +418,7 @@ False False + 2 2 @@ -958,6 +961,7 @@ False False + end 1 @@ -973,9 +977,23 @@ False True 6 + end 2 + + + True + True + True + False + + + False + False + 3 + + False @@ -1091,22 +1109,6 @@ 2 - - - True - True - True - False - image18 - - - - False - False - end - 3 - - False From c0eb16613fdbdb73d47e62dad4df0ed7f0389188 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 6 Feb 2013 10:48:34 +0100 Subject: [PATCH 063/281] Add dialer pixmap --- gtk/main.c | 16 +++++----------- gtk/main.ui | 3 ++- pixmaps/Makefile.am | 1 + pixmaps/dialer.png | Bin 0 -> 3744 bytes 4 files changed, 8 insertions(+), 12 deletions(-) create mode 100644 pixmaps/dialer.png diff --git a/gtk/main.c b/gtk/main.c index 520af7b5a..cfbd8983f 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1559,19 +1559,13 @@ static void linphone_gtk_configure_main_window(){ } */ } - /*{ - GdkPixbuf *pbuf=create_pixbuf("dialer-orange.png"); + { + GdkPixbuf *pbuf=create_pixbuf("dialer.png"); if (pbuf) { - GtkImage *img=GTK_IMAGE(linphone_gtk_get_widget(w,"keypad_tab_icon")); - int w,h; - GdkPixbuf *scaled; - gtk_icon_size_lookup(GTK_ICON_SIZE_MENU,&w,&h); - scaled=gdk_pixbuf_scale_simple(pbuf,w,h,GDK_INTERP_BILINEAR); - gtk_image_set_from_pixbuf(img,scaled); - g_object_unref(G_OBJECT(scaled)); - g_object_unref(G_OBJECT(pbuf)); + GtkButton *button=GTK_BUTTON(linphone_gtk_get_widget(w,"keypad")); + gtk_button_set_image(button,gtk_image_new_from_pixbuf (pbuf)); } - }*/ + } if (linphone_gtk_can_manage_accounts()) { gtk_widget_show(linphone_gtk_get_widget(w,"assistant_item")); } diff --git a/gtk/main.ui b/gtk/main.ui index 5e84bcc21..6c15688c2 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -982,11 +982,12 @@ - + True True True False + False diff --git a/pixmaps/Makefile.am b/pixmaps/Makefile.am index 186254c11..d10d48222 100644 --- a/pixmaps/Makefile.am +++ b/pixmaps/Makefile.am @@ -18,6 +18,7 @@ startcall-green.png startcall-small.png stopcall-red.png stopcall-small.png addc contact_starred.png contact_unstarred.png \ speaker.png \ ok.png \ +dialer.png \ notok.png EXTRA_DIST=$(pixmap_DATA) diff --git a/pixmaps/dialer.png b/pixmaps/dialer.png new file mode 100644 index 0000000000000000000000000000000000000000..5da3ad70dee838f952fbee2ce3ad1cef729f9c24 GIT binary patch literal 3744 zcmV;R4qx$!P)4Tx07wm;mUmPX*B8g%%xo{TU6vwc>AklFq%OTkl_mFQv@x1^BM1TV}0C2duqR=S6Xn?LjUp6xrb&~O43j*Nv zEr418u3H3zGns$s|L;SQD-ufpfWpxLJ03rmi*g~#S@{x?OrJ!Vo{}kJ7$ajbnjp%m zGEV!%=70KpVow?KvV}a4moSaFCQKV= zXBIPnpP$8-NG!rR+)R#`$7JVZi#Wn10DSspSrkx`)s~4C+0n+?(b2-z5-tDd^^cpM zz5W?wz5V3zGUCskL5!X++LzcbT23thtSPiMTfS&1I{|204}j|3FPi>70OSh+Xzlyz zdl<5LNtZ}OE>>3g`T3RtKG#xK(9i3CI(+v0d-&=+OWAp!Ysd8Ar*foO5~i%E+?=c& zshF87;&Ay)i~kOm zCIB-Z!^JGdti+UJsxgN!t(Y#%b<8kk67vyD#cE*9urAm@Y#cTXn~yERR$}Y1E!Yd# zo7hq8Ya9;8z!~A3Z~?e@Tn26#t`xT$*Ni)h>&K1Yrto;Y8r}@=h7ZGY@Dh9xekcA2 z{tSKqKZ<`tAQQ9+wgf*y0zpVvOQ<9qCY&Y=5XJ~ILHOG0j2XwBQ%7jM`P2tv~{#P+6CGu9Y;5!2hua>CG_v;z4S?CC1rc%807-x z8s$^ULkxsr$OvR)G0GUn7`GVjR5Vq*RQM{JRGL%DRgX~5SKp(4L49HleU9rK?wsN|$L8GCfHh1tA~lw29MI^|n9|hJ z^w$(=?$kW5IibbS^3=-Es?a*EHLgw5cGnhYS7@Kne#%s4dNH$@Rm?8tq>hG8fR0pW zzfP~tjINRHeBHIW&AJctNO~;2RJ{tlPQ6KeZT(RF<@$~KcMXUJEQ54|9R}S7(}qTd zv4$HA+YFx=sTu_uEj4O1x^GN1_Ap*-Tx)#81ZToB$u!w*a?KPrbudjgtugI0gUuYx z1ZKO<`pvQC&gMe%TJu2*iiMX&o<*a@uqDGX#B!}=o8@yWeX9hktybMuAFUm%v#jf^ z@7XBX1lg>$>9G0T*3_13TVs2}j%w#;x5}>F?uEUXJ>Pzh{cQ)DL#V?BhfaqNj!uqZ z$0o;dCw-@6r(I5iEIKQkRm!^LjCJ;QUgdn!`K^nii^S!a%Wtk0u9>cfU7yS~n#-SC zH+RHM*Nx-0-)+d9>7MMq&wa>4$AjZh>+#4_&y(j_?>XjW;+5fb#Ot}YwYS*2#e16V z!d}5X>x20C`xN{1`YQR(_pSDQ=%?$K=GW*q>F?mb%>QfvHXt})YrtTjW*|4PA#gIt zDQHDdS1=_wD!4lMQHW`XIHV&K4h;(37J7f4!93x-wlEMD7`83!LAX));_x3Ma1r4V zH4%>^Z6cRPc1O{olA;bry^i*dE{nc5-*~=serJq)Okzw!%yg_zYWi`#ol25V;v^kU#wN!mA5MPH z3FFjqrcwe^cBM>m+1wr6XFN|{1#g`1#xLiOrMjh-r#?w@OWT$Wgg6&&5F%x&L(6hXP*!%2{VOVIa)adIsGCtQITk9vCHD^izmgw;`&@D zcVTY3gpU49^+=7S>!rha?s+wNZ}MaEj~6Hw2n%|am@e70WNfM5(r=exmT{MLF4tMU zX8G_6uNC`OLMu~NcCOM}Rk&(&wg2ivYe;J{*Zj2BdTsgISLt?eJQu}$~QLORDCnMIdyYynPb_W zEx0YhEw{FMY&}%2SiZD;WLxOA)(U1tamB0cN!u@1+E?z~LE0hRF;o>&)xJ}I=a!xC ztJAA*)_B)6@6y<{Y1i~_-tK`to_m`1YVIxB`);3L-|hYW`&(-bYby`n4&)tpTo+T< z{VnU;hI;k-lKKw^g$IWYMIP#EaB65ctZ}%k5pI+=jvq-pa_u{x@7kLzn)Wv{noEv? zqtc^Kzfb=D*0JDYoyS?nn|?6(VOI;SrMMMpUD7()mfkkh9^c-7BIrbChiga6kCs0k zJgIZC=9KcOveTr~g{NoFEIl)IR&;jaT-v#j&ZN$J=i|=b=!)p-y%2oi(nY_E=exbS z&s=i5bn>#xz3Ke>~2=f&N;yEFGz-^boBexUH6@}b7V+Mi8+ZXR+R zIyLMw-18{v(Y+Dw$g^K^e|bMz_?Y^*a!h-y;fd{&ljDBl*PbqTI{HlXY-Xb9SH)j< zJvV;-!*8Cy^-RW1j=m7TnEk!37H;EY>l^+pYP^6XM(e4M)(QTR*<{~{@c5G-~WK7csy`mrzKiJ*`4S}FGI z`SYWhOs1OXN`DzoB)b^ntlc_fsgyr*a1d4m0rT5=fr3+1H2ed@nKdR(-;jZe9Z3`j zQmoZ#kzIi5h%W5N4S`svyF+GxS<5Ws5vNu$1(g=+=dMqfI;vbea| z%;bhY4qMH06kQwhu+fmqgpV?!tZ3)o$@}^IE6DWd-Z=pau#=s8=Oo>eddN|CaWa-G zj(jeadXHq`I9q)Y1WqvFfuazbf635PL-4F}H&D>CF9j;^?_=U^v1KQ=5B%M5)zl<+*i91l`nB1rju zJpQscd$vIE$l=1mLep`aA3e`wFw_{IKdrFTW#Z(H)(Rb#R)*oGFwTRispY1Y@?NWX z$XbU73|!XGur-3yK+_qmQfd5*jD^B$w|7Cj?C3Ejy>(32qgrhj_(+fLI{2Rc2lE(u zG>v+GAAnX zd+^xt`~>Bslw^B*TSJ?*&6SA5_3m!?u@2fr15JU@3+6@wvoS-oU>_C4{NCPPLxXkn z9a#Jv5s&bl!Is6bv5#CQS%yamdUnHP{5BZ~*ZojyGX#5$^RM=qp1U(MGvQ!ynHH8%aXQ2Z8PqEM;n;RbcRLS-f!X3K8-4D8g$)$ybwcPOYb4cw9 z0<|$3J3f!SRjJ(m1NiS@HU@Kr?6<6JzK;7&^xB{)38U59_5HnWB%KbDDHhmM^zy7J zsjf*G;-TOyo`|0_LJt7H1LN1YaL^}#*NHz98bkP>A|k;_voKov_EgvDtDw5+xDI&K zzft+F>wLp`>?LFpV()m#*y{TFx^g)G8BN6FK+l?eD0I6@@-Yr4CMJS(|{QSHkxl}57{r&weo-+QV{+L4o{?|g55$7jy9sS>O@i5>Y^WSm+0000< KMNUMnLSTY5-cCdS literal 0 HcmV?d00001 From 0930288ab7c29f2163b617f7b6795f4f567c340c Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 6 Feb 2013 11:51:19 +0100 Subject: [PATCH 064/281] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index e5d529906..1f0374f48 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit e5d52990695be15802741e920801f77d24bd8fba +Subproject commit 1f0374f48290e0e852bcbb15c4d302c0c5b332f4 From 750c28f183c5eb7d9ccd1e13651d7896b4a7798f Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 6 Feb 2013 13:55:02 +0100 Subject: [PATCH 065/281] add pixmaps for calllog and imporved display chat --- gtk/calllogs.c | 10 ++++++---- gtk/chat.c | 26 +++++++++++++++++--------- pixmaps/Makefile.am | 1 + pixmaps/call_status_incoming.png | Bin 0 -> 2879 bytes pixmaps/call_status_outgoing.png | Bin 0 -> 2884 bytes 5 files changed, 24 insertions(+), 13 deletions(-) create mode 100644 pixmaps/call_status_incoming.png create mode 100644 pixmaps/call_status_outgoing.png diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 9494dbfa2..20ff8181f 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -24,8 +24,7 @@ static void fill_renderers(GtkTreeView *v){ GtkTreeViewColumn *c; GtkCellRenderer *r=gtk_cell_renderer_pixbuf_new (); - g_object_set(r,"stock-size",GTK_ICON_SIZE_BUTTON,NULL); - c=gtk_tree_view_column_new_with_attributes("icon",r,"stock-id",0,NULL); + c=gtk_tree_view_column_new_with_attributes("icon",r,"pixbuf",0,NULL); gtk_tree_view_append_column (v,c); r=gtk_cell_renderer_text_new (); @@ -40,7 +39,7 @@ void linphone_gtk_call_log_update(GtkWidget *w){ store=(GtkListStore*)gtk_tree_view_get_model(v); if (store==NULL){ - store=gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING, G_TYPE_POINTER); + store=gtk_list_store_new(3,GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_POINTER); gtk_tree_view_set_model(v,GTK_TREE_MODEL(store)); g_object_unref(G_OBJECT(store)); fill_renderers(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view"))); @@ -110,8 +109,11 @@ void linphone_gtk_call_log_update(GtkWidget *w){ g_free(seconds); if (start_date) g_free(start_date); gtk_list_store_append (store,&iter); + + GdkPixbuf *incoming = create_pixbuf("call_status_incoming.png"); + GdkPixbuf *outgoing = create_pixbuf("call_status_outgoing.png"); gtk_list_store_set (store,&iter, - 0, cl->dir==LinphoneCallOutgoing ? GTK_STOCK_GO_UP : GTK_STOCK_GO_DOWN, + 0, cl->dir==LinphoneCallOutgoing ? outgoing : incoming, 1, logtxt,2,la,-1); ms_free(addr); g_free(logtxt); diff --git a/gtk/chat.c b/gtk/chat.c index bcaca1a99..201d138d9 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -118,7 +118,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_get_iter_at_offset(buffer,&begin,off); gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,message,-1,me ? "left" : "left",NULL); + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,message,-1,"margin",NULL); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); gtk_text_buffer_get_bounds (buffer, &begin, &end); @@ -136,13 +136,13 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_get_end_iter(buffer,&iter); if(me){ list=g_list_append(list,GINT_TO_POINTER(gtk_text_iter_get_line(&iter))); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Message in progress.. ",-1, + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Sending .. ",-1, "italic","right","small","font_grey",NULL); g_object_set_data(G_OBJECT(w),"list",list); } else { struct tm *tm=localtime(&t); char buf[80]; - strftime(buf,80,"Received at %H:%M",tm); + strftime(buf,80,"Send at %H:%M",tm); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,buf,-1, "italic","right","small","font_grey",NULL); } @@ -162,7 +162,7 @@ const LinphoneAddress* linphone_gtk_get_used_identity(){ /* function in dev for displaying ack*/ -void update_chat_state_message(LinphoneChatMessageState state){ +void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessage *msg){ GtkWidget *main_window=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *page=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); @@ -192,15 +192,21 @@ void update_chat_state_message(LinphoneChatMessageState state){ gchar *result; switch (state) { case LinphoneChatMessageStateInProgress: - result="Message in progress.. "; + result="Sending "; break; case LinphoneChatMessageStateDelivered: - result="Message delivered "; + { + time_t t=time(NULL); + struct tm *tm=localtime(&t); + char buf[80]; + strftime(buf,80,"%H:%M",tm); + result=buf; break; + } case LinphoneChatMessageStateNotDelivered: result="Message not delivered "; break; - default : result="Message in progress.. "; + default : result="Sending .."; } gtk_text_buffer_insert_with_tags_by_name(b,&iter,result,-1, "italic","right","small","font_grey",NULL); @@ -211,7 +217,7 @@ void update_chat_state_message(LinphoneChatMessageState state){ static void on_chat_state_changed(LinphoneChatMessage *msg, LinphoneChatMessageState state, void *user_pointer){ g_message("chat message state is %s",linphone_chat_message_state_to_string(state)); - update_chat_state_message(state); + update_chat_state_message(state,msg); } void linphone_gtk_send_text(){ @@ -225,10 +231,10 @@ void linphone_gtk_send_text(){ if (strlen(entered)>0) { LinphoneChatMessage *msg; msg=linphone_chat_room_create_message(cr,entered); + linphone_chat_room_send_message2(cr,msg,on_chat_state_changed,NULL); linphone_gtk_push_text(w, linphone_gtk_get_used_identity(), entered,TRUE,cr,linphone_chat_message_get_time(msg)); - linphone_chat_room_send_message2(cr,msg,on_chat_state_changed,NULL); gtk_entry_set_text(GTK_ENTRY(entry),""); } } @@ -285,6 +291,8 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres "small","size",9*PANGO_SCALE,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), "font_grey","foreground-gdk",&color,NULL); + gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), + "margin","left-margin",10,NULL); GtkWidget *button = linphone_gtk_get_widget(chat_view,"send"); g_signal_connect_swapped(G_OBJECT(button),"clicked",(GCallback)linphone_gtk_send_text,NULL); diff --git a/pixmaps/Makefile.am b/pixmaps/Makefile.am index d10d48222..2386d68cf 100644 --- a/pixmaps/Makefile.am +++ b/pixmaps/Makefile.am @@ -17,6 +17,7 @@ contact-orange.png dialer-orange.png history-orange.png\ startcall-green.png startcall-small.png stopcall-red.png stopcall-small.png addcall-green.png linphone.icns \ contact_starred.png contact_unstarred.png \ speaker.png \ +call_status_incoming.png call_status_outgoing.png \ ok.png \ dialer.png \ notok.png diff --git a/pixmaps/call_status_incoming.png b/pixmaps/call_status_incoming.png new file mode 100644 index 0000000000000000000000000000000000000000..72ca1330efb4a8a8877f13b8308c9a4cdd0a71ed GIT binary patch literal 2879 zcmah~2{fDO8cwuADQXL~j5M}lB(;-7QkB|8tfi`iv6Up2&?sru*rKDVmbR))t4eE# zwwBsUTQXvaptV$$p}5x8IJ)=DORjg#j>)I+v*yzmc5rKoO&6}b z?V&^Mo|7cyX@@rs+IRE?Rar|k@ojDdR)gLy%PsZl@8>Duxk1YnqxQ6^8sm;&4qRoc z&q|i^*Mm^?1Ag#og6BSIX2zH^Nwya1m;SW$Iw7ok44xKRt+guxyB)DI=kdMkW^Q4P z&odGFJB>A`MmpwA<%-;rb-5>_#*%P}cO&gHCx(ZrV88P4I*syf%G}elRN@`z9dC3` zNRgoJ=D7&1XgTS}J*&#IH<^ltZzBA~p5B*=U3A%~81R`+FJ?Lhz9+nIwxT_{<(U)e z@*#eN_4M?u4j#p{@0yA_Ct~?xF%_lt#k`#ygn`aI@F(k2L8P*WCPQU8ZuWxP+P9Er z)0k?+x~!H=1(tAa_wjk!nJ*j6^ij&%%=m;CEP@u)jw2R45@nS3OI!R8 zPox?&@7Wh3+ZZ8DKR*0(qsjJNgNrhsJJWU&bIPqXRut{nTDtD@;t)RZfCvK)x+o|JGbfB{ z2i0wK%{K-GQMN*tQ%9~4+w{vxtyL`>1B}O-TSNyQq}PR%?7Qttku3+Pit@&1fW68> zv*h<~>>-Dt#|4G|`t>qfQKcEfM0ap%#@LT`?(IAz6?+y-^^GFW#UDmKP@<{RG`5e@ zRB7;Sn-q#$Ep%JSBdakT#%ol!*pRP05Y6x;h>xUr1oQ{x>!~{8+M_3=CNsC{x1OM6 z%Oz?&zsV??Xjqy%u-18STfRY>BJlK_ZDq9P$Nkc}BFdmUpf{~fui{H6V7KA?j0X<- z%+`Sw#iGbFxs%x`R775iss(-Virve$aUGuOy!wr^8!F`w_O0$@h#x~B-V?vIQD*9l z-$8`BoLmv0+-7%rTm+2@-?J=BYXS8sKgL18vsC25!{gIOCdn0 z#9&f5f@%!?!a#82Js1v!e4$W+jG?Z!c!()E%om~u(}HP3(E<<%1Qqt3AHo4^_BEZm zGKL0FC?N(YZUzN^soI<@I6s~5&6Y|z50K{ z|DSkDpx>W1{fGL!oqx*TLlJHczTxEHh&^-A2HGh2Kfpg-LVek@3k&q+`urt9>ns1S z*x&iC|E&Js=Qv`J+m zMU~h&Po#JFI`&%d z%~q5ewzj{V*(&yOW`hyK4+7DnZyNHJhol^TN~&L9Fq%4#UaT?549CfdsTH=&zpAWC zs*RIX5*y<==R?;m5Vi?!D5{I{JYVjbWhjWae)HL6&_T-f=T0f8JkI6^v97cbKRv;F z6+CNF^7qAsQFgh&LrM5vv3NINs*uQxV+u={HHoQHf)w9Hcj0F^b zwh7zfIKu=v>t`8@iQSBM^!)sZlEhi!egtTx@0HqFwHwLbYD_T4RA=zx%Ov`e_;n~o zg{4gxyw^S3Zx!dFc1blEswG4N8dub|W8~zgX)!bY&ib|)Oj{vYwn~t@f@rcts#!wa zLPJyk$;p$w#|}!rWaN75i@Gm%b>Yx5Z3UBbyoXR+=Am+ucL(;|=chEi0Tf7oLEQY-gkWi{&hF^|Qn!h3=`>p>HY^ z&6+fBuy%@Nf0{}?B~tcF9$_%Kl=GU(X0B8?A=N8`qzl!aL3F2*TYoW_JWZP)>N=#j zU8=@tKDhn@Hg~zT;&_b!RxcKQ{9%)*6+e|?aYHRzEIDU0d?-9HM>_#?lz3ct)Q9ivcO}glsz&pW0s8S2v zrrElo+x%0)+wkw`1Sztl?Ke0ZLLbfZqRKPA0Mx-pwDh&y`Sf~pZj{R?~S&$GCsf~&I14d4w#x4 z*|NSutQX7$1OWD_b?oQ?035R3hKAOrhK3MpGSSo9#{&R3ekjsmnAmSGq!&%JeJrdG zaWsyKd0p&a=UgKpUib!RnvgwbCY=3=sVF;vL`3IF?C<|nnU4+*MF6+U_VEF2=heMax&&QB3>SSaZhpsV753uFt%3Gv zD7t|FmZFKR@!7oZ!d03Jz1Y9G=3NCG_#(O3sl~xo!1gmO4Mc5kme;kC(dWMVL2(9L z$n_kEdd~EOS79;iqAdxd4g`s3P|vvX!gwsXZ4@5sTcx%uppxppJnI_nxS5t+<6bQg zJ*2d1UmvaCQ?V?$XkLOTt}(@4<6Mi~=m=q>O4}^w#nUK5Q^pufq0kU;h%>mIl*4Pe zdD&krSW>jKeMN5OK@047kN+i5`D2mm3uo4zGTo=+a$D@YN3bJ}X0-fdOp5QB$%sLE z`MKoxY_QmiFLD?Y*Y{u7e_HrFmy^+fL>$W$UNS$6BNXMG>?=xfvfMaqGFX>n{D7pjWGZ>^DJKh{|yG*1` zInyRvr@5H);%%v;zFqIWEory%SyhQkf{#lO%+y&f^G0MNKPL|vj|3}r(iB#{JV*Q6 z3nQ(pm$pvO6mHtI_AZETFk*LZq?DK|EyK_s)HIyu1R?tcz5Ed!dO0|p{wzQ09k6z- zb*>(Vqip$pxifeR->g+acvIQ5#w;#X-oo3m>0G!Hll17_Vn7o&6(*(YvaeI_zzlK3 z=|i7wUujnMzt%%Pzz#R+x9Gj^s2Tl`zmvI>N65wGigXR@T#gXa`Bj#tNK@KYpvlwV z+ZHhtr)SV@S=amZaVnhJwF`9_a?Idj3|4S3#?`AEm!TpE@>Z=VyMXU7yu z)`vsyPM;jwtUnbn$cLYIHj3J9(wRBq<(w->n>)DjLcH(BqE*P`vCLchSDw|4O=X!( z0ORbCCBvIipUlSwDOK&%>t7w(qOK>%9ZEd)!I$T{{nZ;1{3nEakRAqu6?Dryn)G_k#b0>R~ zDBeT@WUnsPjp$F&g+lil{dm6X#FKtBBKUouiZvgciY39-R8-+VDzg$%tQnDpWDhKb zNVX>uee_Q5nEN5S_*{YB(A2lnd!4gY`Q zDc+uc+Vmgl_jdj%e-A}E*?Ra9ef;;#(L<=C;Qs*sbP4rs4^8&=VEOzlLG3&Luh`%D zj{mK}U%~%r!|&#>PJ$i}%fLTQl^)NQlR+BmA~P^GI%$9WkiR{~!r4Joe`-L#F0#WC zB2oR|wU>1ZRPCiG1JqI}%80mLx;fr55Dp7_<24p8a9H^>7VSJK%yX0=SaUCO%%J~m zW*MaOl?jz}S@P|Z4Tyq!c}ZneU0vPO8tv>n_~mML9qZoOs^1-6&pjAcEo)=eyM{cmp*n@U-~7h z;QT#1UBoK1&N;SZXOpcFz_5s(Js$ zyUs-gMX6i?L4l|4P>!p;WEg~!2!a`tfr%4k$rw?D^Lc&Hxd!&Wucl;?M)pwtCwUF0H=*Xg6i%Iaqr#o3kvAu zk0?l2>gs{!VKxyfPQ@@IwH->CBu}Idhfc%L(D~CTslBTjReUgs9J!s74*0o&ovHLU z96A$1M?w5Lb(E*>2)Qu(-uyIY_HF5#(M9JR3m2rfedNbyM^dBCr^UW@1LZEI#I3~2 z8mojL<%ACJj(o-W?Oa%w4i}MsEk*yT*XJS#SsqyXIrARkW@hdLGj!^c*fu%K;+3hB zLx56@0Tn6oBvn=F)W3 zUU&84omfR)IeHn#qn@-}*Xy-f8XDHgX7}Uy@*+?T=vw)MmdcE_Z66`VmFe~F`PNF; z^Qkp+5ja`UNzS{@?W1eav2Gc+{Khdir%7WQBVJ{FjTUJ7jEBqBaF5$CN&YW8qejzB z*#!rI+V&a@3~!_XH?_d6lbzmLo0dF^lL>nLavK<#%LnHGUoO4yG*Frld@ul^X_=tu za8-teD-{lTVdGp?4)T@oVmOG`pt-2h-3ih!ud8mfqEQi>ojLNfyQU+9)`Q(|1p}JP z^6G*7QIIFbqrODWec%qRwi6eBX|q**QXd|@Wd*^v3C*Pq=fV3Mho2+y; zgq*Sf85jcc4^`Bxj7u0J=K%nvHO%o6eX-3m!Sc%%ddTXTW8&hZ7pkc&31KY%-*%^%WrBak!i z__a1fWYgEI3Ipbc#X{9=l?^(($3bM=1EVKykG7@Nz=0bvTqdD=_m=4?E2AQV3t|5T Du(Jm+ literal 0 HcmV?d00001 From 0700c04d4a33645187e61318c0e7372299045627 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 6 Feb 2013 14:35:36 +0100 Subject: [PATCH 066/281] implement call recording. --- coreapi/Makefile.am | 2 +- coreapi/conference.c | 8 ++- coreapi/linphonecall.c | 109 +++++++++++++++++++++++++++++++++-------- coreapi/linphonecore.c | 13 +++-- coreapi/linphonecore.h | 7 ++- coreapi/misc.c | 7 +++ coreapi/private.h | 3 ++ gtk/incall_view.c | 27 +++++++--- gtk/main.c | 29 ++++++++++- gtk/main.ui | 76 +++++++++++++++++++++------- mediastreamer2 | 2 +- 11 files changed, 225 insertions(+), 58 deletions(-) diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index eab65b147..90a1c3202 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -16,7 +16,7 @@ CLEANFILES=$(GITVERSION_FILE) ## Process this file with automake to produce Makefile.in linphone_includedir=$(includedir)/linphone -linphone_include_HEADERS=linphonecore.h linphonefriend.h linphonecore_utils.h ../config.h lpconfig.h sipsetup.h +linphone_include_HEADERS=linphonecore.h linphonefriend.h linphonecore_utils.h lpconfig.h sipsetup.h if BUILD_TUNNEL linphone_include_HEADERS+=linphone_tunnel.h diff --git a/coreapi/conference.c b/coreapi/conference.c index 9f1538f42..a125673a2 100644 --- a/coreapi/conference.c +++ b/coreapi/conference.c @@ -161,6 +161,7 @@ float linphone_core_get_conference_local_input_volume(LinphoneCore *lc){ * * If this is the first call that enters the conference, the virtual conference will be created automatically. * If the local user was actively part of the call (ie not in paused state), then the local user is automatically entered into the conference. + * If the call was in paused state, then it is automatically resumed when entering into the conference. * * @returns 0 if successful, -1 otherwise. **/ @@ -256,10 +257,13 @@ static int convert_conference_to_call(LinphoneCore *lc){ * @param call a call that has been previously merged into the conference. * * After removing the remote participant belonging to the supplied call, the call becomes a normal call in paused state. - * If one single remote participant is left alone in the conference after the removal, then it is - * automatically removed from the conference and put into a simple call, like before entering the conference. + * If one single remote participant is left alone together with the local user in the conference after the removal, then the conference is + * automatically transformed into a simple call in StreamsRunning state. * The conference's resources are then automatically destroyed. * + * In other words, unless linphone_core_leave_conference() is explicitely called, the last remote participant of a conference is automatically + * put in a simple call in running state. + * * @returns 0 if successful, -1 otherwise. **/ int linphone_core_remove_from_conference(LinphoneCore *lc, LinphoneCall *call){ diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 3bfa7d9d4..36b8c6918 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -471,7 +471,7 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr call->core=lc; linphone_core_get_local_ip(lc,linphone_address_get_domain(to),call->localip); linphone_call_init_common(call,from,to); - call->params=*params; + _linphone_call_params_copy(&call->params,params); if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseIce) { call->ice_session = ice_session_new(); ice_session_set_role(call->ice_session, IR_Controlling); @@ -733,6 +733,8 @@ static void linphone_call_destroy(LinphoneCall *obj) if (obj->auth_token) { ms_free(obj->auth_token); } + if (obj->params.record_file) + ms_free(obj->params.record_file); ms_free(obj); } @@ -768,7 +770,9 @@ void linphone_call_unref(LinphoneCall *obj){ /** * Returns current parameters associated to the call. **/ -const LinphoneCallParams * linphone_call_get_current_params(const LinphoneCall *call){ +const LinphoneCallParams * linphone_call_get_current_params(LinphoneCall *call){ + if (call->params.record_file) + call->current_params.record_file=call->params.record_file; return &call->current_params; } @@ -987,10 +991,17 @@ void linphone_call_params_enable_video(LinphoneCallParams *cp, bool_t enabled){ cp->has_video=enabled; } +/** + * Returns the audio codec used in the call, described as a PayloadType structure. +**/ const PayloadType* linphone_call_params_get_used_audio_codec(const LinphoneCallParams *cp) { return cp->audio_codec; } + +/** + * Returns the video codec used in the call, described as a PayloadType structure. +**/ const PayloadType* linphone_call_params_get_used_video_codec(const LinphoneCallParams *cp) { return cp->video_codec; } @@ -1073,12 +1084,18 @@ void linphone_call_send_vfu_request(LinphoneCall *call) } #endif + +void _linphone_call_params_copy(LinphoneCallParams *ncp, const LinphoneCallParams *cp){ + memcpy(ncp,cp,sizeof(LinphoneCallParams)); + if (cp->record_file) ncp->record_file=ms_strdup(cp->record_file); +} + /** * **/ LinphoneCallParams * linphone_call_params_copy(const LinphoneCallParams *cp){ LinphoneCallParams *ncp=ms_new0(LinphoneCallParams,1); - memcpy(ncp,cp,sizeof(LinphoneCallParams)); + _linphone_call_params_copy(ncp,cp); return ncp; } @@ -1086,6 +1103,7 @@ LinphoneCallParams * linphone_call_params_copy(const LinphoneCallParams *cp){ * **/ void linphone_call_params_destroy(LinphoneCallParams *p){ + if (p->record_file) ms_free(p->record_file); ms_free(p); } @@ -1329,10 +1347,10 @@ static void post_configure_audio_streams(LinphoneCall*call){ LinphoneCore *lc=call->core; _post_configure_audio_stream(st,lc,call->audio_muted); if (lc->vtable.dtmf_received!=NULL){ - /* replace by our default action*/ audio_stream_play_received_dtmfs(call->audiostream,FALSE); - /*rtp_session_signal_connect(call->audiostream->session,"telephone-event",(RtpCallback)linphone_core_dtmf_received,(unsigned long)lc);*/ } + if (call->record_active) + linphone_call_start_recording(call); } static RtpProfile *make_profile(LinphoneCall *call, const SalMediaDescription *md, const SalStreamDescription *desc, int *used_pt){ @@ -1484,6 +1502,8 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, const char *cna if (captcard && stream->max_rate>0) ms_snd_card_set_preferred_sample_rate(captcard, stream->max_rate); audio_stream_enable_adaptive_bitrate_control(call->audiostream,use_arc); audio_stream_enable_adaptive_jittcomp(call->audiostream, linphone_core_audio_adaptive_jittcomp_enabled(lc)); + if (!call->params.in_conference && call->params.record_file) + audio_stream_mixed_record_open(call->audiostream,call->params.record_file); audio_stream_start_full( call->audiostream, call->audio_profile, @@ -1512,23 +1532,23 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, const char *cna } audio_stream_set_rtcp_information(call->audiostream, cname, rtcp_tool); - /* valid local tags are > 0 */ + /* valid local tags are > 0 */ if (stream->proto == SalProtoRtpSavp) { - const SalStreamDescription *local_st_desc=sal_media_description_find_stream(call->localdesc, - SalProtoRtpSavp,SalAudio); - int crypto_idx = find_crypto_index_from_tag(local_st_desc->crypto, stream->crypto_local_tag); - - if (crypto_idx >= 0) { - audio_stream_enable_srtp( - call->audiostream, - stream->crypto[0].algo, - local_st_desc->crypto[crypto_idx].master_key, - stream->crypto[0].master_key); - call->audiostream_encrypted=TRUE; - } else { - ms_warning("Failed to find local crypto algo with tag: %d", stream->crypto_local_tag); - call->audiostream_encrypted=FALSE; - } + const SalStreamDescription *local_st_desc=sal_media_description_find_stream(call->localdesc, + SalProtoRtpSavp,SalAudio); + int crypto_idx = find_crypto_index_from_tag(local_st_desc->crypto, stream->crypto_local_tag); + + if (crypto_idx >= 0) { + audio_stream_enable_srtp( + call->audiostream, + stream->crypto[0].algo, + local_st_desc->crypto[crypto_idx].master_key, + stream->crypto[0].master_key); + call->audiostream_encrypted=TRUE; + } else { + ms_warning("Failed to find local crypto algo with tag: %d", stream->crypto_local_tag); + call->audiostream_encrypted=FALSE; + } }else call->audiostream_encrypted=FALSE; if (call->params.in_conference){ /*transform the graph to connect it to the conference filter */ @@ -1981,6 +2001,53 @@ const LinphoneCallStats *linphone_call_get_video_stats(const LinphoneCall *call) return &call->stats[LINPHONE_CALL_STATS_VIDEO]; } +/** + * Enable recording of the call (voice-only). + * This function must be used before the call parameters are assigned to the call. + * The call recording can be started and paused after the call is established with + * linphone_call_start_recording() and linphone_call_pause_recording(). + * @param cp the call parameters + * @param path path and filename of the file where audio is written. +**/ +void linphone_call_params_set_record_file(LinphoneCallParams *cp, const char *path){ + if (cp->record_file){ + ms_free(cp->record_file); + cp->record_file=NULL; + } + if (path) cp->record_file=ms_strdup(path); +} + +/** + * Retrieves the path for the audio recoding of the call. +**/ +const char *linphone_call_params_get_record_file(const LinphoneCallParams *cp){ + return cp->record_file; +} + +/** + * Start call recording. + * The output file where audio is recorded must be previously specified with linphone_call_params_set_record_file(). +**/ +void linphone_call_start_recording(LinphoneCall *call){ + if (!call->params.record_file){ + ms_error("linphone_call_start_recording(): no output file specified. Use linphone_call_params_set_record_file()."); + return; + } + if (call->audiostream && !call->params.in_conference){ + audio_stream_mixed_record_start(call->audiostream); + } + call->record_active=TRUE; +} + +/** + * Stop call recording. +**/ +void linphone_call_stop_recording(LinphoneCall *call){ + if (call->audiostream && !call->params.in_conference){ + audio_stream_mixed_record_stop(call->audiostream); + } + call->record_active=FALSE; +} /** * @} diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 673131218..76ccc1f05 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -486,11 +486,11 @@ static void sound_config_read(LinphoneCore *lc) check_sound_device(lc); lc->sound_conf.latency=0; #ifndef __ios - tmp=TRUE; + tmp=TRUE; #else - tmp=FALSE; /* on iOS we have builtin echo cancellation.*/ + tmp=FALSE; /* on iOS we have builtin echo cancellation.*/ #endif - tmp=lp_config_get_int(lc->config,"sound","echocancellation",tmp); + tmp=lp_config_get_int(lc->config,"sound","echocancellation",tmp); linphone_core_enable_echo_cancellation(lc,tmp); linphone_core_enable_echo_limiter(lc, lp_config_get_int(lc->config,"sound","echolimiter",0)); @@ -3034,7 +3034,7 @@ int linphone_core_accept_call_with_params(LinphoneCore *lc, LinphoneCall *call, if (params){ const SalMediaDescription *md = sal_call_get_remote_media_description(call->op); - call->params=*params; + _linphone_call_params_copy(&call->params,params); // There might not be a md if the INVITE was lacking an SDP // In this case we use the parameters as is. if (md) call->params.has_video &= linphone_core_media_description_contains_video_stream(md); @@ -4685,7 +4685,8 @@ void linphone_core_set_play_file(LinphoneCore *lc, const char *file){ * Sets a wav file where incoming stream is to be recorded, * when files are used instead of soundcards (see linphone_core_use_files()). * - * The file must be a 16 bit linear wav file. + * This feature is different from call recording (linphone_call_params_set_record_file()) + * The file will be a 16 bit linear wav file. **/ void linphone_core_set_record_file(LinphoneCore *lc, const char *file){ LinphoneCall *call=linphone_core_get_current_call(lc); @@ -5536,8 +5537,6 @@ void linphone_core_init_default_params(LinphoneCore*lc, LinphoneCallParams *para params->in_conference=FALSE; } - - void linphone_core_set_device_identifier(LinphoneCore *lc,const char* device_id) { if (lc->device_id) ms_free(lc->device_id); lc->device_id=ms_strdup(device_id); diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index f780d2f65..6228861de 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -206,7 +206,8 @@ void linphone_call_params_set_audio_bandwidth_limit(LinphoneCallParams *cp, int void linphone_call_params_destroy(LinphoneCallParams *cp); bool_t linphone_call_params_low_bandwidth_enabled(const LinphoneCallParams *cp); void linphone_call_params_enable_low_bandwidth(LinphoneCallParams *cp, bool_t enabled); - +void linphone_call_params_set_record_file(LinphoneCallParams *cp, const char *path); +const char *linphone_call_params_get_record_file(const LinphoneCallParams *cp); /** * Enum describing failure reasons. * @ingroup initializing @@ -389,7 +390,7 @@ const char *linphone_call_get_refer_to(const LinphoneCall *call); bool_t linphone_call_has_transfer_pending(const LinphoneCall *call); LinphoneCall *linphone_call_get_replaced_call(LinphoneCall *call); int linphone_call_get_duration(const LinphoneCall *call); -const LinphoneCallParams * linphone_call_get_current_params(const LinphoneCall *call); +const LinphoneCallParams * linphone_call_get_current_params(LinphoneCall *call); const LinphoneCallParams * linphone_call_get_remote_params(LinphoneCall *call); void linphone_call_enable_camera(LinphoneCall *lc, bool_t enabled); bool_t linphone_call_camera_enabled(const LinphoneCall *lc); @@ -410,6 +411,8 @@ void linphone_call_set_user_pointer(LinphoneCall *call, void *user_pointer); void linphone_call_set_next_video_frame_decoded_callback(LinphoneCall *call, LinphoneCallCbFunc cb, void* user_data); LinphoneCallState linphone_call_get_transfer_state(LinphoneCall *call); void linphone_call_zoom_video(LinphoneCall* call, float zoom_factor, float* cx, float* cy); +void linphone_call_start_recording(LinphoneCall *call); +void linphone_call_stop_recording(LinphoneCall *call); /** * Return TRUE if this call is currently part of a conference *@param call #LinphoneCall diff --git a/coreapi/misc.c b/coreapi/misc.c index 897300c61..927c3b55a 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -988,6 +988,7 @@ unsigned int linphone_core_get_audio_features(LinphoneCore *lc){ else if (strcasecmp(name,"VOL_RCV")==0) ret|=AUDIO_STREAM_FEATURE_VOL_RCV; else if (strcasecmp(name,"DTMF")==0) ret|=AUDIO_STREAM_FEATURE_DTMF; else if (strcasecmp(name,"DTMF_ECHO")==0) ret|=AUDIO_STREAM_FEATURE_DTMF_ECHO; + else if (strcasecmp(name,"MIXED_RECORDING")==0) ret|=AUDIO_STREAM_FEATURE_MIXED_RECORDING; else if (strcasecmp(name,"ALL")==0) ret|=AUDIO_STREAM_FEATURE_ALL; else if (strcasecmp(name,"NONE")==0) ret=0; else ms_error("Unsupported audio feature %s requested in config file.",name); @@ -995,6 +996,12 @@ unsigned int linphone_core_get_audio_features(LinphoneCore *lc){ p=n; } }else ret=AUDIO_STREAM_FEATURE_ALL; + + if (ret==AUDIO_STREAM_FEATURE_ALL){ + /*since call recording is specified before creation of the stream in linphonecore, + * it will be requested on demand. It is not necessary to include it all the time*/ + ret&=~AUDIO_STREAM_FEATURE_MIXED_RECORDING; + } return ret; } diff --git a/coreapi/private.h b/coreapi/private.h index ca79a722f..4048be98a 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -80,6 +80,7 @@ struct _LinphoneCallParams{ int up_bw; int down_ptime; int up_ptime; + char *record_file; bool_t has_video; bool_t real_early_media; /*send real media even during early media (for outgoing calls)*/ bool_t in_conference; /*in conference mode */ @@ -176,6 +177,7 @@ struct _LinphoneCall bool_t was_automatically_paused; bool_t ping_replied; + bool_t record_active; }; @@ -661,6 +663,7 @@ void call_logs_write_to_config_file(LinphoneCore *lc); int linphone_core_get_edge_bw(LinphoneCore *lc); int linphone_core_get_edge_ptime(LinphoneCore *lc); +void _linphone_call_params_copy(LinphoneCallParams *params, const LinphoneCallParams *refparams); int linphone_upnp_init(LinphoneCore *lc); void linphone_upnp_destroy(LinphoneCore *lc); diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 65446d696..68c86d38a 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -667,8 +667,6 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ GtkWidget *call_stats=(GtkWidget*)g_object_get_data(G_OBJECT(callview),"call_stats"); display_peer_name_in_label(callee,linphone_call_get_remote_address (call)); - - gtk_widget_set_visible(linphone_gtk_get_widget(callview,"buttons_panel"),!in_conf); gtk_widget_hide(linphone_gtk_get_widget(callview,"answer_decline_panel")); gtk_label_set_markup(GTK_LABEL(status),in_conf ? _("In conference") : _("In call")); @@ -693,6 +691,8 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"incall_mute"),FALSE); } gtk_widget_show_all(linphone_gtk_get_widget(callview,"buttons_panel")); + if (!in_conf) gtk_widget_show_all(linphone_gtk_get_widget(callview,"record_hbox")); + else gtk_widget_hide(linphone_gtk_get_widget(callview,"record_hbox")); if (call_stats) show_used_codecs(call_stats,call); } @@ -740,11 +740,9 @@ void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_m linphone_gtk_get_ui_config("stop_call_icon","stopcall-red.png"),FALSE); gtk_widget_hide(linphone_gtk_get_widget(callview,"answer_decline_panel")); + gtk_widget_hide(linphone_gtk_get_widget(callview,"record_hbox")); + gtk_widget_hide(linphone_gtk_get_widget(callview,"buttons_panel")); gtk_widget_hide(linphone_gtk_get_widget(callview,"incall_audioview")); - gtk_widget_hide(linphone_gtk_get_widget(callview,"terminate_call")); - gtk_widget_hide(linphone_gtk_get_widget(callview,"video_button")); - gtk_widget_hide(linphone_gtk_get_widget(callview,"transfer_button")); - gtk_widget_hide(linphone_gtk_get_widget(callview,"conference_button")); linphone_gtk_enable_mute_button( GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),FALSE); linphone_gtk_enable_hold_button(call,FALSE,TRUE); @@ -857,3 +855,20 @@ void linphone_gtk_call_statistics_closed(GtkWidget *call_stats){ gtk_widget_destroy(call_stats); } +void linphone_gtk_record_call_toggled(GtkWidget *button){ + gboolean active=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); + LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL); + GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer (call); + const LinphoneCallParams *params=linphone_call_get_current_params(call); + const char *filepath=linphone_call_params_get_record_file(params); + gchar *message=g_strdup_printf(_("Recording into %s %s"),filepath,active ? "" : _("(Paused)")); + + if (active){ + linphone_call_start_recording(call); + }else { + linphone_call_stop_recording(call); + } + gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callview,"record_status")),message); + g_free(message); +} + diff --git a/gtk/main.c b/gtk/main.c index cfbd8983f..94d94f662 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -750,10 +750,31 @@ static void linphone_gtk_update_call_buttons(LinphoneCall *call){ } } +gchar *linphone_gtk_get_call_record_path(LinphoneAddress *address){ + const char *dir=g_get_user_special_dir(G_USER_DIRECTORY_MUSIC); + const char *id=linphone_address_get_username(address); + char filename[256]={0}; + if (id==NULL) id=linphone_address_get_domain(address); + snprintf(filename,sizeof(filename)-1,"%s-%lu-%s-record.wav", + linphone_gtk_get_ui_config("title","Linphone"), + (unsigned long)time(NULL),id); + return g_build_filename(dir,filename,NULL); +} + static gboolean linphone_gtk_start_call_do(GtkWidget *uri_bar){ const char *entered=gtk_entry_get_text(GTK_ENTRY(uri_bar)); - if (linphone_core_invite(linphone_gtk_get_core(),entered)!=NULL) { + LinphoneCore *lc=linphone_gtk_get_core(); + LinphoneAddress *addr=linphone_core_interpret_url(lc,entered); + + if (addr!=NULL){ + LinphoneCallParams *params=linphone_core_create_default_call_parameters(lc); + gchar *record_file=linphone_gtk_get_call_record_path(addr); + linphone_call_params_set_record_file(params,record_file); + linphone_core_invite_address_with_params(lc,addr,params); completion_add_text(GTK_ENTRY(uri_bar),entered); + linphone_address_destroy(addr); + linphone_call_params_destroy(params); + g_free(record_file); }else{ linphone_gtk_call_terminated(NULL,NULL); } @@ -1792,6 +1813,7 @@ int main(int argc, char *argv[]){ GtkSettings *settings; GdkPixbuf *pbuf; const char *app_name="Linphone"; + LpConfig *factory; #if !GLIB_CHECK_VERSION(2, 31, 0) g_thread_init(NULL); @@ -1867,6 +1889,11 @@ int main(int argc, char *argv[]){ since we want to have had time to change directory and to parse the options, in case we needed to access the working directory */ factory_config_file = linphone_gtk_get_factory_config_file(); + if (factory_config_file){ + factory=lp_config_new(NULL); + lp_config_read_file(factory,factory_config_file); + app_name=lp_config_get_string(factory,"GtkUi","title","Linphone"); + } if (linphone_gtk_init_instance(app_name, addr_to_call) == FALSE){ g_warning("Another running instance of linphone has been detected. It has been woken-up."); diff --git a/gtk/main.ui b/gtk/main.ui index 6c15688c2..b42470e5a 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -268,29 +268,31 @@ True False + + + True + False + label + center + + + True + True + 0 + + True False - - True - False - label - center - - - True - True - 2 - 0 - + False False - 0 + 1 @@ -353,7 +355,7 @@ False True - 1 + 2 @@ -419,7 +421,7 @@ False False 2 - 2 + 3 @@ -460,7 +462,47 @@ False False - 3 + 4 + + + + + False + + + gtk-media-record + True + True + True + Record this call to an audio file + False + True + + + + False + False + 0 + + + + + True + False + True + char + + + True + True + 1 + + + + + False + False + 5 @@ -556,7 +598,7 @@ False False 7 - 4 + 6 diff --git a/mediastreamer2 b/mediastreamer2 index 1f0374f48..fd8f21d70 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 1f0374f48290e0e852bcbb15c4d302c0c5b332f4 +Subproject commit fd8f21d7087ed2d5af18e4cd3a7db9bdf0008ed3 From d157b76a91f8434e6711d146ed4cf8f33b7110d3 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 6 Feb 2013 15:40:11 +0100 Subject: [PATCH 067/281] display chat --- gtk/chat.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index 201d138d9..76d34c2ff 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -108,9 +108,9 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, display=linphone_address_get_username(from); } gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,display,-1,"bold",me ? "left" : "left",NULL); + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,display,-1,"bold",me ? "bg":NULL,NULL); gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter," : ",-1,"bold",me ? "left" : "left",NULL); + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter," : ",-1,"bold",me ? "bg":NULL,NULL); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); g_object_set_data(G_OBJECT(w),"from_message",linphone_address_as_string(from)); @@ -118,7 +118,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_get_iter_at_offset(buffer,&begin,off); gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,message,-1,"margin",NULL); + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,message,-1,"margin",me ? "bg":NULL,NULL); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); gtk_text_buffer_get_bounds (buffer, &begin, &end); @@ -137,7 +137,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, if(me){ list=g_list_append(list,GINT_TO_POINTER(gtk_text_iter_get_line(&iter))); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Sending .. ",-1, - "italic","right","small","font_grey",NULL); + "italic","right","small","font_grey","bg",NULL); g_object_set_data(G_OBJECT(w),"list",list); } else { struct tm *tm=localtime(&t); @@ -204,19 +204,18 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag break; } case LinphoneChatMessageStateNotDelivered: - result="Message not delivered "; + result="Error "; break; default : result="Sending .."; } gtk_text_buffer_insert_with_tags_by_name(b,&iter,result,-1, - "italic","right","small","font_grey",NULL); + "italic","right","small","font_grey","bg",NULL); list=g_list_remove(list,g_list_nth_data(list,0)); g_object_set_data(G_OBJECT(page),"list",list); } } static void on_chat_state_changed(LinphoneChatMessage *msg, LinphoneChatMessageState state, void *user_pointer){ - g_message("chat message state is %s",linphone_chat_message_state_to_string(state)); update_chat_state_message(state,msg); } @@ -251,7 +250,13 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres color.red = 32512; color.green = 32512; color.blue = 32512; + + GdkColor colorb; + colorb.red = 56832; + colorb.green = 60928; + colorb.blue = 61952; + gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW(text),GTK_WRAP_WORD); gtk_text_view_set_editable (GTK_TEXT_VIEW(text),FALSE); gtk_notebook_append_page (notebook,chat_view,create_tab_chat_header(cr,with)); @@ -292,7 +297,9 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), "font_grey","foreground-gdk",&color,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), - "margin","left-margin",10,NULL); + "margin","indent",10,NULL); + gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), + "bg","paragraph-background-gdk",&colorb,NULL); GtkWidget *button = linphone_gtk_get_widget(chat_view,"send"); g_signal_connect_swapped(G_OBJECT(button),"clicked",(GCallback)linphone_gtk_send_text,NULL); From 990cbb596df704fa55d79e12e3d2a626d77508b8 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 6 Feb 2013 22:27:58 +0100 Subject: [PATCH 068/281] - fix text_received() callback so that it can work without date header. - add api to add custom header (work in progress) - add accessors to call logs and hide the structure into private.h --- console/commands.c | 2 +- coreapi/callbacks.c | 4 +- coreapi/chat.c | 26 +- coreapi/linphonecall.c | 58 +- coreapi/linphonecore.c | 61 +- coreapi/linphonecore.h | 28 +- coreapi/private.h | 27 +- coreapi/sal.c | 59 + coreapi/sal.h | 20 +- coreapi/sal_eXosip2.c | 5306 ++++++++++++++++---------------- coreapi/sal_eXosip2.h | 2 + coreapi/sal_eXosip2_presence.c | 4 +- gtk/calllogs.c | 32 +- gtk/incall_view.c | 2 +- mediastreamer2 | 2 +- 15 files changed, 2925 insertions(+), 2708 deletions(-) diff --git a/console/commands.c b/console/commands.c index 3ec2ed65b..a91c58c44 100644 --- a/console/commands.c +++ b/console/commands.c @@ -1965,7 +1965,7 @@ static int lpc_cmd_duration(LinphoneCore *lc, char *args){ for(;elem!=NULL;elem=elem->next){ if (elem->next==NULL){ cl=(LinphoneCallLog*)elem->data; - linphonec_out("%i seconds\n",cl->duration); + linphonec_out("%i seconds\n",linphone_call_log_get_duration(cl)); } } return 1; diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 552d34804..6bdecc4b5 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -842,8 +842,8 @@ static bool_t is_duplicate_msg(LinphoneCore *lc, const char *msg_id){ } -static void text_received(Sal *sal, const SalMessage *msg){ - LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal); +static void text_received(SalOp *op, const SalMessage *msg){ + LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op)); if (is_duplicate_msg(lc,msg->message_id)==FALSE){ linphone_core_message_received(lc,msg); } diff --git a/coreapi/chat.c b/coreapi/chat.c index c502efa9f..29af16eec 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -160,13 +160,6 @@ LinphoneChatMessage* linphone_chat_room_create_message(const LinphoneChatRoom *c return msg; } -void linphone_chat_message_destroy(LinphoneChatMessage* msg) { - if (msg->message) ms_free(msg->message); - if (msg->external_body_url) ms_free(msg->external_body_url); - if (msg->from) linphone_address_destroy(msg->from); - ms_free(msg); -} - void linphone_chat_room_send_message2(LinphoneChatRoom *cr, LinphoneChatMessage* msg,LinphoneChatMessageStateChangeCb status_cb,void* ud) { msg->cb=status_cb; msg->cb_ud=ud; @@ -231,6 +224,15 @@ time_t linphone_chat_message_get_time(const LinphoneChatMessage* message) { const char * linphone_chat_message_get_text(const LinphoneChatMessage* message) { return message->message; } + +void linphone_chat_message_add_custom_header(LinphoneChatMessage* message, const char *header_name, const char *header_value){ + message->custom_headers=sal_custom_header_append(message->custom_headers,header_name,header_value); +} + +const char * linphone_chat_message_get_custom_header(LinphoneChatMessage* message, const char *header_name){ + return sal_custom_header_find(message->custom_headers,header_name); +} + LinphoneChatMessage* linphone_chat_message_clone(const LinphoneChatMessage* msg) { /*struct _LinphoneChatMessage { char* message; @@ -250,3 +252,13 @@ LinphoneChatMessage* linphone_chat_message_clone(const LinphoneChatMessage* msg) if (msg->from) new_message->from=linphone_address_clone(msg->from); return new_message; } + +void linphone_chat_message_destroy(LinphoneChatMessage* msg) { + if (msg->message) ms_free(msg->message); + if (msg->external_body_url) ms_free(msg->external_body_url); + if (msg->from) linphone_address_destroy(msg->from); + if (msg->custom_headers) sal_custom_header_free(msg->custom_headers); + ms_free(msg); +} + + diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 36b8c6918..27354f61c 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -472,6 +472,8 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr linphone_core_get_local_ip(lc,linphone_address_get_domain(to),call->localip); linphone_call_init_common(call,from,to); _linphone_call_params_copy(&call->params,params); + sal_op_set_custom_header(call->op,call->params.custom_headers); + if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseIce) { call->ice_session = ice_session_new(); ice_session_set_role(call->ice_session, IR_Controlling); @@ -733,9 +735,7 @@ static void linphone_call_destroy(LinphoneCall *obj) if (obj->auth_token) { ms_free(obj->auth_token); } - if (obj->params.record_file) - ms_free(obj->params.record_file); - + linphone_call_params_uninit(&obj->params); ms_free(obj); } @@ -810,6 +810,7 @@ const LinphoneCallParams * linphone_call_get_remote_params(LinphoneCall *call){ cp->low_bandwidth=TRUE; } } + cp->custom_headers=(SalCustomHeader*)sal_op_get_custom_header(call->op); return cp; } } @@ -963,6 +964,18 @@ void linphone_call_enable_camera (LinphoneCall *call, bool_t enable){ #endif } +#ifdef VIDEO_ENABLED +/** + * Request remote side to send us a Video Fast Update. +**/ +void linphone_call_send_vfu_request(LinphoneCall *call) +{ + if (LinphoneCallStreamsRunning == linphone_call_get_state(call)) + sal_call_send_vfu_request(call->op); +} +#endif + + /** * Take a photo of currently received video and write it into a jpeg file. **/ @@ -1038,10 +1051,16 @@ bool_t linphone_call_params_video_enabled(const LinphoneCallParams *cp){ return cp->has_video; } +/** + * Returns kind of media encryption selected for the call. +**/ enum LinphoneMediaEncryption linphone_call_params_get_media_encryption(const LinphoneCallParams *cp) { return cp->media_encryption; } +/** + * Set requested media encryption for a call. +**/ void linphone_call_params_set_media_encryption(LinphoneCallParams *cp, enum LinphoneMediaEncryption e) { cp->media_encryption = e; } @@ -1054,6 +1073,9 @@ void linphone_call_params_enable_early_media_sending(LinphoneCallParams *cp, boo cp->real_early_media=enabled; } +/** + * Indicates whether sending of early media was enabled. +**/ bool_t linphone_call_params_early_media_sending_enabled(const LinphoneCallParams *cp){ return cp->real_early_media; } @@ -1073,25 +1095,25 @@ void linphone_call_params_set_audio_bandwidth_limit(LinphoneCallParams *cp, int cp->audio_bw=bandwidth; } -#ifdef VIDEO_ENABLED -/** - * Request remote side to send us a Video Fast Update. -**/ -void linphone_call_send_vfu_request(LinphoneCall *call) -{ - if (LinphoneCallStreamsRunning == linphone_call_get_state(call)) - sal_call_send_vfu_request(call->op); +void linphone_call_params_add_custom_header(LinphoneCallParams *params, const char *header_name, const char *header_value){ + params->custom_headers=sal_custom_header_append(params->custom_headers,header_name,header_value); } -#endif +const char *linphone_call_params_get_custom_header(LinphoneCallParams *params, const char *header_name){ + return sal_custom_header_find(params->custom_headers,header_name); +} void _linphone_call_params_copy(LinphoneCallParams *ncp, const LinphoneCallParams *cp){ memcpy(ncp,cp,sizeof(LinphoneCallParams)); if (cp->record_file) ncp->record_file=ms_strdup(cp->record_file); + /* + * The management of the custom headers is not optimal. We copy everything while ref counting would be more efficient. + */ + if (cp->custom_headers) ncp->custom_headers=sal_custom_header_clone(cp->custom_headers); } /** - * + * Copy existing LinphoneCallParams to a new LinphoneCallParams object. **/ LinphoneCallParams * linphone_call_params_copy(const LinphoneCallParams *cp){ LinphoneCallParams *ncp=ms_new0(LinphoneCallParams,1); @@ -1099,14 +1121,20 @@ LinphoneCallParams * linphone_call_params_copy(const LinphoneCallParams *cp){ return ncp; } +void linphone_call_params_uninit(LinphoneCallParams *p){ + if (p->record_file) ms_free(p->record_file); + if (p->custom_headers) sal_custom_header_free(p->custom_headers); +} + /** - * + * Destroy LinphoneCallParams. **/ void linphone_call_params_destroy(LinphoneCallParams *p){ - if (p->record_file) ms_free(p->record_file); + linphone_call_params_uninit(p); ms_free(p); } + /** * @} **/ diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 76ccc1f05..4c5822590 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -203,8 +203,8 @@ static void call_logs_read_from_config_file(LinphoneCore *lc){ if (tmp) cl->refkey=ms_strdup(tmp); cl->quality=lp_config_get_float(cfg,logsection,"quality",-1); cl->video_enabled=lp_config_get_int(cfg,logsection,"video_enabled",0); - cl->call_id=lp_config_get_string(cfg,logsection,"call_id",NULL); - if(cl->call_id) cl->call_id=ms_strdup(cl->call_id); + tmp=lp_config_get_string(cfg,logsection,"call_id",NULL); + if (tmp) cl->call_id=ms_strdup(tmp); lc->call_logs=ms_list_append(lc->call_logs,cl); }else break; } @@ -270,10 +270,16 @@ const rtp_stats_t *linphone_call_log_get_remote_stats(const LinphoneCallLog *cl) return &cl->remote_stats; } +/** + * Assign a user pointer to the call log. +**/ void linphone_call_log_set_user_pointer(LinphoneCallLog *cl, void *up){ cl->user_pointer=up; } +/** + * Returns the user pointer associated with the call log. +**/ void *linphone_call_log_get_user_pointer(const LinphoneCallLog *cl){ return cl->user_pointer; } @@ -306,13 +312,62 @@ const char *linphone_call_log_get_ref_key(const LinphoneCallLog *cl){ return cl->refkey; } +/** + * Returns origin (ie from) address of the call. +**/ +LinphoneAddress *linphone_call_log_get_from(LinphoneCallLog *cl){ + return cl->from; +} + +/** + * Returns destination address (ie to) of the call. +**/ +LinphoneAddress *linphone_call_log_get_to(LinphoneCallLog *cl){ + return cl->to; +} + +/** + * Returns the direction of the call. +**/ +LinphoneCallDir linphone_call_log_get_dir(LinphoneCallLog *cl){ + return cl->dir; +} + +/** + * Returns the status of the call. +**/ +LinphoneCallStatus linphone_call_log_get_status(LinphoneCallLog *cl){ + return cl->status; +} + +/** + * Returns the start date of the call, expressed as a POSIX time_t. +**/ +time_t linphone_call_log_get_start_date(LinphoneCallLog *cl){ + return cl->start_date_time; +} + +/** + * Returns duration of the call. +**/ +int linphone_call_log_get_duration(LinphoneCallLog *cl){ + return cl->duration; +} + +/** + * Returns overall quality indication of the call. +**/ +float linphone_call_log_get_quality(LinphoneCallLog *cl){ + return cl->quality; +} + /** @} */ void linphone_call_log_destroy(LinphoneCallLog *cl){ if (cl->from!=NULL) linphone_address_destroy(cl->from); if (cl->to!=NULL) linphone_address_destroy(cl->to); if (cl->refkey!=NULL) ms_free(cl->refkey); - if (cl->call_id) ms_free((void*)cl->call_id); + if (cl->call_id) ms_free(cl->call_id); ms_free(cl); } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 6228861de..08c4f89ee 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -141,24 +141,7 @@ typedef enum _LinphoneCallStatus { * @ingroup call_logs * **/ -typedef struct _LinphoneCallLog{ - LinphoneCallDir dir; /**< The direction of the call*/ - LinphoneCallStatus status; /**< The status of the call*/ - LinphoneAddress *from; /**remote_media); if (b->call_id) ms_free(b->call_id); + if (b->custom_headers) + sal_custom_header_free(b->custom_headers); ms_free(op); } @@ -372,3 +374,60 @@ void sal_auth_info_delete(const SalAuthInfo* auth_info) { ms_free((void*)auth_info); } +SalCustomHeader *sal_custom_header_append(SalCustomHeader *ch, const char *name, const char *value){ + SalCustomHeader *h=ms_new0(SalCustomHeader,1); + h->header_name=ms_strdup(name); + h->header_value=ms_strdup(value); + h->node.data=h; + return (SalCustomHeader*)ms_list_append_link((MSList*)ch,(MSList*)h); +} + +const char *sal_custom_header_find(const SalCustomHeader *ch, const char *name){ + const MSList *it; + for (it=(const MSList*)ch;it!=NULL;it=it->next){ + const SalCustomHeader *itch=(const SalCustomHeader *)it; + if (strcasecmp(itch->header_name,name)==0) + return itch->header_value; + } + return NULL; +} + +static void sal_custom_header_uninit(SalCustomHeader *ch){ + ms_free(ch->header_name); + ms_free(ch->header_value); +} + +void sal_custom_header_free(SalCustomHeader *ch){ + ms_list_for_each((MSList*)ch,(void (*)(void*))sal_custom_header_uninit); + ms_list_free((MSList *)ch); +} + +SalCustomHeader *sal_custom_header_clone(SalCustomHeader *ch){ + const MSList *it; + SalCustomHeader *ret=NULL; + for (it=(const MSList*)ch;it!=NULL;it=it->next){ + const SalCustomHeader *itch=(const SalCustomHeader *)it; + ret=sal_custom_header_append(ret,itch->header_name,itch->header_value); + } + return ret; +} + +const SalCustomHeader *sal_op_get_custom_header(SalOp *op){ + SalOpBase *b=(SalOpBase *)op; + return b->custom_headers; +} + +/* + * Warning: this function takes owneship of the custom headers + */ +void sal_op_set_custom_header(SalOp *op, SalCustomHeader* ch){ + SalOpBase *b=(SalOpBase *)op; + if (b->custom_headers){ + sal_custom_header_free(b->custom_headers); + b->custom_headers=NULL; + } + b->custom_headers=ch; +} + + + diff --git a/coreapi/sal.h b/coreapi/sal.h index 46294b603..26efa8115 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -46,6 +46,10 @@ struct SalAddress; typedef struct SalAddress SalAddress; +struct SalCustomHeader; + +typedef struct SalCustomHeader SalCustomHeader; + typedef enum { SalTransportUDP, /*UDP*/ SalTransportTCP, /*TCP*/ @@ -224,6 +228,7 @@ typedef struct SalOpBase{ void *user_pointer; char* call_id; char *remote_contact; + SalCustomHeader *custom_headers; } SalOpBase; @@ -291,7 +296,7 @@ typedef void (*SalOnRegisterFailure)(SalOp *op, SalError error, SalReason reason typedef void (*SalOnVfuRequest)(SalOp *op); typedef void (*SalOnDtmfReceived)(SalOp *op, char dtmf); typedef void (*SalOnRefer)(Sal *sal, SalOp *op, const char *referto); -typedef void (*SalOnTextReceived)(Sal *sal, const SalMessage *msg); +typedef void (*SalOnTextReceived)(SalOp *op, const SalMessage *msg); typedef void (*SalOnTextDeliveryUpdate)(SalOp *op, SalTextDeliveryStatus status); typedef void (*SalOnNotify)(SalOp *op, const char *from, const char *event); typedef void (*SalOnNotifyRefer)(SalOp *op, SalReferStatus state); @@ -451,6 +456,19 @@ int sal_ping(SalOp *op, const char *from, const char *to); /*misc*/ void sal_get_default_local_ip(Sal *sal, int address_family, char *ip, size_t iplen); +struct SalCustomHeader{ + MSList node; + char *header_name; + char *header_value; +}; + +SalCustomHeader *sal_custom_header_append(SalCustomHeader *ch, const char *name, const char *value); +const char *sal_custom_header_find(const SalCustomHeader *ch, const char *name); +void sal_custom_header_free(SalCustomHeader *ch); +SalCustomHeader *sal_custom_header_clone(SalCustomHeader *ch); +const SalCustomHeader *sal_op_get_custom_header(SalOp *op); +void sal_op_set_custom_header(SalOp *op, SalCustomHeader* ch); + /*internal API */ void __sal_op_init(SalOp *b, Sal *sal); diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 91ec04679..1777c0d42 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1,2640 +1,2668 @@ -/* -linphone -Copyright (C) 2010 Simon MORLAT (simon.morlat@free.fr) - -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. -*/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "sal_eXosip2.h" -#include "offeranswer.h" - -#ifdef ANDROID -// Necessary to make it linked -static void for_linker() { eXosip_transport_hook_register(NULL); } -#endif -static bool_t call_failure(Sal *sal, eXosip_event_t *ev); - -static void text_received(Sal *sal, eXosip_event_t *ev); - -static void masquerade_via(osip_message_t *msg, const char *ip, const char *port); -static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer, bool_t expire_last_contact); -static void update_contact_from_response(SalOp *op, osip_message_t *response); - -void _osip_list_set_empty(osip_list_t *l, void (*freefunc)(void*)){ - void *data; - while(!osip_list_eol(l,0)) { - data=osip_list_get(l,0); - osip_list_remove(l,0); - if (data) freefunc(data); - } -} - -void sal_get_default_local_ip(Sal *sal, int address_family,char *ip, size_t iplen){ - if (eXosip_guess_localip(address_family,ip,iplen)<0){ - /*default to something */ - strncpy(ip,address_family==AF_INET6 ? "::1" : "127.0.0.1",iplen); - ms_error("Could not find default routable ip address !"); - } -} - -static SalOp * sal_find_call(Sal *sal, int cid){ - const MSList *elem; - SalOp *op; - for(elem=sal->calls;elem!=NULL;elem=elem->next){ - op=(SalOp*)elem->data; - if (op->cid==cid) return op; - } - return NULL; -} - -static void sal_add_call(Sal *sal, SalOp *op){ - sal->calls=ms_list_append(sal->calls,op); -} - -static void sal_remove_call(Sal *sal, SalOp *op){ - sal->calls=ms_list_remove(sal->calls, op); -} - -static SalOp * sal_find_register(Sal *sal, int rid){ - const MSList *elem; - SalOp *op; - for(elem=sal->registers;elem!=NULL;elem=elem->next){ - op=(SalOp*)elem->data; - if (op->rid==rid) return op; - } - return NULL; -} - -static void sal_add_register(Sal *sal, SalOp *op){ - sal->registers=ms_list_append(sal->registers,op); -} - -static void sal_remove_register(Sal *sal, int rid){ - MSList *elem; - SalOp *op; - for(elem=sal->registers;elem!=NULL;elem=elem->next){ - op=(SalOp*)elem->data; - if (op->rid==rid) { - sal->registers=ms_list_remove_link(sal->registers,elem); - return; - } - } -} - -static SalOp * sal_find_other(Sal *sal, osip_message_t *message){ - const MSList *elem; - SalOp *op; - osip_call_id_t *callid=osip_message_get_call_id(message); - if (callid==NULL) { - ms_error("There is no call-id in this message !"); - return NULL; - } - for(elem=sal->other_transactions;elem!=NULL;elem=elem->next){ - op=(SalOp*)elem->data; - if (osip_call_id_match(callid,op->call_id)==0) return op; - } - return NULL; -} - -void sal_add_other(Sal *sal, SalOp *op, osip_message_t *request){ - osip_call_id_t *callid=osip_message_get_call_id(request); - if (callid==NULL) { - ms_error("There is no call id in the request !"); - return; - } - osip_call_id_clone(callid,&op->call_id); - sal->other_transactions=ms_list_append(sal->other_transactions,op); -} - -static void sal_remove_other(Sal *sal, SalOp *op){ - sal->other_transactions=ms_list_remove(sal->other_transactions,op); -} - - -static void sal_add_pending_auth(Sal *sal, SalOp *op){ - sal->pending_auths=ms_list_append(sal->pending_auths,op); -} - - -static void sal_remove_pending_auth(Sal *sal, SalOp *op){ - sal->pending_auths=ms_list_remove(sal->pending_auths,op); -} - -void sal_exosip_fix_route(SalOp *op){ - if (sal_op_get_route(op)!=NULL){ - osip_route_t *rt=NULL; - osip_uri_param_t *lr_param=NULL; - - osip_route_init(&rt); - if (osip_route_parse(rt,sal_op_get_route(op))<0){ - ms_warning("Bad route %s!",sal_op_get_route(op)); - sal_op_set_route(op,NULL); - }else{ - /* check if the lr parameter is set , if not add it */ - osip_uri_uparam_get_byname(rt->url, "lr", &lr_param); - if (lr_param==NULL){ - char *tmproute; - osip_uri_uparam_add(rt->url,osip_strdup("lr"),NULL); - osip_route_to_str(rt,&tmproute); - sal_op_set_route(op,tmproute); - osip_free(tmproute); - } - } - osip_route_free(rt); - } -} - -SalOp * sal_op_new(Sal *sal){ - SalOp *op=ms_new0(SalOp,1); - __sal_op_init(op,sal); - op->cid=op->did=op->tid=op->rid=op->nid=op->sid=-1; - op->result=NULL; - op->supports_session_timers=FALSE; - op->sdp_offering=TRUE; - op->pending_auth=NULL; - op->sdp_answer=NULL; - op->reinvite=FALSE; - op->call_id=NULL; - op->replaces=NULL; - op->referred_by=NULL; - op->masquerade_via=FALSE; - op->auto_answer_asked=FALSE; - op->auth_info=NULL; - op->terminated=FALSE; - return op; -} - -bool_t sal_call_autoanswer_asked(SalOp *op) -{ - return op->auto_answer_asked; -} - -void sal_op_release(SalOp *op){ - if (op->sdp_answer) - sdp_message_free(op->sdp_answer); - if (op->pending_auth) - eXosip_event_free(op->pending_auth); - if (op->rid!=-1){ - sal_remove_register(op->base.root,op->rid); - eXosip_register_remove(op->rid); - } - if (op->cid!=-1){ - ms_message("Cleaning cid %i",op->cid); - sal_remove_call(op->base.root,op); - } - if (op->sid!=-1){ - sal_remove_out_subscribe(op->base.root,op); - } - if (op->nid!=-1){ - sal_remove_in_subscribe(op->base.root,op); - if (op->call_id) - osip_call_id_free(op->call_id); - op->call_id=NULL; - } - if (op->pending_auth){ - sal_remove_pending_auth(op->base.root,op); - } - if (op->result) - sal_media_description_unref(op->result); - if (op->call_id){ - sal_remove_other(op->base.root,op); - osip_call_id_free(op->call_id); - } - if (op->replaces){ - ms_free(op->replaces); - } - if (op->referred_by){ - ms_free(op->referred_by); - } - if (op->auth_info) { - sal_auth_info_delete(op->auth_info); - } - __sal_op_free(op); -} - -static void _osip_trace_func(char *fi, int li, osip_trace_level_t level, char *chfr, va_list ap){ - int ortp_level=ORTP_DEBUG; - switch(level){ - case OSIP_INFO1: - case OSIP_INFO2: - case OSIP_INFO3: - case OSIP_INFO4: - ortp_level=ORTP_MESSAGE; - break; - case OSIP_WARNING: - ortp_level=ORTP_WARNING; - break; - case OSIP_ERROR: - case OSIP_BUG: - ortp_level=ORTP_ERROR; - break; - case OSIP_FATAL: - ortp_level=ORTP_FATAL; - break; - case END_TRACE_LEVEL: - break; - } - if (ortp_log_level_enabled(level)){ - int len=strlen(chfr); - char *chfrdup=ortp_strdup(chfr); - /*need to remove endline*/ - if (len>1){ - if (chfrdup[len-1]=='\n') - chfrdup[len-1]='\0'; - if (chfrdup[len-2]=='\r') - chfrdup[len-2]='\0'; - } - ortp_logv(ortp_level,chfrdup,ap); - ortp_free(chfrdup); - } -} - - -Sal * sal_init(){ - static bool_t firsttime=TRUE; - Sal *sal; - if (firsttime){ - osip_trace_initialize_func (OSIP_INFO4,&_osip_trace_func); - firsttime=FALSE; - } - eXosip_init(); - sal=ms_new0(Sal,1); - sal->keepalive_period=30; - sal->double_reg=TRUE; - sal->use_rports=TRUE; - sal->use_101=TRUE; - sal->reuse_authorization=FALSE; - sal->rootCa = 0; - sal->verify_server_certs=TRUE; - sal->verify_server_cn=TRUE; - sal->expire_old_contact=FALSE; - sal->add_dates=FALSE; - sal->dscp=-1; - return sal; -} - -void sal_uninit(Sal* sal){ - eXosip_quit(); - if (sal->rootCa) - ms_free(sal->rootCa); - ms_free(sal); -} - -void sal_set_user_pointer(Sal *sal, void *user_data){ - sal->up=user_data; -} - -void *sal_get_user_pointer(const Sal *sal){ - return sal->up; -} - -static void unimplemented_stub(){ - ms_warning("Unimplemented SAL callback"); -} - -void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){ - memcpy(&ctx->callbacks,cbs,sizeof(*cbs)); - if (ctx->callbacks.call_received==NULL) - ctx->callbacks.call_received=(SalOnCallReceived)unimplemented_stub; - if (ctx->callbacks.call_ringing==NULL) - ctx->callbacks.call_ringing=(SalOnCallRinging)unimplemented_stub; - if (ctx->callbacks.call_accepted==NULL) - ctx->callbacks.call_accepted=(SalOnCallAccepted)unimplemented_stub; - if (ctx->callbacks.call_failure==NULL) - ctx->callbacks.call_failure=(SalOnCallFailure)unimplemented_stub; - if (ctx->callbacks.call_terminated==NULL) - ctx->callbacks.call_terminated=(SalOnCallTerminated)unimplemented_stub; - if (ctx->callbacks.call_released==NULL) - ctx->callbacks.call_released=(SalOnCallReleased)unimplemented_stub; - if (ctx->callbacks.call_updating==NULL) - ctx->callbacks.call_updating=(SalOnCallUpdating)unimplemented_stub; - if (ctx->callbacks.auth_requested==NULL) - ctx->callbacks.auth_requested=(SalOnAuthRequested)unimplemented_stub; - if (ctx->callbacks.auth_success==NULL) - ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub; - if (ctx->callbacks.register_success==NULL) - ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub; - if (ctx->callbacks.register_failure==NULL) - ctx->callbacks.register_failure=(SalOnRegisterFailure)unimplemented_stub; - if (ctx->callbacks.dtmf_received==NULL) - ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub; - if (ctx->callbacks.notify==NULL) - ctx->callbacks.notify=(SalOnNotify)unimplemented_stub; - if (ctx->callbacks.notify_presence==NULL) - ctx->callbacks.notify_presence=(SalOnNotifyPresence)unimplemented_stub; - if (ctx->callbacks.subscribe_received==NULL) - ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub; - if (ctx->callbacks.text_received==NULL) - ctx->callbacks.text_received=(SalOnTextReceived)unimplemented_stub; - if (ctx->callbacks.ping_reply==NULL) - ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub; -} - -int sal_unlisten_ports(Sal *ctx){ - if (ctx->running){ - eXosip_quit(); - eXosip_init(); - ctx->running=FALSE; - } - return 0; -} - -int sal_reset_transports(Sal *ctx){ -#ifdef HAVE_EXOSIP_RESET_TRANSPORTS - if (ctx->running){ - ms_message("Exosip transports reset."); - eXosip_reset_transports(); - } - return 0; -#else - ms_warning("sal_reset_transports() not implemented in this version."); - return -1; -#endif -} - - -static void set_tls_options(Sal *ctx){ - if (ctx->rootCa) { - eXosip_tls_ctx_t tlsCtx; - memset(&tlsCtx, 0, sizeof(tlsCtx)); - snprintf(tlsCtx.root_ca_cert, sizeof(tlsCtx.client.cert), "%s", ctx->rootCa); - eXosip_set_tls_ctx(&tlsCtx); - } -#ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE - eXosip_tls_verify_certificate(ctx->verify_server_certs); -#endif -#ifdef HAVE_EXOSIP_TLS_VERIFY_CN - eXosip_tls_verify_cn(ctx->verify_server_cn); -#endif -} - -void sal_set_dscp(Sal *ctx, int dscp){ - ctx->dscp=dscp; -#ifdef HAVE_EXOSIP_DSCP - if (dscp!=-1) - eXosip_set_option(EXOSIP_OPT_SET_DSCP,&ctx->dscp); -#endif -} - -int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){ - int err; - bool_t ipv6; - int proto=IPPROTO_UDP; - int keepalive = ctx->keepalive_period; - - ctx->transport = tr; - switch (tr) { - case SalTransportUDP: - proto=IPPROTO_UDP; - eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive); - break; - case SalTransportTCP: - case SalTransportTLS: - proto= IPPROTO_TCP; - if (!ctx->tcp_tls_keepalive) keepalive=-1; - eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive); - set_tls_options(ctx); - break; - default: - ms_warning("unexpected proto, using datagram"); - } - /*see if it looks like an IPv6 address*/ - int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment - eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports); - int dont_use_101 = !ctx->use_101; // Copy char to int to avoid bad alignment - eXosip_set_option(EXOSIP_OPT_DONT_SEND_101,&dont_use_101); - sal_set_dscp(ctx,ctx->dscp); - sal_use_dates(ctx,ctx->add_dates); - - ipv6=strchr(addr,':')!=NULL; - eXosip_enable_ipv6(ipv6); - - if (is_secure && tr == SalTransportUDP){ - ms_fatal("SIP over DTLS is not supported yet."); - return -1; - } - err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, is_secure); - ctx->running=TRUE; - return err; -} - -ortp_socket_t sal_get_socket(Sal *ctx){ -#ifdef HAVE_EXOSIP_GET_SOCKET - return eXosip_get_socket(IPPROTO_UDP); -#else - ms_warning("Sorry, eXosip does not have eXosip_get_socket() method"); - return -1; -#endif -} - -void sal_set_user_agent(Sal *ctx, const char *user_agent){ - eXosip_set_user_agent(user_agent); -} - -void sal_use_session_timers(Sal *ctx, int expires){ - ctx->session_expires=expires; -} - -void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec){ - ctx->one_matching_codec=one_matching_codec; -} - -MSList *sal_get_pending_auths(Sal *sal){ - return ms_list_copy(sal->pending_auths); -} - -void sal_use_double_registrations(Sal *ctx, bool_t enabled){ - ctx->double_reg=enabled; -} - -void sal_expire_old_registration_contacts(Sal *ctx, bool_t enabled){ - ctx->expire_old_contact=enabled; -} - -void sal_use_dates(Sal *ctx, bool_t enabled){ - ctx->add_dates=enabled; -#ifdef EXOSIP_OPT_REGISTER_WITH_DATE - { - int tmp=enabled; - eXosip_set_option(EXOSIP_OPT_REGISTER_WITH_DATE,&tmp); - } -#else - if (enabled) ms_warning("Exosip does not support EXOSIP_OPT_REGISTER_WITH_DATE option."); -#endif -} - -void sal_use_rport(Sal *ctx, bool_t use_rports){ - ctx->use_rports=use_rports; -} -void sal_use_101(Sal *ctx, bool_t use_101){ - ctx->use_101=use_101; -} - -void sal_set_root_ca(Sal* ctx, const char* rootCa) { - if (ctx->rootCa) - ms_free(ctx->rootCa); - ctx->rootCa = ms_strdup(rootCa); - set_tls_options(ctx); -} - -const char *sal_get_root_ca(Sal* ctx) { - return ctx->rootCa; -} - -void sal_verify_server_certificates(Sal *ctx, bool_t verify){ - ctx->verify_server_certs=verify; -#ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE - eXosip_tls_verify_certificate(verify); -#endif -} - -void sal_verify_server_cn(Sal *ctx, bool_t verify){ - ctx->verify_server_cn=verify; -#ifdef HAVE_EXOSIP_TLS_VERIFY_CN - eXosip_tls_verify_cn(verify); -#endif -} - -static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval,SalTransport* transport){ - osip_via_t *via=NULL; - osip_generic_param_t *param=NULL; - const char *rport=NULL; - - *rportval=5060; - *received=NULL; - osip_message_get_via(msg,0,&via); - if (!via) { - ms_warning("extract_received_rport(): no via."); - return -1; - } - - *transport = sal_transport_parse(via->protocol); - - if (via->port && via->port[0]!='\0') - *rportval=atoi(via->port); - - osip_via_param_get_byname(via,"rport",¶m); - if (param) { - rport=param->gvalue; - if (rport && rport[0]!='\0') *rportval=atoi(rport); - *received=via->host; - } - param=NULL; - osip_via_param_get_byname(via,"received",¶m); - if (param) *received=param->gvalue; - - if (rport==NULL && *received==NULL){ - ms_warning("extract_received_rport(): no rport and no received parameters."); - return -1; - } - return 0; -} - -static void set_sdp(osip_message_t *sip,sdp_message_t *msg){ - int sdplen; - char clen[10]; - char *sdp=NULL; - sdp_message_to_str(msg,&sdp); - sdplen=strlen(sdp); - snprintf(clen,sizeof(clen),"%i",sdplen); - osip_message_set_body(sip,sdp,sdplen); - osip_message_set_content_type(sip,"application/sdp"); - osip_message_set_content_length(sip,clen); - osip_free(sdp); -} - -static void set_sdp_from_desc(osip_message_t *sip, const SalMediaDescription *desc){ - sdp_message_t *msg=media_description_to_sdp(desc); - if (msg==NULL) { - ms_error("Fail to print sdp message !"); - return; - } - set_sdp(sip,msg); - sdp_message_free(msg); -} - -static void sdp_process(SalOp *h){ - ms_message("Doing SDP offer/answer process of type %s",h->sdp_offering ? "outgoing" : "incoming"); - if (h->result){ - sal_media_description_unref(h->result); - } - h->result=sal_media_description_new(); - if (h->sdp_offering){ - offer_answer_initiate_outgoing(h->base.local_media,h->base.remote_media,h->result); - }else{ - int i; - if (h->sdp_answer){ - sdp_message_free(h->sdp_answer); - } - offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec); - h->sdp_answer=media_description_to_sdp(h->result); - /*once we have generated the SDP answer, we modify the result description for processing by the upper layer. - It should contains media parameters constraint from the remote offer, not our response*/ - strcpy(h->result->addr,h->base.remote_media->addr); - h->result->bandwidth=h->base.remote_media->bandwidth; - - for(i=0;iresult->n_active_streams;++i){ - strcpy(h->result->streams[i].rtp_addr,h->base.remote_media->streams[i].rtp_addr); - strcpy(h->result->streams[i].rtcp_addr,h->base.remote_media->streams[i].rtcp_addr); - h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime; - h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth; - h->result->streams[i].rtp_port=h->base.remote_media->streams[i].rtp_port; - h->result->streams[i].rtcp_port=h->base.remote_media->streams[i].rtcp_port; - if (h->result->streams[i].proto == SalProtoRtpSavp) { - h->result->streams[i].crypto[0] = h->base.remote_media->streams[i].crypto[0]; - } - } - } - -} - -int sal_call_is_offerer(const SalOp *h){ - return h->sdp_offering; -} - -int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){ - if (desc) - sal_media_description_ref(desc); - if (h->base.local_media) - sal_media_description_unref(h->base.local_media); - h->base.local_media=desc; - if (h->base.remote_media){ - /*case of an incoming call where we modify the local capabilities between the time - * the call is ringing and it is accepted (for example if you want to accept without video*/ - /*reset the sdp answer so that it is computed again*/ - if (h->sdp_answer){ - sdp_message_free(h->sdp_answer); - h->sdp_answer=NULL; - } - } - return 0; -} - -int sal_call(SalOp *h, const char *from, const char *to){ - int err; - const char *route; - osip_message_t *invite=NULL; - osip_call_id_t *callid; - sal_op_set_from(h,from); - sal_op_set_to(h,to); - sal_exosip_fix_route(h); - - h->terminated = FALSE; - - route = sal_op_get_route(h); - err=eXosip_call_build_initial_invite(&invite,to,from,route,"Phone call"); - if (err!=0){ - ms_error("Could not create call. Error %d (from=%s to=%s route=%s)", - err, from, to, route); - return -1; - } - osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO"); - if (h->base.contact){ - _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free); - osip_message_set_contact(invite,h->base.contact); - } - if (h->base.root->session_expires!=0){ - osip_message_set_header(invite, "Session-expires", "200"); - osip_message_set_supported(invite, "timer"); - } - if (h->base.local_media){ - h->sdp_offering=TRUE; - set_sdp_from_desc(invite,h->base.local_media); - }else h->sdp_offering=FALSE; - if (h->replaces){ - osip_message_set_header(invite,"Replaces",h->replaces); - if (h->referred_by) - osip_message_set_header(invite,"Referred-By",h->referred_by); - } - - eXosip_lock(); - err=eXosip_call_send_initial_invite(invite); - eXosip_unlock(); - h->cid=err; - if (err<0){ - ms_error("Fail to send invite ! Error code %d", err); - return -1; - }else{ - char *tmp=NULL; - callid=osip_message_get_call_id(invite); - osip_call_id_to_str(callid,&tmp); - h->base.call_id=ms_strdup(tmp); - osip_free(tmp); - sal_add_call(h->base.root,h); - } - return 0; -} - -int sal_call_notify_ringing(SalOp *h, bool_t early_media){ - osip_message_t *msg; - - /*if early media send also 180 and 183 */ - if (early_media){ - msg=NULL; - eXosip_lock(); - eXosip_call_build_answer(h->tid,183,&msg); - if (msg){ - sdp_process(h); - if (h->sdp_answer){ - set_sdp(msg,h->sdp_answer); - sdp_message_free(h->sdp_answer); - h->sdp_answer=NULL; - } - eXosip_call_send_answer(h->tid,183,msg); - } - eXosip_unlock(); - }else{ - eXosip_lock(); - eXosip_call_send_answer(h->tid,180,NULL); - eXosip_unlock(); - } - return 0; -} - -int sal_call_accept(SalOp * h){ - osip_message_t *msg; - const char *contact=sal_op_get_contact(h); - /* sends a 200 OK */ - int err=eXosip_call_build_answer(h->tid,200,&msg); - if (err<0 || msg==NULL){ - ms_error("Fail to build answer for call: err=%i",err); - return -1; - } - if (h->base.root->session_expires!=0){ - if (h->supports_session_timers) osip_message_set_supported(msg, "timer"); - } - - if (contact) { - _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free); - osip_message_set_contact(msg,contact); - } - - if (h->base.local_media){ - /*this is the case where we received an invite without SDP*/ - if (h->sdp_offering) { - set_sdp_from_desc(msg,h->base.local_media); - }else{ - if (h->sdp_answer==NULL) sdp_process(h); - if (h->sdp_answer){ - set_sdp(msg,h->sdp_answer); - sdp_message_free(h->sdp_answer); - h->sdp_answer=NULL; - } - } - }else{ - ms_error("You are accepting a call but not defined any media capabilities !"); - } - eXosip_call_send_answer(h->tid,200,msg); - return 0; -} - -int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){ - if (reason==SalReasonBusy){ - eXosip_lock(); - eXosip_call_send_answer(h->tid,486,NULL); - eXosip_unlock(); - } - else if (reason==SalReasonTemporarilyUnavailable){ - eXosip_lock(); - eXosip_call_send_answer(h->tid,480,NULL); - eXosip_unlock(); - }else if (reason==SalReasonDoNotDisturb){ - eXosip_lock(); - eXosip_call_send_answer(h->tid,600,NULL); - eXosip_unlock(); - }else if (reason==SalReasonMedia){ - eXosip_lock(); - eXosip_call_send_answer(h->tid,415,NULL); - eXosip_unlock(); - }else if (redirect!=NULL && reason==SalReasonRedirect){ - osip_message_t *msg; - int code; - if (strstr(redirect,"sip:")!=0) code=302; - else code=380; - eXosip_lock(); - eXosip_call_build_answer(h->tid,code,&msg); - osip_message_set_contact(msg,redirect); - eXosip_call_send_answer(h->tid,code,msg); - eXosip_unlock(); - }else sal_call_terminate(h); - return 0; -} - -SalMediaDescription * sal_call_get_remote_media_description(SalOp *h){ - return h->base.remote_media; -} - -SalMediaDescription * sal_call_get_final_media_description(SalOp *h){ - if (h->base.local_media && h->base.remote_media && !h->result){ - sdp_process(h); - } - return h->result; -} - -int sal_call_set_referer(SalOp *h, SalOp *refered_call){ - if (refered_call->replaces) - h->replaces=ms_strdup(refered_call->replaces); - if (refered_call->referred_by) - h->referred_by=ms_strdup(refered_call->referred_by); - return 0; -} - -static int send_notify_for_refer(int did, const char *sipfrag){ - osip_message_t *msg; - eXosip_lock(); - eXosip_call_build_notify(did,EXOSIP_SUBCRSTATE_ACTIVE,&msg); - if (msg==NULL){ - eXosip_unlock(); - ms_warning("Could not build NOTIFY for refer."); - return -1; - } - osip_message_set_content_type(msg,"message/sipfrag"); - osip_message_set_header(msg,"Event","refer"); - osip_message_set_body(msg,sipfrag,strlen(sipfrag)); - eXosip_call_send_request(did,msg); - eXosip_unlock(); - return 0; -} - -/* currently only support to notify trying and 200Ok*/ -int sal_call_notify_refer_state(SalOp *h, SalOp *newcall){ - if (newcall==NULL){ - /* in progress*/ - send_notify_for_refer(h->did,"SIP/2.0 100 Trying\r\n"); - } - else if (newcall->cid!=-1){ - if (newcall->did==-1){ - /* not yet established*/ - if (!newcall->terminated){ - /* in progress*/ - send_notify_for_refer(h->did,"SIP/2.0 100 Trying\r\n"); - } - }else{ - if (!newcall->terminated){ - if (send_notify_for_refer(h->did,"SIP/2.0 200 Ok\r\n")==-1){ - /* we need previous notify transaction to complete, so buffer the request for later*/ - h->sipfrag_pending="SIP/2.0 200 Ok\r\n"; - } - } - } - } - return 0; -} - -int sal_ping(SalOp *op, const char *from, const char *to){ - osip_message_t *options=NULL; - - sal_op_set_from(op,from); - sal_op_set_to(op,to); - sal_exosip_fix_route(op); - - eXosip_options_build_request (&options, sal_op_get_to(op), - sal_op_get_from(op),sal_op_get_route(op)); - if (options){ - if (op->base.root->session_expires!=0){ - osip_message_set_header(options, "Session-expires", "200"); - osip_message_set_supported(options, "timer"); - } - sal_add_other(sal_op_get_sal(op),op,options); - return eXosip_options_send_request(options); - } - return -1; -} - -int sal_call_refer(SalOp *h, const char *refer_to){ - osip_message_t *msg=NULL; - int err=0; - eXosip_lock(); - eXosip_call_build_refer(h->did,refer_to, &msg); - if (msg) err=eXosip_call_send_request(h->did, msg); - else err=-1; - eXosip_unlock(); - return err; -} - -int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){ - osip_message_t *msg=NULL; - char referto[256]={0}; - int err=0; - eXosip_lock(); - if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){ - ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did); - eXosip_unlock(); - return -1; - } - eXosip_call_build_refer(h->did,referto, &msg); - osip_message_set_header(msg,"Referred-By",h->base.from); - if (msg) err=eXosip_call_send_request(h->did, msg); - else err=-1; - eXosip_unlock(); - return err; -} - -SalOp *sal_call_get_replaces(SalOp *h){ - if (h!=NULL && h->replaces!=NULL){ - int cid; - eXosip_lock(); - cid=eXosip_call_find_by_replaces(h->replaces); - eXosip_unlock(); - if (cid>0){ - SalOp *ret=sal_find_call(h->base.root,cid); - return ret; - } - } - return NULL; -} - -int sal_call_send_dtmf(SalOp *h, char dtmf){ - osip_message_t *msg=NULL; - char dtmf_body[128]; - char clen[10]; - - eXosip_lock(); - eXosip_call_build_info(h->did,&msg); - if (msg){ - snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf); - osip_message_set_body(msg,dtmf_body,strlen(dtmf_body)); - osip_message_set_content_type(msg,"application/dtmf-relay"); - snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body)); - osip_message_set_content_length(msg,clen); - eXosip_call_send_request(h->did,msg); - } - eXosip_unlock(); - return 0; -} - -static void push_auth_to_exosip(const SalAuthInfo *info){ - const char *userid; - if (info->userid==NULL || info->userid[0]=='\0') userid=info->username; - else userid=info->userid; - ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm); - eXosip_add_authentication_info (info->username,userid, - info->password, NULL,info->realm); -} -/* - * Just for symmetry ;-) - */ -static void pop_auth_from_exosip() { - eXosip_clear_authentication_info(); -} - -int sal_call_terminate(SalOp *h){ - int err; - if (h == NULL) return -1; - if (h->auth_info) push_auth_to_exosip(h->auth_info); - eXosip_lock(); - err=eXosip_call_terminate(h->cid,h->did); - eXosip_unlock(); - if (!h->base.root->reuse_authorization) pop_auth_from_exosip(); - if (err!=0){ - ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did); - } - h->terminated=TRUE; - return 0; -} - -void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){ - bool_t terminating=FALSE; - if (h->pending_auth && strcmp(h->pending_auth->request->sip_method,"BYE")==0) { - terminating=TRUE; - } - if (h->terminated && !terminating) return; - - if (h->pending_auth){ - push_auth_to_exosip(info); - - /*FIXME exosip does not take into account this update register message*/ - /* - if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) { - - }; - */ - update_contact_from_response(h,h->pending_auth->response); - eXosip_lock(); - eXosip_default_action(h->pending_auth); - eXosip_unlock(); - ms_message("eXosip_default_action() done"); - if (!h->base.root->reuse_authorization) pop_auth_from_exosip(); - - if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/ - h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/ - } -} -void sal_op_cancel_authentication(SalOp *h) { - if (h->rid >0) { - sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,"Authentication failure"); - } else if (h->cid >0) { - sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,"Authentication failure",0); - } else { - ms_warning("Auth failure not handled"); - } - -} -static void set_network_origin(SalOp *op, osip_message_t *req){ - const char *received=NULL; - int rport=5060; - char origin[64]={0}; - SalTransport transport; - if (extract_received_rport(req,&received,&rport,&transport)!=0){ - osip_via_t *via=NULL; - char *tmp; - osip_message_get_via(req,0,&via); - received=osip_via_get_host(via); - tmp=osip_via_get_port(via); - if (tmp) rport=atoi(tmp); - } - if (transport != SalTransportUDP) { - snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport); - } else { - snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport)); - } - __sal_op_set_network_origin(op,origin); -} - -static void set_remote_ua(SalOp* op, osip_message_t *req){ - if (op->base.remote_ua==NULL){ - osip_header_t *h=NULL; - osip_message_get_user_agent(req,0,&h); - if (h){ - op->base.remote_ua=ms_strdup(h->hvalue); - } - } -} - -static void set_remote_contact(SalOp* op, osip_message_t *req){ - if (op->base.remote_contact==NULL){ - osip_contact_t *h=NULL; - osip_message_get_contact(req,0,&h); - if (h){ - char *tmp=NULL; - osip_contact_to_str(h,&tmp); - __sal_op_set_remote_contact(op,tmp); - osip_free(tmp); - } - } -} - -static void set_replaces(SalOp *op, osip_message_t *req){ - osip_header_t *h=NULL; - - if (op->replaces){ - ms_free(op->replaces); - op->replaces=NULL; - } - osip_message_header_get_byname(req,"replaces",0,&h); - if (h){ - if (h->hvalue && h->hvalue[0]!='\0'){ - op->replaces=ms_strdup(h->hvalue); - } - } -} - -static SalOp *find_op(Sal *sal, eXosip_event_t *ev){ - if (ev->cid>0){ - return sal_find_call(sal,ev->cid); - } - if (ev->rid>0){ - return sal_find_register(sal,ev->rid); - } - if (ev->sid>0){ - return sal_find_out_subscribe(sal,ev->sid); - } - if (ev->nid>0){ - return sal_find_in_subscribe(sal,ev->nid); - } - if (ev->response) return sal_find_other(sal,ev->response); - else if (ev->request) return sal_find_other(sal,ev->request); - return NULL; -} - -static void inc_new_call(Sal *sal, eXosip_event_t *ev){ - SalOp *op=sal_op_new(sal); - osip_from_t *from,*to; - osip_call_info_t *call_info; - char *tmp=NULL; - sdp_message_t *sdp=eXosip_get_sdp_info(ev->request); - - osip_call_id_t *callid=osip_message_get_call_id(ev->request); - - osip_call_id_to_str(callid,&tmp); - op->base.call_id=ms_strdup(tmp); - osip_free(tmp); - - set_network_origin(op,ev->request); - set_remote_contact(op,ev->request); - set_remote_ua(op,ev->request); - set_replaces(op,ev->request); - - if (sdp){ - op->sdp_offering=FALSE; - op->base.remote_media=sal_media_description_new(); - sdp_to_media_description(sdp,op->base.remote_media); - sdp_message_free(sdp); - }else op->sdp_offering=TRUE; - - from=osip_message_get_from(ev->request); - to=osip_message_get_to(ev->request); - osip_from_to_str(from,&tmp); - sal_op_set_from(op,tmp); - osip_free(tmp); - osip_from_to_str(to,&tmp); - sal_op_set_to(op,tmp); - osip_free(tmp); - - osip_message_get_call_info(ev->request,0,&call_info); - if(call_info) - { - osip_call_info_to_str(call_info,&tmp); - if( strstr(tmp,"answer-after=") != NULL) - { - op->auto_answer_asked=TRUE; - ms_message("The caller asked to automatically answer the call(Emergency?)\n"); - } - osip_free(tmp); - } - - op->tid=ev->tid; - op->cid=ev->cid; - op->did=ev->did; - sal_add_call(op->base.root,op); - sal->callbacks.call_received(op); -} - -static void handle_reinvite(Sal *sal, eXosip_event_t *ev){ - SalOp *op=find_op(sal,ev); - sdp_message_t *sdp; - - if (op==NULL) { - ms_warning("Reinvite for non-existing operation !"); - return; - } - op->reinvite=TRUE; - op->tid=ev->tid; - sdp=eXosip_get_sdp_info(ev->request); - if (op->base.remote_media){ - sal_media_description_unref(op->base.remote_media); - op->base.remote_media=NULL; - } - if (op->result){ - sal_media_description_unref(op->result); - op->result=NULL; - } - if (sdp){ - op->sdp_offering=FALSE; - op->base.remote_media=sal_media_description_new(); - sdp_to_media_description(sdp,op->base.remote_media); - sdp_message_free(sdp); - - }else { - op->sdp_offering=TRUE; - } - sal->callbacks.call_updating(op); -} - -static void handle_ack(Sal *sal, eXosip_event_t *ev){ - SalOp *op=find_op(sal,ev); - sdp_message_t *sdp; - - if (op==NULL) { - ms_warning("ack for non-existing call !"); - return; - } - if (op->terminated) { - ms_warning("ack for terminated call, ignoring"); - return; - } - - if (op->sdp_offering){ - sdp=eXosip_get_sdp_info(ev->ack); - if (sdp){ - if (op->base.remote_media) - sal_media_description_unref(op->base.remote_media); - op->base.remote_media=sal_media_description_new(); - sdp_to_media_description(sdp,op->base.remote_media); - sdp_process(op); - sdp_message_free(sdp); - } - } - if (op->reinvite){ - op->reinvite=FALSE; - } - sal->callbacks.call_ack(op); -} - -static void update_contact_from_response(SalOp *op, osip_message_t *response){ - const char *received; - int rport; - SalTransport transport; - if (extract_received_rport(response,&received,&rport,&transport)==0){ - const char *contact=sal_op_get_contact(op); - if (!contact){ - /*no contact given yet, use from instead*/ - contact=sal_op_get_from(op); - } - if (contact){ - SalAddress *addr=sal_address_new(contact); - char *tmp; - sal_address_set_domain(addr,received); - sal_address_set_port_int(addr,rport); - if (transport!=SalTransportUDP) - sal_address_set_transport(addr,transport); - tmp=sal_address_as_string(addr); - ms_message("Contact address updated to %s",tmp); - sal_op_set_contact(op,tmp); - sal_address_destroy(addr); - ms_free(tmp); - } - } -} - -static int call_proceeding(Sal *sal, eXosip_event_t *ev){ - SalOp *op=find_op(sal,ev); - - if (op==NULL || op->terminated==TRUE) { - ms_warning("This call has been canceled."); - eXosip_lock(); - eXosip_call_terminate(ev->cid,ev->did); - eXosip_unlock(); - return -1; - } - if (ev->did>0) - op->did=ev->did; - op->tid=ev->tid; - - /* update contact if received and rport are set by the server - note: will only be used by remote for next INVITE, if any...*/ - update_contact_from_response(op,ev->response); - return 0; -} - -static void call_ringing(Sal *sal, eXosip_event_t *ev){ - sdp_message_t *sdp; - SalOp *op=find_op(sal,ev); - if (call_proceeding(sal, ev)==-1) return; - - set_remote_ua(op,ev->response); - sdp=eXosip_get_sdp_info(ev->response); - if (sdp){ - op->base.remote_media=sal_media_description_new(); - sdp_to_media_description(sdp,op->base.remote_media); - sdp_message_free(sdp); - if (op->base.local_media) sdp_process(op); - } - sal->callbacks.call_ringing(op); -} - -static void call_accepted(Sal *sal, eXosip_event_t *ev){ - sdp_message_t *sdp; - osip_message_t *msg=NULL; - SalOp *op=find_op(sal,ev); - const char *contact; - - if (op==NULL || op->terminated==TRUE) { - ms_warning("This call has been already terminated."); - eXosip_lock(); - eXosip_call_terminate(ev->cid,ev->did); - eXosip_unlock(); - return ; - } - - op->did=ev->did; - set_remote_ua(op,ev->response); - set_remote_contact(op,ev->response); - - sdp=eXosip_get_sdp_info(ev->response); - if (sdp){ - op->base.remote_media=sal_media_description_new(); - sdp_to_media_description(sdp,op->base.remote_media); - sdp_message_free(sdp); - if (op->base.local_media) sdp_process(op); - } - eXosip_call_build_ack(ev->did,&msg); - if (msg==NULL) { - ms_warning("This call has been already terminated."); - eXosip_lock(); - eXosip_call_terminate(ev->cid,ev->did); - eXosip_unlock(); - return ; - } - contact=sal_op_get_contact(op); - if (contact) { - _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free); - osip_message_set_contact(msg,contact); - } - if (op->sdp_answer){ - set_sdp(msg,op->sdp_answer); - sdp_message_free(op->sdp_answer); - op->sdp_answer=NULL; - } - eXosip_call_send_ack(ev->did,msg); - sal->callbacks.call_accepted(op); -} - -static void call_terminated(Sal *sal, eXosip_event_t *ev){ - char *from=NULL; - SalOp *op=find_op(sal,ev); - if (op==NULL){ - ms_warning("Call terminated for already closed call ?"); - return; - } - if (ev->request){ - osip_from_to_str(ev->request->from,&from); - } - sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op)); - if (from) osip_free(from); - op->terminated=TRUE; -} - -static void call_released(Sal *sal, eXosip_event_t *ev){ - SalOp *op=find_op(sal,ev); - if (op==NULL){ - ms_warning("No op associated to this call_released()"); - return; - } - if (!op->terminated){ - /* no response received so far */ - call_failure(sal,ev); - } - sal->callbacks.call_released(op); -} - -static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){ - const char *prx_realm=NULL,*www_realm=NULL; - osip_proxy_authenticate_t *prx_auth; - osip_www_authenticate_t *www_auth; - - *username=osip_uri_get_username(resp->from->url); - prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0); - www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0); - if (prx_auth!=NULL) - prx_realm=osip_proxy_authenticate_get_realm(prx_auth); - if (www_auth!=NULL) - www_realm=osip_www_authenticate_get_realm(www_auth); - - if (prx_realm){ - *realm=prx_realm; - }else if (www_realm){ - *realm=www_realm; - }else{ - return -1; - } - return 0; -} - -static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){ - osip_authorization_t *auth=NULL; - osip_proxy_authorization_t *prx_auth=NULL; - - *username=osip_uri_get_username(msg->from->url); - osip_message_get_authorization(msg, 0, &auth); - if (auth){ - *realm=osip_authorization_get_realm(auth); - return 0; - } - osip_message_get_proxy_authorization(msg,0,&prx_auth); - if (prx_auth){ - *realm=osip_proxy_authorization_get_realm(prx_auth); - return 0; - } - return -1; -} - -static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){ - if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0; - if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0; - return -1; -} - -int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){ - if (op->pending_auth){ - return get_auth_data(op->pending_auth,realm,username); - } - return -1; -} - -static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){ - SalOp *op; - const char *username,*realm; - op=find_op(sal,ev); - if (op==NULL){ - ms_warning("No operation associated with this authentication !"); - return TRUE; - } - if (get_auth_data(ev,&realm,&username)==0){ - if (op->pending_auth!=NULL){ - eXosip_event_free(op->pending_auth); - op->pending_auth=ev; - }else{ - op->pending_auth=ev; - sal_add_pending_auth(sal,op); - } - - sal->callbacks.auth_requested(op,realm,username); - return FALSE; - } - return TRUE; -} - -static void authentication_ok(Sal *sal, eXosip_event_t *ev){ - SalOp *op; - const char *username,*realm; - op=find_op(sal,ev); - if (op==NULL){ - ms_warning("No operation associated with this authentication_ok!"); - return ; - } - if (op->pending_auth){ - eXosip_event_free(op->pending_auth); - sal_remove_pending_auth(sal,op); - op->pending_auth=NULL; - } - if (get_auth_data(ev,&realm,&username)==0){ - sal->callbacks.auth_success(op,realm,username); - } -} - -static bool_t call_failure(Sal *sal, eXosip_event_t *ev){ - SalOp *op; - int code=0; - char* computedReason=NULL; - const char *reason=NULL; - SalError error=SalErrorUnknown; - SalReason sr=SalReasonUnknown; - - - op=(SalOp*)find_op(sal,ev); - - if (op==NULL) { - ms_warning("Call failure reported for a closed call, ignored."); - return TRUE; - } - - if (ev->response){ - code=osip_message_get_status_code(ev->response); - reason=osip_message_get_reason_phrase(ev->response); - osip_header_t *h=NULL; - if (!osip_message_header_get_byname( ev->response - ,"Reason" - ,0 - ,&h)) { - computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h)); - reason = computedReason; - - } - } - switch(code) - { - case 401: - case 407: - return process_authentication(sal,ev); - break; - case 400: - error=SalErrorUnknown; - break; - case 404: - error=SalErrorFailure; - sr=SalReasonNotFound; - break; - case 415: - error=SalErrorFailure; - sr=SalReasonMedia; - break; - case 422: - eXosip_default_action(ev); - return TRUE; - break; - case 480: - error=SalErrorFailure; - sr=SalReasonTemporarilyUnavailable; - case 486: - error=SalErrorFailure; - sr=SalReasonBusy; - break; - case 487: - break; - case 600: - error=SalErrorFailure; - sr=SalReasonDoNotDisturb; - break; - case 603: - error=SalErrorFailure; - sr=SalReasonDeclined; - break; - default: - if (code>0){ - error=SalErrorFailure; - sr=SalReasonUnknown; - }else error=SalErrorNoResponse; - } - op->terminated=TRUE; - sal->callbacks.call_failure(op,error,sr,reason,code); - if (computedReason != NULL){ - ms_free(computedReason); - } - return TRUE; -} - -/* Request remote side to send us VFU */ -void sal_call_send_vfu_request(SalOp *h){ - osip_message_t *msg=NULL; - char info_body[] = - "" - "" - " " - " " - " " - " " - " " - ""; - - char clen[10]; - - eXosip_lock(); - eXosip_call_build_info(h->did,&msg); - if (msg){ - osip_message_set_body(msg,info_body,strlen(info_body)); - osip_message_set_content_type(msg,"application/media_control+xml"); - snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body)); - osip_message_set_content_length(msg,clen); - eXosip_call_send_request(h->did,msg); - ms_message("Sending VFU request !"); - } - eXosip_unlock(); -} - -static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){ - SalOp *op=find_op(sal,ev); - osip_body_t *body=NULL; - - if (op==NULL){ - ms_warning("media control xml received without operation context!"); - return ; - } - - osip_message_get_body(ev->request,0,&body); - if (body && body->body!=NULL && - strstr(body->body,"picture_fast_update")){ - osip_message_t *ans=NULL; - ms_message("Receiving VFU request !"); - if (sal->callbacks.vfu_request){ - sal->callbacks.vfu_request(op); - eXosip_call_build_answer(ev->tid,200,&ans); - if (ans) - eXosip_call_send_answer(ev->tid,200,ans); - return; - } - } - /*in all other cases we must say it is not implemented.*/ - { - osip_message_t *ans=NULL; - eXosip_lock(); - eXosip_call_build_answer(ev->tid,501,&ans); - if (ans) - eXosip_call_send_answer(ev->tid,501,ans); - eXosip_unlock(); - } -} - -static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){ - SalOp *op=find_op(sal,ev); - osip_body_t *body=NULL; - - if (op==NULL){ - ms_warning("media dtmf relay received without operation context!"); - return ; - } - - osip_message_get_body(ev->request,0,&body); - if (body && body->body!=NULL){ - osip_message_t *ans=NULL; - const char *name=strstr(body->body,"Signal"); - if (name==NULL) name=strstr(body->body,"signal"); - if (name==NULL) { - ms_warning("Could not extract the dtmf name from the SIP INFO."); - }else{ - char tmp[2]; - name+=strlen("signal"); - if (sscanf(name," = %1s",tmp)==1){ - ms_message("Receiving dtmf %s via SIP INFO.",tmp); - if (sal->callbacks.dtmf_received != NULL) - sal->callbacks.dtmf_received(op, tmp[0]); - } - } - eXosip_lock(); - eXosip_call_build_answer(ev->tid,200,&ans); - if (ans) - eXosip_call_send_answer(ev->tid,200,ans); - eXosip_unlock(); - } -} - -static void fill_options_answer(osip_message_t *options){ - osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO"); - osip_message_set_accept(options,"application/sdp"); -} - -static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){ - osip_header_t *h=NULL; - osip_message_t *ans=NULL; - ms_message("Receiving REFER request !"); - osip_message_header_get_byname(ev->request,"Refer-To",0,&h); - - if (h){ - osip_from_t *from=NULL; - char *tmp; - osip_from_init(&from); - - if (osip_from_parse(from,h->hvalue)==0){ - if (op ){ - osip_uri_header_t *uh=NULL; - osip_header_t *referred_by=NULL; - osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh); - if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){ - ms_message("Found replaces in Refer-To"); - if (op->replaces){ - ms_free(op->replaces); - } - op->replaces=ms_strdup(uh->gvalue); - } - osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by); - if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){ - if (op->referred_by) - ms_free(op->referred_by); - op->referred_by=ms_strdup(referred_by->hvalue); - } - } - osip_uri_header_freelist(&from->url->url_headers); - osip_from_to_str(from,&tmp); - sal->callbacks.refer_received(sal,op,tmp); - osip_free(tmp); - osip_from_free(from); - } - eXosip_lock(); - eXosip_call_build_answer(ev->tid,202,&ans); - if (ans) - eXosip_call_send_answer(ev->tid,202,ans); - eXosip_unlock(); - } - else - { - ms_warning("cannot do anything with the refer without destination\n"); - } -} - -static void process_notify(Sal *sal, eXosip_event_t *ev){ - osip_header_t *h=NULL; - char *from=NULL; - SalOp *op=find_op(sal,ev); - osip_message_t *ans=NULL; - - ms_message("Receiving NOTIFY request !"); - osip_from_to_str(ev->request->from,&from); - osip_message_header_get_byname(ev->request,"Event",0,&h); - if(h){ - osip_body_t *body=NULL; - //osip_content_type_t *ct=NULL; - osip_message_get_body(ev->request,0,&body); - //ct=osip_message_get_content_type(ev->request); - if (h->hvalue && strcasecmp(h->hvalue,"refer")==0){ - /*special handling of refer events*/ - if (body && body->body){ - osip_message_t *msg; - osip_message_init(&msg); - if (osip_message_parse_sipfrag(msg,body->body,strlen(body->body))==0){ - int code=osip_message_get_status_code(msg); - if (code==100){ - sal->callbacks.notify_refer(op,SalReferTrying); - }else if (code==200){ - sal->callbacks.notify_refer(op,SalReferSuccess); - }else if (code>=400){ - sal->callbacks.notify_refer(op,SalReferFailed); - } - } - osip_message_free(msg); - } - }else{ - /*generic handling*/ - sal->callbacks.notify(op,from,h->hvalue); - } - } - /*answer that we received the notify*/ - eXosip_lock(); - eXosip_call_build_answer(ev->tid,200,&ans); - if (ans) - eXosip_call_send_answer(ev->tid,200,ans); - eXosip_unlock(); - osip_free(from); -} - -static void call_message_new(Sal *sal, eXosip_event_t *ev){ - osip_message_t *ans=NULL; - if (ev->request){ - if (MSG_IS_INFO(ev->request)){ - osip_content_type_t *ct; - ct=osip_message_get_content_type(ev->request); - if (ct && ct->subtype){ - if (strcmp(ct->subtype,"media_control+xml")==0) - process_media_control_xml(sal,ev); - else if (strcmp(ct->subtype,"dtmf-relay")==0) - process_dtmf_relay(sal,ev); - else { - ms_message("Unhandled SIP INFO."); - /*send an "Not implemented" answer*/ - eXosip_lock(); - eXosip_call_build_answer(ev->tid,501,&ans); - if (ans) - eXosip_call_send_answer(ev->tid,501,ans); - eXosip_unlock(); - } - }else{ - /*empty SIP INFO, probably to test we are alive. Send an empty answer*/ - eXosip_lock(); - eXosip_call_build_answer(ev->tid,200,&ans); - if (ans) - eXosip_call_send_answer(ev->tid,200,ans); - eXosip_unlock(); - } - }else if(MSG_IS_MESSAGE(ev->request)){ - /* SIP messages could be received into call */ - text_received(sal, ev); - eXosip_lock(); - eXosip_call_build_answer(ev->tid,200,&ans); - if (ans) - eXosip_call_send_answer(ev->tid,200,ans); - eXosip_unlock(); - }else if(MSG_IS_REFER(ev->request)){ - SalOp *op=find_op(sal,ev); - - ms_message("Receiving REFER request !"); - process_refer(sal,op,ev); - }else if(MSG_IS_NOTIFY(ev->request)){ - process_notify(sal,ev); - }else if (MSG_IS_OPTIONS(ev->request)){ - eXosip_lock(); - eXosip_call_build_answer(ev->tid,200,&ans); - if (ans){ - fill_options_answer(ans); - eXosip_call_send_answer(ev->tid,200,ans); - } - eXosip_unlock(); - } - }else ms_warning("call_message_new: No request ?"); -} - -static void inc_update(Sal *sal, eXosip_event_t *ev){ - osip_message_t *msg=NULL; - ms_message("Processing incoming UPDATE"); - eXosip_lock(); - eXosip_message_build_answer(ev->tid,200,&msg); - if (msg!=NULL) - eXosip_message_send_answer(ev->tid,200,msg); - eXosip_unlock(); -} - -static bool_t comes_from_local_if(osip_message_t *msg){ - osip_via_t *via=NULL; - osip_message_get_via(msg,0,&via); - if (via){ - const char *host; - host=osip_via_get_host(via); - if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){ - osip_generic_param_t *param=NULL; - osip_via_param_get_byname(via,"received",¶m); - if (param==NULL) return TRUE; - if (param->gvalue && - (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){ - return TRUE; - } - } - } - return FALSE; -} - +/* +linphone +Copyright (C) 2010 Simon MORLAT (simon.morlat@free.fr) + +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. +*/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "sal_eXosip2.h" +#include "offeranswer.h" + +#ifdef ANDROID +// Necessary to make it linked +static void for_linker() { eXosip_transport_hook_register(NULL); } +#endif +static bool_t call_failure(Sal *sal, eXosip_event_t *ev); + +static void text_received(Sal *sal, eXosip_event_t *ev); + +static void masquerade_via(osip_message_t *msg, const char *ip, const char *port); +static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer, bool_t expire_last_contact); +static void update_contact_from_response(SalOp *op, osip_message_t *response); + + +void _osip_list_set_empty(osip_list_t *l, void (*freefunc)(void*)){ + void *data; + while(!osip_list_eol(l,0)) { + data=osip_list_get(l,0); + osip_list_remove(l,0); + if (data) freefunc(data); + } +} + +void sal_get_default_local_ip(Sal *sal, int address_family,char *ip, size_t iplen){ + if (eXosip_guess_localip(address_family,ip,iplen)<0){ + /*default to something */ + strncpy(ip,address_family==AF_INET6 ? "::1" : "127.0.0.1",iplen); + ms_error("Could not find default routable ip address !"); + } +} + +static SalOp * sal_find_call(Sal *sal, int cid){ + const MSList *elem; + SalOp *op; + for(elem=sal->calls;elem!=NULL;elem=elem->next){ + op=(SalOp*)elem->data; + if (op->cid==cid) return op; + } + return NULL; +} + +static void sal_add_call(Sal *sal, SalOp *op){ + sal->calls=ms_list_append(sal->calls,op); +} + +static void sal_remove_call(Sal *sal, SalOp *op){ + sal->calls=ms_list_remove(sal->calls, op); +} + +static SalOp * sal_find_register(Sal *sal, int rid){ + const MSList *elem; + SalOp *op; + for(elem=sal->registers;elem!=NULL;elem=elem->next){ + op=(SalOp*)elem->data; + if (op->rid==rid) return op; + } + return NULL; +} + +static void sal_add_register(Sal *sal, SalOp *op){ + sal->registers=ms_list_append(sal->registers,op); +} + +static void sal_remove_register(Sal *sal, int rid){ + MSList *elem; + SalOp *op; + for(elem=sal->registers;elem!=NULL;elem=elem->next){ + op=(SalOp*)elem->data; + if (op->rid==rid) { + sal->registers=ms_list_remove_link(sal->registers,elem); + return; + } + } +} + +static SalOp * sal_find_other(Sal *sal, osip_message_t *message){ + const MSList *elem; + SalOp *op; + osip_call_id_t *callid=osip_message_get_call_id(message); + if (callid==NULL) { + ms_error("There is no call-id in this message !"); + return NULL; + } + for(elem=sal->other_transactions;elem!=NULL;elem=elem->next){ + op=(SalOp*)elem->data; + if (osip_call_id_match(callid,op->call_id)==0) return op; + } + return NULL; +} + +void sal_add_other(Sal *sal, SalOp *op, osip_message_t *request){ + osip_call_id_t *callid=osip_message_get_call_id(request); + if (callid==NULL) { + ms_error("There is no call id in the request !"); + return; + } + osip_call_id_clone(callid,&op->call_id); + sal->other_transactions=ms_list_append(sal->other_transactions,op); +} + +static void sal_remove_other(Sal *sal, SalOp *op){ + sal->other_transactions=ms_list_remove(sal->other_transactions,op); +} + + +static void sal_add_pending_auth(Sal *sal, SalOp *op){ + sal->pending_auths=ms_list_append(sal->pending_auths,op); +} + + +static void sal_remove_pending_auth(Sal *sal, SalOp *op){ + sal->pending_auths=ms_list_remove(sal->pending_auths,op); +} + +void sal_exosip_fix_route(SalOp *op){ + if (sal_op_get_route(op)!=NULL){ + osip_route_t *rt=NULL; + osip_uri_param_t *lr_param=NULL; + + osip_route_init(&rt); + if (osip_route_parse(rt,sal_op_get_route(op))<0){ + ms_warning("Bad route %s!",sal_op_get_route(op)); + sal_op_set_route(op,NULL); + }else{ + /* check if the lr parameter is set , if not add it */ + osip_uri_uparam_get_byname(rt->url, "lr", &lr_param); + if (lr_param==NULL){ + char *tmproute; + osip_uri_uparam_add(rt->url,osip_strdup("lr"),NULL); + osip_route_to_str(rt,&tmproute); + sal_op_set_route(op,tmproute); + osip_free(tmproute); + } + } + osip_route_free(rt); + } +} + +SalOp * sal_op_new(Sal *sal){ + SalOp *op=ms_new0(SalOp,1); + __sal_op_init(op,sal); + op->cid=op->did=op->tid=op->rid=op->nid=op->sid=-1; + op->result=NULL; + op->supports_session_timers=FALSE; + op->sdp_offering=TRUE; + op->pending_auth=NULL; + op->sdp_answer=NULL; + op->reinvite=FALSE; + op->call_id=NULL; + op->replaces=NULL; + op->referred_by=NULL; + op->masquerade_via=FALSE; + op->auto_answer_asked=FALSE; + op->auth_info=NULL; + op->terminated=FALSE; + return op; +} + +bool_t sal_call_autoanswer_asked(SalOp *op) +{ + return op->auto_answer_asked; +} + +void sal_op_release(SalOp *op){ + if (op->sdp_answer) + sdp_message_free(op->sdp_answer); + if (op->pending_auth) + eXosip_event_free(op->pending_auth); + if (op->rid!=-1){ + sal_remove_register(op->base.root,op->rid); + eXosip_register_remove(op->rid); + } + if (op->cid!=-1){ + ms_message("Cleaning cid %i",op->cid); + sal_remove_call(op->base.root,op); + } + if (op->sid!=-1){ + sal_remove_out_subscribe(op->base.root,op); + } + if (op->nid!=-1){ + sal_remove_in_subscribe(op->base.root,op); + if (op->call_id) + osip_call_id_free(op->call_id); + op->call_id=NULL; + } + if (op->pending_auth){ + sal_remove_pending_auth(op->base.root,op); + } + if (op->result) + sal_media_description_unref(op->result); + if (op->call_id){ + sal_remove_other(op->base.root,op); + osip_call_id_free(op->call_id); + } + if (op->replaces){ + ms_free(op->replaces); + } + if (op->referred_by){ + ms_free(op->referred_by); + } + if (op->auth_info) { + sal_auth_info_delete(op->auth_info); + } + __sal_op_free(op); +} + +static void _osip_trace_func(char *fi, int li, osip_trace_level_t level, char *chfr, va_list ap){ + int ortp_level=ORTP_DEBUG; + switch(level){ + case OSIP_INFO1: + case OSIP_INFO2: + case OSIP_INFO3: + case OSIP_INFO4: + ortp_level=ORTP_MESSAGE; + break; + case OSIP_WARNING: + ortp_level=ORTP_WARNING; + break; + case OSIP_ERROR: + case OSIP_BUG: + ortp_level=ORTP_ERROR; + break; + case OSIP_FATAL: + ortp_level=ORTP_FATAL; + break; + case END_TRACE_LEVEL: + break; + } + if (ortp_log_level_enabled(level)){ + int len=strlen(chfr); + char *chfrdup=ortp_strdup(chfr); + /*need to remove endline*/ + if (len>1){ + if (chfrdup[len-1]=='\n') + chfrdup[len-1]='\0'; + if (chfrdup[len-2]=='\r') + chfrdup[len-2]='\0'; + } + ortp_logv(ortp_level,chfrdup,ap); + ortp_free(chfrdup); + } +} + + +Sal * sal_init(){ + static bool_t firsttime=TRUE; + Sal *sal; + if (firsttime){ + osip_trace_initialize_func (OSIP_INFO4,&_osip_trace_func); + firsttime=FALSE; + } + eXosip_init(); + sal=ms_new0(Sal,1); + sal->keepalive_period=30; + sal->double_reg=TRUE; + sal->use_rports=TRUE; + sal->use_101=TRUE; + sal->reuse_authorization=FALSE; + sal->rootCa = 0; + sal->verify_server_certs=TRUE; + sal->verify_server_cn=TRUE; + sal->expire_old_contact=FALSE; + sal->add_dates=FALSE; + sal->dscp=-1; + return sal; +} + +void sal_uninit(Sal* sal){ + eXosip_quit(); + if (sal->rootCa) + ms_free(sal->rootCa); + ms_free(sal); +} + +void sal_set_user_pointer(Sal *sal, void *user_data){ + sal->up=user_data; +} + +void *sal_get_user_pointer(const Sal *sal){ + return sal->up; +} + +static void unimplemented_stub(){ + ms_warning("Unimplemented SAL callback"); +} + +void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){ + memcpy(&ctx->callbacks,cbs,sizeof(*cbs)); + if (ctx->callbacks.call_received==NULL) + ctx->callbacks.call_received=(SalOnCallReceived)unimplemented_stub; + if (ctx->callbacks.call_ringing==NULL) + ctx->callbacks.call_ringing=(SalOnCallRinging)unimplemented_stub; + if (ctx->callbacks.call_accepted==NULL) + ctx->callbacks.call_accepted=(SalOnCallAccepted)unimplemented_stub; + if (ctx->callbacks.call_failure==NULL) + ctx->callbacks.call_failure=(SalOnCallFailure)unimplemented_stub; + if (ctx->callbacks.call_terminated==NULL) + ctx->callbacks.call_terminated=(SalOnCallTerminated)unimplemented_stub; + if (ctx->callbacks.call_released==NULL) + ctx->callbacks.call_released=(SalOnCallReleased)unimplemented_stub; + if (ctx->callbacks.call_updating==NULL) + ctx->callbacks.call_updating=(SalOnCallUpdating)unimplemented_stub; + if (ctx->callbacks.auth_requested==NULL) + ctx->callbacks.auth_requested=(SalOnAuthRequested)unimplemented_stub; + if (ctx->callbacks.auth_success==NULL) + ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub; + if (ctx->callbacks.register_success==NULL) + ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub; + if (ctx->callbacks.register_failure==NULL) + ctx->callbacks.register_failure=(SalOnRegisterFailure)unimplemented_stub; + if (ctx->callbacks.dtmf_received==NULL) + ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub; + if (ctx->callbacks.notify==NULL) + ctx->callbacks.notify=(SalOnNotify)unimplemented_stub; + if (ctx->callbacks.notify_presence==NULL) + ctx->callbacks.notify_presence=(SalOnNotifyPresence)unimplemented_stub; + if (ctx->callbacks.subscribe_received==NULL) + ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub; + if (ctx->callbacks.text_received==NULL) + ctx->callbacks.text_received=(SalOnTextReceived)unimplemented_stub; + if (ctx->callbacks.ping_reply==NULL) + ctx->callbacks.ping_reply=(SalOnPingReply)unimplemented_stub; +} + +int sal_unlisten_ports(Sal *ctx){ + if (ctx->running){ + eXosip_quit(); + eXosip_init(); + ctx->running=FALSE; + } + return 0; +} + +int sal_reset_transports(Sal *ctx){ +#ifdef HAVE_EXOSIP_RESET_TRANSPORTS + if (ctx->running){ + ms_message("Exosip transports reset."); + eXosip_reset_transports(); + } + return 0; +#else + ms_warning("sal_reset_transports() not implemented in this version."); + return -1; +#endif +} + + +static void set_tls_options(Sal *ctx){ + if (ctx->rootCa) { + eXosip_tls_ctx_t tlsCtx; + memset(&tlsCtx, 0, sizeof(tlsCtx)); + snprintf(tlsCtx.root_ca_cert, sizeof(tlsCtx.client.cert), "%s", ctx->rootCa); + eXosip_set_tls_ctx(&tlsCtx); + } +#ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE + eXosip_tls_verify_certificate(ctx->verify_server_certs); +#endif +#ifdef HAVE_EXOSIP_TLS_VERIFY_CN + eXosip_tls_verify_cn(ctx->verify_server_cn); +#endif +} + +void sal_set_dscp(Sal *ctx, int dscp){ + ctx->dscp=dscp; +#ifdef HAVE_EXOSIP_DSCP + if (dscp!=-1) + eXosip_set_option(EXOSIP_OPT_SET_DSCP,&ctx->dscp); +#endif +} + +int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int is_secure){ + int err; + bool_t ipv6; + int proto=IPPROTO_UDP; + int keepalive = ctx->keepalive_period; + + ctx->transport = tr; + switch (tr) { + case SalTransportUDP: + proto=IPPROTO_UDP; + eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive); + break; + case SalTransportTCP: + case SalTransportTLS: + proto= IPPROTO_TCP; + if (!ctx->tcp_tls_keepalive) keepalive=-1; + eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE,&keepalive); + set_tls_options(ctx); + break; + default: + ms_warning("unexpected proto, using datagram"); + } + /*see if it looks like an IPv6 address*/ + int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment + eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports); + int dont_use_101 = !ctx->use_101; // Copy char to int to avoid bad alignment + eXosip_set_option(EXOSIP_OPT_DONT_SEND_101,&dont_use_101); + sal_set_dscp(ctx,ctx->dscp); + sal_use_dates(ctx,ctx->add_dates); + + ipv6=strchr(addr,':')!=NULL; + eXosip_enable_ipv6(ipv6); + + if (is_secure && tr == SalTransportUDP){ + ms_fatal("SIP over DTLS is not supported yet."); + return -1; + } + err=eXosip_listen_addr(proto, addr, port, ipv6 ? PF_INET6 : PF_INET, is_secure); + ctx->running=TRUE; + return err; +} + +ortp_socket_t sal_get_socket(Sal *ctx){ +#ifdef HAVE_EXOSIP_GET_SOCKET + return eXosip_get_socket(IPPROTO_UDP); +#else + ms_warning("Sorry, eXosip does not have eXosip_get_socket() method"); + return -1; +#endif +} + +void sal_set_user_agent(Sal *ctx, const char *user_agent){ + eXosip_set_user_agent(user_agent); +} + +void sal_use_session_timers(Sal *ctx, int expires){ + ctx->session_expires=expires; +} + +void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec){ + ctx->one_matching_codec=one_matching_codec; +} + +MSList *sal_get_pending_auths(Sal *sal){ + return ms_list_copy(sal->pending_auths); +} + +void sal_use_double_registrations(Sal *ctx, bool_t enabled){ + ctx->double_reg=enabled; +} + +void sal_expire_old_registration_contacts(Sal *ctx, bool_t enabled){ + ctx->expire_old_contact=enabled; +} + +void sal_use_dates(Sal *ctx, bool_t enabled){ + ctx->add_dates=enabled; +#ifdef EXOSIP_OPT_REGISTER_WITH_DATE + { + int tmp=enabled; + eXosip_set_option(EXOSIP_OPT_REGISTER_WITH_DATE,&tmp); + } +#else + if (enabled) ms_warning("Exosip does not support EXOSIP_OPT_REGISTER_WITH_DATE option."); +#endif +} + +void sal_use_rport(Sal *ctx, bool_t use_rports){ + ctx->use_rports=use_rports; +} +void sal_use_101(Sal *ctx, bool_t use_101){ + ctx->use_101=use_101; +} + +void sal_set_root_ca(Sal* ctx, const char* rootCa) { + if (ctx->rootCa) + ms_free(ctx->rootCa); + ctx->rootCa = ms_strdup(rootCa); + set_tls_options(ctx); +} + +const char *sal_get_root_ca(Sal* ctx) { + return ctx->rootCa; +} + +void sal_verify_server_certificates(Sal *ctx, bool_t verify){ + ctx->verify_server_certs=verify; +#ifdef HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE + eXosip_tls_verify_certificate(verify); +#endif +} + +void sal_verify_server_cn(Sal *ctx, bool_t verify){ + ctx->verify_server_cn=verify; +#ifdef HAVE_EXOSIP_TLS_VERIFY_CN + eXosip_tls_verify_cn(verify); +#endif +} + +static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval,SalTransport* transport){ + osip_via_t *via=NULL; + osip_generic_param_t *param=NULL; + const char *rport=NULL; + + *rportval=5060; + *received=NULL; + osip_message_get_via(msg,0,&via); + if (!via) { + ms_warning("extract_received_rport(): no via."); + return -1; + } + + *transport = sal_transport_parse(via->protocol); + + if (via->port && via->port[0]!='\0') + *rportval=atoi(via->port); + + osip_via_param_get_byname(via,"rport",¶m); + if (param) { + rport=param->gvalue; + if (rport && rport[0]!='\0') *rportval=atoi(rport); + *received=via->host; + } + param=NULL; + osip_via_param_get_byname(via,"received",¶m); + if (param) *received=param->gvalue; + + if (rport==NULL && *received==NULL){ + ms_warning("extract_received_rport(): no rport and no received parameters."); + return -1; + } + return 0; +} + +static void set_sdp(osip_message_t *sip,sdp_message_t *msg){ + int sdplen; + char clen[10]; + char *sdp=NULL; + sdp_message_to_str(msg,&sdp); + sdplen=strlen(sdp); + snprintf(clen,sizeof(clen),"%i",sdplen); + osip_message_set_body(sip,sdp,sdplen); + osip_message_set_content_type(sip,"application/sdp"); + osip_message_set_content_length(sip,clen); + osip_free(sdp); +} + +static void set_sdp_from_desc(osip_message_t *sip, const SalMediaDescription *desc){ + sdp_message_t *msg=media_description_to_sdp(desc); + if (msg==NULL) { + ms_error("Fail to print sdp message !"); + return; + } + set_sdp(sip,msg); + sdp_message_free(msg); +} + +static void sdp_process(SalOp *h){ + ms_message("Doing SDP offer/answer process of type %s",h->sdp_offering ? "outgoing" : "incoming"); + if (h->result){ + sal_media_description_unref(h->result); + } + h->result=sal_media_description_new(); + if (h->sdp_offering){ + offer_answer_initiate_outgoing(h->base.local_media,h->base.remote_media,h->result); + }else{ + int i; + if (h->sdp_answer){ + sdp_message_free(h->sdp_answer); + } + offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec); + h->sdp_answer=media_description_to_sdp(h->result); + /*once we have generated the SDP answer, we modify the result description for processing by the upper layer. + It should contains media parameters constraint from the remote offer, not our response*/ + strcpy(h->result->addr,h->base.remote_media->addr); + h->result->bandwidth=h->base.remote_media->bandwidth; + + for(i=0;iresult->n_active_streams;++i){ + strcpy(h->result->streams[i].rtp_addr,h->base.remote_media->streams[i].rtp_addr); + strcpy(h->result->streams[i].rtcp_addr,h->base.remote_media->streams[i].rtcp_addr); + h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime; + h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth; + h->result->streams[i].rtp_port=h->base.remote_media->streams[i].rtp_port; + h->result->streams[i].rtcp_port=h->base.remote_media->streams[i].rtcp_port; + if (h->result->streams[i].proto == SalProtoRtpSavp) { + h->result->streams[i].crypto[0] = h->base.remote_media->streams[i].crypto[0]; + } + } + } + +} + +int sal_call_is_offerer(const SalOp *h){ + return h->sdp_offering; +} + +int sal_call_set_local_media_description(SalOp *h, SalMediaDescription *desc){ + if (desc) + sal_media_description_ref(desc); + if (h->base.local_media) + sal_media_description_unref(h->base.local_media); + h->base.local_media=desc; + if (h->base.remote_media){ + /*case of an incoming call where we modify the local capabilities between the time + * the call is ringing and it is accepted (for example if you want to accept without video*/ + /*reset the sdp answer so that it is computed again*/ + if (h->sdp_answer){ + sdp_message_free(h->sdp_answer); + h->sdp_answer=NULL; + } + } + return 0; +} + +int sal_call(SalOp *h, const char *from, const char *to){ + int err; + const char *route; + osip_message_t *invite=NULL; + osip_call_id_t *callid; + sal_op_set_from(h,from); + sal_op_set_to(h,to); + sal_exosip_fix_route(h); + + h->terminated = FALSE; + + route = sal_op_get_route(h); + err=eXosip_call_build_initial_invite(&invite,to,from,route,"Phone call"); + if (err!=0){ + ms_error("Could not create call. Error %d (from=%s to=%s route=%s)", + err, from, to, route); + return -1; + } + osip_message_set_allow(invite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO"); + if (h->base.contact){ + _osip_list_set_empty(&invite->contacts,(void (*)(void*))osip_contact_free); + osip_message_set_contact(invite,h->base.contact); + } + if (h->base.root->session_expires!=0){ + osip_message_set_header(invite, "Session-expires", "200"); + osip_message_set_supported(invite, "timer"); + } + sal_exosip_add_custom_headers(invite,h->base.custom_headers); + if (h->base.local_media){ + h->sdp_offering=TRUE; + set_sdp_from_desc(invite,h->base.local_media); + }else h->sdp_offering=FALSE; + if (h->replaces){ + osip_message_set_header(invite,"Replaces",h->replaces); + if (h->referred_by) + osip_message_set_header(invite,"Referred-By",h->referred_by); + } + + eXosip_lock(); + err=eXosip_call_send_initial_invite(invite); + eXosip_unlock(); + h->cid=err; + if (err<0){ + ms_error("Fail to send invite ! Error code %d", err); + return -1; + }else{ + char *tmp=NULL; + callid=osip_message_get_call_id(invite); + osip_call_id_to_str(callid,&tmp); + h->base.call_id=ms_strdup(tmp); + osip_free(tmp); + sal_add_call(h->base.root,h); + } + return 0; +} + +int sal_call_notify_ringing(SalOp *h, bool_t early_media){ + osip_message_t *msg; + + /*if early media send also 180 and 183 */ + if (early_media){ + msg=NULL; + eXosip_lock(); + eXosip_call_build_answer(h->tid,183,&msg); + if (msg){ + sdp_process(h); + if (h->sdp_answer){ + set_sdp(msg,h->sdp_answer); + sdp_message_free(h->sdp_answer); + h->sdp_answer=NULL; + } + eXosip_call_send_answer(h->tid,183,msg); + } + eXosip_unlock(); + }else{ + eXosip_lock(); + eXosip_call_send_answer(h->tid,180,NULL); + eXosip_unlock(); + } + return 0; +} + +int sal_call_accept(SalOp * h){ + osip_message_t *msg; + const char *contact=sal_op_get_contact(h); + /* sends a 200 OK */ + int err=eXosip_call_build_answer(h->tid,200,&msg); + if (err<0 || msg==NULL){ + ms_error("Fail to build answer for call: err=%i",err); + return -1; + } + if (h->base.root->session_expires!=0){ + if (h->supports_session_timers) osip_message_set_supported(msg, "timer"); + } + + if (contact) { + _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free); + osip_message_set_contact(msg,contact); + } + + if (h->base.local_media){ + /*this is the case where we received an invite without SDP*/ + if (h->sdp_offering) { + set_sdp_from_desc(msg,h->base.local_media); + }else{ + if (h->sdp_answer==NULL) sdp_process(h); + if (h->sdp_answer){ + set_sdp(msg,h->sdp_answer); + sdp_message_free(h->sdp_answer); + h->sdp_answer=NULL; + } + } + }else{ + ms_error("You are accepting a call but not defined any media capabilities !"); + } + eXosip_call_send_answer(h->tid,200,msg); + return 0; +} + +int sal_call_decline(SalOp *h, SalReason reason, const char *redirect){ + if (reason==SalReasonBusy){ + eXosip_lock(); + eXosip_call_send_answer(h->tid,486,NULL); + eXosip_unlock(); + } + else if (reason==SalReasonTemporarilyUnavailable){ + eXosip_lock(); + eXosip_call_send_answer(h->tid,480,NULL); + eXosip_unlock(); + }else if (reason==SalReasonDoNotDisturb){ + eXosip_lock(); + eXosip_call_send_answer(h->tid,600,NULL); + eXosip_unlock(); + }else if (reason==SalReasonMedia){ + eXosip_lock(); + eXosip_call_send_answer(h->tid,415,NULL); + eXosip_unlock(); + }else if (redirect!=NULL && reason==SalReasonRedirect){ + osip_message_t *msg; + int code; + if (strstr(redirect,"sip:")!=0) code=302; + else code=380; + eXosip_lock(); + eXosip_call_build_answer(h->tid,code,&msg); + osip_message_set_contact(msg,redirect); + eXosip_call_send_answer(h->tid,code,msg); + eXosip_unlock(); + }else sal_call_terminate(h); + return 0; +} + +SalMediaDescription * sal_call_get_remote_media_description(SalOp *h){ + return h->base.remote_media; +} + +SalMediaDescription * sal_call_get_final_media_description(SalOp *h){ + if (h->base.local_media && h->base.remote_media && !h->result){ + sdp_process(h); + } + return h->result; +} + +int sal_call_set_referer(SalOp *h, SalOp *refered_call){ + if (refered_call->replaces) + h->replaces=ms_strdup(refered_call->replaces); + if (refered_call->referred_by) + h->referred_by=ms_strdup(refered_call->referred_by); + return 0; +} + +static int send_notify_for_refer(int did, const char *sipfrag){ + osip_message_t *msg; + eXosip_lock(); + eXosip_call_build_notify(did,EXOSIP_SUBCRSTATE_ACTIVE,&msg); + if (msg==NULL){ + eXosip_unlock(); + ms_warning("Could not build NOTIFY for refer."); + return -1; + } + osip_message_set_content_type(msg,"message/sipfrag"); + osip_message_set_header(msg,"Event","refer"); + osip_message_set_body(msg,sipfrag,strlen(sipfrag)); + eXosip_call_send_request(did,msg); + eXosip_unlock(); + return 0; +} + +/* currently only support to notify trying and 200Ok*/ +int sal_call_notify_refer_state(SalOp *h, SalOp *newcall){ + if (newcall==NULL){ + /* in progress*/ + send_notify_for_refer(h->did,"SIP/2.0 100 Trying\r\n"); + } + else if (newcall->cid!=-1){ + if (newcall->did==-1){ + /* not yet established*/ + if (!newcall->terminated){ + /* in progress*/ + send_notify_for_refer(h->did,"SIP/2.0 100 Trying\r\n"); + } + }else{ + if (!newcall->terminated){ + if (send_notify_for_refer(h->did,"SIP/2.0 200 Ok\r\n")==-1){ + /* we need previous notify transaction to complete, so buffer the request for later*/ + h->sipfrag_pending="SIP/2.0 200 Ok\r\n"; + } + } + } + } + return 0; +} + +int sal_ping(SalOp *op, const char *from, const char *to){ + osip_message_t *options=NULL; + + sal_op_set_from(op,from); + sal_op_set_to(op,to); + sal_exosip_fix_route(op); + + eXosip_options_build_request (&options, sal_op_get_to(op), + sal_op_get_from(op),sal_op_get_route(op)); + if (options){ + if (op->base.root->session_expires!=0){ + osip_message_set_header(options, "Session-expires", "200"); + osip_message_set_supported(options, "timer"); + } + sal_add_other(sal_op_get_sal(op),op,options); + return eXosip_options_send_request(options); + } + return -1; +} + +int sal_call_refer(SalOp *h, const char *refer_to){ + osip_message_t *msg=NULL; + int err=0; + eXosip_lock(); + eXosip_call_build_refer(h->did,refer_to, &msg); + if (msg) err=eXosip_call_send_request(h->did, msg); + else err=-1; + eXosip_unlock(); + return err; +} + +int sal_call_refer_with_replaces(SalOp *h, SalOp *other_call_h){ + osip_message_t *msg=NULL; + char referto[256]={0}; + int err=0; + eXosip_lock(); + if (eXosip_call_get_referto(other_call_h->did,referto,sizeof(referto)-1)!=0){ + ms_error("eXosip_call_get_referto() failed for did=%i",other_call_h->did); + eXosip_unlock(); + return -1; + } + eXosip_call_build_refer(h->did,referto, &msg); + osip_message_set_header(msg,"Referred-By",h->base.from); + if (msg) err=eXosip_call_send_request(h->did, msg); + else err=-1; + eXosip_unlock(); + return err; +} + +SalOp *sal_call_get_replaces(SalOp *h){ + if (h!=NULL && h->replaces!=NULL){ + int cid; + eXosip_lock(); + cid=eXosip_call_find_by_replaces(h->replaces); + eXosip_unlock(); + if (cid>0){ + SalOp *ret=sal_find_call(h->base.root,cid); + return ret; + } + } + return NULL; +} + +int sal_call_send_dtmf(SalOp *h, char dtmf){ + osip_message_t *msg=NULL; + char dtmf_body[128]; + char clen[10]; + + eXosip_lock(); + eXosip_call_build_info(h->did,&msg); + if (msg){ + snprintf(dtmf_body, sizeof(dtmf_body), "Signal=%c\r\nDuration=250\r\n", dtmf); + osip_message_set_body(msg,dtmf_body,strlen(dtmf_body)); + osip_message_set_content_type(msg,"application/dtmf-relay"); + snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(dtmf_body)); + osip_message_set_content_length(msg,clen); + eXosip_call_send_request(h->did,msg); + } + eXosip_unlock(); + return 0; +} + +static void push_auth_to_exosip(const SalAuthInfo *info){ + const char *userid; + if (info->userid==NULL || info->userid[0]=='\0') userid=info->username; + else userid=info->userid; + ms_message("Authentication info for username [%s], id[%s], realm [%s] added to eXosip", info->username,userid, info->realm); + eXosip_add_authentication_info (info->username,userid, + info->password, NULL,info->realm); +} +/* + * Just for symmetry ;-) + */ +static void pop_auth_from_exosip() { + eXosip_clear_authentication_info(); +} + +int sal_call_terminate(SalOp *h){ + int err; + if (h == NULL) return -1; + if (h->auth_info) push_auth_to_exosip(h->auth_info); + eXosip_lock(); + err=eXosip_call_terminate(h->cid,h->did); + eXosip_unlock(); + if (!h->base.root->reuse_authorization) pop_auth_from_exosip(); + if (err!=0){ + ms_warning("Exosip could not terminate the call: cid=%i did=%i", h->cid,h->did); + } + h->terminated=TRUE; + return 0; +} + +void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){ + bool_t terminating=FALSE; + if (h->pending_auth && strcmp(h->pending_auth->request->sip_method,"BYE")==0) { + terminating=TRUE; + } + if (h->terminated && !terminating) return; + + if (h->pending_auth){ + push_auth_to_exosip(info); + + /*FIXME exosip does not take into account this update register message*/ + /* + if (fix_message_contact(h, h->pending_auth->request,h->pending_auth->response)) { + + }; + */ + update_contact_from_response(h,h->pending_auth->response); + eXosip_lock(); + eXosip_default_action(h->pending_auth); + eXosip_unlock(); + ms_message("eXosip_default_action() done"); + if (!h->base.root->reuse_authorization) pop_auth_from_exosip(); + + if (h->auth_info) sal_auth_info_delete(h->auth_info); /*if already exist*/ + h->auth_info=sal_auth_info_clone(info); /*store auth info for subsequent request*/ + } +} +void sal_op_cancel_authentication(SalOp *h) { + if (h->rid >0) { + sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,"Authentication failure"); + } else if (h->cid >0) { + sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,"Authentication failure",0); + } else { + ms_warning("Auth failure not handled"); + } + +} +static void set_network_origin(SalOp *op, osip_message_t *req){ + const char *received=NULL; + int rport=5060; + char origin[64]={0}; + SalTransport transport; + if (extract_received_rport(req,&received,&rport,&transport)!=0){ + osip_via_t *via=NULL; + char *tmp; + osip_message_get_via(req,0,&via); + received=osip_via_get_host(via); + tmp=osip_via_get_port(via); + if (tmp) rport=atoi(tmp); + } + if (transport != SalTransportUDP) { + snprintf(origin,sizeof(origin)-1,"sip:%s:%i",received,rport); + } else { + snprintf(origin,sizeof(origin)-1,"sip:%s:%i;transport=%s",received,rport,sal_transport_to_string(transport)); + } + __sal_op_set_network_origin(op,origin); +} + +static void set_remote_ua(SalOp* op, osip_message_t *req){ + if (op->base.remote_ua==NULL){ + osip_header_t *h=NULL; + osip_message_get_user_agent(req,0,&h); + if (h){ + op->base.remote_ua=ms_strdup(h->hvalue); + } + } +} + +static void set_remote_contact(SalOp* op, osip_message_t *req){ + if (op->base.remote_contact==NULL){ + osip_contact_t *h=NULL; + osip_message_get_contact(req,0,&h); + if (h){ + char *tmp=NULL; + osip_contact_to_str(h,&tmp); + __sal_op_set_remote_contact(op,tmp); + osip_free(tmp); + } + } +} + +static void set_replaces(SalOp *op, osip_message_t *req){ + osip_header_t *h=NULL; + + if (op->replaces){ + ms_free(op->replaces); + op->replaces=NULL; + } + osip_message_header_get_byname(req,"replaces",0,&h); + if (h){ + if (h->hvalue && h->hvalue[0]!='\0'){ + op->replaces=ms_strdup(h->hvalue); + } + } +} + +static SalOp *find_op(Sal *sal, eXosip_event_t *ev){ + if (ev->cid>0){ + return sal_find_call(sal,ev->cid); + } + if (ev->rid>0){ + return sal_find_register(sal,ev->rid); + } + if (ev->sid>0){ + return sal_find_out_subscribe(sal,ev->sid); + } + if (ev->nid>0){ + return sal_find_in_subscribe(sal,ev->nid); + } + if (ev->response) return sal_find_other(sal,ev->response); + else if (ev->request) return sal_find_other(sal,ev->request); + return NULL; +} + +static void inc_new_call(Sal *sal, eXosip_event_t *ev){ + SalOp *op=sal_op_new(sal); + osip_from_t *from,*to; + osip_call_info_t *call_info; + char *tmp=NULL; + sdp_message_t *sdp=eXosip_get_sdp_info(ev->request); + + osip_call_id_t *callid=osip_message_get_call_id(ev->request); + + osip_call_id_to_str(callid,&tmp); + op->base.call_id=ms_strdup(tmp); + osip_free(tmp); + + set_network_origin(op,ev->request); + set_remote_contact(op,ev->request); + set_remote_ua(op,ev->request); + set_replaces(op,ev->request); + sal_op_set_custom_header(op,sal_exosip_get_custom_headers(ev->request)); + + if (sdp){ + op->sdp_offering=FALSE; + op->base.remote_media=sal_media_description_new(); + sdp_to_media_description(sdp,op->base.remote_media); + sdp_message_free(sdp); + }else op->sdp_offering=TRUE; + + from=osip_message_get_from(ev->request); + to=osip_message_get_to(ev->request); + osip_from_to_str(from,&tmp); + sal_op_set_from(op,tmp); + osip_free(tmp); + osip_from_to_str(to,&tmp); + sal_op_set_to(op,tmp); + osip_free(tmp); + + osip_message_get_call_info(ev->request,0,&call_info); + if(call_info) + { + osip_call_info_to_str(call_info,&tmp); + if( strstr(tmp,"answer-after=") != NULL) + { + op->auto_answer_asked=TRUE; + ms_message("The caller asked to automatically answer the call(Emergency?)\n"); + } + osip_free(tmp); + } + + op->tid=ev->tid; + op->cid=ev->cid; + op->did=ev->did; + sal_add_call(op->base.root,op); + sal->callbacks.call_received(op); +} + +static void handle_reinvite(Sal *sal, eXosip_event_t *ev){ + SalOp *op=find_op(sal,ev); + sdp_message_t *sdp; + + if (op==NULL) { + ms_warning("Reinvite for non-existing operation !"); + return; + } + op->reinvite=TRUE; + op->tid=ev->tid; + sdp=eXosip_get_sdp_info(ev->request); + if (op->base.remote_media){ + sal_media_description_unref(op->base.remote_media); + op->base.remote_media=NULL; + } + if (op->result){ + sal_media_description_unref(op->result); + op->result=NULL; + } + if (sdp){ + op->sdp_offering=FALSE; + op->base.remote_media=sal_media_description_new(); + sdp_to_media_description(sdp,op->base.remote_media); + sdp_message_free(sdp); + + }else { + op->sdp_offering=TRUE; + } + sal->callbacks.call_updating(op); +} + +static void handle_ack(Sal *sal, eXosip_event_t *ev){ + SalOp *op=find_op(sal,ev); + sdp_message_t *sdp; + + if (op==NULL) { + ms_warning("ack for non-existing call !"); + return; + } + if (op->terminated) { + ms_warning("ack for terminated call, ignoring"); + return; + } + + if (op->sdp_offering){ + sdp=eXosip_get_sdp_info(ev->ack); + if (sdp){ + if (op->base.remote_media) + sal_media_description_unref(op->base.remote_media); + op->base.remote_media=sal_media_description_new(); + sdp_to_media_description(sdp,op->base.remote_media); + sdp_process(op); + sdp_message_free(sdp); + } + } + if (op->reinvite){ + op->reinvite=FALSE; + } + sal->callbacks.call_ack(op); +} + +static void update_contact_from_response(SalOp *op, osip_message_t *response){ + const char *received; + int rport; + SalTransport transport; + if (extract_received_rport(response,&received,&rport,&transport)==0){ + const char *contact=sal_op_get_contact(op); + if (!contact){ + /*no contact given yet, use from instead*/ + contact=sal_op_get_from(op); + } + if (contact){ + SalAddress *addr=sal_address_new(contact); + char *tmp; + sal_address_set_domain(addr,received); + sal_address_set_port_int(addr,rport); + if (transport!=SalTransportUDP) + sal_address_set_transport(addr,transport); + tmp=sal_address_as_string(addr); + ms_message("Contact address updated to %s",tmp); + sal_op_set_contact(op,tmp); + sal_address_destroy(addr); + ms_free(tmp); + } + } +} + +static int call_proceeding(Sal *sal, eXosip_event_t *ev){ + SalOp *op=find_op(sal,ev); + + if (op==NULL || op->terminated==TRUE) { + ms_warning("This call has been canceled."); + eXosip_lock(); + eXosip_call_terminate(ev->cid,ev->did); + eXosip_unlock(); + return -1; + } + if (ev->did>0) + op->did=ev->did; + op->tid=ev->tid; + + /* update contact if received and rport are set by the server + note: will only be used by remote for next INVITE, if any...*/ + update_contact_from_response(op,ev->response); + return 0; +} + +static void call_ringing(Sal *sal, eXosip_event_t *ev){ + sdp_message_t *sdp; + SalOp *op=find_op(sal,ev); + if (call_proceeding(sal, ev)==-1) return; + + set_remote_ua(op,ev->response); + sdp=eXosip_get_sdp_info(ev->response); + if (sdp){ + op->base.remote_media=sal_media_description_new(); + sdp_to_media_description(sdp,op->base.remote_media); + sdp_message_free(sdp); + if (op->base.local_media) sdp_process(op); + } + sal->callbacks.call_ringing(op); +} + +static void call_accepted(Sal *sal, eXosip_event_t *ev){ + sdp_message_t *sdp; + osip_message_t *msg=NULL; + SalOp *op=find_op(sal,ev); + const char *contact; + + if (op==NULL || op->terminated==TRUE) { + ms_warning("This call has been already terminated."); + eXosip_lock(); + eXosip_call_terminate(ev->cid,ev->did); + eXosip_unlock(); + return ; + } + + op->did=ev->did; + set_remote_ua(op,ev->response); + set_remote_contact(op,ev->response); + + sdp=eXosip_get_sdp_info(ev->response); + if (sdp){ + op->base.remote_media=sal_media_description_new(); + sdp_to_media_description(sdp,op->base.remote_media); + sdp_message_free(sdp); + if (op->base.local_media) sdp_process(op); + } + eXosip_call_build_ack(ev->did,&msg); + if (msg==NULL) { + ms_warning("This call has been already terminated."); + eXosip_lock(); + eXosip_call_terminate(ev->cid,ev->did); + eXosip_unlock(); + return ; + } + contact=sal_op_get_contact(op); + if (contact) { + _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free); + osip_message_set_contact(msg,contact); + } + if (op->sdp_answer){ + set_sdp(msg,op->sdp_answer); + sdp_message_free(op->sdp_answer); + op->sdp_answer=NULL; + } + eXosip_call_send_ack(ev->did,msg); + sal->callbacks.call_accepted(op); +} + +static void call_terminated(Sal *sal, eXosip_event_t *ev){ + char *from=NULL; + SalOp *op=find_op(sal,ev); + if (op==NULL){ + ms_warning("Call terminated for already closed call ?"); + return; + } + if (ev->request){ + osip_from_to_str(ev->request->from,&from); + } + sal->callbacks.call_terminated(op,from!=NULL ? from : sal_op_get_from(op)); + if (from) osip_free(from); + op->terminated=TRUE; +} + +static void call_released(Sal *sal, eXosip_event_t *ev){ + SalOp *op=find_op(sal,ev); + if (op==NULL){ + ms_warning("No op associated to this call_released()"); + return; + } + if (!op->terminated){ + /* no response received so far */ + call_failure(sal,ev); + } + sal->callbacks.call_released(op); +} + +static int get_auth_data_from_response(osip_message_t *resp, const char **realm, const char **username){ + const char *prx_realm=NULL,*www_realm=NULL; + osip_proxy_authenticate_t *prx_auth; + osip_www_authenticate_t *www_auth; + + *username=osip_uri_get_username(resp->from->url); + prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0); + www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0); + if (prx_auth!=NULL) + prx_realm=osip_proxy_authenticate_get_realm(prx_auth); + if (www_auth!=NULL) + www_realm=osip_www_authenticate_get_realm(www_auth); + + if (prx_realm){ + *realm=prx_realm; + }else if (www_realm){ + *realm=www_realm; + }else{ + return -1; + } + return 0; +} + +static int get_auth_data_from_request(osip_message_t *msg, const char **realm, const char **username){ + osip_authorization_t *auth=NULL; + osip_proxy_authorization_t *prx_auth=NULL; + + *username=osip_uri_get_username(msg->from->url); + osip_message_get_authorization(msg, 0, &auth); + if (auth){ + *realm=osip_authorization_get_realm(auth); + return 0; + } + osip_message_get_proxy_authorization(msg,0,&prx_auth); + if (prx_auth){ + *realm=osip_proxy_authorization_get_realm(prx_auth); + return 0; + } + return -1; +} + +static int get_auth_data(eXosip_event_t *ev, const char **realm, const char **username){ + if (ev->response && get_auth_data_from_response(ev->response,realm,username)==0) return 0; + if (ev->request && get_auth_data_from_request(ev->request,realm,username)==0) return 0; + return -1; +} + +int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){ + if (op->pending_auth){ + return get_auth_data(op->pending_auth,realm,username); + } + return -1; +} + +static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){ + SalOp *op; + const char *username,*realm; + op=find_op(sal,ev); + if (op==NULL){ + ms_warning("No operation associated with this authentication !"); + return TRUE; + } + if (get_auth_data(ev,&realm,&username)==0){ + if (op->pending_auth!=NULL){ + eXosip_event_free(op->pending_auth); + op->pending_auth=ev; + }else{ + op->pending_auth=ev; + sal_add_pending_auth(sal,op); + } + + sal->callbacks.auth_requested(op,realm,username); + return FALSE; + } + return TRUE; +} + +static void authentication_ok(Sal *sal, eXosip_event_t *ev){ + SalOp *op; + const char *username,*realm; + op=find_op(sal,ev); + if (op==NULL){ + ms_warning("No operation associated with this authentication_ok!"); + return ; + } + if (op->pending_auth){ + eXosip_event_free(op->pending_auth); + sal_remove_pending_auth(sal,op); + op->pending_auth=NULL; + } + if (get_auth_data(ev,&realm,&username)==0){ + sal->callbacks.auth_success(op,realm,username); + } +} + +static bool_t call_failure(Sal *sal, eXosip_event_t *ev){ + SalOp *op; + int code=0; + char* computedReason=NULL; + const char *reason=NULL; + SalError error=SalErrorUnknown; + SalReason sr=SalReasonUnknown; + + + op=(SalOp*)find_op(sal,ev); + + if (op==NULL) { + ms_warning("Call failure reported for a closed call, ignored."); + return TRUE; + } + + if (ev->response){ + code=osip_message_get_status_code(ev->response); + reason=osip_message_get_reason_phrase(ev->response); + osip_header_t *h=NULL; + if (!osip_message_header_get_byname( ev->response + ,"Reason" + ,0 + ,&h)) { + computedReason = ms_strdup_printf("%s %s",reason,osip_header_get_value(h)); + reason = computedReason; + + } + } + switch(code) + { + case 401: + case 407: + return process_authentication(sal,ev); + break; + case 400: + error=SalErrorUnknown; + break; + case 404: + error=SalErrorFailure; + sr=SalReasonNotFound; + break; + case 415: + error=SalErrorFailure; + sr=SalReasonMedia; + break; + case 422: + eXosip_default_action(ev); + return TRUE; + break; + case 480: + error=SalErrorFailure; + sr=SalReasonTemporarilyUnavailable; + case 486: + error=SalErrorFailure; + sr=SalReasonBusy; + break; + case 487: + break; + case 600: + error=SalErrorFailure; + sr=SalReasonDoNotDisturb; + break; + case 603: + error=SalErrorFailure; + sr=SalReasonDeclined; + break; + default: + if (code>0){ + error=SalErrorFailure; + sr=SalReasonUnknown; + }else error=SalErrorNoResponse; + } + op->terminated=TRUE; + sal->callbacks.call_failure(op,error,sr,reason,code); + if (computedReason != NULL){ + ms_free(computedReason); + } + return TRUE; +} + +/* Request remote side to send us VFU */ +void sal_call_send_vfu_request(SalOp *h){ + osip_message_t *msg=NULL; + char info_body[] = + "" + "" + " " + " " + " " + " " + " " + ""; + + char clen[10]; + + eXosip_lock(); + eXosip_call_build_info(h->did,&msg); + if (msg){ + osip_message_set_body(msg,info_body,strlen(info_body)); + osip_message_set_content_type(msg,"application/media_control+xml"); + snprintf(clen,sizeof(clen),"%lu",(unsigned long)strlen(info_body)); + osip_message_set_content_length(msg,clen); + eXosip_call_send_request(h->did,msg); + ms_message("Sending VFU request !"); + } + eXosip_unlock(); +} + +static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){ + SalOp *op=find_op(sal,ev); + osip_body_t *body=NULL; + + if (op==NULL){ + ms_warning("media control xml received without operation context!"); + return ; + } + + osip_message_get_body(ev->request,0,&body); + if (body && body->body!=NULL && + strstr(body->body,"picture_fast_update")){ + osip_message_t *ans=NULL; + ms_message("Receiving VFU request !"); + if (sal->callbacks.vfu_request){ + sal->callbacks.vfu_request(op); + eXosip_call_build_answer(ev->tid,200,&ans); + if (ans) + eXosip_call_send_answer(ev->tid,200,ans); + return; + } + } + /*in all other cases we must say it is not implemented.*/ + { + osip_message_t *ans=NULL; + eXosip_lock(); + eXosip_call_build_answer(ev->tid,501,&ans); + if (ans) + eXosip_call_send_answer(ev->tid,501,ans); + eXosip_unlock(); + } +} + +static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){ + SalOp *op=find_op(sal,ev); + osip_body_t *body=NULL; + + if (op==NULL){ + ms_warning("media dtmf relay received without operation context!"); + return ; + } + + osip_message_get_body(ev->request,0,&body); + if (body && body->body!=NULL){ + osip_message_t *ans=NULL; + const char *name=strstr(body->body,"Signal"); + if (name==NULL) name=strstr(body->body,"signal"); + if (name==NULL) { + ms_warning("Could not extract the dtmf name from the SIP INFO."); + }else{ + char tmp[2]; + name+=strlen("signal"); + if (sscanf(name," = %1s",tmp)==1){ + ms_message("Receiving dtmf %s via SIP INFO.",tmp); + if (sal->callbacks.dtmf_received != NULL) + sal->callbacks.dtmf_received(op, tmp[0]); + } + } + eXosip_lock(); + eXosip_call_build_answer(ev->tid,200,&ans); + if (ans) + eXosip_call_send_answer(ev->tid,200,ans); + eXosip_unlock(); + } +} + +static void fill_options_answer(osip_message_t *options){ + osip_message_set_allow(options,"INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, SUBSCRIBE, NOTIFY, INFO"); + osip_message_set_accept(options,"application/sdp"); +} + +static void process_refer(Sal *sal, SalOp *op, eXosip_event_t *ev){ + osip_header_t *h=NULL; + osip_message_t *ans=NULL; + ms_message("Receiving REFER request !"); + osip_message_header_get_byname(ev->request,"Refer-To",0,&h); + + if (h){ + osip_from_t *from=NULL; + char *tmp; + osip_from_init(&from); + + if (osip_from_parse(from,h->hvalue)==0){ + if (op ){ + osip_uri_header_t *uh=NULL; + osip_header_t *referred_by=NULL; + osip_uri_header_get_byname(&from->url->url_headers,(char*)"Replaces",&uh); + if (uh!=NULL && uh->gvalue && uh->gvalue[0]!='\0'){ + ms_message("Found replaces in Refer-To"); + if (op->replaces){ + ms_free(op->replaces); + } + op->replaces=ms_strdup(uh->gvalue); + } + osip_message_header_get_byname(ev->request,"Referred-By",0,&referred_by); + if (referred_by && referred_by->hvalue && referred_by->hvalue[0]!='\0'){ + if (op->referred_by) + ms_free(op->referred_by); + op->referred_by=ms_strdup(referred_by->hvalue); + } + } + osip_uri_header_freelist(&from->url->url_headers); + osip_from_to_str(from,&tmp); + sal->callbacks.refer_received(sal,op,tmp); + osip_free(tmp); + osip_from_free(from); + } + eXosip_lock(); + eXosip_call_build_answer(ev->tid,202,&ans); + if (ans) + eXosip_call_send_answer(ev->tid,202,ans); + eXosip_unlock(); + } + else + { + ms_warning("cannot do anything with the refer without destination\n"); + } +} + +static void process_notify(Sal *sal, eXosip_event_t *ev){ + osip_header_t *h=NULL; + char *from=NULL; + SalOp *op=find_op(sal,ev); + osip_message_t *ans=NULL; + + ms_message("Receiving NOTIFY request !"); + osip_from_to_str(ev->request->from,&from); + osip_message_header_get_byname(ev->request,"Event",0,&h); + if(h){ + osip_body_t *body=NULL; + //osip_content_type_t *ct=NULL; + osip_message_get_body(ev->request,0,&body); + //ct=osip_message_get_content_type(ev->request); + if (h->hvalue && strcasecmp(h->hvalue,"refer")==0){ + /*special handling of refer events*/ + if (body && body->body){ + osip_message_t *msg; + osip_message_init(&msg); + if (osip_message_parse_sipfrag(msg,body->body,strlen(body->body))==0){ + int code=osip_message_get_status_code(msg); + if (code==100){ + sal->callbacks.notify_refer(op,SalReferTrying); + }else if (code==200){ + sal->callbacks.notify_refer(op,SalReferSuccess); + }else if (code>=400){ + sal->callbacks.notify_refer(op,SalReferFailed); + } + } + osip_message_free(msg); + } + }else{ + /*generic handling*/ + sal->callbacks.notify(op,from,h->hvalue); + } + } + /*answer that we received the notify*/ + eXosip_lock(); + eXosip_call_build_answer(ev->tid,200,&ans); + if (ans) + eXosip_call_send_answer(ev->tid,200,ans); + eXosip_unlock(); + osip_free(from); +} + +static void call_message_new(Sal *sal, eXosip_event_t *ev){ + osip_message_t *ans=NULL; + if (ev->request){ + if (MSG_IS_INFO(ev->request)){ + osip_content_type_t *ct; + ct=osip_message_get_content_type(ev->request); + if (ct && ct->subtype){ + if (strcmp(ct->subtype,"media_control+xml")==0) + process_media_control_xml(sal,ev); + else if (strcmp(ct->subtype,"dtmf-relay")==0) + process_dtmf_relay(sal,ev); + else { + ms_message("Unhandled SIP INFO."); + /*send an "Not implemented" answer*/ + eXosip_lock(); + eXosip_call_build_answer(ev->tid,501,&ans); + if (ans) + eXosip_call_send_answer(ev->tid,501,ans); + eXosip_unlock(); + } + }else{ + /*empty SIP INFO, probably to test we are alive. Send an empty answer*/ + eXosip_lock(); + eXosip_call_build_answer(ev->tid,200,&ans); + if (ans) + eXosip_call_send_answer(ev->tid,200,ans); + eXosip_unlock(); + } + }else if(MSG_IS_MESSAGE(ev->request)){ + /* SIP messages could be received into call */ + text_received(sal, ev); + eXosip_lock(); + eXosip_call_build_answer(ev->tid,200,&ans); + if (ans) + eXosip_call_send_answer(ev->tid,200,ans); + eXosip_unlock(); + }else if(MSG_IS_REFER(ev->request)){ + SalOp *op=find_op(sal,ev); + + ms_message("Receiving REFER request !"); + process_refer(sal,op,ev); + }else if(MSG_IS_NOTIFY(ev->request)){ + process_notify(sal,ev); + }else if (MSG_IS_OPTIONS(ev->request)){ + eXosip_lock(); + eXosip_call_build_answer(ev->tid,200,&ans); + if (ans){ + fill_options_answer(ans); + eXosip_call_send_answer(ev->tid,200,ans); + } + eXosip_unlock(); + } + }else ms_warning("call_message_new: No request ?"); +} + +static void inc_update(Sal *sal, eXosip_event_t *ev){ + osip_message_t *msg=NULL; + ms_message("Processing incoming UPDATE"); + eXosip_lock(); + eXosip_message_build_answer(ev->tid,200,&msg); + if (msg!=NULL) + eXosip_message_send_answer(ev->tid,200,msg); + eXosip_unlock(); +} + +static bool_t comes_from_local_if(osip_message_t *msg){ + osip_via_t *via=NULL; + osip_message_get_via(msg,0,&via); + if (via){ + const char *host; + host=osip_via_get_host(via); + if (strcmp(host,"127.0.0.1")==0 || strcmp(host,"::1")==0){ + osip_generic_param_t *param=NULL; + osip_via_param_get_byname(via,"received",¶m); + if (param==NULL) return TRUE; + if (param->gvalue && + (strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){ + return TRUE; + } + } + } + return FALSE; +} + static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; - -static void text_received(Sal *sal, eXosip_event_t *ev){ - osip_body_t *body=NULL; - char *from=NULL,*msg=NULL; - osip_content_type_t* content_type; - osip_uri_param_t* external_body_url; - char unquoted_external_body_url [256]; - int external_body_size=0; - SalMessage salmsg; - char message_id[256]={0}; - osip_header_t *date=NULL; - struct tm ret={}; - char tmp1[80]={0}; - char tmp2[80]={0}; - int i,j; - - osip_message_get_date(ev->request,0,&date); - if(date==NULL){ - ms_error("Could not get the date of message"); - return; - } - sscanf(date->hvalue,"%3c,%d%s%d%d:%d:%d",tmp1,&ret.tm_mday,tmp2, - &ret.tm_year,&ret.tm_hour,&ret.tm_min,&ret.tm_sec); - ret.tm_year-=1900; - for(i=0;i<7;i++) { - if(strcmp(tmp1,days[i])==0) ret.tm_wday=i; - } - for(j=0;j<12;j++) { - if(strcmp(tmp2,months[j])==0) ret.tm_mon=j; - } - - content_type= osip_message_get_content_type(ev->request); - if (!content_type) { - ms_error("Could not get message because no content type"); - return; - } - osip_from_to_str(ev->request->from,&from); - if (content_type->type - && strcmp(content_type->type, "text")==0 - && content_type->subtype - && strcmp(content_type->subtype, "plain")==0 ) { - osip_message_get_body(ev->request,0,&body); - if (body==NULL){ - ms_error("Could not get text message from SIP body"); - osip_free(from); - return; - } - msg=body->body; - }else if (content_type->type - && strcmp(content_type->type, "message")==0 - && content_type->subtype - && strcmp(content_type->subtype, "external-body")==0 ) { - - osip_content_type_param_get_byname(content_type, "URL", &external_body_url); - /*remove both first and last character*/ - strncpy(unquoted_external_body_url - ,&external_body_url->gvalue[1] - ,external_body_size=MIN(strlen(external_body_url->gvalue)-1,sizeof(unquoted_external_body_url))); - unquoted_external_body_url[external_body_size-1]='\0'; - } else { - ms_warning("Unsupported content type [%s/%s]",content_type->type,content_type->subtype); - osip_free(from); - return; - } - snprintf(message_id,sizeof(message_id)-1,"%s%s",ev->request->call_id->number,ev->request->cseq->number); - - salmsg.from=from; - salmsg.text=msg; - salmsg.url=external_body_size>0 ? unquoted_external_body_url : NULL; - salmsg.message_id=message_id; - salmsg.time=mktime(&ret); - sal->callbacks.text_received(sal,&salmsg); - osip_free(from); -} - - - -static void other_request(Sal *sal, eXosip_event_t *ev){ - ms_message("in other_request"); - if (ev->request==NULL) return; - if (strcmp(ev->request->sip_method,"MESSAGE")==0){ - text_received(sal,ev); - eXosip_message_send_answer(ev->tid,200,NULL); - }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){ - osip_message_t *options=NULL; - eXosip_options_build_answer(ev->tid,200,&options); - fill_options_answer(options); - eXosip_options_send_answer(ev->tid,200,options); - }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){ - ms_message("Receiving REFER request !"); - if (comes_from_local_if(ev->request)) { - process_refer(sal,NULL,ev); - }else ms_warning("Ignored REFER not coming from this local loopback interface."); - }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){ - inc_update(sal,ev); - }else { - char *tmp=NULL; - size_t msglen=0; - osip_message_to_str(ev->request,&tmp,&msglen); - if (tmp){ - ms_message("Unsupported request received:\n%s",tmp); - osip_free(tmp); - } - /*answer with a 501 Not implemented*/ - eXosip_message_send_answer(ev->tid,501,NULL); - } -} - -static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){ - osip_via_t *via=NULL; - osip_message_get_via(msg,0,&via); - if (via){ - osip_free(via->port); - via->port=osip_strdup(port); - osip_free(via->host); - via->host=osip_strdup(ip); - } -} - - -static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer, bool_t expire_last_contact) { - osip_contact_t *ctt=NULL; - const char *received; - int rport; - SalTransport transport; - char port[20]; - - if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE; - osip_message_get_contact(request,0,&ctt); - if (ctt == NULL) { - ms_warning("fix_message_contact(): no contact to update"); - return FALSE; - } - if (expire_last_contact){ - osip_contact_t *oldct=NULL,*prevct; - osip_generic_param_t *param=NULL; - osip_contact_clone(ctt,&oldct); - while ((prevct=(osip_contact_t*)osip_list_get(&request->contacts,1))!=NULL){ - osip_contact_free(prevct); - osip_list_remove(&request->contacts,1); - } - osip_list_add(&request->contacts,oldct,1); - osip_contact_param_get_byname(oldct,"expires",¶m); - if (param){ - if (param->gvalue) osip_free(param->gvalue); - param->gvalue=osip_strdup("0"); - }else{ - osip_contact_param_add(oldct,osip_strdup("expires"),osip_strdup("0")); - } - } - if (ctt->url->host!=NULL){ - osip_free(ctt->url->host); - } - ctt->url->host=osip_strdup(received); - if (ctt->url->port!=NULL){ - osip_free(ctt->url->port); - } - snprintf(port,sizeof(port),"%i",rport); - ctt->url->port=osip_strdup(port); - if (op->masquerade_via) masquerade_via(request,received,port); - - if (transport != SalTransportUDP) { - sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport)); - } - return TRUE; -} - -static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){ - osip_contact_t *ctt=NULL; - SalAddress* ori_contact_address=NULL; - const char *received; - int rport; - SalTransport transport; - char* tmp; - osip_message_t *msg=NULL; - Sal* sal=op->base.root; - int i=0; - bool_t found_valid_contact=FALSE; - bool_t from_request=FALSE; - - if (sal->double_reg==FALSE ) return FALSE; - - if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE; - do{ - ctt=NULL; - osip_message_get_contact(last_answer,i,&ctt); - if (!from_request && ctt==NULL) { - osip_message_get_contact(orig_request,0,&ctt); - from_request=TRUE; - } - if (ctt){ - osip_contact_to_str(ctt,&tmp); - ori_contact_address = sal_address_new(tmp); - - /*check if contact is up to date*/ - if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0 - && sal_address_get_port_int(ori_contact_address) == rport - && sal_address_get_transport(ori_contact_address) == transport) { - if (!from_request){ - ms_message("Register response has up to date contact, doing nothing."); - }else { - ms_warning("Register response does not have up to date contact, but last request had." - "Stupid registrar detected, giving up."); - } - found_valid_contact=TRUE; - } - osip_free(tmp); - sal_address_destroy(ori_contact_address); - }else break; - i++; - }while(!found_valid_contact); - if (!found_valid_contact) - ms_message("Contact do not match, resending register."); - else return FALSE; - - eXosip_lock(); - eXosip_register_build_register(op->rid,op->expires,&msg); - if (msg==NULL){ - eXosip_unlock(); - ms_warning("Fail to create a contact updated register."); - return FALSE; - } - if (fix_message_contact(op,msg,last_answer,op->base.root->expire_old_contact)) { - eXosip_register_send_register(op->rid,msg); - eXosip_unlock(); - ms_message("Resending new register with updated contact"); - update_contact_from_response(op,last_answer); - return TRUE; - } else { - ms_warning("Fail to send updated register."); - eXosip_unlock(); - return FALSE; - } - eXosip_unlock(); - return FALSE; -} - -static void registration_success(Sal *sal, eXosip_event_t *ev){ - SalOp *op=sal_find_register(sal,ev->rid); - osip_header_t *h=NULL; - bool_t registered; - if (op==NULL){ - ms_error("Receiving register response for unknown operation"); - return; - } - osip_message_get_expires(ev->request,0,&h); - if (h!=NULL && atoi(h->hvalue)!=0){ - registered=TRUE; - if (!register_again_with_updated_contact(op,ev->request,ev->response)){ - sal->callbacks.register_success(op,registered); - } - }else { - sal->callbacks.register_success(op,FALSE); - } -} - -static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){ - int status_code=0; - const char *reason=NULL; - SalOp *op=sal_find_register(sal,ev->rid); - SalReason sr=SalReasonUnknown; - SalError se=SalErrorUnknown; - - if (op==NULL){ - ms_error("Receiving register failure for unknown operation"); - return TRUE; - } - if (ev->response){ - status_code=osip_message_get_status_code(ev->response); - reason=osip_message_get_reason_phrase(ev->response); - } - switch(status_code){ - case 401: - case 407: - return process_authentication(sal,ev); - break; - case 423: /*interval too brief*/ - {/*retry with greater interval */ - osip_header_t *h=NULL; - osip_message_t *msg=NULL; - osip_message_header_get_byname(ev->response,"min-expires",0,&h); - if (h && h->hvalue && h->hvalue[0]!='\0'){ - int val=atoi(h->hvalue); - if (val>op->expires) - op->expires=val; - }else op->expires*=2; - eXosip_lock(); - eXosip_register_build_register(op->rid,op->expires,&msg); - eXosip_register_send_register(op->rid,msg); - eXosip_unlock(); - } - break; - case 606: /*Not acceptable, workaround for proxies that don't like private addresses - in vias, such as ekiga.net - On the opposite, freephonie.net bugs when via are masqueraded. - */ - op->masquerade_via=TRUE; - default: - /* if contact is up to date, process the failure, otherwise resend a new register with - updated contact first, just in case the faillure is due to incorrect contact */ - if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response)) - return TRUE; /*we are retrying with an updated contact*/ - if (status_code==403){ - se=SalErrorFailure; - sr=SalReasonForbidden; - }else if (status_code==0){ - se=SalErrorNoResponse; - } - sal->callbacks.register_failure(op,se,sr,reason); - } - return TRUE; -} - -static void other_request_reply(Sal *sal,eXosip_event_t *ev){ - SalOp *op=find_op(sal,ev); - if (op==NULL){ - ms_warning("other_request_reply(): Receiving response to unknown request."); - return; - } - if (ev->response){ - ms_message("Processing reponse status [%i] for method [%s]",ev->response->status_code,osip_message_get_method(ev->request)); - update_contact_from_response(op,ev->response); - if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0) - sal->callbacks.ping_reply(op); - } - if (ev->request && strcmp(osip_message_get_method(ev->request),"MESSAGE")==0) { - /*out of call message acknolegment*/ - SalTextDeliveryStatus status=SalTextDeliveryFailed; - if (ev->response){ - if (ev->response->status_code<200){ - status=SalTextDeliveryInProgress; - }else if (ev->response->status_code<300 && ev->response->status_code>=200){ - status=SalTextDeliveryDone; - } - } - sal->callbacks.text_delivery_update(op,status); - } -} - -static void process_in_call_reply(Sal *sal, eXosip_event_t *ev){ - SalOp *op=find_op(sal,ev); - if (ev->response){ - if (ev->request && strcmp(osip_message_get_method(ev->request),"NOTIFY")==0){ - if (op->sipfrag_pending){ - send_notify_for_refer(op->did,op->sipfrag_pending); - op->sipfrag_pending=NULL; - } - } - } -} - -static bool_t process_event(Sal *sal, eXosip_event_t *ev){ - ms_message("linphone process event get a message %d\n",ev->type); - switch(ev->type){ - case EXOSIP_CALL_ANSWERED: - ms_message("CALL_ANSWERED\n"); - call_accepted(sal,ev); - authentication_ok(sal,ev); - break; - case EXOSIP_CALL_CLOSED: - case EXOSIP_CALL_CANCELLED: - ms_message("CALL_CLOSED or CANCELLED\n"); - call_terminated(sal,ev); - break; - case EXOSIP_CALL_TIMEOUT: - case EXOSIP_CALL_NOANSWER: - ms_message("CALL_TIMEOUT or NOANSWER\n"); - return call_failure(sal,ev); - break; - case EXOSIP_CALL_REQUESTFAILURE: - case EXOSIP_CALL_GLOBALFAILURE: - case EXOSIP_CALL_SERVERFAILURE: - ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n"); - return call_failure(sal,ev); - break; - case EXOSIP_CALL_RELEASED: - ms_message("CALL_RELEASED\n"); - call_released(sal, ev); - break; - case EXOSIP_CALL_INVITE: - ms_message("CALL_NEW\n"); - inc_new_call(sal,ev); - break; - case EXOSIP_CALL_REINVITE: - handle_reinvite(sal,ev); - break; - case EXOSIP_CALL_ACK: - ms_message("CALL_ACK"); - handle_ack(sal,ev); - break; - case EXOSIP_CALL_REDIRECTED: - ms_message("CALL_REDIRECTED"); - eXosip_default_action(ev); - break; - case EXOSIP_CALL_PROCEEDING: - ms_message("CALL_PROCEEDING"); - call_proceeding(sal,ev); - break; - case EXOSIP_CALL_RINGING: - ms_message("CALL_RINGING"); - call_ringing(sal,ev); - authentication_ok(sal,ev); - break; - case EXOSIP_CALL_MESSAGE_NEW: - ms_message("EXOSIP_CALL_MESSAGE_NEW"); - call_message_new(sal,ev); - break; - case EXOSIP_CALL_MESSAGE_REQUESTFAILURE: - if (ev->response && - (ev->response->status_code==407 || ev->response->status_code==401)){ - return process_authentication(sal,ev); - } - break; - case EXOSIP_CALL_MESSAGE_ANSWERED: - ms_message("EXOSIP_CALL_MESSAGE_ANSWERED "); - process_in_call_reply(sal,ev); - break; - case EXOSIP_IN_SUBSCRIPTION_NEW: - ms_message("CALL_IN_SUBSCRIPTION_NEW "); - sal_exosip_subscription_recv(sal,ev); - break; - case EXOSIP_IN_SUBSCRIPTION_RELEASED: - ms_message("CALL_SUBSCRIPTION_NEW "); - sal_exosip_in_subscription_closed(sal,ev); - break; - case EXOSIP_SUBSCRIPTION_UPDATE: - ms_message("CALL_SUBSCRIPTION_UPDATE"); - break; - case EXOSIP_SUBSCRIPTION_NOTIFY: - ms_message("CALL_SUBSCRIPTION_NOTIFY"); - sal_exosip_notify_recv(sal,ev); - break; - case EXOSIP_SUBSCRIPTION_ANSWERED: - ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did); - sal_exosip_subscription_answered(sal,ev); - break; - case EXOSIP_SUBSCRIPTION_CLOSED: - ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n"); - sal_exosip_subscription_closed(sal,ev); - break; - case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */ - if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){ - return process_authentication(sal,ev); - } - case EXOSIP_SUBSCRIPTION_SERVERFAILURE: - case EXOSIP_SUBSCRIPTION_GLOBALFAILURE: - sal_exosip_subscription_closed(sal,ev); - break; - case EXOSIP_REGISTRATION_FAILURE: - ms_message("REGISTRATION_FAILURE\n"); - return registration_failure(sal,ev); - break; - case EXOSIP_REGISTRATION_SUCCESS: - authentication_ok(sal,ev); - registration_success(sal,ev); - break; - case EXOSIP_MESSAGE_NEW: - other_request(sal,ev); - break; - case EXOSIP_MESSAGE_PROCEEDING: - case EXOSIP_MESSAGE_ANSWERED: - case EXOSIP_MESSAGE_REDIRECTED: - case EXOSIP_MESSAGE_SERVERFAILURE: - case EXOSIP_MESSAGE_GLOBALFAILURE: - other_request_reply(sal,ev); - break; - case EXOSIP_MESSAGE_REQUESTFAILURE: - case EXOSIP_NOTIFICATION_REQUESTFAILURE: - if (ev->response) { - switch (ev->response->status_code) { - case 407: - case 401: - return process_authentication(sal,ev); - case 412: { - eXosip_automatic_action (); - return 1; - } - } - } - other_request_reply(sal,ev); - break; - default: - ms_message("Unhandled exosip event ! %i",ev->type); - break; - } - return TRUE; -} - -int sal_iterate(Sal *sal){ - eXosip_event_t *ev; - while((ev=eXosip_event_wait(0,0))!=NULL){ - if (process_event(sal,ev)) - eXosip_event_free(ev); - } -#ifdef HAVE_EXOSIP_TRYLOCK - if (eXosip_trylock()==0){ - eXosip_automatic_refresh(); - eXosip_unlock(); - }else{ - ms_warning("eXosip_trylock busy."); - } -#else - eXosip_lock(); - eXosip_automatic_refresh(); - eXosip_unlock(); -#endif - return 0; -} - -static void register_set_contact(osip_message_t *msg, const char *contact){ - osip_uri_param_t *param = NULL; - osip_contact_t *ct=NULL; - char *line=NULL; - /*we get the line parameter choosed by exosip, and add it to our own contact*/ - osip_message_get_contact(msg,0,&ct); - if (ct!=NULL){ - osip_uri_uparam_get_byname(ct->url, "line", ¶m); - if (param && param->gvalue) - line=osip_strdup(param->gvalue); - } - _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free); - osip_message_set_contact(msg,contact); - osip_message_get_contact(msg,0,&ct); - osip_uri_uparam_add(ct->url,osip_strdup("line"),line); -} - -static void sal_register_add_route(osip_message_t *msg, const char *proxy){ - osip_route_t *route; - - osip_list_special_free(&msg->routes,(void (*)(void*))osip_route_free); - - osip_route_init(&route); - if (osip_route_parse(route,proxy)==0){ - osip_uri_param_t *lr_param = NULL; - osip_uri_uparam_get_byname(route->url, "lr", &lr_param); - if (lr_param == NULL){ - osip_uri_uparam_add(route->url,osip_strdup("lr"),NULL); - } - osip_list_add(&msg->routes,route,0); - return; - } - osip_route_free(route); -} - - -int sal_register(SalOp *h, const char *proxy, const char *from, int expires){ - osip_message_t *msg; - const char *contact=sal_op_get_contact(h); - - sal_op_set_route(h,proxy); - if (h->rid==-1){ - SalAddress *from_parsed=sal_address_new(from); - char domain[256]; - char *uri, *domain_ptr = NULL; - if (from_parsed==NULL) { - ms_warning("sal_register() bad from %s",from); - return -1; - } - /* Get domain using sal_address_as_string_uri_only() and stripping the username part instead of - using sal_address_get_domain() because to have a properly formatted domain with IPv6 proxy addresses. */ - uri = sal_address_as_string_uri_only(from_parsed); - if (uri) domain_ptr = strchr(uri, '@'); - if (domain_ptr) { - snprintf(domain,sizeof(domain),"sip:%s",domain_ptr+1); - } else { - snprintf(domain,sizeof(domain),"sip:%s",sal_address_get_domain(from_parsed)); - } - if (uri) ms_free(uri); - sal_address_destroy(from_parsed); - eXosip_lock(); - h->rid=eXosip_register_build_initial_register(from,domain,NULL,expires,&msg); - if (msg){ - if (contact) register_set_contact(msg,contact); - sal_register_add_route(msg,proxy); - sal_add_register(h->base.root,h); - }else{ - ms_error("Could not build initial register."); - eXosip_unlock(); - return -1; - } - }else{ - eXosip_lock(); - eXosip_register_build_register(h->rid,expires,&msg); - sal_register_add_route(msg,proxy); - } - if (msg){ - eXosip_register_send_register(h->rid,msg); - } - eXosip_unlock(); - h->expires=expires; - return (msg != NULL) ? 0 : -1; -} - -int sal_register_refresh(SalOp *op, int expires){ - osip_message_t *msg=NULL; - const char *contact=sal_op_get_contact(op); - - if (op->rid==-1){ - ms_error("Unexistant registration context, not possible to refresh."); - return -1; - } -#ifdef HAVE_EXOSIP_TRYLOCK - { - int tries=0; - /*iOS hack: in the keep alive handler, we have no more than 10 seconds to refresh registers, otherwise the application is suspended forever. - * In order to prevent this case that can occur when the exosip thread is busy with DNS while network isn't in a good shape, we try to take - * the exosip lock in a non blocking way, and give up if it takes too long*/ - while (eXosip_trylock()!=0){ - ms_usleep(100000); - if (tries>30) {/*after 3 seconds, give up*/ - ms_warning("Could not obtain exosip lock in a reasonable time, giving up."); - return -1; - } - } - } -#else - eXosip_lock(); -#endif - eXosip_register_build_register(op->rid,expires,&msg); - if (msg!=NULL){ - if (contact) register_set_contact(msg,contact); - sal_register_add_route(msg,sal_op_get_route(op)); - eXosip_register_send_register(op->rid,msg); - }else ms_error("Could not build REGISTER refresh message."); - eXosip_unlock(); - return (msg != NULL) ? 0 : -1; -} - - -int sal_unregister(SalOp *h){ - osip_message_t *msg=NULL; - eXosip_lock(); - eXosip_register_build_register(h->rid,0,&msg); - if (msg) eXosip_register_send_register(h->rid,msg); - else ms_warning("Could not build unREGISTER !"); - eXosip_unlock(); - return 0; -} - -SalAddress * sal_address_new(const char *uri){ - osip_from_t *from; - osip_from_init(&from); - - // Remove front spaces - while (uri[0]==' ') { - uri++; - } - - if (osip_from_parse(from,uri)!=0){ - osip_from_free(from); - return NULL; - } - if (from->displayname!=NULL && from->displayname[0]=='"'){ - char *unquoted=osip_strdup_without_quote(from->displayname); - osip_free(from->displayname); - from->displayname=unquoted; - } - return (SalAddress*)from; -} - -SalAddress * sal_address_clone(const SalAddress *addr){ - osip_from_t *ret=NULL; - osip_from_clone((osip_from_t*)addr,&ret); - return (SalAddress*)ret; -} - -#define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL ) - -const char *sal_address_get_scheme(const SalAddress *addr){ - const osip_from_t *u=(const osip_from_t*)addr; - return null_if_empty(u->url->scheme); -} - -const char *sal_address_get_display_name(const SalAddress* addr){ - const osip_from_t *u=(const osip_from_t*)addr; - return null_if_empty(u->displayname); -} - -const char *sal_address_get_username(const SalAddress *addr){ - const osip_from_t *u=(const osip_from_t*)addr; - return null_if_empty(u->url->username); -} - -const char *sal_address_get_domain(const SalAddress *addr){ - const osip_from_t *u=(const osip_from_t*)addr; - return null_if_empty(u->url->host); -} - -void sal_address_set_display_name(SalAddress *addr, const char *display_name){ - osip_from_t *u=(osip_from_t*)addr; - if (u->displayname!=NULL){ - osip_free(u->displayname); - u->displayname=NULL; - } - if (display_name!=NULL && display_name[0]!='\0'){ - u->displayname=osip_strdup(display_name); - } -} - -void sal_address_set_username(SalAddress *addr, const char *username){ - osip_from_t *uri=(osip_from_t*)addr; - if (uri->url->username!=NULL){ - osip_free(uri->url->username); - uri->url->username=NULL; - } - if (username) - uri->url->username=osip_strdup(username); -} - -void sal_address_set_domain(SalAddress *addr, const char *host){ - osip_from_t *uri=(osip_from_t*)addr; - if (uri->url->host!=NULL){ - osip_free(uri->url->host); - uri->url->host=NULL; - } - if (host) - uri->url->host=osip_strdup(host); -} - -void sal_address_set_port(SalAddress *addr, const char *port){ - osip_from_t *uri=(osip_from_t*)addr; - if (uri->url->port!=NULL){ - osip_free(uri->url->port); - uri->url->port=NULL; - } - if (port) - uri->url->port=osip_strdup(port); -} - -void sal_address_set_port_int(SalAddress *uri, int port){ - char tmp[12]; - if (port==5060){ - /*this is the default, special case to leave the port field blank*/ - sal_address_set_port(uri,NULL); - return; - } - snprintf(tmp,sizeof(tmp),"%i",port); - sal_address_set_port(uri,tmp); -} - -void sal_address_clean(SalAddress *addr){ - osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params); - osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params); -} - -char *sal_address_as_string(const SalAddress *u){ - char *tmp,*ret; - osip_from_t *from=(osip_from_t *)u; - char *old_displayname=NULL; - /* hack to force use of quotes around the displayname*/ - if (from->displayname!=NULL - && from->displayname[0]!='"'){ - old_displayname=from->displayname; - from->displayname=osip_enquote(from->displayname); - } - osip_from_to_str(from,&tmp); - if (old_displayname!=NULL){ - ms_free(from->displayname); - from->displayname=old_displayname; - } - ret=ms_strdup(tmp); - osip_free(tmp); - return ret; -} - -char *sal_address_as_string_uri_only(const SalAddress *u){ - char *tmp=NULL,*ret; - osip_uri_to_str(((osip_from_t*)u)->url,&tmp); - ret=ms_strdup(tmp); - osip_free(tmp); - return ret; -} -void sal_address_set_param(SalAddress *u,const char* name,const char* value) { - osip_uri_param_t *param=NULL; - osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m); - if (param == NULL){ - osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),value ? ms_strdup(value) : NULL); - } else { - osip_free(param->gvalue); - param->gvalue=value ? osip_strdup(value) : NULL; - } - -} - -void sal_address_destroy(SalAddress *u){ - osip_from_free((osip_from_t*)u); -} - -void sal_use_tcp_tls_keepalive(Sal *ctx, bool_t enabled) { - ctx->tcp_tls_keepalive = enabled; -} - -void sal_set_keepalive_period(Sal *ctx,unsigned int value) { - switch (ctx->transport) { - case SalTransportUDP: - ctx->keepalive_period = value; - break; - case SalTransportTCP: - case SalTransportTLS: - if (ctx->tcp_tls_keepalive) ctx->keepalive_period = value; - else ctx->keepalive_period = -1; - break; - default: - break; - } - eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &ctx->keepalive_period); -} -unsigned int sal_get_keepalive_period(Sal *ctx) { - return ctx->keepalive_period; -} - -const char * sal_address_get_port(const SalAddress *addr) { - const osip_from_t *u=(const osip_from_t*)addr; - return null_if_empty(u->url->port); -} - -int sal_address_get_port_int(const SalAddress *uri) { - const char* port = sal_address_get_port(uri); - if (port != NULL) { - return atoi(port); - } else { - return 5060; - } -} -SalTransport sal_address_get_transport(const SalAddress* addr) { - const osip_from_t *u=(const osip_from_t*)addr; - osip_uri_param_t *transport_param=NULL; - osip_uri_uparam_get_byname(u->url,"transport",&transport_param); - if (transport_param == NULL){ - return SalTransportUDP; - } else { - return sal_transport_parse(transport_param->gvalue); - } -} -void sal_address_set_transport(SalAddress* addr,SalTransport transport) { - sal_address_set_param(addr, "transport", sal_transport_to_string(transport)); -} - -/* sends a reinvite. Local media description may have changed by application since call establishment*/ -int sal_call_update(SalOp *h, const char *subject){ - int err=0; - osip_message_t *reinvite=NULL; - - eXosip_lock(); - if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){ - eXosip_unlock(); - return -1; - } - eXosip_unlock(); - osip_message_set_subject(reinvite,subject); - osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO"); - if (h->base.contact){ - _osip_list_set_empty(&reinvite->contacts,(void (*)(void*))osip_contact_free); - osip_message_set_contact(reinvite,h->base.contact); - } - if (h->base.root->session_expires!=0){ - osip_message_set_header(reinvite, "Session-expires", "200"); - osip_message_set_supported(reinvite, "timer"); - } - if (h->base.local_media){ - h->sdp_offering=TRUE; - set_sdp_from_desc(reinvite,h->base.local_media); - }else h->sdp_offering=FALSE; - eXosip_lock(); - err = eXosip_call_send_request(h->did, reinvite); - eXosip_unlock(); - return err; -} -void sal_reuse_authorization(Sal *ctx, bool_t value) { - ctx->reuse_authorization=value; -} +static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; + +static void text_received(Sal *sal, eXosip_event_t *ev){ + osip_body_t *body=NULL; + char *from=NULL,*msg=NULL; + osip_content_type_t* content_type; + osip_uri_param_t* external_body_url; + char unquoted_external_body_url [256]; + int external_body_size=0; + SalMessage salmsg; + char message_id[256]={0}; + osip_header_t *date=NULL; + struct tm ret={0}; + char tmp1[80]={0}; + char tmp2[80]={0}; + SalOp *op=sal_op_new(sal); + + osip_message_get_date(ev->request,0,&date); + if(date!=NULL){ + int i,j; + sscanf(date->hvalue,"%3c,%d%s%d%d:%d:%d",tmp1,&ret.tm_mday,tmp2, + &ret.tm_year,&ret.tm_hour,&ret.tm_min,&ret.tm_sec); + ret.tm_year-=1900; + for(i=0;i<7;i++) { + if(strcmp(tmp1,days[i])==0) ret.tm_wday=i; + } + for(j=0;j<12;j++) { + if(strcmp(tmp2,months[j])==0) ret.tm_mon=j; + } + }else ms_warning("No date header in SIP MESSAGE, we don't know when it was sent."); + + + content_type= osip_message_get_content_type(ev->request); + if (!content_type) { + ms_error("Could not get message because no content type"); + return; + } + osip_from_to_str(ev->request->from,&from); + if (content_type->type + && strcmp(content_type->type, "text")==0 + && content_type->subtype + && strcmp(content_type->subtype, "plain")==0 ) { + osip_message_get_body(ev->request,0,&body); + if (body==NULL){ + ms_error("Could not get text message from SIP body"); + osip_free(from); + return; + } + msg=body->body; + }else if (content_type->type + && strcmp(content_type->type, "message")==0 + && content_type->subtype + && strcmp(content_type->subtype, "external-body")==0 ) { + + osip_content_type_param_get_byname(content_type, "URL", &external_body_url); + /*remove both first and last character*/ + strncpy(unquoted_external_body_url + ,&external_body_url->gvalue[1] + ,external_body_size=MIN(strlen(external_body_url->gvalue)-1,sizeof(unquoted_external_body_url))); + unquoted_external_body_url[external_body_size-1]='\0'; + } else { + ms_warning("Unsupported content type [%s/%s]",content_type->type,content_type->subtype); + osip_free(from); + return; + } + sal_op_set_custom_header(op,sal_exosip_get_custom_headers(ev->request)); + + snprintf(message_id,sizeof(message_id)-1,"%s%s",ev->request->call_id->number,ev->request->cseq->number); + + salmsg.from=from; + salmsg.text=msg; + salmsg.url=external_body_size>0 ? unquoted_external_body_url : NULL; + salmsg.message_id=message_id; + salmsg.time=date!=NULL ? mktime(&ret) : time(NULL); + sal->callbacks.text_received(op,&salmsg); + sal_op_release(op); + osip_free(from); +} + + + +static void other_request(Sal *sal, eXosip_event_t *ev){ + ms_message("in other_request"); + if (ev->request==NULL) return; + if (strcmp(ev->request->sip_method,"MESSAGE")==0){ + text_received(sal,ev); + eXosip_message_send_answer(ev->tid,200,NULL); + }else if (strcmp(ev->request->sip_method,"OPTIONS")==0){ + osip_message_t *options=NULL; + eXosip_options_build_answer(ev->tid,200,&options); + fill_options_answer(options); + eXosip_options_send_answer(ev->tid,200,options); + }else if (strncmp(ev->request->sip_method, "REFER", 5) == 0){ + ms_message("Receiving REFER request !"); + if (comes_from_local_if(ev->request)) { + process_refer(sal,NULL,ev); + }else ms_warning("Ignored REFER not coming from this local loopback interface."); + }else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){ + inc_update(sal,ev); + }else { + char *tmp=NULL; + size_t msglen=0; + osip_message_to_str(ev->request,&tmp,&msglen); + if (tmp){ + ms_message("Unsupported request received:\n%s",tmp); + osip_free(tmp); + } + /*answer with a 501 Not implemented*/ + eXosip_message_send_answer(ev->tid,501,NULL); + } +} + +static void masquerade_via(osip_message_t *msg, const char *ip, const char *port){ + osip_via_t *via=NULL; + osip_message_get_via(msg,0,&via); + if (via){ + osip_free(via->port); + via->port=osip_strdup(port); + osip_free(via->host); + via->host=osip_strdup(ip); + } +} + + +static bool_t fix_message_contact(SalOp *op, osip_message_t *request,osip_message_t *last_answer, bool_t expire_last_contact) { + osip_contact_t *ctt=NULL; + const char *received; + int rport; + SalTransport transport; + char port[20]; + + if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE; + osip_message_get_contact(request,0,&ctt); + if (ctt == NULL) { + ms_warning("fix_message_contact(): no contact to update"); + return FALSE; + } + if (expire_last_contact){ + osip_contact_t *oldct=NULL,*prevct; + osip_generic_param_t *param=NULL; + osip_contact_clone(ctt,&oldct); + while ((prevct=(osip_contact_t*)osip_list_get(&request->contacts,1))!=NULL){ + osip_contact_free(prevct); + osip_list_remove(&request->contacts,1); + } + osip_list_add(&request->contacts,oldct,1); + osip_contact_param_get_byname(oldct,"expires",¶m); + if (param){ + if (param->gvalue) osip_free(param->gvalue); + param->gvalue=osip_strdup("0"); + }else{ + osip_contact_param_add(oldct,osip_strdup("expires"),osip_strdup("0")); + } + } + if (ctt->url->host!=NULL){ + osip_free(ctt->url->host); + } + ctt->url->host=osip_strdup(received); + if (ctt->url->port!=NULL){ + osip_free(ctt->url->port); + } + snprintf(port,sizeof(port),"%i",rport); + ctt->url->port=osip_strdup(port); + if (op->masquerade_via) masquerade_via(request,received,port); + + if (transport != SalTransportUDP) { + sal_address_set_param((SalAddress *)ctt, "transport", sal_transport_to_string(transport)); + } + return TRUE; +} + +static bool_t register_again_with_updated_contact(SalOp *op, osip_message_t *orig_request, osip_message_t *last_answer){ + osip_contact_t *ctt=NULL; + SalAddress* ori_contact_address=NULL; + const char *received; + int rport; + SalTransport transport; + char* tmp; + osip_message_t *msg=NULL; + Sal* sal=op->base.root; + int i=0; + bool_t found_valid_contact=FALSE; + bool_t from_request=FALSE; + + if (sal->double_reg==FALSE ) return FALSE; + + if (extract_received_rport(last_answer,&received,&rport,&transport)==-1) return FALSE; + do{ + ctt=NULL; + osip_message_get_contact(last_answer,i,&ctt); + if (!from_request && ctt==NULL) { + osip_message_get_contact(orig_request,0,&ctt); + from_request=TRUE; + } + if (ctt){ + osip_contact_to_str(ctt,&tmp); + ori_contact_address = sal_address_new(tmp); + + /*check if contact is up to date*/ + if (strcmp(sal_address_get_domain(ori_contact_address),received) ==0 + && sal_address_get_port_int(ori_contact_address) == rport + && sal_address_get_transport(ori_contact_address) == transport) { + if (!from_request){ + ms_message("Register response has up to date contact, doing nothing."); + }else { + ms_warning("Register response does not have up to date contact, but last request had." + "Stupid registrar detected, giving up."); + } + found_valid_contact=TRUE; + } + osip_free(tmp); + sal_address_destroy(ori_contact_address); + }else break; + i++; + }while(!found_valid_contact); + if (!found_valid_contact) + ms_message("Contact do not match, resending register."); + else return FALSE; + + eXosip_lock(); + eXosip_register_build_register(op->rid,op->expires,&msg); + if (msg==NULL){ + eXosip_unlock(); + ms_warning("Fail to create a contact updated register."); + return FALSE; + } + if (fix_message_contact(op,msg,last_answer,op->base.root->expire_old_contact)) { + eXosip_register_send_register(op->rid,msg); + eXosip_unlock(); + ms_message("Resending new register with updated contact"); + update_contact_from_response(op,last_answer); + return TRUE; + } else { + ms_warning("Fail to send updated register."); + eXosip_unlock(); + return FALSE; + } + eXosip_unlock(); + return FALSE; +} + +static void registration_success(Sal *sal, eXosip_event_t *ev){ + SalOp *op=sal_find_register(sal,ev->rid); + osip_header_t *h=NULL; + bool_t registered; + if (op==NULL){ + ms_error("Receiving register response for unknown operation"); + return; + } + osip_message_get_expires(ev->request,0,&h); + if (h!=NULL && atoi(h->hvalue)!=0){ + registered=TRUE; + if (!register_again_with_updated_contact(op,ev->request,ev->response)){ + sal->callbacks.register_success(op,registered); + } + }else { + sal->callbacks.register_success(op,FALSE); + } +} + +static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){ + int status_code=0; + const char *reason=NULL; + SalOp *op=sal_find_register(sal,ev->rid); + SalReason sr=SalReasonUnknown; + SalError se=SalErrorUnknown; + + if (op==NULL){ + ms_error("Receiving register failure for unknown operation"); + return TRUE; + } + if (ev->response){ + status_code=osip_message_get_status_code(ev->response); + reason=osip_message_get_reason_phrase(ev->response); + } + switch(status_code){ + case 401: + case 407: + return process_authentication(sal,ev); + break; + case 423: /*interval too brief*/ + {/*retry with greater interval */ + osip_header_t *h=NULL; + osip_message_t *msg=NULL; + osip_message_header_get_byname(ev->response,"min-expires",0,&h); + if (h && h->hvalue && h->hvalue[0]!='\0'){ + int val=atoi(h->hvalue); + if (val>op->expires) + op->expires=val; + }else op->expires*=2; + eXosip_lock(); + eXosip_register_build_register(op->rid,op->expires,&msg); + eXosip_register_send_register(op->rid,msg); + eXosip_unlock(); + } + break; + case 606: /*Not acceptable, workaround for proxies that don't like private addresses + in vias, such as ekiga.net + On the opposite, freephonie.net bugs when via are masqueraded. + */ + op->masquerade_via=TRUE; + default: + /* if contact is up to date, process the failure, otherwise resend a new register with + updated contact first, just in case the faillure is due to incorrect contact */ + if (ev->response && register_again_with_updated_contact(op,ev->request,ev->response)) + return TRUE; /*we are retrying with an updated contact*/ + if (status_code==403){ + se=SalErrorFailure; + sr=SalReasonForbidden; + }else if (status_code==0){ + se=SalErrorNoResponse; + } + sal->callbacks.register_failure(op,se,sr,reason); + } + return TRUE; +} + +static void other_request_reply(Sal *sal,eXosip_event_t *ev){ + SalOp *op=find_op(sal,ev); + if (op==NULL){ + ms_warning("other_request_reply(): Receiving response to unknown request."); + return; + } + if (ev->response){ + ms_message("Processing reponse status [%i] for method [%s]",ev->response->status_code,osip_message_get_method(ev->request)); + update_contact_from_response(op,ev->response); + if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0) + sal->callbacks.ping_reply(op); + } + if (ev->request && strcmp(osip_message_get_method(ev->request),"MESSAGE")==0) { + /*out of call message acknolegment*/ + SalTextDeliveryStatus status=SalTextDeliveryFailed; + if (ev->response){ + if (ev->response->status_code<200){ + status=SalTextDeliveryInProgress; + }else if (ev->response->status_code<300 && ev->response->status_code>=200){ + status=SalTextDeliveryDone; + } + } + sal->callbacks.text_delivery_update(op,status); + } +} + +static void process_in_call_reply(Sal *sal, eXosip_event_t *ev){ + SalOp *op=find_op(sal,ev); + if (ev->response){ + if (ev->request && strcmp(osip_message_get_method(ev->request),"NOTIFY")==0){ + if (op->sipfrag_pending){ + send_notify_for_refer(op->did,op->sipfrag_pending); + op->sipfrag_pending=NULL; + } + } + } +} + +static bool_t process_event(Sal *sal, eXosip_event_t *ev){ + ms_message("linphone process event get a message %d\n",ev->type); + switch(ev->type){ + case EXOSIP_CALL_ANSWERED: + ms_message("CALL_ANSWERED\n"); + call_accepted(sal,ev); + authentication_ok(sal,ev); + break; + case EXOSIP_CALL_CLOSED: + case EXOSIP_CALL_CANCELLED: + ms_message("CALL_CLOSED or CANCELLED\n"); + call_terminated(sal,ev); + break; + case EXOSIP_CALL_TIMEOUT: + case EXOSIP_CALL_NOANSWER: + ms_message("CALL_TIMEOUT or NOANSWER\n"); + return call_failure(sal,ev); + break; + case EXOSIP_CALL_REQUESTFAILURE: + case EXOSIP_CALL_GLOBALFAILURE: + case EXOSIP_CALL_SERVERFAILURE: + ms_message("CALL_REQUESTFAILURE or GLOBALFAILURE or SERVERFAILURE\n"); + return call_failure(sal,ev); + break; + case EXOSIP_CALL_RELEASED: + ms_message("CALL_RELEASED\n"); + call_released(sal, ev); + break; + case EXOSIP_CALL_INVITE: + ms_message("CALL_NEW\n"); + inc_new_call(sal,ev); + break; + case EXOSIP_CALL_REINVITE: + handle_reinvite(sal,ev); + break; + case EXOSIP_CALL_ACK: + ms_message("CALL_ACK"); + handle_ack(sal,ev); + break; + case EXOSIP_CALL_REDIRECTED: + ms_message("CALL_REDIRECTED"); + eXosip_default_action(ev); + break; + case EXOSIP_CALL_PROCEEDING: + ms_message("CALL_PROCEEDING"); + call_proceeding(sal,ev); + break; + case EXOSIP_CALL_RINGING: + ms_message("CALL_RINGING"); + call_ringing(sal,ev); + authentication_ok(sal,ev); + break; + case EXOSIP_CALL_MESSAGE_NEW: + ms_message("EXOSIP_CALL_MESSAGE_NEW"); + call_message_new(sal,ev); + break; + case EXOSIP_CALL_MESSAGE_REQUESTFAILURE: + if (ev->response && + (ev->response->status_code==407 || ev->response->status_code==401)){ + return process_authentication(sal,ev); + } + break; + case EXOSIP_CALL_MESSAGE_ANSWERED: + ms_message("EXOSIP_CALL_MESSAGE_ANSWERED "); + process_in_call_reply(sal,ev); + break; + case EXOSIP_IN_SUBSCRIPTION_NEW: + ms_message("CALL_IN_SUBSCRIPTION_NEW "); + sal_exosip_subscription_recv(sal,ev); + break; + case EXOSIP_IN_SUBSCRIPTION_RELEASED: + ms_message("CALL_SUBSCRIPTION_NEW "); + sal_exosip_in_subscription_closed(sal,ev); + break; + case EXOSIP_SUBSCRIPTION_UPDATE: + ms_message("CALL_SUBSCRIPTION_UPDATE"); + break; + case EXOSIP_SUBSCRIPTION_NOTIFY: + ms_message("CALL_SUBSCRIPTION_NOTIFY"); + sal_exosip_notify_recv(sal,ev); + break; + case EXOSIP_SUBSCRIPTION_ANSWERED: + ms_message("EXOSIP_SUBSCRIPTION_ANSWERED, ev->sid=%i, ev->did=%i\n",ev->sid,ev->did); + sal_exosip_subscription_answered(sal,ev); + break; + case EXOSIP_SUBSCRIPTION_CLOSED: + ms_message("EXOSIP_SUBSCRIPTION_CLOSED\n"); + sal_exosip_subscription_closed(sal,ev); + break; + case EXOSIP_SUBSCRIPTION_REQUESTFAILURE: /**< announce a request failure */ + if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){ + return process_authentication(sal,ev); + } + case EXOSIP_SUBSCRIPTION_SERVERFAILURE: + case EXOSIP_SUBSCRIPTION_GLOBALFAILURE: + sal_exosip_subscription_closed(sal,ev); + break; + case EXOSIP_REGISTRATION_FAILURE: + ms_message("REGISTRATION_FAILURE\n"); + return registration_failure(sal,ev); + break; + case EXOSIP_REGISTRATION_SUCCESS: + authentication_ok(sal,ev); + registration_success(sal,ev); + break; + case EXOSIP_MESSAGE_NEW: + other_request(sal,ev); + break; + case EXOSIP_MESSAGE_PROCEEDING: + case EXOSIP_MESSAGE_ANSWERED: + case EXOSIP_MESSAGE_REDIRECTED: + case EXOSIP_MESSAGE_SERVERFAILURE: + case EXOSIP_MESSAGE_GLOBALFAILURE: + other_request_reply(sal,ev); + break; + case EXOSIP_MESSAGE_REQUESTFAILURE: + case EXOSIP_NOTIFICATION_REQUESTFAILURE: + if (ev->response) { + switch (ev->response->status_code) { + case 407: + case 401: + return process_authentication(sal,ev); + case 412: { + eXosip_automatic_action (); + return 1; + } + } + } + other_request_reply(sal,ev); + break; + default: + ms_message("Unhandled exosip event ! %i",ev->type); + break; + } + return TRUE; +} + +int sal_iterate(Sal *sal){ + eXosip_event_t *ev; + while((ev=eXosip_event_wait(0,0))!=NULL){ + if (process_event(sal,ev)) + eXosip_event_free(ev); + } +#ifdef HAVE_EXOSIP_TRYLOCK + if (eXosip_trylock()==0){ + eXosip_automatic_refresh(); + eXosip_unlock(); + }else{ + ms_warning("eXosip_trylock busy."); + } +#else + eXosip_lock(); + eXosip_automatic_refresh(); + eXosip_unlock(); +#endif + return 0; +} + +static void register_set_contact(osip_message_t *msg, const char *contact){ + osip_uri_param_t *param = NULL; + osip_contact_t *ct=NULL; + char *line=NULL; + /*we get the line parameter choosed by exosip, and add it to our own contact*/ + osip_message_get_contact(msg,0,&ct); + if (ct!=NULL){ + osip_uri_uparam_get_byname(ct->url, "line", ¶m); + if (param && param->gvalue) + line=osip_strdup(param->gvalue); + } + _osip_list_set_empty(&msg->contacts,(void (*)(void*))osip_contact_free); + osip_message_set_contact(msg,contact); + osip_message_get_contact(msg,0,&ct); + osip_uri_uparam_add(ct->url,osip_strdup("line"),line); +} + +static void sal_register_add_route(osip_message_t *msg, const char *proxy){ + osip_route_t *route; + + osip_list_special_free(&msg->routes,(void (*)(void*))osip_route_free); + + osip_route_init(&route); + if (osip_route_parse(route,proxy)==0){ + osip_uri_param_t *lr_param = NULL; + osip_uri_uparam_get_byname(route->url, "lr", &lr_param); + if (lr_param == NULL){ + osip_uri_uparam_add(route->url,osip_strdup("lr"),NULL); + } + osip_list_add(&msg->routes,route,0); + return; + } + osip_route_free(route); +} + + +int sal_register(SalOp *h, const char *proxy, const char *from, int expires){ + osip_message_t *msg; + const char *contact=sal_op_get_contact(h); + + sal_op_set_route(h,proxy); + if (h->rid==-1){ + SalAddress *from_parsed=sal_address_new(from); + char domain[256]; + char *uri, *domain_ptr = NULL; + if (from_parsed==NULL) { + ms_warning("sal_register() bad from %s",from); + return -1; + } + /* Get domain using sal_address_as_string_uri_only() and stripping the username part instead of + using sal_address_get_domain() because to have a properly formatted domain with IPv6 proxy addresses. */ + uri = sal_address_as_string_uri_only(from_parsed); + if (uri) domain_ptr = strchr(uri, '@'); + if (domain_ptr) { + snprintf(domain,sizeof(domain),"sip:%s",domain_ptr+1); + } else { + snprintf(domain,sizeof(domain),"sip:%s",sal_address_get_domain(from_parsed)); + } + if (uri) ms_free(uri); + sal_address_destroy(from_parsed); + eXosip_lock(); + h->rid=eXosip_register_build_initial_register(from,domain,NULL,expires,&msg); + if (msg){ + if (contact) register_set_contact(msg,contact); + sal_register_add_route(msg,proxy); + sal_add_register(h->base.root,h); + }else{ + ms_error("Could not build initial register."); + eXosip_unlock(); + return -1; + } + }else{ + eXosip_lock(); + eXosip_register_build_register(h->rid,expires,&msg); + sal_register_add_route(msg,proxy); + } + if (msg){ + eXosip_register_send_register(h->rid,msg); + } + eXosip_unlock(); + h->expires=expires; + return (msg != NULL) ? 0 : -1; +} + +int sal_register_refresh(SalOp *op, int expires){ + osip_message_t *msg=NULL; + const char *contact=sal_op_get_contact(op); + + if (op->rid==-1){ + ms_error("Unexistant registration context, not possible to refresh."); + return -1; + } +#ifdef HAVE_EXOSIP_TRYLOCK + { + int tries=0; + /*iOS hack: in the keep alive handler, we have no more than 10 seconds to refresh registers, otherwise the application is suspended forever. + * In order to prevent this case that can occur when the exosip thread is busy with DNS while network isn't in a good shape, we try to take + * the exosip lock in a non blocking way, and give up if it takes too long*/ + while (eXosip_trylock()!=0){ + ms_usleep(100000); + if (tries>30) {/*after 3 seconds, give up*/ + ms_warning("Could not obtain exosip lock in a reasonable time, giving up."); + return -1; + } + } + } +#else + eXosip_lock(); +#endif + eXosip_register_build_register(op->rid,expires,&msg); + if (msg!=NULL){ + if (contact) register_set_contact(msg,contact); + sal_register_add_route(msg,sal_op_get_route(op)); + eXosip_register_send_register(op->rid,msg); + }else ms_error("Could not build REGISTER refresh message."); + eXosip_unlock(); + return (msg != NULL) ? 0 : -1; +} + + +int sal_unregister(SalOp *h){ + osip_message_t *msg=NULL; + eXosip_lock(); + eXosip_register_build_register(h->rid,0,&msg); + if (msg) eXosip_register_send_register(h->rid,msg); + else ms_warning("Could not build unREGISTER !"); + eXosip_unlock(); + return 0; +} + +SalAddress * sal_address_new(const char *uri){ + osip_from_t *from; + osip_from_init(&from); + + // Remove front spaces + while (uri[0]==' ') { + uri++; + } + + if (osip_from_parse(from,uri)!=0){ + osip_from_free(from); + return NULL; + } + if (from->displayname!=NULL && from->displayname[0]=='"'){ + char *unquoted=osip_strdup_without_quote(from->displayname); + osip_free(from->displayname); + from->displayname=unquoted; + } + return (SalAddress*)from; +} + +SalAddress * sal_address_clone(const SalAddress *addr){ + osip_from_t *ret=NULL; + osip_from_clone((osip_from_t*)addr,&ret); + return (SalAddress*)ret; +} + +#define null_if_empty(s) (((s)!=NULL && (s)[0]!='\0') ? (s) : NULL ) + +const char *sal_address_get_scheme(const SalAddress *addr){ + const osip_from_t *u=(const osip_from_t*)addr; + return null_if_empty(u->url->scheme); +} + +const char *sal_address_get_display_name(const SalAddress* addr){ + const osip_from_t *u=(const osip_from_t*)addr; + return null_if_empty(u->displayname); +} + +const char *sal_address_get_username(const SalAddress *addr){ + const osip_from_t *u=(const osip_from_t*)addr; + return null_if_empty(u->url->username); +} + +const char *sal_address_get_domain(const SalAddress *addr){ + const osip_from_t *u=(const osip_from_t*)addr; + return null_if_empty(u->url->host); +} + +void sal_address_set_display_name(SalAddress *addr, const char *display_name){ + osip_from_t *u=(osip_from_t*)addr; + if (u->displayname!=NULL){ + osip_free(u->displayname); + u->displayname=NULL; + } + if (display_name!=NULL && display_name[0]!='\0'){ + u->displayname=osip_strdup(display_name); + } +} + +void sal_address_set_username(SalAddress *addr, const char *username){ + osip_from_t *uri=(osip_from_t*)addr; + if (uri->url->username!=NULL){ + osip_free(uri->url->username); + uri->url->username=NULL; + } + if (username) + uri->url->username=osip_strdup(username); +} + +void sal_address_set_domain(SalAddress *addr, const char *host){ + osip_from_t *uri=(osip_from_t*)addr; + if (uri->url->host!=NULL){ + osip_free(uri->url->host); + uri->url->host=NULL; + } + if (host) + uri->url->host=osip_strdup(host); +} + +void sal_address_set_port(SalAddress *addr, const char *port){ + osip_from_t *uri=(osip_from_t*)addr; + if (uri->url->port!=NULL){ + osip_free(uri->url->port); + uri->url->port=NULL; + } + if (port) + uri->url->port=osip_strdup(port); +} + +void sal_address_set_port_int(SalAddress *uri, int port){ + char tmp[12]; + if (port==5060){ + /*this is the default, special case to leave the port field blank*/ + sal_address_set_port(uri,NULL); + return; + } + snprintf(tmp,sizeof(tmp),"%i",port); + sal_address_set_port(uri,tmp); +} + +void sal_address_clean(SalAddress *addr){ + osip_generic_param_freelist(& ((osip_from_t*)addr)->gen_params); + osip_uri_param_freelist(& ((osip_from_t*)addr)->url->url_params); +} + +char *sal_address_as_string(const SalAddress *u){ + char *tmp,*ret; + osip_from_t *from=(osip_from_t *)u; + char *old_displayname=NULL; + /* hack to force use of quotes around the displayname*/ + if (from->displayname!=NULL + && from->displayname[0]!='"'){ + old_displayname=from->displayname; + from->displayname=osip_enquote(from->displayname); + } + osip_from_to_str(from,&tmp); + if (old_displayname!=NULL){ + ms_free(from->displayname); + from->displayname=old_displayname; + } + ret=ms_strdup(tmp); + osip_free(tmp); + return ret; +} + +char *sal_address_as_string_uri_only(const SalAddress *u){ + char *tmp=NULL,*ret; + osip_uri_to_str(((osip_from_t*)u)->url,&tmp); + ret=ms_strdup(tmp); + osip_free(tmp); + return ret; +} +void sal_address_set_param(SalAddress *u,const char* name,const char* value) { + osip_uri_param_t *param=NULL; + osip_uri_uparam_get_byname(((osip_from_t*)u)->url,(char*)name,¶m); + if (param == NULL){ + osip_uri_uparam_add (((osip_from_t*)u)->url,ms_strdup(name),value ? ms_strdup(value) : NULL); + } else { + osip_free(param->gvalue); + param->gvalue=value ? osip_strdup(value) : NULL; + } + +} + +void sal_address_destroy(SalAddress *u){ + osip_from_free((osip_from_t*)u); +} + +void sal_use_tcp_tls_keepalive(Sal *ctx, bool_t enabled) { + ctx->tcp_tls_keepalive = enabled; +} + +void sal_set_keepalive_period(Sal *ctx,unsigned int value) { + switch (ctx->transport) { + case SalTransportUDP: + ctx->keepalive_period = value; + break; + case SalTransportTCP: + case SalTransportTLS: + if (ctx->tcp_tls_keepalive) ctx->keepalive_period = value; + else ctx->keepalive_period = -1; + break; + default: + break; + } + eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &ctx->keepalive_period); +} +unsigned int sal_get_keepalive_period(Sal *ctx) { + return ctx->keepalive_period; +} + +const char * sal_address_get_port(const SalAddress *addr) { + const osip_from_t *u=(const osip_from_t*)addr; + return null_if_empty(u->url->port); +} + +int sal_address_get_port_int(const SalAddress *uri) { + const char* port = sal_address_get_port(uri); + if (port != NULL) { + return atoi(port); + } else { + return 5060; + } +} +SalTransport sal_address_get_transport(const SalAddress* addr) { + const osip_from_t *u=(const osip_from_t*)addr; + osip_uri_param_t *transport_param=NULL; + osip_uri_uparam_get_byname(u->url,"transport",&transport_param); + if (transport_param == NULL){ + return SalTransportUDP; + } else { + return sal_transport_parse(transport_param->gvalue); + } +} +void sal_address_set_transport(SalAddress* addr,SalTransport transport) { + sal_address_set_param(addr, "transport", sal_transport_to_string(transport)); +} + +/* sends a reinvite. Local media description may have changed by application since call establishment*/ +int sal_call_update(SalOp *h, const char *subject){ + int err=0; + osip_message_t *reinvite=NULL; + + eXosip_lock(); + if(eXosip_call_build_request(h->did,"INVITE",&reinvite) != 0 || reinvite==NULL){ + eXosip_unlock(); + return -1; + } + eXosip_unlock(); + osip_message_set_subject(reinvite,subject); + osip_message_set_allow(reinvite, "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO"); + if (h->base.contact){ + _osip_list_set_empty(&reinvite->contacts,(void (*)(void*))osip_contact_free); + osip_message_set_contact(reinvite,h->base.contact); + } + if (h->base.root->session_expires!=0){ + osip_message_set_header(reinvite, "Session-expires", "200"); + osip_message_set_supported(reinvite, "timer"); + } + if (h->base.local_media){ + h->sdp_offering=TRUE; + set_sdp_from_desc(reinvite,h->base.local_media); + }else h->sdp_offering=FALSE; + eXosip_lock(); + err = eXosip_call_send_request(h->did, reinvite); + eXosip_unlock(); + return err; +} + +void sal_reuse_authorization(Sal *ctx, bool_t value) { + ctx->reuse_authorization=value; +} + +void sal_exosip_add_custom_headers(osip_message_t *msg, SalCustomHeader *ch){ + MSList *elem=(MSList*)ch; + for (;elem!=NULL;elem=elem->next){ + SalCustomHeader *it=(SalCustomHeader*)elem; + osip_message_set_header(msg,it->header_name,it->header_value); + } +} + +SalCustomHeader * sal_exosip_get_custom_headers(osip_message_t *msg){ + int i=0; + osip_header_t *header; + SalCustomHeader *ret=NULL; + + while((header=osip_list_get(&msg->headers,i))!=NULL){ + ret=sal_custom_header_append(ret,header->hname,header->hvalue); + i++; + } + return ret; +} + diff --git a/coreapi/sal_eXosip2.h b/coreapi/sal_eXosip2.h index 81e3ed9a7..68a2d05ef 100644 --- a/coreapi/sal_eXosip2.h +++ b/coreapi/sal_eXosip2.h @@ -94,6 +94,8 @@ void sal_exosip_in_subscription_closed(Sal *sal, eXosip_event_t *ev); SalOp * sal_find_out_subscribe(Sal *sal, int sid); SalOp * sal_find_in_subscribe(Sal *sal, int nid); void sal_exosip_fix_route(SalOp *op); +void sal_exosip_add_custom_headers(osip_message_t *msg, SalCustomHeader *ch); +SalCustomHeader * sal_exosip_get_custom_headers(osip_message_t *msg); void _osip_list_set_empty(osip_list_t *l, void (*freefunc)(void*)); diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index 8156c3839..4e0a9338d 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -94,8 +94,7 @@ static inline char *my_ctime_r(const time_t *t, char *buf){ int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg){ osip_message_t *sip=NULL; - time_t t; - time(&t); + time_t t=time(NULL); char buf[26]; if(op->cid == -1) @@ -111,6 +110,7 @@ int sal_message_send(SalOp *op, const char *from, const char *to, const char* co eXosip_message_build_request(&sip,"MESSAGE",sal_op_get_to(op), sal_op_get_from(op),sal_op_get_route(op)); if (sip!=NULL){ + sal_exosip_add_custom_headers(sip,op->base.custom_headers); osip_message_set_date(sip,my_ctime_r(&t,buf)); osip_message_set_content_type(sip,content_type); if (msg) osip_message_set_body(sip,msg,strlen(msg)); diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 20ff8181f..7dc82920a 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -51,17 +51,19 @@ void linphone_gtk_call_log_update(GtkWidget *w){ for (logs=linphone_core_get_call_logs(linphone_gtk_get_core());logs!=NULL;logs=logs->next){ LinphoneCallLog *cl=(LinphoneCallLog*)logs->data; GtkTreeIter iter; - LinphoneAddress *la=cl->dir==LinphoneCallIncoming ? cl->from : cl->to; + LinphoneAddress *la=linphone_call_log_get_dir(cl)==LinphoneCallIncoming ? linphone_call_log_get_from(cl) : linphone_call_log_get_to(cl); char *addr= linphone_address_as_string_uri_only (la); const char *display; gchar *logtxt, *minutes, *seconds; gchar quality[20]; const char *status=NULL; gchar *start_date=NULL; + time_t start_date_time=linphone_call_log_get_start_date(cl); + int duration=linphone_call_log_get_duration(cl); #if GLIB_CHECK_VERSION(2,26,0) - if (cl->start_date_time){ - GDateTime *dt=g_date_time_new_from_unix_local(cl->start_date_time); + if (start_date_time){ + GDateTime *dt=g_date_time_new_from_unix_local(start_date_time); start_date=g_date_time_format(dt,"%c"); g_date_time_unref(dt); } @@ -73,10 +75,10 @@ void linphone_gtk_call_log_update(GtkWidget *w){ if (display==NULL) display=linphone_address_get_domain (la); } - if (cl->quality!=-1){ - snprintf(quality,sizeof(quality),"%.1f",cl->quality); - } - switch(cl->status){ + if (linphone_call_log_get_quality(cl)!=-1){ + snprintf(quality,sizeof(quality),"%.1f",linphone_call_log_get_quality(cl)); + }else snprintf(quality,sizeof(quality)-1,"%s",_("n/a")); + switch(linphone_call_log_get_status(cl)){ case LinphoneCallAborted: status=_("Aborted"); break; @@ -90,21 +92,21 @@ void linphone_gtk_call_log_update(GtkWidget *w){ break; } minutes=g_markup_printf_escaped( - ngettext("%i minute", "%i minutes", cl->duration/60), - cl->duration/60); + ngettext("%i minute", "%i minutes", duration/60), + duration/60); seconds=g_markup_printf_escaped( - ngettext("%i second", "%i seconds", cl->duration%60), - cl->duration%60); + ngettext("%i second", "%i seconds", duration%60), + duration%60); if (status==NULL) logtxt=g_markup_printf_escaped( _("%s\t%s\t" "Quality: %s\n%s\t%s %s\t"), - display, addr, cl->quality!=-1 ? quality : _("n/a"), - start_date ? start_date : cl->start_date, minutes, seconds); + display, addr, quality , + start_date ? start_date : "", minutes, seconds); else logtxt=g_markup_printf_escaped( _("%s\t%s\t" "\n%s\t%s"), display, addr, - start_date ? start_date : cl->start_date, status); + start_date ? start_date : "", status); g_free(minutes); g_free(seconds); if (start_date) g_free(start_date); @@ -113,7 +115,7 @@ void linphone_gtk_call_log_update(GtkWidget *w){ GdkPixbuf *incoming = create_pixbuf("call_status_incoming.png"); GdkPixbuf *outgoing = create_pixbuf("call_status_outgoing.png"); gtk_list_store_set (store,&iter, - 0, cl->dir==LinphoneCallOutgoing ? outgoing : incoming, + 0, linphone_call_log_get_dir(cl)==LinphoneCallOutgoing ? outgoing : incoming, 1, logtxt,2,la,-1); ms_free(addr); g_free(logtxt); diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 68c86d38a..60aa7cb14 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -101,7 +101,7 @@ static void linphone_gtk_in_call_set_animation_image(GtkWidget *callview, const GList *elem=gtk_container_get_children(GTK_CONTAINER(container)); GtkWidget *image; - if (!is_stock){ + if (!is_stock){ if (image_name==NULL){ gtk_widget_hide(container); } diff --git a/mediastreamer2 b/mediastreamer2 index fd8f21d70..6251dea54 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit fd8f21d7087ed2d5af18e4cd3a7db9bdf0008ed3 +Subproject commit 6251dea54272cf048c580e03a80c67d672367f2a From 21c40caaa3d5babbd2f177a39658d739696321a0 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 7 Feb 2013 11:43:09 +0100 Subject: [PATCH 069/281] custom header api in progress improve documentation and cleanups. --- coreapi/callbacks.c | 2 +- coreapi/chat.c | 161 ++++++++++++++++++++++++++++----- coreapi/linphonecore.h | 125 +++++-------------------- coreapi/private.h | 2 +- coreapi/sal.c | 2 +- coreapi/sal.h | 2 +- coreapi/sal_eXosip2_presence.c | 1 + gtk/calllogs.c | 4 +- 8 files changed, 166 insertions(+), 133 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 6bdecc4b5..1c87f88ce 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -845,7 +845,7 @@ static bool_t is_duplicate_msg(LinphoneCore *lc, const char *msg_id){ static void text_received(SalOp *op, const SalMessage *msg){ LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op)); if (is_duplicate_msg(lc,msg->message_id)==FALSE){ - linphone_core_message_received(lc,msg); + linphone_core_message_received(lc,op,msg); } } diff --git a/coreapi/chat.c b/coreapi/chat.c index 29af16eec..b9894ea8f 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -25,8 +25,19 @@ #include "linphonecore.h" #include "private.h" #include "lpconfig.h" - - LinphoneChatRoom * linphone_core_create_chat_room(LinphoneCore *lc, const char *to){ + +/** + * @addtogroup chatroom + * @{ + */ + +/** + * Create a new chat room for messaging from a sip uri like sip:joe@sip.linphone.org + * @param lc #LinphoneCore object + * @param to destination address for messages + * @return #LinphoneChatRoom where messaging can take place. + */ +LinphoneChatRoom * linphone_core_create_chat_room(LinphoneCore *lc, const char *to){ LinphoneAddress *parsed_url=NULL; if ((parsed_url=linphone_core_interpret_url(lc,to))!=NULL){ @@ -38,16 +49,18 @@ return cr; } return NULL; - } +} - - void linphone_chat_room_destroy(LinphoneChatRoom *cr){ +/** + * Destroy a LinphoneChatRoom. + * @param cr #LinphoneChatRoom object + */ +void linphone_chat_room_destroy(LinphoneChatRoom *cr){ LinphoneCore *lc=cr->lc; lc->chatrooms=ms_list_remove(lc->chatrooms,(void *) cr); linphone_address_destroy(cr->peer_url); ms_free(cr->peer); - } - +} static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatMessage* msg){ const char *route=NULL; @@ -56,7 +69,7 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM LinphoneCall *call; char* content_type; - if (lp_config_get_int(cr->lc->config,"sip","chat_use_call_dialogs",1)){ + if (lp_config_get_int(cr->lc->config,"sip","chat_use_call_dialogs",0)){ if((call = linphone_core_get_call_by_remote_address(cr->lc,cr->peer))!=NULL){ if (call->state==LinphoneCallConnected || call->state==LinphoneCallStreamsRunning || @@ -74,21 +87,30 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM op = sal_op_new(cr->lc->sal); sal_op_set_route(op,route); sal_op_set_user_pointer(op, msg); /*if out of call, directly store msg*/ + if (msg->custom_headers){ + sal_op_set_custom_header(op,msg->custom_headers); + msg->custom_headers=NULL; /*transfered to the SalOp*/ + } } if (msg->external_body_url) { content_type=ms_strdup_printf("message/external-body; access-type=URL; URL=\"%s\"",msg->external_body_url); - sal_message_send(op,identity,cr->peer,content_type,NULL); + sal_message_send(op,identity,cr->peer,content_type, NULL); ms_free(content_type); } else { - sal_text_send(op, identity, cr->peer, msg->message); + sal_text_send(op, identity, cr->peer,msg->message); } - - } +/** + * Send a message to peer member of this chat room. + * @deprecated linphone_chat_room_send_message2() gives more control on the message expedition. + * @param cr #LinphoneChatRoom object + * @param msg message to be sent + */ void linphone_chat_room_send_message(LinphoneChatRoom *cr, const char *msg) { _linphone_chat_room_send_message(cr,linphone_chat_room_create_message(cr,msg)); } + bool_t linphone_chat_room_matches(LinphoneChatRoom *cr, const LinphoneAddress *from){ if (linphone_address_get_username(cr->peer_url) && linphone_address_get_username(from) && strcmp(linphone_address_get_username(cr->peer_url),linphone_address_get_username(from))==0) return TRUE; @@ -103,12 +125,14 @@ void linphone_chat_room_message_received(LinphoneChatRoom *cr, LinphoneCore *lc, } -void linphone_core_message_received(LinphoneCore *lc, const SalMessage *sal_msg){ +void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessage *sal_msg){ MSList *elem; LinphoneChatRoom *cr=NULL; LinphoneAddress *addr; char *cleanfrom; LinphoneChatMessage* msg; + const SalCustomHeader *ch; + addr=linphone_address_new(sal_msg->from); linphone_address_clean(addr); for(elem=lc->chatrooms;elem!=NULL;elem=ms_list_next(elem)){ @@ -126,6 +150,8 @@ void linphone_core_message_received(LinphoneCore *lc, const SalMessage *sal_msg) msg = linphone_chat_room_create_message(cr, sal_msg->text); linphone_chat_message_set_from(msg, cr->peer_url); msg->time=sal_msg->time; + ch=sal_op_get_custom_header(op); + if (ch) msg->custom_headers=sal_custom_header_clone(ch); if (sal_msg->url) { linphone_chat_message_set_external_body_url(msg, sal_msg->url); @@ -135,37 +161,66 @@ void linphone_core_message_received(LinphoneCore *lc, const SalMessage *sal_msg) ms_free(cleanfrom); } +/** + * Returns back pointer to LinphoneCore object. +**/ LinphoneCore* linphone_chat_room_get_lc(LinphoneChatRoom *cr){ return cr->lc; } -LinphoneChatRoom* linphone_chat_message_get_chat_room(LinphoneChatMessage *msg){ - return msg->chat_room; -} - +/** + * Assign a user pointer to the chat room. +**/ void linphone_chat_room_set_user_data(LinphoneChatRoom *cr, void * ud){ cr->user_data=ud; } + +/** + * Retrieve the user pointer associated with the chat room. +**/ void * linphone_chat_room_get_user_data(LinphoneChatRoom *cr){ return cr->user_data; } + +/** + * get peer address \link linphone_core_create_chat_room() associated to \endlink this #LinphoneChatRoom + * @param cr #LinphoneChatRoom object + * @return #LinphoneAddress peer address + */ const LinphoneAddress* linphone_chat_room_get_peer_address(LinphoneChatRoom *cr) { return cr->peer_url; } -LinphoneChatMessage* linphone_chat_room_create_message(const LinphoneChatRoom *cr,const char* message) { +/** + * Create a message attached to a dedicated chat room; + * @param cr the chat room. + * @param message text message, NULL if absent. + * @return a new #LinphoneChatMessage + */ +LinphoneChatMessage* linphone_chat_room_create_message(LinphoneChatRoom *cr, const char* message) { LinphoneChatMessage* msg = ms_new0(LinphoneChatMessage,1); msg->chat_room=(LinphoneChatRoom*)cr; msg->message=message?ms_strdup(message):NULL; return msg; } -void linphone_chat_room_send_message2(LinphoneChatRoom *cr, LinphoneChatMessage* msg,LinphoneChatMessageStateChangeCb status_cb,void* ud) { +/** + * Send a message to peer member of this chat room. + * @param cr #LinphoneChatRoom object + * @param msg #LinphoneChatMessage message to be sent + * @param status_cb LinphoneChatMessageStateChangeCb status callback invoked when message is delivered or could not be delivered. May be NULL + * @param ud user data for the status cb. + * @note The LinphoneChatMessage must not be destroyed until the the callback is called. + */ +void linphone_chat_room_send_message2(LinphoneChatRoom *cr, LinphoneChatMessage* msg,LinphoneChatMessageStateChangeCb status_cb, void* ud) { msg->cb=status_cb; msg->cb_ud=ud; _linphone_chat_room_send_message(cr, msg); } +/** + * Returns a #LinphoneChatMessageState as a string. + */ const char* linphone_chat_message_state_to_string(const LinphoneChatMessageState state) { switch (state) { case LinphoneChatMessageStateIdle:return "LinphoneChatMessageStateIdle"; @@ -177,62 +232,112 @@ const char* linphone_chat_message_state_to_string(const LinphoneChatMessageState } -char* linphone_chat_message_get_message(LinphoneChatMessage* msg) { - return msg->message; +/** + * Returns the chatroom this message belongs to. +**/ +LinphoneChatRoom* linphone_chat_message_get_chat_room(LinphoneChatMessage *msg){ + return msg->chat_room; } +/** + * Returns the peer (remote) address for the message. +**/ const LinphoneAddress* linphone_chat_message_get_peer_address(LinphoneChatMessage *msg) { return linphone_chat_room_get_peer_address(msg->chat_room); } /** - * user pointer set function + *User pointer set function */ void linphone_chat_message_set_user_data(LinphoneChatMessage* message,void* ud) { message->message_userdata=ud; } + /** - * user pointer get function + * User pointer get function */ void* linphone_chat_message_get_user_data(const LinphoneChatMessage* message) { return message->message_userdata; } +/** + * Linphone message can carry external body as defined by rfc2017 + * @param message #LinphoneChatMessage + * @return external body url or NULL if not present. + */ const char* linphone_chat_message_get_external_body_url(const LinphoneChatMessage* message) { return message->external_body_url; } +/** + * Linphone message can carry external body as defined by rfc2017 + * + * @param message a LinphoneChatMessage + * @param url ex: access-type=URL; URL="http://www.foo.com/file" + */ void linphone_chat_message_set_external_body_url(LinphoneChatMessage* message,const char* url) { if (message->external_body_url) { ms_free(message->external_body_url); } message->external_body_url=url?ms_strdup(url):NULL; } + +/** + * Set origin of the message + *@param message #LinphoneChatMessage obj + *@param from #LinphoneAddress origin of this message (copied) + */ void linphone_chat_message_set_from(LinphoneChatMessage* message, const LinphoneAddress* from) { if(message->from) linphone_address_destroy(message->from); message->from=linphone_address_clone(from); - } + +/** + * Get origin of the message + *@param message #LinphoneChatMessage obj + *@return #LinphoneAddress + */ LinphoneAddress* linphone_chat_message_get_from(const LinphoneChatMessage* message) { return message->from; } +/** + * Get the time the message was sent. + */ time_t linphone_chat_message_get_time(const LinphoneChatMessage* message) { return message->time; } +/** + * Get text part of this message + * @return text or NULL if no text. + */ const char * linphone_chat_message_get_text(const LinphoneChatMessage* message) { return message->message; } +/** + * Add custom headers to the message. + * @param message the message + * @param header_name name of the header_name + * @param header_value header value +**/ void linphone_chat_message_add_custom_header(LinphoneChatMessage* message, const char *header_name, const char *header_value){ message->custom_headers=sal_custom_header_append(message->custom_headers,header_name,header_value); } +/** + * Retrieve a custom header value given its name. + * @param message the message + * @param header_name header name searched +**/ const char * linphone_chat_message_get_custom_header(LinphoneChatMessage* message, const char *header_name){ return sal_custom_header_find(message->custom_headers,header_name); } +/** + * Duplicate a LinphoneChatMessage +**/ LinphoneChatMessage* linphone_chat_message_clone(const LinphoneChatMessage* msg) { /*struct _LinphoneChatMessage { char* message; @@ -253,6 +358,9 @@ LinphoneChatMessage* linphone_chat_message_clone(const LinphoneChatMessage* msg) return new_message; } +/** + * Destroys a LinphoneChatMessage. +**/ void linphone_chat_message_destroy(LinphoneChatMessage* msg) { if (msg->message) ms_free(msg->message); if (msg->external_body_url) ms_free(msg->external_body_url); @@ -262,3 +370,8 @@ void linphone_chat_message_destroy(LinphoneChatMessage* msg) { } +/** + * @} + */ + + diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 08c4f89ee..f0b6f3d56 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -644,37 +644,6 @@ typedef struct _LinphoneChatMessage LinphoneChatMessage; */ typedef struct _LinphoneChatRoom LinphoneChatRoom; -/** - * Create a new chat room for messaging from a sip uri like sip:joe@sip.linphone.org - * @param lc #LinphoneCore object - * @param to destination address for messages - * @return #LinphoneChatRoom where messaging can take place. - */ -LinphoneChatRoom * linphone_core_create_chat_room(LinphoneCore *lc, const char *to); -/** - * Destructor - * @param cr #LinphoneChatRoom object - */ -void linphone_chat_room_destroy(LinphoneChatRoom *cr); - -/** - * create a message attached to a dedicated chat room; - */ -LinphoneChatMessage* linphone_chat_room_create_message(const LinphoneChatRoom *cr,const char* message); - - -/** - * get peer address \link linphone_core_create_chat_room() associated to \endlink this #LinphoneChatRoom - * @param cr #LinphoneChatRoom object - * @return #LinphoneAddress peer address - */ -const LinphoneAddress* linphone_chat_room_get_peer_address(LinphoneChatRoom *cr); -/** - * send a message to peer member of this chat room. - * @param cr #LinphoneChatRoom object - * @param msg message to be sent - */ -void linphone_chat_room_send_message(LinphoneChatRoom *cr, const char *msg); /** *LinphoneChatMessageState is used to notify if messages have been succesfully delivered or not. */ @@ -685,69 +654,6 @@ typedef enum _LinphoneChatMessageStates { LinphoneChatMessageStateNotDelivered /**next){ diff --git a/coreapi/sal.h b/coreapi/sal.h index 26efa8115..25d8d20bc 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -465,7 +465,7 @@ struct SalCustomHeader{ SalCustomHeader *sal_custom_header_append(SalCustomHeader *ch, const char *name, const char *value); const char *sal_custom_header_find(const SalCustomHeader *ch, const char *name); void sal_custom_header_free(SalCustomHeader *ch); -SalCustomHeader *sal_custom_header_clone(SalCustomHeader *ch); +SalCustomHeader *sal_custom_header_clone(const SalCustomHeader *ch); const SalCustomHeader *sal_op_get_custom_header(SalOp *op); void sal_op_set_custom_header(SalOp *op, SalCustomHeader* ch); diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index 4e0a9338d..1e49970bf 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -140,6 +140,7 @@ int sal_message_send(SalOp *op, const char *from, const char *to, const char* co } return 0; } + int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg) { return sal_message_send(op,from,to,"text/plain",msg); } diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 7dc82920a..4a9330f4a 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -58,8 +58,8 @@ void linphone_gtk_call_log_update(GtkWidget *w){ gchar quality[20]; const char *status=NULL; gchar *start_date=NULL; - time_t start_date_time=linphone_call_log_get_start_date(cl); int duration=linphone_call_log_get_duration(cl); + time_t start_date_time=linphone_call_log_get_start_date(cl); #if GLIB_CHECK_VERSION(2,26,0) if (start_date_time){ @@ -67,6 +67,8 @@ void linphone_gtk_call_log_update(GtkWidget *w){ start_date=g_date_time_format(dt,"%c"); g_date_time_unref(dt); } +#else + start_date=g_strdup(ctime(start_date_time)); #endif display=linphone_address_get_display_name (la); From f36aac6d38f859aa8bcdb79de32e989ce6a16e31 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 7 Feb 2013 15:15:49 +0100 Subject: [PATCH 070/281] Fix lpconfig in java --- java/impl/org/linphone/core/LpConfigImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/java/impl/org/linphone/core/LpConfigImpl.java b/java/impl/org/linphone/core/LpConfigImpl.java index 27bd63d13..208519955 100644 --- a/java/impl/org/linphone/core/LpConfigImpl.java +++ b/java/impl/org/linphone/core/LpConfigImpl.java @@ -23,6 +23,7 @@ package org.linphone.core; class LpConfigImpl implements LpConfig { private final long nativePtr; + boolean ownPtr = false; public LpConfigImpl(long ptr) { nativePtr=ptr; @@ -32,9 +33,12 @@ class LpConfigImpl implements LpConfig { private native void delete(long ptr); public LpConfigImpl(String file) { nativePtr = newLpConfigImpl(file); + ownPtr = true; } protected void finalize() throws Throwable { - delete(nativePtr); + if(ownPtr) { + delete(nativePtr); + } } private native void setInt(long ptr, String section, String key, int value); From dd9241f226408096224f16df441c1cb67ce8193b Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 7 Feb 2013 15:34:19 +0100 Subject: [PATCH 071/281] add new JNI and java methods. --- .../core/tutorials/TutorialChatRoom.java | 4 +- coreapi/linphonecore_jni.cc | 61 +++++++++++++++++-- .../org/linphone/core/LinphoneCall.java | 11 ++++ .../org/linphone/core/LinphoneCallParams.java | 21 +++++++ .../linphone/core/LinphoneChatMessage.java | 16 ++++- .../org/linphone/core/LinphoneCallImpl.java | 11 ++++ .../linphone/core/LinphoneCallParamsImpl.java | 19 ++++++ .../core/LinphoneChatMessageImpl.java | 17 +++++- 8 files changed, 150 insertions(+), 10 deletions(-) diff --git a/coreapi/help/java/org/linphone/core/tutorials/TutorialChatRoom.java b/coreapi/help/java/org/linphone/core/tutorials/TutorialChatRoom.java index a9134dc88..024927468 100644 --- a/coreapi/help/java/org/linphone/core/tutorials/TutorialChatRoom.java +++ b/coreapi/help/java/org/linphone/core/tutorials/TutorialChatRoom.java @@ -154,13 +154,13 @@ public class TutorialChatRoom implements LinphoneCoreListener, LinphoneChatMessa @Override public void messageReceived(LinphoneCore lc, LinphoneChatRoom cr, LinphoneChatMessage message) { - write("Message [" + message.getMessage() + "] received from [" + message.getFrom().asString() + "]"); + write("Message [" + message.getText() + "] received from [" + message.getFrom().asString() + "]"); } @Override public void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg, org.linphone.core.LinphoneChatMessage.State state) { - write("Sent message [" + msg.getMessage() + "] new state is " + state.toString()); + write("Sent message [" + msg.getText() + "] new state is " + state.toString()); } diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 9629688c7..3cbcf8f79 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1367,7 +1367,7 @@ extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getReceiverLossRa } extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getSenderInterarrivalJitter(JNIEnv *env, jobject thiz, jlong stats_ptr, jlong call_ptr) { LinphoneCallStats *stats = (LinphoneCallStats *)stats_ptr; - const LinphoneCall *call = (LinphoneCall *)call_ptr; + LinphoneCall *call = (LinphoneCall *)call_ptr; const LinphoneCallParams *params; const PayloadType *pt; const report_block_t *srb = NULL; @@ -1396,7 +1396,7 @@ extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getSenderInterarr } extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getReceiverInterarrivalJitter(JNIEnv *env, jobject thiz, jlong stats_ptr, jlong call_ptr) { LinphoneCallStats *stats = (LinphoneCallStats *)stats_ptr; - const LinphoneCall *call = (LinphoneCall *)call_ptr; + LinphoneCall *call = (LinphoneCall *)call_ptr; const LinphoneCallParams *params; const PayloadType *pt; const report_block_t *rrb = NULL; @@ -1671,12 +1671,32 @@ extern "C" void Java_org_linphone_core_LinphoneChatMessageImpl_setUserData(JNIEn jobject ud = env->NewGlobalRef(thiz); linphone_chat_message_set_user_data((LinphoneChatMessage*)ptr,(void*) ud); } -extern "C" jstring Java_org_linphone_core_LinphoneChatMessageImpl_getMessage(JNIEnv* env +extern "C" jstring Java_org_linphone_core_LinphoneChatMessageImpl_getText(JNIEnv* env ,jobject thiz ,jlong ptr) { - jstring jvalue =env->NewStringUTF(linphone_chat_message_get_message((LinphoneChatMessage*)ptr)); + jstring jvalue =env->NewStringUTF(linphone_chat_message_get_text((LinphoneChatMessage*)ptr)); return jvalue; } + +extern "C" jstring Java_org_linphone_core_LinphoneChatMessageImpl_getCustomHeader(JNIEnv* env + ,jobject thiz + ,jlong ptr, jstring jheader_name) { + const char *name=env->GetStringUTFChars(jheader_name,NULL); + const char *value=linphone_chat_message_get_custom_header((LinphoneChatMessage*)ptr,name); + env->ReleaseStringUTFChars(jheader_name, name); + return value ? env->NewStringUTF(value) : NULL; +} + +extern "C" void Java_org_linphone_core_LinphoneChatMessageImpl_addCustomHeader(JNIEnv* env + ,jobject thiz + ,jlong ptr, jstring jheader_name, jstring jheader_value) { + const char *name=env->GetStringUTFChars(jheader_name,NULL); + const char *value=env->GetStringUTFChars(jheader_value,NULL); + linphone_chat_message_add_custom_header((LinphoneChatMessage*)ptr,name,value); + env->ReleaseStringUTFChars(jheader_name, name); + env->ReleaseStringUTFChars(jheader_name, name); +} + extern "C" jstring Java_org_linphone_core_LinphoneChatMessageImpl_getExternalBodyUrl(JNIEnv* env ,jobject thiz ,jlong ptr) { @@ -1696,11 +1716,13 @@ extern "C" jlong Java_org_linphone_core_LinphoneChatMessageImpl_getFrom(JNIEnv* ,jlong ptr) { return (jlong) linphone_chat_message_get_from((LinphoneChatMessage*)ptr); } + extern "C" jlong Java_org_linphone_core_LinphoneChatMessageImpl_getPeerAddress(JNIEnv* env ,jobject thiz ,jlong ptr) { return (jlong) linphone_chat_message_get_peer_address((LinphoneChatMessage*)ptr); } + extern "C" void Java_org_linphone_core_LinphoneChatRoomImpl_sendMessage(JNIEnv* env ,jobject thiz ,jlong ptr @@ -1847,6 +1869,29 @@ extern "C" jboolean Java_org_linphone_core_LinphoneCallParamsImpl_localConferenc return (jboolean)linphone_call_params_local_conference_mode((LinphoneCallParams*)lcp); } +extern "C" jstring Java_org_linphone_core_LinphoneCallParamsImpl_getCustomHeader(JNIEnv *env, jobject thiz, jlong lcp, jstring jheader_name){ + const char* header_name=env->GetStringUTFChars(jheader_name, NULL); + const char *header_value=linphone_call_params_get_custom_header((LinphoneCallParams*)lcp,header_name); + env->ReleaseStringUTFChars(jheader_name, header_name); + return header_value ? env->NewStringUTF(header_value) : NULL; +} + +extern "C" void Java_org_linphone_core_LinphoneCallParamsImpl_setCustomHeader(JNIEnv *env, jobject thiz, jlong lcp, jstring jheader_name, jstring jheader_value){ + const char* header_name=env->GetStringUTFChars(jheader_name, NULL); + const char* header_value=env->GetStringUTFChars(jheader_value, NULL); + linphone_call_params_add_custom_header((LinphoneCallParams*)lcp,header_name,header_value); + env->ReleaseStringUTFChars(jheader_name, header_name); + env->ReleaseStringUTFChars(jheader_value, header_value); +} + +extern "C" void Java_org_linphone_core_LinphoneCallParamsImpl_setRecordFile(JNIEnv *env, jobject thiz, jlong lcp, jstring jrecord_file){ + if (jrecord_file){ + const char* record_file=env->GetStringUTFChars(jrecord_file, NULL); + linphone_call_params_set_record_file((LinphoneCallParams*)lcp,record_file); + env->ReleaseStringUTFChars(jrecord_file, record_file); + }else linphone_call_params_set_record_file((LinphoneCallParams*)lcp,NULL); +} + extern "C" void Java_org_linphone_core_LinphoneCallParamsImpl_destroy(JNIEnv *env, jobject thiz, jlong lc){ return linphone_call_params_destroy((LinphoneCallParams*)lc); } @@ -1873,6 +1918,14 @@ extern "C" jboolean Java_org_linphone_core_LinphoneCallImpl_cameraEnabled(JNIEnv return (jboolean)linphone_call_camera_enabled((LinphoneCall *)lc); } +extern "C" void Java_org_linphone_core_LinphoneCallImpl_startRecording(JNIEnv *env, jobject thiz, jlong lc){ + linphone_call_start_recording((LinphoneCall *)lc); +} + +extern "C" void Java_org_linphone_core_LinphoneCallImpl_stopRecording(JNIEnv *env, jobject thiz, jlong lc){ + linphone_call_stop_recording((LinphoneCall *)lc); +} + extern "C" jobject Java_org_linphone_core_LinphoneCoreImpl_inviteAddressWithParams(JNIEnv *env, jobject thiz, jlong lc, jlong addr, jlong params){ LinphoneCoreData *lcd=(LinphoneCoreData*)linphone_core_get_user_data((LinphoneCore*)lc); return lcd->getCall(env,linphone_core_invite_address_with_params((LinphoneCore *)lc, (const LinphoneAddress *)addr, (const LinphoneCallParams *)params)); diff --git a/java/common/org/linphone/core/LinphoneCall.java b/java/common/org/linphone/core/LinphoneCall.java index 79f38633b..893572e2e 100644 --- a/java/common/org/linphone/core/LinphoneCall.java +++ b/java/common/org/linphone/core/LinphoneCall.java @@ -281,4 +281,15 @@ public interface LinphoneCall { * Scale the video by factor, and center it using cx,cy point */ void zoomVideo(float factor, float cx, float cy); + + /** + * Start call recording. + * A file path must be provided with LinphoneCallParams.setRecordFile() at call establishement for this method to work. + */ + void startRecording(); + + /** + * Stop call recording. + */ + void stopRecording(); } diff --git a/java/common/org/linphone/core/LinphoneCallParams.java b/java/common/org/linphone/core/LinphoneCallParams.java index f8c7c097f..b6d5ef33d 100644 --- a/java/common/org/linphone/core/LinphoneCallParams.java +++ b/java/common/org/linphone/core/LinphoneCallParams.java @@ -72,4 +72,25 @@ public interface LinphoneCallParams { * @return true if low bandwidth has been configured/detected */ boolean isLowBandwidthEnabled(); + + /** + * Set a path to file where the call will be recorded. + * Actual start of the recording is controlled by LinphoneCall.startRecording(). + **/ + void setRecordFile(String path); + + /** + * Add a custom header to be used for the call for which these call params are used. + * @param name header name + * @param value header value + */ + void addCustomHeader(String name, String value); + + /** + * Returns the value of a custom header given its name. + * If no header with that name exists, then null is returned. + * @param name + * @return value for the header, or null if it doesn't exist. + */ + String getCustomHeader(String name); } diff --git a/java/common/org/linphone/core/LinphoneChatMessage.java b/java/common/org/linphone/core/LinphoneChatMessage.java index d403d94bd..3a2a45718 100644 --- a/java/common/org/linphone/core/LinphoneChatMessage.java +++ b/java/common/org/linphone/core/LinphoneChatMessage.java @@ -63,7 +63,7 @@ public interface LinphoneChatMessage { * * @return text sent along with the message */ - String getMessage(); + String getText(); /** * get peer address associated to this LinphoneChatMessage @@ -92,4 +92,18 @@ public interface LinphoneChatMessage { * @param url ex: access-type=URL; URL="http://www.foo.com/file" */ void setExternalBodyUrl(String url); + + /** + * Add a custom header into the message. + * @param name + * @param value + */ + void addCustomHeader(String name, String value); + + /** + * Obtain a header value. + * @param name + * @return the value of the header, or null if not found. + */ + String getCustomHeader(String name); } diff --git a/java/impl/org/linphone/core/LinphoneCallImpl.java b/java/impl/org/linphone/core/LinphoneCallImpl.java index 45c905dbb..30bcd528f 100644 --- a/java/impl/org/linphone/core/LinphoneCallImpl.java +++ b/java/impl/org/linphone/core/LinphoneCallImpl.java @@ -194,4 +194,15 @@ class LinphoneCallImpl implements LinphoneCall { public void zoomVideo(float factor, float cx, float cy) { zoomVideo(nativePtr, factor, cx, cy); } + + private native void startRecording(long nativePtr); + @Override + public void startRecording() { + startRecording(nativePtr); + } + private native void stopRecording(long nativePtr); + @Override + public void stopRecording() { + stopRecording(nativePtr); + } } diff --git a/java/impl/org/linphone/core/LinphoneCallParamsImpl.java b/java/impl/org/linphone/core/LinphoneCallParamsImpl.java index ca41f6ecb..83cc95f54 100644 --- a/java/impl/org/linphone/core/LinphoneCallParamsImpl.java +++ b/java/impl/org/linphone/core/LinphoneCallParamsImpl.java @@ -88,4 +88,23 @@ public class LinphoneCallParamsImpl implements LinphoneCallParams { public boolean isLowBandwidthEnabled() { return isLowBandwidthEnabled(nativePtr); } + + private native void setRecordFile(long nativePtr, String path); + @Override + public void setRecordFile(String path) { + setRecordFile(nativePtr,path); + } + + private native void addCustomHeader(long nativePtr, String name, String value); + @Override + public void addCustomHeader(String name, String value) { + addCustomHeader(nativePtr,name,value); + } + + private native String getCustomHeader(long nativePtr, String name); + @Override + public String getCustomHeader(String name) { + return getCustomHeader(nativePtr,name); + } + } diff --git a/java/impl/org/linphone/core/LinphoneChatMessageImpl.java b/java/impl/org/linphone/core/LinphoneChatMessageImpl.java index 62fac1dc3..1373708ca 100644 --- a/java/impl/org/linphone/core/LinphoneChatMessageImpl.java +++ b/java/impl/org/linphone/core/LinphoneChatMessageImpl.java @@ -3,7 +3,7 @@ package org.linphone.core; public class LinphoneChatMessageImpl implements LinphoneChatMessage { protected final long nativePtr; private native void setUserData(long ptr); - private native String getMessage(long ptr); + private native String getText(long ptr); private native long getPeerAddress(long ptr); private native String getExternalBodyUrl(long ptr); private native void setExternalBodyUrl(long ptr, String url); @@ -30,8 +30,8 @@ public class LinphoneChatMessageImpl implements LinphoneChatMessage { } @Override - public String getMessage() { - return getMessage(nativePtr); + public String getText() { + return getText(nativePtr); } @Override @@ -53,4 +53,15 @@ public class LinphoneChatMessageImpl implements LinphoneChatMessage { public LinphoneAddress getFrom() { return new LinphoneAddressImpl(getFrom(nativePtr)); } + + private native void addCustomHeader(long nativePtr, String name, String value); + @Override + public void addCustomHeader(String name, String value) { + addCustomHeader(nativePtr, name, value); + } + private native String getCustomHeader(long nativePtr, String name); + @Override + public String getCustomHeader(String name) { + return getCustomHeader(nativePtr,name); + } } From beede6a18d5599d1bebcbae702df3478c9a3ce69 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 7 Feb 2013 18:45:46 +0100 Subject: [PATCH 072/281] fix bugs. --- coreapi/linphonecall.c | 1 + coreapi/linphonecore_jni.cc | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 27354f61c..3b2054aeb 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -473,6 +473,7 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr linphone_call_init_common(call,from,to); _linphone_call_params_copy(&call->params,params); sal_op_set_custom_header(call->op,call->params.custom_headers); + call->params.custom_headers=NULL; if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseIce) { call->ice_session = ice_session_new(); diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 3cbcf8f79..52a0dec7a 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1694,7 +1694,7 @@ extern "C" void Java_org_linphone_core_LinphoneChatMessageImpl_addCustomHeader(J const char *value=env->GetStringUTFChars(jheader_value,NULL); linphone_chat_message_add_custom_header((LinphoneChatMessage*)ptr,name,value); env->ReleaseStringUTFChars(jheader_name, name); - env->ReleaseStringUTFChars(jheader_name, name); + env->ReleaseStringUTFChars(jheader_value, value); } extern "C" jstring Java_org_linphone_core_LinphoneChatMessageImpl_getExternalBodyUrl(JNIEnv* env @@ -1876,7 +1876,7 @@ extern "C" jstring Java_org_linphone_core_LinphoneCallParamsImpl_getCustomHeader return header_value ? env->NewStringUTF(header_value) : NULL; } -extern "C" void Java_org_linphone_core_LinphoneCallParamsImpl_setCustomHeader(JNIEnv *env, jobject thiz, jlong lcp, jstring jheader_name, jstring jheader_value){ +extern "C" void Java_org_linphone_core_LinphoneCallParamsImpl_addCustomHeader(JNIEnv *env, jobject thiz, jlong lcp, jstring jheader_name, jstring jheader_value){ const char* header_name=env->GetStringUTFChars(jheader_name, NULL); const char* header_value=env->GetStringUTFChars(jheader_value, NULL); linphone_call_params_add_custom_header((LinphoneCallParams*)lcp,header_name,header_value); From b11e3b0a234f9da863dd63443e5d1a0bc2283a2d Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 8 Feb 2013 11:01:26 +0100 Subject: [PATCH 073/281] fix compilation bug --- gtk/calllogs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 4a9330f4a..9e703a8ff 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -68,7 +68,7 @@ void linphone_gtk_call_log_update(GtkWidget *w){ g_date_time_unref(dt); } #else - start_date=g_strdup(ctime(start_date_time)); + start_date=g_strdup(ctime(&start_date_time)); #endif display=linphone_address_get_display_name (la); From c8e0246ccaae9f37d052bc8a4deab0a816f03a1a Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 8 Feb 2013 17:27:08 +0100 Subject: [PATCH 074/281] ICE was broken due to uPNP support, now ICE is back ! --- coreapi/linphonecall.c | 14 +++++++------- coreapi/linphonecore.c | 4 +++- mediastreamer2 | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 3b2054aeb..31b945acb 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -551,14 +551,14 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro 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); + 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: diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 4c5822590..0db4090ca 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2082,7 +2082,7 @@ void linphone_core_iterate(LinphoneCore *lc){ linphone_core_start_invite() */ calls=calls->next; linphone_call_background_tasks(call,one_second_elapsed); - if (call->state==LinphoneCallOutgoingInit && (curtime-call->start_time>=2)){ + if (call->state==LinphoneCallOutgoingInit && (elapsed>=4)){ /*start the call even if the OPTIONS reply did not arrive*/ if (call->ice_session != NULL) { ms_warning("ICE candidates gathering from [%s] has not finished yet, proceed with the call without ICE anyway." @@ -2365,6 +2365,8 @@ int linphone_core_proceed_with_invite_if_ready(LinphoneCore *lc, LinphoneCall *c } else { upnp_ready = TRUE; } +#else + upnp_ready=TRUE; #endif //BUILD_UPNP if (call->ping_op != NULL) { if (call->ping_replied == TRUE) ping_ready = TRUE; diff --git a/mediastreamer2 b/mediastreamer2 index 6251dea54..13d3df5a9 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 6251dea54272cf048c580e03a80c67d672367f2a +Subproject commit 13d3df5a9333ce465214ede7afc9a535a43c9076 From 76dca7ce19c607f7e2013e08dc64747be7335b3b Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 8 Feb 2013 17:30:55 +0100 Subject: [PATCH 075/281] add missing call log apis. --- coreapi/linphonecore.c | 11 +++++++++++ coreapi/linphonecore.h | 2 ++ mediastreamer2 | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 4c5822590..dd89175f7 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -270,6 +270,10 @@ const rtp_stats_t *linphone_call_log_get_remote_stats(const LinphoneCallLog *cl) return &cl->remote_stats; } +const char *linphone_call_log_get_call_id(const LinphoneCallLog *cl){ + return cl->call_id; +} + /** * Assign a user pointer to the call log. **/ @@ -326,6 +330,13 @@ LinphoneAddress *linphone_call_log_get_to(LinphoneCallLog *cl){ return cl->to; } +/** + * Returns remote address (that is from or to depending on call direction). +**/ +LinphoneAddress *linphone_call_log_get_remote_address(LinphoneCallLog *cl){ + return (cl->dir == LinphoneCallIncoming) ? cl->from : cl->to; +} + /** * Returns the direction of the call. **/ diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index f0b6f3d56..4d4a91988 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -160,6 +160,7 @@ typedef enum LinphoneMediaEncryption LinphoneMediaEncryption; /*public: */ LinphoneAddress *linphone_call_log_get_from(LinphoneCallLog *cl); LinphoneAddress *linphone_call_log_get_to(LinphoneCallLog *cl); +LinphoneAddress *linphone_call_log_get_remote_address(LinphoneCallLog *cl); LinphoneCallDir linphone_call_log_get_dir(LinphoneCallLog *cl); LinphoneCallStatus linphone_call_log_get_status(LinphoneCallLog *cl); time_t linphone_call_log_get_start_date(LinphoneCallLog *cl); @@ -171,6 +172,7 @@ void linphone_call_log_set_ref_key(LinphoneCallLog *cl, const char *refkey); const char *linphone_call_log_get_ref_key(const LinphoneCallLog *cl); const rtp_stats_t *linphone_call_log_get_local_stats(const LinphoneCallLog *cl); const rtp_stats_t *linphone_call_log_get_remote_stats(const LinphoneCallLog *cl); +const char *linphone_call_log_get_call_id(const LinphoneCallLog *cl); char * linphone_call_log_to_str(LinphoneCallLog *cl); struct _LinphoneCallParams; diff --git a/mediastreamer2 b/mediastreamer2 index 6251dea54..13d3df5a9 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 6251dea54272cf048c580e03a80c67d672367f2a +Subproject commit 13d3df5a9333ce465214ede7afc9a535a43c9076 From 47a02f34fdfaf89e5c73aa387a639234c7ffa8bc Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 11 Feb 2013 12:11:50 +0100 Subject: [PATCH 076/281] Update ms2 submodule for android sound module fix on tablets. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 13d3df5a9..63aef125c 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 13d3df5a9333ce465214ede7afc9a535a43c9076 +Subproject commit 63aef125c633be420f4a162b2e7526339674f4a2 From bdf69fd48c17662b2b46581fe1c8c2f600d8a6dc Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 12 Feb 2013 12:54:53 +0100 Subject: [PATCH 077/281] Add lpconfig sync jni --- coreapi/linphonecore_jni.cc | 5 +++++ java/common/org/linphone/core/LpConfig.java | 5 +++++ java/impl/org/linphone/core/LpConfigImpl.java | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 52a0dec7a..3d3d35777 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -2299,6 +2299,11 @@ extern "C" jlong Java_org_linphone_core_LpConfigImpl_newLpConfigImpl(JNIEnv *env return (jlong) lp; } +extern "C" void Java_org_linphone_core_LpConfigImpl_sync(JNIEnv *env, jobject thiz, jlong lpc) { + LpConfig *lp = (LpConfig *)lpc; + lp_config_sync(lp); +} + extern "C" void Java_org_linphone_core_LpConfigImpl_delete(JNIEnv *env, jobject thiz, jlong lpc) { LpConfig *lp = (LpConfig *)lpc; lp_config_destroy(lp); diff --git a/java/common/org/linphone/core/LpConfig.java b/java/common/org/linphone/core/LpConfig.java index f31e4d525..5be54f6c0 100644 --- a/java/common/org/linphone/core/LpConfig.java +++ b/java/common/org/linphone/core/LpConfig.java @@ -45,4 +45,9 @@ public interface LpConfig { * @param key */ void setInt(String section, String key, int value); + + /** + * Synchronize LpConfig with file + */ + void sync(); } diff --git a/java/impl/org/linphone/core/LpConfigImpl.java b/java/impl/org/linphone/core/LpConfigImpl.java index 208519955..6ca94b085 100644 --- a/java/impl/org/linphone/core/LpConfigImpl.java +++ b/java/impl/org/linphone/core/LpConfigImpl.java @@ -41,6 +41,11 @@ class LpConfigImpl implements LpConfig { } } + private native void sync(long ptr); + public void sync() { + sync(nativePtr); + } + private native void setInt(long ptr, String section, String key, int value); public void setInt(String section, String key, int value) { setInt(nativePtr, section, key, value); From e059e01097b10f7352a3bc8142595cee412f763f Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 12 Feb 2013 14:13:40 +0100 Subject: [PATCH 078/281] Remove proxy & auth clear at core start in jni --- coreapi/linphonecore_jni.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 3d3d35777..81179be53 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -532,10 +532,6 @@ extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_newLinphoneCore(JNIEnv* ,userConfig ,factoryConfig ,ldata); - //clear auth info list - linphone_core_clear_all_auth_info((LinphoneCore*) nativePtr); - //clear existing proxy config - linphone_core_clear_proxy_config((LinphoneCore*) nativePtr); if (userConfig) env->ReleaseStringUTFChars(juserConfig, userConfig); if (factoryConfig) env->ReleaseStringUTFChars(jfactoryConfig, factoryConfig); From 691f8c30471edb66d99e3ec0a0a1946b71340ddf Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 12 Feb 2013 15:09:56 +0100 Subject: [PATCH 079/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 63aef125c..a964bf24c 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 63aef125c633be420f4a162b2e7526339674f4a2 +Subproject commit a964bf24c47febe55276a8b5ef3e323503c08668 From ee6366003f803184830617e21e3bb709c9f09a8c Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 13 Feb 2013 11:55:05 +0100 Subject: [PATCH 080/281] Fix loop in upnp context release Add upnp public function Add upnp jni Improve uPnP support when a device is removed --- README | 2 + coreapi/linphonecore.c | 29 ++++++- coreapi/linphonecore.h | 30 ++++++++ coreapi/linphonecore_jni.cc | 13 ++++ coreapi/private.h | 1 + coreapi/proxy.c | 3 +- coreapi/upnp.c | 23 ++++-- .../org/linphone/core/LinphoneCore.java | 76 +++++++++++++++++++ .../org/linphone/core/LinphoneCoreImpl.java | 15 ++++ 9 files changed, 183 insertions(+), 9 deletions(-) diff --git a/README b/README index 7e68bb199..05b0b1dcb 100644 --- a/README +++ b/README @@ -15,6 +15,8 @@ This is Linphone, a free (GPL) video softphone based on the SIP protocol. - libavcodec (ffmpeg) - libswscale (part of ffmpeg too) for better scaling performance - theora (optional) + + if you want uPnP support: + - libupnp with their corresponding -dev or -devel package if you don't use source packages. diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 8930f3a89..1be92ef30 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -697,6 +697,8 @@ static void sip_config_read(LinphoneCore *lc) lc->sip_conf.sdp_200_ack=lp_config_get_int(lc->config,"sip","sdp_200_ack",0); lc->sip_conf.register_only_when_network_is_up= lp_config_get_int(lc->config,"sip","register_only_when_network_is_up",1); + lc->sip_conf.register_only_when_upnp_is_ok= + lp_config_get_int(lc->config,"sip","register_only_when_upnp_is_ok",1); lc->sip_conf.ping_with_options=lp_config_get_int(lc->config,"sip","ping_with_options",1); lc->sip_conf.auto_net_state_mon=lp_config_get_int(lc->config,"sip","auto_net_state_mon",1); lc->sip_conf.keepalive_period=lp_config_get_int(lc->config,"sip","keepalive_period",10000); @@ -4123,6 +4125,31 @@ const char * linphone_core_get_stun_server(const LinphoneCore *lc){ return lc->net_conf.stun_server; } +bool_t linphone_core_upnp_available(const LinphoneCore *lc){ +#ifdef BUILD_UPNP + return TRUE; +#else + return FALSE; +#endif //BUILD_UPNP +} + +LinphoneUpnpState linphone_core_get_upnp_state(const LinphoneCore *lc){ +#ifdef BUILD_UPNP + return linphone_upnp_context_get_state(lc->upnp); +#else + return LinphoneUpnpStateNotAvailable; +#endif //BUILD_UPNP +} + +const char * linphone_core_get_upnp_external_ipaddress(const LinphoneCore *lc){ +#ifdef BUILD_UPNP + return linphone_upnp_context_get_external_ipaddress(lc->upnp); +#else + return NULL; +#endif //BUILD_UPNP +} + + const char * linphone_core_get_relay_addr(const LinphoneCore *lc){ return lc->net_conf.relay; } @@ -4977,7 +5004,7 @@ void sip_config_uninit(LinphoneCore *lc) lp_config_set_int(lc->config,"sip","use_rfc2833",config->use_rfc2833); lp_config_set_int(lc->config,"sip","use_ipv6",config->ipv6_enabled); lp_config_set_int(lc->config,"sip","register_only_when_network_is_up",config->register_only_when_network_is_up); - + lp_config_set_int(lc->config,"sip","register_only_when_upnp_is_ok",config->register_only_when_upnp_is_ok); diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 4d4a91988..1de97d0b0 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1105,6 +1105,36 @@ void linphone_core_set_stun_server(LinphoneCore *lc, const char *server); const char * linphone_core_get_stun_server(const LinphoneCore *lc); +/** + * @ingroup network_parameters + * Return the availability of uPnP. + * + * @param lc #LinphoneCore + * @return true if uPnP is available otherwise return false. + */ +bool_t linphone_core_upnp_available(const LinphoneCore *lc); + +/** + * @ingroup network_parameters + * Return the internal state of uPnP. + * + * @param lc #LinphoneCore + * @return an LinphoneUpnpState. + */ +LinphoneUpnpState linphone_core_get_upnp_state(const LinphoneCore *lc); + +/** + * @ingroup network_parameters + * Return the external ip address of router. + * In some cases the uPnP can have an external ip address but not a usable uPnP + * (state different of Ok). + * + * @param lc #LinphoneCore + * @return a null terminated string containing the external ip address. If the + * the external ip address is not available return null. + */ +const char * linphone_core_get_upnp_external_ipaddress(const LinphoneCore *lc); + void linphone_core_set_nat_address(LinphoneCore *lc, const char *addr); const char *linphone_core_get_nat_address(const LinphoneCore *lc); diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 81179be53..64897b218 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -2288,6 +2288,19 @@ extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_getConfig(JNIEnv *env, return (jlong) linphone_core_get_config((LinphoneCore *)lc); } +extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_upnpAvailable(JNIEnv *env, jobject thiz, jlong lc) { + return (jboolean) linphone_core_upnp_available((LinphoneCore *)lc); +} + +extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getUpnpState(JNIEnv *env, jobject thiz, jlong lc) { + return (jint) linphone_core_get_upnp_state((LinphoneCore *)lc); +} + +extern "C" jstring Java_org_linphone_core_LinphoneCoreImpl_getUpnpExternalIpaddress(JNIEnv *env, jobject thiz, jlong lc) { + jstring jvalue = env->NewStringUTF(linphone_core_get_upnp_external_ipaddress((LinphoneCore *)lc)); + return jvalue; +} + extern "C" jlong Java_org_linphone_core_LpConfigImpl_newLpConfigImpl(JNIEnv *env, jobject thiz, jstring file) { const char *cfile = env->GetStringUTFChars(file, NULL); LpConfig *lp = lp_config_new(cfile); diff --git a/coreapi/private.h b/coreapi/private.h index 1f3ed6aba..e4420d9b9 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -429,6 +429,7 @@ typedef struct sip_config bool_t ipv6_enabled; bool_t sdp_200_ack; bool_t register_only_when_network_is_up; + bool_t register_only_when_upnp_is_ok; bool_t ping_with_options; bool_t auto_net_state_mon; bool_t tcp_tls_keepalive; diff --git a/coreapi/proxy.c b/coreapi/proxy.c index bb6c8ec6a..fb650c852 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -1082,7 +1082,8 @@ void linphone_proxy_config_update(LinphoneProxyConfig *cfg){ if (cfg->type && cfg->ssctx==NULL){ linphone_proxy_config_activate_sip_setup(cfg); } - if (!lc->sip_conf.register_only_when_network_is_up || lc->network_reachable) + if ((!lc->sip_conf.register_only_when_network_is_up || lc->network_reachable) && + (!lc->sip_conf.register_only_when_upnp_is_ok || linphone_core_get_upnp_state(lc) == LinphoneUpnpStateOk)) linphone_proxy_config_register(cfg); if (cfg->publish && cfg->publish_op==NULL){ linphone_proxy_config_send_publish(cfg,lc->presence_mode); diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 5ef70ba25..d86c8a42a 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -133,6 +133,8 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { old_state = lupnp->state; switch(event) { + case UPNP_IGD_DEVICE_ADDED: + case UPNP_IGD_DEVICE_REMOVED: case UPNP_IGD_EXTERNAL_IPADDRESS_CHANGED: case UPNP_IGD_NAT_ENABLED_CHANGED: case UPNP_IGD_CONNECTION_STATUS_CHANGED: @@ -315,15 +317,12 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) { /* Send port binding removes */ if(lupnp->sip_udp != NULL) { linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_udp); - lupnp->sip_udp = NULL; } if(lupnp->sip_tcp != NULL) { linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tcp); - lupnp->sip_tcp = NULL; } if(lupnp->sip_tls != NULL) { linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tls); - lupnp->sip_tcp = NULL; } /* Wait all pending bindings are done */ @@ -381,6 +380,10 @@ int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBind upnp_igd_port_mapping mapping; char description[128]; int ret; + + if(lupnp->state != LinphoneUpnpStateOk) { + return -2; + } // Compute port binding state if(port->state != LinphoneUpnpStateAdding) { @@ -435,6 +438,10 @@ int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBind int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port) { upnp_igd_port_mapping mapping; int ret; + + if(lupnp->state != LinphoneUpnpStateOk) { + return -2; + } // Compute port binding state if(port->state != LinphoneUpnpStateRemoving) { @@ -848,16 +855,18 @@ UpnpPortBinding *linphone_upnp_port_binding_copy(const UpnpPortBinding *port) { void linphone_upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *port) { if(strlen(port->local_addr)) { - ortp_log(level, "uPnP IGD: %s %s|%d->%s:%d", msg, + ortp_log(level, "uPnP IGD: %s %s|%d->%s:%d (retry %d)", msg, (port->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", port->external_port, port->local_addr, - port->local_port); + port->local_port, + port->retry - 1); } else { - ortp_log(level, "uPnP IGD: %s %s|%d->%d", msg, + ortp_log(level, "uPnP IGD: %s %s|%d->%d (retry %d)", msg, (port->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", port->external_port, - port->local_port); + port->local_port, + port->retry - 1); } } diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index 08371f515..11a7c275f 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -278,6 +278,56 @@ public interface LinphoneCore { return mValue; } } + + static public class UpnpState { + static private Vector values = new Vector(); + /** + * Idle + */ + static public UpnpState Idle = new UpnpState(0, "Idle"); + /** + * Pending + */ + static public UpnpState Pending = new UpnpState(1, "Pending"); + /** + * Adding + */ + static public UpnpState Adding = new UpnpState(2, "Adding"); + /** + * Removing + */ + static public UpnpState Removing = new UpnpState(3, "Removing"); + /** + * Not Available + */ + static public UpnpState NotAvailable = new UpnpState(4, "Not available"); + /** + * Ok + */ + static public UpnpState Ok = new UpnpState(5, "Ok"); + /** + * Ko + */ + static public UpnpState Ko = new UpnpState(6, "Ko"); + protected final int mValue; + private final String mStringValue; + + private UpnpState(int value, String stringValue) { + mValue = value; + values.addElement(this); + mStringValue = stringValue; + } + public static UpnpState fromInt(int value) { + for (int i = 0; i < values.size(); i++) { + UpnpState mstate = (UpnpState) values.elementAt(i); + if (mstate.mValue == value) return mstate; + } + throw new RuntimeException("UpnpState not found [" + value + "]"); + } + public String toString() { + return mStringValue; + } + } /** * Set the context of creation of the LinphoneCore. @@ -882,4 +932,30 @@ public interface LinphoneCore { * the config file with your own sections */ LpConfig getConfig(); + + + /** + * Return the availability of uPnP. + * + * @return true if uPnP is available otherwise return false. + */ + public boolean upnpAvailable(); + + /** + * Return the internal state of uPnP. + * + * @return an UpnpState. + */ + public UpnpState getUpnpState(); + + /** + * Return the external ip address of router. + * In some cases the uPnP can have an external ip address but not a usable uPnP + * (state different of Ok). + * + * @return a null terminated string containing the external ip address. If the + * the external ip address is not available return null. + */ + public String getUpnpExternalIpaddress(); + } diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java index 02e31f9a1..2d42c8f55 100644 --- a/java/impl/org/linphone/core/LinphoneCoreImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java @@ -872,4 +872,19 @@ class LinphoneCoreImpl implements LinphoneCore { long configPtr=getConfig(nativePtr); return new LpConfigImpl(configPtr); } + + private native boolean upnpAvailable(long ptr); + public boolean upnpAvailable() { + return upnpAvailable(nativePtr); + } + + private native int getUpnpState(long ptr); + public UpnpState getUpnpState() { + return UpnpState.fromInt(getUpnpState(nativePtr)); + } + + private native String getUpnpExternalIpaddress(long ptr); + public String getUpnpExternalIpaddress() { + return getUpnpExternalIpaddress(nativePtr); + } } From 3610297d376e91f14a12bed25c737dacef317ece Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 13 Feb 2013 12:20:45 +0100 Subject: [PATCH 081/281] Add warning when trying to set uPnP as firewall policy and uPnP is not available --- coreapi/linphonecore.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 1be92ef30..1cd6436f9 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -4206,6 +4206,12 @@ const char *linphone_core_get_nat_address_resolved(LinphoneCore *lc) } void linphone_core_set_firewall_policy(LinphoneCore *lc, LinphoneFirewallPolicy pol){ +#ifndef BUILD_UPNP + if(pol == LinphonePolicyUseUpnp) { + ms_warning("UPNP is not available, reset firewall policy to no firewall"); + pol = LinphonePolicyNoFirewall; + } +#endif //BUILD_UPNP lc->net_conf.firewall_policy=pol; if (lc->sip_conf.contact) update_primary_contact(lc); if (linphone_core_ready(lc)) From 04fef5fcca637a601025b01a62843f1423ff0d96 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 13 Feb 2013 16:50:24 +0100 Subject: [PATCH 082/281] Add libupnp dependency for Android Fix some issues related to uPnP --- build/android/common.mk | 11 +- build/android/config.h | 232 +++++++++++++++++++++++++ build/android/liblinphone_gitversion.h | 1 + coreapi/linphonecore.c | 8 +- coreapi/private.h | 2 +- mediastreamer2 | 2 +- 6 files changed, 246 insertions(+), 10 deletions(-) create mode 100644 build/android/config.h create mode 100644 build/android/liblinphone_gitversion.h diff --git a/build/android/common.mk b/build/android/common.mk index 86475081e..9fd68d779 100644 --- a/build/android/common.mk +++ b/build/android/common.mk @@ -55,13 +55,10 @@ LOCAL_CFLAGS += \ -DORTP_INET6 \ -DINET6 \ -DOSIP_MT \ - -DHAVE_EXOSIP_GET_VERSION \ - -DHAVE_EXOSIP_RESET_TRANSPORTS \ -DENABLE_TRACE \ + -DHAVE_CONFIG_H \ -DLINPHONE_VERSION=\"$(LINPHONE_VERSION)\" \ -DLINPHONE_PLUGINS_DIR=\"\\tmp\" \ - -DHAVE_EXOSIP_TRYLOCK=1 \ - -DHAVE_EXOSIP_TLS_VERIFY_CERTIFICATE=1 LOCAL_CFLAGS += -DIN_LINPHONE @@ -79,6 +76,7 @@ endif LOCAL_C_INCLUDES += \ $(LOCAL_PATH) \ $(LOCAL_PATH)/include \ + $(LOCAL_PATH)/../build/android \ $(LOCAL_PATH)/../oRTP/include \ $(LOCAL_PATH)/../mediastreamer2/include \ $(LOCAL_PATH)/../../externals/exosip/include \ @@ -154,6 +152,11 @@ LOCAL_STATIC_LIBRARIES += \ endif endif +ifeq ($(BUILD_UPNP),1) +LOCAL_CFLAGS += -DBUILD_UPNP +LOCAL_SRC_FILES += upnp.c +endif + LOCAL_STATIC_LIBRARIES += libspeex ifeq ($(BUILD_SRTP), 1) diff --git a/build/android/config.h b/build/android/config.h new file mode 100644 index 000000000..22321c5f7 --- /dev/null +++ b/build/android/config.h @@ -0,0 +1,232 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define if tools enabled */ +/* #undef BUILD_TOOLS */ + +/* Define if wizard enabled */ +/* #undef BUILD_WIZARD */ + +/* Tells whether localisation is possible */ +/* #undef ENABLE_NLS */ + +/* Defined when using gsm at nonstandard rates */ +/* #undef ENABLE_NONSTANDARD_GSM */ + +/* The name of the gettext package name */ +/* #undef GETTEXT_PACKAGE */ + +/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the + CoreFoundation framework. */ +/* #undef HAVE_CFLOCALECOPYCURRENT */ + +/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in + the CoreFoundation framework. */ +/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */ + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +/* #undef HAVE_DCGETTEXT */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DLFCN_H */ + +/* Define if exosip dscp available */ +/* #def HAVE_EXOSIP_DSCP */ + +/* Defined when eXosip_get_version is available */ +#define HAVE_EXOSIP_GET_VERSION + +/* Defined when eXosip_reset_transports is available */ +#define HAVE_EXOSIP_RESET_TRANSPORTS + +/* Defined when eXosip_tls_verify_certificate is available */ +#define HAVE_EXOSIP_TLS_VERIFY_CERTIFICATE + +/* Defined when eXosip_tls_verify_certificate is available */ +/* #undef HAVE_EXOSIP_TLS_VERIFY_CN */ + +/* Defined when eXosip_get_socket is available */ +#define HAVE_EXOSIP_TRYLOCK + +/* If present, the getenv function allows fim to read environment variables. + */ +#define HAVE_GETENV 1 + +/* Define to 1 if you have the `getifaddrs' function. */ +/* #undef HAVE_GETIFADDRS */ + +/* Tells wheter localisation is possible */ +/* #undef HAVE_GETTEXT */ + +/* Define to 1 if you have the `get_current_dir_name' function. */ +#define HAVE_GET_CURRENT_DIR_NAME 1 + +/* Defined when gtk osx is used */ +/* #undef HAVE_GTK_OSX */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_HISTORY_H */ + +/* Define if you have the iconv() function. */ +/* #undef HAVE_ICONV */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `eXosip2' library (-leXosip2). */ +/* #define HAVE_LIBEXOSIP2 */ + +/* Define to 1 if you have the `osip2' library (-losip2). */ +/* #undef HAVE_LIBOSIP2 */ + +/* Define to 1 if you have the `osipparser2' library (-losipparser2). */ +/* #undef HAVE_LIBOSIPPARSER2 */ + +/* Define to 1 if you have the `udev' library (-ludev). */ +/* #undef HAVE_LIBUDEV */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LIBUDEV_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* NOTIFY1 support */ +/* #undef HAVE_NOTIFY1 */ + +/* NOTIFY4 support */ +/* #undef HAVE_NOTIFY4 */ + +/* defined when compiling with readline support */ +/* #undef HAVE_READLINE */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_READLINE_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_READLINE_HISTORY_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_READLINE_READLINE_H */ + +/* Define if sighandler_t available */ +/* #undef HAVE_SIGHANDLER_T */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `stpcpy' function. */ +#define HAVE_STPCPY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strndup' function. */ +#define HAVE_STRNDUP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_X11_XLIB_H 1 + +/* All supported languages */ +/* #undef LINPHONE_ALL_LANGS */ + +/* Windows appdata subdir where linphonerc can be found */ +/* #undef LINPHONE_CONFIG_DIR */ + +/* path of liblinphone plugins, not mediastreamer2 plugins */ +/* #undef LINPHONE_PLUGINS_DIR */ + +/* Linphone's version number */ +/* #undef LINPHONE_VERSION */ + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "linphone" + +/* Define to the address where bug reports for this package should be sent. */ +/* #undef PACKAGE_BUGREPORT */ + +/* Defines the place where data are found */ +/* #undef PACKAGE_DATA_DIR */ + +/* Defines the place where locales can be found */ +/* #undef PACKAGE_LOCALE_DIR */ + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "linphone" + +/* Defines the place where linphone sounds are found */ +/* #undef PACKAGE_SOUND_DIR */ + +/* Define to the full name and version of this package. */ +/* #undef PACKAGE_STRING */ + +/* Define to the one symbol short name of this package. */ +/* #undef PACKAGE_TARNAME */ + +/* Define to the home page for this package. */ +/* #undef PACKAGE_URL */ + +/* Define to the version of this package. */ +/* #undef PACKAGE_VERSION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Tell whether date_version.h must be used */ +/* #undef USE_BUILDDATE_VERSION */ + +/* Version number of package */ +/* #undef VERSION */ + +/* defined if video support is available */ +/* #undef VIDEO_ENABLED */ + +/* Tell whether RSVP support should be compiled. */ +/* #undef VINCENT_MAURY_RSVP */ + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Defined if we are compiling for arm processor */ +/* #undef __ARM__ */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif diff --git a/build/android/liblinphone_gitversion.h b/build/android/liblinphone_gitversion.h new file mode 100644 index 000000000..50e8a106e --- /dev/null +++ b/build/android/liblinphone_gitversion.h @@ -0,0 +1 @@ +#define LIBLINPHONE_GIT_VERSION "unknown" diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 1cd6436f9..ad1bb5667 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1306,7 +1306,7 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta #endif #ifdef BUILD_UPNP lc->upnp = linphone_upnp_context_new(lc); -#endif //BUILD_UPNP +#endif //BUILD_UPNP if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Ready")); lc->auto_net_state_mon=lc->sip_conf.auto_net_state_mon; @@ -1409,7 +1409,7 @@ void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result strncpy(result,ip,LINPHONE_IPADDR_SIZE); return; } -#endif //BUILD_UPNP +#endif //BUILD_UPNP if (linphone_core_get_local_ip_for(lc->sip_conf.ipv6_enabled ? AF_INET6 : AF_INET,dest,result)==0) return; /*else fallback to SAL routine that will attempt to find the most realistic interface */ @@ -2990,7 +2990,7 @@ int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const #endif //VIDEO_ENABLED } -#if BUILD_UPNP +#ifdef 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 @@ -5172,7 +5172,7 @@ static void linphone_core_uninit(LinphoneCore *lc) #ifdef BUILD_UPNP linphone_upnp_context_destroy(lc->upnp); lc->upnp = NULL; -#endif //BUILD_UPNP +#endif //BUILD_UPNP if (lc->friends) ms_list_for_each(lc->friends,(void (*)(void *))linphone_friend_close_subscriptions); diff --git a/coreapi/private.h b/coreapi/private.h index e4420d9b9..149fbac58 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -42,7 +42,7 @@ extern "C" { #include "mediastreamer2/msconference.h" #ifdef BUILD_UPNP #include "upnp.h" -#endif //BUILD_UPNP +#endif //BUILD_UPNP #ifndef LIBLINPHONE_VERSION #define LIBLINPHONE_VERSION LINPHONE_VERSION diff --git a/mediastreamer2 b/mediastreamer2 index a964bf24c..eeaab2239 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit a964bf24c47febe55276a8b5ef3e323503c08668 +Subproject commit eeaab2239d6545f18d5219b62adda8d1dda3b104 From db9c1335eb22f9816babac27c72d86efff581346 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 14 Feb 2013 19:03:58 +0100 Subject: [PATCH 083/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index eeaab2239..44992c096 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit eeaab2239d6545f18d5219b62adda8d1dda3b104 +Subproject commit 44992c096673ace578ba5248db7019ba1e0d78d5 From 4ab5ec9232d0bfb4fa4ff7bb7ded23e7db7b9d40 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 15 Feb 2013 14:21:04 +0100 Subject: [PATCH 084/281] API fixups and cleanups. --- coreapi/linphonecall.c | 2 +- coreapi/linphonecore.h | 4 +--- mediastreamer2 | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 31b945acb..6a39783e7 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1100,7 +1100,7 @@ void linphone_call_params_add_custom_header(LinphoneCallParams *params, const ch params->custom_headers=sal_custom_header_append(params->custom_headers,header_name,header_value); } -const char *linphone_call_params_get_custom_header(LinphoneCallParams *params, const char *header_name){ +const char *linphone_call_params_get_custom_header(const LinphoneCallParams *params, const char *header_name){ return sal_custom_header_find(params->custom_headers,header_name); } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 1de97d0b0..774ef925b 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -37,14 +37,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern "C" { #endif -struct _MSSndCard; struct _LinphoneCore; /** * Linphone core main object created by function linphone_core_new() . * @ingroup initializing */ typedef struct _LinphoneCore LinphoneCore; -struct SalOp; struct _LpConfig; @@ -201,7 +199,7 @@ void linphone_call_params_enable_low_bandwidth(LinphoneCallParams *cp, bool_t en void linphone_call_params_set_record_file(LinphoneCallParams *cp, const char *path); const char *linphone_call_params_get_record_file(const LinphoneCallParams *cp); void linphone_call_params_add_custom_header(LinphoneCallParams *params, const char *header_name, const char *header_value); -const char *linphone_call_params_get_custom_header(LinphoneCallParams *params, const char *header_name); +const char *linphone_call_params_get_custom_header(const LinphoneCallParams *params, const char *header_name); /** * Enum describing failure reasons. * @ingroup initializing diff --git a/mediastreamer2 b/mediastreamer2 index eeaab2239..44992c096 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit eeaab2239d6545f18d5219b62adda8d1dda3b104 +Subproject commit 44992c096673ace578ba5248db7019ba1e0d78d5 From e3c60a69c8fd702f4916fc68fc0e15f74bdf9e77 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 15 Feb 2013 11:48:53 +0100 Subject: [PATCH 085/281] Update REGISTER contact with uPnP external informations --- coreapi/proxy.c | 23 +++++++++++++++++++---- coreapi/upnp.c | 29 +++++++++++++++++++++++++++-- coreapi/upnp.h | 1 + 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/coreapi/proxy.c b/coreapi/proxy.c index fb650c852..4aae6d3b9 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -263,15 +263,30 @@ static char *guess_contact_for_register(LinphoneProxyConfig *obj){ if (proxy==NULL) return NULL; host=linphone_address_get_domain (proxy); if (host!=NULL){ - char localip[LINPHONE_IPADDR_SIZE]; + int localport = -1; + char localip_tmp[LINPHONE_IPADDR_SIZE] = {'\0'}; + const char *localip = NULL; char *tmp; LCSipTransports tr; LinphoneAddress *contact; - linphone_core_get_local_ip(obj->lc,host,localip); contact=linphone_address_new(obj->reg_identity); - linphone_address_set_domain (contact,localip); - linphone_address_set_port_int(contact,linphone_core_get_sip_port(obj->lc)); +#ifdef BUILD_UPNP + if (obj->lc->upnp != NULL && linphone_core_get_firewall_policy(obj->lc)==LinphonePolicyUseUpnp && + linphone_upnp_context_get_state(obj->lc->upnp) == LinphoneUpnpStateOk) { + localip = linphone_upnp_context_get_external_ipaddress(obj->lc->upnp); + localport = linphone_upnp_context_get_external_port(obj->lc->upnp); + } +#endif //BUILD_UPNP + if(localip == NULL) { + localip = localip_tmp; + linphone_core_get_local_ip(obj->lc,host,localip_tmp); + } + if(localport == -1) { + localport = linphone_core_get_sip_port(obj->lc); + } + linphone_address_set_port_int(contact,localport); + linphone_address_set_domain(contact,localip); linphone_address_set_display_name(contact,NULL); linphone_core_get_sip_transports(obj->lc,&tr); diff --git a/coreapi/upnp.c b/coreapi/upnp.c index d86c8a42a..105f4a8dd 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -368,8 +368,32 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) { ms_free(lupnp); } -LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *ctx) { - return ctx->state; +LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *lupnp) { + LinphoneUpnpState state; + ms_mutex_lock(&lupnp->mutex); + state = lupnp->state; + ms_mutex_unlock(&lupnp->mutex); + return state; +} + +int linphone_upnp_context_get_external_port(UpnpContext *lupnp) { + int port = -1; + ms_mutex_lock(&lupnp->mutex); + + /* Send port binding removes */ + if(lupnp->sip_udp != NULL) { + if(lupnp->sip_udp->state == LinphoneUpnpStateOk) + port = lupnp->sip_udp->external_port; + } else if(lupnp->sip_tcp != NULL) { + if(lupnp->sip_tcp->state == LinphoneUpnpStateOk) + port = lupnp->sip_tcp->external_port; + } else if(lupnp->sip_tls != NULL) { + if(lupnp->sip_tls->state == LinphoneUpnpStateOk) + port = lupnp->sip_tls->external_port; + } + + ms_mutex_unlock(&lupnp->mutex); + return port; } const char* linphone_upnp_context_get_external_ipaddress(UpnpContext *ctx) { @@ -964,6 +988,7 @@ LinphoneUpnpState linphone_upnp_session_get_state(UpnpSession *session) { return session->state; } + /* * uPnP Config */ diff --git a/coreapi/upnp.h b/coreapi/upnp.h index b3a5b9e49..08483588e 100644 --- a/coreapi/upnp.h +++ b/coreapi/upnp.h @@ -40,6 +40,7 @@ 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); +int linphone_upnp_context_get_external_port(UpnpContext *ctx); void linphone_core_update_upnp_state_in_call_stats(LinphoneCall *call); #endif //LINPHONE_UPNP_H From 5017c6ebbad5e66daf5119ad929a69fb089bb951 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 15 Feb 2013 16:25:47 +0100 Subject: [PATCH 086/281] Improve uPnP behaviour (Firewall policy change, local ip change, ...) Hide uPnP firewall setting if uPnP is not available --- configure.ac | 1 + coreapi/linphonecore.c | 22 ++- coreapi/proxy.c | 15 +- coreapi/upnp.c | 384 ++++++++++++++++++++++++----------------- coreapi/upnp.h | 1 + gtk/propertybox.c | 4 + 6 files changed, 262 insertions(+), 165 deletions(-) diff --git a/configure.ac b/configure.ac index 1372c5af3..43efbff30 100644 --- a/configure.ac +++ b/configure.ac @@ -782,6 +782,7 @@ printf "* %-30s %s\n" "Account assistant" $build_wizard printf "* %-30s %s\n" "Console interface" $console_ui printf "* %-30s %s\n" "Tools" $build_tools printf "* %-30s %s\n" "zRTP encryption (GPLv3)" $zrtp +printf "* %-30s %s\n" "uPnP support" $build_upnp if test "$enable_tunnel" = "true" ; then printf "* Tunnel support\t\ttrue\n" diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index ad1bb5667..608d1c6e5 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1304,9 +1304,6 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta lc->tunnel=linphone_core_tunnel_new(lc); if (lc->tunnel) linphone_tunnel_configure(lc->tunnel); #endif -#ifdef BUILD_UPNP - lc->upnp = linphone_upnp_context_new(lc); -#endif //BUILD_UPNP if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Ready")); lc->auto_net_state_mon=lc->sip_conf.auto_net_state_mon; @@ -4211,6 +4208,17 @@ void linphone_core_set_firewall_policy(LinphoneCore *lc, LinphoneFirewallPolicy ms_warning("UPNP is not available, reset firewall policy to no firewall"); pol = LinphonePolicyNoFirewall; } +#else //BUILD_UPNP + if(pol == LinphonePolicyUseUpnp) { + if(lc->upnp == NULL) { + lc->upnp = linphone_upnp_context_new(lc); + } + } else { + if(lc->upnp != NULL) { + linphone_upnp_context_destroy(lc->upnp); + lc->upnp = NULL; + } + } #endif //BUILD_UPNP lc->net_conf.firewall_policy=pol; if (lc->sip_conf.contact) update_primary_contact(lc); @@ -5170,8 +5178,10 @@ static void linphone_core_uninit(LinphoneCore *lc) } #ifdef BUILD_UPNP - linphone_upnp_context_destroy(lc->upnp); - lc->upnp = NULL; + if(lc->upnp != NULL) { + linphone_upnp_context_destroy(lc->upnp); + lc->upnp = NULL; + } #endif //BUILD_UPNP if (lc->friends) @@ -5506,7 +5516,7 @@ void linphone_core_remove_iterate_hook(LinphoneCore *lc, LinphoneCoreIterateHook for(elem=lc->hooks;elem!=NULL;elem=elem->next){ Hook *h=(Hook*)elem->data; if (h->fun==hook && h->data==hook_data){ - ms_list_remove_link(lc->hooks,elem); + lc->hooks = ms_list_remove_link(lc->hooks,elem); ms_free(h); return; } diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 4aae6d3b9..559547727 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -1097,9 +1097,18 @@ void linphone_proxy_config_update(LinphoneProxyConfig *cfg){ if (cfg->type && cfg->ssctx==NULL){ linphone_proxy_config_activate_sip_setup(cfg); } - if ((!lc->sip_conf.register_only_when_network_is_up || lc->network_reachable) && - (!lc->sip_conf.register_only_when_upnp_is_ok || linphone_core_get_upnp_state(lc) == LinphoneUpnpStateOk)) - linphone_proxy_config_register(cfg); + switch(linphone_core_get_firewall_policy(lc)) { + case LinphonePolicyUseUpnp: +#ifdef BUILD_UPNP + if(lc->upnp != NULL && !linphone_upnp_context_is_ready_for_register(lc->upnp)) { + break; + } +#endif + default: + if ((!lc->sip_conf.register_only_when_network_is_up || lc->network_reachable)) { + linphone_proxy_config_register(cfg); + } + } if (cfg->publish && cfg->publish_op==NULL){ linphone_proxy_config_send_publish(cfg,lc->presence_mode); } diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 105f4a8dd..0713a1d52 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -24,6 +24,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define UPNP_ADD_MAX_RETRY 4 #define UPNP_REMOVE_MAX_RETRY 4 #define UPNP_SECTION_NAME "uPnP" +#define UPNP_CORE_RETRY_DELAY 4 +#define UPNP_CALL_RETRY_DELAY 1 /* * uPnP Definitions @@ -41,6 +43,7 @@ typedef struct _UpnpPortBinding { int ref; bool_t to_remove; bool_t to_add; + time_t last_update; } UpnpPortBinding; typedef struct _UpnpStream { @@ -77,19 +80,24 @@ bool_t linphone_core_upnp_hook(void *data); void linphone_core_upnp_refresh(UpnpContext *ctx); UpnpPortBinding *linphone_upnp_port_binding_new(); +UpnpPortBinding *linphone_upnp_port_binding_new_with_parameters(upnp_igd_ip_protocol protocol, int local_port, int external_port); +UpnpPortBinding *linphone_upnp_port_binding_new_or_collect(MSList *list, upnp_igd_ip_protocol protocol, int local_port, int external_port); UpnpPortBinding *linphone_upnp_port_binding_copy(const UpnpPortBinding *port); bool_t linphone_upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2); UpnpPortBinding *linphone_upnp_port_binding_equivalent_in_list(MSList *list, const UpnpPortBinding *port); UpnpPortBinding *linphone_upnp_port_binding_retain(UpnpPortBinding *port); +void linphone_upnp_update_port_binding(UpnpContext *lupnp, UpnpPortBinding **port_mapping, upnp_igd_ip_protocol protocol, int port, int retry_delay); void linphone_upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *port); void linphone_upnp_port_binding_release(UpnpPortBinding *port); +// Configuration MSList *linphone_upnp_config_list_port_bindings(struct _LpConfig *lpc); void linphone_upnp_config_add_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port); void linphone_upnp_config_remove_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port); -int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port); -int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port); +// uPnP +int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port, bool_t retry); +int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port, bool_t retry); /** @@ -172,7 +180,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; port_mapping->external_port = -1; //Force random external port - if(linphone_upnp_context_send_add_port_binding(lupnp, port_mapping) != 0) { + if(linphone_upnp_context_send_add_port_binding(lupnp, port_mapping, TRUE) != 0) { linphone_upnp_port_binding_log(ORTP_ERROR, "Can't add port binding", port_mapping); } @@ -190,7 +198,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { case UPNP_IGD_PORT_MAPPING_REMOVE_FAILURE: mapping = (upnp_igd_port_mapping *) arg; port_mapping = (UpnpPortBinding*) mapping->cookie; - if(linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping) != 0) { + if(linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping, TRUE) != 0) { linphone_upnp_port_binding_log(ORTP_ERROR, "Can't remove port binding", port_mapping); linphone_upnp_config_remove_port_binding(lupnp, port_mapping); } @@ -208,7 +216,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { if(port_mapping->to_remove) { if(port_mapping->state == LinphoneUpnpStateOk) { port_mapping->to_remove = FALSE; - linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping); + linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping, FALSE); } else if(port_mapping->state == LinphoneUpnpStateKo) { port_mapping->to_remove = FALSE; } @@ -216,7 +224,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { if(port_mapping->to_add) { if(port_mapping->state == LinphoneUpnpStateIdle || port_mapping->state == LinphoneUpnpStateKo) { port_mapping->to_add = FALSE; - linphone_upnp_context_send_add_port_binding(lupnp, port_mapping); + linphone_upnp_context_send_add_port_binding(lupnp, port_mapping, FALSE); } } @@ -239,9 +247,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { */ UpnpContext* linphone_upnp_context_new(LinphoneCore *lc) { - LCSipTransports transport; UpnpContext *lupnp = (UpnpContext *)ms_new0(UpnpContext,1); - const char *ip_address; ms_mutex_init(&lupnp->mutex, NULL); ms_cond_init(&lupnp->empty_cond, NULL); @@ -253,31 +259,10 @@ UpnpContext* linphone_upnp_context_new(LinphoneCore *lc) { lupnp->state = LinphoneUpnpStateIdle; ms_message("uPnP IGD: New %p for core %p", lupnp, lc); - linphone_core_get_sip_transports(lc, &transport); - if(transport.udp_port != 0) { - lupnp->sip_udp = linphone_upnp_port_binding_new(); - lupnp->sip_udp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; - lupnp->sip_udp->local_port = transport.udp_port; - lupnp->sip_udp->external_port = transport.udp_port; - } else { - lupnp->sip_udp = NULL; - } - if(transport.tcp_port != 0) { - lupnp->sip_tcp = linphone_upnp_port_binding_new(); - lupnp->sip_tcp->protocol = UPNP_IGD_IP_PROTOCOL_TCP; - lupnp->sip_tcp->local_port = transport.tcp_port; - lupnp->sip_tcp->external_port = transport.tcp_port; - } else { - lupnp->sip_tcp = NULL; - } - if(transport.tls_port != 0) { - lupnp->sip_tls = linphone_upnp_port_binding_new(); - lupnp->sip_tls->protocol = UPNP_IGD_IP_PROTOCOL_TCP; - lupnp->sip_tls->local_port = transport.tls_port; - lupnp->sip_tls->external_port = transport.tls_port; - } else { - lupnp->sip_tls = NULL; - } + // Init ports + lupnp->sip_udp = NULL; + lupnp->sip_tcp = NULL; + lupnp->sip_tls = NULL; linphone_core_add_iterate_hook(lc, linphone_core_upnp_hook, lupnp); @@ -289,17 +274,6 @@ UpnpContext* linphone_upnp_context_new(LinphoneCore *lc) { return NULL; } - ip_address = upnp_igd_get_local_ipaddress(lupnp->upnp_igd_ctxt); - if(lupnp->sip_udp != NULL) { - strncpy(lupnp->sip_udp->local_addr, ip_address, sizeof(lupnp->sip_udp->local_addr)); - } - if(lupnp->sip_tcp != NULL) { - strncpy(lupnp->sip_tcp->local_addr, ip_address, sizeof(lupnp->sip_tcp->local_addr)); - } - if(lupnp->sip_tls != NULL) { - strncpy(lupnp->sip_tls->local_addr, ip_address, sizeof(lupnp->sip_tls->local_addr)); - } - lupnp->state = LinphoneUpnpStatePending; upnp_igd_start(lupnp->upnp_igd_ctxt); @@ -307,22 +281,19 @@ UpnpContext* linphone_upnp_context_new(LinphoneCore *lc) { } void linphone_upnp_context_destroy(UpnpContext *lupnp) { - /* - * Not need, all hooks are removed before - * linphone_core_remove_iterate_hook(lc, linphone_core_upnp_hook, lc); - */ + linphone_core_remove_iterate_hook(lupnp->lc, linphone_core_upnp_hook, lupnp); ms_mutex_lock(&lupnp->mutex); /* Send port binding removes */ if(lupnp->sip_udp != NULL) { - linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_udp); + linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_udp, TRUE); } if(lupnp->sip_tcp != NULL) { - linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tcp); + linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tcp, TRUE); } if(lupnp->sip_tls != NULL) { - linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tls); + linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tls, TRUE); } /* Wait all pending bindings are done */ @@ -376,31 +347,72 @@ LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *lupnp) { return state; } +bool_t linphone_upnp_context_is_ready_for_register(UpnpContext *lupnp) { + bool_t ready = TRUE; + ms_mutex_lock(&lupnp->mutex); + + // 1 Check global uPnP state + ready = (lupnp->state == LinphoneUpnpStateOk); + + // 2 Check external ip address + if(ready && upnp_igd_get_external_ipaddress(lupnp->upnp_igd_ctxt) == NULL) { + ready = FALSE; + } + + // 3 Check sip ports bindings + if(ready) { + if(lupnp->sip_udp != NULL) { + if(lupnp->sip_udp->state != LinphoneUpnpStateOk) { + ready = FALSE; + } + } else if(lupnp->sip_tcp != NULL) { + if(lupnp->sip_tcp->state != LinphoneUpnpStateOk) { + ready = FALSE; + } + } else if(lupnp->sip_tls != NULL) { + if(lupnp->sip_tls->state != LinphoneUpnpStateOk) { + ready = FALSE; + } + } else { + ready = FALSE; + } + } + + ms_mutex_unlock(&lupnp->mutex); + return ready; +} + int linphone_upnp_context_get_external_port(UpnpContext *lupnp) { int port = -1; ms_mutex_lock(&lupnp->mutex); - /* Send port binding removes */ if(lupnp->sip_udp != NULL) { - if(lupnp->sip_udp->state == LinphoneUpnpStateOk) + if(lupnp->sip_udp->state == LinphoneUpnpStateOk) { port = lupnp->sip_udp->external_port; + } } else if(lupnp->sip_tcp != NULL) { - if(lupnp->sip_tcp->state == LinphoneUpnpStateOk) + if(lupnp->sip_tcp->state == LinphoneUpnpStateOk) { port = lupnp->sip_tcp->external_port; + } } else if(lupnp->sip_tls != NULL) { - if(lupnp->sip_tls->state == LinphoneUpnpStateOk) + if(lupnp->sip_tls->state == LinphoneUpnpStateOk) { port = lupnp->sip_tls->external_port; + } } ms_mutex_unlock(&lupnp->mutex); return port; } -const char* linphone_upnp_context_get_external_ipaddress(UpnpContext *ctx) { - return upnp_igd_get_external_ipaddress(ctx->upnp_igd_ctxt); +const char* linphone_upnp_context_get_external_ipaddress(UpnpContext *lupnp) { + const char* addr = NULL; + ms_mutex_lock(&lupnp->mutex); + addr = upnp_igd_get_external_ipaddress(lupnp->upnp_igd_ctxt); + ms_mutex_unlock(&lupnp->mutex); + return addr; } -int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port) { +int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port, bool_t retry) { upnp_igd_port_mapping mapping; char description[128]; int ret; @@ -428,6 +440,11 @@ int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBind return 0; } } + + // No retry if specified + if(port->retry != 0 && !retry) { + return -1; + } if(port->retry >= UPNP_ADD_MAX_RETRY) { ret = -1; @@ -459,7 +476,7 @@ int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBind return ret; } -int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port) { +int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port, bool_t retry) { upnp_igd_port_mapping mapping; int ret; @@ -485,6 +502,11 @@ int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortB return 0; } } + + // No retry if specified + if(port->retry != 0 && !retry) { + return 1; + } if(port->retry >= UPNP_REMOVE_MAX_RETRY) { ret = -1; @@ -513,7 +535,6 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool LinphoneCore *lc = call->core; UpnpContext *lupnp = lc->upnp; int ret = -1; - const char *local_addr, *external_addr; if(lupnp == NULL) { return ret; @@ -523,58 +544,24 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool // Don't handle when the call if(lupnp->state == LinphoneUpnpStateOk && call->upnp_session != NULL) { ret = 0; - local_addr = upnp_igd_get_local_ipaddress(lupnp->upnp_igd_ctxt); - external_addr = upnp_igd_get_external_ipaddress(lupnp->upnp_igd_ctxt); /* * Audio part */ - strncpy(call->upnp_session->audio->rtp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); - strncpy(call->upnp_session->audio->rtp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); - call->upnp_session->audio->rtp->local_port = call->audio_port; - if(call->upnp_session->audio->rtp->external_port == -1) { - call->upnp_session->audio->rtp->external_port = call->audio_port; - } - strncpy(call->upnp_session->audio->rtcp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); - strncpy(call->upnp_session->audio->rtcp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); - call->upnp_session->audio->rtcp->local_port = call->audio_port+1; - if(call->upnp_session->audio->rtcp->external_port == -1) { - call->upnp_session->audio->rtcp->external_port = call->audio_port+1; - } - if(audio) { - // Add audio port binding - linphone_upnp_context_send_add_port_binding(lupnp, call->upnp_session->audio->rtp); - linphone_upnp_context_send_add_port_binding(lupnp, call->upnp_session->audio->rtcp); - } else { - // Remove audio port binding - linphone_upnp_context_send_remove_port_binding(lupnp, call->upnp_session->audio->rtp); - linphone_upnp_context_send_remove_port_binding(lupnp, call->upnp_session->audio->rtcp); - } + linphone_upnp_update_port_binding(lupnp, &call->upnp_session->audio->rtp, + UPNP_IGD_IP_PROTOCOL_UDP, (audio)? call->audio_port:0, UPNP_CALL_RETRY_DELAY); + linphone_upnp_update_port_binding(lupnp, &call->upnp_session->audio->rtcp, + UPNP_IGD_IP_PROTOCOL_UDP, (audio)? call->audio_port+1:0, UPNP_CALL_RETRY_DELAY); + /* * Video part */ - strncpy(call->upnp_session->video->rtp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); - strncpy(call->upnp_session->video->rtp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); - call->upnp_session->video->rtp->local_port = call->video_port; - if(call->upnp_session->video->rtp->external_port == -1) { - call->upnp_session->video->rtp->external_port = call->video_port; - } - strncpy(call->upnp_session->video->rtcp->local_addr, local_addr, LINPHONE_IPADDR_SIZE); - strncpy(call->upnp_session->video->rtcp->external_addr, external_addr, LINPHONE_IPADDR_SIZE); - call->upnp_session->video->rtcp->local_port = call->video_port+1; - if(call->upnp_session->video->rtcp->external_port == -1) { - call->upnp_session->video->rtcp->external_port = call->video_port+1; - } - if(video) { - // Add video port binding - linphone_upnp_context_send_add_port_binding(lupnp, call->upnp_session->video->rtp); - linphone_upnp_context_send_add_port_binding(lupnp, call->upnp_session->video->rtcp); - } else { - // Remove video port binding - linphone_upnp_context_send_remove_port_binding(lupnp, call->upnp_session->video->rtp); - linphone_upnp_context_send_remove_port_binding(lupnp, call->upnp_session->video->rtcp); - } + linphone_upnp_update_port_binding(lupnp, &call->upnp_session->video->rtp, + UPNP_IGD_IP_PROTOCOL_UDP, (video)? call->video_port:0, UPNP_CALL_RETRY_DELAY); + + linphone_upnp_update_port_binding(lupnp, &call->upnp_session->video->rtcp, + UPNP_IGD_IP_PROTOCOL_UDP, (video)? call->video_port+1:0, UPNP_CALL_RETRY_DELAY); } ms_mutex_unlock(&lupnp->mutex); @@ -588,6 +575,7 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool } + int linphone_core_update_upnp_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md) { bool_t audio = FALSE; bool_t video = FALSE; @@ -615,6 +603,23 @@ void linphone_core_update_upnp_state_in_call_stats(LinphoneCall *call) { call->stats[LINPHONE_CALL_STATS_VIDEO].upnp_state = call->upnp_session->video->state; } +void linphone_upnp_update_stream_state(UpnpStream *stream) { + if((stream->rtp == NULL || stream->rtp->state == LinphoneUpnpStateOk || stream->rtp->state == LinphoneUpnpStateIdle) && + (stream->rtcp == NULL || stream->rtcp->state == LinphoneUpnpStateOk || stream->rtcp->state == LinphoneUpnpStateIdle)) { + stream->state = LinphoneUpnpStateOk; + } else if((stream->rtp != NULL && + (stream->rtp->state == LinphoneUpnpStateAdding || stream->rtp->state == LinphoneUpnpStateRemoving)) || + (stream->rtcp != NULL && + (stream->rtcp->state == LinphoneUpnpStateAdding || stream->rtcp->state == LinphoneUpnpStateRemoving))) { + stream->state = LinphoneUpnpStatePending; + } else if((stream->rtp != NULL && stream->rtp->state == LinphoneUpnpStateKo) || + (stream->rtcp != NULL && stream->rtcp->state == LinphoneUpnpStateKo)) { + stream->state = LinphoneUpnpStateKo; + } else { + ms_error("Invalid stream %p state", stream); + } +} + int linphone_upnp_call_process(LinphoneCall *call) { LinphoneCore *lc = call->core; UpnpContext *lupnp = lc->upnp; @@ -634,38 +639,12 @@ int linphone_upnp_call_process(LinphoneCall *call) { /* * Update Audio state */ - if((call->upnp_session->audio->rtp->state == LinphoneUpnpStateOk || call->upnp_session->audio->rtp->state == LinphoneUpnpStateIdle) && - (call->upnp_session->audio->rtcp->state == LinphoneUpnpStateOk || call->upnp_session->audio->rtcp->state == LinphoneUpnpStateIdle)) { - call->upnp_session->audio->state = LinphoneUpnpStateOk; - } else if(call->upnp_session->audio->rtp->state == LinphoneUpnpStateAdding || - call->upnp_session->audio->rtp->state == LinphoneUpnpStateRemoving || - call->upnp_session->audio->rtcp->state == LinphoneUpnpStateAdding || - call->upnp_session->audio->rtcp->state == LinphoneUpnpStateRemoving) { - call->upnp_session->audio->state = LinphoneUpnpStatePending; - } else if(call->upnp_session->audio->rtcp->state == LinphoneUpnpStateKo || - call->upnp_session->audio->rtp->state == LinphoneUpnpStateKo) { - call->upnp_session->audio->state = LinphoneUpnpStateKo; - } else { - call->upnp_session->audio->state = LinphoneUpnpStateIdle; - } + linphone_upnp_update_stream_state(call->upnp_session->audio); /* * Update Video state */ - if((call->upnp_session->video->rtp->state == LinphoneUpnpStateOk || call->upnp_session->video->rtp->state == LinphoneUpnpStateIdle) && - (call->upnp_session->video->rtcp->state == LinphoneUpnpStateOk || call->upnp_session->video->rtcp->state == LinphoneUpnpStateIdle)) { - call->upnp_session->video->state = LinphoneUpnpStateOk; - } else if(call->upnp_session->video->rtp->state == LinphoneUpnpStateAdding || - call->upnp_session->video->rtp->state == LinphoneUpnpStateRemoving || - call->upnp_session->video->rtcp->state == LinphoneUpnpStateAdding || - call->upnp_session->video->rtcp->state == LinphoneUpnpStateRemoving) { - call->upnp_session->video->state = LinphoneUpnpStatePending; - } else if(call->upnp_session->video->rtcp->state == LinphoneUpnpStateKo || - call->upnp_session->video->rtp->state == LinphoneUpnpStateKo) { - call->upnp_session->video->state = LinphoneUpnpStateKo; - } else { - call->upnp_session->video->state = LinphoneUpnpStateIdle; - } + linphone_upnp_update_stream_state(call->upnp_session->video); /* * Update session state @@ -733,7 +712,6 @@ void linphone_core_upnp_refresh(UpnpContext *lupnp) { ms_message("uPnP IGD: Refresh mappings"); - /* Remove context port bindings */ if(lupnp->sip_udp != NULL) { global_list = ms_list_append(global_list, lupnp->sip_udp); } @@ -744,26 +722,32 @@ void linphone_core_upnp_refresh(UpnpContext *lupnp) { global_list = ms_list_append(global_list, lupnp->sip_tls); } - /* Remove call port bindings */ list = lupnp->lc->calls; while(list != NULL) { call = (LinphoneCall *)list->data; if(call->upnp_session != NULL) { - global_list = ms_list_append(global_list, call->upnp_session->audio->rtp); - global_list = ms_list_append(global_list, call->upnp_session->audio->rtcp); - global_list = ms_list_append(global_list, call->upnp_session->video->rtp); - global_list = ms_list_append(global_list, call->upnp_session->video->rtcp); + if(call->upnp_session->audio->rtp != NULL) { + global_list = ms_list_append(global_list, call->upnp_session->audio->rtp); + } + if(call->upnp_session->audio->rtcp != NULL) { + global_list = ms_list_append(global_list, call->upnp_session->audio->rtcp); + } + if(call->upnp_session->video->rtp != NULL) { + global_list = ms_list_append(global_list, call->upnp_session->video->rtp); + } + if(call->upnp_session->video->rtcp != NULL) { + global_list = ms_list_append(global_list, call->upnp_session->video->rtcp); + } } list = list->next; } - // Remove port binding configurations list = linphone_upnp_config_list_port_bindings(lupnp->lc->config); for(item = list;item != NULL; item = item->next) { port_mapping = (UpnpPortBinding *)item->data; port_mapping2 = linphone_upnp_port_binding_equivalent_in_list(global_list, port_mapping); if(port_mapping2 == NULL) { - linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping); + linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping, TRUE); } else if(port_mapping2->state == LinphoneUpnpStateIdle){ /* Force to remove */ port_mapping2->state = LinphoneUpnpStateOk; @@ -777,20 +761,76 @@ void linphone_core_upnp_refresh(UpnpContext *lupnp) { list = global_list; while(list != NULL) { port_mapping = (UpnpPortBinding *)list->data; - linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping); - linphone_upnp_context_send_add_port_binding(lupnp, port_mapping); + linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping, TRUE); + linphone_upnp_context_send_add_port_binding(lupnp, port_mapping, TRUE); list = list->next; } global_list = ms_list_free(global_list); } +void linphone_upnp_update_port_binding(UpnpContext *lupnp, UpnpPortBinding **port_mapping, upnp_igd_ip_protocol protocol, int port, int retry_delay) { + const char *local_addr, *external_addr; + time_t now = time(NULL); + if(port != 0) { + if(*port_mapping != NULL) { + if(port != (*port_mapping)->local_port) { + linphone_upnp_context_send_remove_port_binding(lupnp, *port_mapping, FALSE); + *port_mapping = NULL; + } + } + if(*port_mapping == NULL) { + *port_mapping = linphone_upnp_port_binding_new_or_collect(lupnp->pending_bindings, protocol, port, port); + } + + // Get addresses + local_addr = upnp_igd_get_local_ipaddress(lupnp->upnp_igd_ctxt); + external_addr = upnp_igd_get_external_ipaddress(lupnp->upnp_igd_ctxt); + + // Force binding update on local address change + if(local_addr != NULL) { + if(strncmp((*port_mapping)->local_addr, local_addr, sizeof((*port_mapping)->local_addr))) { + linphone_upnp_context_send_remove_port_binding(lupnp, *port_mapping, FALSE); + strncpy((*port_mapping)->local_addr, local_addr, sizeof((*port_mapping)->local_addr)); + } + } else { + ms_warning("uPnP IGD: can't get local address"); + } + if(external_addr != NULL) { + strncpy((*port_mapping)->external_addr, external_addr, sizeof((*port_mapping)->external_addr)); + } else { + ms_warning("uPnP IGD: can't get external address"); + } + + // Add (if not already done) the binding + if(now - (*port_mapping)->last_update >= retry_delay) { + (*port_mapping)->last_update = now; + linphone_upnp_context_send_add_port_binding(lupnp, *port_mapping, FALSE); + } + } else { + if(*port_mapping != NULL) { + linphone_upnp_context_send_remove_port_binding(lupnp, *port_mapping, FALSE); + *port_mapping = NULL; + } + } +} + bool_t linphone_core_upnp_hook(void *data) { char key[64]; + LCSipTransports transport; MSList *item; UpnpPortBinding *port_mapping; UpnpContext *lupnp = (UpnpContext *)data; + ms_mutex_lock(&lupnp->mutex); + /* Update ports */ + if(lupnp->state == LinphoneUpnpStateOk) { + linphone_core_get_sip_transports(lupnp->lc, &transport); + linphone_upnp_update_port_binding(lupnp, &lupnp->sip_udp, UPNP_IGD_IP_PROTOCOL_UDP, transport.udp_port, UPNP_CORE_RETRY_DELAY); + linphone_upnp_update_port_binding(lupnp, &lupnp->sip_tcp, UPNP_IGD_IP_PROTOCOL_TCP, transport.tcp_port, UPNP_CORE_RETRY_DELAY); + linphone_upnp_update_port_binding(lupnp, &lupnp->sip_tls, UPNP_IGD_IP_PROTOCOL_TCP, transport.tls_port, UPNP_CORE_RETRY_DELAY); + } + /* Add configs */ for(item = lupnp->adding_configs;item!=NULL;item=item->next) { port_mapping = (UpnpPortBinding *)item->data; @@ -835,11 +875,11 @@ int linphone_core_update_local_media_description_from_upnp(SalMediaDescription * upnpStream = session->video; } if(upnpStream != NULL) { - if(upnpStream->rtp->state == LinphoneUpnpStateOk) { + if(upnpStream->rtp != NULL && upnpStream->rtp->state == LinphoneUpnpStateOk) { strncpy(stream->rtp_addr, upnpStream->rtp->external_addr, LINPHONE_IPADDR_SIZE); stream->rtp_port = upnpStream->rtp->external_port; } - if(upnpStream->rtcp->state == LinphoneUpnpStateOk) { + if(upnpStream->rtcp != NULL && upnpStream->rtcp->state == LinphoneUpnpStateOk) { strncpy(stream->rtcp_addr, upnpStream->rtcp->external_addr, LINPHONE_IPADDR_SIZE); stream->rtcp_port = upnpStream->rtcp->external_port; } @@ -858,6 +898,7 @@ UpnpPortBinding *linphone_upnp_port_binding_new() { port = ms_new0(UpnpPortBinding,1); ms_mutex_init(&port->mutex, NULL); port->state = LinphoneUpnpStateIdle; + port->protocol = UPNP_IGD_IP_PROTOCOL_UDP; port->local_addr[0] = '\0'; port->local_port = -1; port->external_addr[0] = '\0'; @@ -865,9 +906,30 @@ UpnpPortBinding *linphone_upnp_port_binding_new() { port->to_remove = FALSE; port->to_add = FALSE; port->ref = 1; + port->last_update = 0; return port; } +UpnpPortBinding *linphone_upnp_port_binding_new_with_parameters(upnp_igd_ip_protocol protocol, int local_port, int external_port) { + UpnpPortBinding *port_binding = linphone_upnp_port_binding_new(); + port_binding->protocol = protocol; + port_binding->local_port = local_port; + port_binding->external_port = external_port; + return port_binding; +} + +UpnpPortBinding *linphone_upnp_port_binding_new_or_collect(MSList *list, upnp_igd_ip_protocol protocol, int local_port, int external_port) { + UpnpPortBinding *tmp_binding; + UpnpPortBinding *end_binding; + end_binding = linphone_upnp_port_binding_new_with_parameters(protocol, local_port, external_port); + tmp_binding = linphone_upnp_port_binding_equivalent_in_list(list, end_binding); + if(tmp_binding != NULL) { + linphone_upnp_port_binding_release(end_binding); + end_binding = tmp_binding; + } + return end_binding; +} + UpnpPortBinding *linphone_upnp_port_binding_copy(const UpnpPortBinding *port) { UpnpPortBinding *new_port = NULL; new_port = ms_new0(UpnpPortBinding,1); @@ -939,18 +1001,20 @@ void linphone_upnp_port_binding_release(UpnpPortBinding *port) { UpnpStream* linphone_upnp_stream_new() { UpnpStream *stream = ms_new0(UpnpStream,1); stream->state = LinphoneUpnpStateIdle; - stream->rtp = linphone_upnp_port_binding_new(); - stream->rtp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; - stream->rtcp = linphone_upnp_port_binding_new(); - stream->rtcp->protocol = UPNP_IGD_IP_PROTOCOL_UDP; + stream->rtp = NULL; + stream->rtcp = NULL; return stream; } void linphone_upnp_stream_destroy(UpnpStream* stream) { - linphone_upnp_port_binding_release(stream->rtp); - stream->rtp = NULL; - linphone_upnp_port_binding_release(stream->rtcp); - stream->rtcp = NULL; + if(stream->rtp != NULL) { + linphone_upnp_port_binding_release(stream->rtp); + stream->rtp = NULL; + } + if(stream->rtcp != NULL) { + linphone_upnp_port_binding_release(stream->rtcp); + stream->rtcp = NULL; + } ms_free(stream); } @@ -973,10 +1037,18 @@ void linphone_upnp_session_destroy(UpnpSession *session) { if(lc->upnp != NULL) { /* Remove bindings */ - linphone_upnp_context_send_remove_port_binding(lc->upnp, session->audio->rtp); - linphone_upnp_context_send_remove_port_binding(lc->upnp, session->audio->rtcp); - linphone_upnp_context_send_remove_port_binding(lc->upnp, session->video->rtp); - linphone_upnp_context_send_remove_port_binding(lc->upnp, session->video->rtcp); + if(session->audio->rtp != NULL) { + linphone_upnp_context_send_remove_port_binding(lc->upnp, session->audio->rtp, TRUE); + } + if(session->audio->rtcp != NULL) { + linphone_upnp_context_send_remove_port_binding(lc->upnp, session->audio->rtcp, TRUE); + } + if(session->video->rtp != NULL) { + linphone_upnp_context_send_remove_port_binding(lc->upnp, session->video->rtp, TRUE); + } + if(session->video->rtcp != NULL) { + linphone_upnp_context_send_remove_port_binding(lc->upnp, session->video->rtcp, TRUE); + } } linphone_upnp_stream_destroy(session->audio); diff --git a/coreapi/upnp.h b/coreapi/upnp.h index 08483588e..fe403a772 100644 --- a/coreapi/upnp.h +++ b/coreapi/upnp.h @@ -41,6 +41,7 @@ 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); int linphone_upnp_context_get_external_port(UpnpContext *ctx); +bool_t linphone_upnp_context_is_ready_for_register(UpnpContext *ctx); void linphone_core_update_upnp_state_in_call_stats(LinphoneCall *call); #endif //LINPHONE_UPNP_H diff --git a/gtk/propertybox.c b/gtk/propertybox.c index c2258ea57..5aee3f430 100644 --- a/gtk/propertybox.c +++ b/gtk/propertybox.c @@ -1083,6 +1083,10 @@ void linphone_gtk_show_parameters(void){ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_upnp")),TRUE); break; } + if(!linphone_core_upnp_available(lc)) { + gtk_widget_hide(linphone_gtk_get_widget(pb,"use_upnp")); + } + mtu=linphone_core_get_mtu(lc); if (mtu<=0){ gtk_widget_set_sensitive(linphone_gtk_get_widget(pb,"mtu"),FALSE); From be6165d8615cf4176a98193931d1579830d7bd31 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 18 Feb 2013 14:59:48 +0100 Subject: [PATCH 087/281] Fix uPnP issues. Correct registration and update with uPnP --- coreapi/proxy.c | 5 ++-- coreapi/upnp.c | 63 ++++++++++++++++++++++++++++++++++++++----------- mediastreamer2 | 2 +- 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 559547727..75930adb1 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -1100,10 +1100,11 @@ void linphone_proxy_config_update(LinphoneProxyConfig *cfg){ switch(linphone_core_get_firewall_policy(lc)) { case LinphonePolicyUseUpnp: #ifdef BUILD_UPNP - if(lc->upnp != NULL && !linphone_upnp_context_is_ready_for_register(lc->upnp)) { + if(!lc->sip_conf.register_only_when_upnp_is_ok || + (lc->upnp != NULL && !linphone_upnp_context_is_ready_for_register(lc->upnp))) { break; } -#endif +#endif //BUILD_UPNP default: if ((!lc->sip_conf.register_only_when_network_is_up || lc->network_reachable)) { linphone_proxy_config_register(cfg); diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 0713a1d52..deb096b9c 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -21,9 +21,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "private.h" #include "lpconfig.h" -#define UPNP_ADD_MAX_RETRY 4 +#define UPNP_ADD_MAX_RETRY 4 #define UPNP_REMOVE_MAX_RETRY 4 -#define UPNP_SECTION_NAME "uPnP" +#define UPNP_SECTION_NAME "uPnP" +#define UPNP_CORE_READY_CHECK 1 #define UPNP_CORE_RETRY_DELAY 4 #define UPNP_CALL_RETRY_DELAY 1 @@ -72,7 +73,9 @@ struct _UpnpContext { ms_mutex_t mutex; ms_cond_t empty_cond; - + + time_t last_ready_check; + LinphoneUpnpState last_ready_state; }; @@ -252,6 +255,9 @@ UpnpContext* linphone_upnp_context_new(LinphoneCore *lc) { ms_mutex_init(&lupnp->mutex, NULL); ms_cond_init(&lupnp->empty_cond, NULL); + lupnp->last_ready_check = 0; + lupnp->last_ready_state = LinphoneUpnpStateIdle; + lupnp->lc = lc; lupnp->pending_bindings = NULL; lupnp->adding_configs = NULL; @@ -347,16 +353,17 @@ LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *lupnp) { return state; } -bool_t linphone_upnp_context_is_ready_for_register(UpnpContext *lupnp) { +bool_t _linphone_upnp_context_is_ready_for_register(UpnpContext *lupnp) { bool_t ready = TRUE; - ms_mutex_lock(&lupnp->mutex); - + // 1 Check global uPnP state ready = (lupnp->state == LinphoneUpnpStateOk); // 2 Check external ip address - if(ready && upnp_igd_get_external_ipaddress(lupnp->upnp_igd_ctxt) == NULL) { - ready = FALSE; + if(ready) { + if (upnp_igd_get_external_ipaddress(lupnp->upnp_igd_ctxt) == NULL) { + ready = FALSE; + } } // 3 Check sip ports bindings @@ -377,7 +384,14 @@ bool_t linphone_upnp_context_is_ready_for_register(UpnpContext *lupnp) { ready = FALSE; } } + + return ready; +} +bool_t linphone_upnp_context_is_ready_for_register(UpnpContext *lupnp) { + bool_t ready; + ms_mutex_lock(&lupnp->mutex); + ready = _linphone_upnp_context_is_ready_for_register(lupnp); ms_mutex_unlock(&lupnp->mutex); return ready; } @@ -541,6 +555,7 @@ int linphone_core_update_upnp_audio_video(LinphoneCall *call, bool_t audio, bool } ms_mutex_lock(&lupnp->mutex); + // Don't handle when the call if(lupnp->state == LinphoneUpnpStateOk && call->upnp_session != NULL) { ret = 0; @@ -785,20 +800,16 @@ void linphone_upnp_update_port_binding(UpnpContext *lupnp, UpnpPortBinding **por // Get addresses local_addr = upnp_igd_get_local_ipaddress(lupnp->upnp_igd_ctxt); external_addr = upnp_igd_get_external_ipaddress(lupnp->upnp_igd_ctxt); - + // Force binding update on local address change if(local_addr != NULL) { if(strncmp((*port_mapping)->local_addr, local_addr, sizeof((*port_mapping)->local_addr))) { linphone_upnp_context_send_remove_port_binding(lupnp, *port_mapping, FALSE); strncpy((*port_mapping)->local_addr, local_addr, sizeof((*port_mapping)->local_addr)); } - } else { - ms_warning("uPnP IGD: can't get local address"); } if(external_addr != NULL) { strncpy((*port_mapping)->external_addr, external_addr, sizeof((*port_mapping)->external_addr)); - } else { - ms_warning("uPnP IGD: can't get external address"); } // Add (if not already done) the binding @@ -817,7 +828,9 @@ void linphone_upnp_update_port_binding(UpnpContext *lupnp, UpnpPortBinding **por bool_t linphone_core_upnp_hook(void *data) { char key[64]; LCSipTransports transport; - MSList *item; + const MSList *item; + LinphoneUpnpState ready_state; + time_t now = time(NULL); UpnpPortBinding *port_mapping; UpnpContext *lupnp = (UpnpContext *)data; @@ -831,6 +844,28 @@ bool_t linphone_core_upnp_hook(void *data) { linphone_upnp_update_port_binding(lupnp, &lupnp->sip_tls, UPNP_IGD_IP_PROTOCOL_TCP, transport.tls_port, UPNP_CORE_RETRY_DELAY); } + /* Refresh registers if we are ready */ + if(now - lupnp->last_ready_check >= UPNP_CORE_READY_CHECK) { + lupnp->last_ready_check = now; + ready_state = (_linphone_upnp_context_is_ready_for_register(lupnp))? LinphoneUpnpStateOk: LinphoneUpnpStateKo; + if(ready_state != lupnp->last_ready_state) { + for(item=linphone_core_get_proxy_config_list(lupnp->lc);item!=NULL;item=item->next) { + LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)item->data; + if (linphone_proxy_config_register_enabled(cfg)) { + if (ready_state != LinphoneUpnpStateOk) { + // Only reset ithe registration if we require that upnp should be ok + if(lupnp->lc->sip_conf.register_only_when_upnp_is_ok) { + linphone_proxy_config_set_state(cfg, LinphoneRegistrationNone, "Registration impossible (uPnP not ready)"); + } + } else { + cfg->commit=TRUE; + } + } + } + lupnp->last_ready_state = ready_state; + } + } + /* Add configs */ for(item = lupnp->adding_configs;item!=NULL;item=item->next) { port_mapping = (UpnpPortBinding *)item->data; diff --git a/mediastreamer2 b/mediastreamer2 index 44992c096..73a772ac4 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 44992c096673ace578ba5248db7019ba1e0d78d5 +Subproject commit 73a772ac4754734c57ecbc1149cbe665acd2f376 From e546e97a353d6fc2b40f994514bc15ecae34bab5 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 18 Feb 2013 15:00:19 +0100 Subject: [PATCH 088/281] Fix memory leak on linphone core unfree variables --- coreapi/linphonecore.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 608d1c6e5..8068964c0 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -5176,7 +5176,6 @@ static void linphone_core_uninit(LinphoneCore *lc) usleep(50000); #endif } - #ifdef BUILD_UPNP if(lc->upnp != NULL) { linphone_upnp_context_destroy(lc->upnp); @@ -5214,6 +5213,17 @@ static void linphone_core_uninit(LinphoneCore *lc) ms_list_for_each(lc->last_recv_msg_ids,ms_free); lc->last_recv_msg_ids=ms_list_free(lc->last_recv_msg_ids); + + // Free struct variable + if(lc->zrtp_secrets_cache != NULL) { + ms_free(lc->zrtp_secrets_cache); + } + if(lc->play_file!=NULL){ + ms_free(lc->play_file); + } + if(lc->rec_file!=NULL){ + ms_free(lc->rec_file); + } linphone_core_free_payload_types(lc); ortp_exit(); From 3694186ac925f7e92e753810d1d9e4880d00ee8e Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 19 Feb 2013 11:21:20 +0100 Subject: [PATCH 089/281] Add configurable delay timeout for ice/upnp --- coreapi/linphonecore.c | 26 +++++++++++++++++++++++++- coreapi/linphonecore.h | 4 ++++ coreapi/private.h | 1 + mediastreamer2 | 2 +- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 8068964c0..ea439dc24 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -666,6 +666,9 @@ static void sip_config_read(LinphoneCore *lc) tmp=lp_config_get_int(lc->config,"sip","in_call_timeout",0); linphone_core_set_in_call_timeout(lc,tmp); + + tmp=lp_config_get_int(lc->config,"sip","delayed_timeout",4); + linphone_core_set_delayed_timeout(lc,tmp); /* get proxies config */ for(i=0;; i++){ @@ -2092,7 +2095,7 @@ void linphone_core_iterate(LinphoneCore *lc){ linphone_core_start_invite() */ calls=calls->next; linphone_call_background_tasks(call,one_second_elapsed); - if (call->state==LinphoneCallOutgoingInit && (elapsed>=4)){ + if (call->state==LinphoneCallOutgoingInit && (elapsed>=lc->sip_conf.delayed_timeout)){ /*start the call even if the OPTIONS reply did not arrive*/ if (call->ice_session != NULL) { ms_warning("ICE candidates gathering from [%s] has not finished yet, proceed with the call without ICE anyway." @@ -3493,6 +3496,26 @@ int linphone_core_get_in_call_timeout(LinphoneCore *lc){ return lc->sip_conf.in_call_timeout; } +/** + * Returns the delayed timeout + * + * @ingroup call_control + * See linphone_core_set_delayed_timeout() for details. +**/ +int linphone_core_get_delayed_timeout(LinphoneCore *lc){ + return lc->sip_conf.delayed_timeout; +} + +/** + * Set the in delayed timeout in seconds. + * + * @ingroup call_control + * After this timeout period, a delayed call (internal call initialisation or resolution) is resumed. +**/ +void linphone_core_set_delayed_timeout(LinphoneCore *lc, int seconds){ + lc->sip_conf.delayed_timeout=seconds; +} + void linphone_core_set_presence_info(LinphoneCore *lc,int minutes_away, const char *contact, LinphoneOnlineStatus presence_mode) @@ -5014,6 +5037,7 @@ void sip_config_uninit(LinphoneCore *lc) lp_config_set_string(lc->config,"sip","contact",config->contact); lp_config_set_int(lc->config,"sip","inc_timeout",config->inc_timeout); lp_config_set_int(lc->config,"sip","in_call_timeout",config->in_call_timeout); + lp_config_set_int(lc->config,"sip","delayed_timeout",config->delayed_timeout); lp_config_set_int(lc->config,"sip","use_info",config->use_info); lp_config_set_int(lc->config,"sip","use_rfc2833",config->use_rfc2833); lp_config_set_int(lc->config,"sip","use_ipv6",config->ipv6_enabled); diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 774ef925b..78193aaa0 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1099,6 +1099,10 @@ void linphone_core_set_in_call_timeout(LinphoneCore *lc, int seconds); int linphone_core_get_in_call_timeout(LinphoneCore *lc); +void linphone_core_set_delayed_timeout(LinphoneCore *lc, int seconds); + +int linphone_core_get_delayed_timeout(LinphoneCore *lc); + void linphone_core_set_stun_server(LinphoneCore *lc, const char *server); const char * linphone_core_get_stun_server(const LinphoneCore *lc); diff --git a/coreapi/private.h b/coreapi/private.h index 149fbac58..90054052c 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -420,6 +420,7 @@ typedef struct sip_config MSList *deleted_proxies; int inc_timeout; /*timeout after an un-answered incoming call is rejected*/ int in_call_timeout; /*timeout after a call is hangup */ + int delayed_timeout; /*timeout after a delayed call is resumed */ unsigned int keepalive_period; /* interval in ms between keep alive messages sent to the proxy server*/ LCSipTransports transports; bool_t use_info; diff --git a/mediastreamer2 b/mediastreamer2 index 73a772ac4..756a51419 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 73a772ac4754734c57ecbc1149cbe665acd2f376 +Subproject commit 756a51419d833105a6378db71679073f6e9492b0 From 9cb68a7d8d55561bd3df6e69ba0523c45ef2f3e4 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 19 Feb 2013 15:07:10 +0100 Subject: [PATCH 090/281] Disable ping options when uPnP is working --- coreapi/linphonecall.c | 23 +++++++++++++++-------- coreapi/linphonecore.c | 24 ++++++++++++++++-------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 6a39783e7..a7cad386c 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -508,14 +508,21 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro call->core=lc; if (lc->sip_conf.ping_with_options){ - /*the following sends an option request back to the caller so that - we get a chance to discover our nat'd address before answering.*/ - call->ping_op=sal_op_new(lc->sal); - from_str=linphone_address_as_string_uri_only(from); - sal_op_set_route(call->ping_op,sal_op_get_network_origin(op)); - sal_op_set_user_pointer(call->ping_op,call); - sal_ping(call->ping_op,linphone_core_find_best_identity(lc,from,NULL),from_str); - ms_free(from_str); +#ifdef BUILD_UPNP + if (lc->upnp != NULL && linphone_core_get_firewall_policy(lc)==LinphonePolicyUseUpnp && + linphone_upnp_context_get_state(lc->upnp) == LinphoneUpnpStateOk) { +#else //BUILD_UPNP + { +#endif //BUILD_UPNP + /*the following sends an option request back to the caller so that + we get a chance to discover our nat'd address before answering.*/ + call->ping_op=sal_op_new(lc->sal); + from_str=linphone_address_as_string_uri_only(from); + sal_op_set_route(call->ping_op,sal_op_get_network_origin(op)); + sal_op_set_user_pointer(call->ping_op,call); + sal_ping(call->ping_op,linphone_core_find_best_identity(lc,from,NULL),from_str); + ms_free(from_str); + } } linphone_address_clean(from); diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index ea439dc24..bc421e51b 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2605,15 +2605,23 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const } if (call->dest_proxy==NULL && lc->sip_conf.ping_with_options==TRUE){ - /*defer the start of the call after the OPTIONS ping*/ - call->ping_replied=FALSE; - call->ping_op=sal_op_new(lc->sal); - sal_ping(call->ping_op,from,real_url); - sal_op_set_user_pointer(call->ping_op,call); - call->start_time=time(NULL); - }else{ - if (defer==FALSE) linphone_core_start_invite(lc,call); +#ifdef BUILD_UPNP + if (lc->upnp != NULL && linphone_core_get_firewall_policy(lc)==LinphonePolicyUseUpnp && + linphone_upnp_context_get_state(lc->upnp) == LinphoneUpnpStateOk) { +#else //BUILD_UPNP + { +#endif //BUILD_UPNP + /*defer the start of the call after the OPTIONS ping*/ + call->ping_replied=FALSE; + call->ping_op=sal_op_new(lc->sal); + sal_ping(call->ping_op,from,real_url); + sal_op_set_user_pointer(call->ping_op,call); + call->start_time=time(NULL); + defer = TRUE; + } } + + if (defer==FALSE) linphone_core_start_invite(lc,call); if (real_url!=NULL) ms_free(real_url); return call; From 61e01c6bc1ae04098370eb95e90309c2f9cb66ce Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 19 Feb 2013 16:07:58 +0100 Subject: [PATCH 091/281] Disable keep alive when using uPnP --- coreapi/linphonecore.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index bc421e51b..5ba0fbf70 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -4239,7 +4239,9 @@ void linphone_core_set_firewall_policy(LinphoneCore *lc, LinphoneFirewallPolicy ms_warning("UPNP is not available, reset firewall policy to no firewall"); pol = LinphonePolicyNoFirewall; } -#else //BUILD_UPNP +#endif //BUILD_UPNP + lc->net_conf.firewall_policy=pol; +#ifdef BUILD_UPNP if(pol == LinphonePolicyUseUpnp) { if(lc->upnp == NULL) { lc->upnp = linphone_upnp_context_new(lc); @@ -4249,9 +4251,9 @@ void linphone_core_set_firewall_policy(LinphoneCore *lc, LinphoneFirewallPolicy linphone_upnp_context_destroy(lc->upnp); lc->upnp = NULL; } - } + } + linphone_core_enable_keep_alive(lc, (lc->sip_conf.keepalive_period > 0)); #endif //BUILD_UPNP - lc->net_conf.firewall_policy=pol; if (lc->sip_conf.contact) update_primary_contact(lc); if (linphone_core_ready(lc)) lp_config_set_int(lc->config,"net","firewall_policy",pol); @@ -5490,6 +5492,11 @@ const char *linphone_error_to_string(LinphoneReason err){ * Enables signaling keep alive */ void linphone_core_enable_keep_alive(LinphoneCore* lc,bool_t enable) { +#ifdef BUILD_UPNP + if (linphone_core_get_firewall_policy(lc)==LinphonePolicyUseUpnp) { + enable = FALSE; + } +#endif //BUILD_UPNP if (enable > 0) { sal_use_tcp_tls_keepalive(lc->sal,lc->sip_conf.tcp_tls_keepalive); sal_set_keepalive_period(lc->sal,lc->sip_conf.keepalive_period); From 685a0b310f66985a606e15b2bc5f65b14a4cf401 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 19 Feb 2013 16:20:17 +0100 Subject: [PATCH 092/281] Fix uPnP dead lock --- coreapi/upnp.c | 60 ++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index deb096b9c..4f56e0c1a 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -661,6 +661,11 @@ int linphone_upnp_call_process(LinphoneCall *call) { */ linphone_upnp_update_stream_state(call->upnp_session->video); + /* + * Update stat + */ + linphone_core_update_upnp_state_in_call_stats(call); + /* * Update session state */ @@ -678,41 +683,34 @@ int linphone_upnp_call_process(LinphoneCall *call) { call->upnp_session->state = LinphoneUpnpStateIdle; } newState = call->upnp_session->state; - - /* When change is done proceed update */ - if(oldState != LinphoneUpnpStateOk && oldState != LinphoneUpnpStateKo && - (call->upnp_session->state == LinphoneUpnpStateOk || call->upnp_session->state == LinphoneUpnpStateKo)) { - if(call->upnp_session->state == LinphoneUpnpStateOk) - ms_message("uPnP IGD: uPnP for Call %p is ok", call); - else - ms_message("uPnP IGD: uPnP for Call %p is ko", call); - - switch (call->state) { - case LinphoneCallUpdating: - linphone_core_start_update_call(lc, call); - break; - case LinphoneCallUpdatedByRemote: - linphone_core_start_accept_call_update(lc, call); - break; - case LinphoneCallOutgoingInit: - linphone_core_proceed_with_invite_if_ready(lc, call, NULL); - break; - case LinphoneCallIdle: - linphone_core_notify_incoming_call(lc, call); - break; - default: - break; - } - } } ms_mutex_unlock(&lupnp->mutex); + + /* When change is done proceed update */ + if(oldState != LinphoneUpnpStateOk && oldState != LinphoneUpnpStateKo && + (newState == LinphoneUpnpStateOk || newState == LinphoneUpnpStateKo)) { + if(call->upnp_session->state == LinphoneUpnpStateOk) + ms_message("uPnP IGD: uPnP for Call %p is ok", call); + else + ms_message("uPnP IGD: uPnP for Call %p is ko", call); - /* - * Update uPnP call stats - */ - if(oldState != newState) { - linphone_core_update_upnp_state_in_call_stats(call); + switch (call->state) { + case LinphoneCallUpdating: + linphone_core_start_update_call(lc, call); + break; + case LinphoneCallUpdatedByRemote: + linphone_core_start_accept_call_update(lc, call); + break; + case LinphoneCallOutgoingInit: + linphone_core_proceed_with_invite_if_ready(lc, call, NULL); + break; + case LinphoneCallIdle: + linphone_core_notify_incoming_call(lc, call); + break; + default: + break; + } } return ret; From b8eff5b034d157bbbc9d7d641e8c37bd6470111a Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 19 Feb 2013 17:43:16 +0100 Subject: [PATCH 093/281] improve echo calibration add mising declineCall() method to java api. --- coreapi/ec-calibrator.c | 105 ++++++++++++------ coreapi/linphonecore.c | 6 +- coreapi/linphonecore_jni.cc | 19 ++++ coreapi/private.h | 3 +- .../org/linphone/core/LinphoneCore.java | 10 ++ java/common/org/linphone/core/Reason.java | 56 ++++++++++ .../org/linphone/core/LinphoneCoreImpl.java | 52 +++++---- mediastreamer2 | 2 +- 8 files changed, 196 insertions(+), 57 deletions(-) create mode 100644 java/common/org/linphone/core/Reason.java diff --git a/coreapi/ec-calibrator.c b/coreapi/ec-calibrator.c index 7fb001d3d..8efbabb1b 100644 --- a/coreapi/ec-calibrator.c +++ b/coreapi/ec-calibrator.c @@ -97,17 +97,37 @@ static void ecc_deinit_filters(EcCalibrator *ecc){ static void on_tone_sent(void *data, MSFilter *f, unsigned int event_id, void *arg){ MSDtmfGenEvent *ev=(MSDtmfGenEvent*)arg; EcCalibrator *ecc=(EcCalibrator*)data; - ecc->sent_count++; ecc->acc-=ev->tone_start_time; ms_message("Sent tone at %u",(unsigned int)ev->tone_start_time); } +static bool_t is_valid_tone(EcCalibrator *ecc, MSToneDetectorEvent *ev){ + bool_t *toneflag=NULL; + if (strcmp(ev->tone_name,"freq1")==0){ + toneflag=&ecc->freq1; + }else if (strcmp(ev->tone_name,"freq2")==0){ + toneflag=&ecc->freq2; + }else if (strcmp(ev->tone_name,"freq3")==0){ + toneflag=&ecc->freq3; + }else{ + ms_error("Calibrator bug."); + return FALSE; + } + if (*toneflag){ + ms_message("Duplicated tone event, ignored."); + return FALSE; + } + *toneflag=TRUE; + return TRUE; +} + static void on_tone_received(void *data, MSFilter *f, unsigned int event_id, void *arg){ MSToneDetectorEvent *ev=(MSToneDetectorEvent*)arg; EcCalibrator *ecc=(EcCalibrator*)data; - ecc->recv_count++; - ecc->acc+=ev->tone_start_time; - ms_message("Received tone at %u",(unsigned int)ev->tone_start_time); + if (is_valid_tone(ecc,ev)){ + ecc->acc+=ev->tone_start_time; + ms_message("Received tone at %u",(unsigned int)ev->tone_start_time); + } } static void ecc_play_tones(EcCalibrator *ecc){ @@ -116,53 +136,76 @@ static void ecc_play_tones(EcCalibrator *ecc){ ms_filter_set_notify_callback(ecc->det,on_tone_received,ecc); + /* configure the tones to be scanned */ + + strncpy(expected_tone.tone_name,"freq1",sizeof(expected_tone.tone_name)); expected_tone.frequency=2000; expected_tone.min_duration=40; - expected_tone.min_amplitude=0.02; + expected_tone.min_amplitude=0.1; ms_filter_call_method (ecc->det,MS_TONE_DETECTOR_ADD_SCAN,&expected_tone); - tone.frequency=1300; - tone.duration=1000; - tone.amplitude=1.0; + strncpy(expected_tone.tone_name,"freq2",sizeof(expected_tone.tone_name)); + expected_tone.frequency=2300; + expected_tone.min_duration=40; + expected_tone.min_amplitude=0.1; + ms_filter_call_method (ecc->det,MS_TONE_DETECTOR_ADD_SCAN,&expected_tone); + + strncpy(expected_tone.tone_name,"freq3",sizeof(expected_tone.tone_name)); + expected_tone.frequency=2500; + expected_tone.min_duration=40; + expected_tone.min_amplitude=0.1; + + ms_filter_call_method (ecc->det,MS_TONE_DETECTOR_ADD_SCAN,&expected_tone); + /*play an initial tone to startup the audio playback/capture*/ + + tone.frequency=140; + tone.duration=1000; + tone.amplitude=0.5; + ms_filter_call_method(ecc->gen,MS_DTMF_GEN_PLAY_CUSTOM,&tone); ms_sleep(2); ms_filter_set_notify_callback(ecc->gen,on_tone_sent,ecc); + + /* play the three tones*/ + tone.frequency=2000; tone.duration=100; - + ms_filter_call_method(ecc->gen,MS_DTMF_GEN_PLAY_CUSTOM,&tone); + ms_usleep(300000); + + tone.frequency=2300; + tone.duration=100; + ms_filter_call_method(ecc->gen,MS_DTMF_GEN_PLAY_CUSTOM,&tone); + ms_usleep(300000); + + tone.frequency=2500; + tone.duration=100; ms_filter_call_method(ecc->gen,MS_DTMF_GEN_PLAY_CUSTOM,&tone); ms_sleep(1); - ms_filter_call_method(ecc->gen,MS_DTMF_GEN_PLAY_CUSTOM,&tone); - ms_sleep(1); - ms_filter_call_method(ecc->gen,MS_DTMF_GEN_PLAY_CUSTOM,&tone); - ms_sleep(1); - - if (ecc->sent_count==3) { - if (ecc->recv_count==3){ - int delay=ecc->acc/3; - if (delay<0){ - ms_error("Quite surprising calibration result, delay=%i",delay); - ecc->status=LinphoneEcCalibratorFailed; - }else{ - ms_message("Echo calibration estimated delay to be %i ms",delay); - ecc->delay=delay; - ecc->status=LinphoneEcCalibratorDone; - } - } else if (ecc->recv_count == 0) { + + if (ecc->freq1 && ecc->freq2 && ecc->freq3) { + int delay=ecc->acc/3; + if (delay<0){ + ms_error("Quite surprising calibration result, delay=%i",delay); + ecc->status=LinphoneEcCalibratorFailed; + }else{ + ms_message("Echo calibration estimated delay to be %i ms",delay); + ecc->delay=delay; + ecc->status=LinphoneEcCalibratorDone; + } + } else if ((ecc->freq1 || ecc->freq2 || ecc->freq3)==FALSE) { ms_message("Echo calibration succeeded, no echo has been detected"); ecc->status = LinphoneEcCalibratorDoneNoEcho; - } else { + } else { ecc->status = LinphoneEcCalibratorFailed; - } - }else{ - ecc->status=LinphoneEcCalibratorFailed; } + if (ecc->status == LinphoneEcCalibratorFailed) { - ms_error("Echo calibration failed, tones received = %i",ecc->recv_count); + ms_error("Echo calibration failed."); } } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 5ba0fbf70..d9d199c3f 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2054,9 +2054,11 @@ void linphone_core_iterate(LinphoneCore *lc){ lc->ecc->cb(lc,ecs,lc->ecc->delay,lc->ecc->cb_data); if (ecs==LinphoneEcCalibratorDone){ int len=lp_config_get_int(lc->config,"sound","ec_tail_len",0); - lp_config_set_int(lc->config, "sound", "ec_delay",MAX(lc->ecc->delay-(len/2),0)); + int margin=len/2; + + lp_config_set_int(lc->config, "sound", "ec_delay",MAX(lc->ecc->delay-margin,0)); } else if (ecs == LinphoneEcCalibratorFailed) { - lp_config_set_int(lc->config, "sound", "ec_delay", LP_CONFIG_DEFAULT_INT(lc->config, "ec_delay", 250)); + lp_config_set_int(lc->config, "sound", "ec_delay", -1);/*use default value from soundcard*/ } else if (ecs == LinphoneEcCalibratorDoneNoEcho) { linphone_core_enable_echo_cancellation(lc, FALSE); } diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 64897b218..9c8697f6a 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -650,6 +650,13 @@ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_terminateCall( JNIEnv* linphone_core_terminate_call((LinphoneCore*)lc,(LinphoneCall*)call); } +extern "C" void Java_org_linphone_core_LinphoneCoreImpl_declineCall( JNIEnv* env + ,jobject thiz + ,jlong lc + ,jlong call, jint reason) { + linphone_core_decline_call((LinphoneCore*)lc,(LinphoneCall*)call,(LinphoneReason)reason); +} + extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_getRemoteAddress( JNIEnv* env ,jobject thiz ,jlong lc) { @@ -993,6 +1000,18 @@ extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_startEchoCalibration(JNI } +extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_needsEchoCalibration(JNIEnv *env, jobject thiz, jlong lc){ + MSSndCard *sndcard; + MSSndCardManager *m=ms_snd_card_manager_get(); + const char *card=linphone_core_get_capture_device((LinphoneCore*)lc); + sndcard=ms_snd_card_manager_get_card(m,card); + if (sndcard == NULL){ + ms_error("Could not get soundcard."); + return TRUE; + } + return (ms_snd_card_get_capabilities(sndcard) & MS_SND_CARD_CAP_BUILTIN_ECHO_CANCELLER) || (ms_snd_card_get_minimal_latency(sndcard)>0); +} + extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getMediaEncryption(JNIEnv* env ,jobject thiz ,jlong lc diff --git a/coreapi/private.h b/coreapi/private.h index 90054052c..c0b467cee 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -643,12 +643,11 @@ struct _EcCalibrator{ MSTicker *ticker; LinphoneEcCalibrationCallback cb; void *cb_data; - int recv_count; - int sent_count; int64_t acc; int delay; unsigned int rate; LinphoneEcCalibratorStatus status; + bool_t freq1,freq2,freq3; }; typedef struct _EcCalibrator EcCalibrator; diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index 11a7c275f..3a6cf2a76 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -396,6 +396,10 @@ public interface LinphoneCore { * @param aCall to be terminated */ public void terminateCall(LinphoneCall aCall); + /** + * Declines an incoming call, providing a reason for declining it. + */ + public void declineCall(LinphoneCall aCall, Reason reason); /** * Returns The LinphoneCall the current call if one is in call * @@ -744,6 +748,12 @@ public interface LinphoneCore { **/ void startEchoCalibration(Object data) throws LinphoneCoreException; + /** + * Returns true if echo calibration is recommended. + * If the device has a builtin echo canceller or calibration value is already known, it will return false. + */ + boolean needsEchoCalibration(); + void enableIpv6(boolean enable); /** * @deprecated diff --git a/java/common/org/linphone/core/Reason.java b/java/common/org/linphone/core/Reason.java new file mode 100644 index 000000000..b07686aa2 --- /dev/null +++ b/java/common/org/linphone/core/Reason.java @@ -0,0 +1,56 @@ +package org.linphone.core; + +import java.util.Vector; + +public class Reason { + static private Vector values = new Vector(); + /** + * None (no failure) + */ + static public Reason None = new Reason(0,"None"); + /** + * No response + */ + static public Reason NoResponse = new Reason(1,"NoResponse"); + /** + * Bad credentials + */ + static public Reason BadCredentials = new Reason(2,"BadCredentials"); + /** + * Call declined + */ + static public Reason Declined = new Reason(3,"Declined"); + /** + * Not found + */ + static public Reason NotFound = new Reason(4,"NotFound"); + /** + * Call not answered (in time). + */ + static public Reason NotAnswered = new Reason(5,"NotAnswered"); + /** + * Call not answered (in time). + */ + static public Reason Busy = new Reason(6,"Busy"); + + protected final int mValue; + private final String mStringValue; + + + private Reason(int value,String stringValue) { + mValue = value; + values.addElement(this); + mStringValue=stringValue; + } + public static Reason fromInt(int value) { + for (int i=0; i Date: Tue, 19 Feb 2013 17:50:50 +0100 Subject: [PATCH 094/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 73f3e2580..bd07524ce 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 73f3e2580927705f26a8eb2e98d8e15606ec6148 +Subproject commit bd07524cee5f8af9b95b0e8b6bfc8d5b541d8600 From 5888b4dd7e7a9f4597196e71891b7e30b4116703 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 20 Feb 2013 14:33:19 +0100 Subject: [PATCH 095/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index bd07524ce..674c20e4f 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit bd07524cee5f8af9b95b0e8b6bfc8d5b541d8600 +Subproject commit 674c20e4f186a8c2a3f91294aaa7b4bf419b7c3d From afa99dbf0152d30ac6d728519a04cd9605499097 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 20 Feb 2013 18:22:01 +0100 Subject: [PATCH 096/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 674c20e4f..a8538b58b 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 674c20e4f186a8c2a3f91294aaa7b4bf419b7c3d +Subproject commit a8538b58b7845f06f8526aca9bcf6657cf0abea5 From 1136049cf0ebd3246bb9152df7168ad90072e250 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 22 Feb 2013 16:39:26 +0100 Subject: [PATCH 097/281] Fix uPnP invalid memory access when destroying the context --- coreapi/upnp.c | 73 ++++++++++++++++++++++++++++---------------------- mediastreamer2 | 2 +- 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 4f56e0c1a..e9ce18df7 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -92,6 +92,7 @@ UpnpPortBinding *linphone_upnp_port_binding_retain(UpnpPortBinding *port); void linphone_upnp_update_port_binding(UpnpContext *lupnp, UpnpPortBinding **port_mapping, upnp_igd_ip_protocol protocol, int port, int retry_delay); void linphone_upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *port); void linphone_upnp_port_binding_release(UpnpPortBinding *port); +void linphone_upnp_update_config(UpnpContext *lupnp); // Configuration MSList *linphone_upnp_config_list_port_bindings(struct _LpConfig *lpc); @@ -307,14 +308,14 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) { ms_message("uPnP IGD: Wait all pending port bindings ..."); ms_cond_wait(&lupnp->empty_cond, &lupnp->mutex); } - ms_mutex_unlock(&lupnp->mutex); if(lupnp->upnp_igd_ctxt != NULL) { upnp_igd_destroy(lupnp->upnp_igd_ctxt); + lupnp->upnp_igd_ctxt = NULL; } - /* Run one time the hook for configuration update */ - linphone_core_upnp_hook(lupnp); + /* Run one more time configuration update */ + linphone_upnp_update_config(lupnp); /* Release port bindings */ if(lupnp->sip_udp != NULL) { @@ -337,6 +338,8 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) { lupnp->removing_configs = ms_list_free(lupnp->removing_configs); ms_list_for_each(lupnp->pending_bindings,(void (*)(void*))linphone_upnp_port_binding_release); lupnp->pending_bindings = ms_list_free(lupnp->pending_bindings); + + ms_mutex_unlock(&lupnp->mutex); ms_mutex_destroy(&lupnp->mutex); ms_cond_destroy(&lupnp->empty_cond); @@ -823,13 +826,43 @@ void linphone_upnp_update_port_binding(UpnpContext *lupnp, UpnpPortBinding **por } } -bool_t linphone_core_upnp_hook(void *data) { +void linphone_upnp_update_config(UpnpContext* lupnp) { char key[64]; - LCSipTransports transport; const MSList *item; - LinphoneUpnpState ready_state; - time_t now = time(NULL); UpnpPortBinding *port_mapping; + + /* Add configs */ + for(item = lupnp->adding_configs;item!=NULL;item=item->next) { + port_mapping = (UpnpPortBinding *)item->data; + snprintf(key, sizeof(key), "%s-%d-%d", + (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port_mapping->external_port, + port_mapping->local_port); + lp_config_set_string(lupnp->lc->config, UPNP_SECTION_NAME, key, "uPnP"); + linphone_upnp_port_binding_log(ORTP_DEBUG, "Configuration: Added port binding", port_mapping); + } + ms_list_for_each(lupnp->adding_configs,(void (*)(void*))linphone_upnp_port_binding_release); + lupnp->adding_configs = ms_list_free(lupnp->adding_configs); + + /* Remove configs */ + for(item = lupnp->removing_configs;item!=NULL;item=item->next) { + port_mapping = (UpnpPortBinding *)item->data; + snprintf(key, sizeof(key), "%s-%d-%d", + (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port_mapping->external_port, + port_mapping->local_port); + lp_config_set_string(lupnp->lc->config, UPNP_SECTION_NAME, key, NULL); + linphone_upnp_port_binding_log(ORTP_DEBUG, "Configuration: Removed port binding", port_mapping); + } + ms_list_for_each(lupnp->removing_configs,(void (*)(void*))linphone_upnp_port_binding_release); + lupnp->removing_configs = ms_list_free(lupnp->removing_configs); +} + +bool_t linphone_core_upnp_hook(void *data) { + LCSipTransports transport; + LinphoneUpnpState ready_state; + const MSList *item; + time_t now = time(NULL); UpnpContext *lupnp = (UpnpContext *)data; ms_mutex_lock(&lupnp->mutex); @@ -864,31 +897,7 @@ bool_t linphone_core_upnp_hook(void *data) { } } - /* Add configs */ - for(item = lupnp->adding_configs;item!=NULL;item=item->next) { - port_mapping = (UpnpPortBinding *)item->data; - snprintf(key, sizeof(key), "%s-%d-%d", - (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", - port_mapping->external_port, - port_mapping->local_port); - lp_config_set_string(lupnp->lc->config, UPNP_SECTION_NAME, key, "uPnP"); - linphone_upnp_port_binding_log(ORTP_DEBUG, "Configuration: Added port binding", port_mapping); - } - ms_list_for_each(lupnp->adding_configs,(void (*)(void*))linphone_upnp_port_binding_release); - lupnp->adding_configs = ms_list_free(lupnp->adding_configs); - - /* Remove configs */ - for(item = lupnp->removing_configs;item!=NULL;item=item->next) { - port_mapping = (UpnpPortBinding *)item->data; - snprintf(key, sizeof(key), "%s-%d-%d", - (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", - port_mapping->external_port, - port_mapping->local_port); - lp_config_set_string(lupnp->lc->config, UPNP_SECTION_NAME, key, NULL); - linphone_upnp_port_binding_log(ORTP_DEBUG, "Configuration: Removed port binding", port_mapping); - } - ms_list_for_each(lupnp->removing_configs,(void (*)(void*))linphone_upnp_port_binding_release); - lupnp->removing_configs = ms_list_free(lupnp->removing_configs); + linphone_upnp_update_config(lupnp); ms_mutex_unlock(&lupnp->mutex); return TRUE; diff --git a/mediastreamer2 b/mediastreamer2 index a8538b58b..841c656e8 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit a8538b58b7845f06f8526aca9bcf6657cf0abea5 +Subproject commit 841c656e8804d216e2aa28a170fe1473ae3f4732 From 08eb7e6fbe356d80d6dfd4b3e877d43435372ec6 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 22 Feb 2013 17:21:50 +0100 Subject: [PATCH 098/281] add call recording feature to conference fix broken gtk conference interface. --- coreapi/conference.c | 63 ++++- coreapi/linphonecore.c | 7 +- coreapi/linphonecore.h | 2 + coreapi/private.h | 1 + gtk/call_statistics.ui | 368 +++++++++++++++------------ gtk/conference.c | 127 ++++++---- gtk/incall_view.c | 118 ++++++--- gtk/linphone.h | 2 + gtk/main.c | 61 +++-- gtk/main.ui | 47 +++- gtk/propertybox.c | 29 ++- gtk/update.c | 0 linphone.kdevelop | 558 ----------------------------------------- 13 files changed, 523 insertions(+), 860 deletions(-) mode change 100755 => 100644 gtk/update.c delete mode 100644 linphone.kdevelop diff --git a/coreapi/conference.c b/coreapi/conference.c index a125673a2..16be62613 100644 --- a/coreapi/conference.c +++ b/coreapi/conference.c @@ -55,22 +55,38 @@ static void remove_local_endpoint(LinphoneConference *ctx){ } } +static int linphone_conference_get_size(LinphoneConference *conf){ + if (conf->conf == NULL) { + return 0; + } + return ms_audio_conference_get_size(conf->conf) - (conf->record_endpoint ? 1 : 0); +} + static int remote_participants_count(LinphoneConference *ctx) { - if (!ctx->conf || ms_audio_conference_get_size(ctx->conf)==0) return 0; - if (!ctx->local_participant) return ms_audio_conference_get_size(ctx->conf); - return ms_audio_conference_get_size(ctx->conf) -1; + int count=linphone_conference_get_size(ctx); + if (count==0) return 0; + if (!ctx->local_participant) return count; + return count -1; } void linphone_core_conference_check_uninit(LinphoneCore *lc){ LinphoneConference *ctx=&lc->conf_ctx; if (ctx->conf){ - ms_message("conference_check_uninit(): nmembers=%i",ms_audio_conference_get_size(ctx->conf)); - if (remote_participants_count(ctx)==1){ + int remote_count=remote_participants_count(ctx); + ms_message("conference_check_uninit(): size=%i",linphone_conference_get_size(ctx)); + if (remote_count==1){ convert_conference_to_call(lc); } - if (ms_audio_conference_get_size(ctx->conf)==1 && ctx->local_participant!=NULL){ - remove_local_endpoint(ctx); + if (remote_count==0){ + if (ctx->local_participant!=NULL) + remove_local_endpoint(ctx); + if (ctx->record_endpoint){ + ms_audio_conference_remove_member(ctx->conf,ctx->record_endpoint); + ms_audio_endpoint_destroy(ctx->record_endpoint); + ctx->record_endpoint=NULL; + } } + if (ms_audio_conference_get_size(ctx->conf)==0){ ms_audio_conference_destroy(ctx->conf); ctx->conf=NULL; @@ -381,10 +397,37 @@ int linphone_core_terminate_conference(LinphoneCore *lc) { * @returns the number of participants to the conference **/ int linphone_core_get_conference_size(LinphoneCore *lc) { - if (lc->conf_ctx.conf == NULL) { - return 0; + LinphoneConference *conf=&lc->conf_ctx; + return linphone_conference_get_size(conf); +} + + +int linphone_core_start_conference_recording(LinphoneCore *lc, const char *path){ + LinphoneConference *conf=&lc->conf_ctx; + if (conf->conf == NULL) { + ms_warning("linphone_core_start_conference_recording(): no conference now."); + return -1; } - return ms_audio_conference_get_size(lc->conf_ctx.conf); + if (conf->record_endpoint==NULL){ + conf->record_endpoint=ms_audio_endpoint_new_recorder(); + ms_audio_conference_add_member(conf->conf,conf->record_endpoint); + } + ms_audio_recorder_endpoint_start(conf->record_endpoint,path); + return 0; +} + +int linphone_core_stop_conference_recording(LinphoneCore *lc){ + LinphoneConference *conf=&lc->conf_ctx; + if (conf->conf == NULL) { + ms_warning("linphone_core_stop_conference_recording(): no conference now."); + return -1; + } + if (conf->record_endpoint==NULL){ + ms_warning("linphone_core_stop_conference_recording(): no record active."); + return -1; + } + ms_audio_recorder_endpoint_stop(conf->record_endpoint); + return 0; } /** diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index d9d199c3f..237590473 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -92,12 +92,7 @@ int lc_callback_obj_invoke(LCCallbackObj *obj, LinphoneCore *lc){ /*prevent a gcc bug with %c*/ static size_t my_strftime(char *s, size_t max, const char *fmt, const struct tm *tm){ -#if !defined(_WIN32_WCE) return strftime(s, max, fmt, tm); -#else - return 0; - /*FIXME*/ -#endif /*_WIN32_WCE*/ } static void set_call_log_date(LinphoneCallLog *cl, time_t start_time){ @@ -120,7 +115,7 @@ LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneAddress *fro set_call_log_date(cl,cl->start_date_time); cl->from=from; cl->to=to; - cl->status=LinphoneCallAborted; /*default status*/ + cl->status=LinphoneCallAborted; /*default status*/ return cl; } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 78193aaa0..2c2168646 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1368,6 +1368,8 @@ float linphone_core_get_conference_local_input_volume(LinphoneCore *lc); int linphone_core_terminate_conference(LinphoneCore *lc); int linphone_core_get_conference_size(LinphoneCore *lc); +int linphone_core_start_conference_recording(LinphoneCore *lc, const char *path); +int linphone_core_stop_conference_recording(LinphoneCore *lc); int linphone_core_get_max_calls(LinphoneCore *lc); void linphone_core_set_max_calls(LinphoneCore *lc, int max); diff --git a/coreapi/private.h b/coreapi/private.h index c0b467cee..41d453df3 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -530,6 +530,7 @@ struct _LinphoneConference{ MSAudioConference *conf; AudioStream *local_participant; MSAudioEndpoint *local_endpoint; + MSAudioEndpoint *record_endpoint; RtpProfile *local_dummy_profile; bool_t local_muted; }; diff --git a/gtk/call_statistics.ui b/gtk/call_statistics.ui index 6ed8bd9bd..c6f71deb6 100644 --- a/gtk/call_statistics.ui +++ b/gtk/call_statistics.ui @@ -1,179 +1,22 @@ - + + False 5 Call statistics dialog - + True + False 2 - - - True - 0 - none - - - True - 12 - - - True - 6 - 2 - True - - - True - Audio codec - - - - - - - - True - Video codec - - - 1 - 2 - - - - - - True - Audio IP bandwidth usage - - - 2 - 3 - - - - - - True - - - 1 - 2 - - - - - True - - - 1 - 2 - 1 - 2 - - - - - True - - - 1 - 2 - 2 - 3 - - - - - True - Audio Media connectivity - - - 4 - 5 - - - - - - True - - - 1 - 2 - 4 - 5 - - - - - True - Video IP bandwidth usage - - - 3 - 4 - - - - - - True - - - 1 - 2 - 3 - 4 - - - - - True - Video Media connectivity - - - 5 - 6 - - - - - True - - - 1 - 2 - 5 - 6 - - - - - - - - - True - <b>Call statistics and information</b> - True - - - - - False - False - 1 - - True + False end @@ -184,6 +27,7 @@ True True True + False True @@ -195,10 +39,210 @@ False + True end 0 + + + True + False + 0 + none + + + True + False + 12 + + + True + False + 7 + 2 + True + + + True + False + Audio codec + + + + + + + + True + False + Video codec + + + 1 + 2 + + + + + + True + False + Audio IP bandwidth usage + + + 2 + 3 + + + + + + True + False + + + 1 + 2 + + + + + True + False + + + 1 + 2 + 1 + 2 + + + + + True + False + + + 1 + 2 + 2 + 3 + + + + + True + False + Audio Media connectivity + + + 4 + 5 + + + + + + True + False + + + 1 + 2 + 4 + 5 + + + + + True + False + Video IP bandwidth usage + + + 3 + 4 + + + + + + True + False + + + 1 + 2 + 3 + 4 + + + + + True + False + Video Media connectivity + + + 5 + 6 + + + + + True + False + + + 1 + 2 + 5 + 6 + + + + + True + False + Round trip time + + + 6 + 7 + + + + + True + False + + + 1 + 2 + 6 + 7 + + + + + + + + + True + False + <b>Call statistics and information</b> + True + + + + + False + False + 1 + + diff --git a/gtk/conference.c b/gtk/conference.c index dddb3cec9..08262c771 100644 --- a/gtk/conference.c +++ b/gtk/conference.c @@ -27,6 +27,11 @@ #define PADDING_PIXELS 4 +/* + * conferencee_box = a vbox where participants are added or removed + * conf_frame = the conference tab + */ + static GtkWidget *create_conference_label(void){ GtkWidget *box=gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(box),gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU),FALSE,FALSE,0); @@ -46,34 +51,21 @@ static void init_local_participant(GtkWidget *participant){ linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_core_get_conference_local_input_volume, linphone_gtk_get_core()); } -static GtkWidget *get_conference_tab(GtkWidget *mw){ - GtkWidget *box=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conference_tab"); - GtkWidget *conf_frame=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conf_frame"); - if(conf_frame!=NULL){ - if (box==NULL){ - GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box"); - box=gtk_vbox_new(FALSE,0); - GtkWidget *participant=linphone_gtk_create_widget("main","callee_frame"); - gtk_box_set_homogeneous(GTK_BOX(box),TRUE); - init_local_participant(participant); - gtk_box_pack_start(GTK_BOX(box),participant,FALSE,FALSE,PADDING_PIXELS); - gtk_widget_show(box); - g_object_set_data(G_OBJECT(mw),"conference_tab",box); - gtk_box_pack_start(GTK_BOX(conf_box),box,FALSE,FALSE,PADDING_PIXELS); - } - } +static GtkWidget *get_conferencee_box(GtkWidget *mw){ + GtkWidget *box=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"conferencee_box"); return box; } static GtkWidget *find_conferencee_from_call(LinphoneCall *call){ GtkWidget *mw=linphone_gtk_get_main_window(); - get_conference_tab(mw); - GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame"); - GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box"); + GtkWidget *conferencee_box=get_conferencee_box(mw); GList *elem; GtkWidget *ret=NULL; + + if (conferencee_box==NULL) return NULL; + if (call!=NULL){ - GList *l=gtk_container_get_children(GTK_CONTAINER(conf_box)); + GList *l=gtk_container_get_children(GTK_CONTAINER(conferencee_box)); for(elem=l;elem!=NULL;elem=elem->next){ GtkWidget *frame=(GtkWidget*)elem->data; if (call==g_object_get_data(G_OBJECT(frame),"call")){ @@ -87,28 +79,53 @@ static GtkWidget *find_conferencee_from_call(LinphoneCall *call){ return ret; } +static GtkWidget * create_conference_panel(void){ + GtkWidget *mw=linphone_gtk_get_main_window(); + GtkWidget *conf_frame=linphone_gtk_create_widget("main","conf_frame"); + GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box"); + GtkWidget *button_conf=linphone_gtk_get_widget(conf_frame,"terminate_conf"); + GtkWidget *image=create_pixmap("stopcall-small.png"); + GtkWidget *box; + GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch"); + + gtk_button_set_image(GTK_BUTTON(button_conf),image); + g_signal_connect_swapped(G_OBJECT(button_conf),"clicked",(GCallback)linphone_gtk_terminate_call,NULL); + g_object_set_data(G_OBJECT(mw),"conf_frame",(gpointer)conf_frame); + + box=gtk_vbox_new(FALSE,0); + GtkWidget *participant=linphone_gtk_create_widget("main","callee_frame"); + gtk_widget_show(participant); + gtk_box_set_homogeneous(GTK_BOX(box),TRUE); + init_local_participant(participant); + gtk_box_pack_start(GTK_BOX(box),participant,FALSE,FALSE,PADDING_PIXELS); + gtk_widget_show(box); + g_object_set_data(G_OBJECT(mw),"conferencee_box",box); + gtk_box_pack_start(GTK_BOX(conf_box),box,FALSE,FALSE,PADDING_PIXELS); + + gtk_notebook_append_page(GTK_NOTEBOOK(viewswitch),conf_frame, + create_conference_label()); + return conf_frame; +} + void linphone_gtk_set_in_conference(LinphoneCall *call){ GtkWidget *mw=linphone_gtk_get_main_window(); - GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch"); GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame"); - g_object_set_data(G_OBJECT(mw),"is_conf",GINT_TO_POINTER(TRUE)); + GtkWidget *viewswitch=linphone_gtk_get_widget(mw,"viewswitch"); + if(conf_frame==NULL){ - conf_frame=linphone_gtk_create_widget("main","conf_frame"); - GtkWidget *button_conf=linphone_gtk_get_widget(conf_frame,"terminate_conf"); - GtkWidget *image=create_pixmap("stopcall-small.png"); - gtk_button_set_image(GTK_BUTTON(button_conf),image); - g_signal_connect_swapped(G_OBJECT(button_conf),"clicked",(GCallback)linphone_gtk_terminate_call,NULL); - g_object_set_data(G_OBJECT(mw),"conf_frame",(gpointer)conf_frame); - gtk_notebook_append_page(GTK_NOTEBOOK(viewswitch),conf_frame, - create_conference_label()); + conf_frame=create_conference_panel(); } - GtkWidget *participant=find_conferencee_from_call(call); - GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box"); + GtkWidget *participant=find_conferencee_from_call(call); + if (participant==NULL){ - const LinphoneAddress *addr=linphone_call_get_remote_address(call); - participant=linphone_gtk_create_widget("main","callee_frame"); + /*create and add it */ + GtkWidget *conferencee_box=get_conferencee_box(mw); GtkWidget *sound_meter; + const LinphoneAddress *addr=linphone_call_get_remote_address(call); gchar *markup; + + participant=linphone_gtk_create_widget("main","callee_frame"); + gtk_widget_show(participant); if (linphone_address_get_display_name(addr)!=NULL){ markup=g_strdup_printf("%s",linphone_address_get_display_name(addr)); }else{ @@ -119,11 +136,11 @@ void linphone_gtk_set_in_conference(LinphoneCall *call){ gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(participant,"callee_name_label")),markup); g_free(markup); sound_meter=linphone_gtk_get_widget(participant,"sound_indicator"); - linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_call_get_play_volume, call); - gtk_box_pack_start(GTK_BOX(conf_box),participant,FALSE,FALSE,PADDING_PIXELS); + linphone_gtk_init_audio_meter(sound_meter, (get_volume_t) linphone_call_get_play_volume, call); + gtk_box_pack_start(GTK_BOX(conferencee_box),participant,FALSE,FALSE,PADDING_PIXELS); g_object_set_data_full(G_OBJECT(participant),"call",linphone_call_ref(call),(GDestroyNotify)linphone_call_unref); gtk_notebook_set_current_page(GTK_NOTEBOOK(viewswitch), - gtk_notebook_page_num(GTK_NOTEBOOK(viewswitch),conf_frame)); + gtk_notebook_page_num(GTK_NOTEBOOK(viewswitch),conf_frame)); } } @@ -135,24 +152,26 @@ void linphone_gtk_terminate_conference_participant(LinphoneCall *call){ } void linphone_gtk_unset_from_conference(LinphoneCall *call){ - GtkWidget *mw=linphone_gtk_get_main_window(); - GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame"); - GtkWidget *conf_box=linphone_gtk_get_widget(conf_frame,"conf_box"); - GtkWidget *frame; - if (conf_box==NULL) return; /*conference tab already destroyed*/ - frame=find_conferencee_from_call(call); - GList *children; + GtkWidget *frame=find_conferencee_from_call(call); + if (frame){ + GtkWidget *mw=linphone_gtk_get_main_window(); + GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(mw),"conf_frame"); + GtkWidget *conferencee_box=g_object_get_data(G_OBJECT(mw),"conferencee_box"); + GList *children; + + g_message("Removing a participant from conference"); gtk_widget_destroy(frame); + children=gtk_container_get_children(GTK_CONTAINER(conferencee_box)); + if (g_list_length(children)==1){ /* only local participant */ + /*the conference is terminated */ + g_message("The conference is terminated"); + g_object_set_data(G_OBJECT(mw),"conferencee_box",NULL); + gtk_widget_destroy(conf_frame); + g_object_set_data(G_OBJECT(mw),"conf_frame",NULL); + } + g_list_free(children); } - children=gtk_container_get_children(GTK_CONTAINER(conf_box)); - if (g_list_length(children)==2){ - /*the conference is terminated */ - gtk_widget_destroy(conf_box); - g_object_set_data(G_OBJECT(mw),"conference_tab",NULL); - } - gtk_widget_destroy(conf_frame); - g_list_free(children); - g_object_set_data(G_OBJECT(mw),"is_conf",GINT_TO_POINTER(FALSE)); - g_object_set_data(G_OBJECT(mw),"conf_frame",NULL); } + + diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 60aa7cb14..0a64a1041 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -50,7 +50,8 @@ LinphoneCall *linphone_gtk_get_currently_displayed_call(gboolean *is_conf){ if (page!=NULL){ LinphoneCall *call=(LinphoneCall*)g_object_get_data(G_OBJECT(page),"call"); if (call==NULL){ - if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(main_window),"is_conf"))){ + GtkWidget *conf_frame=(GtkWidget *)g_object_get_data(G_OBJECT(main_window),"conf_frame"); + if (conf_frame==page){ if (is_conf) *is_conf=TRUE; return NULL; @@ -75,25 +76,28 @@ static GtkWidget *make_tab_header(int number){ } void update_tab_header(LinphoneCall *call,gboolean pause){ - GtkWidget *w=(GtkWidget*)linphone_call_get_user_pointer(call); - GtkWidget *main_window=linphone_gtk_get_main_window(); - GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(main_window,"viewswitch")); - gint call_index=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"call_index")); - GtkWidget *new_label=gtk_hbox_new (FALSE,0); - GtkWidget *i=NULL; - if(pause){ -i=gtk_image_new_from_stock(GTK_STOCK_MEDIA_PAUSE,GTK_ICON_SIZE_SMALL_TOOLBAR); - } else { - i=create_pixmap ("startcall-small.png"); - } + GtkWidget *w=(GtkWidget*)linphone_call_get_user_pointer(call); + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(main_window,"viewswitch")); + gint call_index=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"call_index")); + GtkWidget *new_label=gtk_hbox_new (FALSE,0); + GtkWidget *i=NULL; GtkWidget *l; - gchar *text=g_strdup_printf(_("Call #%i"),call_index); + gchar *text; + + if(pause){ + i=gtk_image_new_from_stock(GTK_STOCK_MEDIA_PAUSE,GTK_ICON_SIZE_SMALL_TOOLBAR); + } else { + i=create_pixmap ("startcall-small.png"); + } + + text=g_strdup_printf(_("Call #%i"),call_index); l=gtk_label_new (text); gtk_box_pack_start (GTK_BOX(new_label),i,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(new_label),l,TRUE,TRUE,0); - gtk_notebook_set_tab_label(notebook,w,new_label); - gtk_widget_show_all(new_label); + gtk_notebook_set_tab_label(notebook,w,new_label); + gtk_widget_show_all(new_label); } static void linphone_gtk_in_call_set_animation_image(GtkWidget *callview, const char *image_name, gboolean is_stock){ @@ -157,8 +161,7 @@ void transfer_button_clicked(GtkWidget *button, gpointer call_ref){ g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_transfer_call,other_call); } } - gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0, - gtk_get_current_event_time()); + gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,gtk_get_current_event_time()); gtk_widget_show(menu); } @@ -178,7 +181,6 @@ static void conference_button_clicked(GtkWidget *button, gpointer call_ref){ gtk_widget_set_sensitive(button,FALSE); g_object_set_data(G_OBJECT(linphone_gtk_get_main_window()),"conf_frame",NULL); linphone_core_add_all_to_conference(linphone_gtk_get_core()); - //linphone_core_add_to_conference(linphone_gtk_get_core(),(LinphoneCall*)call_ref); } @@ -202,7 +204,6 @@ static void show_used_codecs(GtkWidget *callstats, LinphoneCall *call){ GtkWidget *acodec_ui=linphone_gtk_get_widget(callstats,"audio_codec"); GtkWidget *vcodec_ui=linphone_gtk_get_widget(callstats,"video_codec"); if (acodec){ - char tmp[64]={0}; snprintf(tmp,sizeof(tmp)-1,"%s/%i/%i",acodec->mime_type,acodec->clock_rate,acodec->channels); gtk_label_set_label(GTK_LABEL(acodec_ui),tmp); @@ -252,28 +253,40 @@ static const char *upnp_state_to_string(LinphoneUpnpState ice_state){ static void _refresh_call_stats(GtkWidget *callstats, LinphoneCall *call){ const LinphoneCallStats *as=linphone_call_get_audio_stats(call); const LinphoneCallStats *vs=linphone_call_get_video_stats(call); - const char *audio_media_connectivity = _("Direct"); - const char *video_media_connectivity = _("Direct"); + const char *audio_media_connectivity = _("Direct or through server"); + const char *video_media_connectivity = _("Direct or through server"); + gboolean has_video=linphone_call_params_video_enabled(linphone_call_get_current_params(call)); gchar *tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"), as->download_bandwidth,as->upload_bandwidth); + gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"audio_bandwidth_usage")),tmp); g_free(tmp); - tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"), - vs->download_bandwidth,vs->upload_bandwidth); + if (has_video) + tmp=g_strdup_printf(_("download: %f\nupload: %f (kbit/s)"),vs->download_bandwidth,vs->upload_bandwidth); + else tmp=NULL; gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callstats,"video_bandwidth_usage")),tmp); - g_free(tmp); + if (tmp) g_free(tmp); 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); - } + + if (has_video){ + 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); + } + }else video_media_connectivity=NULL; gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"video_media_connectivity")),video_media_connectivity); + + if (as->round_trip_delay>0){ + tmp=g_strdup_printf(_("%.3f seconds"),as->round_trip_delay); + gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"round_trip_time")),tmp); + g_free(tmp); + } } static gboolean refresh_call_stats(GtkWidget *callstats){ @@ -689,6 +702,9 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ if (in_conf){ linphone_gtk_set_in_conference(call); gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"incall_mute"),FALSE); + }else{ + linphone_gtk_unset_from_conference(call); /*in case it was previously*/ + gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"incall_mute"),TRUE); } gtk_widget_show_all(linphone_gtk_get_widget(callview,"buttons_panel")); if (!in_conf) gtk_widget_show_all(linphone_gtk_get_widget(callview,"record_hbox")); @@ -857,18 +873,46 @@ void linphone_gtk_call_statistics_closed(GtkWidget *call_stats){ void linphone_gtk_record_call_toggled(GtkWidget *button){ gboolean active=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); - LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL); - GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer (call); - const LinphoneCallParams *params=linphone_call_get_current_params(call); - const char *filepath=linphone_call_params_get_record_file(params); - gchar *message=g_strdup_printf(_("Recording into %s %s"),filepath,active ? "" : _("(Paused)")); + gboolean is_conf=FALSE; + const char *filepath; + gchar *message; + LinphoneCore *lc=linphone_gtk_get_core(); + LinphoneCall *call=linphone_gtk_get_currently_displayed_call(&is_conf); + GtkWidget *callview; + GtkWidget *label; + if (call){ + callview=(GtkWidget*)linphone_call_get_user_pointer (call); + const LinphoneCallParams *params=linphone_call_get_current_params(call); + filepath=linphone_call_params_get_record_file(params); + label=linphone_gtk_get_widget(callview,"record_status"); + }else if (is_conf){ + GtkWidget *mw=linphone_gtk_get_main_window(); + callview=(GtkWidget *)g_object_get_data(G_OBJECT(linphone_gtk_get_main_window()),"conf_frame"); + label=linphone_gtk_get_widget(callview,"conf_record_status"); + filepath=(const char*)g_object_get_data(G_OBJECT(mw),"conf_record_path"); + if (filepath==NULL){ + filepath=linphone_gtk_get_record_path(NULL,TRUE); + g_object_set_data_full(G_OBJECT(mw),"conf_record_path",(char*)filepath,g_free); + } + }else{ + g_warning("linphone_gtk_record_call_toggled(): bug."); + return; + } + message=g_strdup_printf(_("Recording into\n%s %s"),filepath,active ? "" : _("(Paused)")); if (active){ - linphone_call_start_recording(call); + if (call) + linphone_call_start_recording(call); + else + linphone_core_start_conference_recording(lc,filepath); }else { - linphone_call_stop_recording(call); + if (call) + linphone_call_stop_recording(call); + else + linphone_core_stop_conference_recording(lc); + } - gtk_label_set_markup(GTK_LABEL(linphone_gtk_get_widget(callview,"record_status")),message); + gtk_label_set_markup(GTK_LABEL(label),message); g_free(message); } diff --git a/gtk/linphone.h b/gtk/linphone.h index abb395127..f9597849d 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -149,3 +149,5 @@ void linphone_gtk_uninit_instance(void); void linphone_gtk_monitor_usb(void); void linphone_gtk_unmonitor_usb(void); +gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference); + diff --git a/gtk/main.c b/gtk/main.c index 94d94f662..2f34cd4d4 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -750,14 +750,35 @@ static void linphone_gtk_update_call_buttons(LinphoneCall *call){ } } -gchar *linphone_gtk_get_call_record_path(LinphoneAddress *address){ +gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference){ const char *dir=g_get_user_special_dir(G_USER_DIRECTORY_MUSIC); - const char *id=linphone_address_get_username(address); + const char *id="unknown"; char filename[256]={0}; - if (id==NULL) id=linphone_address_get_domain(address); - snprintf(filename,sizeof(filename)-1,"%s-%lu-%s-record.wav", - linphone_gtk_get_ui_config("title","Linphone"), - (unsigned long)time(NULL),id); + char date[64]={0}; + time_t curtime=time(NULL); + struct tm loctime; + +#ifdef WIN32 + loctime=*localtime(&curtime); +#else + localtime_r(&curtime,&loctime); +#endif + snprintf(date,sizeof(date)-1,"%i%02i%02i-%02i%02i",loctime.tm_year+1900,loctime.tm_mon+1,loctime.tm_mday, loctime.tm_hour, loctime.tm_min); + + if (address){ + id=linphone_address_get_username(address); + if (id==NULL) id=linphone_address_get_domain(address); + } + if (is_conference){ + snprintf(filename,sizeof(filename)-1,"%s-conference-%s.wav", + linphone_gtk_get_ui_config("title","Linphone"), + date); + }else{ + snprintf(filename,sizeof(filename)-1,"%s-call-%s-%s.wav", + linphone_gtk_get_ui_config("title","Linphone"), + date, + id); + } return g_build_filename(dir,filename,NULL); } @@ -768,7 +789,7 @@ static gboolean linphone_gtk_start_call_do(GtkWidget *uri_bar){ if (addr!=NULL){ LinphoneCallParams *params=linphone_core_create_default_call_parameters(lc); - gchar *record_file=linphone_gtk_get_call_record_path(addr); + gchar *record_file=linphone_gtk_get_record_path(addr,FALSE); linphone_call_params_set_record_file(params,record_file); linphone_core_invite_address_with_params(lc,addr,params); completion_add_text(GTK_ENTRY(uri_bar),entered); @@ -781,24 +802,34 @@ static gboolean linphone_gtk_start_call_do(GtkWidget *uri_bar){ return FALSE; } + +static void accept_incoming_call(LinphoneCall *call){ + LinphoneCore *lc=linphone_gtk_get_core(); + LinphoneCallParams *params=linphone_core_create_default_call_parameters(lc); + gchar *record_file=linphone_gtk_get_record_path(linphone_call_get_remote_address(call),FALSE); + linphone_call_params_set_record_file(params,record_file); + linphone_core_accept_call_with_params(lc,call,params); + linphone_call_params_destroy(params); +} + static gboolean linphone_gtk_auto_answer(LinphoneCall *call){ - if (linphone_call_get_state(call)==LinphoneCallIncomingReceived){ - linphone_core_accept_call (linphone_gtk_get_core(),call); + LinphoneCallState state=linphone_call_get_state(call); + if (state==LinphoneCallIncomingReceived || state==LinphoneCallIncomingEarlyMedia){ + accept_incoming_call(call); linphone_call_unref(call); } return FALSE; } void linphone_gtk_start_call(GtkWidget *w){ - LinphoneCore *lc=linphone_gtk_get_core(); - LinphoneCall *call; + LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL); /*change into in-call mode, then do the work later as it might block a bit */ GtkWidget *mw=gtk_widget_get_toplevel(w); GtkWidget *uri_bar=linphone_gtk_get_widget(mw,"uribar"); + LinphoneCallState state= call ? linphone_call_get_state(call) : LinphoneCallIdle; - call=linphone_gtk_get_currently_displayed_call(NULL); - if (call!=NULL && linphone_call_get_state(call)==LinphoneCallIncomingReceived){ - linphone_core_accept_call(lc,call); + if (state == LinphoneCallIncomingReceived || state == LinphoneCallIncomingEarlyMedia){ + accept_incoming_call(call); }else{ /*immediately disable the button and delay a bit the execution the linphone_core_invite() so that we don't freeze the button. linphone_core_invite() might block for some hundreds of milliseconds*/ @@ -831,7 +862,7 @@ void linphone_gtk_decline_clicked(GtkWidget *button){ void linphone_gtk_answer_clicked(GtkWidget *button){ LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL); if (call){ - linphone_core_accept_call(linphone_gtk_get_core(),call); + accept_incoming_call(call); linphone_gtk_show_main_window(); /* useful when the button is clicked on a notification */ } } diff --git a/gtk/main.ui b/gtk/main.ui index b42470e5a..e1c8c9129 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -215,9 +215,6 @@ True False - - - True @@ -242,9 +239,53 @@ True True end + 0 + + + + + True + False + + + gtk-media-record + True + True + True + False + True + + + + False + False + 0 + + + + + True + False + True + char + + + True + True + 1 + + + + + False + False + end 1 + + + diff --git a/gtk/propertybox.c b/gtk/propertybox.c index 5aee3f430..8481bef7e 100644 --- a/gtk/propertybox.c +++ b/gtk/propertybox.c @@ -972,7 +972,8 @@ static void linphone_gtk_show_media_encryption(GtkWidget *pb){ } g_signal_connect(G_OBJECT(combo),"changed",(GCallback)linphone_gtk_media_encryption_changed,NULL); } - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"media_encryption_mandatory")),linphone_core_is_media_encryption_mandatory(lc)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"media_encryption_mandatory")), + linphone_core_is_media_encryption_mandatory(lc)); g_object_unref(G_OBJECT(model)); } @@ -1015,10 +1016,8 @@ void linphone_gtk_show_parameters(void){ if (pb==NULL) { pb=linphone_gtk_create_window("parameters"); g_object_set_data(G_OBJECT(mw),"parameters",pb); - ms_error("linphone_gtk_show_paramters: create"); }else { gtk_widget_show(pb); - ms_error("linphone_gtk_show_parameters: show"); return; } codec_list=linphone_gtk_get_widget(pb,"codec_list"); @@ -1028,21 +1027,21 @@ void linphone_gtk_show_parameters(void){ linphone_core_ipv6_enabled(lc)); linphone_core_get_sip_transports(lc,&tr); - if (tr.tcp_port > 0) { - gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 1); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")), + if (tr.tcp_port > 0) { + gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 1); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")), tr.tcp_port); - } - else if (tr.tls_port > 0) { - gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 2); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")), + } + else if (tr.tls_port > 0) { + gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 2); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")), tr.tls_port); - } - else { - gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 0); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")), + } + else { + gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")), tr.udp_port); - } + } linphone_core_get_audio_port_range(lc, &min_port, &max_port); gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "audio_min_rtp_port")), min_port); diff --git a/gtk/update.c b/gtk/update.c old mode 100755 new mode 100644 diff --git a/linphone.kdevelop b/linphone.kdevelop deleted file mode 100644 index 2cb0437f5..000000000 --- a/linphone.kdevelop +++ /dev/null @@ -1,558 +0,0 @@ - - - - Simon Morlat - simon.morlat@linphone.org - [3.1.2] - KDevCustomProject - C - - linphone - . - false - - - - - - executable - gtk-glade/linphone - - - - false - false - false - false - false - - - - *.java - *.h - *.H - *.hh - *.hxx - *.hpp - *.c - *.C - *.cc - *.cpp - *.c++ - *.cxx - - - config.h - exosip - exosip/eXosip2.h - exosip/eXosip.c - exosip/eXosip_cfg.h - exosip/eXosip.h - exosip/eXutils.c - exosip/jauth.c - exosip/jcallback.c - exosip/jcall.c - exosip/jdialog.c - exosip/jevents.c - exosip/jfreinds.c - exosip/jidentity.c - exosip/jnotify.c - exosip/jpipe.c - exosip/jpipe.h - exosip/jpublish.c - exosip/jreg.c - exosip/jrequest.c - exosip/jresponse.c - exosip/jsubscribe.c - exosip/jsubscribers.c - exosip/misc.c - exosip/sdp_offans.c - exosip/udp.c - gnome - gnome/addressbook.c - gnome/addressbook.h - gnome/applet.c - gnome/callbacks.c - gnome/callbacks.h - gnome/friends.c - gnome/friends.h - gnome/gui_utils.c - gnome/gui_utils.h - gnome/interface.c - gnome/interface.h - gnome/linphone.c - gnome/linphone.h - gnome/main.c - gnome/presence.c - gnome/presence.h - gnome/propertybox.c - gnome/propertybox.h - gnome/support.c - gnome/support.h - gsmlib - gsmlib/code.c - gsmlib/config.h - gsmlib/debug.c - gsmlib/decode.c - gsmlib/gsmadd.c - gsmlib/gsm_create.c - gsmlib/gsm_decode.c - gsmlib/gsm_destroy.c - gsmlib/gsm_encode.c - gsmlib/gsm_explode.c - gsmlib/gsm.h - gsmlib/gsm_implode.c - gsmlib/gsm_option.c - gsmlib/gsm_print.c - gsmlib/gsm_wrapper.c - gsmlib/gsm_wrapper.h - gsmlib/long_term.c - gsmlib/lpc.c - gsmlib/preprocess.c - gsmlib/private.h - gsmlib/proto.h - gsmlib/rpe.c - gsmlib/short_term.c - gsmlib/table.c - gsmlib/toast.h - gsmlib/unproto.h - gtk - gtk/addressbook.c - gtk/addressbook.h - gtk/applet.c - gtk/callbacks.c - gtk/callbacks.h - gtk/friends.c - gtk/friends.h - gtk/gui_utils.c - gtk/gui_utils.h - gtk/interface.c - gtk/interface.h - gtk/linphone.c - gtk/linphone.h - gtk/main.c - gtk/presence.c - gtk/presence.h - gtk/propertybox.c - gtk/propertybox.h - gtk/support.c - gtk/support.h - intl - intl/bindtextdom.c - intl/cat-compat.c - intl/dcgettext.c - intl/dgettext.c - intl/explodename.c - intl/finddomain.c - intl/gettext.c - intl/gettext.h - intl/gettextP.h - intl/hash-string.h - intl/intl-compat.c - intl/l10nflist.c - intl/libgettext.h - intl/loadinfo.h - intl/loadmsgcat.c - intl/localealias.c - intl/textdomain.c - lpc10-1.5 - lpc10-1.5/analys.c - lpc10-1.5/bitio.c - lpc10-1.5/bsynz.c - lpc10-1.5/chanwr.c - lpc10-1.5/dcbias.c - lpc10-1.5/decode.c - lpc10-1.5/deemp.c - lpc10-1.5/difmag.c - lpc10-1.5/dyptrk.c - lpc10-1.5/encode.c - lpc10-1.5/energy.c - lpc10-1.5/f2c.h - lpc10-1.5/f2clib.c - lpc10-1.5/ham84.c - lpc10-1.5/hp100.c - lpc10-1.5/invert.c - lpc10-1.5/irc2pc.c - lpc10-1.5/ivfilt.c - lpc10-1.5/lpc10.h - lpc10-1.5/lpc10_wrapper.c - lpc10-1.5/lpc10_wrapper.h - lpc10-1.5/lpcdec.c - lpc10-1.5/lpcenc.c - lpc10-1.5/lpcini.c - lpc10-1.5/lpfilt.c - lpc10-1.5/median.c - lpc10-1.5/mload.c - lpc10-1.5/onset.c - lpc10-1.5/pitsyn.c - lpc10-1.5/placea.c - lpc10-1.5/placev.c - lpc10-1.5/preemp.c - lpc10-1.5/prepro.c - lpc10-1.5/random.c - lpc10-1.5/rcchk.c - lpc10-1.5/synths.c - lpc10-1.5/tbdm.c - lpc10-1.5/voicin.c - lpc10-1.5/vparms.c - media_api - media_api/apitest.c - media_api/apitest.h - media_api/basiccall.c - media_api/basiccall.h - media_api/callmember.c - media_api/callmember.h - media_api/common.h - media_api/media_api.c - media_api/media_api.h - media_api/mediaflow.c - media_api/mediaflow.h - mediastreamer - mediastreamer/affine.c - mediastreamer/affine.h - mediastreamer/alsacard.c - mediastreamer/alsacard.h - mediastreamer/audiostream.c - mediastreamer/g711common.h - mediastreamer/hpuxsndcard.c - mediastreamer/jackcard.c - mediastreamer/jackcard.h - mediastreamer/mediastream.c - mediastreamer/mediastream.h - mediastreamer/msAlawdec.c - mediastreamer/msAlawdec.h - mediastreamer/msAlawenc.c - mediastreamer/msAlawenc.h - mediastreamer/msavdecoder.c - mediastreamer/msavdecoder.h - mediastreamer/msavencoder.c - mediastreamer/msavencoder.h - mediastreamer/msbuffer.c - mediastreamer/msbuffer.h - mediastreamer/ms.c - mediastreamer/mscodec.c - mediastreamer/mscodec.h - mediastreamer/mscopy.c - mediastreamer/mscopy.h - mediastreamer/msfdispatcher.c - mediastreamer/msfdispatcher.h - mediastreamer/msfifo.c - mediastreamer/msfifo.h - mediastreamer/msfilter.c - mediastreamer/msfilter.h - mediastreamer/msGSMdecoder.c - mediastreamer/msGSMdecoder.h - mediastreamer/msGSMencoder.c - mediastreamer/msGSMencoder.h - mediastreamer/ms.h - mediastreamer/msLPC10decoder.c - mediastreamer/msLPC10decoder.h - mediastreamer/msLPC10encoder.c - mediastreamer/msLPC10encoder.h - mediastreamer/msMUlawdec.c - mediastreamer/msMUlawdec.h - mediastreamer/msMUlawenc.c - mediastreamer/msMUlawenc.h - mediastreamer/msnosync.c - mediastreamer/msnosync.h - mediastreamer/msossread.c - mediastreamer/msossread.h - mediastreamer/msosswrite.c - mediastreamer/msosswrite.h - mediastreamer/msqdispatcher.c - mediastreamer/msqdispatcher.h - mediastreamer/msqueue.c - mediastreamer/msqueue.h - mediastreamer/msread.c - mediastreamer/msread.h - mediastreamer/msringplayer.c - mediastreamer/msringplayer.h - mediastreamer/msrtprecv.c - mediastreamer/msrtprecv.h - mediastreamer/msrtpsend.c - mediastreamer/msrtpsend.h - mediastreamer/mssdlout.c - mediastreamer/mssdlout.h - mediastreamer/mssmpeg.c - mediastreamer/mssmpeg.h - mediastreamer/mssoundread.c - mediastreamer/mssoundread.h - mediastreamer/mssoundwrite.c - mediastreamer/mssoundwrite.h - mediastreamer/msspeexdec.c - mediastreamer/msspeexdec.h - mediastreamer/msspeexenc.c - mediastreamer/msspeexenc.h - mediastreamer/mssync.c - mediastreamer/mssync.h - mediastreamer/mstcpclient.c - mediastreamer/mstcpclient.h - mediastreamer/mstcpserv.c - mediastreamer/mstcpserv.h - mediastreamer/mstimer.c - mediastreamer/mstimer.h - mediastreamer/mstruespeechdecoder.c - mediastreamer/mstruespeechdecoder.h - mediastreamer/mstruespeechencoder.c - mediastreamer/mstruespeechencoder.h - mediastreamer/msutils.h - mediastreamer/msv4l.c - mediastreamer/msv4l.h - mediastreamer/msvideooutput.c - mediastreamer/msvideooutput.h - mediastreamer/msvideosource.c - mediastreamer/msvideosource.h - mediastreamer/mswrite.c - mediastreamer/mswrite.h - mediastreamer/msxine.c - mediastreamer/msxine.h - mediastreamer/osscard.c - mediastreamer/osscard.h - mediastreamer/rfc2429.h - mediastreamer/ring_test.c - mediastreamer/sndcard.c - mediastreamer/sndcard.h - mediastreamer/test_alaw.c - mediastreamer/test.c - mediastreamer/test_gsm.c - mediastreamer/test_lpc10.c - mediastreamer/test_mulaw.c - mediastreamer/test_rtprecv.c - mediastreamer/test_smpeg.c - mediastreamer/test_speex.c - mediastreamer/test_truespeech.c - mediastreamer/test_v4l.c - mediastreamer/test_videostream.c - mediastreamer/test_xine.c - mediastreamer/videoclient.c - mediastreamer/videoserver.c - mediastreamer/videostream.c - mediastreamer/waveheader.h - po - po/cat-id-tbl.c - win32acm - win32acm/afl.c - win32acm/com.h - win32acm/config.h - win32acm/cpudetect.c - win32acm/cpudetect.h - win32acm/cputable.h - win32acm/driver.c - win32acm/driver.h - win32acm/elfdll.c - win32acm/ext.c - win32acm/ext.h - win32acm/ldt_keeper.c - win32acm/ldt_keeper.h - win32acm/loader.h - win32acm/module.c - win32acm/mp_msg.c - win32acm/mp_msg.h - win32acm/pe_image.c - win32acm/pe_resource.c - win32acm/registry.c - win32acm/registry.h - win32acm/resource.c - win32acm/test_truespeech.c - win32acm/win32.c - win32acm/win32codec.c - win32acm/win32codec.h - win32acm/win32.h - win32acm/wine - win32acm/wine/basetsd.h - win32acm/wine/debugtools.h - win32acm/wine/driver.h - win32acm/wine/elfdll.h - win32acm/wine/heap.h - win32acm/wine/ldt.h - win32acm/wine/mmreg.h - win32acm/wine/module.h - win32acm/wine/msacmdrv.h - win32acm/wine/msacm.h - win32acm/wine/ntdef.h - win32acm/wine/pe_image.h - win32acm/wine/poppack.h - win32acm/wine/pshpack1.h - win32acm/wine/pshpack2.h - win32acm/wine/pshpack4.h - win32acm/wine/pshpack8.h - win32acm/wine/vfw.h - win32acm/wine/winbase.h - win32acm/wine/windef.h - win32acm/wine/windows.h - win32acm/wine/winerror.h - win32acm/wine/winestring.h - win32acm/wine/winnt.h - win32acm/wine/winreg.h - win32acm/wine/winuser.h - win32acm/wineacm.h - win32acm/wrapper.h - builddate.h - - - make - - - - 0 - - - - default - - - - - - true - 0 - 0 - false - - - - default - - - - - - - - - - - - - true - false - false - false - - - false - true - 10 - - - - - ada - ada_bugs_gcc - bash - bash_bugs - clanlib - fortran_bugs_gcc - gnome1 - gnustep - gtk - gtk_bugs - haskell - haskell_bugs_ghc - java_bugs_gcc - java_bugs_sun - kde2book - libstdc++ - opengl - pascal_bugs_fp - php - php_bugs - perl - perl_bugs - python - python_bugs - qt-kdev3 - ruby - ruby_bugs - sdl - stl - sw - w3c-dom-level2-html - w3c-svg - w3c-uaag10 - wxwidgets_bugs - - - Guide to the Qt Translation Tools - Qt Assistant Manual - Qt Designer Manual - Qt Reference Documentation - qmake User Guide - - - KDE Libraries (Doxygen) - - - - - - - - - - - - false - 3 - 3 - - EmbeddedKDevDesigner - - - - - - - false - true - true - 250 - 400 - 250 - false - 0 - true - true - false - std=_GLIBCXX_STD;__gnu_cxx=std - true - false - false - false - false - true - true - false - .; - - - - set - m_,_ - theValue - true - true - - - false - true - Vertical - - - - - false - false - - - *.o,*.lo,CVS - false - - - - - .h - .cpp - - - From 75583926a149a4887b25dc2d5652b052717a53f7 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 22 Feb 2013 17:58:05 +0100 Subject: [PATCH 099/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 841c656e8..4ed2e518c 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 841c656e8804d216e2aa28a170fe1473ae3f4732 +Subproject commit 4ed2e518cf79c62fe8df7f23ce99e0fbfe2e799d From 0b9b574db7fc4fe06b028a6d79ffdb902826dc04 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 22 Feb 2013 21:28:31 +0100 Subject: [PATCH 100/281] add conference recording API. --- coreapi/linphonecore_jni.cc | 18 ++++++++ .../org/linphone/core/LinphoneCore.java | 42 ++++++++++++++++++- .../org/linphone/core/LinphoneCoreImpl.java | 11 +++++ 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 9c8697f6a..57ab7c4ca 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -2060,9 +2060,11 @@ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_leaveConference(JNIEnv * extern "C" void Java_org_linphone_core_LinphoneCoreImpl_addAllToConference(JNIEnv *env,jobject thiz,jlong pCore) { linphone_core_add_all_to_conference((LinphoneCore *) pCore); } + extern "C" void Java_org_linphone_core_LinphoneCoreImpl_addToConference(JNIEnv *env,jobject thiz,jlong pCore, jlong pCall) { linphone_core_add_to_conference((LinphoneCore *) pCore, (LinphoneCall *) pCall); } + extern "C" void Java_org_linphone_core_LinphoneCoreImpl_removeFromConference(JNIEnv *env,jobject thiz,jlong pCore, jlong pCall) { linphone_core_remove_from_conference((LinphoneCore *) pCore, (LinphoneCall *) pCall); } @@ -2073,6 +2075,22 @@ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_terminateConference(JNIE extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getConferenceSize(JNIEnv *env,jobject thiz,jlong pCore) { return (jint)linphone_core_get_conference_size((LinphoneCore *) pCore); } + +extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_startConferenceRecording(JNIEnv *env,jobject thiz,jlong pCore, jstring jpath){ + int err=-1; + if (jpath){ + const char *path=env->GetStringUTFChars(jpath, NULL); + err=linphone_core_start_conference_recording((LinphoneCore*)pCore,path); + env->ReleaseStringUTFChars(jpath,path); + } + return err; +} + +extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_stopConferenceRecording(JNIEnv *env,jobject thiz,jlong pCore){ + int err=linphone_core_stop_conference_recording((LinphoneCore*)pCore); + return err; +} + extern "C" void Java_org_linphone_core_LinphoneCoreImpl_terminateAllCalls(JNIEnv *env,jobject thiz,jlong pCore) { linphone_core_terminate_all_calls((LinphoneCore *) pCore); } diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index 3a6cf2a76..87b5de094 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -761,25 +761,63 @@ public interface LinphoneCore { */ void adjustSoftwareVolume(int i); + /** + * Pause a call. + **/ boolean pauseCall(LinphoneCall call); + /** + * Resume a call. + **/ boolean resumeCall(LinphoneCall call); boolean pauseAllCalls(); void setZrtpSecretsCache(String file); void enableEchoLimiter(boolean val); + /** + * Indicates whether the local user is part of the conference. + **/ boolean isInConference(); + /** + * Connect the local user to the conference. + **/ boolean enterConference(); + /** + * Disconnect the local user from the conference. + **/ void leaveConference(); + /** + * Add an established call to the conference. The LinphoneCore is able to manage one client based conference. + **/ void addToConference(LinphoneCall call); - void addAllToConference(); + /** + * Remove an established call from the conference. + **/ void removeFromConference(LinphoneCall call); - + void addAllToConference(); + + /** + * Terminate the conference, all users are disconnected. + **/ void terminateConference(); int getConferenceSize(); + + /** + * Request recording of the conference into a supplied file path. + * The format is wav. + **/ + void startConferenceRecording(String path); + /** + * Stop recording of the conference. + **/ + void stopConferenceRecording(); + void terminateAllCalls(); + /** + * Returns all calls. + **/ LinphoneCall[] getCalls(); int getCallsNb(); diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java index 7b596f7e2..5a52f7559 100644 --- a/java/impl/org/linphone/core/LinphoneCoreImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java @@ -897,4 +897,15 @@ class LinphoneCoreImpl implements LinphoneCore { public String getUpnpExternalIpaddress() { return getUpnpExternalIpaddress(nativePtr); } + private native int startConferenceRecording(long nativePtr, String path); + @Override + public void startConferenceRecording(String path) { + startConferenceRecording(nativePtr,path); + } + + private native int stopConferenceRecording(long nativePtr); + @Override + public void stopConferenceRecording() { + stopConferenceRecording(nativePtr); + } } From a8f757be70c4a1af8477c038aae155bef7b474b7 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 22 Feb 2013 22:18:08 +0100 Subject: [PATCH 101/281] fix crash in coreapi --- coreapi/linphonecore.c | 4 ++-- gtk/main.c | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 237590473..a33328f03 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2829,8 +2829,8 @@ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const Linpho } #endif //BUILD_UPNP } - - call->params = *params; + + _linphone_call_params_copy(&call->params,params); linphone_call_make_local_media_description(lc, call); // Video adding diff --git a/gtk/main.c b/gtk/main.c index 2f34cd4d4..dab29bda0 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -816,7 +816,6 @@ static gboolean linphone_gtk_auto_answer(LinphoneCall *call){ LinphoneCallState state=linphone_call_get_state(call); if (state==LinphoneCallIncomingReceived || state==LinphoneCallIncomingEarlyMedia){ accept_incoming_call(call); - linphone_call_unref(call); } return FALSE; } From a30721377ac0859f1d15837cc67d6e73686203c9 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 25 Feb 2013 10:37:01 +0100 Subject: [PATCH 102/281] Fix uPnP context destroy --- coreapi/upnp.c | 44 +++++++++++++++++++++++++++----------------- mediastreamer2 | 2 +- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index e9ce18df7..400cc7e2a 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -93,6 +93,7 @@ void linphone_upnp_update_port_binding(UpnpContext *lupnp, UpnpPortBinding **por void linphone_upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *port); void linphone_upnp_port_binding_release(UpnpPortBinding *port); void linphone_upnp_update_config(UpnpContext *lupnp); +void linphone_upnp_update_proxy(UpnpContext *lupnp, bool_t force); // Configuration MSList *linphone_upnp_config_list_port_bindings(struct _LpConfig *lpc); @@ -310,12 +311,17 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) { } if(lupnp->upnp_igd_ctxt != NULL) { + // upnp_igd_destroy is synchronous so the callbacks will be called in the same thread. + // So release the mutex before upnp_igd_destroy call. + ms_mutex_unlock(&lupnp->mutex); upnp_igd_destroy(lupnp->upnp_igd_ctxt); + ms_mutex_lock(&lupnp->mutex); lupnp->upnp_igd_ctxt = NULL; } - /* Run one more time configuration update */ + /* Run one more time configuration update and proxy */ linphone_upnp_update_config(lupnp); + linphone_upnp_update_proxy(lupnp, TRUE); /* Release port bindings */ if(lupnp->sip_udp != NULL) { @@ -858,23 +864,11 @@ void linphone_upnp_update_config(UpnpContext* lupnp) { lupnp->removing_configs = ms_list_free(lupnp->removing_configs); } -bool_t linphone_core_upnp_hook(void *data) { - LCSipTransports transport; +void linphone_upnp_update_proxy(UpnpContext* lupnp, bool_t force) { LinphoneUpnpState ready_state; const MSList *item; - time_t now = time(NULL); - UpnpContext *lupnp = (UpnpContext *)data; - - ms_mutex_lock(&lupnp->mutex); - - /* Update ports */ - if(lupnp->state == LinphoneUpnpStateOk) { - linphone_core_get_sip_transports(lupnp->lc, &transport); - linphone_upnp_update_port_binding(lupnp, &lupnp->sip_udp, UPNP_IGD_IP_PROTOCOL_UDP, transport.udp_port, UPNP_CORE_RETRY_DELAY); - linphone_upnp_update_port_binding(lupnp, &lupnp->sip_tcp, UPNP_IGD_IP_PROTOCOL_TCP, transport.tcp_port, UPNP_CORE_RETRY_DELAY); - linphone_upnp_update_port_binding(lupnp, &lupnp->sip_tls, UPNP_IGD_IP_PROTOCOL_TCP, transport.tls_port, UPNP_CORE_RETRY_DELAY); - } - + time_t now = (force)? (lupnp->last_ready_check + UPNP_CORE_READY_CHECK) : time(NULL); + /* Refresh registers if we are ready */ if(now - lupnp->last_ready_check >= UPNP_CORE_READY_CHECK) { lupnp->last_ready_check = now; @@ -896,7 +890,23 @@ bool_t linphone_core_upnp_hook(void *data) { lupnp->last_ready_state = ready_state; } } - +} + +bool_t linphone_core_upnp_hook(void *data) { + LCSipTransports transport; + UpnpContext *lupnp = (UpnpContext *)data; + + ms_mutex_lock(&lupnp->mutex); + + /* Update ports */ + if(lupnp->state == LinphoneUpnpStateOk) { + linphone_core_get_sip_transports(lupnp->lc, &transport); + linphone_upnp_update_port_binding(lupnp, &lupnp->sip_udp, UPNP_IGD_IP_PROTOCOL_UDP, transport.udp_port, UPNP_CORE_RETRY_DELAY); + linphone_upnp_update_port_binding(lupnp, &lupnp->sip_tcp, UPNP_IGD_IP_PROTOCOL_TCP, transport.tcp_port, UPNP_CORE_RETRY_DELAY); + linphone_upnp_update_port_binding(lupnp, &lupnp->sip_tls, UPNP_IGD_IP_PROTOCOL_TCP, transport.tls_port, UPNP_CORE_RETRY_DELAY); + } + + linphone_upnp_update_proxy(lupnp, FALSE); linphone_upnp_update_config(lupnp); ms_mutex_unlock(&lupnp->mutex); diff --git a/mediastreamer2 b/mediastreamer2 index 4ed2e518c..c48f1a31d 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 4ed2e518cf79c62fe8df7f23ce99e0fbfe2e799d +Subproject commit c48f1a31d850ed9a1b607985d2a250a8ca048547 From dd7da58c0c91a6575e64f6533f4efa2c37fad8ab Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 25 Feb 2013 10:46:48 +0100 Subject: [PATCH 103/281] update ms2 for fixing make distcheck --- Makefile.am | 22 +++++++++++----------- mediastreamer2 | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Makefile.am b/Makefile.am index 507e6f4dc..f871d46a8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -48,17 +48,17 @@ ISCC=ISCC.exe PACKAGE_WIN32_FILELIST=$(PACKAGE)-win32.filelist PACKAGE_BUNDLE_FILE=$(top_srcdir)/build/macos/$(PACKAGE).bundle -EXTRA_DIST = config.rpath BUGS linphone.kdevelop \ - README.arm \ - README.mingw \ - README.macos \ - autogen.sh \ - linphone.spec \ - linphone.spec.in \ - $(GTK_FILELIST) \ - gen-gtkfilelist.sh \ - $(LINPHONEDEPS_FILELIST) \ - $(ISS_SCRIPT).in +EXTRA_DIST = BUGS \ + README.arm \ + README.mingw \ + README.macos \ + autogen.sh \ + linphone.spec \ + linphone.spec.in \ + $(GTK_FILELIST) \ + gen-gtkfilelist.sh \ + $(LINPHONEDEPS_FILELIST) \ + $(ISS_SCRIPT).in DISTCLEANFILES= $(ISS_SCRIPT) $(PACKAGE_WIN32_FILELIST) diff --git a/mediastreamer2 b/mediastreamer2 index c48f1a31d..e033b06a7 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit c48f1a31d850ed9a1b607985d2a250a8ca048547 +Subproject commit e033b06a731d0b9bc4e69afc690f6469eae73f66 From 3ba2e1af0ca1658031b3c14833bf43c97a778e40 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 25 Feb 2013 11:32:05 +0100 Subject: [PATCH 104/281] Fix proxy update when using uPnP --- coreapi/proxy.c | 4 ++-- coreapi/upnp.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 75930adb1..5546102ba 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -1100,8 +1100,8 @@ void linphone_proxy_config_update(LinphoneProxyConfig *cfg){ switch(linphone_core_get_firewall_policy(lc)) { case LinphonePolicyUseUpnp: #ifdef BUILD_UPNP - if(!lc->sip_conf.register_only_when_upnp_is_ok || - (lc->upnp != NULL && !linphone_upnp_context_is_ready_for_register(lc->upnp))) { + if(lc->sip_conf.register_only_when_upnp_is_ok && + (lc->upnp == NULL || !linphone_upnp_context_is_ready_for_register(lc->upnp))) { break; } #endif //BUILD_UPNP diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 400cc7e2a..092876574 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -881,6 +881,8 @@ void linphone_upnp_update_proxy(UpnpContext* lupnp, bool_t force) { // Only reset ithe registration if we require that upnp should be ok if(lupnp->lc->sip_conf.register_only_when_upnp_is_ok) { linphone_proxy_config_set_state(cfg, LinphoneRegistrationNone, "Registration impossible (uPnP not ready)"); + } else { + cfg->commit=TRUE; } } else { cfg->commit=TRUE; From db009da1d28e8b89233c4956d3b09e49b12bff1c Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 25 Feb 2013 15:00:45 +0100 Subject: [PATCH 105/281] uPnP add nullity checks --- coreapi/upnp.c | 60 ++++++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 092876574..86d16d0f0 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -355,10 +355,12 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) { } LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *lupnp) { - LinphoneUpnpState state; - ms_mutex_lock(&lupnp->mutex); - state = lupnp->state; - ms_mutex_unlock(&lupnp->mutex); + LinphoneUpnpState state = LinphoneUpnpStateKo; + if(lupnp != NULL) { + ms_mutex_lock(&lupnp->mutex); + state = lupnp->state; + ms_mutex_unlock(&lupnp->mutex); + } return state; } @@ -398,40 +400,46 @@ bool_t _linphone_upnp_context_is_ready_for_register(UpnpContext *lupnp) { } bool_t linphone_upnp_context_is_ready_for_register(UpnpContext *lupnp) { - bool_t ready; - ms_mutex_lock(&lupnp->mutex); - ready = _linphone_upnp_context_is_ready_for_register(lupnp); - ms_mutex_unlock(&lupnp->mutex); + bool_t ready = FALSE; + if(lupnp != NULL) { + ms_mutex_lock(&lupnp->mutex); + ready = _linphone_upnp_context_is_ready_for_register(lupnp); + ms_mutex_unlock(&lupnp->mutex); + } return ready; } int linphone_upnp_context_get_external_port(UpnpContext *lupnp) { int port = -1; - ms_mutex_lock(&lupnp->mutex); - - if(lupnp->sip_udp != NULL) { - if(lupnp->sip_udp->state == LinphoneUpnpStateOk) { - port = lupnp->sip_udp->external_port; - } - } else if(lupnp->sip_tcp != NULL) { - if(lupnp->sip_tcp->state == LinphoneUpnpStateOk) { - port = lupnp->sip_tcp->external_port; - } - } else if(lupnp->sip_tls != NULL) { - if(lupnp->sip_tls->state == LinphoneUpnpStateOk) { - port = lupnp->sip_tls->external_port; + if(lupnp != NULL) { + ms_mutex_lock(&lupnp->mutex); + + if(lupnp->sip_udp != NULL) { + if(lupnp->sip_udp->state == LinphoneUpnpStateOk) { + port = lupnp->sip_udp->external_port; + } + } else if(lupnp->sip_tcp != NULL) { + if(lupnp->sip_tcp->state == LinphoneUpnpStateOk) { + port = lupnp->sip_tcp->external_port; + } + } else if(lupnp->sip_tls != NULL) { + if(lupnp->sip_tls->state == LinphoneUpnpStateOk) { + port = lupnp->sip_tls->external_port; + } } + + ms_mutex_unlock(&lupnp->mutex); } - - ms_mutex_unlock(&lupnp->mutex); return port; } const char* linphone_upnp_context_get_external_ipaddress(UpnpContext *lupnp) { const char* addr = NULL; - ms_mutex_lock(&lupnp->mutex); - addr = upnp_igd_get_external_ipaddress(lupnp->upnp_igd_ctxt); - ms_mutex_unlock(&lupnp->mutex); + if(lupnp != NULL) { + ms_mutex_lock(&lupnp->mutex); + addr = upnp_igd_get_external_ipaddress(lupnp->upnp_igd_ctxt); + ms_mutex_unlock(&lupnp->mutex); + } return addr; } From 826b0797d720d32a23f841a3fd6a088524c91a6f Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 25 Feb 2013 15:04:17 +0100 Subject: [PATCH 106/281] Add uPnP firewall policy in java --- java/common/org/linphone/core/LinphoneCore.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index 87b5de094..ead3449b7 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -141,6 +141,10 @@ public interface LinphoneCore { * Use ICE. */ static public FirewallPolicy UseIce = new FirewallPolicy(3,"UseIce"); + /** + * Use uPnP. + */ + static public FirewallPolicy UseIce = new FirewallPolicy(4,"UseUpnp"); private final int mValue; private final String mStringValue; From 8e9b2b9a2453279e4fea1322ac6e7024f46b0d6a Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 25 Feb 2013 15:10:47 +0100 Subject: [PATCH 107/281] Fix previous commit typo error --- java/common/org/linphone/core/LinphoneCore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index ead3449b7..ab25520a4 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -144,7 +144,7 @@ public interface LinphoneCore { /** * Use uPnP. */ - static public FirewallPolicy UseIce = new FirewallPolicy(4,"UseUpnp"); + static public FirewallPolicy UseUpnp = new FirewallPolicy(4,"UseUpnp"); private final int mValue; private final String mStringValue; From 4ff35a87df5eff891e635e0f9c8ccea7d16a58b8 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 25 Feb 2013 17:44:51 +0100 Subject: [PATCH 108/281] fix offer answer bug when counting active streams. --- coreapi/offeranswer.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/coreapi/offeranswer.c b/coreapi/offeranswer.c index ab38f7636..9823c24a6 100644 --- a/coreapi/offeranswer.c +++ b/coreapi/offeranswer.c @@ -313,10 +313,9 @@ int offer_answer_initiate_incoming(const SalMediaDescription *local_capabilities }else ms_warning("Unknown protocol for mline %i, declining",i); if (ls){ initiate_incoming(ls,rs,&result->streams[i],one_matching_codec); - result->n_active_streams++; - } - else { - /* create an inactive stream for the answer, as there where no matching stream a local capability */ + if (result->streams[i].rtp_port!=0) result->n_active_streams++; + }else { + /* create an inactive stream for the answer, as there where no matching stream in local capabilities */ result->streams[i].dir=SalStreamInactive; result->streams[i].rtp_port=0; result->streams[i].type=rs->type; From 936ec61f405da21440d6b0f355553243232915ab Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 26 Feb 2013 17:29:28 +0100 Subject: [PATCH 109/281] call->audio_bw should be rouded to the upper value --- coreapi/misc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/misc.c b/coreapi/misc.c index 927c3b55a..e84c8cce9 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -43,7 +43,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #endif - +#include #if !defined(WIN32) @@ -244,7 +244,7 @@ static double get_audio_payload_bandwidth(LinphoneCore *lc, const PayloadType *p } void linphone_core_update_allocated_audio_bandwidth_in_call(LinphoneCall *call, const PayloadType *pt){ - call->audio_bw=(int)(get_audio_payload_bandwidth(call->core,pt)/1000.0); + call->audio_bw=(int)(ceil(get_audio_payload_bandwidth(call->core,pt)/1000.0)); /*rounding codec bandwidth should be avoid, specially for AMR*/ ms_message("Audio bandwidth for this call is %i",call->audio_bw); } From 1a5169a1472b81e1d68b8248550dc789b54b607c Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 28 Feb 2013 10:44:32 +0100 Subject: [PATCH 110/281] uPnP improvements Fix mutex lock in the destructor Add firewall commands in console --- console/commands.c | 6 ++++++ coreapi/upnp.c | 9 +++------ mediastreamer2 | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/console/commands.c b/console/commands.c index a91c58c44..22b09a5a6 100644 --- a/console/commands.c +++ b/console/commands.c @@ -244,6 +244,8 @@ static LPC_COMMAND commands[] = { "'firewall none' : use direct connection.\n" "'firewall nat' : use nat address given with the 'nat' command.\n" "'firewall stun' : use stun server given with the 'stun' command.\n" + "'firewall ice' : use ice.\n" + "'firewall upnp' : use uPnP IGD.\n" }, { "call-logs", lpc_cmd_call_logs, "Calls history", NULL }, { "friend", lpc_cmd_friend, "Manage friends", @@ -850,6 +852,10 @@ lpc_cmd_firewall(LinphoneCore *lc, char *args) { linphone_core_set_firewall_policy(lc,LinphonePolicyNoFirewall); } + else if (strcmp(args,"upnp")==0) + { + linphone_core_set_firewall_policy(lc,LinphonePolicyUseUpnp); + } else if (strcmp(args,"ice")==0) { setting = linphone_core_get_stun_server(lc); diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 86d16d0f0..28477b4de 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -309,15 +309,14 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) { ms_message("uPnP IGD: Wait all pending port bindings ..."); ms_cond_wait(&lupnp->empty_cond, &lupnp->mutex); } + ms_mutex_unlock(&lupnp->mutex); if(lupnp->upnp_igd_ctxt != NULL) { - // upnp_igd_destroy is synchronous so the callbacks will be called in the same thread. - // So release the mutex before upnp_igd_destroy call. - ms_mutex_unlock(&lupnp->mutex); upnp_igd_destroy(lupnp->upnp_igd_ctxt); - ms_mutex_lock(&lupnp->mutex); lupnp->upnp_igd_ctxt = NULL; } + + /* No more multi threading here */ /* Run one more time configuration update and proxy */ linphone_upnp_update_config(lupnp); @@ -345,8 +344,6 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) { ms_list_for_each(lupnp->pending_bindings,(void (*)(void*))linphone_upnp_port_binding_release); lupnp->pending_bindings = ms_list_free(lupnp->pending_bindings); - ms_mutex_unlock(&lupnp->mutex); - ms_mutex_destroy(&lupnp->mutex); ms_cond_destroy(&lupnp->empty_cond); diff --git a/mediastreamer2 b/mediastreamer2 index e033b06a7..8d85a5ded 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit e033b06a731d0b9bc4e69afc690f6469eae73f66 +Subproject commit 8d85a5ded3b18e2d3d4ba22ee75e0f1ef9c0f739 From 1687ceb442b4fa61af2dacf8f93c0b5bfe127b8e Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 28 Feb 2013 11:05:51 +0100 Subject: [PATCH 111/281] Fix pthead_cond/ms_cond error --- coreapi/upnp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 28477b4de..8aead382c 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -241,7 +241,7 @@ void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { * If there is no pending binding emit a signal */ if(lupnp->pending_bindings == NULL) { - pthread_cond_signal(&lupnp->empty_cond); + ms_cond_signal(&lupnp->empty_cond); } ms_mutex_unlock(&lupnp->mutex); } From 1b7857fc8136af71c8d623c68748eec0cb6905d2 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 4 Mar 2013 11:13:14 +0100 Subject: [PATCH 112/281] Fix one more possible crash in TunnelManager if the ip address is NULL. --- coreapi/TunnelManager.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/coreapi/TunnelManager.cc b/coreapi/TunnelManager.cc index 4828bf114..d1020b1b2 100644 --- a/coreapi/TunnelManager.cc +++ b/coreapi/TunnelManager.cc @@ -102,6 +102,10 @@ int TunnelManager::eXosipSelect(int max_fds, fd_set *s1, fd_set *s2, fd_set *s3, void TunnelManager::addServer(const char *ip, int port,unsigned int udpMirrorPort,unsigned int delay) { + if (ip == NULL) { + ip = ""; + ms_warning("Adding tunnel server with empty ip, it will not work!"); + } addServer(ip,port); mUdpMirrorClients.push_back(UdpMirrorClient(ServerAddr(ip,udpMirrorPort),delay)); } From 7f127269fbfe22d211fb6ea8429da583e766a23d Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 4 Mar 2013 14:36:51 +0100 Subject: [PATCH 113/281] Update oRTP and mediastreamer2 submodules. --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 8d85a5ded..b2ddf6ece 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 8d85a5ded3b18e2d3d4ba22ee75e0f1ef9c0f739 +Subproject commit b2ddf6ece0aede9c602cfb39d3f43f177c9dbf7e diff --git a/oRTP b/oRTP index b055a5050..16db79654 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit b055a505042c4420e104ce81a09790c5373f62bb +Subproject commit 16db796543aa4cf0e44bb022f5556d7536e60c34 From 5e0ef20b574f144d10302b0451c7783aec8cbd23 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 5 Mar 2013 11:38:36 +0100 Subject: [PATCH 114/281] update ms2 and ortp --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index b2ddf6ece..a77366122 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit b2ddf6ece0aede9c602cfb39d3f43f177c9dbf7e +Subproject commit a77366122ae4366914fb578bd8f28878f7f521be diff --git a/oRTP b/oRTP index 16db79654..20b527144 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 16db796543aa4cf0e44bb022f5556d7536e60c34 +Subproject commit 20b527144f9850dd9065d96db7a20244e8a8b227 From b458bf95eb2554b110e5ed299a72c34827ef423d Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 5 Mar 2013 11:52:07 +0100 Subject: [PATCH 115/281] merge patch fixing gnome notifications --- gtk/main.c | 8 ++++---- po/de.po | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index dab29bda0..242b7f0be 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1118,13 +1118,13 @@ void linphone_gtk_notify(LinphoneCall *call, const char *msg){ NotifyNotification *n; switch(linphone_call_get_state(call)){ case LinphoneCallError: - make_notification(_("Call error"),body=g_markup_printf_escaped("%s\n%s",msg,remote)); + make_notification(_("Call error"),body=g_markup_printf_escaped("%s\n%s",msg,remote)); break; case LinphoneCallEnd: - make_notification(_("Call ended"),body=g_markup_printf_escaped("%s",remote)); + make_notification(_("Call ended"),body=g_markup_printf_escaped("%s",remote)); break; case LinphoneCallIncomingReceived: - n=build_notification(_("Incoming call"),body=g_markup_printf_escaped("%s",remote)); + n=build_notification(_("Incoming call"),body=g_markup_printf_escaped("%s",remote)); if (notify_actions_supported()) { notify_notification_add_action (n,"answer", _("Answer"), NOTIFY_ACTION_CALLBACK(linphone_gtk_answer_clicked),NULL,NULL); @@ -1134,7 +1134,7 @@ void linphone_gtk_notify(LinphoneCall *call, const char *msg){ show_notification(n); break; case LinphoneCallPausedByRemote: - make_notification(_("Call paused"),body=g_markup_printf_escaped(_("by %s"),remote)); + make_notification(_("Call paused"),body=g_markup_printf_escaped(_("by %s"),remote)); break; default: break; diff --git a/po/de.po b/po/de.po index 6a0b322f7..bb68557f4 100644 --- a/po/de.po +++ b/po/de.po @@ -163,8 +163,8 @@ msgstr "Anruf wird gehalten" #: ../gtk/main.c:1067 #, c-format -msgid "by %s" -msgstr "von %s" +msgid "by %s" +msgstr "von %s" #: ../gtk/main.c:1116 #, c-format From e2788cf307ebcbd22ce706326406b291dfee24cf Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 6 Mar 2013 08:42:04 +0100 Subject: [PATCH 116/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index a77366122..e5f7137b7 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit a77366122ae4366914fb578bd8f28878f7f521be +Subproject commit e5f7137b7206ddc4f2803cde0f3316b90977bd6a From 5046f9388b544f78c92c00de9597e7284d97f0b9 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 6 Mar 2013 11:36:25 +0100 Subject: [PATCH 117/281] Update upnp call stats on session destruction --- coreapi/upnp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 8aead382c..240c34b38 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -1109,7 +1109,10 @@ void linphone_upnp_session_destroy(UpnpSession *session) { linphone_upnp_context_send_remove_port_binding(lc->upnp, session->video->rtcp, TRUE); } } - + + session->call->stats[LINPHONE_CALL_STATS_AUDIO].upnp_state = LinphoneUpnpStateKo; + session->call->stats[LINPHONE_CALL_STATS_VIDEO].upnp_state = LinphoneUpnpStateKo; + linphone_upnp_stream_destroy(session->audio); linphone_upnp_stream_destroy(session->video); ms_free(session); From 68d0139f5a6f375749fda3c4d16863538cbd5e19 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 6 Mar 2013 14:27:11 +0100 Subject: [PATCH 118/281] linphone_call_log_video_enabled, update MS2 to fix IOS display orientation for Linphone iOS branch 1.x --- coreapi/linphonecore.c | 7 ++++++- coreapi/linphonecore.h | 1 + mediastreamer2 | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index a33328f03..69dc26a1e 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -366,7 +366,12 @@ int linphone_call_log_get_duration(LinphoneCallLog *cl){ float linphone_call_log_get_quality(LinphoneCallLog *cl){ return cl->quality; } - +/** + * return true if video was enabled at the end of the call + */ +LinphoneCallStatus linphone_call_log_video_enabled(LinphoneCallLog *cl) { + return cl->video_enabled; +} /** @} */ void linphone_call_log_destroy(LinphoneCallLog *cl){ diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 2c2168646..97d1663b5 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -161,6 +161,7 @@ LinphoneAddress *linphone_call_log_get_to(LinphoneCallLog *cl); LinphoneAddress *linphone_call_log_get_remote_address(LinphoneCallLog *cl); LinphoneCallDir linphone_call_log_get_dir(LinphoneCallLog *cl); LinphoneCallStatus linphone_call_log_get_status(LinphoneCallLog *cl); +LinphoneCallStatus linphone_call_log_video_enabled(LinphoneCallLog *cl); time_t linphone_call_log_get_start_date(LinphoneCallLog *cl); int linphone_call_log_get_duration(LinphoneCallLog *cl); float linphone_call_log_get_quality(LinphoneCallLog *cl); diff --git a/mediastreamer2 b/mediastreamer2 index e5f7137b7..a824c4739 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit e5f7137b7206ddc4f2803cde0f3316b90977bd6a +Subproject commit a824c473919ab993e536e9f2d29471332e68280e From 800e0a3f45107be37ac8aa498243e8d5c93e728e Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 6 Mar 2013 15:02:34 +0100 Subject: [PATCH 119/281] change: on mac, use macport's gtk-osx-application instead of ige-mac-integration. --- README.macos | 2 +- configure.ac | 2 +- gtk/main.c | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.macos b/README.macos index 1648a3135..2c64ea1b1 100644 --- a/README.macos +++ b/README.macos @@ -33,7 +33,7 @@ You need: - Install gtk. It is recommended to use the quartz backend for better integration. $ port install gtk2 +quartz +no_x11 - $ port install ige-mac-integration + $ port install gtk-osx-application -python27 $ port install hicolor-icon-theme - Compile and install the tunnel diff --git a/configure.ac b/configure.ac index 43efbff30..2e2e56232 100644 --- a/configure.ac +++ b/configure.ac @@ -229,7 +229,7 @@ AC_ARG_ENABLE(gtk_ui, if test "$gtk_ui" = "true" ; then PKG_CHECK_MODULES(LIBGTK, gtk+-2.0 >= 2.18.0 gthread-2.0) if test "$enable_x11" = "false" ; then - PKG_CHECK_MODULES(LIBGTKMAC,[ige-mac-integration >= 0.9.7 ]) + PKG_CHECK_MODULES(LIBGTKMAC,[gtk-mac-integration >= 2.0.1]) AC_DEFINE([HAVE_GTK_OSX],[1],[Defined when gtk osx is used]) fi else diff --git a/gtk/main.c b/gtk/main.c index 242b7f0be..b31396b08 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1419,10 +1419,10 @@ static gboolean do_icon_blink(GtkStatusIcon *gi){ void linphone_gtk_status_icon_set_blinking(gboolean val){ #ifdef HAVE_GTK_OSX static gint attention_id; - GtkOSXApplication *theMacApp=(GtkOSXApplication*)g_object_new(GTK_TYPE_OSX_APPLICATION, NULL); + GtkosxApplication *theMacApp=gtkosx_application_get(); if (val) - attention_id=gtk_osxapplication_attention_request(theMacApp,CRITICAL_REQUEST); - else gtk_osxapplication_cancel_attention_request(theMacApp,attention_id); + attention_id=gtkosx_application_attention_request(theMacApp,CRITICAL_REQUEST); + else gtkosx_application_cancel_attention_request(theMacApp,attention_id); #else if (icon!=NULL){ guint tout; @@ -1728,10 +1728,10 @@ static void linphone_gtk_init_main_window(){ #ifdef HAVE_GTK_OSX { GtkWidget *menubar=linphone_gtk_get_widget(main_window,"menubar1"); - GtkOSXApplication *theMacApp = (GtkOSXApplication*)g_object_new(GTK_TYPE_OSX_APPLICATION, NULL); - gtk_osxapplication_set_menu_bar(theMacApp,GTK_MENU_SHELL(menubar)); + GtkosxApplication *theMacApp = gtkosx_application_get(); + gtkosx_application_set_menu_bar(theMacApp,GTK_MENU_SHELL(menubar)); gtk_widget_hide(menubar); - gtk_osxapplication_ready(theMacApp); + gtkosx_application_ready(theMacApp); } g_signal_connect(G_OBJECT(main_window), "window-state-event",G_CALLBACK(on_window_state_event), NULL); #endif @@ -1936,7 +1936,7 @@ int main(int argc, char *argv[]){ add_pixmap_directory(PACKAGE_DATA_DIR "/pixmaps/linphone"); #ifdef HAVE_GTK_OSX - GtkOSXApplication *theMacApp = (GtkOSXApplication*)g_object_new(GTK_TYPE_OSX_APPLICATION, NULL); + GtkosxApplication *theMacApp = gtkosx_application_get(); g_signal_connect(G_OBJECT(theMacApp),"NSApplicationDidBecomeActive",(GCallback)linphone_gtk_show_main_window,NULL); g_signal_connect(G_OBJECT(theMacApp),"NSApplicationWillTerminate",(GCallback)gtk_main_quit,NULL); /*never block termination:*/ From 74e9abe77692b5462bb8b7ec21d5a07734dde10a Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 6 Mar 2013 16:47:48 +0100 Subject: [PATCH 120/281] fix for new version of pango in macports. Macport upgrade required. --- Makefile.am | 2 +- build/macos/environment.sh | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index f871d46a8..36466ab9e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -220,7 +220,7 @@ bundle: $(LIBICONV_HACK) printf "[Pango]\nModuleFiles=./etc/pango/pango.modules\n" \ > $(BUNDLEDIR)/Contents/Resources/etc/pango/pangorc cp -f $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules.orig - sed -e 's:@executable_path/../Resources:../..:g' $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules.orig > $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules + sed -e 's:@executable_path.*/::g' $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules.orig > $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules cp -f $(LIBICONV_HACK) $(BUNDLEDIR)/Contents/Resources/lib/. cd $(BUNDLEDIR)/.. && rm -f $(MACAPPZIP) && zip -r $(MACAPPZIP) $(MACAPPNAME) && cd - diff --git a/build/macos/environment.sh b/build/macos/environment.sh index 8d34ca02c..c2c672973 100644 --- a/build/macos/environment.sh +++ b/build/macos/environment.sh @@ -1,4 +1,5 @@ export EXTRA_ARGS="--workdir $bundle_res" -export GIO_EXTRA_MODULES="$bundle_res/lib/gio/modules" - +export GIO_EXTRA_MODULES="$bundle_lib/gio/modules" +export PANGO_LIBDIR="$bundle_lib" +export PANGO_SYSCONFDIR="$bundle_etc" From 974514eed431f34312d85fe7cbea017d420b5a5c Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 6 Mar 2013 18:09:40 +0100 Subject: [PATCH 121/281] Update README.macos --- README.macos | 49 ++++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/README.macos b/README.macos index 2c64ea1b1..3fb5106a3 100644 --- a/README.macos +++ b/README.macos @@ -8,56 +8,67 @@ You need: Download and install macports using its user friendly installer. - Install build time dependencies - $ port install automake autoconf libtool intltool + $ sudo port install automake autoconf libtool intltool - Install some linphone dependencies with macports - $ port install speex - $ port install libosip2 # WARNING: currently outdated in macport - $ port install libeXosip2 #WARNING: currently outdated in macport - $ port install ffmpeg-devel - $ port install libvpx - $ port install readline + $ sudo port install speex + $ sudo port install libosip2 # WARNING: currently outdated in macport + $ sudo port install libeXosip2 #WARNING: currently outdated in macport + $ sudo port install ffmpeg-devel -gpl2 + $ sudo port install libvpx + $ sudo port install readline - Install srtp (optional) for call encryption - $ port install srtp + $ sudo port install srtp If that fails, get from source: $ git clone git://git.linphone.org/srtp.git $ cd srtp && autoconf && ./configure --prefix=/opt/local && make libsrtp.a $ sudo make install - Install zrtpcpp (optional), for unbreakable call encryption - $ port install cmake + $ sudo port install cmake $ git clone git://git.linphone.org/zrtpcpp.git $ cd zrtpcpp && cmake -Denable-ccrtp=false . && make $ sudo make install - Install gtk. It is recommended to use the quartz backend for better integration. - $ port install gtk2 +quartz +no_x11 - $ port install gtk-osx-application -python27 - $ port install hicolor-icon-theme + $ sudo port install gtk2 +quartz +no_x11 + $ sudo port install gtk-osx-application -python27 + $ sudo port install hicolor-icon-theme + +- Install additional librairies required for wizard (linphone.org account creation assistant) + $ sudo port install libsoup + + ** WARNING 2013-03-06 glib-networking is currently broken in macports - generates crashes or hangs when used in a bundle ** + As a temporary workaround, build a newer version by yourself: + $ wget http://ftp.gnome.org/pub/gnome/sources/glib-networking/2.34/glib-networking-2.34.2.tar.xz + $ tar -xvzf glib-networking-2.34.2.tar.xz + $ cd glib-networking-2.34.2 + $ ./configure --prefix=/opt/local && make + $ sudo make install -- Compile and install the tunnel +- Compile and install the tunnel library (optional, proprietary extension only) -If you got the source code from git, run ./autogen.sh first + If you got the source code from git, run ./autogen.sh first -Then or otherwise, do: + Then or otherwise, do: $ ./configure --prefix=/opt/local && make && sudo make install - Compile linphone -If you got the source code from git, run ./autogen.sh first. + If you got the source code from git, run ./autogen.sh first. -Then or otherwise, do: + Then or otherwise, do: $ ./configure --prefix=/opt/local --with-readline=/opt/local --disable-x11 --with-srtp=/opt/local --with-gsm=/opt/local --enable-zrtp && make -Install to /opt/local + Install to /opt/local $ sudo make install -Done. + Done. If you want to generate a portable bundle, then install gtk-mac-bundler. Use git: From 8a9b9fcd1416a06d1ab5d6393dc981a3a8556082 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 7 Mar 2013 12:19:28 +0100 Subject: [PATCH 122/281] add message storage --- configure.ac | 19 +++ console/Makefile.am | 2 + coreapi/Makefile.am | 8 +- coreapi/callbacks.c | 1 + coreapi/chat.c | 48 ++++++- coreapi/linphonecore.c | 3 + coreapi/linphonecore.h | 4 +- coreapi/message_storage.c | 194 ++++++++++++++++++++++++++++ coreapi/private.h | 23 ++++ coreapi/sal.h | 4 +- coreapi/sal_eXosip2.c | 3 - coreapi/sal_eXosip2_presence.c | 21 +-- gtk/Makefile.am | 5 +- gtk/chat.c | 229 ++++++++++++++++----------------- gtk/main.c | 4 - 15 files changed, 418 insertions(+), 150 deletions(-) create mode 100644 coreapi/message_storage.c diff --git a/configure.ac b/configure.ac index 2e2e56232..890fcba2d 100644 --- a/configure.ac +++ b/configure.ac @@ -669,6 +669,24 @@ if test x$enable_tunnel = xtrue; then AC_SUBST(TUNNEL_LIBS) fi +AC_ARG_ENABLE(msg-storage, + [AS_HELP_STRING([--enable-msg-storage=[yes/no]], [Turn on compilation of message storage (default=yes)])], + [case "${enableval}" in + yes) enable_msg_storage=true ;; + no) enable_msg_storage=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-msg-storage) ;; + esac], + [enable_msg_storage=true] +) +AM_CONDITIONAL(BUILD_MSG_STORAGE, test x$enable_msg_storage = xtrue) +if test x$enable_msg_storage = xtrue; then + PKG_CHECK_MODULES(SQLITE3,[ sqlite3 >= 3.7.0],[],[ + AC_MSG_ERROR([sqlite3 required for message storage not found.])] ) + SQLITE3_CFLAGS+="-DMSG_STORAGE_ENABLED" + AC_SUBST(SQLITE3_CFLAGS) + AC_SUBST(SQLITE3_LIBS) +fi + dnl check for db2html (docbook) to generate html user manual AC_CHECK_PROG(have_sgmltools, sgmltools, yes, no) @@ -781,6 +799,7 @@ printf "* %-30s %s\n" "GTK interface" $gtk_ui printf "* %-30s %s\n" "Account assistant" $build_wizard printf "* %-30s %s\n" "Console interface" $console_ui printf "* %-30s %s\n" "Tools" $build_tools +printf "* %-30s %s\n" "Message storage" $enable_msg_storage printf "* %-30s %s\n" "zRTP encryption (GPLv3)" $zrtp printf "* %-30s %s\n" "uPnP support" $build_upnp diff --git a/console/Makefile.am b/console/Makefile.am index 82ce998e5..976cbeafa 100644 --- a/console/Makefile.am +++ b/console/Makefile.am @@ -14,6 +14,7 @@ COMMON_CFLAGS=\ $(READLINE_CFLAGS) \ $(OSIP_CFLAGS) \ $(ORTP_CFLAGS) \ + $(SQLITE3_CFLAGS) \ $(MEDIASTREAMER_CFLAGS) if BUILD_CONSOLE @@ -28,6 +29,7 @@ linphonec_SOURCES=linphonec.c linphonec.h commands.c linphonec_CFLAGS=$(COMMON_CFLAGS) $(CONSOLE_FLAGS) linphonec_LDADD=$(top_builddir)/coreapi/liblinphone.la \ $(READLINE_LIBS) \ + $(SQLITE3_LIBS) \ $(X11_LIBS) if BUILD_WIN32 diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index 90a1c3202..bef0613b5 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -47,6 +47,7 @@ liblinphone_la_SOURCES=\ lsd.c linphonecore_utils.h \ ec-calibrator.c \ conference.c \ + message_storage.c \ $(GITVERSION_FILE) if BUILD_UPNP @@ -73,7 +74,9 @@ liblinphone_la_LIBADD= \ $(MEDIASTREAMER_LIBS) \ $(ORTP_LIBS) $(OPENSSL_LIBS) \ $(TUNNEL_LIBS) \ - $(LIBSOUP_LIBS) + $(LIBSOUP_LIBS) \ + $(SQLITE3_LIBS) + if BUILD_TESTS noinst_PROGRAMS=test_lsd test_ecc test_numbers @@ -106,7 +109,8 @@ AM_CFLAGS=\ $(IPV6_CFLAGS) \ -DORTP_INET6 \ $(VIDEO_CFLAGS) \ - $(TUNNEL_CFLAGS) + $(TUNNEL_CFLAGS) \ + $(SQLITE3_CFLAGS) if BUILD_WIZARD AM_CFLAGS+= -DBUILD_WIZARD diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 1c87f88ce..d65e53674 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -934,6 +934,7 @@ static void text_delivery_update(SalOp *op, SalTextDeliveryStatus status){ LinphoneChatMessage *chat_msg=(LinphoneChatMessage* )sal_op_get_user_pointer(op); const MSList* calls = linphone_core_get_calls(chat_msg->chat_room->lc); + linphone_core_set_message_state(chat_msg->chat_room,chat_msg->message,chatStatusSal2Linphone(status),chat_msg->time); if (chat_msg && chat_msg->cb) { chat_msg->cb(chat_msg ,chatStatusSal2Linphone(status) diff --git a/coreapi/chat.c b/coreapi/chat.c index b9894ea8f..5f79849dc 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -62,12 +62,26 @@ void linphone_chat_room_destroy(LinphoneChatRoom *cr){ ms_free(cr->peer); } +#ifdef WIN32 + +static inline char *my_ctime_r(const time_t *t, char *buf){ + strcpy(buf,ctime(t)); + return buf; +} + +#else +#define my_ctime_r ctime_r +#endif + static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatMessage* msg){ const char *route=NULL; const char *identity=linphone_core_find_best_identity(cr->lc,cr->peer_url,&route); SalOp *op=NULL; LinphoneCall *call; char* content_type; + time_t t=time(NULL); + char buf[26]; + char *to; if (lp_config_get_int(cr->lc->config,"sip","chat_use_call_dialogs",0)){ if((call = linphone_core_get_call_by_remote_address(cr->lc,cr->peer))!=NULL){ @@ -82,6 +96,7 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM } } } + msg->time=t; if (op==NULL){ /*sending out of calls*/ op = sal_op_new(cr->lc->sal); @@ -94,11 +109,15 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM } if (msg->external_body_url) { content_type=ms_strdup_printf("message/external-body; access-type=URL; URL=\"%s\"",msg->external_body_url); - sal_message_send(op,identity,cr->peer,content_type, NULL); + sal_message_send(op,identity,cr->peer,content_type, NULL,my_ctime_r(&t,buf)); ms_free(content_type); } else { - sal_text_send(op, identity, cr->peer,msg->message); + sal_text_send(op, identity, cr->peer,msg->message,my_ctime_r(&t,buf)); } + to=linphone_address_as_string_uri_only (cr->peer_url); + linphone_core_set_history_message(cr,identity,to,OUTGOING,msg->message, + my_ctime_r(&t,buf),READ,LinphoneChatMessageStateInProgress); + ms_free(to); } /** @@ -130,8 +149,11 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag LinphoneChatRoom *cr=NULL; LinphoneAddress *addr; char *cleanfrom; + const char *to; + char *from; LinphoneChatMessage* msg; const SalCustomHeader *ch; + char buf[26]; addr=linphone_address_new(sal_msg->from); linphone_address_clean(addr); @@ -142,7 +164,9 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag } cr=NULL; } + to=linphone_core_get_identity(lc); cleanfrom=linphone_address_as_string(addr); + from=linphone_address_as_string_uri_only(addr); if (cr==NULL){ /* create a new chat room */ cr=linphone_core_create_chat_room(lc,cleanfrom); @@ -150,6 +174,7 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag msg = linphone_chat_room_create_message(cr, sal_msg->text); linphone_chat_message_set_from(msg, cr->peer_url); msg->time=sal_msg->time; + msg->state=LinphoneChatMessageStateDelivered; ch=sal_op_get_custom_header(op); if (ch) msg->custom_headers=sal_custom_header_clone(ch); @@ -158,7 +183,11 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag } linphone_address_destroy(addr); linphone_chat_room_message_received(cr,lc,msg); + linphone_core_set_history_message(cr,to,from,INCOMING, + msg->message,my_ctime_r(&msg->time,buf),NOT_READ, + LinphoneChatMessageStateDelivered); ms_free(cleanfrom); + ms_free(from); } /** @@ -215,6 +244,7 @@ LinphoneChatMessage* linphone_chat_room_create_message(LinphoneChatRoom *cr, con void linphone_chat_room_send_message2(LinphoneChatRoom *cr, LinphoneChatMessage* msg,LinphoneChatMessageStateChangeCb status_cb, void* ud) { msg->cb=status_cb; msg->cb_ud=ud; + msg->state=LinphoneChatMessageStateInProgress; _linphone_chat_room_send_message(cr, msg); } @@ -308,6 +338,15 @@ time_t linphone_chat_message_get_time(const LinphoneChatMessage* message) { return message->time; } +/** + * Get the state of the message + *@param message #LinphoneChatMessage obj + *@return #LinphoneChatMessageState + */ +LinphoneChatMessageState linphone_chat_message_get_state(const LinphoneChatMessage* message) { + return message->state; +} + /** * Get text part of this message * @return text or NULL if no text. @@ -347,6 +386,9 @@ LinphoneChatMessage* linphone_chat_message_clone(const LinphoneChatMessage* msg) void* message_userdata; char* external_body_url; LinphoneAddress* from; + time_t time; + SalCustomHeader *custom_headers; + LinphoneChatMessageState state; };*/ LinphoneChatMessage* new_message = linphone_chat_room_create_message(msg->chat_room,msg->message); if (msg->external_body_url) new_message->external_body_url=ms_strdup(msg->external_body_url); @@ -354,6 +396,8 @@ LinphoneChatMessage* linphone_chat_message_clone(const LinphoneChatMessage* msg) new_message->cb_ud=msg->cb_ud; new_message->message_userdata=msg->message_userdata; new_message->cb=msg->cb; + new_message->time=msg->time; + new_message->state=msg->state; if (msg->from) new_message->from=linphone_address_clone(msg->from); return new_message; } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 69dc26a1e..eac319061 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1306,6 +1306,9 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta #ifdef TUNNEL_ENABLED lc->tunnel=linphone_core_tunnel_new(lc); if (lc->tunnel) linphone_tunnel_configure(lc->tunnel); +#endif +#ifdef MSG_STORAGE_ENABLED + lc->db=linphone_message_storage_init(); #endif if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Ready")); diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 97d1663b5..c1054922d 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -673,6 +673,7 @@ LinphoneCore* linphone_chat_room_get_lc(LinphoneChatRoom *cr); void linphone_chat_room_set_user_data(LinphoneChatRoom *cr, void * ud); void * linphone_chat_room_get_user_data(LinphoneChatRoom *cr); +LinphoneChatMessageState linphone_chat_message_get_state(const LinphoneChatMessage* message); const char* linphone_chat_message_state_to_string(const LinphoneChatMessageState state); LinphoneChatMessage* linphone_chat_message_clone(const LinphoneChatMessage* message); void linphone_chat_message_set_from(LinphoneChatMessage* message, const LinphoneAddress* from); @@ -1417,7 +1418,8 @@ int linphone_core_get_audio_dscp(const LinphoneCore *lc); void linphone_core_set_video_dscp(LinphoneCore *lc, int dscp); int linphone_core_get_video_dscp(const LinphoneCore *lc); - +MSList *linphone_chat_room_get_history(const char *to,LinphoneChatRoom *cr,int nb_message); +void linphone_core_set_messages_flag_read(LinphoneChatRoom *cr,const char *from, int read); #ifdef __cplusplus } diff --git a/coreapi/message_storage.c b/coreapi/message_storage.c new file mode 100644 index 000000000..90665c26c --- /dev/null +++ b/coreapi/message_storage.c @@ -0,0 +1,194 @@ +/* +message_storage.c +Copyright (C) 2012 Belledonne Communications, Grenoble, France + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "private.h" +#include "linphonecore.h" + +#ifdef WIN32 + +static inline char *my_ctime_r(const time_t *t, char *buf){ + strcpy(buf,ctime(t)); + return buf; +} + +#else +#define my_ctime_r ctime_r +#endif + +#ifdef MSG_STORAGE_ENABLED + +#include "sqlite3.h" + +static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; +static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; + +#define CONFIG_FILE ".linphone-history.db" + +char *linphone_message_storage_get_config_file(const char *filename){ + const int path_max=1024; + char *config_file=(char *)malloc(path_max*sizeof(char)); + if (filename==NULL) filename=CONFIG_FILE; + /*try accessing a local file first if exists*/ + if (access(CONFIG_FILE,F_OK)==0){ + snprintf(config_file,path_max,"%s",filename); + }else{ +#ifdef WIN32 + const char *appdata=getenv("APPDATA"); + if (appdata){ + snprintf(config_file,path_max,"%s\\%s",appdata,LINPHONE_CONFIG_DIR); + CreateDirectory(config_file,NULL); + snprintf(config_file,path_max,"%s\\%s\\%s",appdata,LINPHONE_CONFIG_DIR,filename); + } +#else + const char *home=getenv("HOME"); + if (home==NULL) home="."; + snprintf(config_file,path_max,"%s/%s",home,filename); +#endif + } + return config_file; +} + +void create_chat_message(char **argv, void *data){ + LinphoneChatRoom *cr = (LinphoneChatRoom *)data; + LinphoneChatMessage* new_message = linphone_chat_room_create_message(cr,argv[4]); + struct tm ret={0}; + char tmp1[80]={0}; + char tmp2[80]={0}; + + if(atoi(argv[3])==INCOMING){ + linphone_chat_message_set_from(new_message,linphone_address_new(argv[2])); + } else { + linphone_chat_message_set_from(new_message,linphone_address_new(argv[1])); + } + + if(argv[5]!=NULL){ + int i,j; + sscanf(argv[5],"%3c %3c%d%d:%d:%d %d",tmp1,tmp2,&ret.tm_mday, + &ret.tm_hour,&ret.tm_min,&ret.tm_sec,&ret.tm_year); + ret.tm_year-=1900; + for(i=0;i<7;i++) { + if(strcmp(tmp1,days[i])==0) ret.tm_wday=i; + } + for(j=0;j<12;j++) { + if(strcmp(tmp2,months[j])==0) ret.tm_mon=j; + } + } + new_message->time=argv[5]!=NULL ? mktime(&ret) : time(NULL); + new_message->state=atoi(argv[7]); + cr->messages_hist=ms_list_prepend(cr->messages_hist,(void *)new_message); +} + +static int callback(void *data, int argc, char **argv, char **colName){ + create_chat_message(argv,data); + return 0; +} + +void linphone_sql_request_message(sqlite3 *db,const char *stmt,void *data){ + char* errmsg; + int ret; + ret=sqlite3_exec(db,stmt,callback,data,&errmsg); + if(ret != SQLITE_OK) { + printf("Error in creation: %s.\n", errmsg); + } +} + +void linphone_sql_request(sqlite3* db,const char *stmt){ + char* errmsg; + int ret; + ret=sqlite3_exec(db,stmt,0,0,&errmsg); + if(ret != SQLITE_OK) { + printf("Error in creation: %s.\n", errmsg); + } +} + +void linphone_core_set_history_message(LinphoneChatRoom *cr,const char *local_contact,const char *remote_contact, + int direction, const char *message,const char *date, int read, int state){ + LinphoneCore *lc=linphone_chat_room_get_lc(cr); + char *buf=sqlite3_mprintf("insert into history values(NULL,%Q,%Q,%i,%Q,%Q,%i,%i);", + local_contact,remote_contact,direction,message,date,read,state); + linphone_sql_request(lc->db,buf); +} + +void linphone_core_set_message_state(LinphoneChatRoom *cr,const char *message, int state, time_t date){ + LinphoneCore *lc=linphone_chat_room_get_lc(cr); + char time_str[26]; + char *buf=sqlite3_mprintf("update history set status=%i where message = %Q and time = %Q;", + state,message,my_ctime_r(&date,time_str)); + linphone_sql_request(lc->db,buf); +} + +void linphone_core_set_messages_flag_read(LinphoneChatRoom *cr,const char *from, int read){ + LinphoneCore *lc=linphone_chat_room_get_lc(cr); + char *buf=sqlite3_mprintf("update history set read=%i where remoteContact = %Q;", + read,from); + linphone_sql_request(lc->db,buf); +} + +MSList *linphone_chat_room_get_history(const char *to,LinphoneChatRoom *cr,int nb_message){ + LinphoneCore *lc=linphone_chat_room_get_lc(cr); + cr->messages_hist = NULL; + char *buf=sqlite3_mprintf("select * from history where remoteContact = %Q order by id DESC limit %i ;",to,nb_message); + linphone_sql_request_message(lc->db,buf,(void *)cr); + return cr->messages_hist; +} + +void linphone_close_storage(sqlite3* db){ + sqlite3_close(db); +} + +void linphone_create_table(sqlite3* db){ + char* errmsg; + int ret; + ret=sqlite3_exec(db,"CREATE TABLE if not exists history (id INTEGER PRIMARY KEY AUTOINCREMENT, localContact TEXT NOT NULL, remoteContact TEXT NOT NULL, direction INTEGER, message TEXT, time TEXT NOT NULL, read INTEGER, status INTEGER);", + 0,0,&errmsg); + if(ret != SQLITE_OK) { + printf("Error in creation: %s.\n", errmsg); + } +} + +sqlite3 * linphone_message_storage_init(){ + int ret; + char *errmsg; + sqlite3 *db; + char *filename; + filename=linphone_message_storage_get_config_file(NULL); + ret=sqlite3_open(filename,&db); + if(ret != SQLITE_OK) { + printf("Error in the opening: %s.\n", errmsg); + sqlite3_close(db); + } + linphone_create_table(db); + return db; +} +#else + +void linphone_core_set_history_message(LinphoneChatRoom *cr,const char *local_contact,const char *remote_contact, + int direction, const char *message,const char *date, int read, int state){ +} + +void linphone_core_set_message_state(LinphoneChatRoom *cr,const char *message, int state, time_t date){ +} + +void linphone_core_set_messages_flag_read(LinphoneChatRoom *cr,const char *from, int read){ +} + +MSList *linphone_chat_room_get_history(const char *to,LinphoneChatRoom *cr,int nb_message){ + return NULL; +} +#endif \ No newline at end of file diff --git a/coreapi/private.h b/coreapi/private.h index 41d453df3..35578604f 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -44,6 +44,10 @@ extern "C" { #include "upnp.h" #endif //BUILD_UPNP +#ifdef MSG_STORAGE_ENABLED +#include "sqlite3.h" +#endif + #ifndef LIBLINPHONE_VERSION #define LIBLINPHONE_VERSION LINPHONE_VERSION #endif @@ -125,6 +129,7 @@ struct _LinphoneChatMessage { LinphoneAddress* from; time_t time; SalCustomHeader *custom_headers; + LinphoneChatMessageState state; }; typedef struct StunCandidate{ @@ -392,6 +397,7 @@ struct _LinphoneChatRoom{ char *peer; LinphoneAddress *peer_url; void * user_data; + MSList *messages_hist; }; @@ -610,6 +616,9 @@ struct _LinphoneCore LinphoneTunnel *tunnel; char* device_id; MSList *last_recv_msg_ids; +#ifdef MSG_STORAGE_ENABLED + sqlite3 *db; +#endif #ifdef BUILD_UPNP UpnpContext *upnp; #endif //BUILD_UPNP @@ -691,6 +700,20 @@ void linphone_call_params_uninit(LinphoneCallParams *params); int linphone_upnp_init(LinphoneCore *lc); void linphone_upnp_destroy(LinphoneCore *lc); +#define OUTGOING 0 +#define INCOMING 1 + +#define NOT_READ 0 +#define READ 1 + +#ifdef MSG_STORAGE_ENABLED +sqlite3 * linphone_message_storage_init(); +#endif +void linphone_core_set_history_message(LinphoneChatRoom *cr,const char *local_contact,const char *remote_contact, + int direction, const char *message,const char *date, int read, int state); +void linphone_core_set_message_state(LinphoneChatRoom *cr,const char *message, int state,time_t date); + + #ifdef __cplusplus } #endif diff --git a/coreapi/sal.h b/coreapi/sal.h index 25d8d20bc..ba232cca3 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -430,8 +430,8 @@ int sal_register_refresh(SalOp *op, int expires); int sal_unregister(SalOp *h); /*Messaging */ -int sal_text_send(SalOp *op, const char *from, const char *to, const char *text); -int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg); +int sal_text_send(SalOp *op, const char *from, const char *to, const char *text, const char*t); +int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg, const char*t); /*presence Subscribe/notify*/ int sal_subscribe_presence(SalOp *op, const char *from, const char *to); diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 1777c0d42..2ea0f9aff 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1800,7 +1800,6 @@ static void text_received(Sal *sal, eXosip_event_t *ev){ } }else ms_warning("No date header in SIP MESSAGE, we don't know when it was sent."); - content_type= osip_message_get_content_type(ev->request); if (!content_type) { ms_error("Could not get message because no content type"); @@ -1848,8 +1847,6 @@ static void text_received(Sal *sal, eXosip_event_t *ev){ osip_free(from); } - - static void other_request(Sal *sal, eXosip_event_t *ev){ ms_message("in other_request"); if (ev->request==NULL) return; diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index 1e49970bf..2670af472 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -81,21 +81,8 @@ void sal_remove_in_subscribe(Sal *sal, SalOp *op){ sal->in_subscribes=ms_list_remove(sal->in_subscribes,op); } -#ifdef WIN32 - -static inline char *my_ctime_r(const time_t *t, char *buf){ - strcpy(buf,ctime(t)); - return buf; -} - -#else -#define my_ctime_r ctime_r -#endif - -int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg){ +int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg, const char *t){ osip_message_t *sip=NULL; - time_t t=time(NULL); - char buf[26]; if(op->cid == -1) { @@ -111,7 +98,7 @@ int sal_message_send(SalOp *op, const char *from, const char *to, const char* co sal_op_get_from(op),sal_op_get_route(op)); if (sip!=NULL){ sal_exosip_add_custom_headers(sip,op->base.custom_headers); - osip_message_set_date(sip,my_ctime_r(&t,buf)); + osip_message_set_date(sip,t); osip_message_set_content_type(sip,content_type); if (msg) osip_message_set_body(sip,msg,strlen(msg)); sal_add_other(op->base.root,op,sip); @@ -141,8 +128,8 @@ int sal_message_send(SalOp *op, const char *from, const char *to, const char* co return 0; } -int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg) { - return sal_message_send(op,from,to,"text/plain",msg); +int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg,const char *t) { + return sal_message_send(op,from,to,"text/plain",msg,t); } /*presence Subscribe/notify*/ int sal_subscribe_presence(SalOp *op, const char *from, const char *to){ diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 831c69a8c..ba965b69a 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -55,7 +55,7 @@ linphone_SOURCES+= \ endif linphone_LDADD= $(top_builddir)/coreapi/liblinphone.la \ - $(LIBGTK_LIBS) $(NOTIFY1_LIBS) $(NOTIFY4_LIBS) $(LIBGTKMAC_LIBS) $(INTLLIBS) + $(LIBGTK_LIBS) $(NOTIFY1_LIBS) $(NOTIFY4_LIBS) $(LIBGTKMAC_LIBS) $(INTLLIBS) $(SQLITE3_LIBS) if BUILD_WIN32 @@ -79,7 +79,8 @@ AM_CFLAGS= -DIN_LINPHONE -I$(top_srcdir)/coreapi/ \ $(MEDIASTREAMER_CFLAGS) \ $(ORTP_CFLAGS) \ $(STRICT_OPTIONS) $(LIBGTK_CFLAGS) $(LIBGTKMAC_CFLAGS) $(IPV6_CFLAGS) \ - $(TUNNEL_CFLAGS) + $(TUNNEL_CFLAGS) \ + $(SQLITE3_CFLAGS) version_date.h: $(top_srcdir)/configure.ac diff --git a/gtk/chat.c b/gtk/chat.c index 76d34c2ff..159ddd8bc 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -29,15 +29,24 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *w=g_object_get_data(G_OBJECT(friendlist),"chatview"); int idx = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"idx")); + g_return_if_fail(w!=NULL); - gtk_notebook_remove_page (GTK_NOTEBOOK(nb),idx); + gtk_notebook_remove_page(GTK_NOTEBOOK(nb),idx); linphone_gtk_create_chat_picture(FALSE); g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); - g_object_set_data(G_OBJECT(w),"from_message",NULL); + g_object_set_data(G_OBJECT(w),"from_message",NULL); g_object_set_data(G_OBJECT(w),"cr",NULL); gtk_widget_destroy(w); } +const char* get_display_name(const LinphoneAddress *from){ + const char *display=linphone_address_get_display_name(from); + if (display==NULL || display[0]=='\0') { + display=linphone_address_get_username(from); + } + return display; +} + GtkWidget *create_tab_chat_header(LinphoneChatRoom *cr,const LinphoneAddress *uri){ GtkWidget *w=gtk_hbox_new (FALSE,0); GtkWidget *i=create_pixmap ("chat.png"); @@ -49,12 +58,7 @@ GtkWidget *create_tab_chat_header(LinphoneChatRoom *cr,const LinphoneAddress *ur gtk_button_set_relief(GTK_BUTTON(b),GTK_RELIEF_NONE); gtk_widget_set_size_request(b,25,20); g_signal_connect_swapped(G_OBJECT(b),"clicked",G_CALLBACK(linphone_gtk_quit_chatroom),cr); - - const char *display=linphone_address_get_display_name(uri); - if (display==NULL || display[0]=='\0') { - display=linphone_address_get_username(uri); - } - l=gtk_label_new (display); + l=gtk_label_new (get_display_name(uri)); gtk_box_pack_start (GTK_BOX(w),i,FALSE,FALSE,0); gtk_box_pack_start (GTK_BOX(w),l,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(w),b,TRUE,TRUE,0); @@ -75,81 +79,73 @@ void udpate_tab_chat_header(GtkWidget *chat_view,const LinphoneAddress *uri,Linp gtk_button_set_relief(GTK_BUTTON(b),GTK_RELIEF_NONE); gtk_widget_set_size_request(b,25,20); g_signal_connect_swapped(G_OBJECT(b),"clicked",G_CALLBACK(linphone_gtk_quit_chatroom),cr); - - const char *display=linphone_address_get_display_name(uri); - if (display==NULL || display[0]=='\0') { - display=linphone_address_get_username(uri); - } - l=gtk_label_new (display); + l=gtk_label_new (get_display_name(uri)); gtk_box_pack_start (GTK_BOX(w),i,FALSE,FALSE,0); gtk_box_pack_start (GTK_BOX(w),l,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(w),b,TRUE,TRUE,0); - gtk_notebook_set_tab_label(notebook,chat_view,w); gtk_widget_show_all(w); - } void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, - const char *message, gboolean me,LinphoneChatRoom *cr, time_t t){ + gboolean me,LinphoneChatRoom *cr,LinphoneChatMessage *msg, gboolean hist){ GtkTextView *text=GTK_TEXT_VIEW(linphone_gtk_get_widget(w,"textview")); GtkTextBuffer *buffer=gtk_text_view_get_buffer(text); - GtkTextIter iter,begin,end; - gtk_text_buffer_get_start_iter(buffer,&begin); + GtkTextIter iter,begin; int off; + char *from_str=linphone_address_as_string_uri_only(from); + char *from_message=(char *)g_object_get_data(G_OBJECT(w),"from_message"); + GList *list=g_object_get_data(G_OBJECT(w),"list"); + time_t t; + + gtk_text_buffer_get_start_iter(buffer,&begin); gtk_text_buffer_get_end_iter(buffer,&iter); off=gtk_text_iter_get_offset(&iter); - GList *list=g_object_get_data(G_OBJECT(w),"list"); - - if(g_strcmp0((char *)g_object_get_data(G_OBJECT(w),"from_message"),linphone_address_as_string(from))!=0){ + if(g_strcmp0(from_message,from_str)!=0){ gtk_text_buffer_get_iter_at_offset(buffer,&iter,off); - const char *display=linphone_address_get_display_name(from); - if (display==NULL || display[0]=='\0') { - display=linphone_address_get_username(from); - } gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,display,-1,"bold",me ? "bg":NULL,NULL); + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,get_display_name(from),-1,"bold",me ? "bg":NULL,NULL); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter," : ",-1,"bold",me ? "bg":NULL,NULL); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); - g_object_set_data(G_OBJECT(w),"from_message",linphone_address_as_string(from)); + g_object_set_data(G_OBJECT(w),"from_message",from_str); } - gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_get_iter_at_offset(buffer,&begin,off); - gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,message,-1,"margin",me ? "bg":NULL,NULL); + gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,linphone_chat_message_get_text(msg),-1,"margin",me ? "bg":NULL,NULL); gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert(buffer,&iter,"\n",-1); - gtk_text_buffer_get_bounds (buffer, &begin, &end); - GHashTable *hash=(GHashTable *)g_object_get_data(G_OBJECT(linphone_gtk_get_main_window()),"history"); - if(me){ - g_hash_table_insert(hash,linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr)), - (gpointer)gtk_text_buffer_get_text(buffer,&begin,&end,FALSE)); - } else { - g_hash_table_insert(hash,linphone_address_as_string_uri_only(from), - (gpointer)gtk_text_buffer_get_text(buffer,&begin,&end,FALSE)); - } - g_object_set_data(G_OBJECT(linphone_gtk_get_main_window()),"history",hash); - - + gtk_text_buffer_insert(buffer,&iter,"\n",-1);; gtk_text_buffer_get_end_iter(buffer,&iter); - if(me){ - list=g_list_append(list,GINT_TO_POINTER(gtk_text_iter_get_line(&iter))); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Sending .. ",-1, - "italic","right","small","font_grey","bg",NULL); - g_object_set_data(G_OBJECT(w),"list",list); - } else { - struct tm *tm=localtime(&t); - char buf[80]; - strftime(buf,80,"Send at %H:%M",tm); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,buf,-1, - "italic","right","small","font_grey",NULL); + t=linphone_chat_message_get_time(msg); + switch (linphone_chat_message_get_state (msg)){ + case LinphoneChatMessageStateInProgress: + { + list=g_list_append(list,GINT_TO_POINTER(gtk_text_iter_get_line(&iter))); + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Sending .. ",-1, + "right","small","italic","font_grey","bg",NULL); + g_object_set_data(G_OBJECT(w),"list",list); + break; + } + case LinphoneChatMessageStateDelivered: + { + struct tm *tm=localtime(&t); + char buf[80]; + strftime(buf,80,"%H:%M",tm); + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,buf,-1, + "right","small","italic","font_grey",me ? "bg":NULL,NULL); + break; + } + case LinphoneChatMessageStateNotDelivered: + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Error",-1, + "right","small","italic","font_grey",me ? "bg":NULL,NULL); + break; + default : gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Sending ..",-1, + "right","small","italic","font_grey",me ? "bg":NULL,NULL); } gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); - gtk_text_view_scroll_mark_onscreen(text,mark); + gtk_text_view_scroll_mark_onscreen(text,mark); } const LinphoneAddress* linphone_gtk_get_used_identity(){ @@ -160,8 +156,6 @@ const LinphoneAddress* linphone_gtk_get_used_identity(){ else return linphone_core_get_primary_contact_parsed(lc); } - -/* function in dev for displaying ack*/ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessage *msg){ GtkWidget *main_window=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); @@ -181,7 +175,7 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag gtk_text_buffer_get_iter_at_line_offset(b,&start, GPOINTER_TO_INT(g_list_nth_data(list,0)), gtk_text_iter_get_chars_in_line(&iter)-1); - }else { + }else{ gtk_text_buffer_get_iter_at_line_offset(b,&start, GPOINTER_TO_INT(g_list_nth_data(list,0)),0); } @@ -209,7 +203,7 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag default : result="Sending .."; } gtk_text_buffer_insert_with_tags_by_name(b,&iter,result,-1, - "italic","right","small","font_grey","bg",NULL); + "right","small","italic","font_grey","bg",NULL); list=g_list_remove(list,g_list_nth_data(list,0)); g_object_set_data(G_OBJECT(page),"list",list); } @@ -231,59 +225,66 @@ void linphone_gtk_send_text(){ LinphoneChatMessage *msg; msg=linphone_chat_room_create_message(cr,entered); linphone_chat_room_send_message2(cr,msg,on_chat_state_changed,NULL); - linphone_gtk_push_text(w, - linphone_gtk_get_used_identity(), - entered,TRUE,cr,linphone_chat_message_get_time(msg)); + linphone_gtk_push_text(w,linphone_gtk_get_used_identity(), + TRUE,cr,msg,FALSE); gtk_entry_set_text(GTK_ENTRY(entry),""); } } +void display_history_message(GtkWidget *chat_view,MSList *messages,const LinphoneAddress *with){ + if(messages != NULL){ + MSList *it; + char *from_str; + char *with_str; + for(it=messages;it!=NULL;it=it->next){ + LinphoneChatMessage *msg=(LinphoneChatMessage *)it->data; + from_str=linphone_address_as_string_uri_only(linphone_chat_message_get_from(msg)); + with_str=linphone_address_as_string_uri_only(with); + linphone_gtk_push_text(chat_view,strcmp(from_str,with_str)==0? with : + linphone_chat_message_get_from(msg), + strcmp(from_str,with_str)==0? FALSE : TRUE, + linphone_chat_message_get_chat_room(msg),msg,TRUE); + } + g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); + ms_free(from_str); + ms_free(with_str); + } +} + GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddress *with){ GtkWidget *chat_view=linphone_gtk_create_widget("main","chatroom_frame"); GtkWidget *main_window=linphone_gtk_get_main_window (); - GHashTable *hash=g_object_get_data(G_OBJECT(main_window),"history"); GtkNotebook *notebook=(GtkNotebook *)linphone_gtk_get_widget(main_window,"viewswitch"); GtkWidget *text=linphone_gtk_get_widget(chat_view,"textview"); GdkColor color; + GdkColor colorb; int idx; - + GtkWidget *button; + GtkWidget *entry; + GList *list=NULL; + MSList *messages; + char *with_str; + color.red = 32512; color.green = 32512; color.blue = 32512; - - GdkColor colorb; colorb.red = 56832; colorb.green = 60928; colorb.blue = 61952; - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW(text),GTK_WRAP_WORD); - gtk_text_view_set_editable (GTK_TEXT_VIEW(text),FALSE); - gtk_notebook_append_page (notebook,chat_view,create_tab_chat_header(cr,with)); + with_str=linphone_address_as_string_uri_only(with); + linphone_core_set_messages_flag_read(cr,with_str,1); + gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_WORD_CHAR); + gtk_text_view_set_editable(GTK_TEXT_VIEW(text),FALSE); + gtk_notebook_append_page(notebook,chat_view,create_tab_chat_header(cr,with)); idx = gtk_notebook_page_num(notebook, chat_view); gtk_notebook_set_current_page(notebook, idx); gtk_widget_show(chat_view); - g_object_set_data(G_OBJECT(chat_view),"cr",cr); g_object_set_data(G_OBJECT(chat_view),"idx",GINT_TO_POINTER(idx)); g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); - g_object_set_data(G_OBJECT(chat_view),"from_chatroom",(gpointer) with); - - GList *list=NULL; g_object_set_data(G_OBJECT(chat_view),"list",list); - - gchar *buf=g_hash_table_lookup(hash,linphone_address_as_string_uri_only(with)); - if(buf != NULL){ - GtkTextIter start; - GtkTextIter end; - - GtkTextBuffer *text_buffer; - text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); - gtk_text_buffer_get_bounds(text_buffer, &start, &end); - gtk_text_buffer_delete (text_buffer, &start, &end); - gtk_text_buffer_insert(text_buffer,&start,buf,-1); - } - gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), "right","justification", GTK_JUSTIFY_RIGHT,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), @@ -300,13 +301,13 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres "margin","indent",10,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), "bg","paragraph-background-gdk",&colorb,NULL); - - GtkWidget *button = linphone_gtk_get_widget(chat_view,"send"); + messages = linphone_chat_room_get_history(with_str,cr,10); + display_history_message(chat_view,messages,with); + button = linphone_gtk_get_widget(chat_view,"send"); g_signal_connect_swapped(G_OBJECT(button),"clicked",(GCallback)linphone_gtk_send_text,NULL); - - GtkWidget *entry = linphone_gtk_get_widget(chat_view,"text_entry"); + entry = linphone_gtk_get_widget(chat_view,"text_entry"); g_signal_connect_swapped(G_OBJECT(entry),"activate",(GCallback)linphone_gtk_send_text,NULL); - + ms_free(with_str); return chat_view; } @@ -318,31 +319,31 @@ LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with){ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri,GtkWidget *chat_view){ GtkWidget *main_window=linphone_gtk_get_main_window (); - GHashTable *hash=g_object_get_data(G_OBJECT(main_window),"history"); - LinphoneAddress *from=(LinphoneAddress *)g_object_get_data(G_OBJECT(chat_view),"from_chatroom"); - if(g_strcmp0(linphone_address_as_string(from),linphone_address_as_string(uri))!=0) - { + LinphoneChatRoom *cr2=(LinphoneChatRoom *)g_object_get_data(G_OBJECT(chat_view),"cr"); + char *from_str=linphone_address_as_string(linphone_chat_room_get_peer_address (cr2)); + char *uri_str=linphone_address_as_string(uri); + char *uri_only=linphone_address_as_string_uri_only(uri); + MSList *messages=NULL; + + linphone_core_set_messages_flag_read(cr,uri_only,1); + if(g_strcmp0(from_str,uri_str)!=0){ GtkTextView *text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); GtkTextIter start; GtkTextIter end; - gchar *buf=g_hash_table_lookup(hash,linphone_address_as_string_uri_only(uri)); - GtkTextBuffer *text_buffer; + GtkTextBuffer *text_buffer; + text_buffer=gtk_text_view_get_buffer(text_view); gtk_text_buffer_get_bounds(text_buffer, &start, &end); - g_object_set_data(G_OBJECT(chat_view),"cr",cr); gtk_text_buffer_delete (text_buffer, &start, &end); - if(buf!=NULL){ - gtk_text_buffer_insert_with_tags_by_name(text_buffer,&start,buf,-1,"font_grey",NULL); - GtkTextMark *mark=gtk_text_buffer_create_mark(text_buffer, NULL, &start, FALSE); - gtk_text_view_scroll_to_mark(text_view,mark, 0, FALSE, 0, 0); - } - udpate_tab_chat_header(chat_view,uri,cr); g_object_set_data(G_OBJECT(chat_view),"cr",cr); - g_object_set_data(G_OBJECT(chat_view),"from_chatroom",(gpointer) uri); - g_object_set_data(G_OBJECT(chat_view),"from_message",linphone_address_as_string_uri_only(uri)); g_object_set_data(G_OBJECT(linphone_gtk_get_widget(main_window,"contact_list")),"chatview",(gpointer)chat_view); + messages = linphone_chat_room_get_history(uri_only,cr,10); + g_object_set_data(G_OBJECT(chat_view),"from_message",uri_str); + display_history_message(chat_view,messages,uri); } + ms_free(from_str); + ms_free(uri_str); } void linphone_gtk_chat_destroyed(GtkWidget *w){ @@ -360,8 +361,7 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg){ GtkWidget *main_window=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); - GtkWidget *w; - + GtkWidget *w; w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); if(w!=NULL){ @@ -371,12 +371,7 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); g_object_set_data(G_OBJECT(friendlist),"from",(gpointer)linphone_chat_message_get_from(msg)); } - - const char *display=linphone_address_get_display_name(linphone_chat_message_get_from(msg)); - if (display==NULL || display[0]=='\0') { - display=linphone_address_get_username(linphone_chat_message_get_from(msg)); - } - + get_display_name(linphone_chat_message_get_from(msg)); #ifdef HAVE_GTK_OSXs /* Notified when a new message is sent */ linphone_gtk_status_icon_set_blinking(TRUE); @@ -391,7 +386,7 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, } #endif linphone_gtk_push_text(w,linphone_chat_message_get_from(msg), - linphone_chat_message_get_text(msg),FALSE,room,linphone_chat_message_get_time(msg)); + FALSE,room,msg,FALSE); linphone_gtk_update_chat_picture(); //gtk_window_present(GTK_WINDOW(w)); /*gtk_window_set_urgency_hint(GTK_WINDOW(w),TRUE);*/ diff --git a/gtk/main.c b/gtk/main.c index b31396b08..b1dab3d65 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1556,10 +1556,6 @@ static void linphone_gtk_configure_main_window(){ static gboolean buttons_have_borders; static gboolean show_abcd; GtkWidget *w=linphone_gtk_get_main_window(); - GHashTable *contacts_history; - - contacts_history=g_hash_table_new_full(g_str_hash, g_str_equal,g_free, NULL); - g_object_set_data(G_OBJECT(w),"history",(gpointer)contacts_history); if (!config_loaded){ title=linphone_gtk_get_ui_config("title","Linphone"); From 57e5d55ab7f0a0024a8118081206a849b075ac7b Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 7 Mar 2013 12:42:22 +0100 Subject: [PATCH 123/281] add serbian translation file update spanish file fix remove contact --- configure.ac | 2 +- gtk/chat.c | 4 +- gtk/friendlist.c | 6 +- po/README | 14 + po/cs.po | 771 ++++++++++--------- po/de.po | 762 ++++++++++--------- po/es.po | 1858 ++++++++++++++++++++++++--------------------- po/fr.po | 849 +++++++++++---------- po/he.po | 773 ++++++++++--------- po/hu.po | 767 ++++++++++--------- po/it.po | 759 ++++++++++--------- po/ja.po | 773 ++++++++++--------- po/nb_NO.po | 761 ++++++++++--------- po/nl.po | 768 ++++++++++--------- po/pl.po | 785 ++++++++++--------- po/pt_BR.po | 766 ++++++++++--------- po/ru.po | 772 ++++++++++--------- po/sr.po | 1877 ++++++++++++++++++++++++++++++++++++++++++++++ po/sv.po | 759 ++++++++++--------- po/zh_CN.po | 760 ++++++++++--------- po/zh_TW.po | 761 ++++++++++--------- 21 files changed, 9150 insertions(+), 6197 deletions(-) create mode 100644 po/README create mode 100644 po/sr.po diff --git a/configure.ac b/configure.ac index 890fcba2d..9cb828e82 100644 --- a/configure.ac +++ b/configure.ac @@ -113,7 +113,7 @@ AC_CONFIG_COMMANDS([libtool-hacking], dnl Add the languages which your application supports here. PKG_PROG_PKG_CONFIG -ALL_LINGUAS="fr it de ja es pl cs nl sv pt_BR hu ru zh_CN nb_NO zh_TW he" +ALL_LINGUAS="fr it de ja es pl cs nl sv pt_BR hu ru zh_CN nb_NO zh_TW he sr" AC_SUBST(ALL_LINGUAS) AC_DEFINE_UNQUOTED(LINPHONE_ALL_LANGS, "$ALL_LINGUAS", [All supported languages]) diff --git a/gtk/chat.c b/gtk/chat.c index 159ddd8bc..c93d9828c 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -36,6 +36,7 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); g_object_set_data(G_OBJECT(w),"from_message",NULL); g_object_set_data(G_OBJECT(w),"cr",NULL); + g_object_set_data(G_OBJECT(friendlist),"from",NULL); gtk_widget_destroy(w); } @@ -369,7 +370,8 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, } else { w=linphone_gtk_init_chatroom(room,linphone_chat_message_get_from(msg)); g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); - g_object_set_data(G_OBJECT(friendlist),"from",(gpointer)linphone_chat_message_get_from(msg)); + char *from=linphone_address_as_string(linphone_chat_message_get_from(msg)); + g_object_set_data(G_OBJECT(friendlist),"from",from); } get_display_name(linphone_chat_message_get_from(msg)); #ifdef HAVE_GTK_OSXs diff --git a/gtk/friendlist.c b/gtk/friendlist.c index 5ce869b46..6ef326610 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -195,7 +195,7 @@ void linphone_gtk_update_chat_picture(){ GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)); GtkWidget *chat_view=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); LinphoneFriend *lf=NULL; - LinphoneAddress *uri=(LinphoneAddress *)g_object_get_data(G_OBJECT(friendlist),"from"); + char *uri=(char *)g_object_get_data(G_OBJECT(friendlist),"from"); store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))); if (gtk_tree_model_get_iter_first(model,&iter)) { do{ @@ -203,7 +203,7 @@ void linphone_gtk_update_chat_picture(){ if(chat_view!=NULL){ if(uri !=NULL) { if(g_strcmp0(linphone_address_as_string(linphone_friend_get_address(lf)), - linphone_address_as_string(uri))==0){ + uri)==0){ gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); } else { gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); @@ -241,7 +241,7 @@ void linphone_gtk_chat_selected(GtkWidget *item){ cr=linphone_gtk_create_chatroom(uri); } page=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); - g_object_set_data(G_OBJECT(friendlist),"from",(gpointer)uri); + g_object_set_data(G_OBJECT(friendlist),"from",linphone_address_as_string(uri)); if(page==NULL){ page=linphone_gtk_init_chatroom(cr,uri); g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)page); diff --git a/po/README b/po/README new file mode 100644 index 000000000..adec33171 --- /dev/null +++ b/po/README @@ -0,0 +1,14 @@ +How to add a translation file +***************************** +To add a translation file in linphone project you should first : + - change the variable ALL_LINGUAS in configure.ac by adding the language (ex: fr) + - then add the file .po in the directory /po + - run ./autogen.sh + +Update the tranlation files +*************************** +To update all the translation files, in the directory /po run the following command + $ make update-po + + + diff --git a/po/cs.po b/po/cs.po index 4f499ac9b..726ba26a4 100644 --- a/po/cs.po +++ b/po/cs.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone-3.4.99.4\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2011-11-04 22:30+0100\n" "Last-Translator: Petr Pisar \n" "Language-Team: Czech \n" @@ -28,21 +28,25 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "–" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "přerušen" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 #, fuzzy msgid "Missed" msgstr "promeškán" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "Odmítnout" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" @@ -50,7 +54,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" @@ -58,29 +62,25 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "–" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "Konference" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "Já" @@ -89,31 +89,31 @@ msgstr "Já" msgid "Couldn't find pixmap file: %s" msgstr "Nelze najít soubor s obrázkem: %s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "Za běhu vypisuje některé ladicí informace na standardní výstup." -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "Soubor, kam zapisovat protokol." -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "Spustí se pouze do systémové oblasti, nezobrazí hlavní okno." -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "Zavolá právě teď na tuto adresu" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "je-li nastaveno, automaticky zvedne příchozí hovor" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -121,12 +121,12 @@ msgstr "" "Zadejte pracovní adresář (měl by být základní instalační adresář, například " "c:\\Program Files\\Linphone)" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" msgstr "Hovor s %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -139,7 +139,7 @@ msgstr "" "do svého adresáře?\n" "Odpovíte-li ne, tato osobo bude dočasně blokována." -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" @@ -148,59 +148,59 @@ msgstr "" "Prosím, zadejte heslo pro uživatele %s\n" "v doméně %s:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 msgid "Call error" msgstr "Chyba hovoru" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Hovor ukončen" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Příchozí hovor" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "Odpovědět" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 msgid "Decline" msgstr "Odmítnout" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 msgid "Call paused" msgstr "Hovor odložen" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "kým: %s" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Porty" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "Odkaz na webovou stránku" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "Lipnhone – internetový videofon" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "%s (Výchozí)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "Byly jsme přepojeni na %s" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -208,177 +208,177 @@ msgstr "" "Na tomto počítači nebyla objevena žádná zvuková karta.\n" "Nebudete moci vytáčet a přijímat a zvukové hovory." -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "Volný SIP videofon" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 #, fuzzy msgid "Add to addressbook" msgstr "Zobrazit adresář" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "Stav" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Jméno" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" msgstr "Volat komu: %s" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 #, fuzzy msgid "Chat" msgstr "Diskuzní skupina" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "Hledat v adresáři %s" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "Neplatný sipový kontakt!" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "Volat komu: %s" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "Poslat text komu: %s" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, c-format msgid "Edit contact '%s'" msgstr "Upravit kontakt „%s“" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "Odstranit kontakt „%s“" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "Přidat nový kontakt z adresáře %s" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "Kmitočet (Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "Stav" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "Min. rychlost (kb/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "Parametry" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Povoleno" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Zakázáno" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "Účet" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "angličtina" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "francouzština" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "švédština" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "italština" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "španělština" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "brazilská portugalština" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "polština" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "němčina" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "ruština" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "japonština" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "dánština" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "maďarština" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "čeština" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "čínština" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "tradiční čínština" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "norština" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Aby se projevil výběr nového jazyka, je nutné znovu spustit linphone." -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "Žádná" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "ZRTP" @@ -423,7 +423,7 @@ msgstr[0] "Nalezen %i kontakt" msgstr[1] "Nalezeny %i kontakty" msgstr[2] "Nalezeno %i kontaktů" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." @@ -431,277 +431,321 @@ msgstr "" "Vítejte!\n" "Tento průvodce vám pomůže používat sipový účet při vašich hovorech." -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 #, fuzzy msgid "Create an account on linphone.org" msgstr "Vytvořit účet vybráním uživatelského jména" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 #, fuzzy msgid "I have already a linphone.org account and I just want to use it" msgstr "Účet již mám a chci jej použít" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 #, fuzzy msgid "I have already a sip account and I just want to use it" msgstr "Účet již mám a chci jej použít" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 msgid "Username:" msgstr "Uživatelské jméno:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" msgstr "Heslo:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 #, fuzzy msgid "Username*" msgstr "Uživatelské jméno" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 #, fuzzy msgid "Password*" msgstr "Heslo" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" msgstr "Uživatelské jméno:" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" msgstr "Heslo:" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "Děkujeme vám. Váš účet je nyní nastaven a připraven k použití." -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "Vítejte v průvodci nastavení účtu" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "Průvodce nastavením účtu" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 #, fuzzy msgid "Configure your account (step 1/1)" msgstr "Nastavit SIP účet" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 #, fuzzy msgid "Error" msgstr "Chyba." -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 #, fuzzy msgid "Terminating" msgstr "Ukončit hovor" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, c-format msgid "Call #%i" msgstr "Hovor č. %i" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "Přepojit hovor č. %i s %s" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 #, fuzzy msgid "Not used" msgstr "Nenalezeno" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "Filtr ICE" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "Přesměrováno" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "Hledá se adresa pomocí STUN…" + +#: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "nedostupná" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "Filtr ICE" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 msgid "Calling..." msgstr "Volá se…" -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "00:00:00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 msgid "Incoming call" msgstr "Příchozí hovor" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "dobrá" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "průměrná" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "slabá" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "velmi slabá" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "příliš špatná" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "nedostupná" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "Probíhá konference" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In call" msgstr "Probíhá hovor" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 msgid "Paused call" msgstr "Odložený hovor" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i:%02i:%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 msgid "Call ended." msgstr "Hovor skončil." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 #, fuzzy msgid "Transfer done." msgstr "Přepojit" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "Přepojit" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "Obnovit" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "Odložit" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +#, fuzzy +msgid "(Paused)" +msgstr "Odložit" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -726,211 +770,151 @@ msgid "label" msgstr "" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "Přepojit" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 msgid "In call" msgstr "Telefonuje se" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 msgid "Duration" msgstr "Délka" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "Hodnocení kvality hovoru" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "V_olby" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 msgid "Enable self-view" msgstr "Zobrazovat sám sebe" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "Nápo_věda" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "Zobrazit ladicí okno" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "_Domovská stránka" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "Vyhledat akt_ualizace" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 #, fuzzy msgid "Account assistant" msgstr "Průvodce nastavením účtu" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 msgid "SIP address or phone number:" msgstr "SIP adresa nebo telefonní číslo:" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "Zahájit nový hovor" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +msgid "Contacts" +msgstr "Kontakty" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Přidat" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Upravit" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "D" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "C" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "9" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "8" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "7" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "B" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "6" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "4" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "A" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "3" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "2" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "1" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "Hledat" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 msgid "Add contacts from directory" msgstr "Přidat kontakty z adresáře" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 msgid "Add contact" msgstr "Přidat kontakt" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "Klávesnice" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 msgid "Recent calls" msgstr "Nedávné hovory" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 msgid "My current identity:" msgstr "Moje současná totožnost:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Uživatelské jméno" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Heslo" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "Připojení k Internetu:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "Přihlašovat mě automaticky" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 msgid "Login information" msgstr "Informace o přihlášení" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 msgid "Welcome !" msgstr "Vítejte!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "všech uživatelích" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 msgid "Online users" msgstr "připojených uživatelích" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "Fiber Channel" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 msgid "Default" msgstr "Výchozí" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1088,6 +1072,10 @@ msgstr "Kodeky zvuku" msgid "Video codecs" msgstr "Kodeky obrazu" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "C" + #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" msgstr "SIP (UDP)" @@ -1125,179 +1113,189 @@ msgid "Media encryption type" msgstr "Druh šifrování médií" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "Obrazový RTP/UDP:" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "Zvukový RTP/UDP:" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 +#, fuzzy +msgid "Media encryption is mandatory" +msgstr "Druh šifrování médií" + +#: ../gtk/parameters.ui.h:23 msgid "Network protocol and ports" msgstr "Síťové protokoly a porty" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" msgstr "Přímé připojení do Internetu" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" msgstr "Za NAT/firewallem (adresu brány zadejte níže)" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "Veřejná IP adresa:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Za NAT/firewallem (adresu určí STUN)" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 #, fuzzy msgid "Behind NAT / Firewall (use ICE)" msgstr "Za NAT/firewallem (adresu určí STUN)" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +#, fuzzy +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "Za NAT/firewallem (adresu určí STUN)" + +#: ../gtk/parameters.ui.h:30 msgid "Stun server:" msgstr "STUN server:" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 msgid "NAT and Firewall" msgstr "NAT a firewall" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 msgid "Network settings" msgstr "Nastavení sítě" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 msgid "Ring sound:" msgstr "Vyzvánění:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "Zvláštní ALSA zařízení (volitelné):" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 msgid "Capture device:" msgstr "Zařízení pro nahrávání:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 msgid "Ring device:" msgstr "Zařízení pro vyzvánění:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 msgid "Playback device:" msgstr "Zařízení pro přehrávání:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "Zapnout potlačení ozvěny" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 msgid "Audio" msgstr "Zvuk" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 msgid "Video input device:" msgstr "Vstupní zařízení obrazu:" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "Upřednostňované rozlišení obrazu:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 msgid "Video" msgstr "Obraz" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "Nastavení multimédií" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "Tento oddíl určuje vaši SIP adresu, když se nepoužívá žádný účet" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "Vaše zobrazované jméno (např. Jan Novák):" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 msgid "Your username:" msgstr "Vaše uživatelské jméno:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 msgid "Your resulting SIP address:" msgstr "Vaše výsledná SIP adresa:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 msgid "Default identity" msgstr "Implicitní totožnost" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Odstranit" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 msgid "Proxy accounts" msgstr "Proxy účty" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "Vymazat všechna hesla" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 msgid "Privacy" msgstr "Soukromí" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "Nastavení SIP účtů" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Povolit" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Zakázat" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 msgid "Codecs" msgstr "Kodeky" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "0 znamená „neomezeno“" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "Omezení odchozí rychlosti (kb/s):" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "Omezení příchozí rychlosti (kb/s):" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "Zapnout přizpůsobující řízení rychlosti" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." @@ -1305,31 +1303,31 @@ msgstr "" "Přizpůsobující se řízení rychlosti je technika dynamického odhadu " "dostupného pásma během hovoru." -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "Využití šířky pásma" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 msgid "Codecs" msgstr "Kodeky" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 msgid "Language" msgstr "Jazyk" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "Zobrazit podrobnější nastavení" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 msgid "Level" msgstr "Úroveň" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 msgid "User interface" msgstr "Uživatelské rozhraní" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 msgid "Done" msgstr "Hotovo" @@ -1397,7 +1395,7 @@ msgstr "" #: ../gtk/call_statistics.ui.h:5 #, fuzzy -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "Druh šifrování médií" #: ../gtk/call_statistics.ui.h:6 @@ -1406,6 +1404,16 @@ msgstr "" #: ../gtk/call_statistics.ui.h:7 #, fuzzy +msgid "Video Media connectivity" +msgstr "Druh šifrování médií" + +#: ../gtk/call_statistics.ui.h:8 +#, fuzzy +msgid "Round trip time" +msgstr "Vlastnosti zvuku" + +#: ../gtk/call_statistics.ui.h:9 +#, fuzzy msgid "Call statistics and information" msgstr "Informace o kontaktu" @@ -1430,19 +1438,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "D" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "9" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "8" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "7" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "B" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "6" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "4" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "A" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "3" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "2" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "přerušen" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "dokončen" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "promeškán" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1457,70 +1525,70 @@ msgstr "" "Stav: %s\n" "Délka: %i min %i s\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "Odchozí hovor" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "Připraven." -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "Vyhledává se umístění čísla…" -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "Toto číslo nelze vyhledat." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "" "Špatně zadaná SIP adresa. Adresa má mít tento formát " -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "Kontaktuji" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 msgid "Could not call" msgstr "Nelze volat" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Je nám líto, ale byl dosažen maximální počet současných hovorů." -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 msgid "is contacting you" msgstr "vás volá" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr " a požaduje automatickou zvednutí." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "Upravují se parametry hovoru…" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Připojeno." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 msgid "Call aborted" msgstr "Hovor přerušen" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 msgid "Could not pause the call" msgstr "Hovor nebylo možné odložit" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." msgstr "Současný hovor se odkládá…" @@ -1620,116 +1688,116 @@ msgstr "" "SIP identita, kterou jste zadali, není platná.\n" "Měla by mít tvar sip:uživatel@proxydoména, například sip:alice@example.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, c-format msgid "Could not login as %s" msgstr "Nelze se přihlásit jako %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 msgid "Remote ringing." msgstr "Vyzvání na druhé straně." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 msgid "Remote ringing..." msgstr "Vyzvání na druhé straně…" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "Časná média." -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, c-format msgid "Call with %s is paused." msgstr "Hovor s %s je odložen." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "Hovor přijat kým: %s – odložen." -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 msgid "Call resumed." msgstr "Hovor obnoven." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, c-format msgid "Call answered by %s." msgstr "Hovor přijat kým: %s." -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 #, fuzzy msgid "We have been resumed." msgstr "Byli jsme obnoveni…" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 #, fuzzy msgid "Call is updated by remote." msgstr "Hovor byl aktualizován protistranou…" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "Hovor ukončen." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "Uživatel je zaneprázdněn." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "Uživatel je dočasně nedostupný." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "Uživatel si nepřeje být rušen." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "Volání odmítnuto." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "Žádná odpověď." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "Chyba protokolu." -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 msgid "Redirected" msgstr "Přesměrováno" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 msgid "Call failed." msgstr "Volání se nezdařilo." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "Registrace na %s byla úspěšná." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, c-format msgid "Unregistration on %s done." msgstr "Odregistrování z %s hotovo." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "odpověď nedorazila včas" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrace na %s selhala: %s" @@ -1739,7 +1807,7 @@ msgstr "Registrace na %s selhala: %s" msgid "Authentication token is %s" msgstr "Klíč k ověření totožnosti je %s" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1747,6 +1815,12 @@ msgstr[0] "Máte %i zmeškaný hovor." msgstr[1] "Máte %i zmeškané hovory." msgstr[2] "Máte %i zmeškaných hovorů." +#~ msgid "by %s" +#~ msgstr "kým: %s" + +#~ msgid "Keypad" +#~ msgstr "Klávesnice" + #~ msgid "Chat with %s" #~ msgstr "Diskuze s %s" @@ -1783,9 +1857,6 @@ msgstr[2] "Máte %i zmeškaných hovorů." #~ msgid "Now ready !" #~ msgstr "Připraveno!" -#~ msgid "Contacts" -#~ msgstr "Kontakty" - #~ msgid "Enable video" #~ msgstr "Zapnout video" @@ -1849,9 +1920,6 @@ msgstr[2] "Máte %i zmeškaných hovorů." #~ msgid "_Linphone" #~ msgstr "_Linphone" -#~ msgid "Ports" -#~ msgstr "Porty" - #~ msgid "Sorry, you have to pause or stop the current call first !" #~ msgstr "Je nám líto, ale nejprve musíte hovor odložit nebo ukončit!" @@ -2436,9 +2504,6 @@ msgstr[2] "Máte %i zmeškaných hovorů." #~ msgid "Listen" #~ msgstr "Test" -#~ msgid "Sound properties" -#~ msgstr "Vlastnosti zvuku" - #~ msgid "Run sip user agent on port:" #~ msgstr "Spustit uživatelského agenta SIP na portu:" diff --git a/po/de.po b/po/de.po index bb68557f4..a4745d95f 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2012-11-07 19:27+0100\n" "Last-Translator: Gerhard Stengel \n" "Language-Team: German \n" @@ -18,32 +18,36 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "nicht verfügbar" + +#: ../gtk/calllogs.c:85 msgid "Aborted" msgstr "Abgebrochen" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 msgid "Missed" msgstr "Entgangen" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 msgid "Declined" msgstr "Abgewiesen" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i Minute" msgstr[1] "%i Minuten" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i Sekunde" msgstr[1] "%i Sekunden" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" @@ -52,22 +56,18 @@ msgstr "" "%s\t%s\tQualität: %s\n" "%s\t%s %s\t" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "nicht verfügbar" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "Konferenz" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "Eigenes Telefon" @@ -76,33 +76,33 @@ msgstr "Eigenes Telefon" msgid "Couldn't find pixmap file: %s" msgstr "Pixmapdatei %s kann nicht gefunden werden." -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "Ausgabe von Debug-Informationen auf stdout während der Laufzeit" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "Pfad zu einer Datei, in die Protokolle geschrieben werden." -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "Linphone mit ausgeschaltetem Video starten." -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "" "Nur im Systemabschnitt der Kontrollleiste starten, aber das Hauptfenster " "nicht zeigen." -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "Im Moment anzurufende Adresse" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "Falls aktiviert, werden eingehende Anrufe automatisch beantwortet" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -110,12 +110,12 @@ msgstr "" "Geben Sie einen Arbeitsordner an (sollte der Installationsordner sein, z. B. " "C:\\Programme\\Linphone)" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" msgstr "Im Gespräch mit %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -128,7 +128,7 @@ msgstr "" "Ihrer Kontaktliste hinzufügen?\n" "Wenn Sie mit Nein antworten, wird diese Person vorläufig blockiert." -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" @@ -137,59 +137,59 @@ msgstr "" "Geben Sie bitte Ihr Passwort für den Benutzernamen %s\n" " auf der Domäne %s ein:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 msgid "Call error" msgstr "Anruf fehlgeschlagen" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Anruf beendet" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Eingehender Anruf" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "Annehmen" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 msgid "Decline" msgstr "Abweisen" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 msgid "Call paused" msgstr "Anruf wird gehalten" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, c-format msgid "by %s" msgstr "von %s" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s schlägt vor, eine Videoübertragung zu starten. Nehmen Sie an?" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "Website-Verknüpfung" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "Linphone - ein Internet-Video-Telefon" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "%s (Vorgabe)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "Vermittlung nach %s" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -197,177 +197,177 @@ msgstr "" "Auf diesem Rechner können keine Soundkarten gefunden werden.\n" "Sie können keine Audio-Anrufe tätigen oder entgegennehmen." -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "Ein freies SIP-Video-Telefon" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 msgid "Add to addressbook" msgstr "Zum Adressbuch hinzufügen" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "Anwesenheitsstatus" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Name" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 msgid "Call" msgstr "Anrufen" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 #, fuzzy msgid "Chat" msgstr "Chat Raum" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "Im %s-Verzeichnis suchen" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "Ungültiger SIP-Kontakt!" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "„%s“ anrufen" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "Text zu „%s“ schicken" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, c-format msgid "Edit contact '%s'" msgstr "Kontakt „%s“ bearbeiten" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "Kontakt „%s“ löschen" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "Einen neuen Kontakt aus dem %s-Verzeichnis hinzufügen" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "Rate (Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "Status" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "Min. Bitrate (kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "Parameter" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Freigegeben" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Gesperrt" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "Konto" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "Englisch" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "Französisch" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "Schwedisch" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "Italienisch" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "Spanisch" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "Brasilianisches Portugiesisch" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "Polnisch" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "Deutsch" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "Russisch" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "Japanisch" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "Niederländisch" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "Ungarisch" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "Tschechisch" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "Chinesisch" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "Traditionelles Chinesisch" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "Norwegisch" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" "Linphone muss neu gestartet werden, damit die neue Spracheinstellung wirksam " "wird." -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "Keinen" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -411,7 +411,7 @@ msgid_plural "Found %i contacts" msgstr[0] "%i Kontakt gefunden" msgstr[1] "%i Kontakte gefunden" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." @@ -420,72 +420,72 @@ msgstr "" "Dieser Assistent wird Ihnen dabei helfen, ein SIP-Konto für Ihre Anrufe zu " "verwenden." -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" msgstr "Ein Konto bei linphone.org erstellen." -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 msgid "I have already a linphone.org account and I just want to use it" msgstr "" "Ich habe bereits ein Konto bei linphone.org und möchte es jetzt benutzen." -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 msgid "I have already a sip account and I just want to use it" msgstr "Ich habe bereits ein SIP-Konto und möchte es jetzt benutzen." -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "Geben Sie Ihren Benutzernamen bei linphone.org ein." -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 msgid "Username:" msgstr "Benutzername:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" msgstr "Passwort:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "Geben Sie Ihre Zugangsdaten ein." -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 msgid "Username*" msgstr "Benutzername*" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 msgid "Password*" msgstr "Passwort*" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "Domäne*" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "Proxy" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "(*) erforderliche Felder" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 msgid "Username: (*)" msgstr "Benutzername: (*)" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 msgid "Password: (*)" msgstr "Passwort: (*)" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "E-Mail: (*)" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "Bestätigen Sie Ihr Passwort: (*)" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." @@ -494,12 +494,12 @@ msgstr "" "verwendet oder der Server ist unerreichbar.\n" "Bitte gehen Sie zurück und versuchen Sie es noch einmal." -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "" "Danke. Ihr Konto ist nun fertig eingerichtet und kann verwendet werden." -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" @@ -509,77 +509,105 @@ msgstr "" "wir Ihnen soeben per E-Mail geschickt haben.\n" "Danach gehen Sie hierher zurück und drücken auf „Vor“." -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "Willkommen zum Konto-Einrichtungsassistenten" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "Konto-Einrichtungsassistent" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" msgstr "Konto einrichten (Schritt 1/1)" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "Geben Sie Ihren SIP-Benutzernamen ein (Schritt 1/1)" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "Geben Sie Ihre Zugangsdaten ein (Schritt 1/2)" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "Bestätigung (Schritt 2/2)" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "Fehler" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" msgstr "Fertigstellen" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, c-format msgid "Call #%i" msgstr "Anruf #%i" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "Vermittlung zum Anruf #%i mit %s" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" msgstr "Nicht verwendet" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "ICE nicht aktiviert" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 msgid "ICE failed" msgstr "ICE fehlgeschlagen" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "ICE läuft" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "Ein oder mehrere NATs werden durchquert" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 msgid "Direct" msgstr "Direkt" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "Über einen Relay-Server" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +#, fuzzy +msgid "uPnP not activated" +msgstr "ICE nicht aktiviert" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "ICE läuft" + +#: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "nicht verfügbar" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "ICE fehlgeschlagen" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" @@ -588,104 +616,121 @@ msgstr "" "Herunterladen: %f\n" "Hochladen: %f (kbit/s)" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, fuzzy, c-format +msgid "%.3f seconds" +msgstr "%i Sekunde" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 msgid "Calling..." msgstr "Verbindungsaufbau..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 msgid "Incoming call" msgstr "Eingehender Anruf" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "gut" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "durchschnittlich" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "schlecht" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "sehr schlecht" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "zu schlecht" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "nicht verfügbar" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "Gesichert durch SRTP" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Gesichert durch ZRTP - [Auth.-Token: %s]" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "Auf „Ungeprüft“ setzen" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "Auf „Geprüft“ setzen" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "In Konferenz" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In call" msgstr "Im Gespräch" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 msgid "Paused call" msgstr "Gehaltener Anruf" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 msgid "Call ended." msgstr "Anruf beendet." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "Vermittlung läuft" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 msgid "Transfer done." msgstr "Vermittlung abgeschlossen." -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 msgid "Transfer failed." msgstr "Vermittlung fehlgeschlagen." -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "Fortsetzen" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "Halten" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +#, fuzzy +msgid "(Paused)" +msgstr "Halten" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -709,210 +754,150 @@ msgid "label" msgstr "" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "Vermittlung" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 msgid "In call" msgstr "Im Gespräch" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 msgid "Duration" msgstr "Dauer" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "Bewertung der Verbindungsqualität" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "_Optionen" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "Video immer starten" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 msgid "Enable self-view" msgstr "Selbstansicht ein" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "_Hilfe" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "Debug-Fenster anzeigen" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "Auf _Aktualisierungen überprüfen" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 msgid "Account assistant" msgstr "Konto-Einrichtungsassistent" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 msgid "SIP address or phone number:" msgstr "SIP-Adresse oder Telefonnummer:" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "Einen neuen Anruf beginnen" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +msgid "Contacts" +msgstr "Kontakte" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Hinzufügen" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Bearbeiten" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "Suchen" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 msgid "Add contacts from directory" msgstr "Kontakte aus einem Verzeichnis hinzufügen" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 msgid "Add contact" msgstr "Kontakt hinzufügen" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "Wähltastatur" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 msgid "Recent calls" msgstr "Letzte Gespräche" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 msgid "My current identity:" msgstr "Aktuelle Identität:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Benutzername" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Passwort" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "Internetverbindung:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "Automatisch anmelden" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 msgid "Login information" msgstr "Anmeldeinformationen" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 msgid "Welcome !" msgstr "Willkommen !" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "Alle Teilnehmer" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 msgid "Online users" msgstr "Angemeldete Teilnehmer" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "Glasfaserkabel" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 msgid "Default" msgstr "Vorgabe" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1073,6 +1058,10 @@ msgstr "Audio-Codecs" msgid "Video codecs" msgstr "Video-Codecs" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "" + #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" msgstr "" @@ -1110,180 +1099,190 @@ msgid "Media encryption type" msgstr "Verschlüsselungstyp der Medien" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "Tunnel" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "DSCP-Felder" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "Fest" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "Tunnel" + #: ../gtk/parameters.ui.h:22 +#, fuzzy +msgid "Media encryption is mandatory" +msgstr "Verschlüsselungstyp der Medien" + +#: ../gtk/parameters.ui.h:23 msgid "Network protocol and ports" msgstr "Netzwerkprotokoll und Ports" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" msgstr "Direkte Verbindung ins Internet" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" msgstr "Hinter NAT / Firewall (IP-Gateway darunter angeben)" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "Öffentliche IP-Adresse:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Hinter NAT / Firewall (STUN verwenden)" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 msgid "Behind NAT / Firewall (use ICE)" msgstr "Hinter NAT / Firewall (ICE verwenden)" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +#, fuzzy +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "Hinter NAT / Firewall (ICE verwenden)" + +#: ../gtk/parameters.ui.h:30 msgid "Stun server:" msgstr "STUN-Server:" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 msgid "NAT and Firewall" msgstr "NAT und Firewall" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 msgid "Network settings" msgstr "Netzwerkeinstellungen" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 msgid "Ring sound:" msgstr "Klingelton:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "Spezielles ALSA-Gerät (optional):" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 msgid "Capture device:" msgstr "Aufnahmegerät:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 msgid "Ring device:" msgstr "Gerät für Klingelton:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 msgid "Playback device:" msgstr "Wiedergabegerät:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "Echounterdrückung ein" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 msgid "Audio" msgstr "Audio" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 msgid "Video input device:" msgstr "Video-Aufnahmegerät:" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "Bevorzugte Video-Auflösung:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 msgid "Video" msgstr "Video" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "Multimedia-Einstellungen" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "" "In diesem Bereich legen Sie Ihre SIP-Adresse fest, wenn Sie kein SIP-Konto " "verwenden." -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "Ihr angezeigter Name (z. B. Heinz Müller):" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 msgid "Your username:" msgstr "Ihr Benutzername:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 msgid "Your resulting SIP address:" msgstr "Sich ergebende SIP-Adresse:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 msgid "Default identity" msgstr "Standard-Identität" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "Assistent" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Entfernen" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 msgid "Proxy accounts" msgstr "Proxy-Konten" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "Alle Passwörter löschen" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 msgid "Privacy" msgstr "Privatsphäre" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "SIP-Konten verwalten" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Freigeben" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Sperren" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "0 bedeutet „unbegrenzt“" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "Upload-Bandbreite (kbit/sec):" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "Download-Bandbreite (kbit/sec):" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "Adaptive Ratenregelung ein" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." @@ -1291,31 +1290,31 @@ msgstr "" "Adaptive Ratenregelung ist eine Technik zur dynamischen Abschätzung der " "zur Verfügung stehenden Bandbreite während eines Anrufs." -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "Bandbreiten-Einstellungen" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 msgid "Language" msgstr "Sprache" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "Fortgeschrittene Einstellungen anzeigen" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 msgid "Level" msgstr "Detaillierung" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 msgid "User interface" msgstr "Benutzeroberfläche" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 msgid "Done" msgstr "Fertig" @@ -1376,7 +1375,8 @@ msgid "Audio IP bandwidth usage" msgstr "Genutzte IP-Bandbreite Audio" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +#, fuzzy +msgid "Audio Media connectivity" msgstr "Medienanbindung" #: ../gtk/call_statistics.ui.h:6 @@ -1384,6 +1384,16 @@ msgid "Video IP bandwidth usage" msgstr "Genutzte IP-Bandbreite Video" #: ../gtk/call_statistics.ui.h:7 +#, fuzzy +msgid "Video Media connectivity" +msgstr "Medienanbindung" + +#: ../gtk/call_statistics.ui.h:8 +#, fuzzy +msgid "Round trip time" +msgstr "Audio Eigenschaften" + +#: ../gtk/call_statistics.ui.h:9 msgid "Call statistics and information" msgstr "Anrufstatistik und -informationen" @@ -1407,19 +1417,79 @@ msgstr "Tunnel einrichten" msgid "Configure http proxy (optional)" msgstr "HTTP-Proxy einrichten (optional)" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "abgebrochen" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "beendet" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "entgangen" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1434,23 +1504,23 @@ msgstr "" "Status: %s\n" "Dauer: %i min %i sec\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "Abgehender Anruf" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "Bereit" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "Telefonnummernziel wird gesucht..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "Diese Nummer kann nicht aufgelöst werden." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1458,47 +1528,47 @@ msgstr "" "SIP-Adresse kann nicht eingelesen werden. Eine SIP-Adresse hat folgenden " "Aufbau " -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "Verbindungsaufbau" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 msgid "Could not call" msgstr "Anruf kann nicht getätigt werden." -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Die maximale Anzahl der gleichzeitigen Anrufe ist erreicht." -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 msgid "is contacting you" msgstr "ruft Sie an" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr " und fragt nach automatischer Antwort." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "Die Anrufparameter werden verändert..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Verbunden." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 msgid "Call aborted" msgstr "Anruf abgebrochen" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 msgid "Could not pause the call" msgstr "Anruf kann nicht gehalten werden" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." msgstr "Aktueller Anruf wird gehalten..." @@ -1599,114 +1669,115 @@ msgstr "" "Sie sollte wie sip:benutzername@proxydomain aussehen, also z.B. sip:" "alice@beispiel.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, c-format msgid "Could not login as %s" msgstr "Anmeldung als %s fehlgeschlagen" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 msgid "Remote ringing." msgstr "Klingeln bei der Gegenseite." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 msgid "Remote ringing..." msgstr "Klingeln bei der Gegenseite..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, c-format msgid "Call with %s is paused." msgstr "Anruf mit %s wird gehalten." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "Der von %s entgegengenommene Anruf wird gehalten." -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 msgid "Call resumed." msgstr "Anruf fortgesetzt." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, c-format msgid "Call answered by %s." msgstr "Anruf wird von %s entgegengenommen." -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +#, fuzzy +msgid "Incompatible, check codecs or security settings..." msgstr "Inkompatibel, überprüfen Sie die Codecs..." -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 msgid "We have been resumed." msgstr "Anruf wird fortgesetzt." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "Anruf wird von der Gegenseite gehalten." -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." msgstr "Anruf ist von der Gegenseite aktualisiert worden." -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "Anruf beendet." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "Teilnehmer ist besetzt." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "Teilnehmer zur Zeit nicht verfügbar." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "Teilnehmer möchte nicht gestört werden." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "Anruf abgewiesen" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "Keine Antwort." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "Protokollfehler" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 msgid "Redirected" msgstr "Umgeleitet" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "Inkompatible Medienparameter." -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 msgid "Call failed." msgstr "Anruf fehlgeschlagen." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "Registrierung auf %s erfolgreich." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, c-format msgid "Unregistration on %s done." msgstr "Abmeldung von %s ist erfolgt." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "Zeitüberschreitung bei der Antwort" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrierung auf %s fehlgeschlagen: %s" @@ -1716,13 +1787,16 @@ msgstr "Registrierung auf %s fehlgeschlagen: %s" msgid "Authentication token is %s" msgstr "Authentifizierungs-Token ist %s" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "Sie haben %i Anruf in Abwesenheit." msgstr[1] "Sie haben %i Anrufe in Abwesenheit." +#~ msgid "Keypad" +#~ msgstr "Wähltastatur" + #~ msgid "Chat with %s" #~ msgstr "Chat mit %s" @@ -1735,9 +1809,6 @@ msgstr[1] "Sie haben %i Anrufe in Abwesenheit." #~ msgid "in" #~ msgstr "in" -#~ msgid "Contacts" -#~ msgstr "Kontakte" - #~ msgid "" #~ "Register to FONICS\n" #~ "virtual network !" @@ -2317,9 +2388,6 @@ msgstr[1] "Sie haben %i Anrufe in Abwesenheit." #~ msgid "Listen" #~ msgstr "Anhören" -#~ msgid "Sound properties" -#~ msgstr "Audio Eigenschaften" - #~ msgid "Run sip user agent on port:" #~ msgstr "Sip \"user agent\" an Port:" diff --git a/po/es.po b/po/es.po index 999a16446..9bdca11b7 100644 --- a/po/es.po +++ b/po/es.po @@ -1,15 +1,14 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Free Software Foundation, Inc. -# FIRST AUTHOR , YEAR. -# -#, fuzzy +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# msgid "" msgstr "" "Project-Id-Version: Linphone 0.9.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" -"PO-Revision-Date: 2002-10-15 HO:MI+ZONE\n" -"Last-Translator: Nelson Benitez \n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"PO-Revision-Date: 2012-12-06 15:54+0100\n" +"Last-Translator: BERAUDO Guillaume \n" "Language-Team: es \n" "Language: \n" "MIME-Version: 1.0\n" @@ -17,100 +16,108 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/calllogs.c:82 -#, fuzzy -msgid "Aborted" -msgstr "Llamada cancelada." +msgid "n/a" +msgstr "n/a" #: ../gtk/calllogs.c:85 -msgid "Missed" -msgstr "" +#, fuzzy +msgid "Aborted" +msgstr "abortada" #: ../gtk/calllogs.c:88 #, fuzzy -msgid "Declined" -msgstr "linea" +msgid "Missed" +msgstr "perdida" -#: ../gtk/calllogs.c:94 -#, c-format -msgid "%i minute" -msgid_plural "%i minutes" -msgstr[0] "" -msgstr[1] "" +#: ../gtk/calllogs.c:91 +#, fuzzy +msgid "Declined" +msgstr "Rechazar" #: ../gtk/calllogs.c:97 #, c-format -msgid "%i second" -msgid_plural "%i seconds" -msgstr[0] "" -msgstr[1] "" +msgid "%i minute" +msgid_plural "%i minutes" +msgstr[0] "%i minuto" +msgstr[1] "%i minutos" #: ../gtk/calllogs.c:100 #, c-format +msgid "%i second" +msgid_plural "%i seconds" +msgstr[0] "%i segundo" +msgstr[1] "%i segundos" + +#: ../gtk/calllogs.c:103 +#, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" +"%s\t%s\tCalidad: %s\n" +"%s\t%s %s\t" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 -#, c-format +#: ../gtk/calllogs.c:108 +#, fuzzy, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" +"%s\t%s\tCalidad: %s\n" +"%s\t%s %s\t" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" -msgstr "" +msgstr "Conferencia" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" -msgstr "" +msgstr "Yo" #: ../gtk/support.c:49 ../gtk/support.c:73 ../gtk/support.c:102 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "No se pudo encontrar el archivo pixmap: %s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "" +"registra a stdout cierta información de depuración durante la ejecución." -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." -msgstr "" +msgstr "ruta a un fichero donde escribir logs." -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." -msgstr "" +msgstr "Iniciar sólo en la barra de tareas, no mostrar la interfaz principal." -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" -msgstr "" +msgstr "dirección a la que llamar inmediatamente" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" -msgstr "" +msgstr "si está activo, responder a llamadas entrantes automáticamente" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" +"Especifique un directorio de trabajo (debería ser la raíz de la instalación, " +"ej: c:\\Archivos de Programa\\Linphone)" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" -msgstr "" +msgstr "Llamar con %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -118,824 +125,834 @@ msgid "" "list ?\n" "If you answer no, this person will be temporarily blacklisted." msgstr "" +"%s desea añadirle a su lista de contactos.\n" +"¿Desea permitirle ver su estado de presencia o añadirle a su lista de " +"contactos?\n" +"Si responde no, esta persona será bloqueada temporalmente." -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" +"Por favor, introduzca la contraseña para el usuario %s\n" +" en el dominio %s:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 #, fuzzy msgid "Call error" -msgstr "Llamada cancelada." +msgstr "Error en la llamada." -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 #, fuzzy msgid "Call ended" -msgstr "Llamada cancelada." +msgstr "Llamada terminada" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" -msgstr "" +msgstr "Llamada entrante" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" -msgstr "" +msgstr "Contestar" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 #, fuzzy msgid "Decline" -msgstr "linea" +msgstr "Rechazar" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, fuzzy msgid "Call paused" -msgstr "Llamada cancelada." +msgstr "Llamada en pausa" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Puertos" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" -msgstr "" +msgstr "Enlace a la Web" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" -msgstr "" +msgstr "Linphone - un video-teléfono a través de Internet" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" -msgstr "" +msgstr "%s (Opción predeterminada)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" -msgstr "" +msgstr "Somos transferidos a %s" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" +"No se ha encontrado una tarjeta de sonido en este equipo.\n" +"No será posible realizar o recibir llamadas de audio." -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" -msgstr "" +msgstr "Un video-teléfono SIP gratuito" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 #, fuzzy msgid "Add to addressbook" -msgstr "Agenda" +msgstr "Añadir a la agenda" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 #, fuzzy msgid "Presence status" -msgstr "Estado" +msgstr "Estado de Presencia" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nombre" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" -msgstr "Llamada cancelada." +msgstr "Llamada" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" -msgstr "" +msgstr "Buscar en el directorio %s" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" -msgstr "" +msgstr "¡Contacto SIP no válido!" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" -msgstr "" +msgstr "Llamar a %s" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" -msgstr "" +msgstr "Enviar mensaje a %s" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, fuzzy, c-format msgid "Edit contact '%s'" -msgstr "(Ninguna informacion de contacto !)" +msgstr "Editar contacto '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" -msgstr "" +msgstr "Eliminar contacto '%s'" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" -msgstr "" +msgstr "Añadir nuevo contacto desde el directorio %s" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" -msgstr "" +msgstr "Frecuencia (Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "Estado" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" -msgstr "" +msgstr "Bitrate mínimo (kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" -msgstr "Parametros" +msgstr "Parámetros" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Activado" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Desactivado" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" -msgstr "" - -#: ../gtk/propertybox.c:759 -msgid "English" -msgstr "" - -#: ../gtk/propertybox.c:760 -msgid "French" -msgstr "" - -#: ../gtk/propertybox.c:761 -msgid "Swedish" -msgstr "" - -#: ../gtk/propertybox.c:762 -msgid "Italian" -msgstr "" - -#: ../gtk/propertybox.c:763 -msgid "Spanish" -msgstr "" +msgstr "Cuenta" #: ../gtk/propertybox.c:764 -msgid "Brazilian Portugese" -msgstr "" +msgid "English" +msgstr "Inglés" #: ../gtk/propertybox.c:765 -msgid "Polish" -msgstr "" +msgid "French" +msgstr "Francés" #: ../gtk/propertybox.c:766 -msgid "German" -msgstr "" +msgid "Swedish" +msgstr "Sueco" #: ../gtk/propertybox.c:767 -msgid "Russian" -msgstr "" +msgid "Italian" +msgstr "Italiano" #: ../gtk/propertybox.c:768 -msgid "Japanese" -msgstr "" +msgid "Spanish" +msgstr "Español" #: ../gtk/propertybox.c:769 -msgid "Dutch" -msgstr "" +msgid "Brazilian Portugese" +msgstr "Portugués de Brasil" #: ../gtk/propertybox.c:770 -msgid "Hungarian" -msgstr "" +msgid "Polish" +msgstr "Polaco" #: ../gtk/propertybox.c:771 -msgid "Czech" -msgstr "" +msgid "German" +msgstr "Alemán" #: ../gtk/propertybox.c:772 -msgid "Chinese" -msgstr "" +msgid "Russian" +msgstr "Ruso" #: ../gtk/propertybox.c:773 -msgid "Traditional Chinese" -msgstr "" +msgid "Japanese" +msgstr "Japonés" #: ../gtk/propertybox.c:774 -msgid "Norwegian" -msgstr "" +msgid "Dutch" +msgstr "Holandés" #: ../gtk/propertybox.c:775 +msgid "Hungarian" +msgstr "Húngaro" + +#: ../gtk/propertybox.c:776 +msgid "Czech" +msgstr "Checo" + +#: ../gtk/propertybox.c:777 +msgid "Chinese" +msgstr "Chino" + +#: ../gtk/propertybox.c:778 +msgid "Traditional Chinese" +msgstr "Chino Tradicional" + +#: ../gtk/propertybox.c:779 +msgid "Norwegian" +msgstr "Noruego" + +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." -msgstr "" +msgstr "Deberá reiniciar linphone para aplicar la nueva selección de lenguaje" -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 #, fuzzy msgid "None" msgstr "Ninguno." -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" -msgstr "" +msgstr "SRTP" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" -msgstr "" +msgstr "ZRTP" #: ../gtk/update.c:80 -#, c-format +#, fuzzy, c-format msgid "" "A more recent version is availalble from %s.\n" "Would you like to open a browser to download it ?" msgstr "" +"Una nueva versión está disponible en %s.\n" +"¿Desea abrir el navegador para descargarla?" #: ../gtk/update.c:91 +#, fuzzy msgid "You are running the lastest version." -msgstr "" +msgstr "La versión instalada es la última." #: ../gtk/buddylookup.c:85 msgid "Firstname, Lastname" -msgstr "" +msgstr "Nombre, Apellidos" #: ../gtk/buddylookup.c:160 msgid "Error communicating with server." -msgstr "" +msgstr "Error al comunicar con el servidor." #: ../gtk/buddylookup.c:164 #, fuzzy msgid "Connecting..." -msgstr "Conexion" +msgstr "Conectando..." #: ../gtk/buddylookup.c:168 #, fuzzy msgid "Connected" -msgstr "Conectado." +msgstr "Conectado" #: ../gtk/buddylookup.c:172 msgid "Receiving data..." -msgstr "" +msgstr "Recibiendo datos..." #: ../gtk/buddylookup.c:180 #, c-format msgid "Found %i contact" msgid_plural "Found %i contacts" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Se encontró %i contacto" +msgstr[1] "Se encontraron %i contactos" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." msgstr "" - -#: ../gtk/setupwizard.c:42 -msgid "Create an account on linphone.org" -msgstr "" +"¡Bienvenido/a !\n" +"Este asistente le ayudará a utilizar una cuenta SIP para sus llamadas." #: ../gtk/setupwizard.c:43 -msgid "I have already a linphone.org account and I just want to use it" -msgstr "" +#, fuzzy +msgid "Create an account on linphone.org" +msgstr "Crear una cuenta eligiendo un nombre de usuario" #: ../gtk/setupwizard.c:44 -msgid "I have already a sip account and I just want to use it" -msgstr "" +#, fuzzy +msgid "I have already a linphone.org account and I just want to use it" +msgstr "Ya tengo una cuenta y quiero utilizarla" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:45 +#, fuzzy +msgid "I have already a sip account and I just want to use it" +msgstr "Ya tengo una cuenta y quiero utilizarla" + +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 #, fuzzy msgid "Username:" -msgstr "Manual de Usuario" +msgstr "Nombre de usuario:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 #, fuzzy msgid "Password:" -msgstr "Tu Contraseña:" +msgstr "Contraseña:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 -#, fuzzy -msgid "Username*" -msgstr "Manual de Usuario" - #: ../gtk/setupwizard.c:121 #, fuzzy -msgid "Password*" -msgstr "Tu Contraseña:" +msgid "Username*" +msgstr "Nombre de usuario" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:122 +#, fuzzy +msgid "Password*" +msgstr "Contraseña:" + +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" -msgstr "Manual de Usuario" +msgstr "Nombre de usuario:" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" -msgstr "Tu Contraseña:" +msgstr "Contraseña:" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." -msgstr "" +msgstr "Gracias. Su cuenta está configurada y lista para su utilización." -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" -msgstr "" +msgstr "Bienvenido al asistente de configuración de cuenta" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" -msgstr "" +msgstr "Asistente de configuración de cuenta" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 +#, fuzzy msgid "Configure your account (step 1/1)" -msgstr "" +msgstr "Configurar una cuenta SIP" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" msgstr "" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, fuzzy, c-format msgid "Call #%i" -msgstr "Llamada cancelada." +msgstr "Llamar a #%i" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" -msgstr "" +msgstr "Transferir a llamada #%i con %s" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 +#, fuzzy msgid "Not used" -msgstr "" +msgstr "No encontrado" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" -msgstr "Llamada cancelada." +msgstr "La llamada ha fallado." -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 +#, fuzzy msgid "Direct" -msgstr "" +msgstr "Redigirida" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "Búsqueda STUN en proceso…" + +#: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "no disponible" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "La llamada ha fallado." + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, fuzzy, c-format +msgid "%.3f seconds" +msgstr "%i segundo" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 #, fuzzy msgid "Calling..." -msgstr "Contactando " +msgstr " Llamando..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" -msgstr "" +msgstr "00::00::00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 #, fuzzy msgid "Incoming call" -msgstr "Contactando " +msgstr "Llamada entrante" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" -msgstr "" +msgstr "buena" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" -msgstr "" +msgstr "media" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" -msgstr "" +msgstr "mala" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" -msgstr "" +msgstr "muy mala" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" -msgstr "" +msgstr "demasiado mala" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" -msgstr "" +msgstr "no disponible" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" -msgstr "" +msgstr "Cifrada con SRTP" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" -msgstr "" +msgstr "Cifrada con ZRTP - [token de autenticación: %s]" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" -msgstr "" +msgstr "Set sin verificar" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" -msgstr "" +msgstr "Set verificado" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" -msgstr "" +msgstr "En conferencia" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 #, fuzzy msgid "In call" -msgstr "Contactando " +msgstr "En llamada " -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 #, fuzzy msgid "Paused call" -msgstr "Contactando " +msgstr "Llamada en pausa" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" -msgstr "" +msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 #, fuzzy msgid "Call ended." -msgstr "Llamada cancelada." +msgstr "Llamada finalizada." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 +#, fuzzy msgid "Transfer done." -msgstr "" +msgstr "Transferir" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." -msgstr "Llamada cancelada." +msgstr "Transferir" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" +msgstr "Reanudar" + +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +msgid "Pause" +msgstr "Pausar" + +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 -msgid "Pause" -msgstr "" +#: ../gtk/incall_view.c:901 +#, fuzzy +msgid "(Paused)" +msgstr "Pausar" #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" -msgstr "" +msgstr "Por favor, introduzca los datos de inicio de sesión para %s" #: ../gtk/main.ui.h:1 #, fuzzy msgid "Callee name" -msgstr "Llamada cancelada." +msgstr "Nombre del destinatario" #: ../gtk/main.ui.h:2 #, fuzzy msgid "Send" -msgstr "Sonido" +msgstr "Enviar" #: ../gtk/main.ui.h:3 +#, fuzzy msgid "End conference" -msgstr "" +msgstr "En conferencia" #: ../gtk/main.ui.h:4 msgid "label" -msgstr "" +msgstr "etiqueta" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" -msgstr "" - -#: ../gtk/main.ui.h:14 -#, fuzzy -msgid "In call" -msgstr "Contactando " +msgstr "Transferir" #: ../gtk/main.ui.h:15 #, fuzzy -msgid "Duration" -msgstr "Informacion" +msgid "In call" +msgstr "En llamada " #: ../gtk/main.ui.h:16 -msgid "Call quality rating" -msgstr "" +#, fuzzy +msgid "Duration" +msgstr "Duración" #: ../gtk/main.ui.h:17 -msgid "_Options" -msgstr "" +msgid "Call quality rating" +msgstr "Calidad de la llamada" #: ../gtk/main.ui.h:18 +msgid "_Options" +msgstr "_Opciones" + +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 #, fuzzy msgid "Enable self-view" -msgstr "Activado" - -#: ../gtk/main.ui.h:20 -msgid "_Help" -msgstr "" +msgstr "Activar vista propia" #: ../gtk/main.ui.h:21 -#, fuzzy -msgid "Show debug window" -msgstr "Linphone esta terminando..." +msgid "_Help" +msgstr "_Ayuda" #: ../gtk/main.ui.h:22 -msgid "_Homepage" -msgstr "" +#, fuzzy +msgid "Show debug window" +msgstr "Mostrar ventana de depuración" #: ../gtk/main.ui.h:23 -msgid "Check _Updates" -msgstr "" +msgid "_Homepage" +msgstr "_Pagina_de_Inicio" #: ../gtk/main.ui.h:24 -msgid "Account assistant" -msgstr "" +msgid "Check _Updates" +msgstr "Buscar_Actualizaciones" #: ../gtk/main.ui.h:25 #, fuzzy -msgid "SIP address or phone number:" -msgstr "La direccion SIP del servidor de registro." +msgid "Account assistant" +msgstr "Asistente de configuración de cuenta" #: ../gtk/main.ui.h:26 -msgid "Initiate a new call" -msgstr "" +#, fuzzy +msgid "SIP address or phone number:" +msgstr "Dirección SIP o número de teléfono" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +msgid "Initiate a new call" +msgstr "Iniciar nueva llamada" + +#: ../gtk/main.ui.h:28 +#, fuzzy +msgid "Contacts" +msgstr "Contactos" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Añadir" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" -msgstr "" - -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" +msgstr "Editar" #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" +msgid "Search" +msgstr "Buscar" #: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" +#, fuzzy +msgid "Add contacts from directory" +msgstr "Añadir contactos desde un directorio" -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "" +#: ../gtk/main.ui.h:33 +#, fuzzy +msgid "Add contact" +msgstr "Añadir contacto" #: ../gtk/main.ui.h:34 -msgid "9" -msgstr "9" +#, fuzzy +msgid "Recent calls" +msgstr "Llamadas recientes " #: ../gtk/main.ui.h:35 -msgid "8" -msgstr "8" +#, fuzzy +msgid "My current identity:" +msgstr "Mi identidad actual:" -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "7" +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#, fuzzy +msgid "Username" +msgstr "Nombre de usuario" -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "" +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#, fuzzy +msgid "Password" +msgstr "Contraseña:" #: ../gtk/main.ui.h:38 -msgid "6" -msgstr "6" +msgid "Internet connection:" +msgstr "Conexión a Internet" #: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" +msgid "Automatically log me in" +msgstr "Iniciar sesión automáticamente" #: ../gtk/main.ui.h:40 -msgid "4" -msgstr "4" +#, fuzzy +msgid "Login information" +msgstr "Datos de inicio de sesión" #: ../gtk/main.ui.h:41 -msgid "A" -msgstr "" +#, fuzzy +msgid "Welcome !" +msgstr "¡Bienvenido/a!" #: ../gtk/main.ui.h:42 -msgid "3" -msgstr "3" +msgid "All users" +msgstr "Todos los usuarios" #: ../gtk/main.ui.h:43 -msgid "2" -msgstr "2" +#, fuzzy +msgid "Online users" +msgstr "Usuarios conectados" #: ../gtk/main.ui.h:44 -msgid "1" -msgstr "1" +msgid "ADSL" +msgstr "ADSL" #: ../gtk/main.ui.h:45 -msgid "Search" -msgstr "" +msgid "Fiber Channel" +msgstr "Canal de Fibra" #: ../gtk/main.ui.h:46 #, fuzzy -msgid "Add contacts from directory" -msgstr "Informacion de codec" +msgid "Default" +msgstr "Predeterminado" #: ../gtk/main.ui.h:47 -#, fuzzy -msgid "Add contact" -msgstr "(Ninguna informacion de contacto !)" - -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 -#, fuzzy -msgid "Recent calls" -msgstr "Contactando " - -#: ../gtk/main.ui.h:50 -#, fuzzy -msgid "My current identity:" -msgstr "Identidad" - -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 -#, fuzzy -msgid "Username" -msgstr "Manual de Usuario" - -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 -#, fuzzy -msgid "Password" -msgstr "Tu Contraseña:" - -#: ../gtk/main.ui.h:53 -msgid "Internet connection:" -msgstr "" - -#: ../gtk/main.ui.h:54 -msgid "Automatically log me in" -msgstr "" - -#: ../gtk/main.ui.h:55 -#, fuzzy -msgid "Login information" -msgstr "Informacion de codec" - -#: ../gtk/main.ui.h:56 -#, fuzzy -msgid "Welcome !" -msgstr "Contactando " - -#: ../gtk/main.ui.h:57 -msgid "All users" -msgstr "" - -#: ../gtk/main.ui.h:58 -#, fuzzy -msgid "Online users" -msgstr "linea" - -#: ../gtk/main.ui.h:59 -msgid "ADSL" -msgstr "" - -#: ../gtk/main.ui.h:60 -msgid "Fiber Channel" -msgstr "" - -#: ../gtk/main.ui.h:61 -#, fuzzy -msgid "Default" -msgstr "Identidad" - -#: ../gtk/main.ui.h:62 msgid "Delete" msgstr "" #: ../gtk/about.ui.h:1 #, fuzzy msgid "About linphone" -msgstr "linphone" +msgstr "Acerca de linphone" #: ../gtk/about.ui.h:2 +#, fuzzy msgid "(C) Belledonne Communications,2010\n" -msgstr "" +msgstr "(C) Belledonne Communications, 2010\n" #: ../gtk/about.ui.h:4 msgid "An internet video phone using the standard SIP (rfc3261) protocol." msgstr "" +"Un vídeo-teléfono a través de Internet que usa el protocolo estándar SIP " +"(rfc3261)" #: ../gtk/about.ui.h:5 msgid "" @@ -951,29 +968,40 @@ msgid "" "cs: Petr Pisar \n" "hu: anonymous\n" msgstr "" +"fr: Simon Morlat\n" +"en: Simon Morlat and Delphine Perreau\n" +"it: Alberto Zanoni \n" +"de: Jean-Jacques Sarton \n" +"sv: Daniel Nylander \n" +"es: Jesus Benitez \n" +"ja: YAMAGUCHI YOSHIYA \n" +"pt_BR: Rafael Caesar Lenzi \n" +"pl: Robert Nasiadek \n" +"cs: Petr Pisar \n" +"hu: anonymous\n" #: ../gtk/contact.ui.h:2 #, fuzzy msgid "SIP Address" -msgstr "Direccion" +msgstr "Dirección SIP" #: ../gtk/contact.ui.h:3 msgid "Show this contact presence status" -msgstr "" +msgstr "Mostrar el estado de presencia de este contacto" #: ../gtk/contact.ui.h:4 msgid "Allow this contact to see my presence status" -msgstr "" +msgstr "Permitir que este contacto vea mi estado de presencia" #: ../gtk/contact.ui.h:5 #, fuzzy msgid "Contact information" -msgstr "Informacion de codec" +msgstr "Información de contacto" #: ../gtk/log.ui.h:1 #, fuzzy msgid "Linphone debug window" -msgstr "Linphone esta terminando..." +msgstr "Ventana de depuración de linphone" #: ../gtk/log.ui.h:2 msgid "Scroll to end" @@ -982,406 +1010,425 @@ msgstr "" #: ../gtk/password.ui.h:1 #, fuzzy msgid "Linphone - Authentication required" -msgstr "Informacion de codec" +msgstr "Linphone - Autenticación necesaria" #: ../gtk/password.ui.h:2 msgid "Please enter the domain password" -msgstr "" +msgstr "Por favor introduzca la contraseña del dominio" #: ../gtk/password.ui.h:3 msgid "UserID" -msgstr "" +msgstr "UserID" #: ../gtk/call_logs.ui.h:1 msgid "Call history" -msgstr "" +msgstr "Registro de llamadas" #: ../gtk/call_logs.ui.h:2 msgid "Clear all" -msgstr "" +msgstr "Borrar todos" #: ../gtk/call_logs.ui.h:3 msgid "Call back" -msgstr "" +msgstr "Devolver llamada" #: ../gtk/sip_account.ui.h:1 msgid "Linphone - Configure a SIP account" -msgstr "" +msgstr "Linphone - Configurar una cuenta SIP" #: ../gtk/sip_account.ui.h:2 #, fuzzy msgid "Your SIP identity:" -msgstr "Identidad" +msgstr "Su identidad SIP" #: ../gtk/sip_account.ui.h:3 msgid "Looks like sip:@" -msgstr "" +msgstr "Del tipo sip:@" #: ../gtk/sip_account.ui.h:4 msgid "sip:" -msgstr "SIP:" +msgstr "sip:" #: ../gtk/sip_account.ui.h:5 #, fuzzy msgid "SIP Proxy address:" -msgstr "Direccion SIP" +msgstr "Dirección del SIP Proxy" #: ../gtk/sip_account.ui.h:6 msgid "Looks like sip:" -msgstr "" +msgstr "Del tipo sip:" #: ../gtk/sip_account.ui.h:7 msgid "Route (optional):" -msgstr "" +msgstr "Ruta (opcional):" #: ../gtk/sip_account.ui.h:8 #, fuzzy msgid "Registration duration (sec):" -msgstr "Se ha registrado con exito." +msgstr "Duración del registro (seg):" #: ../gtk/sip_account.ui.h:9 msgid "Register" -msgstr "" +msgstr "Registrarse" #: ../gtk/sip_account.ui.h:10 #, fuzzy msgid "Publish presence information" -msgstr "Informacion de codec" +msgstr "Publicar información de presencia" #: ../gtk/sip_account.ui.h:11 msgid "Configure a SIP account" -msgstr "" +msgstr "Configurar una cuenta SIP" #: ../gtk/parameters.ui.h:1 msgid "default soundcard" -msgstr "" +msgstr "tarjeta de sonido predeterminada" #: ../gtk/parameters.ui.h:2 msgid "a sound card" -msgstr "" +msgstr "una tarjeta de sonido" #: ../gtk/parameters.ui.h:3 msgid "default camera" -msgstr "" +msgstr "cámara predeterminada" #: ../gtk/parameters.ui.h:4 msgid "CIF" -msgstr "" +msgstr "CIF" #: ../gtk/parameters.ui.h:5 #, fuzzy msgid "Audio codecs" -msgstr "Propiedades del codec de Audio" +msgstr "Códecs de Audio" #: ../gtk/parameters.ui.h:6 #, fuzzy msgid "Video codecs" -msgstr "Propiedades del codec de Audio" +msgstr "Códecs de Vídeo" + +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "C" #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" -msgstr "" +msgstr "SIP (UDP)" #: ../gtk/parameters.ui.h:9 msgid "SIP (TCP)" -msgstr "" +msgstr "SIP (TCP)" #: ../gtk/parameters.ui.h:10 msgid "SIP (TLS)" -msgstr "" +msgstr "SIP (TLS)" #: ../gtk/parameters.ui.h:11 msgid "Settings" -msgstr "" +msgstr "Configuración" #: ../gtk/parameters.ui.h:12 msgid "Set Maximum Transmission Unit:" -msgstr "" +msgstr "Fijar Unidad de Transmisión Máxima:" #: ../gtk/parameters.ui.h:13 msgid "Send DTMFs as SIP info" -msgstr "" +msgstr "Enviar DTMFs como información SIP" #: ../gtk/parameters.ui.h:14 msgid "Use IPv6 instead of IPv4" -msgstr "" +msgstr "Utilizar IPv6 en lugar de IPv4" #: ../gtk/parameters.ui.h:15 #, fuzzy msgid "Transport" -msgstr "Contactando " +msgstr "Transporte " #: ../gtk/parameters.ui.h:16 msgid "Media encryption type" -msgstr "" +msgstr "Tipo de cifrado de medios" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" +msgid "Video RTP/UDP:" +msgstr "Vídeo RTP/UDP" #: ../gtk/parameters.ui.h:18 -msgid "Video RTP/UDP:" -msgstr "" +msgid "Audio RTP/UDP:" +msgstr "Audio RTP/UDP:" #: ../gtk/parameters.ui.h:19 -msgid "Audio RTP/UDP:" -msgstr "" - -#: ../gtk/parameters.ui.h:20 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" -#: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" msgstr "" +#: ../gtk/parameters.ui.h:22 +#, fuzzy +msgid "Media encryption is mandatory" +msgstr "Tipo de cifrado de medios" + #: ../gtk/parameters.ui.h:23 -msgid "Direct connection to the Internet" -msgstr "" +msgid "Network protocol and ports" +msgstr "Protocolo de red y puertos" #: ../gtk/parameters.ui.h:24 -msgid "Behind NAT / Firewall (specify gateway IP below)" -msgstr "" +msgid "Direct connection to the Internet" +msgstr "Conexión directa a Internet" #: ../gtk/parameters.ui.h:25 -#, fuzzy -msgid "Public IP address:" -msgstr "Direccion SIP" +msgid "Behind NAT / Firewall (specify gateway IP below)" +msgstr "Tras un NAT/Firewall (especificar la IP de la puerta de enlace debajo)" #: ../gtk/parameters.ui.h:26 -msgid "Behind NAT / Firewall (use STUN to resolve)" -msgstr "" +#, fuzzy +msgid "Public IP address:" +msgstr "Dirección IP pública:" #: ../gtk/parameters.ui.h:27 -msgid "Behind NAT / Firewall (use ICE)" -msgstr "" +msgid "Behind NAT / Firewall (use STUN to resolve)" +msgstr "Tras un NAT/Firewall (utilizar STUN para resolver)" #: ../gtk/parameters.ui.h:28 #, fuzzy -msgid "Stun server:" -msgstr "Servidor de Redireccionamiento" +msgid "Behind NAT / Firewall (use ICE)" +msgstr "Tras un NAT/Firewall (utilizar STUN para resolver)" #: ../gtk/parameters.ui.h:29 #, fuzzy -msgid "NAT and Firewall" -msgstr "Contactando " +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "Tras un NAT/Firewall (utilizar STUN para resolver)" #: ../gtk/parameters.ui.h:30 #, fuzzy -msgid "Network settings" -msgstr "Red" +msgid "Stun server:" +msgstr "Servidor STUN" #: ../gtk/parameters.ui.h:31 #, fuzzy -msgid "Ring sound:" -msgstr "Fuente de grabacion:" +msgid "NAT and Firewall" +msgstr "NAT y Firewall" #: ../gtk/parameters.ui.h:32 -msgid "ALSA special device (optional):" -msgstr "" +#, fuzzy +msgid "Network settings" +msgstr "Configuración de red" #: ../gtk/parameters.ui.h:33 #, fuzzy -msgid "Capture device:" -msgstr "Usar dispositivo de sonido:" +msgid "Ring sound:" +msgstr "Tono de llamada:" #: ../gtk/parameters.ui.h:34 -#, fuzzy -msgid "Ring device:" -msgstr "Usar dispositivo de sonido:" +msgid "ALSA special device (optional):" +msgstr "Dispositivo especial ALSA (opcional):" #: ../gtk/parameters.ui.h:35 #, fuzzy -msgid "Playback device:" -msgstr "Usar dispositivo de sonido:" +msgid "Capture device:" +msgstr "Dispositivo de captura:" #: ../gtk/parameters.ui.h:36 -msgid "Enable echo cancellation" -msgstr "" +#, fuzzy +msgid "Ring device:" +msgstr "Dispositivo de sonido:" #: ../gtk/parameters.ui.h:37 #, fuzzy -msgid "Audio" -msgstr "Contactando " +msgid "Playback device:" +msgstr "Dispositivo de reproducción:" #: ../gtk/parameters.ui.h:38 -#, fuzzy -msgid "Video input device:" -msgstr "Usar dispositivo de sonido:" +msgid "Enable echo cancellation" +msgstr "Activar cancelación de eco" #: ../gtk/parameters.ui.h:39 -msgid "Prefered video resolution:" -msgstr "" +#, fuzzy +msgid "Audio" +msgstr "Audio" #: ../gtk/parameters.ui.h:40 #, fuzzy -msgid "Video" -msgstr "Contactando " +msgid "Video input device:" +msgstr "Dispositivo de entrada de vídeo:" #: ../gtk/parameters.ui.h:41 -msgid "Multimedia settings" -msgstr "" +msgid "Prefered video resolution:" +msgstr "Resolución de vídeo preferida:" #: ../gtk/parameters.ui.h:42 -msgid "This section defines your SIP address when not using a SIP account" -msgstr "" +#, fuzzy +msgid "Video" +msgstr "Vídeo " #: ../gtk/parameters.ui.h:43 -msgid "Your display name (eg: John Doe):" -msgstr "" +msgid "Multimedia settings" +msgstr "Configuración multimedia" #: ../gtk/parameters.ui.h:44 -#, fuzzy -msgid "Your username:" -msgstr "Manual de Usuario" +msgid "This section defines your SIP address when not using a SIP account" +msgstr "Esta sección define su dirección SIP cuando no utiliza una cuenta SIP" #: ../gtk/parameters.ui.h:45 -#, fuzzy -msgid "Your resulting SIP address:" -msgstr "Tu direccion SIP:" +msgid "Your display name (eg: John Doe):" +msgstr "Su nombre a mostrar (x ej: Pepito Pérez):" #: ../gtk/parameters.ui.h:46 #, fuzzy -msgid "Default identity" -msgstr "Identidad" +msgid "Your username:" +msgstr "Su nombre de usuario:" #: ../gtk/parameters.ui.h:47 +#, fuzzy +msgid "Your resulting SIP address:" +msgstr "Su dirección SIP resultante:" + +#: ../gtk/parameters.ui.h:48 +#, fuzzy +msgid "Default identity" +msgstr "Identidad predeterminada" + +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 -msgid "Remove" -msgstr "Borrar" - -#: ../gtk/parameters.ui.h:51 -#, fuzzy -msgid "Proxy accounts" -msgstr "Contactando " - #: ../gtk/parameters.ui.h:52 -msgid "Erase all passwords" -msgstr "" +msgid "Remove" +msgstr "Eliminar" #: ../gtk/parameters.ui.h:53 #, fuzzy -msgid "Privacy" -msgstr "Contactando " +msgid "Proxy accounts" +msgstr "Cuentas Proxy" #: ../gtk/parameters.ui.h:54 -msgid "Manage SIP Accounts" -msgstr "" +msgid "Erase all passwords" +msgstr "Borrar todas las contraseñas" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 -msgid "Enable" -msgstr "Activado" - -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 -msgid "Disable" -msgstr "Desactivado" - -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:55 #, fuzzy -msgid "Codecs" -msgstr "Contactando " +msgid "Privacy" +msgstr "Privacidad" -#: ../gtk/parameters.ui.h:58 -msgid "0 stands for \"unlimited\"" -msgstr "" +#: ../gtk/parameters.ui.h:56 +msgid "Manage SIP Accounts" +msgstr "Gestionar cuentas SIP" + +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 +msgid "Enable" +msgstr "Activar" + +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 +msgid "Disable" +msgstr "Desactivar" #: ../gtk/parameters.ui.h:59 -msgid "Upload speed limit in Kbit/sec:" -msgstr "" +#, fuzzy +msgid "Codecs" +msgstr "Códecs" #: ../gtk/parameters.ui.h:60 -msgid "Download speed limit in Kbit/sec:" -msgstr "" +msgid "0 stands for \"unlimited\"" +msgstr "0 significa \"ilimitado\"" #: ../gtk/parameters.ui.h:61 -msgid "Enable adaptive rate control" -msgstr "" +msgid "Upload speed limit in Kbit/sec:" +msgstr "Velocidad límite de subida en Kbit/seg" #: ../gtk/parameters.ui.h:62 +msgid "Download speed limit in Kbit/sec:" +msgstr "Velocidad límite de descarga en Kbit/seg:" + +#: ../gtk/parameters.ui.h:63 +msgid "Enable adaptive rate control" +msgstr "Activar control de frecuencia adaptativo" + +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" - -#: ../gtk/parameters.ui.h:63 -msgid "Bandwidth control" -msgstr "" - -#: ../gtk/parameters.ui.h:64 -#, fuzzy -msgid "Codecs" -msgstr "Codecs" +"Control de frecuencia adaptativo es una técnica que estima dinámicamente " +"el ancho de banda disponible durante la llamada." #: ../gtk/parameters.ui.h:65 -#, fuzzy -msgid "Language" -msgstr "Contactando " +msgid "Bandwidth control" +msgstr "Control de ancho de banda" #: ../gtk/parameters.ui.h:66 -msgid "Show advanced settings" -msgstr "" +#, fuzzy +msgid "Codecs" +msgstr "Códecs" #: ../gtk/parameters.ui.h:67 #, fuzzy -msgid "Level" -msgstr "Contactando " +msgid "Language" +msgstr "Idioma" #: ../gtk/parameters.ui.h:68 -#, fuzzy -msgid "User interface" -msgstr "Manual de Usuario" +msgid "Show advanced settings" +msgstr "Mostrar opciones avanzadas" #: ../gtk/parameters.ui.h:69 #, fuzzy +msgid "Level" +msgstr "Nivel" + +#: ../gtk/parameters.ui.h:70 +#, fuzzy +msgid "User interface" +msgstr "Interfaz de Usuario" + +#: ../gtk/parameters.ui.h:71 +#, fuzzy msgid "Done" -msgstr "Ninguno." +msgstr "Hecho" #: ../gtk/buddylookup.ui.h:1 #, fuzzy msgid "Search contacts in directory" -msgstr "Informacion de codec" +msgstr "Buscar contactos en directorio" #: ../gtk/buddylookup.ui.h:2 msgid "Add to my list" -msgstr "" +msgstr "Añadir a mi lista" #: ../gtk/buddylookup.ui.h:3 #, fuzzy msgid "Search somebody" -msgstr "Contactando " +msgstr "Buscar a alguien" #: ../gtk/waiting.ui.h:1 #, fuzzy msgid "Linphone" -msgstr "linphone" +msgstr "Linphone" #: ../gtk/waiting.ui.h:2 msgid "Please wait" -msgstr "" +msgstr "Espere por favor" #: ../gtk/dscp_settings.ui.h:1 #, fuzzy msgid "Dscp settings" -msgstr "Red" +msgstr "Configuración" #: ../gtk/dscp_settings.ui.h:2 msgid "SIP" msgstr "SIP" #: ../gtk/dscp_settings.ui.h:3 +#, fuzzy msgid "Audio RTP stream" -msgstr "" +msgstr "Audio RTP/UDP:" #: ../gtk/dscp_settings.ui.h:4 +#, fuzzy msgid "Video RTP stream" -msgstr "" +msgstr "Vídeo RTP/UDP" #: ../gtk/dscp_settings.ui.h:5 msgid "Set DSCP values (in hexadecimal)" @@ -1394,19 +1441,19 @@ msgstr "" #: ../gtk/call_statistics.ui.h:2 #, fuzzy msgid "Audio codec" -msgstr "Propiedades del codec de Audio" +msgstr "Códecs de Audio" #: ../gtk/call_statistics.ui.h:3 #, fuzzy msgid "Video codec" -msgstr "Propiedades del codec de Audio" +msgstr "Códecs de Vídeo" #: ../gtk/call_statistics.ui.h:4 msgid "Audio IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "" #: ../gtk/call_statistics.ui.h:6 @@ -1414,13 +1461,23 @@ msgid "Video IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +#, fuzzy +msgid "Round trip time" +msgstr "Propiedades de sonido" + +#: ../gtk/call_statistics.ui.h:9 #, fuzzy msgid "Call statistics and information" -msgstr "Informacion de codec" +msgstr "Información de contacto" #: ../gtk/tunnel_config.ui.h:1 +#, fuzzy msgid "Configure VoIP tunnel" -msgstr "" +msgstr "Configurar una cuenta SIP" #: ../gtk/tunnel_config.ui.h:2 msgid "Host" @@ -1438,19 +1495,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 -msgid "aborted" -msgstr "" +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "D" -#: ../coreapi/linphonecore.c:235 +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "9" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "8" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "7" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "B" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "6" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "4" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "A" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "3" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "2" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 +msgid "aborted" +msgstr "abortada" + +#: ../coreapi/linphonecore.c:230 msgid "completed" -msgstr "" +msgstr "completada" + +#: ../coreapi/linphonecore.c:233 +msgid "missed" +msgstr "perdida" #: ../coreapi/linphonecore.c:238 -msgid "missed" -msgstr "" - -#: ../coreapi/linphonecore.c:243 #, c-format msgid "" "%s at %s\n" @@ -1459,79 +1576,85 @@ msgid "" "Status: %s\n" "Duration: %i mn %i sec\n" msgstr "" +"%s en %s\n" +"De: %s\n" +"Para: %s\n" +"Estado: %s\n" +"Duración: %i min %i seg\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" -msgstr "" +msgstr "Llamada saliente" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 #, fuzzy msgid "Ready" -msgstr "Preparado." +msgstr "Preparado" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." -msgstr "" +msgstr "Buscando el número de teléfono del destinatario…" -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." -msgstr "" +msgstr "No se ha podido resolver este número." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 #, fuzzy msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "" -"Direccion SIP mal escrita. Una direccion SIP es " +"Dirección SIP mal escrita. Una dirección SIP es del tipo " -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 #, fuzzy msgid "Contacting" -msgstr "Contactando " +msgstr "Contactando" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 #, fuzzy msgid "Could not call" -msgstr "No se pudo encontrar el archivo pixmap: %s" +msgstr "No se pudo llamar" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" -msgstr "" +msgstr "Disculpe, se ha alcanzado el máximo número de llamadas simultáneas" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 #, fuzzy msgid "is contacting you" -msgstr "le esta llamando." +msgstr "le está llamando" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." -msgstr "" +msgstr "y ha solicitado auto respuesta." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." -msgstr "" +msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." -msgstr "" +msgstr "Modificando parámetros de llamada…" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 #, fuzzy msgid "Call aborted" -msgstr "Llamada cancelada." +msgstr "Llamada abortada" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 msgid "Could not pause the call" -msgstr "" +msgstr "No se pudo pausar la llamada" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." -msgstr "" +msgstr "Pausando la llamada actual..." #: ../coreapi/misc.c:148 msgid "" @@ -1540,8 +1663,8 @@ msgid "" "is missing and linphone needs it. Please execute\n" "'modprobe snd-pcm-oss' as root to load it." msgstr "" -"Tu ordenador parece estar usando los controladores de ALSA.\n" -"Esa es la mejor eleccion. Sin embargo el modulo de emulacion pcm de OSS\n" +"Tu ordenador parece estar usando los controladores de sonido de ALSA.\n" +"Ésta es la mejor elección. Sin embargo, el módulo de emulación pcm de OSS\n" "no se encuentra y linphone lo necesita. Por favor ejecute\n" "'modprobe snd-pcm-oss' como root para cargarlo." @@ -1552,14 +1675,14 @@ msgid "" "is missing and linphone needs it. Please execute\n" " 'modprobe snd-mixer-oss' as root to load it." msgstr "" -"Tu ordenador parece estar usando los controladores de ALSA.\n" -"Esa es la mejor eleccion. Sin embargo el modulo de emulacion mixer de OSS\n" +"Tu ordenador parece estar usando los controladores de sonido de ALSA.\n" +"Ésta es la mejor elección. Sin embargo, el módulo de emulación mixer de OSS\n" "no se encuentra y linphone lo necesita. Por favor ejecute\n" " 'modprobe snd-mixer-oss' como root para cargarlo." #: ../coreapi/misc.c:496 msgid "Stun lookup in progress..." -msgstr "" +msgstr "Búsqueda STUN en proceso…" #: ../coreapi/misc.c:630 msgid "ICE local candidates gathering in progress..." @@ -1568,15 +1691,15 @@ msgstr "" #: ../coreapi/friend.c:33 #, fuzzy msgid "Online" -msgstr "linea" +msgstr "Conectado" #: ../coreapi/friend.c:36 msgid "Busy" -msgstr "" +msgstr "Ocupado" #: ../coreapi/friend.c:39 msgid "Be right back" -msgstr "" +msgstr "Vuelvo enseguida" #: ../coreapi/friend.c:42 msgid "Away" @@ -1585,11 +1708,11 @@ msgstr "Ausente" #: ../coreapi/friend.c:45 #, fuzzy msgid "On the phone" -msgstr "linphone" +msgstr "Al teléfono" #: ../coreapi/friend.c:48 msgid "Out to lunch" -msgstr "" +msgstr "A comer" #: ../coreapi/friend.c:51 msgid "Do not disturb" @@ -1598,309 +1721,371 @@ msgstr "No molestar" #: ../coreapi/friend.c:54 #, fuzzy msgid "Moved" -msgstr "Codecs" +msgstr "Fuera" #: ../coreapi/friend.c:57 msgid "Using another messaging service" -msgstr "" +msgstr "Utilizando otro servicio de mensajería" #: ../coreapi/friend.c:60 #, fuzzy msgid "Offline" -msgstr "linea" +msgstr "Desconectado" #: ../coreapi/friend.c:63 msgid "Pending" -msgstr "" +msgstr "Pendiente" #: ../coreapi/friend.c:66 msgid "Unknown-bug" -msgstr "" +msgstr "Bug-desconocido" #: ../coreapi/proxy.c:204 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "" +"La dirección del Proxy SIP que ha introducido no es válida, debe empezar con " +"\"sip:\" seguido del hostname." #: ../coreapi/proxy.c:210 msgid "" "The sip identity you entered is invalid.\n" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" +"La identidad SIP que ha introducido no es válida.\n" +"Debe ser del tipo sip:username@proxydomain, como por ejemplo sip:" +"alice@example.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, fuzzy, c-format msgid "Could not login as %s" -msgstr "No se pudo encontrar el archivo pixmap: %s" +msgstr "No se pudo iniciar sesión como %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 #, fuzzy msgid "Remote ringing." -msgstr "Registrando..." +msgstr "El destinatario está sonando..." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 #, fuzzy msgid "Remote ringing..." -msgstr "Registrando..." +msgstr "El destinatario está sonando..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." -msgstr "" - -#: ../coreapi/callbacks.c:352 -#, c-format -msgid "Call with %s is paused." -msgstr "" +msgstr "Medios iniciales." #: ../coreapi/callbacks.c:365 #, c-format -msgid "Call answered by %s - on hold." -msgstr "" +msgid "Call with %s is paused." +msgstr "La llamada con %s está puesta en pausa." -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:378 +#, c-format +msgid "Call answered by %s - on hold." +msgstr "Llamada respondida por %s - en espera." + +#: ../coreapi/callbacks.c:389 #, fuzzy msgid "Call resumed." -msgstr "Llamada cancelada." +msgstr "Llamada reanudada." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, fuzzy, c-format msgid "Call answered by %s." -msgstr "" -"Llamar o\n" -"Responder" +msgstr "Llamada respondida por %s." -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 +#, fuzzy msgid "We have been resumed." -msgstr "" +msgstr "Nos han reanudado..." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 +#, fuzzy msgid "Call is updated by remote." -msgstr "" +msgstr "La llamada ha sido actualizada por el destinatario..." -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 #, fuzzy msgid "Call terminated." -msgstr "Llamada cancelada." +msgstr "Llamada finalizada." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." -msgstr "El usuario esta ocupado." +msgstr "El usuario está ocupado." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." -msgstr "El usuario le dice que volvera enseguida." +msgstr "El usuario no está disponible temporalmente." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." -msgstr "El usuario no quiere que lo molesten." +msgstr "El usuario no quiere que le molesten." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." -msgstr "Llamada cancelada." +msgstr "Llamada rechazada." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." -msgstr "" +msgstr "No hay respuesta." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." -msgstr "" +msgstr "Error de protocolo." -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 msgid "Redirected" -msgstr "" +msgstr "Redigirida" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 #, fuzzy msgid "Call failed." -msgstr "Llamada cancelada." +msgstr "La llamada ha fallado." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, fuzzy, c-format msgid "Registration on %s successful." -msgstr "Se ha registrado con exito." +msgstr "Se ha registrado con éxito en %s." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, fuzzy, c-format msgid "Unregistration on %s done." -msgstr "Se ha registrado con exito." +msgstr "Cancelación de registro en %s completada." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" -msgstr "" +msgstr "timeout sin respuesta" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, fuzzy, c-format msgid "Registration on %s failed: %s" -msgstr "Se ha registrado con exito." +msgstr "El registro en %s ha fallado." #: ../coreapi/linphonecall.c:129 #, fuzzy, c-format msgid "Authentication token is %s" -msgstr "Informacion de codec" +msgstr "El tóken de autenticación es%s" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Tiene %i llamada perdida." +msgstr[1] "Tiene %i llamadas perdidas." + +#~ msgid "Chat with %s" +#~ msgstr "Conversación con %s" + +#~ msgid "by %s" +#~ msgstr "por %s" + +#~ msgid "Please choose a username:" +#~ msgstr "Por favor, elija un nombre de usuario" + +#~ msgid "Checking if '%s' is available..." +#~ msgstr "Comprobando si '%s' está disponible..." + +#~ msgid "Please wait..." +#~ msgstr "Espere por favor..." + +#~ msgid "Sorry this username already exists. Please try a new one." +#~ msgstr "" +#~ "El nombre de usuario elegido ya existe. Por favor, intente con uno nuevo." + +#~ msgid "Ok !" +#~ msgstr "¡Ok!" + +#~ msgid "Communication problem, please try again later." +#~ msgstr "" +#~ "Error en la comunicación, por favor inténtelo de nuevo más adelante." + +#~ msgid "Choosing a username" +#~ msgstr "Eligiendo un nombre de usuario" + +#~ msgid "Verifying" +#~ msgstr "Verificando" #, fuzzy #~ msgid "Confirmation" -#~ msgstr "Informacion" +#~ msgstr "Confirmación" -#, fuzzy -#~ msgid "Contacts" -#~ msgstr "Contactando " +#~ msgid "Creating your account" +#~ msgstr "Creando su cuenta" + +#~ msgid "Now ready !" +#~ msgstr "¡Ya está listo!" #, fuzzy #~ msgid "Enable video" -#~ msgstr "Activado" +#~ msgstr "Activar vídeo" + +#~ msgid "Enter username, phone number, or full sip address" +#~ msgstr "Introducir nombre de usuario, teléfono o dirección SIP" + +#~ msgid "Keypad" +#~ msgstr "Teclado Numérico" + +#~ msgid "Lookup:" +#~ msgstr "Búsqueda:" + +#~ msgid "in" +#~ msgstr "en" + +#~ msgid "" +#~ "Register to FONICS\n" +#~ "virtual network !" +#~ msgstr "" +#~ "¡Registrar en la red\n" +#~ "virtual FONICS!" + +#~ msgid "We are being paused..." +#~ msgstr "Nos están poniendo en pausa..." + +#~ msgid "No common codecs" +#~ msgstr "No hay códecs comunes" #, fuzzy #~ msgid "Authentication failure" -#~ msgstr "Informacion de codec" +#~ msgstr "Error de autenticación" #, fuzzy #~ msgid "Contact list" -#~ msgstr "Contactando " +#~ msgstr "Lista de contactos " #, fuzzy #~ msgid "Audio & video" -#~ msgstr "Propiedades del codec de Audio" +#~ msgstr "Audio & Vídeo" #, fuzzy #~ msgid "Audio only" -#~ msgstr "Propiedades del codec de Audio" +#~ msgstr "Sólo audio" #, fuzzy #~ msgid "Duration:" -#~ msgstr "Informacion" +#~ msgstr "Duración:" #, fuzzy #~ msgid "_Linphone" -#~ msgstr "linphone" +#~ msgstr "_Linphone" #, fuzzy #~ msgid "gtk-cancel" -#~ msgstr "Conectado." +#~ msgstr "gtk-cancelar" #, fuzzy #~ msgid "gtk-ok" -#~ msgstr "Borrar" +#~ msgstr "gtk-ok" #, fuzzy #~ msgid "gtk-close" -#~ msgstr "Conectado." - -#, fuzzy -#~ msgid "Ports" -#~ msgstr "Contactando " +#~ msgstr "gtk-cerrar." #, fuzzy #~ msgid "_Modes" -#~ msgstr "Codecs" +#~ msgstr "_Modos" #, fuzzy #~ msgid "" #~ "Audio codecs\n" #~ "Video codecs" -#~ msgstr "Propiedades del codec de Audio" +#~ msgstr "" +#~ "Códecs de audio\n" +#~ "Códecs de vídeo" #, fuzzy #~ msgid "Request Cancelled." -#~ msgstr "Llamada cancelada." +#~ msgstr "Petición cancelada." #~ msgid "User cannot be found at given address." -#~ msgstr "No se encontro ningun usuario en la direccion indicada." +#~ msgstr "No se encontró ningún usuario en la dirección indicada." #~ msgid "Remote user cannot support any of proposed codecs." -#~ msgstr "El usuario remoto no soporta ninguno de los codecs propuestos." +#~ msgstr "El usuario remoto no soporta ninguno de los códecs propuestos." #~ msgid "Timeout." #~ msgstr "Tiempo agotado." #~ msgid "Remote host was found but refused connection." -#~ msgstr "Se encontro host remoto pero rechazo la conexion." +#~ msgstr "Se encontró el host remoto pero rechazó la conexión." #~ msgid "" #~ "User is not reachable at the moment but he invites you\n" #~ "to contact him using the following alternate resource:" #~ msgstr "" -#~ "Usuario no disponible en este momento pero le invita\n" +#~ "El usuario no está disponible en este momento pero le invita\n" #~ "a contactarle usando el siguiente recurso alternativo:" #, fuzzy #~ msgid "Gone" -#~ msgstr "Ninguno." +#~ msgstr "Ausente" #, fuzzy #~ msgid "SIP address" -#~ msgstr "Direccion" +#~ msgstr "Dirección SIP" #, fuzzy #~ msgid "Display filters" -#~ msgstr "Nombre a mostrar:" +#~ msgstr "Filtros a mostrar" #, fuzzy #~ msgid "_Properties" -#~ msgstr "Propiedades de RTP" +#~ msgstr "_Propiedades" #, fuzzy #~ msgid "Proxy in use" -#~ msgstr "Servidor Proxy" +#~ msgstr "Proxy en uso" #~ msgid "Sound" #~ msgstr "Sonido" #, fuzzy #~ msgid "Proxy accounts" -#~ msgstr "Servidor Proxy" +#~ msgstr "Cuentas Proxy" #~ msgid "Address book" #~ msgstr "Agenda" #, fuzzy #~ msgid "Shows the address book" -#~ msgstr "Muestra la Agenda" +#~ msgstr "Muestra la agenda" #~ msgid "Show more..." -#~ msgstr "Mostrar mas..." +#~ msgstr "Mostrar más..." #~ msgid "Playback level:" -#~ msgstr "Nivel de reproduccion:" +#~ msgstr "Nivel de reproducción:" #~ msgid "Recording level:" -#~ msgstr "Nivel de Grabacion:" +#~ msgstr "Nivel de Grabación:" #, fuzzy #~ msgid "Ring level:" -#~ msgstr "Nivel de Grabacion:" +#~ msgstr "Nivel de tono de llamada:" #~ msgid "Reachable" #~ msgstr "Disponible" #~ msgid "Busy, I'll be back in " -#~ msgstr "Ocupado, estare de vuelta en " +#~ msgstr "Ocupado, estaré de vuelta en " #~ msgid "The other party will be informed that you'll be back in X minutes" #~ msgstr "" -#~ "Se le comunicara a la otra persona que estaras de vuelta en X minutos" +#~ "Se le comunicará a la otra persona que estará de vuelta en X minutos" #~ msgid "mn" #~ msgstr "min" @@ -1915,10 +2100,10 @@ msgstr[1] "" #~ msgstr "URL:" #~ msgid "Presence" -#~ msgstr "Estado" +#~ msgstr "Presencia" #~ msgid "Press digits to send DTMFs." -#~ msgstr "Pulsa los digitos para mandar DTMFs." +#~ msgstr "Pulsa los dígitos para mandar DTMFs." #~ msgid "DTMF" #~ msgstr "DTMF" @@ -1927,20 +2112,20 @@ msgstr[1] "" #~ "Linphone is a web-phone.\n" #~ "It is compatible with SIP and RTP protocols." #~ msgstr "" -#~ "Linphone es un telefono para Internet.\n" +#~ "Linphone es un teléfono web.\n" #~ "Es compatible con los protocolos SIP y RTP." #, fuzzy #~ msgid "Use IPv6 network (if available)" -#~ msgstr "El usuario le dice que volvera enseguida." +#~ msgstr "Utilizar red IPv6 (si está disponible)" #, fuzzy #~ msgid "" #~ "These options is only for users in a private network, behind a gateway. " #~ "If you are not in this situation, then leave this empty." #~ msgstr "" -#~ "Esta opcion es solo para usuarios en una red privada, detras de un " -#~ "cortafuegos. Siese no es tu caso, deja esto vacio." +#~ "Esta opción es sólo para usuarios de una red privada, tras una puerta de " +#~ "enlace.Si no es su caso, deje esto vacío." #, fuzzy #~ msgid "NAT traversal options (experimental)" @@ -1948,22 +2133,19 @@ msgstr[1] "" #, fuzzy #~ msgid "Number of buffered miliseconds (jitter compensation):" -#~ msgstr "Numero de milisegundos en el buffer(compensacion jitter):" +#~ msgstr "Número de milisegundos en el buffer (compensación jitter):" #~ msgid "RTP port used for audio:" #~ msgstr "Puerto RTP usado para audio:" #~ msgid "micro" -#~ msgstr "microfono" +#~ msgstr "micrófono" #~ msgid "Recording source:" -#~ msgstr "Fuente de grabacion:" - -#~ msgid "Sound properties" -#~ msgstr "Propiedades de sonido" +#~ msgstr "Fuente de grabación:" #~ msgid "Run sip user agent on port:" -#~ msgstr "Ejecutar SIP user agent en el puerto:" +#~ msgstr "Ejecutar el agente de usuario SIP en el puerto:" #~ msgid "It is strongly recommended to use port 5060." #~ msgstr "Se recomienda encarecidamente usar el puerto 5060." @@ -1979,27 +2161,27 @@ msgstr[1] "" #, fuzzy #~ msgid "Add proxy/registrar" -#~ msgstr "Usar el registro SIP" +#~ msgstr "Añadir proxy/registrador" #~ msgid "Remote services" -#~ msgstr "Servicios Remotos:" +#~ msgstr "Servicios remotos" #~ msgid "List of audio codecs, in order of preference:" -#~ msgstr "Lista de codecs de audio, en orden de preferencia:" +#~ msgstr "Lista de códecs de audio, en orden de preferencia:" #~ msgid "" -#~ "Note: Codecs in red are not usable regarding to your connection type to " +#~ "Note: Codecs in red are not usable according to your connection type to " #~ "the internet." #~ msgstr "" -#~ "Nota: Los codecs en ROJO no son adecuados para tu conexion a internet." +#~ "Nota: Los códecs en ROJO no son adecuados para su conexión a Internet." #, fuzzy -#~ msgid "No information availlable" -#~ msgstr "Informacion no disponible" +#~ msgid "No information available" +#~ msgstr "Información no disponible" #, fuzzy #~ msgid "Codec information" -#~ msgstr "Informacion de codec" +#~ msgstr "Información de códec" #~ msgid "Address Book" #~ msgstr "Agenda" @@ -2009,45 +2191,46 @@ msgstr[1] "" #~ msgid "" #~ "User is not reachable at the moment but he invites you to contact him " -#~ "using the following alternate ressource:" +#~ "using the following alternate resource:" #~ msgstr "" -#~ "Usuario no disponible en este momento pero le invita a contactarle usando " -#~ "el siguiente recurso alternativo:" +#~ "El usuario no está disponible en este momento pero le invita a " +#~ "contactarle usando el siguiente recurso alternativo:" #~ msgid "None." #~ msgstr "Ninguno." #, fuzzy #~ msgid "Name:" -#~ msgstr "Nombre" +#~ msgstr "Nombre:" #, fuzzy #~ msgid "Bad sip address: a sip address looks like sip:user@domain" #~ msgstr "" -#~ "Direccion SIP mal escrita. Una direccion SIP es " +#~ "Dirección SIP mal escrita. Una dirección SIP es del tipo " #~ msgid "Communication ended." -#~ msgstr "Comunicacion finalizada." +#~ msgstr "Comunicación finalizada." #, fuzzy #~ msgid "Firewall 's external ip address (in dot notations):" -#~ msgstr "Direccion IP del cortafuegos (en notacion con puntos):" +#~ msgstr "Dirección IP del cortafuegos (en notación con puntos):" #~ msgid "Index" -#~ msgstr "Indice" +#~ msgstr "Índice" #, fuzzy #~ msgid "Server address" -#~ msgstr "Direccion del Servidor:" +#~ msgstr "Dirección del Servidor:" #~ msgid "28k modem" -#~ msgstr "modem 28k" +#~ msgstr "módem 28k" #~ msgid "56k modem" -#~ msgstr "modem 56k" +#~ msgstr "módem 56k" #~ msgid "64k modem (numeris)" -#~ msgstr "modem 64k (numeris)" +#~ msgstr "módem 64k (numeris)" #~ msgid "ADSL or Cable modem" #~ msgstr "ADSL o Cable" @@ -2056,18 +2239,18 @@ msgstr[1] "" #~ msgstr "Ethernet o equivalente" #~ msgid "Connection type:" -#~ msgstr "Tipo de conexion:" +#~ msgstr "Tipo de conexión:" #, fuzzy #~ msgid "" #~ "Linphone could not open audio device %s. Check if your sound card is " #~ "fully configured and working." #~ msgstr "" -#~ "Linphone no pudo abrir el dispositivo de audio. Asegurese que su tarjeta " -#~ "de sonido esta completamente configurada y operativa." +#~ "Linphone no pudo abrir el dispositivo de audio %s. Compruebe que su " +#~ "tarjeta de sonido está completamente configurada y operativa." #~ msgid "Type here the sip address of the person you want to call." -#~ msgstr "Escribe aqui la direccion SIP de la persona que quieres llamar." +#~ msgstr "Escriba aquí la dirección SIP del destinatario." #~ msgid "" #~ "Release or\n" @@ -2081,13 +2264,13 @@ msgstr[1] "" #, fuzzy #~ msgid "Timeout..." -#~ msgstr "Tiempo agotado." +#~ msgstr "Tiempo agotado..." #~ msgid "Toggle this if you want to be registered on a remote server." -#~ msgstr "Marcar opcion si desea registrarse en un servidor remoto." +#~ msgstr "Marque esta opción si desea registrarse en un servidor remoto." #~ msgid "Address of record:" -#~ msgstr "Nombre de registro:" +#~ msgstr "Dirección de registro:" #~ msgid "" #~ "The password used for registration. On some servers it is not necessary" @@ -2096,10 +2279,10 @@ msgstr[1] "" #~ "necesaria" #~ msgid "Use this registrar server as outbound proxy." -#~ msgstr "Usar el servidor de registro como outbound proxy." +#~ msgstr "Usar este servidor de registro como proxy de salida." #~ msgid "sip address:" -#~ msgstr "Direccion SIP:" +#~ msgstr "Dirección SIP:" #~ msgid "Modify" #~ msgstr "Modificar" @@ -2111,20 +2294,20 @@ msgstr[1] "" #~ "either with packages from your distribution, or by downloading\n" #~ "ALSA drivers at http://www.alsa-project.org." #~ msgstr "" -#~ "Estas usando actualmente el controlador i810_audio.\n" -#~ "Ese controlador tiene errores y por tanto no funciona con Linphone.\n" -#~ "Le recomendamos que lo sustituya por su controlador equivalente de ALSA,\n" -#~ "ya sea mediante paquetes de su distribucion, o descargando\n" +#~ "Está usando actualmente el controlador i810_audio.\n" +#~ "Este controlador tiene errores y por tanto no funciona con Linphone.\n" +#~ "Le recomendamos que lo sustituya por el controlador equivalente de ALSA,\n" +#~ "ya sea mediante paquetes de su distribución, o descargando\n" #~ "controladores ALSA de http://www.alsa-project.org." -#~ msgid "Unregistration successfull." -#~ msgstr "Cancelacion del registro completada." +#~ msgid "Unregistration successful." +#~ msgstr "Cancelación del registro completada." #~ msgid "C: 2001" #~ msgstr "Abril 2001" #~ msgid "Select network interface to use:" -#~ msgstr "Selecciona la interfaz de red para usar:" +#~ msgstr "Seleccione la interfaz de red para usar:" #~ msgid "Network interface properties" #~ msgstr "Propiedades de Interfaz de Red:" @@ -2136,7 +2319,7 @@ msgstr[1] "" #~ msgstr "Threads no soportados por glib. Actualize su glib.\n" #~ msgid "Run linphone as a gnome-applet." -#~ msgstr "Lanzar linphone como un gnome-applet." +#~ msgstr "Ejecutar linphone como un gnome-applet." #~ msgid "Run linphone as a daemon (for use without gnome)." #~ msgstr "Ejecutar linphone como demonio (para uso sin gnome)." @@ -2149,10 +2332,10 @@ msgstr[1] "" #~ "parameters 'box." #~ msgstr "" #~ "No se puede encontrar la interfaz de red usada previamente %s.\n" -#~ "Si tu ordenador esta conectado temporalmente a Internet, por favor " -#~ "conecta y entonces ejecuta linphone.\n" -#~ "Si quieres cambiar tu interfaz de red predeterminada, ve a la opcion " -#~ "Parametros." +#~ "Si su ordenador está conectado temporalmente a Internet, por favor " +#~ "conéctese y entonces ejecute linphone.\n" +#~ "Si quiere cambiar su interfaz de red predeterminada, vaya a la casilla " +#~ "Parámetros." #, fuzzy #~ msgid "" @@ -2161,21 +2344,21 @@ msgstr[1] "" #~ "Do you want linphone to kill these programs (esd or artsd) ?" #~ msgstr "" #~ "Linphone no puede abrir el dispositivo de audio.\n" -#~ " Puede deberse a que otros programas lo esten usando.\n" -#~ "¿ Quiere que Linphone cierre esos programas (esd o artsd) ?" +#~ "Puede deberse a que otros programas lo estén usando.\n" +#~ "¿Quiere que Linphone cierre esos programas (esd o artsd)?" #~ msgid "Use it as a:" #~ msgstr "Usarlo como un:" #~ msgid "Outbound proxy" -#~ msgstr "Outbound proxy" +#~ msgstr "Proxy de salida" #~ msgid "" #~ "Togle this button if the registrar must be used to proxy calls through a " #~ "firewall." #~ msgstr "" -#~ "Marcar esta opcion si el servidor de registro debe ser usado para " -#~ "llamadas a proxy a traves de un cortafuegos." +#~ "Marcar esta opción si el servidor de registro debe usarse en llamadas a " +#~ "proxy a través de un firewall." #~ msgid "OSS" #~ msgstr "OSS" @@ -2185,48 +2368,49 @@ msgstr[1] "" #~ msgid "Automatically kill applications using soundcard when needed" #~ msgstr "" -#~ "Cerrar aplicaciones que usen la tarjeta de sonido cuando se necesite." +#~ "Cerrar automáticamente aplicaciones que usen la tarjeta de sonido cuando " +#~ "se necesite." #~ msgid "" #~ "Your computer is connected to several networks. Check in the global " #~ "parameters if Linphone uses the one that you want." #~ msgstr "" -#~ "Tu ordenador esta conectado a varias redes. Revisa en los Parametros " -#~ "globales si Linphone usa la que necesitas." +#~ "Su equipo está conectado a varias redes. Revise en los parámetros " +#~ "globales si Linphone usa la que necesita." #~ msgid "" #~ "Linphone failed to open the sound device. See the README file included in " #~ "the distribution for details." #~ msgstr "" -#~ "Linphone fallo al abrir el dispositivo de sonido. Vea el archivo README " -#~ "incluido en la distribucion para mas detalles." +#~ "Linphone no pudo abrir el dispositivo de sonido. Vea el archivo README " +#~ "incluido en la distribución para más detalles." #~ msgid "Interface not found." #~ msgstr "Interfaz no encontrada." #~ msgid "Warning" -#~ msgstr "Atencion" +#~ msgstr "Advertencia" #~ msgid "" #~ "Linphone cannot open the sound device. It may be caused by other programs " #~ "using it. Do you want linphone to kill these programs (esd or artsd) ?" #~ msgstr "" #~ "Linphone no puede abrir el dispositivo de sonido. Puede deberse a que " -#~ "otros programaslo esten usando. ¿ Quiere que Linphone cierre esos " -#~ "programas (esd o artsd) ?" +#~ "otros programas lo estén usando. ¿Quiere que Linphone cierre esos " +#~ "programas (esd o artsd)?" #~ msgid "Linphone shutdowns..." -#~ msgstr "Linphone esta terminando..." +#~ msgstr "Linphone se está cerrando…" #~ msgid "" -#~ "Please, wait a few seconds untils linphone unregisters your sip addess " +#~ "Please, wait a few seconds until linphone unregisters your sip addess " #~ "from registrar server..." #~ msgstr "" #~ "Por favor, espere unos segundos hasta que Linphone cancele el registro de " -#~ "su direccion SIP en el servidor de registros..." +#~ "su dirección SIP en el servidor de registros..." -#~ msgid "Bad formuled sip address." -#~ msgstr "Direccion SIP mal escrita." +#~ msgid "Bad formulated sip address." +#~ msgstr "Dirección SIP mal escrita." #~ msgid "Couldn't create pixmap from file: %s" #~ msgstr "No se pudo crear pixmap desde el archivo: %s" @@ -2235,30 +2419,30 @@ msgstr[1] "" #~ "Linphone did not detect any valid network interface. If you use a " #~ "temporary internet connection, please connect and then run linphone again." #~ msgstr "" -#~ "Linphone no detecto ninguna interfaz de red valida. Si usas una conexion " -#~ "temporal a Internet, por favor conecta y vuelve a ejecutar Linphone." +#~ "Linphone no detectó ninguna interfaz de red válida. Si usa una conexión " +#~ "temporal a Internet, por favor conéctese y vuelva a ejecutar Linphone." #~ msgid "List of network interfaces on your system." -#~ msgstr "Lista de interfaces de red en tu sistema." +#~ msgstr "Lista de interfaces de red en su sistema." #~ msgid "" -#~ "RTP est le mode de transport de la voix. Modifier ces paramètres pour " -#~ "tenter d'améliorer la qualité de la communication si celle-ci est " -#~ "dégradée." +#~ "RTP est le mode de transport de la voix. Modifier ces paramËtres pour " +#~ "tenter d'amÈliorer la qualitÈ de la communication si celle-ci est " +#~ "dÈgradÈe." #~ msgstr "" -#~ "RTP es el modelo de transporte de la voz. Modifica estos parametros para " -#~ "intentar mejorar la calidad de la comunicacion, si es que.es mala." +#~ "RTP es el modelo de transporte de la voz. Modifique estos parámetros para " +#~ "intentar mejorar la calidad de la comunicación en caso de que sea mala." #~ msgid "Use rtp port:" -#~ msgstr "Puerto RTP:" +#~ msgstr "Usar puerto RTP:" #~ msgid "" -#~ "Les codecs ou vocodeurs sont les algorithmes utilisés pour compresser la " +#~ "Les codecs ou vocodeurs sont les algorithmes utilisÈs pour compresser la " #~ "voix." #~ msgstr "" -#~ "Los codecs o codificadores/decodificadores son los algoritmos usados para " +#~ "Los códecs o codificadores/decodificadores son los algoritmos usados para " #~ "comprimir la voz." #~ msgid "" -#~ "Vous pouvez ajuster avec cet onglet des paramètre liés à votre carte son." -#~ msgstr "Puede modificar estos parametros a su gusto." +#~ "Vous pouvez ajuster avec cet onglet des paramËtre liÈs ‡ votre carte son." +#~ msgstr "Puede modificar estos parámetros a su gusto." diff --git a/po/fr.po b/po/fr.po index 8c955f75c..322a2ff4c 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Linphone 0.9.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-12-05 12:41+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2002-12-06 17:33+0100\n" "Last-Translator: Simon Morlat \n" "Language-Team: french \n" @@ -16,110 +16,114 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "inconnu" + +#: ../gtk/calllogs.c:85 msgid "Aborted" msgstr "Abandonné" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 msgid "Missed" msgstr "Manqué" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 msgid "Declined" msgstr "Refusé" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "inconnu" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 -#: ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "Conférence" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "Moi" -#: ../gtk/support.c:49 -#: ../gtk/support.c:73 -#: ../gtk/support.c:102 +#: ../gtk/support.c:49 ../gtk/support.c:73 ../gtk/support.c:102 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Icone non trouvée: %s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "affiche des informations de debogage" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "Démarre iconifié, sans interface principale." -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "addresse à appeler maintenant" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "si positionné, répond automatiquement aux appels entrants" -#: ../gtk/main.c:131 -msgid "Specifiy a working directory (should be the base of the installation, eg: c:\\Program Files\\Linphone)" -msgstr "Spécifie un répertoire de travail (qui devrait être le répertoire d'installation, par exemple c:\\Program Files\\Linphone)" +#: ../gtk/main.c:130 +msgid "" +"Specifiy a working directory (should be the base of the installation, eg: c:" +"\\Program Files\\Linphone)" +msgstr "" +"Spécifie un répertoire de travail (qui devrait être le répertoire " +"d'installation, par exemple c:\\Program Files\\Linphone)" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" msgstr "Appel avec %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" -"Would you allow him to see your presence status or add him to your contact list ?\n" +"Would you allow him to see your presence status or add him to your contact " +"list ?\n" "If you answer no, this person will be temporarily blacklisted." msgstr "" "%s souhaite vous ajouter à sa liste de contact.\n" -"Souhaitez vous l'autoriser à voir votre information de présence et l'ajouter à votre liste également ?\n" -"Si vous répondez non, cette personne sera mise temporairement sur liste noire." +"Souhaitez vous l'autoriser à voir votre information de présence et l'ajouter " +"à votre liste également ?\n" +"Si vous répondez non, cette personne sera mise temporairement sur liste " +"noire." -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" @@ -128,65 +132,59 @@ msgstr "" "Entrez le mot de passe pour %s\n" " sur le domaine %s:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 msgid "Call error" msgstr "Erreur lors de l'appel" -#: ../gtk/main.c:1054 -#: ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Appel terminé." -#: ../gtk/main.c:1057 -#: ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Appel entrant" -#: ../gtk/main.c:1059 -#: ../gtk/incall_view.c:451 -#: ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "Répondre" -#: ../gtk/main.c:1061 -#: ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 msgid "Decline" msgstr "Refuser" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 msgid "Call paused" msgstr "Appel en pause" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Ports utilisés" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "Lien site web" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "Linphone - un téléphone video pour l'internet" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "%s (par défaut)" -#: ../gtk/main.c:1714 -#: ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "Transfert vers %s" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -194,177 +192,176 @@ msgstr "" "Aucune carte son n'a été détectée sur cet ordinateur.\n" "Vous ne pourrez pas effectuer d'appels audio." -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "Un visiophone libre" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 msgid "Add to addressbook" msgstr "Ajouter au carnet d'adresse" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "Info de présence" -#: ../gtk/friendlist.c:526 -#: ../gtk/propertybox.c:362 -#: ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nom" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 msgid "Call" msgstr "Appeler" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "Rechercher dans l'annuaire de %s" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "Contact sip invalide !" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "Appeler %s" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "Chatter avec %s" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, c-format msgid "Edit contact '%s'" msgstr "Editer le contact '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "Supprimer le contact '%s'" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "Ajouter un contact depuis l'annuaire %s" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "Fréquence (Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "Etat" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "Débit min. (kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "Paramètres" -#: ../gtk/propertybox.c:430 -#: ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Activé" -#: ../gtk/propertybox.c:432 -#: ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Désactivé" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "Compte" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "Anglais" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "Français" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "Suédois" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "Italien" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "Espagnol" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "Portugais brésilien" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "Polonais" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "Allemand" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "Russe" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "日本語" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "Néérlandais" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "Hongrois" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "Tchèque" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "简体中文" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "Chinois traditionnel" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "Norvégien" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "Hébreu" -#: ../gtk/propertybox.c:842 -msgid "You need to restart linphone for the new language selection to take effect." -msgstr "La nouvelle selection de langue prendra effet au prochain démarrage de linphone." +#: ../gtk/propertybox.c:847 +msgid "" +"You need to restart linphone for the new language selection to take effect." +msgstr "" +"La nouvelle selection de langue prendra effet au prochain démarrage de " +"linphone." -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -406,280 +403,316 @@ msgid_plural "Found %i contacts" msgstr[0] "%i contact trouvé." msgstr[1] "%i contacts trouvés." -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 msgid "Username:" msgstr "Nom d'utilisateur:" -#: ../gtk/setupwizard.c:93 -#: ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" msgstr "Mot de passe:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 msgid "Username*" msgstr "Nom d'utilisateur*" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 msgid "Password*" msgstr "Mot de passe*" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 msgid "Username: (*)" msgstr "Nom d'utilisateur: (*)" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 msgid "Password: (*)" msgstr "Mot de passe: (*)" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "" -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" -"Please validate your account by clicking on the link we just sent you by email.\n" +"Please validate your account by clicking on the link we just sent you by " +"email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 #, fuzzy msgid "Configure your account (step 1/1)" msgstr "Configuer un compte SIP" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "Erreur" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" msgstr "" -#: ../gtk/incall_view.c:69 -#: ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, c-format msgid "Call #%i" msgstr "Appel #%i" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "Transférer vers l'appel #%i avec %s" -#: ../gtk/incall_view.c:209 -#: ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 #, fuzzy msgid "Not used" msgstr "Non trouvé" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "L'appel a échoué." -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "Redirection" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" #: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "Découverte STUN en cours" + #: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "indisponible" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "L'appel a échoué." + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 -#: ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 msgid "Calling..." msgstr "Tentative d'appel..." -#: ../gtk/incall_view.c:433 -#: ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 msgid "Incoming call" msgstr "Appel entrant" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "bon" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "moyen" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "faible" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "très faible" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "nulle" -#: ../gtk/incall_view.c:490 -#: ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "indisponible" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "Sécurisé par SRTP" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Sécurisé par ZRTP- [jeton: %s]" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "Marquer comme non vérifié" -#: ../gtk/incall_view.c:617 -#: ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "Marquer comme vérifié" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "En conférence" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In call" msgstr "Appel en cours" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 msgid "Paused call" msgstr "Appel en attente" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 msgid "Call ended." msgstr "Appel terminé." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 msgid "Transfer done." msgstr "Transfert terminé" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 msgid "Transfer failed." msgstr "Transfert échoué" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "Reprendre" -#: ../gtk/incall_view.c:788 -#: ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "Pause" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +#, fuzzy +msgid "(Paused)" +msgstr "Pause" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -702,215 +735,150 @@ msgid "label" msgstr "" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "Vidéo" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "Transfert" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 msgid "In call" msgstr "Appel en cours" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 msgid "Duration" msgstr "Durée" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "Qualité de l'appel" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 msgid "Enable self-view" msgstr "Se voir" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "_Aide" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "Fenêtre de débogage" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "_Site web" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 msgid "Account assistant" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 msgid "SIP address or phone number:" msgstr "Adresse SIP ou numéro" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "Démarrer un nouvel appel" -#: ../gtk/main.ui.h:27 -#: ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +msgid "Contacts" +msgstr "Contacts" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Ajouter" -#: ../gtk/main.ui.h:28 -#: ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Editer" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "" - -#: ../gtk/main.ui.h:33 -#: ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "Rechercher" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 msgid "Add contacts from directory" msgstr "Ajouter un contact depuis l'annuaire" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 msgid "Add contact" msgstr "Ajouter un contact." -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "Clavier" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 msgid "Recent calls" msgstr "Appels récents" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 msgid "My current identity:" msgstr "Mon identité sip:" -#: ../gtk/main.ui.h:51 -#: ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Nom d'utilisateur" -#: ../gtk/main.ui.h:52 -#: ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Mot de passe" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "Me connecter automatiquement" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 msgid "Login information" msgstr "Information de login" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 msgid "Welcome !" msgstr "Bienvenue !" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "Tous" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 msgid "Online users" msgstr "En ligne" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 msgid "Default" msgstr "Par défaut" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1057,6 +1025,10 @@ msgstr "Codecs audio" msgid "Video codecs" msgstr "Codecs video" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "" + #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" msgstr "" @@ -1094,209 +1066,224 @@ msgid "Media encryption type" msgstr "Type d'encryption media" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 +#, fuzzy +msgid "Media encryption is mandatory" +msgstr "Type d'encryption media" + +#: ../gtk/parameters.ui.h:23 msgid "Network protocol and ports" msgstr "Protocoles réseaux et ports" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" msgstr "Connexion directe à l'Internet" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" msgstr "Derrière un pare-feu (spécifier la passerelle ci dessous)" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "Adresse IP publique:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Derrière un pare-feu (utiliser STUN)" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 #, fuzzy msgid "Behind NAT / Firewall (use ICE)" msgstr "Derrière un pare-feu (utiliser STUN)" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +#, fuzzy +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "Derrière un pare-feu (utiliser STUN)" + +#: ../gtk/parameters.ui.h:30 msgid "Stun server:" msgstr "Serveur STUN:" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 msgid "NAT and Firewall" msgstr "Paramètres liés au pare-feu" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 msgid "Network settings" msgstr "Paramètres réseau" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 msgid "Ring sound:" msgstr "Sonnerie:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 msgid "Capture device:" msgstr "Périphérique de capture:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 msgid "Ring device:" msgstr "Périphérique de sonnerie:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 msgid "Playback device:" msgstr "Périphérique d'écoute:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "Activer l'annulation d'écho" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 msgid "Audio" msgstr "Son" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 msgid "Video input device:" msgstr "Périphérique d'entrée video" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "Résolution video préférée:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 msgid "Video" msgstr "Video" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "Paramètres multimedia" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" -msgstr "Cette rubrique permet de définir son addresse SIP lorsqu'on ne possède pas de compte SIP" +msgstr "" +"Cette rubrique permet de définir son addresse SIP lorsqu'on ne possède pas " +"de compte SIP" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "Votre nom d'affichage (ex: John Doe)" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 msgid "Your username:" msgstr "Votre nom d'utilisateur:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 msgid "Your resulting SIP address:" msgstr "Votre addresse SIP:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 msgid "Default identity" msgstr "Identité par défaut" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Enlever" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 msgid "Proxy accounts" msgstr "Comptes SIP via des proxy" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "Effacer tous les mots de passe" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 msgid "Privacy" msgstr "Sécurité" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "Gérer mes comptes SIP" -#: ../gtk/parameters.ui.h:55 -#: ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Activer" -#: ../gtk/parameters.ui.h:56 -#: ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Désactiver" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "Indiquez 0 pour ne pas mettre de limite" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "Limite de débit montant en kbits/sec:" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "Limite de débit descendant en kbits/sec:" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "Activer le control de débit adaptatif." -#: ../gtk/parameters.ui.h:62 -msgid "Adaptive rate control is a technique to dynamically guess the available bandwidth during a call." -msgstr "Le control de débit adaptatif est une technique pour adapter la qualité de l'audio et de la video en fonction de la bande passante disponible, durant l'appel." +#: ../gtk/parameters.ui.h:64 +msgid "" +"Adaptive rate control is a technique to dynamically guess the available " +"bandwidth during a call." +msgstr "" +"Le control de débit adaptatif est une technique pour adapter la qualité " +"de l'audio et de la video en fonction de la bande passante disponible, " +"durant l'appel." -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "Gestion de la bande passante" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 msgid "Codecs" msgstr "" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 msgid "Language" msgstr "Langue" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "Montrer les réglages avancés" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 msgid "Level" msgstr "Niveau" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 msgid "User interface" msgstr "Interface utilisateur" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 msgid "Done" msgstr "Fermer" @@ -1360,7 +1347,7 @@ msgstr "" #: ../gtk/call_statistics.ui.h:5 #, fuzzy -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "Type d'encryption media" #: ../gtk/call_statistics.ui.h:6 @@ -1369,6 +1356,15 @@ msgstr "" #: ../gtk/call_statistics.ui.h:7 #, fuzzy +msgid "Video Media connectivity" +msgstr "Type d'encryption media" + +#: ../gtk/call_statistics.ui.h:8 +msgid "Round trip time" +msgstr "" + +#: ../gtk/call_statistics.ui.h:9 +#, fuzzy msgid "Call statistics and information" msgstr "Information sur le contact" @@ -1393,19 +1389,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "abandonné" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "terminé" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "manqué" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1420,67 +1476,70 @@ msgstr "" "Etat: %s\n" "Durée: %i mn %i sec\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "Appel sortant" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "Prêt." -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "Recherche de la destination du numéro de téléphone..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "La destination n'a pu être trouvée." -#: ../coreapi/linphonecore.c:2121 -msgid "Could not parse given sip address. A sip url usually looks like sip:user@domain" -msgstr "Adresse SIP mal formulée. Une address sip ressemble à " +#: ../coreapi/linphonecore.c:2231 +msgid "" +"Could not parse given sip address. A sip url usually looks like sip:" +"user@domain" +msgstr "" +"Adresse SIP mal formulée. Une address sip ressemble à " -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "Appel de" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 msgid "Could not call" msgstr "Echec de l'appel" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Désolé, le nombre maximum d'appels simultanés est atteint." -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 msgid "is contacting you" msgstr "vous appelle" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr "et sollicite un décrochage automatique." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "Modifications des paramètres d'appels..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "En ligne." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 msgid "Call aborted" msgstr "Appel abandonné" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 msgid "Could not pause the call" msgstr "La mise en attente a échoué" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." msgstr "Mise en attente de l'appel..." @@ -1566,8 +1625,12 @@ msgid "Unknown-bug" msgstr "Bug inconnu" #: ../coreapi/proxy.c:204 -msgid "The sip proxy address you entered is invalid, it must start with \"sip:\" followed by a hostname." -msgstr "L'addresse SIP du proxy est invalide. Elle doit commencer par \"sip:\" suivie par un nom de domaine." +msgid "" +"The sip proxy address you entered is invalid, it must start with \"sip:\" " +"followed by a hostname." +msgstr "" +"L'addresse SIP du proxy est invalide. Elle doit commencer par \"sip:\" " +"suivie par un nom de domaine." #: ../coreapi/proxy.c:210 msgid "" @@ -1575,118 +1638,119 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" "L'identité SIP que vous avez fourni est invalide.\n" -"Elle doit être de la forme sip:username@domain, comme par example sip:alice@example.net" +"Elle doit être de la forme sip:username@domain, comme par example sip:" +"alice@example.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, c-format msgid "Could not login as %s" msgstr "Echec de la connexion en tant que %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 msgid "Remote ringing." msgstr "Sonnerie distante." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 msgid "Remote ringing..." msgstr "Sonnerie distante..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "Prise d'appel anticipée" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, c-format msgid "Call with %s is paused." msgstr "%s est maintenant en attente." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "Appel répondu par %s - en attente" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 msgid "Call resumed." msgstr "Appel repris." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, c-format msgid "Call answered by %s." msgstr "Appel répondu par %s." -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 #, fuzzy msgid "We have been resumed." msgstr "Reprise..." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 #, fuzzy msgid "Call is updated by remote." msgstr "L'appel a été repris par le correspondant." -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "Appel terminé." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "Occupé..." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "L'usager est temporairement indisponible." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "L'usager ne souhaite pas être dérangé" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "Appel décliné." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "Pas de réponse." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "Erreur de protocole" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 msgid "Redirected" msgstr "Redirection" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 msgid "Call failed." msgstr "L'appel a échoué." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "Enregistrement sur %s effectué." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, c-format msgid "Unregistration on %s done." msgstr "Désenregistrement sur %s effectué." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "Pas de réponse" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, c-format msgid "Registration on %s failed: %s" msgstr "Echec de l'enregistrement sur %s: %s" @@ -1696,13 +1760,16 @@ msgstr "Echec de l'enregistrement sur %s: %s" msgid "Authentication token is %s" msgstr "Le jeton d'authentification est %s" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "Vous avez manqué %i appel" msgstr[1] "Vous avez manqué %i appels" +#~ msgid "Keypad" +#~ msgstr "Clavier" + #~ msgid "Chat with %s" #~ msgstr "Chat avec %s" @@ -1713,9 +1780,6 @@ msgstr[1] "Vous avez manqué %i appels" #~ msgid "Confirmation" #~ msgstr "Information sur le contact" -#~ msgid "Contacts" -#~ msgstr "Contacts" - #~ msgid "Enable video" #~ msgstr "Activer la video" @@ -1767,9 +1831,6 @@ msgstr[1] "Vous avez manqué %i appels" #~ msgid "Register at startup" #~ msgstr "S'enregistrer au démarrage" -#~ msgid "Ports" -#~ msgstr "Ports utilisés" - #~ msgid "Sorry, you have to pause or stop the current call first !" #~ msgstr "Désolé, vous devez d'abord mettre en attente l'appel en cours." diff --git a/po/he.po b/po/he.po index bba94e8ca..7439d2651 100644 --- a/po/he.po +++ b/po/he.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Linphone 3.5.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2012-12-27 10:14+0200\n" "Last-Translator: Isratine Citizen \n" "Language-Team: Rahut \n" @@ -20,36 +20,40 @@ msgstr "" "X-Generator: Poedit 1.5.4\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "לא זמין (n/a)" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "ננטשה" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 #, fuzzy msgid "Missed" msgstr "הוחמצה" # דחיה -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "לדחות" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "דקה %i" msgstr[1] "%i דקות" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "שניה %i" msgstr[1] "%i שניות" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" @@ -58,11 +62,7 @@ msgstr "" "%s\t%s\tאיכות: %s\n" "%s\t%s %s\t" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "לא זמין (n/a)" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, fuzzy, c-format msgid "" "%s\t%s\t\n" @@ -71,11 +71,11 @@ msgstr "" "%s\t%s\tאיכות: %s\n" "%s\t%s %s\t" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "ועידה" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "אני" @@ -85,41 +85,41 @@ msgid "Couldn't find pixmap file: %s" msgstr "לא ניתן למצוא קובץ ‫pixmap: ‫%s" # cli -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 #, fuzzy msgid "log to stdout some debug information while running." msgstr "רשום אל stdout מידע ניפוי שגיאות מסוים בזמן ביצוע." # cli -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 #, fuzzy msgid "path to a file to write logs into." msgstr "נתיב אל קובץ שברצונך לרשום אליו את הרשומות." -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" # cli -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 #, fuzzy msgid "Start only in the system tray, do not show the main interface." msgstr "התחל במגש המערכת בלבד, אל תציג את הממשק הראשי." # cli -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 #, fuzzy msgid "address to call right now" msgstr "כתובת להתקשרות ברגע זה" # cli -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 #, fuzzy msgid "if set automatically answer incoming calls" msgstr "באם אפשרות זו נקבעת ענה אוטומטית לקריאות נכנסות" # cli -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 #, fuzzy msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" @@ -128,14 +128,14 @@ msgstr "" "ציין מדור העבודה (אמור להיות מבוסס על ההתקנה, למשל: c:\\Program Files" "\\Linphone)" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" msgstr "התקשרות באמצעות %s" # הקשר שלהם # אם התשובה -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -148,7 +148,7 @@ msgstr "" "שלך ?\n" "היה ותשובתך תהיה לא, אדם זה יהיה מסומן באופן זמני ברשימה השחורה." -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" @@ -158,64 +158,64 @@ msgstr "" " בתחום %s:" # שיחה -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 msgid "Call error" msgstr "שגיאת קריאה" # Conversation ended -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "שיחה הסתיימה" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "קריאה נכנסת" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "לענות" # דחיה -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 msgid "Decline" msgstr "לדחות" # Conversation paused -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 msgid "Call paused" msgstr "שיחה הושהתה" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "מאת %s" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Ports utilisés" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "קישור אתר רשת" # ‫Linphone - וידאופון במרשתת -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "‫Linphone - וידאופון אינטרנטי" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "‫%s (משתמטת)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "אנחנו מועברים אל %s" # קריאות שמע -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -223,182 +223,182 @@ msgstr "" "לא אותרו כרטיסי קול במחשב זה.\n" "לא תהיה ביכולתך לשלוח או לקבל שיחות שמע." -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "וידאופון SIP חופשי" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 msgid "Add to addressbook" msgstr "הוסף אל ספר כתובות" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "מצב נוכחות" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "שם" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 msgid "Call" msgstr "קריאה" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 msgid "Chat" msgstr "" # a name or a number -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "חיפוש במדור %s" # איש־קשר -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "כתובת sip לא תקפה !" # צור קשר עם -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "התקשר אל %s" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "שלח טקסט אל %s" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, c-format msgid "Edit contact '%s'" msgstr "ערוך איש קשר '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "מחק איש קשר '%s'" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "הוסף איש קשר חדש מן מדור %s" # קצב תדר תדירות מהירות -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "שיעור (הרץ)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "מצב" # שיעור סיביות מינימלי -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "קצב נתונים מינימלי (קי״ב/שנ׳)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "פרמטרים" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "מופעל" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "לא מופעל" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "חשבון" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "English" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "Français" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "Svenska" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "Italiano" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "Español" # português do Brasil -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "português brasileiro" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "Polski" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "Deutsch" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "Русский" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "日本語" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "Nederlands" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "Magyar" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "Česky" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "中文" # 繁体字 -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "繁體字" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "norsk" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" # selected הנבחרת -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "עליך לאתחל את לינפון כדי שהשפה החדשה תיכנס לתוקף." -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "ללא" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -443,7 +443,7 @@ msgid_plural "Found %i contacts" msgstr[0] "נמצא איש קשר %i" msgstr[1] "נמצאו %i אנשי קשר" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." @@ -451,75 +451,75 @@ msgstr "" "ברוך בואך !\n" "אשף זה יסייע לך לעשות שימוש בחשבון SIP עבור שיחותייך." -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" msgstr "צור חשבון אצל linphone.org" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 msgid "I have already a linphone.org account and I just want to use it" msgstr "כבר קיים חשבון linphone.org ברשותי וברצוני לעשות בו שימוש" # כבר קיים ברשותי חשבון sip -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 msgid "I have already a sip account and I just want to use it" msgstr "כבר קיים חשבון sip ברשותי וברצוני לעשות בו שימוש" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "הזן את שם משתמשך אצל linphone.org" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 msgid "Username:" msgstr "שם משתמש:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" msgstr "סיסמה:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "הזן את מידע חשבונך" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 msgid "Username*" msgstr "שם משתמש*" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 msgid "Password*" msgstr "סיסמה*" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "מתחם*" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "פרוקסי" # נדרשים -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "(*) שדות חובה" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 msgid "Username: (*)" msgstr "שם משתמש: (*)" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 msgid "Password: (*)" msgstr "סיסמה: (*)" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "דוא״ל: (*)" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "אימות סיסמתך: (*)" # אינו בר־השגה # לשוב אחורה -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." @@ -528,12 +528,12 @@ msgstr "" "נא לחזור ולנסות שוב." # תודה רבה -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "תודה לך. חשבונך מוגדר ומוכן לשימוש כעת." # לאחר מכן -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" @@ -544,195 +544,240 @@ msgstr "" # Wizard אשף # סייע -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "ברוך בואך אל אשף הגדרת החשבון" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "אשף הגדרת חשבון" # שלב -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" msgstr "הגדרת חשבונך (צעד 1/1)" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "הזנת שם משתמש sip (צעד 1/1)" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "הזנת מידע חשבון (צעד 1/2)" # תקפות -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "אימות (צעד 2/2)" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "שגיאה" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" msgstr "מסיים כעת" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, c-format msgid "Call #%i" msgstr "שיחה מס׳ %i" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "העברה אל שיחה מס׳ %i עם %s" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 #, fuzzy msgid "Not used" msgstr "לא נמצא" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "קריאה נכשלה." -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "מכוון מחדש" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +# במהלך (או) באמצע חיפוש... +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "בדיקת STUN מצויה כעת בעיצומה..." + +#: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "לא זמינה" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "קריאה נכשלה." + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, fuzzy, c-format +msgid "%.3f seconds" +msgstr "שניה %i" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 msgid "Calling..." msgstr "מתקשר כעת..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "‭00::00::00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 msgid "Incoming call" msgstr "קריאה נכנסת" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "טובה" # רגילה -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "ממוצעת" # weak חלשה חלושה רפויה רופפת -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "דלה" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "דלה מאוד" # רעה -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "גרועה מדי" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "לא זמינה" # באמצעות -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "מאובטחת על ידי SRTP" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "מאובטחת על ידי ZRTP - [אות אימות: %s]" # set or unset verification state of ZRTP SAS. -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "הגדר כלא מאומתת" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "הגדר כמאומתת" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "בשיחת ועידה" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In call" msgstr "בשיחה כעת" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 msgid "Paused call" msgstr "שיחה מושהית" # שעות %02i דקות %02i שניות %02i # Force LTR time format (hours::minutes::seconds) with LRO chatacter (U+202D) -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "‭%02i::%02i::%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 msgid "Call ended." msgstr "שיחה הסתיימה." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 #, fuzzy msgid "Transfer done." msgstr "העברה" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "העברה" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "חזרה" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "השהיה" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +#, fuzzy +msgid "(Paused)" +msgstr "השהיה" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -758,214 +803,154 @@ msgid "label" msgstr "תוויות" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "העברה" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 msgid "In call" msgstr "בשיחה כעת" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 msgid "Duration" msgstr "משך זמן" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "אומדן איכות שיחה" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "_אפשרויות" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 msgid "Enable self-view" msgstr "אפשר ראות-עצמית" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "_עזרה" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "הצג חלון ניפוי שגיאות" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "_עמוד הבית" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "בדיקת _עדכונים" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 msgid "Account assistant" msgstr "אשף חשבון" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 msgid "SIP address or phone number:" msgstr "כתובת SIP או מספר טלפון" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "התחלת שיחה חדשה" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +msgid "Contacts" +msgstr "אנשי קשר" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "הוסף" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "ערוך" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "9 (סעפ)" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "8 (צק)" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "7 (רשת)" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "6 (זחט)" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5 (יכל)" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "4 (מנ)" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "3 (אבג)" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "2 (דהו)" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "חיפוש" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 msgid "Add contacts from directory" msgstr "הוסף אנשי קשר מן מדור" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 msgid "Add contact" msgstr "הוספת איש קשר" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "לוח מקשים" - # קריאות אחרונות -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 msgid "Recent calls" msgstr "שיחות אחרונות" # הזהות הנוכחית שלי -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 msgid "My current identity:" msgstr "זהותי הנוכחית:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "שם משתמש" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "סיסמה" # מרשתת -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "חיבור אינטרנט:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "חבר אותי אוטומטית" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 msgid "Login information" msgstr "מידע התחברות" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 msgid "Welcome !" msgstr "ברוך בואך !" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "כל המשתמשים" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 msgid "Online users" msgstr "משתמשים מקוונים" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "‫ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "ערוץ סיב" # משתמט -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 msgid "Default" msgstr "ברירת מחדל" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1117,6 +1102,10 @@ msgstr "קודקים של שמע" msgid "Video codecs" msgstr "קודקים של וידאו" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "" + #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" msgstr "" @@ -1155,192 +1144,204 @@ msgstr "טרנספורט" msgid "Media encryption type" msgstr "סוג הצפנת מדיה" -# מנהרה #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "וידאו RTP/UDP:" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "שמע RTP/UDP:" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +# מנהרה +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 +#, fuzzy +msgid "Media encryption is mandatory" +msgstr "סוג הצפנת מדיה" + +#: ../gtk/parameters.ui.h:23 msgid "Network protocol and ports" msgstr "פרוטוקולי רשת עבודה ופורטים" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" msgstr "חיבור ישיר אל האינטרנט" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" msgstr "מאחורי NAT \\ חומת־אש (ציון כתובת שער (Gateway IP) למטה)" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "כתובת IP פומבית:" # שימוש ב־STUN # utilize -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "מאחורי NAT \\ חומת־אש (ניצול STUN)" # שימוש ב־STUN # utilize -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 #, fuzzy msgid "Behind NAT / Firewall (use ICE)" msgstr "מאחורי NAT \\ חומת־אש (ניצול STUN)" -#: ../gtk/parameters.ui.h:28 +# שימוש ב־STUN +# utilize +#: ../gtk/parameters.ui.h:29 +#, fuzzy +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "מאחורי NAT \\ חומת־אש (ניצול STUN)" + +#: ../gtk/parameters.ui.h:30 msgid "Stun server:" msgstr "שרת STUN:" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 msgid "NAT and Firewall" msgstr "‫NAT וחומת אש" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 msgid "Network settings" msgstr "הגדרות רשת עבודה" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 msgid "Ring sound:" msgstr "צליל צלצול:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "התקן ALSA מיוחד (רשות):" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 msgid "Capture device:" msgstr "התקן לכידה:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 msgid "Ring device:" msgstr "התקן צלצול:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 msgid "Playback device:" msgstr "התקן פס קול:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "אפשר ביטול הד" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 msgid "Audio" msgstr "שמע" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 msgid "Video input device:" msgstr "התקן קלט וידאו:" # רצויה -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "רזולוציית וידאו מועדפת:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 msgid "Video" msgstr "וידאו" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "הגדרות מולטימדיה" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "חלק זה מגדיר את כתובת ה־SIP כאשר אינך עושה שימוש בחשבון SIP" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "שם התצוגה שלך (למשל: יורם יהודה):" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 msgid "Your username:" msgstr "שם המשתמש שלך:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 msgid "Your resulting SIP address:" msgstr "כתובת SIP נובעת:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 msgid "Default identity" msgstr "זהות משתמטת" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "אשף" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "הסר" # חשבונות מתווכים -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 msgid "Proxy accounts" msgstr "חשבונות Proxy" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "מחק סיסמאות" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 msgid "Privacy" msgstr "פרטיות" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "ניהול חשבונות ‫SIP" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "אפשר" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "נטרל" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 msgid "Codecs" msgstr "קודקים" # ללא הגבלה -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "0 מסמל \"בלי הגבלה\"" # האם KiB means kibibyte? -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "מגבלת מהירות העלאה בקי״ב/שנ׳:" # האם KiB means kibibyte? # קי״ב (1024) אל מול ק״ב (1000) -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "מגבלת מהירות הורדה בקי״ב/שנ׳:" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "אפשר בקרת קצב מסתגלת" # שיטה ניחוש -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." @@ -1350,31 +1351,31 @@ msgstr "" # פס רוחב # טווח תדרים -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "בקרת רוחב פס" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 msgid "Codecs" msgstr "קודקים" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 msgid "Language" msgstr "שפה" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "הצג הגדרות מתקדמות" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 msgid "Level" msgstr "רמה" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 msgid "User interface" msgstr "ממשק משתמש" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 msgid "Done" msgstr "סיום" @@ -1442,7 +1443,7 @@ msgstr "" #: ../gtk/call_statistics.ui.h:5 #, fuzzy -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "סוג הצפנת מדיה" #: ../gtk/call_statistics.ui.h:6 @@ -1451,6 +1452,15 @@ msgstr "" #: ../gtk/call_statistics.ui.h:7 #, fuzzy +msgid "Video Media connectivity" +msgstr "סוג הצפנת מדיה" + +#: ../gtk/call_statistics.ui.h:8 +msgid "Round trip time" +msgstr "" + +#: ../gtk/call_statistics.ui.h:9 +#, fuzzy msgid "Call statistics and information" msgstr "מידע איש קשר" @@ -1475,20 +1485,80 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "9 (סעפ)" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "8 (צק)" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "7 (רשת)" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "6 (זחט)" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5 (יכל)" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "4 (מנ)" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "3 (אבג)" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "2 (דהו)" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "ננטשה" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "הסתיימה" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "הוחמצה" # needs to be tested -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1503,24 +1573,24 @@ msgstr "" "מצב: %s\n" "משך: %i mn %i sec\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "קריאה יוצאת" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "מוכן" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "מחפש כעת עבור יעד מספר טלפון..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "לא ניתן לפתור את מספר זה." # לרוב -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1528,49 +1598,49 @@ msgstr "" "לא ניתן היה לפענח את הכתובת שניתנה. כתובת sip בדרך כלל נראית כך: sip:" "user@domain" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "מתקשר כעת" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 msgid "Could not call" msgstr "לא ניתן להתקשר" # מספר השיחות המקבילות המרבי -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "הגענו אל המספר המרבי של שיחות מקבילות, עמך הסליחה" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 msgid "is contacting you" msgstr "מתקשר/ת אליך" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr " ומבקש/ת מענה אוטומטי." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "" # פרמטרי קריאה -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "מתאים כעת פרמטרים של שיחה..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "מקושר." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 msgid "Call aborted" msgstr "קריאה בוטלה" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 msgid "Could not pause the call" msgstr "לא ניתן להשהות את השיחה" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." msgstr "משהה כעת שיחה נוכחית..." @@ -1677,40 +1747,40 @@ msgstr "" "זו צריכה להיראות כמו sip:username@proxydomain, למשל sip:alice@example.net" # בשם כ־ -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, c-format msgid "Could not login as %s" msgstr "לא ניתן להתחבר בזהות %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 msgid "Remote ringing." msgstr "צלצול מרוחק." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 msgid "Remote ringing..." msgstr "צלצול מרוחק..." # A SIP state -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "מדיה מוקדמת." -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, c-format msgid "Call with %s is paused." msgstr "שיחה עם %s מושהית." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "קריאה נענתה על ידי %s - בהמתנה." # renewed -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 msgid "Call resumed." msgstr "קריאה חודשה." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, c-format msgid "Call answered by %s." msgstr "קריאה נענתה על ידי %s." @@ -1718,88 +1788,89 @@ msgstr "קריאה נענתה על ידי %s." # לא תואם # אי תאימות # אי התאמה -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +#, fuzzy +msgid "Incompatible, check codecs or security settings..." msgstr "חוסר תאימות, נא לבדוק קודקים..." -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 #, fuzzy msgid "We have been resumed." msgstr "חזרנו..." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" # באופן מרוחק -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 #, fuzzy msgid "Call is updated by remote." msgstr "שיחה עודכנה מרחוק..." -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "קריאה הסתיימה." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "משתמש עסוק כעת." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "משתמש לא זמין זמנית." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "משתמש לא מעוניין שיפריעו לו." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "קריאה סורבה." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "אין תגובה." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "שגיאת פרוטוקול." -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 msgid "Redirected" msgstr "מכוון מחדש" # לא תואם # אי תאימות # אי התאמה -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 #, fuzzy msgid "Incompatible media parameters." msgstr "חוסר תאימות, נא לבדוק קודקים..." -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 msgid "Call failed." msgstr "קריאה נכשלה." # הרשמה אצל %s הושלמה בהצלחה. -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "רישום אצל %s הושלם בהצלחה." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, c-format msgid "Unregistration on %s done." msgstr "אי רישום אצל %s סוים." # Pas de réponse # no response in defined time -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "אין היענות תוך זמן מוגדר" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, c-format msgid "Registration on %s failed: %s" msgstr "רישום אצל %s נכשל: %s" @@ -1810,20 +1881,23 @@ msgid "Authentication token is %s" msgstr "אות האימות הינה %s" # האם כדאי לחקות את הטלפונים הניידים? שיחות של נענו -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "החמצת שיחה %i." msgstr[1] "החמצת %i שיחות." +#~ msgid "by %s" +#~ msgstr "מאת %s" + +#~ msgid "Keypad" +#~ msgstr "לוח מקשים" + # שוחחו #~ msgid "Chat with %s" #~ msgstr "שיחה עם %s" -#~ msgid "Contacts" -#~ msgstr "אנשי קשר" - #~ msgid "Enable video" #~ msgstr "הפעל וידאו" @@ -1924,9 +1998,6 @@ msgstr[1] "החמצת %i שיחות." #~ msgid "Register at startup" #~ msgstr "S'enregistrer au démarrage" -#~ msgid "Ports" -#~ msgstr "Ports utilisés" - #~ msgid "Sorry, you have to pause or stop the current call first !" #~ msgstr "Désolé, vous devez d'abord mettre en attente l'appel en cours." diff --git a/po/hu.po b/po/hu.po index 0367b7d16..819bb2210 100644 --- a/po/hu.po +++ b/po/hu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2007-12-14 11:12+0100\n" "Last-Translator: \n" "Language-Team: LANGUAGE \n" @@ -17,57 +17,57 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "megszakítva" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 #, fuzzy msgid "Missed" msgstr "elhibázva" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "line" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "" @@ -76,42 +76,42 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Nemtalálható a pixmap fájl: %s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, fuzzy, c-format msgid "Call with %s" msgstr "Chat-elés %s -el" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -120,245 +120,245 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 #, fuzzy msgid "Call error" msgstr "Linphone - Híváselőzmények" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Hívás vége" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Beérkező hívás" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 #, fuzzy msgid "Decline" msgstr "line" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, fuzzy msgid "Call paused" msgstr "megszakítva" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Kapcsolatilista" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "Egy ingyenes SIP video-telefon" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 #, fuzzy msgid "Add to addressbook" msgstr "Címjegyzék" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "Jelenlét státusz" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Név" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" msgstr "Hivás előzmények" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 #, fuzzy msgid "Chat" msgstr "Chat szoba" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, fuzzy, c-format msgid "Call %s" msgstr "Hivás előzmények" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "Kapcsolatinformációk szerkesztése" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "Érték (Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "Állapot" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "Min bitrate (kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "Paraméterek" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Engedélyezve" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Tiltva" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "Hozzáférés" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "Nincs" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -402,282 +402,325 @@ msgid_plural "Found %i contacts" msgstr[0] "" msgstr[1] "" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 #, fuzzy msgid "Username:" msgstr "felhasználónév:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 #, fuzzy msgid "Password:" msgstr "jelszó:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 #, fuzzy msgid "Username*" msgstr "felhasználónév:" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 #, fuzzy msgid "Password*" msgstr "jelszó:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" msgstr "felhasználónév:" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" msgstr "jelszó:" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "" -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" msgstr "" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, fuzzy, c-format msgid "Call #%i" msgstr "Hivás előzmények" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" msgstr "" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "Hívás elutasítva" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "Átirányítva idw %s..." -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "Stun keresés folyamatban..." + +#: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "Nem érhető el információ" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "Hívás elutasítva" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 #, fuzzy msgid "Calling..." msgstr "Kapcsolatilista" -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 #, fuzzy msgid "Incoming call" msgstr "Beérkező hívás" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 #, fuzzy msgid "In call" msgstr "Kapcsolatilista" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 #, fuzzy msgid "Paused call" msgstr "Kapcsolatilista" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 #, fuzzy msgid "Call ended." msgstr "Hívás vége" -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "Hívás elutasítva" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -702,226 +745,167 @@ msgid "label" msgstr "" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 #, fuzzy msgid "In call" msgstr "Beérkező hívás" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 #, fuzzy msgid "Duration" msgstr "Információk" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 #, fuzzy msgid "Enable self-view" msgstr "Video engedélyezés" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 #, fuzzy msgid "_Help" msgstr "Help" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 msgid "Account assistant" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 #, fuzzy msgid "SIP address or phone number:" msgstr "Gépeld ide a sip címet vagy a telefonszámot" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +#, fuzzy +msgid "Contacts" +msgstr "Kapcsolódás" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Szerkesztés" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "1" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contacts from directory" msgstr "Kapcsolatiinformáció" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Add contact" msgstr "Kapcsolatinformációk szerkesztése" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "Recent calls" msgstr "Beérkező hívás" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 #, fuzzy msgid "My current identity:" msgstr "SIP azonosító:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 #, fuzzy msgid "Username" msgstr "felhasználónév:" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 #, fuzzy msgid "Password" msgstr "jelszó:" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Automatically log me in" msgstr "Automatikus valós hostnév megállapítása" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Login information" msgstr "Kapcsolatiinformáció" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 #, fuzzy msgid "Welcome !" msgstr "Kapcsolatilista" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 #, fuzzy msgid "Online users" msgstr "Elérhető" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 #, fuzzy msgid "Default" msgstr "SIP azonosító:" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1080,6 +1064,10 @@ msgstr "Audio kodekek" msgid "Video codecs" msgstr "Audio kodekek" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "" + #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" msgstr "" @@ -1118,231 +1106,239 @@ msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:23 -msgid "Direct connection to the Internet" +msgid "Network protocol and ports" msgstr "" #: ../gtk/parameters.ui.h:24 -msgid "Behind NAT / Firewall (specify gateway IP below)" +msgid "Direct connection to the Internet" msgstr "" #: ../gtk/parameters.ui.h:25 +msgid "Behind NAT / Firewall (specify gateway IP below)" +msgstr "" + +#: ../gtk/parameters.ui.h:26 #, fuzzy msgid "Public IP address:" msgstr "Sip cím:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "" + +#: ../gtk/parameters.ui.h:30 #, fuzzy msgid "Stun server:" msgstr "Hang eszköz" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 #, fuzzy msgid "NAT and Firewall" msgstr "Kapcsolatilista" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 #, fuzzy msgid "Network settings" msgstr "Hálózat" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 #, fuzzy msgid "Ring sound:" msgstr "Csengőhang:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 #, fuzzy msgid "Capture device:" msgstr "Felvevő hang eszköz:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 #, fuzzy msgid "Ring device:" msgstr "Csengőhang forrás:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 #, fuzzy msgid "Playback device:" msgstr "Lejátszó hang eszköz:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 #, fuzzy msgid "Audio" msgstr "Kapcsolatilista" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 #, fuzzy msgid "Video input device:" msgstr "Hang eszköz" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 #, fuzzy msgid "Video" msgstr "Kapcsolatilista" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 #, fuzzy msgid "Your username:" msgstr "felhasználónév:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 #, fuzzy msgid "Your resulting SIP address:" msgstr "Saját sip cím:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 #, fuzzy msgid "Default identity" msgstr "SIP azonosító:" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Eltávolítás" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 #, fuzzy msgid "Proxy accounts" msgstr "Kapcsolatilista" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 #, fuzzy msgid "Privacy" msgstr "Kapcsolatilista" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Engedélyezés" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Tiltás" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 #, fuzzy msgid "Codecs" msgstr "Kapcsolatilista" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 #, fuzzy msgid "Upload speed limit in Kbit/sec:" msgstr "Feltöltési sávszélesség (kbit/sec):" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 #, fuzzy msgid "Download speed limit in Kbit/sec:" msgstr "Letöltési sávszélesség (kbit/sec):" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 #, fuzzy msgid "Codecs" msgstr "Kodekek" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 #, fuzzy msgid "Language" msgstr "Kapcsolatilista" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 #, fuzzy msgid "Level" msgstr "Kapcsolatilista" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 #, fuzzy msgid "User interface" msgstr "felhasználónév:" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 #, fuzzy msgid "Done" msgstr "Elveszítve" @@ -1410,7 +1406,7 @@ msgid "Audio IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "" #: ../gtk/call_statistics.ui.h:6 @@ -1418,6 +1414,15 @@ msgid "Video IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +#, fuzzy +msgid "Round trip time" +msgstr "Hang beállítások" + +#: ../gtk/call_statistics.ui.h:9 #, fuzzy msgid "Call statistics and information" msgstr "Kapcsolatiinformáció" @@ -1442,19 +1447,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "megszakítva" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "befejezve" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "elhibázva" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1469,74 +1534,74 @@ msgstr "" "Állapot: %s\n" "Időtartam: %i perc %i másodperc\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "Kimenő hívás" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "Kész" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "Telefonszám-cél keresése..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "Nem sikkerült értelmezni a számot." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "" "Az adott szám nem értelmezhető. Egy sip cím általában így néz ki: user@domain" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "Kapcsolódás" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 #, fuzzy msgid "Could not call" msgstr "nem sikerült hívni" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 #, fuzzy msgid "is contacting you" msgstr "kapcsolatba lép veled." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Kapcsolódva." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 #, fuzzy msgid "Call aborted" msgstr "megszakítva" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 #, fuzzy msgid "Could not pause the call" msgstr "nem sikerült hívni" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 #, fuzzy msgid "Pausing the current call..." msgstr "nem sikerült hívni" @@ -1638,122 +1703,122 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, fuzzy, c-format msgid "Could not login as %s" msgstr "Nemtalálható a pixmap fájl: %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 #, fuzzy msgid "Remote ringing." msgstr "Távoli szolgáltatások" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 #, fuzzy msgid "Remote ringing..." msgstr "Távoli szolgáltatások" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "Korai médiák." -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Chat-elés %s -el" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 #, fuzzy msgid "Call resumed." msgstr "Hívás vége" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "Hívás vagy\n" "Válasz" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "A hívás befejezve." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "A felhasználó foglalt." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "A felhasználó ideiglenesen nem elérhető" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "A felhasználó nem akarja, hogy zavarják." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "Hívás elutasítva" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 #, fuzzy msgid "No response." msgstr "időtúllépés után nincs válasz" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 #, fuzzy msgid "Redirected" msgstr "Átirányítva idw %s..." -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 #, fuzzy msgid "Call failed." msgstr "Hívás elutasítva" -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "A regisztáció a %s -n sikerült." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "A regisztáció a %s -n sikerült." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "időtúllépés után nincs válasz" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, c-format msgid "Registration on %s failed: %s" msgstr "A regisztáció a %s -n nem sikerült: %s" @@ -1763,7 +1828,7 @@ msgstr "A regisztáció a %s -n nem sikerült: %s" msgid "Authentication token is %s" msgstr "Hitelesítési információ" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, fuzzy, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1781,10 +1846,6 @@ msgstr[1] "Van %i elhibázott hivás." #~ msgid "Confirmation" #~ msgstr "Információk" -#, fuzzy -#~ msgid "Contacts" -#~ msgstr "Kapcsolódás" - #, fuzzy #~ msgid "Enable video" #~ msgstr "Engedélyezve" @@ -1833,10 +1894,6 @@ msgstr[1] "Van %i elhibázott hivás." #~ msgid "gtk-close" #~ msgstr "Kapcsolódva." -#, fuzzy -#~ msgid "Ports" -#~ msgstr "Kapcsolatilista" - #~ msgid "" #~ "Your machine appears to be connected to an IPv6 network. By default " #~ "linphone always uses IPv4. Please update your configuration if you want " @@ -2164,9 +2221,6 @@ msgstr[1] "Van %i elhibázott hivás." #~ msgid "Listen" #~ msgstr "Hallgatás" -#~ msgid "Sound properties" -#~ msgstr "Hang beállítások" - #~ msgid "Run sip user agent on port:" #~ msgstr "SIP felhasználó ügynök által használt port:" @@ -2200,9 +2254,6 @@ msgstr[1] "Van %i elhibázott hivás." #~ "Figyelem: A pirosban lévő kodekek nem használhatók a jelenlegi " #~ "internetkapcsolattal." -#~ msgid "No information availlable" -#~ msgstr "Nem érhető el információ" - #~ msgid "Codec information" #~ msgstr "Kodekinformáció" diff --git a/po/it.po b/po/it.po index 135faa6cc..9e9a1183d 100644 --- a/po/it.po +++ b/po/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Linphone 3.2.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2002-10-15 HO:MI+ZONE\n" "Last-Translator: Matteo Piazza \n" "Language-Team: it \n" @@ -16,57 +16,57 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "annullato" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 #, fuzzy msgid "Missed" msgstr "mancante" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "Rifiuta" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 #, fuzzy msgid "Me" msgstr "" @@ -78,42 +78,42 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, fuzzy, c-format msgid "Call with %s" msgstr "Chat con %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -125,242 +125,242 @@ msgstr "" "veda il tuo stato o aggiungerlo alla tua lista dei contatti Se rispondi no " "questo utente sarà momentaneamente bloccato." -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "Prego inserire la password per username %s e dominio %s" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 #, fuzzy msgid "Call error" msgstr "Cronologia" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Chiamata terminata" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Chimata in entrata" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 msgid "Decline" msgstr "Rifiuta" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, fuzzy msgid "Call paused" msgstr "annullato" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Porte" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "Presenza" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nome" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" msgstr "Chiamata %s" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "Cerca contatti nella directory %s" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "Contatto SIP non valido" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "Chiamata %s" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "Invia testo a %s" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, c-format msgid "Edit contact '%s'" msgstr "Modifica contatto %s" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "Elimina contatto %s" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "Aggiungi nuovo contatto dalla directory %s" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "Stato" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "Bitrate Min (kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "Parametri" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Attivato" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Disattivato" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "Account" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "Inglese" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "Francese" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "Svedese" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "Italiano" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "Spagnolo" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "Polacco" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "Tedesco" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "Russo" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "Giapponese" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "Olandese" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "Ungherese" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "Ceco" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Riavviare il software per utilizzare la nuova lingua selezionata" -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -404,7 +404,7 @@ msgid_plural "Found %i contacts" msgstr[0] "Trovato %i contatto" msgstr[1] "Trovato %i contatti" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." @@ -412,278 +412,320 @@ msgstr "" "Benvenuti !\n" "La procedura vi aiutera a configurare un account SIP." -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 #, fuzzy msgid "Create an account on linphone.org" msgstr "Creare un account scegliendo l'username" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 #, fuzzy msgid "I have already a linphone.org account and I just want to use it" msgstr "Ho gia un account e voglio usarlo" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 #, fuzzy msgid "I have already a sip account and I just want to use it" msgstr "Ho gia un account e voglio usarlo" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 msgid "Username:" msgstr "Manuale utente" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" msgstr "Password:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 #, fuzzy msgid "Username*" msgstr "Username" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 #, fuzzy msgid "Password*" msgstr "Password" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" msgstr "Manuale utente" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" msgstr "Password:" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "Grazie. Il tuo account è configurato e pronto all'uso" -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "Benvenuto nel configuratore di account" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "Configuratore di account" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 #, fuzzy msgid "Configure your account (step 1/1)" msgstr "Configurazione SIP account" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 #, fuzzy msgid "Terminating" msgstr "Termina chiamata" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, fuzzy, c-format msgid "Call #%i" msgstr "Chiamata %s" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" msgstr "" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "Filtro ICE" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "Rediretto verso %s..." -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "Ricerca Stun in progresso ..." + +#: ../gtk/incall_view.c:242 +msgid "uPnp not available" +msgstr "" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "Filtro ICE" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 #, fuzzy msgid "Calling..." msgstr "Linguaggio" -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 #, fuzzy msgid "Incoming call" msgstr "Chimata in entrata" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 #, fuzzy msgid "In call" msgstr "In chiamata con" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 #, fuzzy msgid "Paused call" msgstr "Termina chiamata" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 msgid "Call ended." msgstr "Chiamata terminata." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "Chiamata rifiutata" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -707,221 +749,162 @@ msgid "label" msgstr "etichetta" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 msgid "In call" msgstr "In chiamata" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 msgid "Duration" msgstr "Durata" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 msgid "Enable self-view" msgstr "Self-view abilitato" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 #, fuzzy msgid "Show debug window" msgstr "Linphone debug window" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 #, fuzzy msgid "Account assistant" msgstr "Configuratore di account" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 msgid "SIP address or phone number:" msgstr "Indirizzo sip o numero." -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +#, fuzzy +msgid "Contacts" +msgstr "In connessione" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Aggiungi" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Edita" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "D" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "C" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "9" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "8" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "7" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "B" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "6" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "4" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "A" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "3" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "2" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "1" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contacts from directory" msgstr "Aggiungi nuovo contatto dalla directory %s" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Add contact" msgstr "Trovato %i contatto" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "Recent calls" msgstr "In chiamata" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 msgid "My current identity:" msgstr "Identità corrente" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Username" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Password" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "Connessione Internet:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "Login Automatico" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 msgid "Login information" msgstr "Credenziali di accesso" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 msgid "Welcome !" msgstr "Benvenuto !" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 #, fuzzy msgid "Online users" msgstr "" "Tutti gli utenti\n" "Utenti Online" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Fiber Channel" msgstr "" "ADSL\n" "Fibra Ottica" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 msgid "Default" msgstr "Default" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1078,6 +1061,10 @@ msgstr "" "Audio codecs\n" "Video codecs" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "C" + #: ../gtk/parameters.ui.h:8 #, fuzzy msgid "SIP (UDP)" @@ -1118,211 +1105,220 @@ msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "Video RTP/UDP" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "Audio RTP/UDP:" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:23 +msgid "Network protocol and ports" +msgstr "" + +#: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" msgstr "Connessione diretta a internet" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" msgstr "Dietro NAT / Firewall (IP del gateway)" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "Indirizzo ip pubblico:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Dietro NAT / Firewall (utilizza STUN)" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 #, fuzzy msgid "Behind NAT / Firewall (use ICE)" msgstr "Dietro NAT / Firewall (utilizza STUN)" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +#, fuzzy +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "Dietro NAT / Firewall (utilizza STUN)" + +#: ../gtk/parameters.ui.h:30 msgid "Stun server:" msgstr "Stun server:" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 msgid "NAT and Firewall" msgstr "NAT and Firewall" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 msgid "Network settings" msgstr "Impostazioni di rete" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 msgid "Ring sound:" msgstr "Suoneria:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "Dispositivo ALSA (optional):" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 msgid "Capture device:" msgstr "Dispositivo microfono:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 msgid "Ring device:" msgstr "Dispositivo squillo:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 msgid "Playback device:" msgstr "Dispositivo uscita audio:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "Attiva cancellazione eco" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 msgid "Audio" msgstr "Audio" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 msgid "Video input device:" msgstr "Dispositivo Video:" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "Risoluzione video preferita" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 msgid "Video" msgstr "Video" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "Impostazioni multimediali" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "" "questa sezione definisce il tuo indirizzo SIP se non hai account attivi" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "Nome visualizzato (es: Mario Rossi):" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 msgid "Your username:" msgstr "Username" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 msgid "Your resulting SIP address:" msgstr "Il tuo indirizzo sip:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 msgid "Default identity" msgstr "Identità di default" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Rimuovi" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 msgid "Proxy accounts" msgstr "Account proxy" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "Cancella tutte le password" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 msgid "Privacy" msgstr "Privacy" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "Gestici SIP Account" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Attivato" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Disattivato" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "0 sta per illimitato" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "Velocità massima in upload Kbit/sec:" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "Velocita massima in Dowload Kbit/sec" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "Gestione banda" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 msgid "Codecs" msgstr "Codec" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 msgid "Language" msgstr "Linguaggio" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 #, fuzzy msgid "Level" msgstr "Linguaggio" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 msgid "User interface" msgstr "Interfaccia utente" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 msgid "Done" msgstr "Fatto" @@ -1393,7 +1389,7 @@ msgid "Audio IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "" #: ../gtk/call_statistics.ui.h:6 @@ -1401,6 +1397,14 @@ msgid "Video IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +msgid "Round trip time" +msgstr "" + +#: ../gtk/call_statistics.ui.h:9 #, fuzzy msgid "Call statistics and information" msgstr "Contact informazioni" @@ -1426,19 +1430,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "D" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "9" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "8" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "7" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "B" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "6" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "4" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "A" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "3" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "2" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "annullato" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "comletato" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "mancante" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1453,23 +1517,23 @@ msgstr "" "Stato: %s\n" "Durata: %i mn %i sec\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "Chiamata in uscita" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "Pronto" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "Ricerca numero destinazione..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "Impossibile risolvere il numero." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1477,51 +1541,51 @@ msgstr "" "Errore nel formato del contatto sip. Usualmente un indirizzo appare sip:" "user@domain" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "In connessione" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 #, fuzzy msgid "Could not call" msgstr "chiamata fallita" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 #, fuzzy msgid "is contacting you" msgstr "ti sta conttatando." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Connessione" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 #, fuzzy msgid "Call aborted" msgstr "annullato" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 #, fuzzy msgid "Could not pause the call" msgstr "chiamata fallita" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 #, fuzzy msgid "Pausing the current call..." msgstr "Mostra chiamata corrente" @@ -1622,118 +1686,118 @@ msgstr "" "L'identità sip utilizza è invalida.\n" "Dovrebbre essere sip:username@proxydomain, esempio: sip:alice@example.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, c-format msgid "Could not login as %s" msgstr "impossibile login come %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 msgid "Remote ringing." msgstr "" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Chat con %s" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 #, fuzzy msgid "Call resumed." msgstr "Chiamata terminata" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "Chiamata terminata." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "Utente occupato" -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "Utente non disponibile" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "L'utente non vuole essere disturbato" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "Chiamata rifiutata" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 #, fuzzy msgid "No response." msgstr "timeout no risposta" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 #, fuzzy msgid "Redirected" msgstr "Rediretto verso %s..." -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 #, fuzzy msgid "Call failed." msgstr "Chiamata rifiutata" -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "Registrazione su %s attiva" -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, c-format msgid "Unregistration on %s done." msgstr "Unregistrazione su %s" -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "timeout no risposta" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrazione su %s fallita: %s" @@ -1743,7 +1807,7 @@ msgstr "Registrazione su %s fallita: %s" msgid "Authentication token is %s" msgstr "Linphone - Autenticazione richiesta" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1786,10 +1850,6 @@ msgstr[1] "" #~ msgid "Now ready !" #~ msgstr "Pronto !" -#, fuzzy -#~ msgid "Contacts" -#~ msgstr "In connessione" - #, fuzzy #~ msgid "Enable video" #~ msgstr "Attivato" @@ -1839,9 +1899,6 @@ msgstr[1] "" #~ msgid "Register at startup" #~ msgstr "Registra all'avvio" -#~ msgid "Ports" -#~ msgstr "Porte" - #~ msgid "ITU-G.711 alaw encoder" #~ msgstr "ITU-G.711 alaw encoder" diff --git a/po/ja.po b/po/ja.po index c2ed8c87d..e95879bb8 100644 --- a/po/ja.po +++ b/po/ja.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.10\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2003-01-21 00:05+9000\n" "Last-Translator: YAMAGUCHI YOSHIYA \n" "Language-Team: \n" @@ -18,56 +18,56 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "通話はキャンセルされました。" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 msgid "Missed" msgstr "" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "ライン入力" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "" @@ -76,42 +76,42 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "pixmapファイルが見つかりません %s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" msgstr "" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -120,247 +120,247 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 #, fuzzy msgid "Call error" msgstr "通話はキャンセルされました。" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 #, fuzzy msgid "Call ended" msgstr "通話は拒否されました。" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 #, fuzzy msgid "Decline" msgstr "ライン入力" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, fuzzy msgid "Call paused" msgstr "通話はキャンセルされました。" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "接続中" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 #, fuzzy msgid "Add to addressbook" msgstr "電話帳" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 #, fuzzy msgid "Presence status" msgstr "状態" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名前" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" msgstr "通話はキャンセルされました。" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "(接続するための情報がありません!)" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "状態" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "最低限のビットレート (kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "パラメーター" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "使用する" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "使用しない" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "Français" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "日本語" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "Magyar" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "čeština" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "简体中文" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 #, fuzzy msgid "None" msgstr "ありません。" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -404,281 +404,323 @@ msgid_plural "Found %i contacts" msgstr[0] "" msgstr[1] "" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 #, fuzzy msgid "Username:" msgstr "ユーザーマニュアル" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 #, fuzzy msgid "Password:" msgstr "パスワード" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 #, fuzzy msgid "Username*" msgstr "ユーザーマニュアル" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 #, fuzzy msgid "Password*" msgstr "パスワード" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" msgstr "ユーザーマニュアル" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" msgstr "パスワード" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "" -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" msgstr "" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, fuzzy, c-format msgid "Call #%i" msgstr "通話はキャンセルされました。" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" msgstr "" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "通話はキャンセルされました。" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 msgid "Direct" msgstr "" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +msgid "uPnP in progress" +msgstr "" + +#: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "特に情報はありません" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "通話はキャンセルされました。" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 #, fuzzy msgid "Calling..." msgstr "接続中" -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 #, fuzzy msgid "Incoming call" msgstr "接続中" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 #, fuzzy msgid "In call" msgstr "接続中" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 #, fuzzy msgid "Paused call" msgstr "接続中" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 #, fuzzy msgid "Call ended." msgstr "通話は拒否されました。" -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "通話はキャンセルされました。" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -703,224 +745,165 @@ msgid "label" msgstr "" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 #, fuzzy msgid "In call" msgstr "接続中" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 #, fuzzy msgid "Duration" msgstr "情報" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 #, fuzzy msgid "Enable self-view" msgstr "使用する" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 msgid "Account assistant" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 #, fuzzy msgid "SIP address or phone number:" msgstr "レジストラサーバーのSIPアドレス" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +#, fuzzy +msgid "Contacts" +msgstr "接続中" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "追加する" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "9" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "8" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "7" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "6" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "4" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "3" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "2" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "1" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contacts from directory" msgstr "コーデックの情報" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Add contact" msgstr "(接続するための情報がありません!)" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "Recent calls" msgstr "接続中" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 #, fuzzy msgid "My current identity:" msgstr "個人情報" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 #, fuzzy msgid "Username" msgstr "ユーザーマニュアル" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 #, fuzzy msgid "Password" msgstr "パスワード" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Login information" msgstr "コーデックの情報" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 #, fuzzy msgid "Welcome !" msgstr "接続中" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 #, fuzzy msgid "Online users" msgstr "ライン入力" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 #, fuzzy msgid "Default" msgstr "個人情報" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1077,6 +1060,10 @@ msgstr "オーディオコーデックのプロパティー" msgid "Video codecs" msgstr "オーディオコーデックのプロパティー" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "" + #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" msgstr "" @@ -1115,229 +1102,237 @@ msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:23 -msgid "Direct connection to the Internet" +msgid "Network protocol and ports" msgstr "" #: ../gtk/parameters.ui.h:24 -msgid "Behind NAT / Firewall (specify gateway IP below)" +msgid "Direct connection to the Internet" msgstr "" #: ../gtk/parameters.ui.h:25 +msgid "Behind NAT / Firewall (specify gateway IP below)" +msgstr "" + +#: ../gtk/parameters.ui.h:26 #, fuzzy msgid "Public IP address:" msgstr "Sipアドレス:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "" + +#: ../gtk/parameters.ui.h:30 #, fuzzy msgid "Stun server:" msgstr "使用するサウンドデバイス" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 #, fuzzy msgid "NAT and Firewall" msgstr "接続中" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 #, fuzzy msgid "Network settings" msgstr "ネットワーク" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 #, fuzzy msgid "Ring sound:" msgstr "録音する音源" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 #, fuzzy msgid "Capture device:" msgstr "使用するサウンドデバイス" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 #, fuzzy msgid "Ring device:" msgstr "使用するサウンドデバイス" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 #, fuzzy msgid "Playback device:" msgstr "使用するサウンドデバイス" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 #, fuzzy msgid "Audio" msgstr "接続中" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 #, fuzzy msgid "Video input device:" msgstr "使用するサウンドデバイス" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 #, fuzzy msgid "Video" msgstr "接続中" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 #, fuzzy msgid "Your username:" msgstr "ユーザーマニュアル" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 #, fuzzy msgid "Your resulting SIP address:" msgstr "あなたのSIPアドレス" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 #, fuzzy msgid "Default identity" msgstr "個人情報" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "削除する" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 #, fuzzy msgid "Proxy accounts" msgstr "接続中" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 #, fuzzy msgid "Privacy" msgstr "接続中" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "使用する" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "使用しない" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 #, fuzzy msgid "Codecs" msgstr "接続中" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 #, fuzzy msgid "Codecs" msgstr "コーデック" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 #, fuzzy msgid "Language" msgstr "接続中" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 #, fuzzy msgid "Level" msgstr "接続中" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 #, fuzzy msgid "User interface" msgstr "ユーザーマニュアル" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 #, fuzzy msgid "Done" msgstr "ありません。" @@ -1405,7 +1400,7 @@ msgid "Audio IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "" #: ../gtk/call_statistics.ui.h:6 @@ -1413,6 +1408,15 @@ msgid "Video IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +#, fuzzy +msgid "Round trip time" +msgstr "サウンドのプロパティー" + +#: ../gtk/call_statistics.ui.h:9 #, fuzzy msgid "Call statistics and information" msgstr "コーデックの情報" @@ -1437,19 +1441,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "9" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "8" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "7" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "6" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "4" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "3" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "2" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1459,24 +1523,24 @@ msgid "" "Duration: %i mn %i sec\n" msgstr "" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 #, fuzzy msgid "Ready" msgstr "準備完了。" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "" -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 #, fuzzy msgid "" "Could not parse given sip address. A sip url usually looks like sip:" @@ -1485,51 +1549,51 @@ msgstr "" "SIPアドレスの形式エラーです。SIPアドレスは、のような" "形式です。" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 #, fuzzy msgid "Contacting" msgstr "接続中" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 #, fuzzy msgid "Could not call" msgstr "pixmapファイルが見つかりません %s" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 #, fuzzy msgid "is contacting you" msgstr "から電話です。" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "接続しました。" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 #, fuzzy msgid "Call aborted" msgstr "通話はキャンセルされました。" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." msgstr "" @@ -1629,121 +1693,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, fuzzy, c-format msgid "Could not login as %s" msgstr "pixmapファイルが見つかりません %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 #, fuzzy msgid "Remote ringing." msgstr "登録中……" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 #, fuzzy msgid "Remote ringing..." msgstr "登録中……" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 -#, c-format -msgid "Call with %s is paused." -msgstr "" - #: ../coreapi/callbacks.c:365 #, c-format +msgid "Call with %s is paused." +msgstr "" + +#: ../coreapi/callbacks.c:378 +#, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 #, fuzzy msgid "Call resumed." msgstr "通話は拒否されました。" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "電話をかける\n" "電話に出る" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 #, fuzzy msgid "Call terminated." msgstr "通話は拒否されました。" -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "ユーザーはビジーです" -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "ユーザーは、今出られません。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "ユーザーは手が離せないようです。" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "通話は拒否されました。" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 #, fuzzy msgid "Call failed." msgstr "通話はキャンセルされました。" -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, fuzzy, c-format msgid "Registration on %s successful." msgstr "登録しました。" -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "登録しました。" -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "登録しました。" @@ -1753,7 +1817,7 @@ msgstr "登録しました。" msgid "Authentication token is %s" msgstr "コーデックの情報" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1764,10 +1828,6 @@ msgstr[1] "" #~ msgid "Confirmation" #~ msgstr "情報" -#, fuzzy -#~ msgid "Contacts" -#~ msgstr "接続中" - #, fuzzy #~ msgid "Enable video" #~ msgstr "使用する" @@ -1808,10 +1868,6 @@ msgstr[1] "" #~ msgid "gtk-close" #~ msgstr "接続しました。" -#, fuzzy -#~ msgid "Ports" -#~ msgstr "接続中" - #, fuzzy #~ msgid "_Modes" #~ msgstr "コーデック" @@ -1941,9 +1997,6 @@ msgstr[1] "" #~ msgid "Recording source:" #~ msgstr "録音する音源" -#~ msgid "Sound properties" -#~ msgstr "サウンドのプロパティー" - #~ msgid "Run sip user agent on port:" #~ msgstr "SIPユーザーエージェントが起動するポート" @@ -1975,10 +2028,6 @@ msgstr[1] "" #~ msgstr "" #~ "注意:赤い色のコーデックは、現在のネットワーク接続方法では使えません。" -#, fuzzy -#~ msgid "No information availlable" -#~ msgstr "特に情報はありません" - #~ msgid "Codec information" #~ msgstr "コーデックの情報" diff --git a/po/nb_NO.po b/po/nb_NO.po index 7ae0827eb..c1500d304 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2011-04-05 01:56+0200\n" "Last-Translator: Øyvind Sæther \n" "Language-Team: Norwegian Bokmål \n" @@ -18,57 +18,57 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "avbrutt" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 #, fuzzy msgid "Missed" msgstr "ubesvart" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "Avvis" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 #, fuzzy msgid "Me" msgstr "Skru mikrofonen av" @@ -78,31 +78,31 @@ msgstr "Skru mikrofonen av" msgid "Couldn't find pixmap file: %s" msgstr "Fant ikke pixmap fli: %s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "skriv logg-informasjon under kjøring" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "Start skjult i systemkurven, ikke vis programbildet." -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "address som skal ringes nå" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "besvarer innkommende samtaler automatisk om valgt" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -110,12 +110,12 @@ msgstr "" "Spesifiser arbeidsmappe (bør være base for installasjonen, f.eks: c:" "\\Programfiler\\Linphone)" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" msgstr "Ring med %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -128,7 +128,7 @@ msgstr "" "din kontaktliste?\n" "Hvis du svarer nei vil personen bli svartelyst midlertidig." -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" @@ -137,61 +137,61 @@ msgstr "" "Skriv inn ditt passord for brukernavn %s\n" " på domene %s:i>:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 #, fuzzy msgid "Call error" msgstr "Samtalehistorikk" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Samtale avsluttet" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Innkommende samtale" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "Svarer" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 msgid "Decline" msgstr "Avvis" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, fuzzy msgid "Call paused" msgstr "Samtale avbrutt" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Porter" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "Peker til nettsted" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "Linphone - en video Internet telefon" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "%s (Standard)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "Vi er overført til %s" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -199,175 +199,175 @@ msgstr "" "Klarte ikke å finne noe lydkort på denne datamaskinen.\n" "Du vil ikke kunne sende eller motta lydsamtaler." -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "Tilstedestatus" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Navn" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" msgstr "Ring %s" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "Søk i %s katalogen" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "Ugyldig SIP kontakt !" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "Ring %s" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "Send tekst til %s" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, c-format msgid "Edit contact '%s'" msgstr "Rediger kontakt '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "Slett kontakt '%s'" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "Legg til kontakt fra %s katalogen" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "Frekvens (Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "Status" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "Min. datahastighet (kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "Parametere" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "På" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Av" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "Konto" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "Engelsk" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "Fransk" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "Svensk" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "Italisensk" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "Spansk" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "Portugisisk" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "Polsk" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "Tysk" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "Russisk" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "Japansk" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "Nederlandsk" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "Ungarsk" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "Tjekkisk" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "Kinesisk" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Du må restarte linphone for at det nye språkvalget skal iverksettes." -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -411,7 +411,7 @@ msgid_plural "Found %i contacts" msgstr[0] "Fant kontakt %i" msgstr[1] "Hittat kontakt %i" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." @@ -419,276 +419,319 @@ msgstr "" "Velkommen\n" "Denne veiviseren vil hjelpe deg sette opp en SIP-konto for dine samtaler." -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 #, fuzzy msgid "Create an account on linphone.org" msgstr "Lag en konto ved å velge ett brukernavn" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 #, fuzzy msgid "I have already a linphone.org account and I just want to use it" msgstr "Jeg har allerede en brukerkonto og vil bruke den." -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 #, fuzzy msgid "I have already a sip account and I just want to use it" msgstr "Jeg har allerede en brukerkonto og vil bruke den." -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 msgid "Username:" msgstr "Brukernavn:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" msgstr "Passord:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 #, fuzzy msgid "Username*" msgstr "Brukernavn" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 #, fuzzy msgid "Password*" msgstr "Passord" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" msgstr "Brukernavn:" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" msgstr "Passord:" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "Takk. Ditt konto er nå satt opp og klart til bruk." -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "Velkommen til brukerkontoveiviseren" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "Brukerkontoveiviser" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 #, fuzzy msgid "Configure your account (step 1/1)" msgstr "Konfigurer en SIP konto" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 #, fuzzy msgid "Terminating" msgstr "Lägg på" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, fuzzy, c-format msgid "Call #%i" msgstr "Ring %s" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 #, fuzzy msgid "Not used" msgstr "Ikke funnet" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "ICE filter" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "Omdirigert" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "STUN oppslag pågår..." + +#: ../gtk/incall_view.c:242 +msgid "uPnp not available" +msgstr "" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "ICE filter" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 msgid "Calling..." msgstr "Ringer..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "00:00:00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 msgid "Incoming call" msgstr "Innkommende samtale" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In call" msgstr "I samtale med" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 msgid "Paused call" msgstr "Pauset samtale" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i:%02i:%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 msgid "Call ended." msgstr "Samtale avsluttet." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 #, fuzzy msgid "Transfer done." msgstr "Overfører" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "Overfører" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "Fortsett" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "Pause" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +#, fuzzy +msgid "(Paused)" +msgstr "Pause" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -712,212 +755,152 @@ msgid "label" msgstr "etikett" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "Overfører" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 msgid "In call" msgstr "I samtale" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 msgid "Duration" msgstr "Varighet" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "_Alternativer" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 msgid "Enable self-view" msgstr "Vis video av deg selv" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "_Hjelp" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "Vis avlusningsvindu" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "H_jemmeside" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "Sjekk _Oppdateringer" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 #, fuzzy msgid "Account assistant" msgstr "Brukerkontoveiviser" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 msgid "SIP address or phone number:" msgstr "Sip adresse eller telefonnummer:" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "Start en ny samtale" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +msgid "Contacts" +msgstr "Kontakter" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Legg til" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Rediger" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "D" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "C" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "9" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "8" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "7" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "B" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "6" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "4" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "A" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "3" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "2" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "1" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "Søk" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 msgid "Add contacts from directory" msgstr "Legg til kontakter fra katalogen" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 msgid "Add contact" msgstr "Legg til kontakt" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "Tastatur" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "Recent calls" msgstr "I samtale" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 msgid "My current identity:" msgstr "Min nåværende identitet:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Brukernavn" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Passord" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "Internet forbindelse:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "Logg meg på automatisk" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 msgid "Login information" msgstr "Innlogginsinformasjon" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 msgid "Welcome !" msgstr "Velkommen!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "Alle brukere" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 msgid "Online users" msgstr "Tilkoblede brukere" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "Fiber Kanal" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 msgid "Default" msgstr "Standard" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1077,6 +1060,10 @@ msgstr "Lyd kodek" msgid "Video codecs" msgstr "Video kodek" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "C" + #: ../gtk/parameters.ui.h:8 #, fuzzy msgid "SIP (UDP)" @@ -1117,209 +1104,218 @@ msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "Video RTP/UDP:" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "Lyd RTP/UDP:" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:23 +msgid "Network protocol and ports" +msgstr "" + +#: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" msgstr "Tilkoblet Internett direkte" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" msgstr "Bak NAT / Brannmur (spesifiser gateway IP under)" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "Offentlig IP-addresse:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Bak NAT / Brannmur (bruk STUN for å avgjøre)" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 #, fuzzy msgid "Behind NAT / Firewall (use ICE)" msgstr "Bak NAT / Brannmur (bruk STUN for å avgjøre)" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +#, fuzzy +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "Bak NAT / Brannmur (bruk STUN for å avgjøre)" + +#: ../gtk/parameters.ui.h:30 msgid "Stun server:" msgstr "STUN tjener:" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 msgid "NAT and Firewall" msgstr "NAT og Brannvegg" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 msgid "Network settings" msgstr "Nettverksinnstillinger" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 msgid "Ring sound:" msgstr "Ringelyd:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "Spesiell ALSA enhet (valgfritt):" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 msgid "Capture device:" msgstr "Mikrofonenhet:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 msgid "Ring device:" msgstr "Ringe-enhet:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 msgid "Playback device:" msgstr "Avspillingsenhet:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "Bruk ekko-kansellering" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 msgid "Audio" msgstr "Lyd" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 msgid "Video input device:" msgstr "Videoenhet:" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "Foretrukke video-oppløsning:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 msgid "Video" msgstr "Video" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "Multimediainnstillinger" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "Denne seksjonen velger SIP-addresse når du ikke bruker en SIP-konto" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "Vist navn (eks: Ola Nordmann):" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 msgid "Your username:" msgstr "Ditt brukernavn:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 msgid "Your resulting SIP address:" msgstr "Din resulterende SIP addresse:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 msgid "Default identity" msgstr "Standard identitet" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Fjern" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 msgid "Proxy accounts" msgstr "Proxy kontoer" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "Slett alle passord" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 msgid "Privacy" msgstr "Personvern" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "Behandle SIP-kontoer" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Aktiver" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Deaktiver" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 msgid "Codecs" msgstr "Kodeker" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "0 betyr \"ubegrenset\"" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "Maks opplastningshastighet i Kbit/sek:" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "Nedlastningsbegrensning i Kbit/sek:" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "Båndbreddekontrol" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 msgid "Codecs" msgstr "Kodek" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 msgid "Language" msgstr "Språk" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "Vis avanserte innstillinger" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 msgid "Level" msgstr "Nivå" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 msgid "User interface" msgstr "Brukergrensesnitt" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 msgid "Done" msgstr "Ferdig" @@ -1386,7 +1382,7 @@ msgid "Audio IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "" #: ../gtk/call_statistics.ui.h:6 @@ -1394,6 +1390,14 @@ msgid "Video IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +msgid "Round trip time" +msgstr "" + +#: ../gtk/call_statistics.ui.h:9 #, fuzzy msgid "Call statistics and information" msgstr "Kontaktinformasjon" @@ -1419,19 +1423,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "D" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "9" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "8" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "7" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "B" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "6" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "4" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "A" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "3" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "2" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "avbrutt" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "Fullført" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "ubesvart" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1446,23 +1510,23 @@ msgstr "" "Status: %s\n" "Lengde: %i min %i sek\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "Utgående samtale" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "Klar" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "Ser etter telefonnummer for destinasjonen..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "Kan ikke tilkoble dette nummeret." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1470,47 +1534,47 @@ msgstr "" "Klarer ikke å tolke angitt SIP-adresse. En SIP-adresse er vanligvis ut som " "sip: brukernavn@domenenavn" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "Tilknytter" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 msgid "Could not call" msgstr "Kunne ikke ringe" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Beklager, du har nådd maksimalt antall samtidige samtaler" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 msgid "is contacting you" msgstr "Kontakter deg." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr " og ba om autosvar." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "Endrer ringeparametre..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Tilkoblet" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 msgid "Call aborted" msgstr "Samtale avbrutt" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 msgid "Could not pause the call" msgstr "Kunne ikke pause samtalen" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." msgstr "Pauser nåværende samtale" @@ -1612,116 +1676,116 @@ msgstr "" "SIP adressen du har angitt er feil. Adressen bør se ut som sip: " "brukernavn@domenenavn, f.eks sip:ola@eksempel.no" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, c-format msgid "Could not login as %s" msgstr "Ikke ikke logge inn som %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 msgid "Remote ringing." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 #, fuzzy msgid "Remote ringing..." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "Tidlig media" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, c-format msgid "Call with %s is paused." msgstr "Samtalen med %s er pauset." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "Samtale besvart av %s - på vent." -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 msgid "Call resumed." msgstr "Samtale gjenopptatt." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, c-format msgid "Call answered by %s." msgstr "Samtale besvart av %s." -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 #, fuzzy msgid "We have been resumed." msgstr "Vi har blitt gjenopptatt..." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "Samtale avsluttet." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "Brukeren er opptatt." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "Brukeren er midlertidig ikke tilgjengelig." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "Brukeren vil ikke bli forstyrret." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "Samtale avvist." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "Ikke noe svar." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "Protokollfeil." -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 msgid "Redirected" msgstr "Omdirigert" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 msgid "Call failed." msgstr "Samtale feilet." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "Registrering hos %s lykkes." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, c-format msgid "Unregistration on %s done." msgstr "Avregistrering hos %s lykkes." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "ingen svar innen angitt tid" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrering hos %s mislykkes: %s" @@ -1731,13 +1795,16 @@ msgstr "Registrering hos %s mislykkes: %s" msgid "Authentication token is %s" msgstr "Autorisering kreves" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "Du har %i ubesvarte anrop." msgstr[1] "Du har %i missade samtal" +#~ msgid "Keypad" +#~ msgstr "Tastatur" + #~ msgid "Chat with %s" #~ msgstr "Chat med %s" @@ -1774,9 +1841,6 @@ msgstr[1] "Du har %i missade samtal" #~ msgid "Now ready !" #~ msgstr "Klar nå!" -#~ msgid "Contacts" -#~ msgstr "Kontakter" - #, fuzzy #~ msgid "Enable video" #~ msgstr "På" @@ -1850,9 +1914,6 @@ msgstr[1] "Du har %i missade samtal" #~ msgid "gtk-close" #~ msgstr "gtk-lukk" -#~ msgid "Ports" -#~ msgstr "Porter" - #~ msgid "Sorry, you have to pause or stop the current call first !" #~ msgstr "Beklager, du må pause eller avslutte den nåværende samtalen først !" diff --git a/po/nl.po b/po/nl.po index 84f297c20..926bd7bb6 100644 --- a/po/nl.po +++ b/po/nl.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: nl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2007-09-05 10:40+0200\n" "Last-Translator: Hendrik-Jan Heins \n" "Language-Team: Nederlands \n" @@ -20,57 +20,57 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "afgebroken" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 #, fuzzy msgid "Missed" msgstr "gemist" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "lijn" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "" @@ -79,42 +79,42 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Kon pixmap bestand %s niet vinden" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, fuzzy, c-format msgid "Call with %s" msgstr "Chat met %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -123,245 +123,245 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 #, fuzzy msgid "Call error" msgstr "Linphone - Oproepgeschiedenis" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Oproep beeindigd" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Inkomende oproep" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 #, fuzzy msgid "Decline" msgstr "lijn" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, fuzzy msgid "Call paused" msgstr "afgebroken" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Contactlijst" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "Een Vrije SIP video-telefoon" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 #, fuzzy msgid "Add to addressbook" msgstr "Adresboek" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "Aanwezigheidsstatus" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Naam" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" msgstr "Oproepgeschiedenis" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 #, fuzzy msgid "Chat" msgstr "Chat box" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, fuzzy, c-format msgid "Call %s" msgstr "Oproepgeschiedenis" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "Bewerk contactgegevens" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "Frequentie (Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "Status" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "Minimale bitrate (kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "Parameters" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Aan" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Uit" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "Account" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "Geen" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -405,282 +405,325 @@ msgid_plural "Found %i contacts" msgstr[0] "" msgstr[1] "" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 #, fuzzy msgid "Username:" msgstr "gebruikersnaam:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 #, fuzzy msgid "Password:" msgstr "wachtwoord:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 #, fuzzy msgid "Username*" msgstr "gebruikersnaam:" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 #, fuzzy msgid "Password*" msgstr "wachtwoord:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" msgstr "gebruikersnaam:" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" msgstr "wachtwoord:" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "" -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" msgstr "" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, fuzzy, c-format msgid "Call #%i" msgstr "Oproepgeschiedenis" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" msgstr "" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "Oproep geannuleerd." -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "Doorgeschakeld naar %s..." -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "STUN adres wordt opgezocht..." + +#: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "Geen informatie beschikbaar" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "Oproep geannuleerd." + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 #, fuzzy msgid "Calling..." msgstr "Contactlijst" -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 #, fuzzy msgid "Incoming call" msgstr "Inkomende oproep" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 #, fuzzy msgid "In call" msgstr "Contactlijst" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 #, fuzzy msgid "Paused call" msgstr "Contactlijst" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 #, fuzzy msgid "Call ended." msgstr "Oproep beeindigd" -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "Oproep geannuleerd." -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -705,227 +748,168 @@ msgid "label" msgstr "" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 #, fuzzy msgid "In call" msgstr "Inkomende oproep" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 #, fuzzy msgid "Duration" msgstr "Informatie" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 #, fuzzy msgid "Enable self-view" msgstr "Video aan" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 #, fuzzy msgid "_Help" msgstr "Help" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 msgid "Account assistant" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 #, fuzzy msgid "SIP address or phone number:" msgstr "Geef het SIP adres of telefoonnummer in" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +#, fuzzy +msgid "Contacts" +msgstr "Verbinden" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 #, fuzzy msgid "Add" msgstr "Adres" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Bewerken" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "1" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contacts from directory" msgstr "Contact informatie" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Add contact" msgstr "Bewerk contactgegevens" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "Recent calls" msgstr "Inkomende oproep" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 #, fuzzy msgid "My current identity:" msgstr "SIP-identiteit:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 #, fuzzy msgid "Username" msgstr "gebruikersnaam:" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 #, fuzzy msgid "Password" msgstr "wachtwoord:" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Automatically log me in" msgstr "Automatisch een geldige hostnaam raden" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Login information" msgstr "Contact informatie" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 #, fuzzy msgid "Welcome !" msgstr "Contactlijst" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 #, fuzzy msgid "Online users" msgstr "Aanwezig" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 #, fuzzy msgid "Default" msgstr "SIP-identiteit:" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1084,6 +1068,10 @@ msgstr "Video codecs" msgid "Video codecs" msgstr "Video codecs" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "" + #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" msgstr "" @@ -1122,231 +1110,239 @@ msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:23 -msgid "Direct connection to the Internet" +msgid "Network protocol and ports" msgstr "" #: ../gtk/parameters.ui.h:24 -msgid "Behind NAT / Firewall (specify gateway IP below)" +msgid "Direct connection to the Internet" msgstr "" #: ../gtk/parameters.ui.h:25 +msgid "Behind NAT / Firewall (specify gateway IP below)" +msgstr "" + +#: ../gtk/parameters.ui.h:26 #, fuzzy msgid "Public IP address:" msgstr "SIP-adres:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "" + +#: ../gtk/parameters.ui.h:30 #, fuzzy msgid "Stun server:" msgstr "Geluidsapparaat" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 #, fuzzy msgid "NAT and Firewall" msgstr "Contactlijst" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 #, fuzzy msgid "Network settings" msgstr "Netwerk" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 #, fuzzy msgid "Ring sound:" msgstr "Belgeluid:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 #, fuzzy msgid "Capture device:" msgstr "Geluidsapparaat gebruiken:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 #, fuzzy msgid "Ring device:" msgstr "Geluidsapparaat gebruiken:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 #, fuzzy msgid "Playback device:" msgstr "Geluidsapparaat gebruiken:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 #, fuzzy msgid "Audio" msgstr "Contactlijst" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 #, fuzzy msgid "Video input device:" msgstr "Geluidsapparaat" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 #, fuzzy msgid "Video" msgstr "Contactlijst" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 #, fuzzy msgid "Your username:" msgstr "gebruikersnaam:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 #, fuzzy msgid "Your resulting SIP address:" msgstr "Uw SIP-adres:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 #, fuzzy msgid "Default identity" msgstr "SIP-identiteit:" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Verwijderen" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 #, fuzzy msgid "Proxy accounts" msgstr "Contactlijst" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 #, fuzzy msgid "Privacy" msgstr "Contactlijst" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Aan" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Uit" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 #, fuzzy msgid "Codecs" msgstr "Contactlijst" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 #, fuzzy msgid "Upload speed limit in Kbit/sec:" msgstr "Upload bandbreedte (kbit/sec):" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 #, fuzzy msgid "Download speed limit in Kbit/sec:" msgstr "Download bandbreedte (kbit/sec):" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 #, fuzzy msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 #, fuzzy msgid "Language" msgstr "Contactlijst" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 #, fuzzy msgid "Level" msgstr "Contactlijst" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 #, fuzzy msgid "User interface" msgstr "gebruikersnaam:" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 #, fuzzy msgid "Done" msgstr "Weg" @@ -1415,7 +1411,7 @@ msgid "Audio IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "" #: ../gtk/call_statistics.ui.h:6 @@ -1423,6 +1419,15 @@ msgid "Video IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +#, fuzzy +msgid "Round trip time" +msgstr "Geluidseigenschappen" + +#: ../gtk/call_statistics.ui.h:9 #, fuzzy msgid "Call statistics and information" msgstr "Contact informatie" @@ -1447,19 +1452,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "afgebroken" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "voltooid" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "gemist" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1474,23 +1539,23 @@ msgstr "" "Status: %s\n" "Tijdsduur: %i mins %i secs\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "Uitgaande oproep" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "Gereed." -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "Zoekt de lokatie van het telefoonnummer..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "Kon dit nummer niet vinden." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1498,51 +1563,51 @@ msgstr "" "Slecht geformuleerd SIP-adres. Een SIP-adres ziet er uit als sip:" "gebruikersnaam@domeinnaam" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "Verbinden" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 #, fuzzy msgid "Could not call" msgstr "Kon niet oproepen" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 #, fuzzy msgid "is contacting you" msgstr "belt u." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Verbonden." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 #, fuzzy msgid "Call aborted" msgstr "afgebroken" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 #, fuzzy msgid "Could not pause the call" msgstr "Kon niet oproepen" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 #, fuzzy msgid "Pausing the current call..." msgstr "Kon niet oproepen" @@ -1644,121 +1709,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, fuzzy, c-format msgid "Could not login as %s" msgstr "Kon pixmap bestand %s niet vinden" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 #, fuzzy msgid "Remote ringing." msgstr "Externe diensten" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 #, fuzzy msgid "Remote ringing..." msgstr "Externe diensten" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Chat met %s" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 #, fuzzy msgid "Call resumed." msgstr "Oproep beeindigd" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "Oproepen of\n" "beantwoorden" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "Oproep beeindigd." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "Gebruiker is bezet." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "Gebruiker is tijdelijk niet beschikbaar." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "De gebruiker wenst niet gestoord te worden." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "Oproep geweigerd." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 #, fuzzy msgid "Redirected" msgstr "Doorgeschakeld naar %s..." -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 #, fuzzy msgid "Call failed." msgstr "Oproep geannuleerd." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "Registratie op %s gelukt." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "Registratie op %s gelukt." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "Registratie op %s mislukt (time-out)." @@ -1768,7 +1833,7 @@ msgstr "Registratie op %s mislukt (time-out)." msgid "Authentication token is %s" msgstr "Authorisatie gegevens" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, fuzzy, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1786,10 +1851,6 @@ msgstr[1] "U heeft %i oproep(en) gemist." #~ msgid "Confirmation" #~ msgstr "Informatie" -#, fuzzy -#~ msgid "Contacts" -#~ msgstr "Verbinden" - #, fuzzy #~ msgid "Enable video" #~ msgstr "Aan" @@ -1838,10 +1899,6 @@ msgstr[1] "U heeft %i oproep(en) gemist." #~ msgid "gtk-close" #~ msgstr "Verbonden." -#, fuzzy -#~ msgid "Ports" -#~ msgstr "Contactlijst" - #~ msgid "" #~ "Your machine appears to be connected to an IPv6 network. By default " #~ "linphone always uses IPv4. Please update your configuration if you want " @@ -2172,9 +2229,6 @@ msgstr[1] "U heeft %i oproep(en) gemist." #~ msgid "Listen" #~ msgstr "Luisteren" -#~ msgid "Sound properties" -#~ msgstr "Geluidseigenschappen" - #~ msgid "Run sip user agent on port:" #~ msgstr "Start SIP gebruikerssysteem op poort:" @@ -2208,10 +2262,6 @@ msgstr[1] "U heeft %i oproep(en) gemist." #~ "Opmerking: Met rood weergegeven codecs zijn niet bruikbaar vanwege het " #~ "soort internetverbinding dat u heeft" -#, fuzzy -#~ msgid "No information availlable" -#~ msgstr "Geen informatie beschikbaar" - #~ msgid "Codec information" #~ msgstr "Codec informatie" diff --git a/po/pl.po b/po/pl.po index 419af8a98..7999a657d 100644 --- a/po/pl.po +++ b/po/pl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2003-08-22 12:50+0200\n" "Last-Translator: Robert Nasiadek \n" "Language-Team: Polski \n" @@ -16,56 +16,56 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "Połączenie odwołane." -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 msgid "Missed" msgstr "" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "linia" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "" @@ -74,42 +74,42 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Nie można znaleźć pixmapy: %s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" msgstr "" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -118,247 +118,247 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 #, fuzzy msgid "Call error" msgstr "Połączenie odwołane." -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 #, fuzzy msgid "Call ended" msgstr "Rozmowa odrzucona." -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 #, fuzzy msgid "Decline" msgstr "linia" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, fuzzy msgid "Call paused" msgstr "Połączenie odwołane." -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Dzwonie do " -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 #, fuzzy msgid "Add to addressbook" msgstr "Książka adresowa" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 #, fuzzy msgid "Presence status" msgstr "Obecność" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nazwa" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" msgstr "Połączenie odwołane." -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "(Brak informacji kontaktowych !)" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "Jakość (Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "Status" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "Min przepustowość (kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "Parametr" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Włączone" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Wyłączone" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 #, fuzzy msgid "None" msgstr "Brak." -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -402,281 +402,323 @@ msgid_plural "Found %i contacts" msgstr[0] "" msgstr[1] "" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 #, fuzzy msgid "Username:" msgstr "Podręcznik" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 #, fuzzy msgid "Password:" msgstr "Twoje hasło:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 #, fuzzy msgid "Username*" msgstr "Podręcznik" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 #, fuzzy msgid "Password*" msgstr "Twoje hasło:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" msgstr "Podręcznik" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" msgstr "Twoje hasło:" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "" -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" msgstr "" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, fuzzy, c-format msgid "Call #%i" msgstr "Połączenie odwołane." -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" msgstr "" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "Połączenie odwołane." -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 msgid "Direct" msgstr "" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +msgid "uPnP in progress" +msgstr "" + +#: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "Brak informacji" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "Połączenie odwołane." + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 #, fuzzy msgid "Calling..." msgstr "Dzwonie do " -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 #, fuzzy msgid "Incoming call" msgstr "Dzwonie do " -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 #, fuzzy msgid "In call" msgstr "Dzwonie do " -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 #, fuzzy msgid "Paused call" msgstr "Dzwonie do " -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 #, fuzzy msgid "Call ended." msgstr "Rozmowa odrzucona." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "Połączenie odwołane." -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -701,225 +743,166 @@ msgid "label" msgstr "" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 #, fuzzy msgid "In call" msgstr "Dzwonie do " -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 #, fuzzy msgid "Duration" msgstr "Informacja" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 #, fuzzy msgid "Enable self-view" msgstr "Włączone" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 msgid "Account assistant" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 #, fuzzy msgid "SIP address or phone number:" msgstr "Adres serwera rejestracji sip" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +#, fuzzy +msgid "Contacts" +msgstr "Dzwonie do " + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 #, fuzzy msgid "Add" msgstr "Adres" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "9" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "8" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "7" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "6" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "4" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "3" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "2" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "1" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contacts from directory" msgstr "Informacje o kodeku" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Add contact" msgstr "(Brak informacji kontaktowych !)" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "Recent calls" msgstr "Dzwonie do " -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 #, fuzzy msgid "My current identity:" msgstr "Tożsamość" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 #, fuzzy msgid "Username" msgstr "Podręcznik" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 #, fuzzy msgid "Password" msgstr "Twoje hasło:" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Login information" msgstr "Informacje o kodeku" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 #, fuzzy msgid "Welcome !" msgstr "Dzwonie do " -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 #, fuzzy msgid "Online users" msgstr "linia" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 #, fuzzy msgid "Default" msgstr "Tożsamość" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1076,6 +1059,10 @@ msgstr "Kodeki audio" msgid "Video codecs" msgstr "Kodeki audio" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "" + #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" msgstr "" @@ -1114,229 +1101,237 @@ msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:23 -msgid "Direct connection to the Internet" +msgid "Network protocol and ports" msgstr "" #: ../gtk/parameters.ui.h:24 -msgid "Behind NAT / Firewall (specify gateway IP below)" +msgid "Direct connection to the Internet" msgstr "" #: ../gtk/parameters.ui.h:25 +msgid "Behind NAT / Firewall (specify gateway IP below)" +msgstr "" + +#: ../gtk/parameters.ui.h:26 #, fuzzy msgid "Public IP address:" msgstr "Adres sip:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "" + +#: ../gtk/parameters.ui.h:30 #, fuzzy msgid "Stun server:" msgstr "Dźwięk" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 #, fuzzy msgid "NAT and Firewall" msgstr "Dzwonie do " -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 #, fuzzy msgid "Network settings" msgstr "Sieć" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 #, fuzzy msgid "Ring sound:" msgstr "Źródło nagrywania:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 #, fuzzy msgid "Capture device:" msgstr "Użyj tego urządzenia dźwięku:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 #, fuzzy msgid "Ring device:" msgstr "Użyj tego urządzenia dźwięku:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 #, fuzzy msgid "Playback device:" msgstr "Użyj tego urządzenia dźwięku:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 #, fuzzy msgid "Audio" msgstr "Dzwonie do " -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 #, fuzzy msgid "Video input device:" msgstr "Dźwięk" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 #, fuzzy msgid "Video" msgstr "Dzwonie do " -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 #, fuzzy msgid "Your username:" msgstr "Podręcznik" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 #, fuzzy msgid "Your resulting SIP address:" msgstr "Twój adres sip:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 #, fuzzy msgid "Default identity" msgstr "Tożsamość" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 -msgid "Remove" -msgstr "" - -#: ../gtk/parameters.ui.h:51 -#, fuzzy -msgid "Proxy accounts" -msgstr "Dzwonie do " - #: ../gtk/parameters.ui.h:52 -msgid "Erase all passwords" +msgid "Remove" msgstr "" #: ../gtk/parameters.ui.h:53 #, fuzzy -msgid "Privacy" +msgid "Proxy accounts" msgstr "Dzwonie do " #: ../gtk/parameters.ui.h:54 +msgid "Erase all passwords" +msgstr "" + +#: ../gtk/parameters.ui.h:55 +#, fuzzy +msgid "Privacy" +msgstr "Dzwonie do " + +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Włączony" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Wyłącz" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 #, fuzzy msgid "Codecs" msgstr "Dzwonie do " -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 #, fuzzy msgid "Codecs" msgstr "Kodeki" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 #, fuzzy msgid "Language" msgstr "Dzwonie do " -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 #, fuzzy msgid "Level" msgstr "Dzwonie do " -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 #, fuzzy msgid "User interface" msgstr "Podręcznik" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 #, fuzzy msgid "Done" msgstr "Brak." @@ -1404,7 +1399,7 @@ msgid "Audio IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "" #: ../gtk/call_statistics.ui.h:6 @@ -1412,6 +1407,15 @@ msgid "Video IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +#, fuzzy +msgid "Round trip time" +msgstr "Właściwości dźwięku" + +#: ../gtk/call_statistics.ui.h:9 #, fuzzy msgid "Call statistics and information" msgstr "Informacje o kodeku" @@ -1436,19 +1440,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "9" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "8" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "7" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "6" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "4" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "3" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "2" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1458,75 +1522,75 @@ msgid "" "Duration: %i mn %i sec\n" msgstr "" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 #, fuzzy msgid "Ready" msgstr "Gotowy." -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "" -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 #, fuzzy msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "Nie poprawny adres sip. Adres sip wygląda tak " -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 #, fuzzy msgid "Contacting" msgstr "Dzwonie do " -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 #, fuzzy msgid "Could not call" msgstr "Nie można znaleźć pixmapy: %s" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 #, fuzzy msgid "is contacting you" msgstr "dzwoni do Ciebie." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Połączony" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 #, fuzzy msgid "Call aborted" msgstr "Połączenie odwołane." -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." msgstr "" @@ -1626,121 +1690,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, fuzzy, c-format msgid "Could not login as %s" msgstr "Nie można znaleźć pixmapy: %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 #, fuzzy msgid "Remote ringing." msgstr "Rejestruje..." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 #, fuzzy msgid "Remote ringing..." msgstr "Rejestruje..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 -#, c-format -msgid "Call with %s is paused." -msgstr "" - #: ../coreapi/callbacks.c:365 #, c-format +msgid "Call with %s is paused." +msgstr "" + +#: ../coreapi/callbacks.c:378 +#, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 #, fuzzy msgid "Call resumed." msgstr "Rozmowa odrzucona." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "Zadzwoń lub\n" "Odpowiedz" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 #, fuzzy msgid "Call terminated." msgstr "Rozmowa odrzucona." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "Osoba jest zajęta." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "Osoba jest tymczasowo niedostępna." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "Osoba nie chce, aby jej przeszkadzać." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "Rozmowa odrzucona." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 #, fuzzy msgid "Call failed." msgstr "Połączenie odwołane." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, fuzzy, c-format msgid "Registration on %s successful." msgstr "Rejestracja powiodła się." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "Rejestracja powiodła się." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "Rejestracja powiodła się." @@ -1750,7 +1814,7 @@ msgstr "Rejestracja powiodła się." msgid "Authentication token is %s" msgstr "Informacje o kodeku" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1761,10 +1825,6 @@ msgstr[1] "" #~ msgid "Confirmation" #~ msgstr "Informacja" -#, fuzzy -#~ msgid "Contacts" -#~ msgstr "Dzwonie do " - #, fuzzy #~ msgid "Enable video" #~ msgstr "Włączone" @@ -1801,10 +1861,6 @@ msgstr[1] "" #~ msgid "gtk-close" #~ msgstr "Połączony" -#, fuzzy -#~ msgid "Ports" -#~ msgstr "Dzwonie do " - #, fuzzy #~ msgid "_Modes" #~ msgstr "Kodeki" @@ -1944,9 +2000,6 @@ msgstr[1] "" #~ msgid "Recording source:" #~ msgstr "Źródło nagrywania:" -#~ msgid "Sound properties" -#~ msgstr "Właściwości dźwięku" - #~ msgid "Run sip user agent on port:" #~ msgstr "Uruchom agenta sip na porcie:" @@ -1979,10 +2032,6 @@ msgstr[1] "" #~ "Uwaga: Czerwone kodeki nie mogą być użyte, ze względu na typTwojego " #~ "połącznia z internetem." -#, fuzzy -#~ msgid "No information availlable" -#~ msgstr "Brak informacji" - #~ msgid "Codec information" #~ msgstr "Informacje o kodeku" diff --git a/po/pt_BR.po b/po/pt_BR.po index 59cde92ef..9cd72ea90 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone-1.1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2006-07-11 23:30+0200\n" "Last-Translator: Rafael Caesar Lenzi \n" "Language-Team: pt_BR \n" @@ -18,57 +18,57 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "Abortado" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 #, fuzzy msgid "Missed" msgstr "Perdido" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "linha" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "" @@ -77,42 +77,42 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Não é possível achar arquivo pixmap: %s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, fuzzy, c-format msgid "Call with %s" msgstr "Bate-papo com %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -121,247 +121,247 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 #, fuzzy msgid "Call error" msgstr "Linphone - Histórico de chamadas" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 #, fuzzy msgid "Call ended" msgstr "Chamada cancelada." -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Camadas recebidas" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 #, fuzzy msgid "Decline" msgstr "linha" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, fuzzy msgid "Call paused" msgstr "Abortado" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Contatando " -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 #, fuzzy msgid "Add to addressbook" msgstr "Catálogo de endereços" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "Status de presença" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nome" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" msgstr "Histórico de chamadas" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 #, fuzzy msgid "Chat" msgstr "Sala de bate-papo" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, fuzzy, c-format msgid "Call %s" msgstr "Histórico de chamadas" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "Edicar informação de contato" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "Taxa (Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "Bitrate mínimo (kbits/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "Parâmetros" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Ativado" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Desativado" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 #, fuzzy msgid "Account" msgstr "Aceitar" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "Nenhum" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -405,282 +405,324 @@ msgid_plural "Found %i contacts" msgstr[0] "" msgstr[1] "" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." msgstr "" -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" msgstr "" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 msgid "I have already a linphone.org account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 msgid "I have already a sip account and I just want to use it" msgstr "" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 #, fuzzy msgid "Username:" msgstr "Usuário" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 #, fuzzy msgid "Password:" msgstr "Senha:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 #, fuzzy msgid "Username*" msgstr "Usuário" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 #, fuzzy msgid "Password*" msgstr "Senha:" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" msgstr "Usuário" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" msgstr "Senha:" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "" -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" msgstr "" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, fuzzy, c-format msgid "Call #%i" msgstr "Histórico de chamadas" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" msgstr "" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "Histórico de chamadas" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "Redirecionado para %s..." -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +msgid "uPnP in progress" +msgstr "" + +#: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "Informações não disponíveis" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "Histórico de chamadas" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 #, fuzzy msgid "Calling..." msgstr "Contatando " -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 #, fuzzy msgid "Incoming call" msgstr "Camadas recebidas" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 #, fuzzy msgid "In call" msgstr "Contatando " -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 #, fuzzy msgid "Paused call" msgstr "Contatando " -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 #, fuzzy msgid "Call ended." msgstr "Chamada cancelada." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "Histórico de chamadas" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -705,225 +747,166 @@ msgid "label" msgstr "" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 #, fuzzy msgid "In call" msgstr "Camadas recebidas" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 #, fuzzy msgid "Duration" msgstr "Informações" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 #, fuzzy msgid "Enable self-view" msgstr "Ativado" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 msgid "Account assistant" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 msgid "SIP address or phone number:" msgstr "" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +#, fuzzy +msgid "Contacts" +msgstr "Contatando " + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 #, fuzzy msgid "Add" msgstr "Endereço" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Editar" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contacts from directory" msgstr "Informação de contato" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Add contact" msgstr "Edicar informação de contato" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "Recent calls" msgstr "Camadas recebidas" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 #, fuzzy msgid "My current identity:" msgstr "Identificação SIP:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 #, fuzzy msgid "Username" msgstr "Usuário" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 #, fuzzy msgid "Password" msgstr "Senha:" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Automatically log me in" msgstr "Adquirir automaticamente um nome de servidor válido." -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Login information" msgstr "Informação de contato" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 #, fuzzy msgid "Welcome !" msgstr "Contatando " -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 #, fuzzy msgid "Online users" msgstr "linha" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 #, fuzzy msgid "Default" msgstr "Identificação SIP:" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1081,6 +1064,10 @@ msgstr "Codec's de áudio" msgid "Video codecs" msgstr "Codec's de áudio" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "" + #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" msgstr "" @@ -1119,229 +1106,237 @@ msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:23 -msgid "Direct connection to the Internet" +msgid "Network protocol and ports" msgstr "" #: ../gtk/parameters.ui.h:24 -msgid "Behind NAT / Firewall (specify gateway IP below)" +msgid "Direct connection to the Internet" msgstr "" #: ../gtk/parameters.ui.h:25 +msgid "Behind NAT / Firewall (specify gateway IP below)" +msgstr "" + +#: ../gtk/parameters.ui.h:26 #, fuzzy msgid "Public IP address:" msgstr "Endereço sip:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 msgid "Behind NAT / Firewall (use ICE)" msgstr "" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "" + +#: ../gtk/parameters.ui.h:30 #, fuzzy msgid "Stun server:" msgstr "Dispositivo de som" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 #, fuzzy msgid "NAT and Firewall" msgstr "Contatando " -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 #, fuzzy msgid "Network settings" msgstr "Rede" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 #, fuzzy msgid "Ring sound:" msgstr "Som do toque:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 #, fuzzy msgid "Capture device:" msgstr "Dispositivo de captura de som:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 #, fuzzy msgid "Ring device:" msgstr "Dispositivo de som" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 #, fuzzy msgid "Playback device:" msgstr "Dispositivo de som:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 #, fuzzy msgid "Audio" msgstr "Contatando " -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 #, fuzzy msgid "Video input device:" msgstr "Dispositivo de som" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 #, fuzzy msgid "Video" msgstr "Contatando " -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 #, fuzzy msgid "Your username:" msgstr "Usuário" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 #, fuzzy msgid "Your resulting SIP address:" msgstr "Seu endereço SIP:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 #, fuzzy msgid "Default identity" msgstr "Identificação SIP:" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Remover" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 #, fuzzy msgid "Proxy accounts" msgstr "Contatando " -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 #, fuzzy msgid "Privacy" msgstr "Contatando " -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Ativado" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Desativar" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 #, fuzzy msgid "Codecs" msgstr "Contatando " -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 #, fuzzy msgid "Codecs" msgstr "Codec's de áudio" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 #, fuzzy msgid "Language" msgstr "Contatando " -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 #, fuzzy msgid "Level" msgstr "Contatando " -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 #, fuzzy msgid "User interface" msgstr "Usuário" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 #, fuzzy msgid "Done" msgstr "Nenhum" @@ -1409,7 +1404,7 @@ msgid "Audio IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "" #: ../gtk/call_statistics.ui.h:6 @@ -1417,6 +1412,15 @@ msgid "Video IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +#, fuzzy +msgid "Round trip time" +msgstr "Propriedades de som" + +#: ../gtk/call_statistics.ui.h:9 #, fuzzy msgid "Call statistics and information" msgstr "Informação de contato" @@ -1441,19 +1445,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "Abortado" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "Competado" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "Perdido" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, fuzzy, c-format msgid "" "%s at %s\n" @@ -1467,74 +1531,74 @@ msgstr "" "Status: %s\n" "Duração: %i min %i seg\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "Chamadas efetuadas" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 #, fuzzy msgid "Ready" msgstr "Pronto." -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "Procurando por telefone de destino..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "Não foi possível encontrar este número." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 #, fuzzy msgid "Contacting" msgstr "Contatando " -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 #, fuzzy msgid "Could not call" msgstr "Não é possível achar arquivo pixmap: %s" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 #, fuzzy msgid "is contacting you" msgstr "está chamado você." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 #, fuzzy msgid "Call aborted" msgstr "Abortado" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." msgstr "" @@ -1624,121 +1688,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, fuzzy, c-format msgid "Could not login as %s" msgstr "Não é possível achar arquivo pixmap: %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 #, fuzzy msgid "Remote ringing." msgstr "Serviços remotos" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 #, fuzzy msgid "Remote ringing..." msgstr "Serviços remotos" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Bate-papo com %s" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 #, fuzzy msgid "Call resumed." msgstr "Chamada cancelada." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "Ligar ou\n" "atender" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "" -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "Usuário está ocupado." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "Usuário está temporáriamente indisponível." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 #, fuzzy msgid "Redirected" msgstr "Redirecionado para %s..." -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 #, fuzzy msgid "Call failed." msgstr "Histórico de chamadas" -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, fuzzy, c-format msgid "Registration on %s successful." msgstr "Registro em %s efetuado." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "Registro em %s efetuado." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "Registro falhou (tempo esgotado)." @@ -1748,7 +1812,7 @@ msgstr "Registro falhou (tempo esgotado)." msgid "Authentication token is %s" msgstr "Informações de autenticação" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, fuzzy, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1766,10 +1830,6 @@ msgstr[1] "Você perdeu %i ligação(ões)." #~ msgid "Confirmation" #~ msgstr "Informações" -#, fuzzy -#~ msgid "Contacts" -#~ msgstr "Contatando " - #, fuzzy #~ msgid "Enable video" #~ msgstr "Ativado" @@ -1810,10 +1870,6 @@ msgstr[1] "Você perdeu %i ligação(ões)." #~ msgid "gtk-close" #~ msgstr "Conectado." -#, fuzzy -#~ msgid "Ports" -#~ msgstr "Contatando " - #~ msgid "" #~ "Your machine appears to be connected to an IPv6 network. By default " #~ "linphone always uses IPv4. Please update your configuration if you want " @@ -1987,9 +2043,6 @@ msgstr[1] "Você perdeu %i ligação(ões)." #~ msgid "Listen" #~ msgstr "Escutar" -#~ msgid "Sound properties" -#~ msgstr "Propriedades de som" - #~ msgid "Run sip user agent on port:" #~ msgstr "Executar agente sip na porta:" @@ -2012,9 +2065,6 @@ msgstr[1] "Você perdeu %i ligação(ões)." #~ msgid "List of audio codecs, in order of preference:" #~ msgstr "Lista de codecs de audio, em ordem de preferência:" -#~ msgid "No information availlable" -#~ msgstr "Informações não disponíveis" - #~ msgid "Codec information" #~ msgstr "Informações sobre o codec" diff --git a/po/ru.po b/po/ru.po index 84e09cb04..a7fd4a832 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2010-01-22 18:43+0300\n" "Last-Translator: Maxim Prokopyev \n" "Language-Team: Russian \n" @@ -18,21 +18,25 @@ msgstr "" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "н/д" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "отмененный" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 #, fuzzy msgid "Missed" msgstr "пропущенный" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "Отклонить" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" @@ -40,7 +44,7 @@ msgstr[0] "%i минута" msgstr[1] "%i минуты" msgstr[2] "%i минут" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" @@ -48,7 +52,7 @@ msgstr[0] "%i секунда" msgstr[1] "%i секунды" msgstr[2] "%i секунд" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" @@ -57,11 +61,7 @@ msgstr "" "%s\t%s\tКачество: %s\n" "%s\t%s %s\t" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "н/д" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, fuzzy, c-format msgid "" "%s\t%s\t\n" @@ -70,11 +70,11 @@ msgstr "" "%s\t%s\tКачество: %s\n" "%s\t%s %s\t" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "Конференция" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "Я" @@ -83,33 +83,33 @@ msgstr "Я" msgid "Couldn't find pixmap file: %s" msgstr "Невозможно найти графический файл: %s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "" "Вывод некоторой отладочной информации на устройство стандартного вывода во " "время работы" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "путь к файлу для записи журнала работы." -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "Запускать только в системном лотке, не показывая главное окно" -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "адрес для звонка" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "автоматически принимать входящие вызовы, если включено" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -117,12 +117,12 @@ msgstr "" "Укажите рабочий каталог (должен содержать установленные файлы приложения, " "например: c:\\Program Files\\Linphone)" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" msgstr "Чат с %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -135,7 +135,7 @@ msgstr "" "его(её) в свой контактный лист?\n" "Если вы ответите Нет, этот человек будет временно заблокирован." -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" @@ -144,59 +144,59 @@ msgstr "" "Пожалуйста, введите пароль для пользователя %s\n" " в домене %s:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 msgid "Call error" msgstr "Ошибка вызова" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Разговор окончен" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Входящий вызов" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "Ответить" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 msgid "Decline" msgstr "Отклонить" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 msgid "Call paused" msgstr "Вызов приостановлен" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "со стороны: %s" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Порты" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "Ссылка на сайт" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "Linphone - видео-телефон для интернета" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "%s (По умолчанию)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "Мы переведены на %s" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -204,177 +204,177 @@ msgstr "" "На этом компьютере не обнаружено ни одной звуковой карты.\n" "Вы не сможете совершать или принимать аудио-вызовы." -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "Свободный SIP видео-телефон" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 msgid "Add to addressbook" msgstr "Добавить в адресную книгу" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "Статус присутствия" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Имя" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 msgid "Call" msgstr "Вызов" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 #, fuzzy msgid "Chat" msgstr "Комната чата" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "Поиск в директории %s" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "Неверный sip-контакт!" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "Набрать %s" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "Послать текст к %s" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, c-format msgid "Edit contact '%s'" msgstr "Редактировать контакт '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "Удалить контакт '%s'" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "Добавить новый контакт из директории '%s'" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "Частота (Гц)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "Статус" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "Минимальный битрейт (кбит/с)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "Параметры" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Включен" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Отключен" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "Учетная запись" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "Английский" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "Французский" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "Шведский" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "Итальянский" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "Испанский" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "Бразильский португальский" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "Польский" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "Немецкий" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "Русский" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "Японский" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "Нидерландский" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "Венгерский" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "Чешский" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "Китайский" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "Традиционный китайский" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "Норвежский" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" "Вы должны перезапустить Linphone для того, чтобы языковые настройки вступили " "в силу." -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "Нет" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "ZRTP" @@ -419,7 +419,7 @@ msgstr[0] "Найден %i контакт" msgstr[1] "Найдено %i контакта" msgstr[2] "Найдено %i контактов" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." @@ -427,72 +427,72 @@ msgstr "" "Добро пожаловать!\n" "Этот помощник поможет вам использовать учётную запись SIP для ваших звонков." -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" msgstr "Создать учётную запись на linphone.org" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 msgid "I have already a linphone.org account and I just want to use it" msgstr "" "У меня уже есть учётная запись на linphone.org и я хочу использовать её" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 msgid "I have already a sip account and I just want to use it" msgstr "У меня уже есть учётная запись SIP и я хочу использовать её" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "Введите ваше имя пользователя на linphone.org" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 msgid "Username:" msgstr "Имя пользователя:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" msgstr "Пароль:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "Введите информацию о вашей учётной записи" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 msgid "Username*" msgstr "Имя пользователя*" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 msgid "Password*" msgstr "Пароль*" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "Домен*" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "Прокси" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "(*) Обязательные поля" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 msgid "Username: (*)" msgstr "Имя пользователя: (*)" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 msgid "Password: (*)" msgstr "Пароль: (*)" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "Email: (*)" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "Подтвердите ваш пароль: (*)" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." @@ -501,11 +501,11 @@ msgstr "" "сервер недоступен.\n" "Вернитесь и попробуйте ещё раз." -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "Спасибо! Учетная запись успешно настроена и готова к использованию." -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" @@ -515,186 +515,230 @@ msgstr "" "только что выслали вам на электронную почту.\n" "Затем вернитесь и нажмите на кнопку Далее." -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "Добро пожаловать в помощник настройки учётной записи" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "Помощник настройки учётной записи" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" msgstr "Настройте свою учётную запись (шаг 1/1)" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "Введите ваше имя пользователя SIP (шаг 1/1)" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "Введи информация об учётной записи (шаг 1/2)" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "Проверка (шаг 2/2)" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "Ошибка" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" msgstr "Завершение" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, c-format msgid "Call #%i" msgstr "Вызов #%i" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "Перевести на #%i с %s" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 #, fuzzy msgid "Not used" msgstr "Не найден" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "ICE фильтр" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "Переадресован" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "Идет поиск Stun..." + +#: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "недоступно" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "ICE фильтр" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, fuzzy, c-format +msgid "%.3f seconds" +msgstr "%i секунда" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 msgid "Calling..." msgstr "Вызов..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 msgid "Incoming call" msgstr "Входящий вызов" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "хорошее" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "среднее" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "плохое" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "очень плохое" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "слишком плохое" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "недоступно" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "Защищено SRTP" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Защищено ZRTP - [токен: %s]" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "Не проверен" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "Проверен" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "В конференции" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In call" msgstr "Соединен с" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 msgid "Paused call" msgstr "Приостановленный вызов" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 msgid "Call ended." msgstr "Звонок закончен." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 #, fuzzy msgid "Transfer done." msgstr "Перевести" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "Перевести" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "Продолжить" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "Пауза" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +#, fuzzy +msgid "(Paused)" +msgstr "Пауза" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -718,210 +762,150 @@ msgid "label" msgstr "метка" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "Перевести" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 msgid "In call" msgstr "Вызов" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 msgid "Duration" msgstr "Продолжительность" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "Уровень качества звонка" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "_Настройки" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 msgid "Enable self-view" msgstr "Включить своё видео" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "_Помощь" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "Показать окно отладки" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "_Домашняя страница" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "Проверить _Обновления" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 msgid "Account assistant" msgstr "Помощник настройки учётной записи" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 msgid "SIP address or phone number:" msgstr "SIP-адрес или номер телефона:" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "Совершить новый вызов" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +msgid "Contacts" +msgstr "Контакты" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Добавить" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Редактировать" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "D" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "C" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "9" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "8" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "7" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "B" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "6" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "4" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "A" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "3" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "2" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "1" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "Поиск" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 msgid "Add contacts from directory" msgstr "Добавить контакты из директории" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 msgid "Add contact" msgstr "Добавить контакт" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "Номеронабиратель" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 msgid "Recent calls" msgstr "Недавние вызовы" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 msgid "My current identity:" msgstr "Мой текущий идентификатор:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Имя пользователя" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Пароль" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "Интернет-соединение:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "Входить автоматически" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 msgid "Login information" msgstr "Информация для входа" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 msgid "Welcome !" msgstr "Добро пожаловать!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "Все пользователи" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 msgid "Online users" msgstr "Пользователи в сети" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "Оптоволокно" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 msgid "Default" msgstr "По умолчанию" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1080,6 +1064,10 @@ msgstr "Аудио кодеки" msgid "Video codecs" msgstr "Видео кодеки" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "C" + #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" msgstr "SIP (UDP)" @@ -1117,180 +1105,190 @@ msgid "Media encryption type" msgstr "Тип шифрования потока" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "Туннель" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "Видео RTP/UDP:" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "Аудио RTP/UDP:" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "Туннель" + #: ../gtk/parameters.ui.h:22 +#, fuzzy +msgid "Media encryption is mandatory" +msgstr "Тип шифрования потока" + +#: ../gtk/parameters.ui.h:23 msgid "Network protocol and ports" msgstr "Протокол и порты" -#: ../gtk/parameters.ui.h:23 +#: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" msgstr "Прямое подключение к Интернету" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" msgstr "За NAT / брандмауэром (укажите IP-адрес шлюза ниже)" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "Внешний IP-адрес:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "За NAT / брандмауэром (использовать STUN)" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 #, fuzzy msgid "Behind NAT / Firewall (use ICE)" msgstr "За NAT / брандмауэром (использовать STUN)" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +#, fuzzy +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "За NAT / брандмауэром (использовать STUN)" + +#: ../gtk/parameters.ui.h:30 msgid "Stun server:" msgstr "Сервер STUN:" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 msgid "NAT and Firewall" msgstr "NAT и брандмауэр" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 msgid "Network settings" msgstr "Настройки сети" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 msgid "Ring sound:" msgstr "Звук звонка:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "Специальное устройство ALSA (необязательно):" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 msgid "Capture device:" msgstr "Устройство захвата:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 msgid "Ring device:" msgstr "Устройство звонка:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 msgid "Playback device:" msgstr "Устройство воспроизведения:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "Включить подавление эхо" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 msgid "Audio" msgstr "Звук" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 msgid "Video input device:" msgstr "Устройство захвата видео:" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "Предпочтительное разрешение видео:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 msgid "Video" msgstr "Видео" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "Настройки мультимедиа" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "" "Эта секция устанавливает ваш SIP-адрес, когда вы не используете SIP-аккаунт" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "Отображаемое имя (напр.: Иван Сидоров):" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 msgid "Your username:" msgstr "Имя пользователя:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 msgid "Your resulting SIP address:" msgstr "Результирующий SIP-адрес:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 msgid "Default identity" msgstr "Идентификатор по умолчанию" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "Мастер" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Удалить" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 msgid "Proxy accounts" msgstr "Учетные записи прокси" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "Стереть все пароли" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 msgid "Privacy" msgstr "Конфеденциальность" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "Управление учётными записями SIP" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Включить" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Выключить" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 msgid "Codecs" msgstr "Кодеки" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "0 означает \"безлимитный\"" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "Ограничение исходящего потока в кбит/сек:" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "Ограничение скорости входящего потока в кбит/сек" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "Включить адаптивный контроль скорости" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." @@ -1298,31 +1296,31 @@ msgstr "" "Адаптивное управление скоростью - это техника, позволяющая динамически " "определять доступную пропускную способность сети во время звонка." -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "Управление скоростью сети" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 msgid "Codecs" msgstr "Кодеки" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 msgid "Language" msgstr "Язык" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "Показывать расширенные настройки" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 msgid "Level" msgstr "Уровень" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 msgid "User interface" msgstr "Интерфейс пользователя" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 msgid "Done" msgstr "Готово" @@ -1390,7 +1388,7 @@ msgstr "" #: ../gtk/call_statistics.ui.h:5 #, fuzzy -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "Тип шифрования потока" #: ../gtk/call_statistics.ui.h:6 @@ -1399,6 +1397,16 @@ msgstr "" #: ../gtk/call_statistics.ui.h:7 #, fuzzy +msgid "Video Media connectivity" +msgstr "Тип шифрования потока" + +#: ../gtk/call_statistics.ui.h:8 +#, fuzzy +msgid "Round trip time" +msgstr "Настройки звука" + +#: ../gtk/call_statistics.ui.h:9 +#, fuzzy msgid "Call statistics and information" msgstr "Контактная информация" @@ -1423,19 +1431,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "D" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "9" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "8" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "7" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "B" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "6" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "4" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "A" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "3" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "2" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "отмененный" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "завершённый" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "пропущенный" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1450,23 +1518,23 @@ msgstr "" "Статус: %s\n" "Длительность: %i мин %i сек\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "Исходящий звонок" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "Готов" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "Поиск адреса для телефонного номера..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "Не могу найти этот номер." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1474,47 +1542,47 @@ msgstr "" "Не могу опознать sip адрес. SIP-URL обычно выглядит как sip:" "username@domainname" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "Соединение" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 msgid "Could not call" msgstr "Не удалось позвонить" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Извините, мы превысили максимальное количество одновременных вызовов" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 msgid "is contacting you" msgstr "пытается связаться с вами" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr " и ответил автоответчик." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "Изменение параметров вызова..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Соединён." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 msgid "Call aborted" msgstr "Вызов отменён" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 msgid "Could not pause the call" msgstr "Не удалось приостановить вызов" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." msgstr "Приостановление текущего вызова..." @@ -1617,117 +1685,118 @@ msgstr "" "Они должны выглядеть как sip:username@proxydomain, например such as sip:" "alice@example.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, c-format msgid "Could not login as %s" msgstr "Невозможно зайти как %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 msgid "Remote ringing." msgstr "Абонент вызывается." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 msgid "Remote ringing..." msgstr "Абонент вызывается..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "Гудки." -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, c-format msgid "Call with %s is paused." msgstr "Вызов %s приостановлен." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "Вызов отвечен %s - в ожидании." -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 msgid "Call resumed." msgstr "Разговор продолжен." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, c-format msgid "Call answered by %s." msgstr "Вызов отвечен %s." -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +#, fuzzy +msgid "Incompatible, check codecs or security settings..." msgstr "Несовместимо, проверьте кодеки..." -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 #, fuzzy msgid "We have been resumed." msgstr "Наш вызов продолжен..." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 #, fuzzy msgid "Call is updated by remote." msgstr "Вызов обновлён вызываемым абонентом..." -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "Звонок прерван." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "Пользователь занят." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "Пользователь временно недоступен." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "Абонент не хочет отвечать." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "Звонок отклонён." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "Нет ответа." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "Ошибка протокола." -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 msgid "Redirected" msgstr "Переадресован" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 #, fuzzy msgid "Incompatible media parameters." msgstr "Несовместимо, проверьте кодеки..." -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 msgid "Call failed." msgstr "Не удалось совершить вызов." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "Регистрация на %s прошла успешно." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, c-format msgid "Unregistration on %s done." msgstr "Отмена регистрации на %s завершена." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "время ожидания истекло" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, c-format msgid "Registration on %s failed: %s" msgstr "Регистрация на %s не удалась: %s" @@ -1737,7 +1806,7 @@ msgstr "Регистрация на %s не удалась: %s" msgid "Authentication token is %s" msgstr "Аутентификационный токен: %s" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1745,6 +1814,12 @@ msgstr[0] "У вас пропущен %i звонок." msgstr[1] "У вас пропущено %i звонка." msgstr[2] "У вас пропущено %i звонков." +#~ msgid "by %s" +#~ msgstr "со стороны: %s" + +#~ msgid "Keypad" +#~ msgstr "Номеронабиратель" + #~ msgid "Chat with %s" #~ msgstr "Чат с %s" @@ -1760,9 +1835,6 @@ msgstr[2] "У вас пропущено %i звонков." #~ msgid "in" #~ msgstr "в" -#~ msgid "Contacts" -#~ msgstr "Контакты" - #~ msgid "edit" #~ msgstr "редактировать" @@ -1851,9 +1923,6 @@ msgstr[2] "У вас пропущено %i звонков." #~ msgid "gtk-close" #~ msgstr "Закрыть" -#~ msgid "Ports" -#~ msgstr "Порты" - #~ msgid "ITU-G.711 alaw encoder" #~ msgstr "ITU-G.711 alaw кодировщик" @@ -2318,9 +2387,6 @@ msgstr[2] "У вас пропущено %i звонков." #~ msgid "Listen" #~ msgstr "Слушать" -#~ msgid "Sound properties" -#~ msgstr "Настройки звука" - #~ msgid "Sound device" #~ msgstr "Устройство звука" diff --git a/po/sr.po b/po/sr.po new file mode 100644 index 000000000..4a465ec8e --- /dev/null +++ b/po/sr.po @@ -0,0 +1,1877 @@ +# SIP Telephony Application. +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. +# Мирослав Николић , 2013. +msgid "" +msgstr "" +"Project-Id-Version: linphone 0.7.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"PO-Revision-Date: 2013-02-11 19:03+0200\n" +"Last-Translator: Мирослав Николић \n" +"Language-Team: Serbian \n" +"Language: sr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "н/д" + +#: ../gtk/calllogs.c:85 +#, fuzzy +msgid "Aborted" +msgstr "прекинути" + +#: ../gtk/calllogs.c:88 +#, fuzzy +msgid "Missed" +msgstr "пропуштени" + +#: ../gtk/calllogs.c:91 +#, fuzzy +msgid "Declined" +msgstr "Одбиј" + +#: ../gtk/calllogs.c:97 +#, c-format +msgid "%i minute" +msgid_plural "%i minutes" +msgstr[0] "%i минут" +msgstr[1] "%i минута" +msgstr[2] "%i минута" +msgstr[3] "Један минут" + +#: ../gtk/calllogs.c:100 +#, c-format +msgid "%i second" +msgid_plural "%i seconds" +msgstr[0] "%i секунда" +msgstr[1] "%i секунде" +msgstr[2] "%i секунде" +msgstr[3] "Једна секунда" + +#: ../gtk/calllogs.c:103 +#, c-format +msgid "" +"%s\t%s\tQuality: %s\n" +"%s\t%s %s\t" +msgstr "" +"%s\t%s\tКвалитет: %s\n" +"%s\t%s %s\t" + +#: ../gtk/calllogs.c:108 +#, fuzzy, c-format +msgid "" +"%s\t%s\t\n" +"%s\t%s" +msgstr "" +"%s\t%s\tКвалитет: %s\n" +"%s\t%s %s\t" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +msgid "Conference" +msgstr "Конференција" + +#: ../gtk/conference.c:46 +msgid "Me" +msgstr "Ја" + +#: ../gtk/support.c:49 ../gtk/support.c:73 ../gtk/support.c:102 +#, c-format +msgid "Couldn't find pixmap file: %s" +msgstr "Не могу да пронађем датотеку сличице: %s" + +#: ../gtk/main.c:88 +msgid "log to stdout some debug information while running." +msgstr "бележи у стандардни излаз неке податке за уклањање грешака док ради." + +#: ../gtk/main.c:95 +msgid "path to a file to write logs into." +msgstr "путања до датотеке за уписивање бележака." + +#: ../gtk/main.c:102 +msgid "Start linphone with video disabled." +msgstr "" + +#: ../gtk/main.c:109 +msgid "Start only in the system tray, do not show the main interface." +msgstr "Покреће се само у системској фиоци, не приказује главно сучеље." + +#: ../gtk/main.c:116 +msgid "address to call right now" +msgstr "адреса за позивање управо сада" + +#: ../gtk/main.c:123 +msgid "if set automatically answer incoming calls" +msgstr "ако је подешено сам ће се јављати на долазне позиве" + +#: ../gtk/main.c:130 +msgid "" +"Specifiy a working directory (should be the base of the installation, eg: c:" +"\\Program Files\\Linphone)" +msgstr "" +"Наводи радни директоријум (треба да буде основа инсталације, нпр: c:" +"\\Program Files\\Linphone)" + +#: ../gtk/main.c:510 +#, c-format +msgid "Call with %s" +msgstr "Позив са корисником %s" + +#: ../gtk/main.c:941 +#, c-format +msgid "" +"%s would like to add you to his contact list.\n" +"Would you allow him to see your presence status or add him to your contact " +"list ?\n" +"If you answer no, this person will be temporarily blacklisted." +msgstr "" +"%s жели да вас дода на списак пријатеља.\n" +"Да ли желите да му допустите да види ваше стање присуства или да га додате " +"на ваш списак пријатеља ?\n" +"Ако одговорите са не, ова особа ће привремено бити стављена на црни списак." + +#: ../gtk/main.c:1018 +#, c-format +msgid "" +"Please enter your password for username %s\n" +" at domain %s:" +msgstr "" +"Унесите вашу лозинку за корисничко име %s\n" +" на домену %s:" + +#: ../gtk/main.c:1121 +msgid "Call error" +msgstr "Грешка позива" + +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +msgid "Call ended" +msgstr "Позив је завршен" + +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +msgid "Incoming call" +msgstr "Долазни позив" + +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +msgid "Answer" +msgstr "Јави се" + +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +msgid "Decline" +msgstr "Одбиј" + +#: ../gtk/main.c:1137 +msgid "Call paused" +msgstr "Позив је заустављен" + +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Кодеци" + +#: ../gtk/main.c:1186 +#, c-format +msgid "%s proposed to start video. Do you accept ?" +msgstr "" + +#: ../gtk/main.c:1348 +msgid "Website link" +msgstr "Веза веб сајта" + +#: ../gtk/main.c:1388 +msgid "Linphone - a video internet phone" +msgstr "Линфон — интернет телефон са снимком" + +#: ../gtk/main.c:1480 +#, c-format +msgid "%s (Default)" +msgstr "%s (основно)" + +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#, c-format +msgid "We are transferred to %s" +msgstr "Преселили смо се на %s" + +#: ../gtk/main.c:1792 +msgid "" +"No sound cards have been detected on this computer.\n" +"You won't be able to send or receive audio calls." +msgstr "" +"Ниједна звучна картица није откривен ана овом рачунару.\n" +"Нећете бити у могућности да шаљете или да примате звучне позиве." + +#: ../gtk/main.c:1896 +msgid "A free SIP video-phone" +msgstr "Слободан СИП телефон са снимком" + +#: ../gtk/friendlist.c:366 +msgid "Add to addressbook" +msgstr "Додајте у адресар" + +#: ../gtk/friendlist.c:540 +msgid "Presence status" +msgstr "Стање присуства" + +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +msgid "Name" +msgstr "Име" + +#: ../gtk/friendlist.c:569 +msgid "Call" +msgstr "Позови" + +#: ../gtk/friendlist.c:574 +msgid "Chat" +msgstr "" + +#: ../gtk/friendlist.c:604 +#, c-format +msgid "Search in %s directory" +msgstr "Тражи у директоријуму „%s“" + +#: ../gtk/friendlist.c:762 +msgid "Invalid sip contact !" +msgstr "Неисправан сип контакт !" + +#: ../gtk/friendlist.c:807 +#, c-format +msgid "Call %s" +msgstr "Позови „%s“" + +#: ../gtk/friendlist.c:808 +#, c-format +msgid "Send text to %s" +msgstr "Пошаљи текст за %s" + +#: ../gtk/friendlist.c:809 +#, c-format +msgid "Edit contact '%s'" +msgstr "Уредите контакт „%s“" + +#: ../gtk/friendlist.c:810 +#, c-format +msgid "Delete contact '%s'" +msgstr "Обришите контакт „%s“" + +#: ../gtk/friendlist.c:852 +#, c-format +msgid "Add new contact from %s directory" +msgstr "Додајте нови контакт из директоријума „%s“" + +#: ../gtk/propertybox.c:373 +msgid "Rate (Hz)" +msgstr "Проток (Hz)" + +#: ../gtk/propertybox.c:379 +msgid "Status" +msgstr "Стање" + +#: ../gtk/propertybox.c:385 +msgid "Min bitrate (kbit/s)" +msgstr "Најмањи проток бита (kbit/s)" + +#: ../gtk/propertybox.c:392 +msgid "Parameters" +msgstr "Параметри" + +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 +msgid "Enabled" +msgstr "Укључено" + +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 +msgid "Disabled" +msgstr "Искључено" + +#: ../gtk/propertybox.c:624 +msgid "Account" +msgstr "Налог" + +#: ../gtk/propertybox.c:764 +msgid "English" +msgstr "Енглески" + +#: ../gtk/propertybox.c:765 +msgid "French" +msgstr "Француски" + +#: ../gtk/propertybox.c:766 +msgid "Swedish" +msgstr "Шведски" + +#: ../gtk/propertybox.c:767 +msgid "Italian" +msgstr "Италијански" + +#: ../gtk/propertybox.c:768 +msgid "Spanish" +msgstr "Шпански" + +#: ../gtk/propertybox.c:769 +msgid "Brazilian Portugese" +msgstr "Бразилски португалски" + +#: ../gtk/propertybox.c:770 +msgid "Polish" +msgstr "Пољски" + +#: ../gtk/propertybox.c:771 +msgid "German" +msgstr "Немачки" + +#: ../gtk/propertybox.c:772 +msgid "Russian" +msgstr "Руски" + +#: ../gtk/propertybox.c:773 +msgid "Japanese" +msgstr "Јапански" + +#: ../gtk/propertybox.c:774 +msgid "Dutch" +msgstr "Холандски" + +#: ../gtk/propertybox.c:775 +msgid "Hungarian" +msgstr "Мађарски" + +#: ../gtk/propertybox.c:776 +msgid "Czech" +msgstr "Чешки" + +#: ../gtk/propertybox.c:777 +msgid "Chinese" +msgstr "Кинески" + +#: ../gtk/propertybox.c:778 +msgid "Traditional Chinese" +msgstr "Традиционални кинески" + +#: ../gtk/propertybox.c:779 +msgid "Norwegian" +msgstr "Норвешки" + +#: ../gtk/propertybox.c:780 +msgid "Hebrew" +msgstr "" + +#: ../gtk/propertybox.c:847 +msgid "" +"You need to restart linphone for the new language selection to take effect." +msgstr "" +"Трба поново да покренете линфон да би нови изабрани језик ступио на снагу." + +#: ../gtk/propertybox.c:933 +msgid "None" +msgstr "Ништа" + +#: ../gtk/propertybox.c:937 +msgid "SRTP" +msgstr "СРТП" + +#: ../gtk/propertybox.c:943 +msgid "ZRTP" +msgstr "ЗРТП" + +#: ../gtk/update.c:80 +#, c-format +msgid "" +"A more recent version is availalble from %s.\n" +"Would you like to open a browser to download it ?" +msgstr "" +"Новије издање је доступно са „%s“.\n" +"Да ли желите да отворите прегледник да га преузмете ?" + +#: ../gtk/update.c:91 +msgid "You are running the lastest version." +msgstr "Радите на најновијем издању." + +#: ../gtk/buddylookup.c:85 +msgid "Firstname, Lastname" +msgstr "Име и презиме" + +#: ../gtk/buddylookup.c:160 +msgid "Error communicating with server." +msgstr "Грешка у коминикацији са сервером." + +#: ../gtk/buddylookup.c:164 +msgid "Connecting..." +msgstr "Повезујем се..." + +#: ../gtk/buddylookup.c:168 +msgid "Connected" +msgstr "Повезан сам" + +#: ../gtk/buddylookup.c:172 +msgid "Receiving data..." +msgstr "Примам податке..." + +#: ../gtk/buddylookup.c:180 +#, c-format +msgid "Found %i contact" +msgid_plural "Found %i contacts" +msgstr[0] "Нашао сам %i пријатеља" +msgstr[1] "Нашао сам %i пријатеља" +msgstr[2] "Нашао сам %i пријатеља" +msgstr[3] "Нашао сам једног пријатеља" + +#: ../gtk/setupwizard.c:34 +msgid "" +"Welcome !\n" +"This assistant will help you to use a SIP account for your calls." +msgstr "" +"Добродошли !\n" +"Овај помоћник ће вам помоћи да користите СИП налог за ваше позиве." + +#: ../gtk/setupwizard.c:43 +#, fuzzy +msgid "Create an account on linphone.org" +msgstr "Направите налог тако што ћете изабрати корисничко име" + +#: ../gtk/setupwizard.c:44 +#, fuzzy +msgid "I have already a linphone.org account and I just want to use it" +msgstr "Већ имам један налог и желим да га користим" + +#: ../gtk/setupwizard.c:45 +#, fuzzy +msgid "I have already a sip account and I just want to use it" +msgstr "Већ имам један налог и желим да га користим" + +#: ../gtk/setupwizard.c:85 +msgid "Enter your linphone.org username" +msgstr "" + +#: ../gtk/setupwizard.c:92 +msgid "Username:" +msgstr "Корисничко име:" + +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 +msgid "Password:" +msgstr "Лозинка:" + +#: ../gtk/setupwizard.c:114 +msgid "Enter your account informations" +msgstr "" + +#: ../gtk/setupwizard.c:121 +#, fuzzy +msgid "Username*" +msgstr "Корисничко име" + +#: ../gtk/setupwizard.c:122 +#, fuzzy +msgid "Password*" +msgstr "Лозинка" + +#: ../gtk/setupwizard.c:125 +msgid "Domain*" +msgstr "" + +#: ../gtk/setupwizard.c:126 +msgid "Proxy" +msgstr "" + +#: ../gtk/setupwizard.c:298 +msgid "(*) Required fields" +msgstr "" + +#: ../gtk/setupwizard.c:299 +#, fuzzy +msgid "Username: (*)" +msgstr "Корисничко име:" + +#: ../gtk/setupwizard.c:301 +#, fuzzy +msgid "Password: (*)" +msgstr "Лозинка:" + +#: ../gtk/setupwizard.c:303 +msgid "Email: (*)" +msgstr "" + +#: ../gtk/setupwizard.c:305 +msgid "Confirm your password: (*)" +msgstr "" + +#: ../gtk/setupwizard.c:369 +msgid "" +"Error, account not validated, username already used or server unreachable.\n" +"Please go back and try again." +msgstr "" + +#: ../gtk/setupwizard.c:380 +msgid "Thank you. Your account is now configured and ready for use." +msgstr "Хвала вам. Ваш налог је сада подешен и спреман за употребу." + +#: ../gtk/setupwizard.c:388 +msgid "" +"Please validate your account by clicking on the link we just sent you by " +"email.\n" +"Then come back here and press Next button." +msgstr "" + +#: ../gtk/setupwizard.c:564 +msgid "Welcome to the account setup assistant" +msgstr "Добродошли у помоћника подешавања налога" + +#: ../gtk/setupwizard.c:569 +msgid "Account setup assistant" +msgstr "Помоћник подешавања налога" + +#: ../gtk/setupwizard.c:575 +#, fuzzy +msgid "Configure your account (step 1/1)" +msgstr "Подесите СИП налог" + +#: ../gtk/setupwizard.c:580 +msgid "Enter your sip username (step 1/1)" +msgstr "" + +#: ../gtk/setupwizard.c:584 +msgid "Enter account information (step 1/2)" +msgstr "" + +#: ../gtk/setupwizard.c:593 +msgid "Validation (step 2/2)" +msgstr "" + +#: ../gtk/setupwizard.c:598 +msgid "Error" +msgstr "" + +#: ../gtk/setupwizard.c:602 +msgid "Terminating" +msgstr "" + +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 +#, c-format +msgid "Call #%i" +msgstr "Позови #%i" + +#: ../gtk/incall_view.c:154 +#, c-format +msgid "Transfer to call #%i with %s" +msgstr "Пребаци позив #%i са %s" + +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 +#, fuzzy +msgid "Not used" +msgstr "Нисам нашао" + +#: ../gtk/incall_view.c:220 +msgid "ICE not activated" +msgstr "" + +#: ../gtk/incall_view.c:222 +#, fuzzy +msgid "ICE failed" +msgstr "Позив није успео." + +#: ../gtk/incall_view.c:224 +msgid "ICE in progress" +msgstr "" + +#: ../gtk/incall_view.c:226 +msgid "Going through one or more NATs" +msgstr "" + +#: ../gtk/incall_view.c:228 +#, fuzzy +msgid "Direct" +msgstr "Преусмерен" + +#: ../gtk/incall_view.c:230 +msgid "Through a relay server" +msgstr "" + +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "У току је тражење стуна..." + +#: ../gtk/incall_view.c:242 +#, fuzzy +msgid "uPnp not available" +msgstr "недоступно" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "Позив није успео." + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 +#, c-format +msgid "" +"download: %f\n" +"upload: %f (kbit/s)" +msgstr "" + +#: ../gtk/incall_view.c:286 +#, fuzzy, c-format +msgid "%.3f seconds" +msgstr "%i секунда" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +msgid "Hang up" +msgstr "" + +#: ../gtk/incall_view.c:477 +msgid "Calling..." +msgstr "Позивам..." + +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +msgid "00::00::00" +msgstr "00::00::00" + +#: ../gtk/incall_view.c:491 +msgid "Incoming call" +msgstr "Долазни позив" + +#: ../gtk/incall_view.c:528 +msgid "good" +msgstr "добро" + +#: ../gtk/incall_view.c:530 +msgid "average" +msgstr "просечно" + +#: ../gtk/incall_view.c:532 +msgid "poor" +msgstr "оскудно" + +#: ../gtk/incall_view.c:534 +msgid "very poor" +msgstr "јадно" + +#: ../gtk/incall_view.c:536 +msgid "too bad" +msgstr "много лоше" + +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +msgid "unavailable" +msgstr "недоступно" + +#: ../gtk/incall_view.c:652 +msgid "Secured by SRTP" +msgstr "Осигурано СРТП-ом" + +#: ../gtk/incall_view.c:658 +#, c-format +msgid "Secured by ZRTP - [auth token: %s]" +msgstr "Осигурано ЗРТП-ом [потврђивање идентитета: %s]" + +#: ../gtk/incall_view.c:664 +msgid "Set unverified" +msgstr "Непроверено подешавање" + +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +msgid "Set verified" +msgstr "Проверено подешавање" + +#: ../gtk/incall_view.c:685 +msgid "In conference" +msgstr "На конференцији" + +#: ../gtk/incall_view.c:685 +msgid "In call" +msgstr "У позиву" + +#: ../gtk/incall_view.c:719 +msgid "Paused call" +msgstr "Заустављен позив" + +#: ../gtk/incall_view.c:732 +#, c-format +msgid "%02i::%02i::%02i" +msgstr "%02i::%02i::%02i" + +#: ../gtk/incall_view.c:749 +msgid "Call ended." +msgstr "Позив је завршен." + +#: ../gtk/incall_view.c:779 +msgid "Transfer in progress" +msgstr "" + +#: ../gtk/incall_view.c:782 +#, fuzzy +msgid "Transfer done." +msgstr "Пребаци" + +#: ../gtk/incall_view.c:785 +#, fuzzy +msgid "Transfer failed." +msgstr "Пребаци" + +#: ../gtk/incall_view.c:829 +msgid "Resume" +msgstr "Настави" + +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +msgid "Pause" +msgstr "Застани" + +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +#, fuzzy +msgid "(Paused)" +msgstr "Застани" + +#: ../gtk/loginframe.c:93 +#, c-format +msgid "Please enter login information for %s" +msgstr "Унесите податке пријављивања за %s" + +#: ../gtk/main.ui.h:1 +msgid "Callee name" +msgstr "Име позивника" + +#: ../gtk/main.ui.h:2 +msgid "Send" +msgstr "Пошаљи" + +#: ../gtk/main.ui.h:3 +#, fuzzy +msgid "End conference" +msgstr "На конференцији" + +#: ../gtk/main.ui.h:4 +msgid "label" +msgstr "натпис" + +#: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 +msgid "Video" +msgstr "" + +#: ../gtk/main.ui.h:11 +msgid "Mute" +msgstr "" + +#: ../gtk/main.ui.h:12 +msgid "Transfer" +msgstr "Пребаци" + +#: ../gtk/main.ui.h:15 +msgid "In call" +msgstr "Долазни позив" + +#: ../gtk/main.ui.h:16 +msgid "Duration" +msgstr "Трајање" + +#: ../gtk/main.ui.h:17 +msgid "Call quality rating" +msgstr "Оцена квалитета позива" + +#: ../gtk/main.ui.h:18 +msgid "_Options" +msgstr "_Могућности" + +#: ../gtk/main.ui.h:19 +msgid "Always start video" +msgstr "" + +#: ../gtk/main.ui.h:20 +msgid "Enable self-view" +msgstr "Укључи самовиђење" + +#: ../gtk/main.ui.h:21 +msgid "_Help" +msgstr "По_моћ" + +#: ../gtk/main.ui.h:22 +msgid "Show debug window" +msgstr "Прикажи прозорче прочишћавања" + +#: ../gtk/main.ui.h:23 +msgid "_Homepage" +msgstr "_Матична страница" + +#: ../gtk/main.ui.h:24 +msgid "Check _Updates" +msgstr "Провери _ажурирања" + +#: ../gtk/main.ui.h:25 +#, fuzzy +msgid "Account assistant" +msgstr "Помоћник подешавања налога" + +#: ../gtk/main.ui.h:26 +msgid "SIP address or phone number:" +msgstr "СИП адреса или број телефона:" + +#: ../gtk/main.ui.h:27 +msgid "Initiate a new call" +msgstr "Започните нови позив" + +#: ../gtk/main.ui.h:28 +msgid "Contacts" +msgstr "Пријатељи" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +msgid "Add" +msgstr "Додај" + +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +msgid "Edit" +msgstr "Уреди" + +#: ../gtk/main.ui.h:31 +msgid "Search" +msgstr "Тражи" + +#: ../gtk/main.ui.h:32 +msgid "Add contacts from directory" +msgstr "Додај пријатеље из директоријума" + +#: ../gtk/main.ui.h:33 +msgid "Add contact" +msgstr "Додај пријатеља" + +#: ../gtk/main.ui.h:34 +msgid "Recent calls" +msgstr "Скорашњи позиви" + +#: ../gtk/main.ui.h:35 +msgid "My current identity:" +msgstr "Мој тренутни идентитет:" + +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +msgid "Username" +msgstr "Корисничко име" + +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +msgid "Password" +msgstr "Лозинка" + +#: ../gtk/main.ui.h:38 +msgid "Internet connection:" +msgstr "Интернет веза:" + +#: ../gtk/main.ui.h:39 +msgid "Automatically log me in" +msgstr "Сам ме пријави" + +#: ../gtk/main.ui.h:40 +msgid "Login information" +msgstr "Подаци пријављивања" + +#: ../gtk/main.ui.h:41 +msgid "Welcome !" +msgstr "Добродошли !" + +#: ../gtk/main.ui.h:42 +msgid "All users" +msgstr "Сви корисници" + +#: ../gtk/main.ui.h:43 +msgid "Online users" +msgstr "Корисницима на мрежи" + +#: ../gtk/main.ui.h:44 +msgid "ADSL" +msgstr "АДСЛ" + +#: ../gtk/main.ui.h:45 +msgid "Fiber Channel" +msgstr "Оптички канал" + +#: ../gtk/main.ui.h:46 +msgid "Default" +msgstr "Основно" + +#: ../gtk/main.ui.h:47 +msgid "Delete" +msgstr "" + +#: ../gtk/about.ui.h:1 +msgid "About linphone" +msgstr "О линфону" + +#: ../gtk/about.ui.h:2 +msgid "(C) Belledonne Communications,2010\n" +msgstr "(C) Беледон комуникације,2010\n" + +#: ../gtk/about.ui.h:4 +msgid "An internet video phone using the standard SIP (rfc3261) protocol." +msgstr "" +"Интернет телефон са снимком који користи уобичајени СИП (rfc3261) протокол." + +#: ../gtk/about.ui.h:5 +msgid "" +"fr: Simon Morlat\n" +"en: Simon Morlat and Delphine Perreau\n" +"it: Alberto Zanoni \n" +"de: Jean-Jacques Sarton \n" +"sv: Daniel Nylander \n" +"es: Jesus Benitez \n" +"ja: YAMAGUCHI YOSHIYA \n" +"pt_BR: Rafael Caesar Lenzi \n" +"pl: Robert Nasiadek \n" +"cs: Petr Pisar \n" +"hu: anonymous\n" +msgstr "" +"fr: Simon Morlat\n" +"en: Simon Morlat and Delphine Perreau\n" +"it: Alberto Zanoni \n" +"de: Jean-Jacques Sarton \n" +"sv: Daniel Nylander \n" +"es: Jesus Benitez \n" +"ja: YAMAGUCHI YOSHIYA \n" +"pt_BR: Rafael Caesar Lenzi \n" +"pl: Robert Nasiadek \n" +"cs: Petr Pisar \n" +"hu: anonymous\n" + +#: ../gtk/contact.ui.h:2 +msgid "SIP Address" +msgstr "СИП адреса" + +#: ../gtk/contact.ui.h:3 +msgid "Show this contact presence status" +msgstr "Прикажи стање присуства овог пријатеља" + +#: ../gtk/contact.ui.h:4 +msgid "Allow this contact to see my presence status" +msgstr "Дозволи овом пријатељу да види стање мог присуства" + +#: ../gtk/contact.ui.h:5 +msgid "Contact information" +msgstr "Подаци о пријатељу" + +#: ../gtk/log.ui.h:1 +msgid "Linphone debug window" +msgstr "Линфоново прозорче прочишћавања" + +#: ../gtk/log.ui.h:2 +msgid "Scroll to end" +msgstr "" + +#: ../gtk/password.ui.h:1 +msgid "Linphone - Authentication required" +msgstr "Линфон — Потребно је потврђивање идентитета" + +#: ../gtk/password.ui.h:2 +msgid "Please enter the domain password" +msgstr "Унесите лозинку домена" + +#: ../gtk/password.ui.h:3 +msgid "UserID" +msgstr "ИБ корисника" + +#: ../gtk/call_logs.ui.h:1 +msgid "Call history" +msgstr "Историјат позива" + +#: ../gtk/call_logs.ui.h:2 +msgid "Clear all" +msgstr "Очистите све" + +#: ../gtk/call_logs.ui.h:3 +msgid "Call back" +msgstr "Повратни позив" + +#: ../gtk/sip_account.ui.h:1 +msgid "Linphone - Configure a SIP account" +msgstr "Линфон — Подесите СИП налог" + +#: ../gtk/sip_account.ui.h:2 +msgid "Your SIP identity:" +msgstr "Ваш СИП идентитет:" + +#: ../gtk/sip_account.ui.h:3 +msgid "Looks like sip:@" +msgstr "Изгледа као „sip:<корисничко-име>@<домен>" + +#: ../gtk/sip_account.ui.h:4 +msgid "sip:" +msgstr "сип:" + +#: ../gtk/sip_account.ui.h:5 +msgid "SIP Proxy address:" +msgstr "Адреса СИП посредника:" + +#: ../gtk/sip_account.ui.h:6 +msgid "Looks like sip:" +msgstr "Изгледа као „sip:<назив посредника>" + +#: ../gtk/sip_account.ui.h:7 +msgid "Route (optional):" +msgstr "Рута (изборно):" + +#: ../gtk/sip_account.ui.h:8 +msgid "Registration duration (sec):" +msgstr "Трајање уписа (сек):" + +#: ../gtk/sip_account.ui.h:9 +msgid "Register" +msgstr "Упиши се" + +#: ../gtk/sip_account.ui.h:10 +msgid "Publish presence information" +msgstr "Објави податке о присуству" + +#: ../gtk/sip_account.ui.h:11 +msgid "Configure a SIP account" +msgstr "Подесите СИП налог" + +#: ../gtk/parameters.ui.h:1 +msgid "default soundcard" +msgstr "основна звучна картица" + +#: ../gtk/parameters.ui.h:2 +msgid "a sound card" +msgstr "звучна картица" + +#: ../gtk/parameters.ui.h:3 +msgid "default camera" +msgstr "основна камера" + +#: ../gtk/parameters.ui.h:4 +msgid "CIF" +msgstr "ЦИФ" + +#: ../gtk/parameters.ui.h:5 +msgid "Audio codecs" +msgstr "Звучни кодеци" + +#: ../gtk/parameters.ui.h:6 +msgid "Video codecs" +msgstr "Кодеци снимка" + +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "В" + +#: ../gtk/parameters.ui.h:8 +msgid "SIP (UDP)" +msgstr "СИП (УДП)" + +#: ../gtk/parameters.ui.h:9 +msgid "SIP (TCP)" +msgstr "СИП (ТЦП)" + +#: ../gtk/parameters.ui.h:10 +msgid "SIP (TLS)" +msgstr "СИП (ТЛС)" + +#: ../gtk/parameters.ui.h:11 +msgid "Settings" +msgstr "Подешавања" + +#: ../gtk/parameters.ui.h:12 +msgid "Set Maximum Transmission Unit:" +msgstr "Подеси јединицу највећег преноса:" + +#: ../gtk/parameters.ui.h:13 +msgid "Send DTMFs as SIP info" +msgstr "Пошаљи ДТМФ као СИП податке" + +#: ../gtk/parameters.ui.h:14 +msgid "Use IPv6 instead of IPv4" +msgstr "Користи ИПв6 уместо ИПв4" + +#: ../gtk/parameters.ui.h:15 +msgid "Transport" +msgstr "Пренос" + +#: ../gtk/parameters.ui.h:16 +msgid "Media encryption type" +msgstr "Врста шифровања медија" + +#: ../gtk/parameters.ui.h:17 +msgid "Video RTP/UDP:" +msgstr "РТП/УДП снимка:" + +#: ../gtk/parameters.ui.h:18 +msgid "Audio RTP/UDP:" +msgstr "РТП/УДП звука:" + +#: ../gtk/parameters.ui.h:19 +msgid "DSCP fields" +msgstr "" + +#: ../gtk/parameters.ui.h:20 +msgid "Fixed" +msgstr "" + +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + +#: ../gtk/parameters.ui.h:22 +#, fuzzy +msgid "Media encryption is mandatory" +msgstr "Врста шифровања медија" + +#: ../gtk/parameters.ui.h:23 +msgid "Network protocol and ports" +msgstr "Мрежни протокол и прикључници" + +#: ../gtk/parameters.ui.h:24 +msgid "Direct connection to the Internet" +msgstr "Непосредна веза на Интернет" + +#: ../gtk/parameters.ui.h:25 +msgid "Behind NAT / Firewall (specify gateway IP below)" +msgstr "Иза НАТ-а / мрежне баријере (испод наведите ИП мрежног пролаза)" + +#: ../gtk/parameters.ui.h:26 +msgid "Public IP address:" +msgstr "Јавна ИП адреса:" + +#: ../gtk/parameters.ui.h:27 +msgid "Behind NAT / Firewall (use STUN to resolve)" +msgstr "Иза НАТ-а / мрежне баријере (користите СТУН за решавање)" + +#: ../gtk/parameters.ui.h:28 +#, fuzzy +msgid "Behind NAT / Firewall (use ICE)" +msgstr "Иза НАТ-а / мрежне баријере (користите СТУН за решавање)" + +#: ../gtk/parameters.ui.h:29 +#, fuzzy +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "Иза НАТ-а / мрежне баријере (користите СТУН за решавање)" + +#: ../gtk/parameters.ui.h:30 +msgid "Stun server:" +msgstr "Стун сервер:" + +#: ../gtk/parameters.ui.h:31 +msgid "NAT and Firewall" +msgstr "НАТ и мрежна баријера" + +#: ../gtk/parameters.ui.h:32 +msgid "Network settings" +msgstr "Подешавања мреже" + +#: ../gtk/parameters.ui.h:33 +msgid "Ring sound:" +msgstr "Звук звона:" + +#: ../gtk/parameters.ui.h:34 +msgid "ALSA special device (optional):" +msgstr "АЛСА-ин посебни уређај (изборно):" + +#: ../gtk/parameters.ui.h:35 +msgid "Capture device:" +msgstr "Уређај за снимање:" + +#: ../gtk/parameters.ui.h:36 +msgid "Ring device:" +msgstr "Уређај за звоно:" + +#: ../gtk/parameters.ui.h:37 +msgid "Playback device:" +msgstr "Уређај за пуштање:" + +#: ../gtk/parameters.ui.h:38 +msgid "Enable echo cancellation" +msgstr "Укључи поништавање одјека" + +#: ../gtk/parameters.ui.h:39 +msgid "Audio" +msgstr "Звук" + +#: ../gtk/parameters.ui.h:40 +msgid "Video input device:" +msgstr "Улазни уређај снимка:" + +#: ../gtk/parameters.ui.h:41 +msgid "Prefered video resolution:" +msgstr "Жељена резолуција снимка:" + +#: ../gtk/parameters.ui.h:42 +msgid "Video" +msgstr "Снимак" + +#: ../gtk/parameters.ui.h:43 +msgid "Multimedia settings" +msgstr "Подешавања мултимедија" + +#: ../gtk/parameters.ui.h:44 +msgid "This section defines your SIP address when not using a SIP account" +msgstr "Овај одељак одређује вашу СИП адресу када не користите СИП налог" + +#: ../gtk/parameters.ui.h:45 +msgid "Your display name (eg: John Doe):" +msgstr "Ваше приказано име (нпр: Пера Перић):" + +#: ../gtk/parameters.ui.h:46 +msgid "Your username:" +msgstr "Ваше корисничко име:" + +#: ../gtk/parameters.ui.h:47 +msgid "Your resulting SIP address:" +msgstr "Ваша резултирајућа СИП адреса:" + +#: ../gtk/parameters.ui.h:48 +msgid "Default identity" +msgstr "Основни идентитет" + +#: ../gtk/parameters.ui.h:49 +msgid "Wizard" +msgstr "" + +#: ../gtk/parameters.ui.h:52 +msgid "Remove" +msgstr "Уклони" + +#: ../gtk/parameters.ui.h:53 +msgid "Proxy accounts" +msgstr "Посреднички налози" + +#: ../gtk/parameters.ui.h:54 +msgid "Erase all passwords" +msgstr "Обриши све лозинке" + +#: ../gtk/parameters.ui.h:55 +msgid "Privacy" +msgstr "Приватност" + +#: ../gtk/parameters.ui.h:56 +msgid "Manage SIP Accounts" +msgstr "Управљај СИП налозима" + +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 +msgid "Enable" +msgstr "Укључи" + +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 +msgid "Disable" +msgstr "Искључи" + +#: ../gtk/parameters.ui.h:59 +msgid "Codecs" +msgstr "Кодеци" + +#: ../gtk/parameters.ui.h:60 +msgid "0 stands for \"unlimited\"" +msgstr "0 значи „неограничено“" + +#: ../gtk/parameters.ui.h:61 +msgid "Upload speed limit in Kbit/sec:" +msgstr "Ограничење брзине слања у Kb/s:" + +#: ../gtk/parameters.ui.h:62 +msgid "Download speed limit in Kbit/sec:" +msgstr "Ограничење брзине преузимања у Kb/s:" + +#: ../gtk/parameters.ui.h:63 +msgid "Enable adaptive rate control" +msgstr "Укључи прилагодљиво управљање протоком" + +#: ../gtk/parameters.ui.h:64 +msgid "" +"Adaptive rate control is a technique to dynamically guess the available " +"bandwidth during a call." +msgstr "" +"Прилагодљиво управљање протоком је техника за променљиво погађање " +"доступног пропусног опсега за време позива." + +#: ../gtk/parameters.ui.h:65 +msgid "Bandwidth control" +msgstr "Управљање пропусним опсегом" + +#: ../gtk/parameters.ui.h:66 +msgid "Codecs" +msgstr "Kодеци" + +#: ../gtk/parameters.ui.h:67 +msgid "Language" +msgstr "Језик" + +#: ../gtk/parameters.ui.h:68 +msgid "Show advanced settings" +msgstr "Прикажи напредна подешавања" + +#: ../gtk/parameters.ui.h:69 +msgid "Level" +msgstr "Ниво" + +#: ../gtk/parameters.ui.h:70 +msgid "User interface" +msgstr "Корисничко сучеље" + +#: ../gtk/parameters.ui.h:71 +msgid "Done" +msgstr "Готово" + +#: ../gtk/buddylookup.ui.h:1 +msgid "Search contacts in directory" +msgstr "Потражите пријатеље у директоријуму" + +#: ../gtk/buddylookup.ui.h:2 +msgid "Add to my list" +msgstr "Додај на мој списак" + +#: ../gtk/buddylookup.ui.h:3 +msgid "Search somebody" +msgstr "Потражите неког" + +#: ../gtk/waiting.ui.h:1 +msgid "Linphone" +msgstr "Линфон" + +#: ../gtk/waiting.ui.h:2 +msgid "Please wait" +msgstr "Молим сачекајте" + +#: ../gtk/dscp_settings.ui.h:1 +#, fuzzy +msgid "Dscp settings" +msgstr "Подешавања" + +#: ../gtk/dscp_settings.ui.h:2 +msgid "SIP" +msgstr "" + +#: ../gtk/dscp_settings.ui.h:3 +#, fuzzy +msgid "Audio RTP stream" +msgstr "РТП/УДП звука:" + +#: ../gtk/dscp_settings.ui.h:4 +#, fuzzy +msgid "Video RTP stream" +msgstr "РТП/УДП снимка:" + +#: ../gtk/dscp_settings.ui.h:5 +msgid "Set DSCP values (in hexadecimal)" +msgstr "" + +#: ../gtk/call_statistics.ui.h:1 +msgid "Call statistics" +msgstr "" + +#: ../gtk/call_statistics.ui.h:2 +#, fuzzy +msgid "Audio codec" +msgstr "Звучни кодеци" + +#: ../gtk/call_statistics.ui.h:3 +#, fuzzy +msgid "Video codec" +msgstr "Кодеци снимка" + +#: ../gtk/call_statistics.ui.h:4 +msgid "Audio IP bandwidth usage" +msgstr "" + +#: ../gtk/call_statistics.ui.h:5 +msgid "Audio Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:6 +msgid "Video IP bandwidth usage" +msgstr "" + +#: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +msgid "Round trip time" +msgstr "" + +#: ../gtk/call_statistics.ui.h:9 +#, fuzzy +msgid "Call statistics and information" +msgstr "Подаци о пријатељу" + +#: ../gtk/tunnel_config.ui.h:1 +#, fuzzy +msgid "Configure VoIP tunnel" +msgstr "Подесите СИП налог" + +#: ../gtk/tunnel_config.ui.h:2 +msgid "Host" +msgstr "" + +#: ../gtk/tunnel_config.ui.h:3 +msgid "Port" +msgstr "" + +#: ../gtk/tunnel_config.ui.h:6 +msgid "Configure tunnel" +msgstr "" + +#: ../gtk/tunnel_config.ui.h:9 +msgid "Configure http proxy (optional)" +msgstr "" + +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "Г" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "9" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "8" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "7" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "Б" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "6" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "4" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "А" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "3" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "2" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 +msgid "aborted" +msgstr "прекинути" + +#: ../coreapi/linphonecore.c:230 +msgid "completed" +msgstr "завршени" + +#: ../coreapi/linphonecore.c:233 +msgid "missed" +msgstr "пропуштени" + +#: ../coreapi/linphonecore.c:238 +#, c-format +msgid "" +"%s at %s\n" +"From: %s\n" +"To: %s\n" +"Status: %s\n" +"Duration: %i mn %i sec\n" +msgstr "" +"%s у %s\n" +"Позива: %s\n" +"Прима: %s\n" +"Стање: %s\n" +"Трајање: %i мин %i сек\n" + +#: ../coreapi/linphonecore.c:239 +msgid "Outgoing call" +msgstr "Одлазни позив" + +#: ../coreapi/linphonecore.c:1314 +msgid "Ready" +msgstr "Спреман" + +#: ../coreapi/linphonecore.c:2184 +msgid "Looking for telephone number destination..." +msgstr "Тражим одредиште телефонског броја..." + +#: ../coreapi/linphonecore.c:2187 +msgid "Could not resolve this number." +msgstr "Не могу да решим овај број." + +#: ../coreapi/linphonecore.c:2231 +msgid "" +"Could not parse given sip address. A sip url usually looks like sip:" +"user@domain" +msgstr "" +"Не могу да обрадим дату сип адресу. Сип адреса обично изгледа као „sip:" +"корисник@домен“" + +#: ../coreapi/linphonecore.c:2432 +msgid "Contacting" +msgstr "Ступам у везу" + +#: ../coreapi/linphonecore.c:2439 +msgid "Could not call" +msgstr "Не могу да позовем" + +#: ../coreapi/linphonecore.c:2549 +msgid "Sorry, we have reached the maximum number of simultaneous calls" +msgstr "Извините, достигли смо највећи број истовремених позива" + +#: ../coreapi/linphonecore.c:2731 +msgid "is contacting you" +msgstr "вам се обраћа" + +#: ../coreapi/linphonecore.c:2732 +msgid " and asked autoanswer." +msgstr " и затражени само-одговор." + +#: ../coreapi/linphonecore.c:2732 +msgid "." +msgstr "." + +#: ../coreapi/linphonecore.c:2799 +msgid "Modifying call parameters..." +msgstr "Мењам параметре позива..." + +#: ../coreapi/linphonecore.c:3138 +msgid "Connected." +msgstr "Повезан сам." + +#: ../coreapi/linphonecore.c:3166 +msgid "Call aborted" +msgstr "Позив је прекинут" + +#: ../coreapi/linphonecore.c:3351 +msgid "Could not pause the call" +msgstr "Не могу да зауставим позив" + +#: ../coreapi/linphonecore.c:3356 +msgid "Pausing the current call..." +msgstr "Заустављам тренутни позив..." + +#: ../coreapi/misc.c:148 +msgid "" +"Your computer appears to be using ALSA sound drivers.\n" +"This is the best choice. However the pcm oss emulation module\n" +"is missing and linphone needs it. Please execute\n" +"'modprobe snd-pcm-oss' as root to load it." +msgstr "" +"Изгледа да ваш рачунар користи АЛСА управљачке програме за звук.\n" +"То је најбољи избор. Међутим недостаје пцм осс модул\n" +"за емулацију а потребан је линфону. Молим извршите\n" +"„modprobe snd-pcm-oss“ као администратор да га учитате." + +#: ../coreapi/misc.c:151 +msgid "" +"Your computer appears to be using ALSA sound drivers.\n" +"This is the best choice. However the mixer oss emulation module\n" +"is missing and linphone needs it. Please execute\n" +" 'modprobe snd-mixer-oss' as root to load it." +msgstr "" +"Изгледа да ваш рачунар користи АЛСА управљачке програме за звук.\n" +"То је најбољи избор. Међутим недостаје миксер осс модул\n" +"за емулацију а потребан је линфону. Молим извршите\n" +"„modprobe snd-mixer-oss“ као администратор да га учитате." + +#: ../coreapi/misc.c:496 +msgid "Stun lookup in progress..." +msgstr "У току је тражење стуна..." + +#: ../coreapi/misc.c:630 +msgid "ICE local candidates gathering in progress..." +msgstr "" + +#: ../coreapi/friend.c:33 +msgid "Online" +msgstr "На вези" + +#: ../coreapi/friend.c:36 +msgid "Busy" +msgstr "Заузет" + +#: ../coreapi/friend.c:39 +msgid "Be right back" +msgstr "Одмах се враћам" + +#: ../coreapi/friend.c:42 +msgid "Away" +msgstr "Одсутан" + +#: ../coreapi/friend.c:45 +msgid "On the phone" +msgstr "На телефону" + +#: ../coreapi/friend.c:48 +msgid "Out to lunch" +msgstr "На ручку сам" + +#: ../coreapi/friend.c:51 +msgid "Do not disturb" +msgstr "Не узнемиравај" + +#: ../coreapi/friend.c:54 +msgid "Moved" +msgstr "Премештен" + +#: ../coreapi/friend.c:57 +msgid "Using another messaging service" +msgstr "Користим другу услугу дописивања" + +#: ../coreapi/friend.c:60 +msgid "Offline" +msgstr "Неповезан" + +#: ../coreapi/friend.c:63 +msgid "Pending" +msgstr "На чекању" + +#: ../coreapi/friend.c:66 +msgid "Unknown-bug" +msgstr "Непозната грешка" + +#: ../coreapi/proxy.c:204 +msgid "" +"The sip proxy address you entered is invalid, it must start with \"sip:\" " +"followed by a hostname." +msgstr "" +"Адреса сип посредника коју сте унели је неисправна, мора почети на „sip:“ за " +"којим следи назив домаћина." + +#: ../coreapi/proxy.c:210 +msgid "" +"The sip identity you entered is invalid.\n" +"It should look like sip:username@proxydomain, such as sip:alice@example.net" +msgstr "" +"Сип идентитет који сте унели није исправан.\n" +"Треба да изгледа као „sip:корисник@домен-посредника, као што је „sip:" +"alice@example.net“" + +#: ../coreapi/proxy.c:1068 +#, c-format +msgid "Could not login as %s" +msgstr "Не могу да се пријавим као %s" + +#: ../coreapi/callbacks.c:283 +msgid "Remote ringing." +msgstr "Удаљено звоњење." + +#: ../coreapi/callbacks.c:303 +msgid "Remote ringing..." +msgstr "Удаљено звоњење..." + +#: ../coreapi/callbacks.c:314 +msgid "Early media." +msgstr "Ранији медиј." + +#: ../coreapi/callbacks.c:365 +#, c-format +msgid "Call with %s is paused." +msgstr "Позив са „%s“ је заустављен." + +#: ../coreapi/callbacks.c:378 +#, c-format +msgid "Call answered by %s - on hold." +msgstr "Позив на који је одговорио „%s“ — на чекању." + +#: ../coreapi/callbacks.c:389 +msgid "Call resumed." +msgstr "Позив је настављен." + +#: ../coreapi/callbacks.c:394 +#, c-format +msgid "Call answered by %s." +msgstr "На позив је одговорио „%s“." + +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." +msgstr "" + +#: ../coreapi/callbacks.c:457 +#, fuzzy +msgid "We have been resumed." +msgstr "Позив нам је настављен..." + +#: ../coreapi/callbacks.c:466 +msgid "We are paused by other party." +msgstr "" + +#: ../coreapi/callbacks.c:472 +#, fuzzy +msgid "Call is updated by remote." +msgstr "Позив је ажуриран удаљеним..." + +#: ../coreapi/callbacks.c:541 +msgid "Call terminated." +msgstr "Позив је завршен." + +#: ../coreapi/callbacks.c:552 +msgid "User is busy." +msgstr "Корисник је заузет." + +#: ../coreapi/callbacks.c:553 +msgid "User is temporarily unavailable." +msgstr "Корисник је привремено недоступан." + +#. char *retrymsg=_("%s. Retry after %i minute(s)."); +#: ../coreapi/callbacks.c:555 +msgid "User does not want to be disturbed." +msgstr "Корисник не жели да буде узнемираван." + +#: ../coreapi/callbacks.c:556 +msgid "Call declined." +msgstr "Позив је одбијен." + +#: ../coreapi/callbacks.c:568 +msgid "No response." +msgstr "Нема одговора." + +#: ../coreapi/callbacks.c:572 +msgid "Protocol error." +msgstr "Грешка у протоколу." + +#: ../coreapi/callbacks.c:588 +msgid "Redirected" +msgstr "Преусмерен" + +#: ../coreapi/callbacks.c:624 +msgid "Incompatible media parameters." +msgstr "" + +#: ../coreapi/callbacks.c:630 +msgid "Call failed." +msgstr "Позив није успео." + +#: ../coreapi/callbacks.c:733 +#, c-format +msgid "Registration on %s successful." +msgstr "Уписивање на „%s“ је успело." + +#: ../coreapi/callbacks.c:734 +#, c-format +msgid "Unregistration on %s done." +msgstr "Исписивање са „%s“ је обављено." + +#: ../coreapi/callbacks.c:754 +msgid "no response timeout" +msgstr "нема ограничења одговора" + +#: ../coreapi/callbacks.c:757 +#, c-format +msgid "Registration on %s failed: %s" +msgstr "Уписивање на „%s“ није успело: %s" + +#: ../coreapi/linphonecall.c:129 +#, c-format +msgid "Authentication token is %s" +msgstr "Симбол потврђивања идентитета је „%s“" + +#: ../coreapi/linphonecall.c:2314 +#, c-format +msgid "You have missed %i call." +msgid_plural "You have missed %i calls." +msgstr[0] "Пропустили сте %i позив." +msgstr[1] "Пропустили сте %i позива." +msgstr[2] "Пропустили сте %i позива." +msgstr[3] "Пропустили сте један позив." + +#~ msgid "Chat with %s" +#~ msgstr "Ћаскајте са „%s“" + +#~ msgid "by %s" +#~ msgstr "од %s" + +#~ msgid "Please choose a username:" +#~ msgstr "Изаберите корисничко име:" + +#~ msgid "Checking if '%s' is available..." +#~ msgstr "Проверавам да ли је „%s“ доступно..." + +#~ msgid "Please wait..." +#~ msgstr "Молим сачекајте..." + +#~ msgid "Sorry this username already exists. Please try a new one." +#~ msgstr "Извините ово корисничко име већ постоји. Покушајте неко друго." + +#~ msgid "Ok !" +#~ msgstr "У реду !" + +#~ msgid "Communication problem, please try again later." +#~ msgstr "Проблем у комуникацији, касније покушајте опет." + +#~ msgid "Choosing a username" +#~ msgstr "Бирам корисничко име" + +#~ msgid "Verifying" +#~ msgstr "Проверавам" + +#~ msgid "Confirmation" +#~ msgstr "Потврђујем" + +#~ msgid "Creating your account" +#~ msgstr "Правим ваш налог" + +#~ msgid "Now ready !" +#~ msgstr "Спремни смо сада !" + +#~ msgid "Enable video" +#~ msgstr "Укључи снимак" + +#~ msgid "Enter username, phone number, or full sip address" +#~ msgstr "Унесите корисничко име, број телефона, или пуну сип адресу" + +#~ msgid "Keypad" +#~ msgstr "Тастатура" + +#~ msgid "Lookup:" +#~ msgstr "Потражи:" + +#~ msgid "in" +#~ msgstr "у" + +#~ msgid "" +#~ "Register to FONICS\n" +#~ "virtual network !" +#~ msgstr "" +#~ "Упишите се на виртуелну\n" +#~ "мрежу ФОНИКС !" + +#~ msgid "We are being paused..." +#~ msgstr "Заустављени смо..." + +#~ msgid "No common codecs" +#~ msgstr "Нема познатих кодека" + +#~ msgid "Authentication failure" +#~ msgstr "Потврђивање идентитета није успело" diff --git a/po/sv.po b/po/sv.po index fed2d6550..0b2882efc 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2009-02-17 15:22+0100\n" "Last-Translator: Emmanuel Frécon \n" "Language-Team: SWEDISH \n" @@ -17,57 +17,57 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "avbrytade" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 #, fuzzy msgid "Missed" msgstr "missade" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "Avböj" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 #, fuzzy msgid "Me" msgstr "Mikrofon av" @@ -77,31 +77,31 @@ msgstr "Mikrofon av" msgid "Couldn't find pixmap file: %s" msgstr "Kunde inte hitta pixmap filen: %s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "skriv loggning information under körning" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "Starta ikonifierat, visa inte huvudfönstret" -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "Samtalsmottagare" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "Om på, besvara automatisk alla inkommande samtal" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -109,12 +109,12 @@ msgstr "" "Välj en arbetskatalog som ska vara basen för installationen, såsom C:" "\\Program\\Linphone" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" msgstr "Samtal med %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -127,7 +127,7 @@ msgstr "" "henne till din kontaktlista?\n" "Om du svarar nej, personen kommer att vara bannlyst." -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" @@ -136,235 +136,235 @@ msgstr "" "Mata in ditt lösenord för användaren %s\n" "vid domänen %s:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 #, fuzzy msgid "Call error" msgstr "Samtalshistorik" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Samtalet slut" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Inkommande samtal" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 msgid "Decline" msgstr "Avböj" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, fuzzy msgid "Call paused" msgstr "avbrytade" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "Portar" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "Webbsajt" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "Linphone - en video Internet telefon" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "Närvarostatus" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Namn" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" msgstr "Ringer %s" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "Sök i %s katalogen" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "ogiltig SIP kontakt!" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "Ringer %s" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "Skicka text till %s" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, c-format msgid "Edit contact '%s'" msgstr "Ändra kontakt '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "Ta bort kontakt '%s'" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "Lägg till kontakt ifrån %s katalogen" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "Frekvens (Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "Status" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "Min. datahastighet (kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "Parametrar" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "På" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Av" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "Konto" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "Engelska" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "Fransk" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "Svenska" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "Italiensk" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "Spanska" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "Portugisiska" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "Polska" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "Tyska" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "Ryska" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "Japanska" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "Nederländksa" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "Hungerska" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "Tjekiska" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "Kinesiska" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Du behöver starta om programmet för att det nya språket ska synas." -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -408,7 +408,7 @@ msgid_plural "Found %i contacts" msgstr[0] "Hittat kontakt %i" msgstr[1] "Hittat kontakt %i" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." @@ -416,277 +416,319 @@ msgstr "" "Välkommen!\n" "Assistenten kommer att hjälpa dig använda ett SIP konto för dina samtal:" -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 #, fuzzy msgid "Create an account on linphone.org" msgstr "Skapa ett konto genom att välja ett användarnamn" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 #, fuzzy msgid "I have already a linphone.org account and I just want to use it" msgstr "Jag har redan ett konto och vill bara använda det." -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 #, fuzzy msgid "I have already a sip account and I just want to use it" msgstr "Jag har redan ett konto och vill bara använda det." -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 msgid "Username:" msgstr "Användarnamn:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" msgstr "Lösenord:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 #, fuzzy msgid "Username*" msgstr "Användarnamn" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 #, fuzzy msgid "Password*" msgstr "Lösenord" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" msgstr "Användarnamn:" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" msgstr "Lösenord:" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "Tack. Ditt konto är nu konfigurerad och färdig att användas." -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "Välkommen till kontoinstallationsassistenten" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "Kontoinstallationsassistenten" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 #, fuzzy msgid "Configure your account (step 1/1)" msgstr "Konfigurera ett SIP konto" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 #, fuzzy msgid "Terminating" msgstr "Lägg på" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, fuzzy, c-format msgid "Call #%i" msgstr "Ringer %s" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" msgstr "" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "Samtalet avböjdes." -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "Omdirigerat till %s..." -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "STUN uppslagning pågår..." + +#: ../gtk/incall_view.c:242 +msgid "uPnp not available" +msgstr "" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "Samtalet avböjdes." + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 msgid "Calling..." msgstr "Ringer..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "00:00:00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 #, fuzzy msgid "Incoming call" msgstr "Inkommande samtal" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 #, fuzzy msgid "In call" msgstr "I samtal med" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 #, fuzzy msgid "Paused call" msgstr "Lägg på" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i:%02i:%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 msgid "Call ended." msgstr "Samtalet slut." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "Samtalet avböjdes." -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -710,223 +752,164 @@ msgid "label" msgstr "etikett" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 msgid "In call" msgstr "I samtal" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 msgid "Duration" msgstr "Förlopp" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 msgid "Enable self-view" msgstr "Själv bild" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 #, fuzzy msgid "Show debug window" msgstr "Linphone debug fönster" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 #, fuzzy msgid "_Homepage" msgstr "Hemsidan" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 #, fuzzy msgid "Check _Updates" msgstr "Letar efter uppdateringar" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 #, fuzzy msgid "Account assistant" msgstr "Kontoinstallationsassistenten" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 msgid "SIP address or phone number:" msgstr "Användarnamn" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +#, fuzzy +msgid "Contacts" +msgstr "Kontaktar" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Lägg till" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Editera" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "Sök" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 msgid "Add contacts from directory" msgstr "Lägg till kontakt ifrån katalogen" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Add contact" msgstr "Hittat kontakt %i" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "Recent calls" msgstr "I samtal" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 msgid "My current identity:" msgstr "Min nuvarande identitet" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Användarnamn" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Lösenord" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "Internet förbindelse:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "Logga mig automatiskt" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 msgid "Login information" msgstr "Login information" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 msgid "Welcome !" msgstr "Välkommen!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 #, fuzzy msgid "Online users" msgstr "" "Alla användare\n" "Online användare" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Fiber Channel" msgstr "" "ADSL\n" "Fiber" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 #, fuzzy msgid "Default" msgstr "%s (Default)" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1082,6 +1065,10 @@ msgstr "" "Audio codecs\n" "Video codecs" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "" + #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" msgstr "" @@ -1119,210 +1106,219 @@ msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:23 +msgid "Network protocol and ports" +msgstr "" + +#: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" msgstr "Direkt förbindelse till Internet" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" msgstr "Bakom en NAT / brandvägg (specificera gatewap IP adress nedan)" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "Publik IP adress:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Bakom en NAT / brandvägg (använd STUN för att avgöra adressen)" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 #, fuzzy msgid "Behind NAT / Firewall (use ICE)" msgstr "Bakom en NAT / brandvägg (använd STUN för att avgöra adressen)" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +#, fuzzy +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "Bakom en NAT / brandvägg (använd STUN för att avgöra adressen)" + +#: ../gtk/parameters.ui.h:30 msgid "Stun server:" msgstr "STUN server:" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 msgid "NAT and Firewall" msgstr "NAT och Brandvägg" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 msgid "Network settings" msgstr "Nätverksinställningar" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 msgid "Ring sound:" msgstr "Ring signal:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "ALSA speciell enhet (tillval):" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 msgid "Capture device:" msgstr "Mikrofon enhet:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 msgid "Ring device:" msgstr "Ringning enhet:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 msgid "Playback device:" msgstr "Uppspelningsenhet:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "Tillåta ekokancellering" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 msgid "Audio" msgstr "Audio" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 msgid "Video input device:" msgstr "Video ingångsenhet:" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "Video upplösning:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 msgid "Video" msgstr "Video" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "Multimedia inställningar" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "" "Denna sektion specificerar din SIP adress när du inte använder ett SIP konto" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "Ditt synliga namn, e.g. Kalle Karlsson:" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 msgid "Your username:" msgstr "Ditt användarnamn:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 msgid "Your resulting SIP address:" msgstr "Din SIP adress:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 msgid "Default identity" msgstr "Default identitet" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Ta bort" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 msgid "Proxy accounts" msgstr "Proxy konton" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "Glöm alla lösenord" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 msgid "Privacy" msgstr "Integritet" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "Hantera SIP konton" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Möjliggör" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Inaktivera" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "0 står för \"utan begränsning\"" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "Max upstream bandbreddshastighet i kbit/sek:" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "Max downstream bandbreddshastighet i kbit/sek:" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "Bandbreddskontroll" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 msgid "Codecs" msgstr "Codecs" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 msgid "Language" msgstr "Språk" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "Visa avancerade inställningar" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 msgid "Level" msgstr "Nivå" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 msgid "User interface" msgstr "Användarinterface" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 msgid "Done" msgstr "Klar" @@ -1391,7 +1387,7 @@ msgid "Audio IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "" #: ../gtk/call_statistics.ui.h:6 @@ -1399,6 +1395,14 @@ msgid "Video IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +msgid "Round trip time" +msgstr "" + +#: ../gtk/call_statistics.ui.h:9 #, fuzzy msgid "Call statistics and information" msgstr "Kontakt information" @@ -1424,19 +1428,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "avbrytade" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "avslutade" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "missade" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1451,23 +1515,23 @@ msgstr "" "Status: %s\n" "Längd: %i min %i sek\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "Utgående samtal" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "Redo" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "Leta efter telefonnummer för destinationen..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "Kan inte nå dett nummer." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1475,51 +1539,51 @@ msgstr "" "Kan inte förstå angiven SIP adress. En SIP adress vanligen ser ut som sip:" "användare@domänen" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "Kontaktar" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 #, fuzzy msgid "Could not call" msgstr "Kunde inte ringa" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 #, fuzzy msgid "is contacting you" msgstr "kontaktar dig." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Kopplad" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 #, fuzzy msgid "Call aborted" msgstr "avbrytade" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 #, fuzzy msgid "Could not pause the call" msgstr "Kunde inte ringa" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 #, fuzzy msgid "Pausing the current call..." msgstr "Nuvarande samtal" @@ -1620,119 +1684,119 @@ msgstr "" "SIP adressen som du matade in är inte rätt. Adressen borde se ut som sip:" "namn@domän, såsom sip:peter@exempel.se" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, c-format msgid "Could not login as %s" msgstr "Kunde inte logga in som %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 msgid "Remote ringing." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 #, fuzzy msgid "Remote ringing..." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "Tidig media" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Samtal med %s" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 #, fuzzy msgid "Call resumed." msgstr "Samtalet slut" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "Samtalet slut." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "Användare upptagen." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "Användaren temporärt inte tillgänglig." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "Användaren vill inte bli störd." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "Samtalet avböjdes." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 #, fuzzy msgid "No response." msgstr "Inget svar inom angiven tid" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 #, fuzzy msgid "Redirected" msgstr "Omdirigerat till %s..." -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 #, fuzzy msgid "Call failed." msgstr "Samtalet avböjdes." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "Registrering hos %s lyckades." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, c-format msgid "Unregistration on %s done." msgstr "Avregistrering hos %s lyckades." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "Inget svar inom angiven tid" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrering hos %s mislyckades: %s" @@ -1742,7 +1806,7 @@ msgstr "Registrering hos %s mislyckades: %s" msgid "Authentication token is %s" msgstr "Linphone - Autentisering krävs" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1785,10 +1849,6 @@ msgstr[1] "Du har %i missade samtal" #~ msgid "Now ready !" #~ msgstr "Klar nu!" -#, fuzzy -#~ msgid "Contacts" -#~ msgstr "Kontaktar" - #, fuzzy #~ msgid "Enable video" #~ msgstr "På" @@ -1847,9 +1907,6 @@ msgstr[1] "Du har %i missade samtal" #~ msgid "gtk-close" #~ msgstr "Kopplad" -#~ msgid "Ports" -#~ msgstr "Portar" - #~ msgid "Alsa sound source" #~ msgstr "Alsa ljud ingång" diff --git a/po/zh_CN.po b/po/zh_CN.po index 85fa75c47..f03c496d8 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 3.3.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2011-01-08 23:51+0800\n" "Last-Translator: Aron Xu \n" "Language-Team: Chinese (simplified) \n" @@ -19,55 +19,55 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "中断" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 #, fuzzy msgid "Missed" msgstr "丢失" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "拒绝" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 #, fuzzy msgid "Me" msgstr "静音" @@ -77,42 +77,42 @@ msgstr "静音" msgid "Couldn't find pixmap file: %s" msgstr "无法打开位图文件:%s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "运行时向标准输出记录调试信息。" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "启动到系统托盘,不显示主界面。" -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "现在呼叫的地址" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "是否设置呼叫自动应答" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "指定工作目录(应为安装目录例如 C:\\Program Files\\Linphone)" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" msgstr "与 %s 通话" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -124,68 +124,68 @@ msgstr "" "您是否允许他看到您的在线状态或者将它加为您的联系人允许?\n" "如果您回答否,则会将该人临时性的放入黑名单" -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "请输入 %s@%s 的密码:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 #, fuzzy msgid "Call error" msgstr "呼叫历史" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "呼叫结束" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "呼入" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 msgid "Decline" msgstr "拒绝" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, fuzzy msgid "Call paused" msgstr "中断" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "端口" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "网站" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "Linphone - 互联网视频电话" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "%s (默认)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -193,175 +193,175 @@ msgstr "" "未在此计算机上检测到声卡。\n" "您无法发送或接收音频呼叫。" -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "免费的 SIP 视频电话" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "在线状态" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名称" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" msgstr "呼叫 %s" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "在 %s 目录中查找 " -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "无效的 SIP 联系人!" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "呼叫 %s" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "发送消息给 %s" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, c-format msgid "Edit contact '%s'" msgstr "编辑联系人 %s" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "删除联系人 %s" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "从 %s 目录增加联系人 " -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "采样率(Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "状态" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "最小比特率(kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "参数" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "启用" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "禁用" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "帐户" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "英语" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "法语" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "瑞典语" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "意大利语" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "西班牙语" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "巴西葡萄牙语" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "波兰语" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "德语" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "俄语" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "日语" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "荷兰语" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "匈牙利语" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "捷克语" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "中文" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "您需要重启 linphone 以使语言选择生效。" -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -404,7 +404,7 @@ msgid "Found %i contact" msgid_plural "Found %i contacts" msgstr[0] "找到 %i 联系方式" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." @@ -412,278 +412,320 @@ msgstr "" "欢迎使用 Linphone!\n" "设置向导将帮助您配置打网络电话的 SIP 帐户。" -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 #, fuzzy msgid "Create an account on linphone.org" msgstr "通过选择一个用户名创建一个新的帐户" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 #, fuzzy msgid "I have already a linphone.org account and I just want to use it" msgstr "我已经有一个帐户,并想使用原来的帐户" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 #, fuzzy msgid "I have already a sip account and I just want to use it" msgstr "我已经有一个帐户,并想使用原来的帐户" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 msgid "Username:" msgstr "用户名:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" msgstr "密码:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 #, fuzzy msgid "Username*" msgstr "用户名" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 #, fuzzy msgid "Password*" msgstr "密码" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" msgstr "用户名:" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" msgstr "密码:" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "谢谢,您的帐户已经配置完毕,可以使用。" -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "欢迎使用帐户设置向导" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "帐户设置向导" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 #, fuzzy msgid "Configure your account (step 1/1)" msgstr "配置 SIP 帐户" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 #, fuzzy msgid "Terminating" msgstr "终止呼叫" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, fuzzy, c-format msgid "Call #%i" msgstr "呼叫 %s" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 #, fuzzy msgid "Not used" msgstr "未找到" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "ICE 过滤器" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "已重定向" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "正在进行 Stun 查找..." + +#: ../gtk/incall_view.c:242 +msgid "uPnp not available" +msgstr "" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "ICE 过滤器" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 msgid "Calling..." msgstr "正在呼叫..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 #, fuzzy msgid "Incoming call" msgstr "呼入" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 #, fuzzy msgid "In call" msgstr "正在呼叫" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 #, fuzzy msgid "Paused call" msgstr "正在呼叫" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 msgid "Call ended." msgstr "通话结束。" -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "呼叫失败。" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -707,222 +749,162 @@ msgid "label" msgstr "标签" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 msgid "In call" msgstr "呼入" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 msgid "Duration" msgstr "通话时间" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 msgid "Enable self-view" msgstr "启用自视" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 #, fuzzy msgid "Show debug window" msgstr "Linphone 调试窗口" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 #, fuzzy msgid "_Homepage" msgstr "主页" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 #, fuzzy msgid "Check _Updates" msgstr "检查更新" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 #, fuzzy msgid "Account assistant" msgstr "帐户设置向导" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 msgid "SIP address or phone number:" msgstr "SIP 地址或电话号码:" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +msgid "Contacts" +msgstr "联系人" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "添加" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "编辑" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "D" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "C" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "9" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "8" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "7" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "B" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "6" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "4" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "A" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "3" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "2" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "1" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "搜索" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 msgid "Add contacts from directory" msgstr "从目录增加联系人" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Add contact" msgstr "找到 %i 联系方式" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "数字键盘" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "Recent calls" msgstr "呼入" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 msgid "My current identity:" msgstr "当前地址:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "用户名" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "密码" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "网络连接:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "自动登录" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 msgid "Login information" msgstr "登录信息" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 msgid "Welcome !" msgstr "欢迎!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 #, fuzzy msgid "Online users" msgstr "" "全部用户\n" "在线用户" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Fiber Channel" msgstr "" "ADSL\n" "光纤" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 msgid "Default" msgstr "默认" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1090,6 +1072,10 @@ msgstr "" "音频编解码器\n" "视频编解码器" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "C" + #: ../gtk/parameters.ui.h:8 #, fuzzy msgid "SIP (UDP)" @@ -1130,209 +1116,218 @@ msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "视频 RTP/UDP:" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "音频 RTP/UDP:" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:23 +msgid "Network protocol and ports" +msgstr "" + +#: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" msgstr "直接连接到互联网" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" msgstr "在 NAT 或防火墙后(填写网关 IP)" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "公网 IP 地址:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "在 NAT 或防火墙后(使用 STUN 解决)" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 #, fuzzy msgid "Behind NAT / Firewall (use ICE)" msgstr "在 NAT 或防火墙后(使用 STUN 解决)" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +#, fuzzy +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "在 NAT 或防火墙后(使用 STUN 解决)" + +#: ../gtk/parameters.ui.h:30 msgid "Stun server:" msgstr "Stun 服务器:" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 msgid "NAT and Firewall" msgstr "NAT 及防火墙" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 msgid "Network settings" msgstr "网络设置" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 msgid "Ring sound:" msgstr "铃声文件:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "ALSA 特殊设备(可选):" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 msgid "Capture device:" msgstr "录音设备:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 msgid "Ring device:" msgstr "响铃设备:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 msgid "Playback device:" msgstr "回放设备:" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "启用回声抑制" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 msgid "Audio" msgstr "音频" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 msgid "Video input device:" msgstr "视频输入设备:" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "视频分辨率:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 msgid "Video" msgstr "视频" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "音视频设置" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "该段在您不使用SIP帐户时的SIP地址" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "您的显示名:" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 msgid "Your username:" msgstr "您的用户名:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 msgid "Your resulting SIP address:" msgstr "您的 SIP 地址结果:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 msgid "Default identity" msgstr "默认帐户" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "移除" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 msgid "Proxy accounts" msgstr "代理帐户" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "清除所有密码" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 msgid "Privacy" msgstr "隐私" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "SIP 帐户管理" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "启用" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "禁用" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 msgid "Codecs" msgstr "编解码器" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "0 表示 “没有限制”" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "上传速率限制 kbit/s:" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "下载速率限制 kbit/s:" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "带宽控制" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 msgid "Codecs" msgstr "编解码器" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 msgid "Language" msgstr "语言" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "显示高级设置" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 msgid "Level" msgstr "级别" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 msgid "User interface" msgstr "用户界面" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 msgid "Done" msgstr "完成" @@ -1403,7 +1398,7 @@ msgid "Audio IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "" #: ../gtk/call_statistics.ui.h:6 @@ -1411,6 +1406,14 @@ msgid "Video IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +msgid "Round trip time" +msgstr "" + +#: ../gtk/call_statistics.ui.h:9 #, fuzzy msgid "Call statistics and information" msgstr "联系人信息" @@ -1436,19 +1439,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "D" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "9" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "8" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "7" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "B" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "6" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "4" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "A" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "3" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "2" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "中断" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "完成" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "丢失" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1463,23 +1526,23 @@ msgstr "" "状态:%s\n" "状态:%i 分 %i 秒\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "呼出" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "就绪" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "查询电话号码目的地..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "该号码无法解析。" -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1487,50 +1550,50 @@ msgstr "" "无法解析给定的 SIP 地址,SIP 地址应有如下格式:\n" "sip:用户名@域名" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "联系中" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 #, fuzzy msgid "Could not call" msgstr "无法呼叫" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 msgid "is contacting you" msgstr "正在联系您" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr " 并询问了自动回答。" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "已连接。" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 #, fuzzy msgid "Call aborted" msgstr "中断" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 #, fuzzy msgid "Could not pause the call" msgstr "无法呼叫" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." msgstr "" @@ -1626,116 +1689,116 @@ msgstr "" "您输入的地址无效。\n" "它应具有“sip:用户名@代理域”的形式,例如 sip:alice@example.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, c-format msgid "Could not login as %s" msgstr "无法登录为 %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 msgid "Remote ringing." msgstr "响铃。" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 #, fuzzy msgid "Remote ringing..." msgstr "响铃。" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "与 %s 通话" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 #, fuzzy msgid "Call resumed." msgstr "呼叫结束" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "通话结束。" -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "被叫正忙。" -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "您呼叫的用户暂时无法接通。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "用户已开启免打扰功能。" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "呼叫被拒绝。" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "没有响应。" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "协议错误。" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 msgid "Redirected" msgstr "已重定向" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 msgid "Call failed." msgstr "呼叫失败。" -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "成功注册到 %s" -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, c-format msgid "Unregistration on %s done." msgstr "已在 %s 解除注册。" -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "没有响应,超时" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, c-format msgid "Registration on %s failed: %s" msgstr "注册到 %s 失败: %s" @@ -1745,12 +1808,15 @@ msgstr "注册到 %s 失败: %s" msgid "Authentication token is %s" msgstr "Linphone - 需要认证" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "您错过了 %i 个呼叫。" +#~ msgid "Keypad" +#~ msgstr "数字键盘" + #~ msgid "Chat with %s" #~ msgstr "与 %s 通话" @@ -1787,9 +1853,6 @@ msgstr[0] "您错过了 %i 个呼叫。" #~ msgid "Now ready !" #~ msgstr "就绪!" -#~ msgid "Contacts" -#~ msgstr "联系人" - #, fuzzy #~ msgid "Enable video" #~ msgstr "启用" @@ -1843,9 +1906,6 @@ msgstr[0] "您错过了 %i 个呼叫。" #~ msgid "Register at startup" #~ msgstr "在启动时注册" -#~ msgid "Ports" -#~ msgstr "端口" - #~ msgid "ITU-G.711 alaw encoder" #~ msgstr "ITU-G.711 alaw 编码器" diff --git a/po/zh_TW.po b/po/zh_TW.po index dbc09613d..c65dcb84f 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 3.4\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-08 10:35+0100\n" +"POT-Creation-Date: 2013-03-07 12:30+0100\n" "PO-Revision-Date: 2011-04-06 21:24+0800\n" "Last-Translator: Chao-Hsiung Liao \n" "Language-Team: \n" @@ -18,55 +18,55 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" #: ../gtk/calllogs.c:82 +msgid "n/a" +msgstr "" + +#: ../gtk/calllogs.c:85 #, fuzzy msgid "Aborted" msgstr "已放棄" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:88 #, fuzzy msgid "Missed" msgstr "未接" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:91 #, fuzzy msgid "Declined" msgstr "拒接" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:103 #, c-format msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:108 #, c-format msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 #, fuzzy msgid "Me" msgstr "靜音" @@ -76,43 +76,43 @@ msgstr "靜音" msgid "Couldn't find pixmap file: %s" msgstr "找不到 pixmap 檔:%s" -#: ../gtk/main.c:89 +#: ../gtk/main.c:88 msgid "log to stdout some debug information while running." msgstr "執行時將一些除錯資訊記錄到標準輸出。" -#: ../gtk/main.c:96 +#: ../gtk/main.c:95 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:102 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." msgstr "只在系統匣啟動,不要顯示主要介面。" -#: ../gtk/main.c:117 +#: ../gtk/main.c:116 msgid "address to call right now" msgstr "現在要打電話的位址" -#: ../gtk/main.c:124 +#: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" msgstr "如啟用此項,將會自動接聽來電" -#: ../gtk/main.c:131 +#: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" "指定一個工作目錄(應該為安裝的根目錄,例如:c:\\Program Files\\Linphone)" -#: ../gtk/main.c:498 +#: ../gtk/main.c:510 #, c-format msgid "Call with %s" msgstr "和 %s 通話" -#: ../gtk/main.c:871 +#: ../gtk/main.c:941 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -124,7 +124,7 @@ msgstr "" "您是否要允許他看見您的上線狀態或將他加入您的連絡人清單?\n" "如果您回答否,這個人會被暫時列入黑名單。" -#: ../gtk/main.c:948 +#: ../gtk/main.c:1018 #, c-format msgid "" "Please enter your password for username %s\n" @@ -133,61 +133,61 @@ msgstr "" "請輸入您使用者名稱 %s\n" "於網域 %s 的密碼:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1121 #, fuzzy msgid "Call error" msgstr "通話紀錄" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "通話已結束" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "來電" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" msgstr "接聽" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 msgid "Decline" msgstr "拒接" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1137 #, fuzzy msgid "Call paused" msgstr "通話已放棄" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1137 +#, fuzzy, c-format +msgid "by %s" +msgstr "連接埠" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1348 msgid "Website link" msgstr "網站連結" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" msgstr "Linphone - 網路視訊電話" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" msgstr "%s (預設值)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" msgstr "我們被轉接到 %s" -#: ../gtk/main.c:1724 +#: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -195,175 +195,175 @@ msgstr "" "在這臺電腦中偵測不到音效卡。\n" "您將無法傳送或接收語音電話。" -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "自由的 SIP 視訊電話" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:366 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:540 msgid "Presence status" msgstr "上線狀態" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名稱" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:569 #, fuzzy msgid "Call" msgstr "播打給 %s" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:574 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" msgstr "在 %s 目錄中搜尋" -#: ../gtk/friendlist.c:730 +#: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" msgstr "無效的 sip 連絡人!" -#: ../gtk/friendlist.c:775 +#: ../gtk/friendlist.c:807 #, c-format msgid "Call %s" msgstr "播打給 %s" -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" msgstr "傳送文字給 %s" -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:809 #, c-format msgid "Edit contact '%s'" msgstr "編輯連絡人「%s」" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" msgstr "刪除連絡人「%s」" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" msgstr "從 %s 目錄加入新的連絡人" -#: ../gtk/propertybox.c:368 +#: ../gtk/propertybox.c:373 msgid "Rate (Hz)" msgstr "頻率 (Hz)" -#: ../gtk/propertybox.c:374 +#: ../gtk/propertybox.c:379 msgid "Status" msgstr "狀態" -#: ../gtk/propertybox.c:380 +#: ../gtk/propertybox.c:385 msgid "Min bitrate (kbit/s)" msgstr "最小頻寬 (kbit/s)" -#: ../gtk/propertybox.c:387 +#: ../gtk/propertybox.c:392 msgid "Parameters" msgstr "參數" -#: ../gtk/propertybox.c:430 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "已啟用" -#: ../gtk/propertybox.c:432 ../gtk/propertybox.c:573 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "已停用" -#: ../gtk/propertybox.c:619 +#: ../gtk/propertybox.c:624 msgid "Account" msgstr "帳號" -#: ../gtk/propertybox.c:759 +#: ../gtk/propertybox.c:764 msgid "English" msgstr "英語" -#: ../gtk/propertybox.c:760 +#: ../gtk/propertybox.c:765 msgid "French" msgstr "法語" -#: ../gtk/propertybox.c:761 +#: ../gtk/propertybox.c:766 msgid "Swedish" msgstr "瑞典語" -#: ../gtk/propertybox.c:762 +#: ../gtk/propertybox.c:767 msgid "Italian" msgstr "義大利語" -#: ../gtk/propertybox.c:763 +#: ../gtk/propertybox.c:768 msgid "Spanish" msgstr "西班牙語" -#: ../gtk/propertybox.c:764 +#: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" msgstr "巴西葡萄牙語" -#: ../gtk/propertybox.c:765 +#: ../gtk/propertybox.c:770 msgid "Polish" msgstr "波蘭語" -#: ../gtk/propertybox.c:766 +#: ../gtk/propertybox.c:771 msgid "German" msgstr "德語" -#: ../gtk/propertybox.c:767 +#: ../gtk/propertybox.c:772 msgid "Russian" msgstr "俄語" -#: ../gtk/propertybox.c:768 +#: ../gtk/propertybox.c:773 msgid "Japanese" msgstr "日語" -#: ../gtk/propertybox.c:769 +#: ../gtk/propertybox.c:774 msgid "Dutch" msgstr "荷蘭語" -#: ../gtk/propertybox.c:770 +#: ../gtk/propertybox.c:775 msgid "Hungarian" msgstr "匈牙利語" -#: ../gtk/propertybox.c:771 +#: ../gtk/propertybox.c:776 msgid "Czech" msgstr "捷克語" -#: ../gtk/propertybox.c:772 +#: ../gtk/propertybox.c:777 msgid "Chinese" msgstr "中文" -#: ../gtk/propertybox.c:773 +#: ../gtk/propertybox.c:778 msgid "Traditional Chinese" msgstr "" -#: ../gtk/propertybox.c:774 +#: ../gtk/propertybox.c:779 msgid "Norwegian" msgstr "" -#: ../gtk/propertybox.c:775 +#: ../gtk/propertybox.c:780 msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "您需要重新啟動 linphone 才能讓新選擇的語言生效。" -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:933 msgid "None" msgstr "" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:937 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:943 msgid "ZRTP" msgstr "" @@ -406,7 +406,7 @@ msgid "Found %i contact" msgid_plural "Found %i contacts" msgstr[0] "找不到 %i 個連絡人" -#: ../gtk/setupwizard.c:33 +#: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." @@ -414,275 +414,318 @@ msgstr "" "歡迎!\n" "這個助理會協助您使用電話的 SIP 帳號。" -#: ../gtk/setupwizard.c:42 +#: ../gtk/setupwizard.c:43 #, fuzzy msgid "Create an account on linphone.org" msgstr "以選擇的使用者名稱建立一個帳號" -#: ../gtk/setupwizard.c:43 +#: ../gtk/setupwizard.c:44 #, fuzzy msgid "I have already a linphone.org account and I just want to use it" msgstr "我已經有帳號,並且要使用這個帳號" -#: ../gtk/setupwizard.c:44 +#: ../gtk/setupwizard.c:45 #, fuzzy msgid "I have already a sip account and I just want to use it" msgstr "我已經有帳號,並且要使用這個帳號" -#: ../gtk/setupwizard.c:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" msgstr "" -#: ../gtk/setupwizard.c:91 +#: ../gtk/setupwizard.c:92 msgid "Username:" msgstr "使用者名稱:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" msgstr "密碼: " -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" msgstr "" -#: ../gtk/setupwizard.c:120 +#: ../gtk/setupwizard.c:121 #, fuzzy msgid "Username*" msgstr "使用者名稱" -#: ../gtk/setupwizard.c:121 +#: ../gtk/setupwizard.c:122 #, fuzzy msgid "Password*" msgstr "密碼" -#: ../gtk/setupwizard.c:124 +#: ../gtk/setupwizard.c:125 msgid "Domain*" msgstr "" -#: ../gtk/setupwizard.c:125 +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 +#: ../gtk/setupwizard.c:298 msgid "(*) Required fields" msgstr "" -#: ../gtk/setupwizard.c:298 +#: ../gtk/setupwizard.c:299 #, fuzzy msgid "Username: (*)" msgstr "使用者名稱:" -#: ../gtk/setupwizard.c:300 +#: ../gtk/setupwizard.c:301 #, fuzzy msgid "Password: (*)" msgstr "密碼: " -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" msgstr "" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" msgstr "" -#: ../gtk/setupwizard.c:368 +#: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -#: ../gtk/setupwizard.c:379 +#: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "謝謝您。您的帳號已設定完成並且可以使用。" -#: ../gtk/setupwizard.c:387 +#: ../gtk/setupwizard.c:388 msgid "" "Please validate your account by clicking on the link we just sent you by " "email.\n" "Then come back here and press Next button." msgstr "" -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" msgstr "歡迎使用帳號設定助理" -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" msgstr "帳號設定助理" -#: ../gtk/setupwizard.c:565 +#: ../gtk/setupwizard.c:575 #, fuzzy msgid "Configure your account (step 1/1)" msgstr "設定 SIP 帳號" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" msgstr "" -#: ../gtk/setupwizard.c:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" msgstr "" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" msgstr "" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" msgstr "" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, fuzzy, c-format msgid "Call #%i" msgstr "播打給 %s" -#: ../gtk/incall_view.c:150 +#: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" msgstr "" -#: ../gtk/incall_view.c:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 #, fuzzy msgid "Not used" msgstr "找不到" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" msgstr "" -#: ../gtk/incall_view.c:221 +#: ../gtk/incall_view.c:222 #, fuzzy msgid "ICE failed" msgstr "ICE 過濾器" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" msgstr "" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" msgstr "" -#: ../gtk/incall_view.c:227 +#: ../gtk/incall_view.c:228 #, fuzzy msgid "Direct" msgstr "已重新導向" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" msgstr "" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "" + +#: ../gtk/incall_view.c:240 +#, fuzzy +msgid "uPnP in progress" +msgstr "正在進行 Stun 搜尋..." + +#: ../gtk/incall_view.c:242 +msgid "uPnp not available" +msgstr "" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "" + +#: ../gtk/incall_view.c:246 +#, fuzzy +msgid "uPnP failed" +msgstr "ICE 過濾器" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:477 msgid "Calling..." msgstr "播打..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:491 msgid "Incoming call" msgstr "來電" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:528 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:530 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:532 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:534 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:536 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:652 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:664 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:685 msgid "In call" msgstr "通話中" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:719 msgid "Paused call" msgstr "暫停通話" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:749 msgid "Call ended." msgstr "通話結束。" -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:779 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:782 #, fuzzy msgid "Transfer done." msgstr "轉接" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:785 #, fuzzy msgid "Transfer failed." msgstr "轉接" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:829 msgid "Resume" msgstr "繼續" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" msgstr "暫停" +#: ../gtk/incall_view.c:901 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:901 +#, fuzzy +msgid "(Paused)" +msgstr "暫停" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -706,212 +749,152 @@ msgid "label" msgstr "標籤" #: ../gtk/main.ui.h:8 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:9 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:10 +#: ../gtk/main.ui.h:11 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:12 msgid "Transfer" msgstr "轉接" -#: ../gtk/main.ui.h:14 +#: ../gtk/main.ui.h:15 msgid "In call" msgstr "通話中" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:16 msgid "Duration" msgstr "時間長度" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:17 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:18 msgid "_Options" msgstr "選項(_O)" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:19 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:20 msgid "Enable self-view" msgstr "啟用自拍檢視" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:21 msgid "_Help" msgstr "求助(_H)" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:22 msgid "Show debug window" msgstr "顯示除錯視窗" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:23 msgid "_Homepage" msgstr "官方網頁(_H)" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:24 msgid "Check _Updates" msgstr "檢查更新(_U)" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:25 #, fuzzy msgid "Account assistant" msgstr "帳號設定助理" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:26 msgid "SIP address or phone number:" msgstr "SIP 位址或電話號碼:" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:27 msgid "Initiate a new call" msgstr "打出新電話" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:28 +msgid "Contacts" +msgstr "連絡人" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "加入" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "編輯" -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "D" - -#: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" - #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" - -#: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" - -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "C" - -#: ../gtk/main.ui.h:34 -msgid "9" -msgstr "9" - -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "8" - -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "7" - -#: ../gtk/main.ui.h:37 -msgid "B" -msgstr "B" - -#: ../gtk/main.ui.h:38 -msgid "6" -msgstr "6" - -#: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" - -#: ../gtk/main.ui.h:40 -msgid "4" -msgstr "4" - -#: ../gtk/main.ui.h:41 -msgid "A" -msgstr "A" - -#: ../gtk/main.ui.h:42 -msgid "3" -msgstr "3" - -#: ../gtk/main.ui.h:43 -msgid "2" -msgstr "2" - -#: ../gtk/main.ui.h:44 -msgid "1" -msgstr "1" - -#: ../gtk/main.ui.h:45 msgid "Search" msgstr "搜尋" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:32 msgid "Add contacts from directory" msgstr "從目錄加入連絡人" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:33 msgid "Add contact" msgstr "加入聯絡人" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "撥號盤" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "Recent calls" msgstr "通話中" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:35 msgid "My current identity:" msgstr "我目前的使用者識別:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "使用者名稱" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "密碼" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:38 msgid "Internet connection:" msgstr "網路連線:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:39 msgid "Automatically log me in" msgstr "將我自動登入" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:40 msgid "Login information" msgstr "登入資訊" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:41 msgid "Welcome !" msgstr "歡迎使用!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:42 msgid "All users" msgstr "所有使用者" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:43 msgid "Online users" msgstr "線上使用者" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:44 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:45 msgid "Fiber Channel" msgstr "光纖通道" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:46 msgid "Default" msgstr "預設值" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:47 msgid "Delete" msgstr "" @@ -1069,6 +1052,10 @@ msgstr "音訊編碼解碼器" msgid "Video codecs" msgstr "視訊編碼解碼器" +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +msgid "C" +msgstr "C" + #: ../gtk/parameters.ui.h:8 #, fuzzy msgid "SIP (UDP)" @@ -1109,209 +1096,218 @@ msgid "Media encryption type" msgstr "" #: ../gtk/parameters.ui.h:17 -msgid "Tunnel" -msgstr "" - -#: ../gtk/parameters.ui.h:18 msgid "Video RTP/UDP:" msgstr "視訊 RTP/UDP:" -#: ../gtk/parameters.ui.h:19 +#: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" msgstr "音效 RTP/UDP:" -#: ../gtk/parameters.ui.h:20 +#: ../gtk/parameters.ui.h:19 msgid "DSCP fields" msgstr "" -#: ../gtk/parameters.ui.h:21 +#: ../gtk/parameters.ui.h:20 msgid "Fixed" msgstr "" +#: ../gtk/parameters.ui.h:21 +msgid "Tunnel" +msgstr "" + #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" +msgid "Media encryption is mandatory" msgstr "" #: ../gtk/parameters.ui.h:23 +msgid "Network protocol and ports" +msgstr "" + +#: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" msgstr "直接連線到網際網路" -#: ../gtk/parameters.ui.h:24 +#: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" msgstr "在 NAT / 防火牆之後 (在下面指定閘道器 IP)" -#: ../gtk/parameters.ui.h:25 +#: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "公共 IP 地址:" -#: ../gtk/parameters.ui.h:26 +#: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "在 NAT / 防火牆之後 (使用 STUN 解析)" -#: ../gtk/parameters.ui.h:27 +#: ../gtk/parameters.ui.h:28 #, fuzzy msgid "Behind NAT / Firewall (use ICE)" msgstr "在 NAT / 防火牆之後 (使用 STUN 解析)" -#: ../gtk/parameters.ui.h:28 +#: ../gtk/parameters.ui.h:29 +#, fuzzy +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "在 NAT / 防火牆之後 (使用 STUN 解析)" + +#: ../gtk/parameters.ui.h:30 msgid "Stun server:" msgstr "Stun 伺服器:" -#: ../gtk/parameters.ui.h:29 +#: ../gtk/parameters.ui.h:31 msgid "NAT and Firewall" msgstr "NAT 與防火牆" -#: ../gtk/parameters.ui.h:30 +#: ../gtk/parameters.ui.h:32 msgid "Network settings" msgstr "網路設定值" -#: ../gtk/parameters.ui.h:31 +#: ../gtk/parameters.ui.h:33 msgid "Ring sound:" msgstr "鈴聲音效:" -#: ../gtk/parameters.ui.h:32 +#: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" msgstr "ALSA 特殊裝置 (選擇性):" -#: ../gtk/parameters.ui.h:33 +#: ../gtk/parameters.ui.h:35 msgid "Capture device:" msgstr "捕捉裝置:" -#: ../gtk/parameters.ui.h:34 +#: ../gtk/parameters.ui.h:36 msgid "Ring device:" msgstr "響鈴裝置:" -#: ../gtk/parameters.ui.h:35 +#: ../gtk/parameters.ui.h:37 msgid "Playback device:" msgstr "播放裝置" -#: ../gtk/parameters.ui.h:36 +#: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" msgstr "啟用回音消除" -#: ../gtk/parameters.ui.h:37 +#: ../gtk/parameters.ui.h:39 msgid "Audio" msgstr "音效" -#: ../gtk/parameters.ui.h:38 +#: ../gtk/parameters.ui.h:40 msgid "Video input device:" msgstr "視訊輸入裝置:" -#: ../gtk/parameters.ui.h:39 +#: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" msgstr "偏好的視訊解析度:" -#: ../gtk/parameters.ui.h:40 +#: ../gtk/parameters.ui.h:42 msgid "Video" msgstr "視訊" -#: ../gtk/parameters.ui.h:41 +#: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" msgstr "多媒體設定值" -#: ../gtk/parameters.ui.h:42 +#: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "這一區在不使用 SIP 帳號時定義您的 SIP 位址" -#: ../gtk/parameters.ui.h:43 +#: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" msgstr "您的顯示名稱 (例如: John Doe):" -#: ../gtk/parameters.ui.h:44 +#: ../gtk/parameters.ui.h:46 msgid "Your username:" msgstr "您的使用者名稱:" -#: ../gtk/parameters.ui.h:45 +#: ../gtk/parameters.ui.h:47 msgid "Your resulting SIP address:" msgstr "您組成的 SIP 位址:" -#: ../gtk/parameters.ui.h:46 +#: ../gtk/parameters.ui.h:48 msgid "Default identity" msgstr "預設身分識別" -#: ../gtk/parameters.ui.h:47 +#: ../gtk/parameters.ui.h:49 msgid "Wizard" msgstr "" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "移除" -#: ../gtk/parameters.ui.h:51 +#: ../gtk/parameters.ui.h:53 msgid "Proxy accounts" msgstr "代理伺服器帳號" -#: ../gtk/parameters.ui.h:52 +#: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" msgstr "消除所有的密碼" -#: ../gtk/parameters.ui.h:53 +#: ../gtk/parameters.ui.h:55 msgid "Privacy" msgstr "隱私" -#: ../gtk/parameters.ui.h:54 +#: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" msgstr "管理 SIP 帳號" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "啟用" -#: ../gtk/parameters.ui.h:56 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "停用" -#: ../gtk/parameters.ui.h:57 +#: ../gtk/parameters.ui.h:59 msgid "Codecs" msgstr "編碼解碼器" -#: ../gtk/parameters.ui.h:58 +#: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" msgstr "0 表示「不限制」" -#: ../gtk/parameters.ui.h:59 +#: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "上傳速度限制於 Kbit/sec:" -#: ../gtk/parameters.ui.h:60 +#: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" msgstr "下載速度限制於 Kbit/sec:" -#: ../gtk/parameters.ui.h:61 +#: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" msgstr "" -#: ../gtk/parameters.ui.h:62 +#: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" -#: ../gtk/parameters.ui.h:63 +#: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" msgstr "頻寬控制" -#: ../gtk/parameters.ui.h:64 +#: ../gtk/parameters.ui.h:66 msgid "Codecs" msgstr "編碼解碼器" -#: ../gtk/parameters.ui.h:65 +#: ../gtk/parameters.ui.h:67 msgid "Language" msgstr "語言" -#: ../gtk/parameters.ui.h:66 +#: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" msgstr "顯示進階設定值" -#: ../gtk/parameters.ui.h:67 +#: ../gtk/parameters.ui.h:69 msgid "Level" msgstr "級數" -#: ../gtk/parameters.ui.h:68 +#: ../gtk/parameters.ui.h:70 msgid "User interface" msgstr "使用者介面" -#: ../gtk/parameters.ui.h:69 +#: ../gtk/parameters.ui.h:71 msgid "Done" msgstr "完成" @@ -1377,7 +1373,7 @@ msgid "Audio IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:5 -msgid "Media connectivity" +msgid "Audio Media connectivity" msgstr "" #: ../gtk/call_statistics.ui.h:6 @@ -1385,6 +1381,14 @@ msgid "Video IP bandwidth usage" msgstr "" #: ../gtk/call_statistics.ui.h:7 +msgid "Video Media connectivity" +msgstr "" + +#: ../gtk/call_statistics.ui.h:8 +msgid "Round trip time" +msgstr "" + +#: ../gtk/call_statistics.ui.h:9 #, fuzzy msgid "Call statistics and information" msgstr "連絡人資訊" @@ -1410,19 +1414,79 @@ msgstr "" msgid "Configure http proxy (optional)" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../gtk/keypad.ui.h:1 +msgid "D" +msgstr "D" + +#: ../gtk/keypad.ui.h:2 +msgid "#" +msgstr "#" + +#: ../gtk/keypad.ui.h:3 +msgid "0" +msgstr "0" + +#: ../gtk/keypad.ui.h:4 +msgid "*" +msgstr "*" + +#: ../gtk/keypad.ui.h:6 +msgid "9" +msgstr "9" + +#: ../gtk/keypad.ui.h:7 +msgid "8" +msgstr "8" + +#: ../gtk/keypad.ui.h:8 +msgid "7" +msgstr "7" + +#: ../gtk/keypad.ui.h:9 +msgid "B" +msgstr "B" + +#: ../gtk/keypad.ui.h:10 +msgid "6" +msgstr "6" + +#: ../gtk/keypad.ui.h:11 +msgid "5" +msgstr "5" + +#: ../gtk/keypad.ui.h:12 +msgid "4" +msgstr "4" + +#: ../gtk/keypad.ui.h:13 +msgid "A" +msgstr "A" + +#: ../gtk/keypad.ui.h:14 +msgid "3" +msgstr "3" + +#: ../gtk/keypad.ui.h:15 +msgid "2" +msgstr "2" + +#: ../gtk/keypad.ui.h:16 +msgid "1" +msgstr "1" + +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "已放棄" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "已完成" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "未接" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1437,69 +1501,69 @@ msgstr "" "狀態:%s\n" "持續時間:%i 分 %i 秒\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "去電" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1314 msgid "Ready" msgstr "準備就緒" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "尋找電話號碼目的端..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "無法解析這個號碼。" -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "無法解析指定的 sip 位址。sip 網址通常看起來像 sip:user@domain" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" msgstr "正在連絡" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2439 msgid "Could not call" msgstr "無法通話" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "抱歉,我們已達瀏同步通話的最大數目" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2731 msgid "is contacting you" msgstr "正在連絡您" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr "並要求自動接聽。" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "修改通話參數..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "已連線。" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3166 msgid "Call aborted" msgstr "通話已放棄" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3351 msgid "Could not pause the call" msgstr "無法暫停通話" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3356 msgid "Pausing the current call..." msgstr "暫停目前的通話..." @@ -1598,115 +1662,115 @@ msgstr "" "您輸入的 sip 身分是無效的。\n" "它應該看起來像 sip:使用者名稱@代理網域,像是 sip:alice@example.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1068 #, c-format msgid "Could not login as %s" msgstr "無法以 %s 登入" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:283 msgid "Remote ringing." msgstr "遠端響鈴。" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:303 msgid "Remote ringing..." msgstr "遠端響鈴..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "早期媒體。" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:365 #, c-format msgid "Call with %s is paused." msgstr "和 %s 的通話已暫停。" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." msgstr "通話由 %s 接聽 - 保留中。" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:389 msgid "Call resumed." msgstr "通話已繼續。" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:394 #, c-format msgid "Call answered by %s." msgstr "通話由 %s 接聽。" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:409 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:457 #, fuzzy msgid "We have been resumed." msgstr "我們要繼續了..." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:466 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:541 msgid "Call terminated." msgstr "通話已終止。" -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:552 msgid "User is busy." msgstr "使用者現正忙碌。" -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:553 msgid "User is temporarily unavailable." msgstr "使用者暫時無法聯繫。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:555 msgid "User does not want to be disturbed." msgstr "使用者不想要被打擾。" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:556 msgid "Call declined." msgstr "通話被拒接。" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:568 msgid "No response." msgstr "沒有回應。" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:572 msgid "Protocol error." msgstr "通訊協定錯誤。" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:588 msgid "Redirected" msgstr "已重新導向" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:630 msgid "Call failed." msgstr "通話失敗。" -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:733 #, c-format msgid "Registration on %s successful." msgstr "在 %s 註冊成功。" -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:734 #, c-format msgid "Unregistration on %s done." msgstr "在 %s 取消註冊完成。" -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:754 msgid "no response timeout" msgstr "沒有回應逾時" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:757 #, c-format msgid "Registration on %s failed: %s" msgstr "在 %s 註冊失敗:%s" @@ -1716,12 +1780,15 @@ msgstr "在 %s 註冊失敗:%s" msgid "Authentication token is %s" msgstr "驗證失敗" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2314 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "您有 %i 通未接來電。" +#~ msgid "Keypad" +#~ msgstr "撥號盤" + #~ msgid "Chat with %s" #~ msgstr "和 %s 聊天" @@ -1758,9 +1825,6 @@ msgstr[0] "您有 %i 通未接來電。" #~ msgid "Now ready !" #~ msgstr "現在已就緒!" -#~ msgid "Contacts" -#~ msgstr "連絡人" - #, fuzzy #~ msgid "Enable video" #~ msgstr "已啟用" @@ -1833,9 +1897,6 @@ msgstr[0] "您有 %i 通未接來電。" #~ msgid "gtk-close" #~ msgstr "gtk-close" -#~ msgid "Ports" -#~ msgstr "連接埠" - #~ msgid "Sorry, you have to pause or stop the current call first !" #~ msgstr "抱歉,您必須先暫停或停止目前的通話!" From a03872ff7f692add9483de4c2f8599a712add033 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 7 Mar 2013 12:42:05 +0100 Subject: [PATCH 124/281] update README.macos --- README.macos | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.macos b/README.macos index 3fb5106a3..29666f440 100644 --- a/README.macos +++ b/README.macos @@ -44,7 +44,7 @@ You need: $ wget http://ftp.gnome.org/pub/gnome/sources/glib-networking/2.34/glib-networking-2.34.2.tar.xz $ tar -xvzf glib-networking-2.34.2.tar.xz $ cd glib-networking-2.34.2 - $ ./configure --prefix=/opt/local && make + $ ./configure --prefix=/opt/local --without-ca-certificates && make $ sudo make install - Compile and install the tunnel library (optional, proprietary extension only) From fdf35251fe9c3b39e61b3d75ff902389bd767a6e Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 7 Mar 2013 16:08:04 +0100 Subject: [PATCH 125/281] history chat delete update README for macos --- README.macos | 3 + coreapi/chat.c | 2 +- coreapi/linphonecore.h | 1 + coreapi/message_storage.c | 368 +++++++++++++++++++------------------- gtk/chat.c | 6 +- gtk/friendlist.c | 26 +++ gtk/propertybox.c | 1 + 7 files changed, 224 insertions(+), 183 deletions(-) diff --git a/README.macos b/README.macos index 29666f440..bb78575bf 100644 --- a/README.macos +++ b/README.macos @@ -39,6 +39,9 @@ You need: - Install additional librairies required for wizard (linphone.org account creation assistant) $ sudo port install libsoup + - Install sqlite3 for message storage + $ sudo port install sqlite3 + ** WARNING 2013-03-06 glib-networking is currently broken in macports - generates crashes or hangs when used in a bundle ** As a temporary workaround, build a newer version by yourself: $ wget http://ftp.gnome.org/pub/gnome/sources/glib-networking/2.34/glib-networking-2.34.2.tar.xz diff --git a/coreapi/chat.c b/coreapi/chat.c index 5f79849dc..046c34733 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -182,10 +182,10 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag linphone_chat_message_set_external_body_url(msg, sal_msg->url); } linphone_address_destroy(addr); - linphone_chat_room_message_received(cr,lc,msg); linphone_core_set_history_message(cr,to,from,INCOMING, msg->message,my_ctime_r(&msg->time,buf),NOT_READ, LinphoneChatMessageStateDelivered); + linphone_chat_room_message_received(cr,lc,msg); ms_free(cleanfrom); ms_free(from); } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index c1054922d..49074db3e 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1420,6 +1420,7 @@ int linphone_core_get_video_dscp(const LinphoneCore *lc); MSList *linphone_chat_room_get_history(const char *to,LinphoneChatRoom *cr,int nb_message); void linphone_core_set_messages_flag_read(LinphoneChatRoom *cr,const char *from, int read); +void linphone_core_delete_history(LinphoneCore *lc,const char *from); #ifdef __cplusplus } diff --git a/coreapi/message_storage.c b/coreapi/message_storage.c index 90665c26c..3d6c45d93 100644 --- a/coreapi/message_storage.c +++ b/coreapi/message_storage.c @@ -1,82 +1,82 @@ -/* -message_storage.c -Copyright (C) 2012 Belledonne Communications, Grenoble, France - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#include "private.h" -#include "linphonecore.h" - -#ifdef WIN32 - -static inline char *my_ctime_r(const time_t *t, char *buf){ - strcpy(buf,ctime(t)); - return buf; -} - -#else -#define my_ctime_r ctime_r -#endif - -#ifdef MSG_STORAGE_ENABLED - -#include "sqlite3.h" - +/* +message_storage.c +Copyright (C) 2012 Belledonne Communications, Grenoble, France + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "private.h" +#include "linphonecore.h" + +#ifdef WIN32 + +static inline char *my_ctime_r(const time_t *t, char *buf){ + strcpy(buf,ctime(t)); + return buf; +} + +#else +#define my_ctime_r ctime_r +#endif + +#ifdef MSG_STORAGE_ENABLED + +#include "sqlite3.h" + static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; - -#define CONFIG_FILE ".linphone-history.db" - -char *linphone_message_storage_get_config_file(const char *filename){ - const int path_max=1024; - char *config_file=(char *)malloc(path_max*sizeof(char)); - if (filename==NULL) filename=CONFIG_FILE; - /*try accessing a local file first if exists*/ - if (access(CONFIG_FILE,F_OK)==0){ - snprintf(config_file,path_max,"%s",filename); - }else{ -#ifdef WIN32 - const char *appdata=getenv("APPDATA"); - if (appdata){ - snprintf(config_file,path_max,"%s\\%s",appdata,LINPHONE_CONFIG_DIR); - CreateDirectory(config_file,NULL); - snprintf(config_file,path_max,"%s\\%s\\%s",appdata,LINPHONE_CONFIG_DIR,filename); - } -#else - const char *home=getenv("HOME"); - if (home==NULL) home="."; - snprintf(config_file,path_max,"%s/%s",home,filename); -#endif - } - return config_file; -} - -void create_chat_message(char **argv, void *data){ - LinphoneChatRoom *cr = (LinphoneChatRoom *)data; - LinphoneChatMessage* new_message = linphone_chat_room_create_message(cr,argv[4]); +static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; + +#define CONFIG_FILE ".linphone-history.db" + +char *linphone_message_storage_get_config_file(const char *filename){ + const int path_max=1024; + char *config_file=(char *)malloc(path_max*sizeof(char)); + if (filename==NULL) filename=CONFIG_FILE; + /*try accessing a local file first if exists*/ + if (access(CONFIG_FILE,F_OK)==0){ + snprintf(config_file,path_max,"%s",filename); + }else{ +#ifdef WIN32 + const char *appdata=getenv("APPDATA"); + if (appdata){ + snprintf(config_file,path_max,"%s\\%s",appdata,LINPHONE_CONFIG_DIR); + CreateDirectory(config_file,NULL); + snprintf(config_file,path_max,"%s\\%s\\%s",appdata,LINPHONE_CONFIG_DIR,filename); + } +#else + const char *home=getenv("HOME"); + if (home==NULL) home="."; + snprintf(config_file,path_max,"%s/%s",home,filename); +#endif + } + return config_file; +} + +void create_chat_message(char **argv, void *data){ + LinphoneChatRoom *cr = (LinphoneChatRoom *)data; + LinphoneChatMessage* new_message = linphone_chat_room_create_message(cr,argv[4]); struct tm ret={0}; char tmp1[80]={0}; - char tmp2[80]={0}; - - if(atoi(argv[3])==INCOMING){ - linphone_chat_message_set_from(new_message,linphone_address_new(argv[2])); - } else { - linphone_chat_message_set_from(new_message,linphone_address_new(argv[1])); - } - + char tmp2[80]={0}; + + if(atoi(argv[3])==INCOMING){ + linphone_chat_message_set_from(new_message,linphone_address_new(argv[2])); + } else { + linphone_chat_message_set_from(new_message,linphone_address_new(argv[1])); + } + if(argv[5]!=NULL){ int i,j; sscanf(argv[5],"%3c %3c%d%d:%d:%d %d",tmp1,tmp2,&ret.tm_mday, @@ -87,108 +87,116 @@ void create_chat_message(char **argv, void *data){ } for(j=0;j<12;j++) { if(strcmp(tmp2,months[j])==0) ret.tm_mon=j; - } - } - new_message->time=argv[5]!=NULL ? mktime(&ret) : time(NULL); - new_message->state=atoi(argv[7]); - cr->messages_hist=ms_list_prepend(cr->messages_hist,(void *)new_message); -} - -static int callback(void *data, int argc, char **argv, char **colName){ - create_chat_message(argv,data); - return 0; -} - -void linphone_sql_request_message(sqlite3 *db,const char *stmt,void *data){ - char* errmsg; - int ret; - ret=sqlite3_exec(db,stmt,callback,data,&errmsg); - if(ret != SQLITE_OK) { - printf("Error in creation: %s.\n", errmsg); - } -} - -void linphone_sql_request(sqlite3* db,const char *stmt){ - char* errmsg; - int ret; - ret=sqlite3_exec(db,stmt,0,0,&errmsg); - if(ret != SQLITE_OK) { - printf("Error in creation: %s.\n", errmsg); - } -} - -void linphone_core_set_history_message(LinphoneChatRoom *cr,const char *local_contact,const char *remote_contact, - int direction, const char *message,const char *date, int read, int state){ - LinphoneCore *lc=linphone_chat_room_get_lc(cr); - char *buf=sqlite3_mprintf("insert into history values(NULL,%Q,%Q,%i,%Q,%Q,%i,%i);", - local_contact,remote_contact,direction,message,date,read,state); - linphone_sql_request(lc->db,buf); -} - -void linphone_core_set_message_state(LinphoneChatRoom *cr,const char *message, int state, time_t date){ - LinphoneCore *lc=linphone_chat_room_get_lc(cr); - char time_str[26]; - char *buf=sqlite3_mprintf("update history set status=%i where message = %Q and time = %Q;", - state,message,my_ctime_r(&date,time_str)); - linphone_sql_request(lc->db,buf); -} - -void linphone_core_set_messages_flag_read(LinphoneChatRoom *cr,const char *from, int read){ - LinphoneCore *lc=linphone_chat_room_get_lc(cr); - char *buf=sqlite3_mprintf("update history set read=%i where remoteContact = %Q;", - read,from); - linphone_sql_request(lc->db,buf); -} - -MSList *linphone_chat_room_get_history(const char *to,LinphoneChatRoom *cr,int nb_message){ - LinphoneCore *lc=linphone_chat_room_get_lc(cr); - cr->messages_hist = NULL; - char *buf=sqlite3_mprintf("select * from history where remoteContact = %Q order by id DESC limit %i ;",to,nb_message); - linphone_sql_request_message(lc->db,buf,(void *)cr); - return cr->messages_hist; -} - -void linphone_close_storage(sqlite3* db){ - sqlite3_close(db); -} - -void linphone_create_table(sqlite3* db){ - char* errmsg; - int ret; - ret=sqlite3_exec(db,"CREATE TABLE if not exists history (id INTEGER PRIMARY KEY AUTOINCREMENT, localContact TEXT NOT NULL, remoteContact TEXT NOT NULL, direction INTEGER, message TEXT, time TEXT NOT NULL, read INTEGER, status INTEGER);", - 0,0,&errmsg); - if(ret != SQLITE_OK) { - printf("Error in creation: %s.\n", errmsg); - } -} - -sqlite3 * linphone_message_storage_init(){ - int ret; - char *errmsg; - sqlite3 *db; - char *filename; - filename=linphone_message_storage_get_config_file(NULL); - ret=sqlite3_open(filename,&db); - if(ret != SQLITE_OK) { - printf("Error in the opening: %s.\n", errmsg); - sqlite3_close(db); - } - linphone_create_table(db); - return db; -} -#else - -void linphone_core_set_history_message(LinphoneChatRoom *cr,const char *local_contact,const char *remote_contact, - int direction, const char *message,const char *date, int read, int state){ -} - -void linphone_core_set_message_state(LinphoneChatRoom *cr,const char *message, int state, time_t date){ -} - -void linphone_core_set_messages_flag_read(LinphoneChatRoom *cr,const char *from, int read){ -} - -MSList *linphone_chat_room_get_history(const char *to,LinphoneChatRoom *cr,int nb_message){ - return NULL; -} + } + } + new_message->time=argv[5]!=NULL ? mktime(&ret) : time(NULL); + new_message->state=atoi(argv[7]); + cr->messages_hist=ms_list_prepend(cr->messages_hist,(void *)new_message); +} + +static int callback(void *data, int argc, char **argv, char **colName){ + create_chat_message(argv,data); + return 0; +} + +void linphone_sql_request_message(sqlite3 *db,const char *stmt,void *data){ + char* errmsg; + int ret; + ret=sqlite3_exec(db,stmt,callback,data,&errmsg); + if(ret != SQLITE_OK) { + printf("Error in creation: %s.\n", errmsg); + } +} + +void linphone_sql_request(sqlite3* db,const char *stmt){ + char* errmsg; + int ret; + ret=sqlite3_exec(db,stmt,0,0,&errmsg); + if(ret != SQLITE_OK) { + printf("Error in creation: %s.\n", errmsg); + } +} + +void linphone_core_set_history_message(LinphoneChatRoom *cr,const char *local_contact,const char *remote_contact, + int direction, const char *message,const char *date, int read, int state){ + LinphoneCore *lc=linphone_chat_room_get_lc(cr); + char *buf=sqlite3_mprintf("insert into history values(NULL,%Q,%Q,%i,%Q,%Q,%i,%i);", + local_contact,remote_contact,direction,message,date,read,state); + linphone_sql_request(lc->db,buf); +} + +void linphone_core_set_message_state(LinphoneChatRoom *cr,const char *message, int state, time_t date){ + LinphoneCore *lc=linphone_chat_room_get_lc(cr); + char time_str[26]; + char *buf=sqlite3_mprintf("update history set status=%i where message = %Q and time = %Q;", + state,message,my_ctime_r(&date,time_str)); + linphone_sql_request(lc->db,buf); +} + +void linphone_core_set_messages_flag_read(LinphoneChatRoom *cr,const char *from, int read){ + LinphoneCore *lc=linphone_chat_room_get_lc(cr); + char *buf=sqlite3_mprintf("update history set read=%i where remoteContact = %Q;", + read,from); + linphone_sql_request(lc->db,buf); +} + +void linphone_core_delete_history(LinphoneCore *lc,const char *from){ + char *buf=sqlite3_mprintf("delete from history where remoteContact = %Q;",from); + linphone_sql_request(lc->db,buf); +} + +MSList *linphone_chat_room_get_history(const char *to,LinphoneChatRoom *cr,int nb_message){ + LinphoneCore *lc=linphone_chat_room_get_lc(cr); + cr->messages_hist = NULL; + char *buf=sqlite3_mprintf("select * from history where remoteContact = %Q order by id DESC limit %i ;",to,nb_message); + linphone_sql_request_message(lc->db,buf,(void *)cr); + return cr->messages_hist; +} + +void linphone_close_storage(sqlite3* db){ + sqlite3_close(db); +} + +void linphone_create_table(sqlite3* db){ + char* errmsg; + int ret; + ret=sqlite3_exec(db,"CREATE TABLE if not exists history (id INTEGER PRIMARY KEY AUTOINCREMENT, localContact TEXT NOT NULL, remoteContact TEXT NOT NULL, direction INTEGER, message TEXT, time TEXT NOT NULL, read INTEGER, status INTEGER);", + 0,0,&errmsg); + if(ret != SQLITE_OK) { + printf("Error in creation: %s.\n", errmsg); + } +} + +sqlite3 * linphone_message_storage_init(){ + int ret; + char *errmsg; + sqlite3 *db; + char *filename; + filename=linphone_message_storage_get_config_file(NULL); + ret=sqlite3_open(filename,&db); + if(ret != SQLITE_OK) { + printf("Error in the opening: %s.\n", errmsg); + sqlite3_close(db); + } + linphone_create_table(db); + return db; +} +#else + +void linphone_core_set_history_message(LinphoneChatRoom *cr,const char *local_contact,const char *remote_contact, + int direction, const char *message,const char *date, int read, int state){ +} + +void linphone_core_set_message_state(LinphoneChatRoom *cr,const char *message, int state, time_t date){ +} + +void linphone_core_set_messages_flag_read(LinphoneChatRoom *cr,const char *from, int read){ +} + +MSList *linphone_chat_room_get_history(const char *to,LinphoneChatRoom *cr,int nb_message){ + return NULL; +} + +void linphone_core_delete_history(LinphoneCore *lc,const char *from){ +} #endif \ No newline at end of file diff --git a/gtk/chat.c b/gtk/chat.c index c93d9828c..b3a5ecfdc 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -23,6 +23,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #endif +#define NB_MSG_HIST 250 + void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { GtkWidget *main_window=linphone_gtk_get_main_window (); GtkWidget *nb=linphone_gtk_get_widget(main_window,"viewswitch"); @@ -302,7 +304,7 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres "margin","indent",10,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), "bg","paragraph-background-gdk",&colorb,NULL); - messages = linphone_chat_room_get_history(with_str,cr,10); + messages = linphone_chat_room_get_history(with_str,cr,NB_MSG_HIST); display_history_message(chat_view,messages,with); button = linphone_gtk_get_widget(chat_view,"send"); g_signal_connect_swapped(G_OBJECT(button),"clicked",(GCallback)linphone_gtk_send_text,NULL); @@ -339,7 +341,7 @@ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri, udpate_tab_chat_header(chat_view,uri,cr); g_object_set_data(G_OBJECT(chat_view),"cr",cr); g_object_set_data(G_OBJECT(linphone_gtk_get_widget(main_window,"contact_list")),"chatview",(gpointer)chat_view); - messages = linphone_chat_room_get_history(uri_only,cr,10); + messages = linphone_chat_room_get_history(uri_only,cr,NB_MSG_HIST); g_object_set_data(G_OBJECT(chat_view),"from_message",uri_str); display_history_message(chat_view,messages,uri); } diff --git a/gtk/friendlist.c b/gtk/friendlist.c index 6ef326610..4ae86dfab 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -165,6 +165,21 @@ void linphone_gtk_remove_contact(GtkWidget *button){ } } +void linphone_gtk_delete_history(GtkWidget *button){ + GtkWidget *w=gtk_widget_get_toplevel(button); + GtkTreeSelection *select; + GtkTreeIter iter; + GtkTreeModel *model; + LinphoneFriend *lf=NULL; + select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list"))); + if (gtk_tree_selection_get_selected (select, &model, &iter)) + { + gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); + linphone_core_delete_history(linphone_gtk_get_core(),linphone_address_as_string_uri_only(linphone_friend_get_address(lf))); + linphone_gtk_show_friends(); + } +} + static void linphone_gtk_call_selected(GtkTreeView *treeview){ linphone_gtk_set_selection_to_uri_bar(treeview); linphone_gtk_start_call(linphone_gtk_get_widget(gtk_widget_get_toplevel(GTK_WIDGET(treeview)), @@ -786,6 +801,7 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ gchar *text_label=NULL; gchar *edit_label=NULL; gchar *delete_label=NULL; + gchar *delete_hist_label=NULL; gchar *name=NULL; GtkTreeSelection *select; GtkTreeIter iter; @@ -808,6 +824,7 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ text_label=g_strdup_printf(_("Send text to %s"),name); edit_label=g_strdup_printf(_("Edit contact '%s'"),name); delete_label=g_strdup_printf(_("Delete contact '%s'"),name); + delete_hist_label=g_strdup_printf(_("Delete chat history of '%s'"),name); g_free(name); } if (call_label){ @@ -847,6 +864,15 @@ static GtkWidget *linphone_gtk_create_contact_menu(GtkWidget *contact_list){ g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_remove_contact,contact_list); } + if (delete_hist_label){ + menu_item=gtk_image_menu_item_new_with_label(delete_hist_label); + image=gtk_image_new_from_stock(GTK_STOCK_CLEAR,GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); + gtk_widget_show(image); + gtk_widget_show(menu_item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); + g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_delete_history,contact_list); + } if (ssc && (sip_setup_context_get_capabilities(ssc) & SIP_SETUP_CAP_BUDDY_LOOKUP)) { gchar *tmp=g_strdup_printf(_("Add new contact from %s directory"),linphone_proxy_config_get_domain(cfg)); diff --git a/gtk/propertybox.c b/gtk/propertybox.c index 8481bef7e..1c189e0b8 100644 --- a/gtk/propertybox.c +++ b/gtk/propertybox.c @@ -778,6 +778,7 @@ static LangCodes supported_langs[]={ { "zh_TW" , N_("Traditional Chinese") }, { "nb_NO" , N_("Norwegian") }, { "he" , N_("Hebrew") }, + { "sr" , N_("Serbian") }, { NULL , NULL } }; From 4539d3c2d618117dbbed640fccb96c68a31bcb04 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 7 Mar 2013 17:41:12 +0100 Subject: [PATCH 126/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index a824c4739..daa8d61fe 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit a824c473919ab993e536e9f2d29471332e68280e +Subproject commit daa8d61feee22ffcc72a2db189aa88956697de20 From 837c566c0a2cfd5d27d738f1647872703786d6cd Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 8 Mar 2013 12:24:48 +0100 Subject: [PATCH 127/281] uPnP support network changes --- coreapi/linphonecore.c | 13 ++++ coreapi/upnp.c | 160 +++++++++++++++++++++++++++++++++++------ coreapi/upnp.h | 1 + mediastreamer2 | 2 +- 4 files changed, 152 insertions(+), 24 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index eac319061..bdf2193c1 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -5288,9 +5288,22 @@ static void set_network_reachable(LinphoneCore* lc,bool_t isReachable, time_t cu } lc->netup_time=curtime; lc->network_reachable=isReachable; + if(!isReachable) { sal_reset_transports(lc->sal); } +#ifdef BUILD_UPNP + if(lc->upnp == NULL) { + if(isReachable && lc->net_conf.firewall_policy == LinphonePolicyUseUpnp) { + lc->upnp = linphone_upnp_context_new(lc); + } + } else { + if(!isReachable && lc->net_conf.firewall_policy == LinphonePolicyUseUpnp) { + linphone_upnp_context_destroy(lc->upnp); + lc->upnp = NULL; + } + } +#endif } void linphone_core_refresh_registers(LinphoneCore* lc) { diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 240c34b38..596afe333 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -20,6 +20,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "upnp.h" #include "private.h" #include "lpconfig.h" +#include + +#define UPNP_STRINGIFY(x) #x +#define UPNP_TOSTRING(x) UPNP_STRINGIFY(x) #define UPNP_ADD_MAX_RETRY 4 #define UPNP_REMOVE_MAX_RETRY 4 @@ -27,7 +31,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define UPNP_CORE_READY_CHECK 1 #define UPNP_CORE_RETRY_DELAY 4 #define UPNP_CALL_RETRY_DELAY 1 - +#define UPNP_UUID_LEN 32 +#define UPNP_UUID_LEN_STR UPNP_TOSTRING(UPNP_UUID_LEN) /* * uPnP Definitions */ @@ -36,6 +41,7 @@ typedef struct _UpnpPortBinding { ms_mutex_t mutex; LinphoneUpnpState state; upnp_igd_ip_protocol protocol; + char *device_id; char local_addr[LINPHONE_IPADDR_SIZE]; int local_port; char external_addr[LINPHONE_IPADDR_SIZE]; @@ -86,6 +92,7 @@ UpnpPortBinding *linphone_upnp_port_binding_new(); UpnpPortBinding *linphone_upnp_port_binding_new_with_parameters(upnp_igd_ip_protocol protocol, int local_port, int external_port); UpnpPortBinding *linphone_upnp_port_binding_new_or_collect(MSList *list, upnp_igd_ip_protocol protocol, int local_port, int external_port); UpnpPortBinding *linphone_upnp_port_binding_copy(const UpnpPortBinding *port); +void linphone_upnp_port_binding_set_device_id(UpnpPortBinding *port, const char * device_id); bool_t linphone_upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2); UpnpPortBinding *linphone_upnp_port_binding_equivalent_in_list(MSList *list, const UpnpPortBinding *port); UpnpPortBinding *linphone_upnp_port_binding_retain(UpnpPortBinding *port); @@ -96,7 +103,7 @@ void linphone_upnp_update_config(UpnpContext *lupnp); void linphone_upnp_update_proxy(UpnpContext *lupnp, bool_t force); // Configuration -MSList *linphone_upnp_config_list_port_bindings(struct _LpConfig *lpc); +MSList *linphone_upnp_config_list_port_bindings(struct _LpConfig *lpc, const char *device_id); void linphone_upnp_config_add_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port); void linphone_upnp_config_remove_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port); @@ -105,6 +112,61 @@ int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortB int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port, bool_t retry); +static int linphone_upnp_strncmpi(const char *str1, const char *str2, int len) { + int i = 0; + char char1, char2; + while(*str1 != '\0' && *str2 != '\0' && i < len) { + char1 = toupper(*str1); + char2 = toupper(*str2); + if(char1 != char2) { + return char1 - char2; + } + str1++; + str2++; + len++; + } + return 0; +} +static int linphone_upnp_str_min(const char *str1, const char *str2) { + int len1 = strlen(str1); + int len2 = strlen(str2); + if(len1 > len2) { + return len2; + } + return len1; +} +char * linphone_upnp_format_device_id(const char *device_id) { + char *ret = NULL; + char *tmp; + char tchar; + bool_t copy; + if(device_id == NULL) { + return ret; + } + ret = ms_new(char, UPNP_UUID_LEN + 1); + tmp = ret; + if(linphone_upnp_strncmpi(device_id, "uuid:", linphone_upnp_str_min(device_id, "uuid:")) == 0) { + device_id += strlen("uuid:"); + } + while(*device_id != '\0' && tmp - ret < UPNP_UUID_LEN) { + copy = FALSE; + tchar = *device_id; + if(tchar >= '0' && tchar <= '9') + copy = TRUE; + if(!copy && tchar >= 'A' && tchar <= 'Z') + copy = TRUE; + if(!copy && tchar >= 'a' && tchar <= 'z') + copy = TRUE; + if(copy) { + *tmp = *device_id; + tmp++; + } + device_id++; + } + *tmp = '\0'; + return ret; +} + /** * uPnP Callbacks */ @@ -293,15 +355,17 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) { ms_mutex_lock(&lupnp->mutex); - /* Send port binding removes */ - if(lupnp->sip_udp != NULL) { - linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_udp, TRUE); - } - if(lupnp->sip_tcp != NULL) { - linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tcp, TRUE); - } - if(lupnp->sip_tls != NULL) { - linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tls, TRUE); + if(lupnp->lc->network_reachable) { + /* Send port binding removes */ + if(lupnp->sip_udp != NULL) { + linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_udp, TRUE); + } + if(lupnp->sip_tcp != NULL) { + linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tcp, TRUE); + } + if(lupnp->sip_tls != NULL) { + linphone_upnp_context_send_remove_port_binding(lupnp, lupnp->sip_tls, TRUE); + } } /* Wait all pending bindings are done */ @@ -430,6 +494,10 @@ int linphone_upnp_context_get_external_port(UpnpContext *lupnp) { return port; } +void linphone_upnp_refresh(UpnpContext * lupnp) { + upnp_igd_refresh(lupnp->upnp_igd_ctxt); +} + const char* linphone_upnp_context_get_external_ipaddress(UpnpContext *lupnp) { const char* addr = NULL; if(lupnp != NULL) { @@ -477,6 +545,7 @@ int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBind if(port->retry >= UPNP_ADD_MAX_RETRY) { ret = -1; } else { + linphone_upnp_port_binding_set_device_id(port, upnp_igd_get_device_id(lupnp->upnp_igd_ctxt)); mapping.cookie = linphone_upnp_port_binding_retain(port); lupnp->pending_bindings = ms_list_append(lupnp->pending_bindings, mapping.cookie); @@ -539,6 +608,7 @@ int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortB if(port->retry >= UPNP_REMOVE_MAX_RETRY) { ret = -1; } else { + linphone_upnp_port_binding_set_device_id(port, upnp_igd_get_device_id(lupnp->upnp_igd_ctxt)); mapping.cookie = linphone_upnp_port_binding_retain(port); lupnp->pending_bindings = ms_list_append(lupnp->pending_bindings, mapping.cookie); @@ -769,7 +839,7 @@ void linphone_core_upnp_refresh(UpnpContext *lupnp) { list = list->next; } - list = linphone_upnp_config_list_port_bindings(lupnp->lc->config); + list = linphone_upnp_config_list_port_bindings(lupnp->lc->config, upnp_igd_get_device_id(lupnp->upnp_igd_ctxt)); for(item = list;item != NULL; item = item->next) { port_mapping = (UpnpPortBinding *)item->data; port_mapping2 = linphone_upnp_port_binding_equivalent_in_list(global_list, port_mapping); @@ -845,10 +915,11 @@ void linphone_upnp_update_config(UpnpContext* lupnp) { /* Add configs */ for(item = lupnp->adding_configs;item!=NULL;item=item->next) { port_mapping = (UpnpPortBinding *)item->data; - snprintf(key, sizeof(key), "%s-%d-%d", + snprintf(key, sizeof(key), "%s-%s-%d-%d", + port_mapping->device_id, (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", - port_mapping->external_port, - port_mapping->local_port); + port_mapping->external_port, + port_mapping->local_port); lp_config_set_string(lupnp->lc->config, UPNP_SECTION_NAME, key, "uPnP"); linphone_upnp_port_binding_log(ORTP_DEBUG, "Configuration: Added port binding", port_mapping); } @@ -858,10 +929,11 @@ void linphone_upnp_update_config(UpnpContext* lupnp) { /* Remove configs */ for(item = lupnp->removing_configs;item!=NULL;item=item->next) { port_mapping = (UpnpPortBinding *)item->data; - snprintf(key, sizeof(key), "%s-%d-%d", + snprintf(key, sizeof(key), "%s-%s-%d-%d", + port_mapping->device_id, (port_mapping->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", - port_mapping->external_port, - port_mapping->local_port); + port_mapping->external_port, + port_mapping->local_port); lp_config_set_string(lupnp->lc->config, UPNP_SECTION_NAME, key, NULL); linphone_upnp_port_binding_log(ORTP_DEBUG, "Configuration: Removed port binding", port_mapping); } @@ -958,6 +1030,7 @@ UpnpPortBinding *linphone_upnp_port_binding_new() { ms_mutex_init(&port->mutex, NULL); port->state = LinphoneUpnpStateIdle; port->protocol = UPNP_IGD_IP_PROTOCOL_UDP; + port->device_id = NULL; port->local_addr[0] = '\0'; port->local_port = -1; port->external_addr[0] = '\0'; @@ -993,11 +1066,27 @@ UpnpPortBinding *linphone_upnp_port_binding_copy(const UpnpPortBinding *port) { UpnpPortBinding *new_port = NULL; new_port = ms_new0(UpnpPortBinding,1); memcpy(new_port, port, sizeof(UpnpPortBinding)); + new_port->device_id = NULL; + linphone_upnp_port_binding_set_device_id(new_port, port->device_id); ms_mutex_init(&new_port->mutex, NULL); new_port->ref = 1; return new_port; } +void linphone_upnp_port_binding_set_device_id(UpnpPortBinding *port, const char *device_id) { + char *formated_device_id = linphone_upnp_format_device_id(device_id); + if(formated_device_id != NULL && port->device_id != NULL) { + if(strcmp(formated_device_id, port->device_id) == 0) { + ms_free(formated_device_id); + return; + } + } + if(port->device_id != NULL) { + ms_free(port->device_id); + } + port->device_id = formated_device_id; +} + void linphone_upnp_port_binding_log(int level, const char *msg, const UpnpPortBinding *port) { if(strlen(port->local_addr)) { ortp_log(level, "uPnP IGD: %s %s|%d->%s:%d (retry %d)", msg, @@ -1044,6 +1133,9 @@ UpnpPortBinding *linphone_upnp_port_binding_retain(UpnpPortBinding *port) { void linphone_upnp_port_binding_release(UpnpPortBinding *port) { ms_mutex_lock(&port->mutex); if(--port->ref == 0) { + if(port->device_id != NULL) { + ms_free(port->device_id); + } ms_mutex_unlock(&port->mutex); ms_mutex_destroy(&port->mutex); ms_free(port); @@ -1130,25 +1222,35 @@ LinphoneUpnpState linphone_upnp_session_get_state(UpnpSession *session) { struct linphone_upnp_config_list_port_bindings_struct { struct _LpConfig *lpc; MSList *retList; + const char *device_id; }; static void linphone_upnp_config_list_port_bindings_cb(const char *entry, struct linphone_upnp_config_list_port_bindings_struct *cookie) { + char device_id[UPNP_UUID_LEN + 1]; char protocol_str[4]; // TCP or UDP upnp_igd_ip_protocol protocol; int external_port; int local_port; + int ret; bool_t valid = TRUE; UpnpPortBinding *port; - if(sscanf(entry, "%3s-%i-%i", protocol_str, &external_port, &local_port) == 3) { - if(strcasecmp(protocol_str, "TCP") == 0) { + + ret = sscanf(entry, "%"UPNP_UUID_LEN_STR"s-%3s-%i-%i", device_id, protocol_str, &external_port, &local_port); + if(ret == 4) { + // Handle only wanted device bindings + if(device_id != NULL && strcmp(cookie->device_id, device_id) != 0) { + return; + } + if(linphone_upnp_strncmpi(protocol_str, "TCP", 3) == 0) { protocol = UPNP_IGD_IP_PROTOCOL_TCP; - } else if(strcasecmp(protocol_str, "UDP") == 0) { + } else if(linphone_upnp_strncmpi(protocol_str, "UDP", 3) == 0) { protocol = UPNP_IGD_IP_PROTOCOL_UDP; } else { valid = FALSE; } if(valid) { port = linphone_upnp_port_binding_new(); + linphone_upnp_port_binding_set_device_id(port, device_id); port->state = LinphoneUpnpStateOk; port->protocol = protocol; port->external_port = external_port; @@ -1163,15 +1265,22 @@ static void linphone_upnp_config_list_port_bindings_cb(const char *entry, struct } } -MSList *linphone_upnp_config_list_port_bindings(struct _LpConfig *lpc) { - struct linphone_upnp_config_list_port_bindings_struct cookie = {lpc, NULL}; +MSList *linphone_upnp_config_list_port_bindings(struct _LpConfig *lpc, const char *device_id) { + char *formated_device_id = linphone_upnp_format_device_id(device_id); + struct linphone_upnp_config_list_port_bindings_struct cookie = {lpc, NULL, formated_device_id}; lp_config_for_each_entry(lpc, UPNP_SECTION_NAME, (void(*)(const char *, void*))linphone_upnp_config_list_port_bindings_cb, &cookie); + ms_free(formated_device_id); return cookie.retList; } void linphone_upnp_config_add_port_binding(UpnpContext *lupnp, const UpnpPortBinding *port) { MSList *list; UpnpPortBinding *list_port; + + if(port->device_id == NULL) { + ms_error("Can't remove port binding without device_id"); + return; + } list = lupnp->removing_configs; while(list != NULL) { @@ -1201,6 +1310,11 @@ void linphone_upnp_config_remove_port_binding(UpnpContext *lupnp, const UpnpPort MSList *list; UpnpPortBinding *list_port; + if(port->device_id == NULL) { + ms_error("Can't remove port binding without device_id"); + return; + } + list = lupnp->adding_configs; while(list != NULL) { list_port = (UpnpPortBinding *)list->data; diff --git a/coreapi/upnp.h b/coreapi/upnp.h index fe403a772..d785954a4 100644 --- a/coreapi/upnp.h +++ b/coreapi/upnp.h @@ -38,6 +38,7 @@ LinphoneUpnpState linphone_upnp_session_get_state(UpnpSession *session); UpnpContext *linphone_upnp_context_new(LinphoneCore *lc); void linphone_upnp_context_destroy(UpnpContext *ctx); +void linphone_upnp_refresh(UpnpContext *ctx); LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *ctx); const char *linphone_upnp_context_get_external_ipaddress(UpnpContext *ctx); int linphone_upnp_context_get_external_port(UpnpContext *ctx); diff --git a/mediastreamer2 b/mediastreamer2 index daa8d61fe..06e505707 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit daa8d61feee22ffcc72a2db189aa88956697de20 +Subproject commit 06e505707c31d11e056f2dad4de3ac617985333b From ad7114171eceab0116a7568367633c7808c9aa00 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 9 Mar 2013 10:34:32 +0100 Subject: [PATCH 128/281] clean message storage API relax requirement for sqlite3 --- configure.ac | 26 ++++-- coreapi/callbacks.c | 5 +- coreapi/chat.c | 95 +++++++++++++-------- coreapi/linphonecore.c | 26 +++++- coreapi/linphonecore.h | 13 ++- coreapi/message_storage.c | 151 ++++++++++++++++++--------------- coreapi/private.h | 27 +++--- coreapi/sal.h | 4 +- coreapi/sal_eXosip2_presence.c | 23 ++++- gtk/chat.c | 68 ++++++++++----- gtk/friendlist.c | 4 +- gtk/linphone.h | 2 + gtk/main.c | 7 +- 13 files changed, 294 insertions(+), 157 deletions(-) diff --git a/configure.ac b/configure.ac index 9cb828e82..ae2d59386 100644 --- a/configure.ac +++ b/configure.ac @@ -670,21 +670,31 @@ if test x$enable_tunnel = xtrue; then fi AC_ARG_ENABLE(msg-storage, - [AS_HELP_STRING([--enable-msg-storage=[yes/no]], [Turn on compilation of message storage (default=yes)])], + [AS_HELP_STRING([--enable-msg-storage=[yes/no]], [Turn on compilation of message storage (default=auto)])], [case "${enableval}" in yes) enable_msg_storage=true ;; no) enable_msg_storage=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-msg-storage) ;; esac], - [enable_msg_storage=true] + [enable_msg_storage=auto] ) + +echo "enable_msg_storage = $enable_msg_storage" + AM_CONDITIONAL(BUILD_MSG_STORAGE, test x$enable_msg_storage = xtrue) -if test x$enable_msg_storage = xtrue; then - PKG_CHECK_MODULES(SQLITE3,[ sqlite3 >= 3.7.0],[],[ - AC_MSG_ERROR([sqlite3 required for message storage not found.])] ) - SQLITE3_CFLAGS+="-DMSG_STORAGE_ENABLED" - AC_SUBST(SQLITE3_CFLAGS) - AC_SUBST(SQLITE3_LIBS) +if test x$enable_msg_storage != xfalse; then + PKG_CHECK_MODULES(SQLITE3,[ sqlite3 >= 3.7.0],[ + SQLITE3_CFLAGS+="-DMSG_STORAGE_ENABLED" + AC_SUBST(SQLITE3_CFLAGS) + AC_SUBST(SQLITE3_LIBS) + enable_msg_storage=true + ],[ + if test x$enable_msg_storage = xtrue; then + AC_MSG_ERROR([sqlite3 required for message storage not found.]) + fi + enable_msg_storage=false + ] ) + fi diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index d65e53674..dd5ab7edc 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -934,10 +934,11 @@ static void text_delivery_update(SalOp *op, SalTextDeliveryStatus status){ LinphoneChatMessage *chat_msg=(LinphoneChatMessage* )sal_op_get_user_pointer(op); const MSList* calls = linphone_core_get_calls(chat_msg->chat_room->lc); - linphone_core_set_message_state(chat_msg->chat_room,chat_msg->message,chatStatusSal2Linphone(status),chat_msg->time); + chat_msg->state=chatStatusSal2Linphone(status); + linphone_chat_message_store_state(chat_msg); if (chat_msg && chat_msg->cb) { chat_msg->cb(chat_msg - ,chatStatusSal2Linphone(status) + ,chat_msg->state ,chat_msg->cb_ud); } linphone_chat_message_destroy(chat_msg); diff --git a/coreapi/chat.c b/coreapi/chat.c index 046c34733..69893217d 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -62,16 +62,7 @@ void linphone_chat_room_destroy(LinphoneChatRoom *cr){ ms_free(cr->peer); } -#ifdef WIN32 -static inline char *my_ctime_r(const time_t *t, char *buf){ - strcpy(buf,ctime(t)); - return buf; -} - -#else -#define my_ctime_r ctime_r -#endif static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatMessage* msg){ const char *route=NULL; @@ -80,8 +71,6 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM LinphoneCall *call; char* content_type; time_t t=time(NULL); - char buf[26]; - char *to; if (lp_config_get_int(cr->lc->config,"sip","chat_use_call_dialogs",0)){ if((call = linphone_core_get_call_by_remote_address(cr->lc,cr->peer))!=NULL){ @@ -109,15 +98,14 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM } if (msg->external_body_url) { content_type=ms_strdup_printf("message/external-body; access-type=URL; URL=\"%s\"",msg->external_body_url); - sal_message_send(op,identity,cr->peer,content_type, NULL,my_ctime_r(&t,buf)); + sal_message_send(op,identity,cr->peer,content_type, NULL); ms_free(content_type); } else { - sal_text_send(op, identity, cr->peer,msg->message,my_ctime_r(&t,buf)); + sal_text_send(op, identity, cr->peer,msg->message); } - to=linphone_address_as_string_uri_only (cr->peer_url); - linphone_core_set_history_message(cr,identity,to,OUTGOING,msg->message, - my_ctime_r(&t,buf),READ,LinphoneChatMessageStateInProgress); - ms_free(to); + msg->dir=LinphoneChatMessageOutgoing; + msg->from=linphone_address_new(identity); + linphone_chat_message_store(msg); } /** @@ -144,19 +132,15 @@ void linphone_chat_room_message_received(LinphoneChatRoom *cr, LinphoneCore *lc, } -void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessage *sal_msg){ - MSList *elem; +/** + * Retrieve an existing chat room whose peer is the supplied address, if exists. + * @param lc the linphone core + * @param add a linphone address. + * @returns the matching chatroom, or NULL if no such chatroom exists. +**/ +LinphoneChatRoom *linphone_core_get_chat_room(LinphoneCore *lc, const LinphoneAddress *addr){ LinphoneChatRoom *cr=NULL; - LinphoneAddress *addr; - char *cleanfrom; - const char *to; - char *from; - LinphoneChatMessage* msg; - const SalCustomHeader *ch; - char buf[26]; - - addr=linphone_address_new(sal_msg->from); - linphone_address_clean(addr); + MSList *elem; for(elem=lc->chatrooms;elem!=NULL;elem=ms_list_next(elem)){ cr=(LinphoneChatRoom*)elem->data; if (linphone_chat_room_matches(cr,addr)){ @@ -164,7 +148,21 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag } cr=NULL; } - to=linphone_core_get_identity(lc); + return cr; +} + +void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessage *sal_msg){ + + LinphoneChatRoom *cr=NULL; + LinphoneAddress *addr; + char *cleanfrom; + char *from; + LinphoneChatMessage* msg; + const SalCustomHeader *ch; + + addr=linphone_address_new(sal_msg->from); + linphone_address_clean(addr); + cr=linphone_core_get_chat_room(lc,addr); cleanfrom=linphone_address_as_string(addr); from=linphone_address_as_string_uri_only(addr); if (cr==NULL){ @@ -173,8 +171,16 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag } msg = linphone_chat_room_create_message(cr, sal_msg->text); linphone_chat_message_set_from(msg, cr->peer_url); + + { + LinphoneAddress *to; + to=sal_op_get_to(op) ? linphone_address_new(sal_op_get_to(op)) : linphone_address_new(linphone_core_get_identity(lc)); + msg->to=to; + } + msg->time=sal_msg->time; msg->state=LinphoneChatMessageStateDelivered; + msg->is_read=FALSE; ch=sal_op_get_custom_header(op); if (ch) msg->custom_headers=sal_custom_header_clone(ch); @@ -182,9 +188,7 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag linphone_chat_message_set_external_body_url(msg, sal_msg->url); } linphone_address_destroy(addr); - linphone_core_set_history_message(cr,to,from,INCOMING, - msg->message,my_ctime_r(&msg->time,buf),NOT_READ, - LinphoneChatMessageStateDelivered); + linphone_chat_message_store(msg); linphone_chat_room_message_received(cr,lc,msg); ms_free(cleanfrom); ms_free(from); @@ -230,6 +234,7 @@ LinphoneChatMessage* linphone_chat_room_create_message(LinphoneChatRoom *cr, con LinphoneChatMessage* msg = ms_new0(LinphoneChatMessage,1); msg->chat_room=(LinphoneChatRoom*)cr; msg->message=message?ms_strdup(message):NULL; + msg->is_read=TRUE; return msg; } @@ -327,10 +332,32 @@ void linphone_chat_message_set_from(LinphoneChatMessage* message, const Linphone *@param message #LinphoneChatMessage obj *@return #LinphoneAddress */ -LinphoneAddress* linphone_chat_message_get_from(const LinphoneChatMessage* message) { +const LinphoneAddress* linphone_chat_message_get_from(const LinphoneChatMessage* message) { return message->from; } +/** + * Get destination of the message + *@param message #LinphoneChatMessage obj + *@return #LinphoneAddress + */ +const LinphoneAddress* linphone_chat_message_get_to(const LinphoneChatMessage* message){ + if (message->to) return message->to; + if (message->dir==LinphoneChatMessageOutgoing){ + return message->chat_room->peer_url; + } + return NULL; +} + +/** + * Returns the origin address of a message if it was a outgoing message, or the destination address if it was an incoming message. + *@param message #LinphoneChatMessage obj + *@return #LinphoneAddress + */ +LinphoneAddress *linphone_chat_message_get_local_address(const LinphoneChatMessage* message){ + return message->dir==LinphoneChatMessageOutgoing ? message->from : message->to; +} + /** * Get the time the message was sent. */ diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index bdf2193c1..2bb9fab32 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1306,9 +1306,6 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta #ifdef TUNNEL_ENABLED lc->tunnel=linphone_core_tunnel_new(lc); if (lc->tunnel) linphone_tunnel_configure(lc->tunnel); -#endif -#ifdef MSG_STORAGE_ENABLED - lc->db=linphone_message_storage_init(); #endif if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Ready")); @@ -5265,6 +5262,8 @@ static void linphone_core_uninit(LinphoneCore *lc) } linphone_core_free_payload_types(lc); + + linphone_core_message_storage_close(lc); ortp_exit(); linphone_core_set_state(lc,LinphoneGlobalOff,"Off"); #ifdef TUNNEL_ENABLED @@ -5795,3 +5794,24 @@ void linphone_core_set_video_dscp(LinphoneCore *lc, int dscp){ int linphone_core_get_video_dscp(const LinphoneCore *lc){ return lp_config_get_int(lc->config,"rtp","video_dscp",0x2e); } + + +/** + * Sets the database filename where chat messages will be stored. + * If the file does not exist, it will be created. + * @ingroup initializing + * @param lc the linphone core + * @param path filesystem path +**/ +void linphone_core_set_chat_database_path(LinphoneCore *lc, const char *path){ + if (lc->chat_db_file){ + ms_free(lc->chat_db_file); + lc->chat_db_file=NULL; + } + if (path) { + lc->chat_db_file=ms_strdup(path); + linphone_core_message_storage_init(lc); + } +} + + diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 49074db3e..7212f26c4 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -663,12 +663,17 @@ typedef enum _LinphoneChatMessageStates { */ typedef void (*LinphoneChatMessageStateChangeCb)(LinphoneChatMessage* msg,LinphoneChatMessageState state,void* ud); +void linphone_core_set_chat_database_path(LinphoneCore *lc, const char *path); LinphoneChatRoom * linphone_core_create_chat_room(LinphoneCore *lc, const char *to); +LinphoneChatRoom *linphone_core_get_chat_room(LinphoneCore *lc, const LinphoneAddress *addr); void linphone_chat_room_destroy(LinphoneChatRoom *cr); LinphoneChatMessage* linphone_chat_room_create_message(LinphoneChatRoom *cr,const char* message); const LinphoneAddress* linphone_chat_room_get_peer_address(LinphoneChatRoom *cr); void linphone_chat_room_send_message(LinphoneChatRoom *cr, const char *msg); void linphone_chat_room_send_message2(LinphoneChatRoom *cr, LinphoneChatMessage* msg,LinphoneChatMessageStateChangeCb status_cb,void* ud); +MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message); +void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr); +void linphone_chat_room_delete_history(LinphoneChatRoom *cr); LinphoneCore* linphone_chat_room_get_lc(LinphoneChatRoom *cr); void linphone_chat_room_set_user_data(LinphoneChatRoom *cr, void * ud); void * linphone_chat_room_get_user_data(LinphoneChatRoom *cr); @@ -677,7 +682,8 @@ LinphoneChatMessageState linphone_chat_message_get_state(const LinphoneChatMessa const char* linphone_chat_message_state_to_string(const LinphoneChatMessageState state); LinphoneChatMessage* linphone_chat_message_clone(const LinphoneChatMessage* message); void linphone_chat_message_set_from(LinphoneChatMessage* message, const LinphoneAddress* from); -LinphoneAddress* linphone_chat_message_get_from(const LinphoneChatMessage* message); +const LinphoneAddress* linphone_chat_message_get_from(const LinphoneChatMessage* message); +const LinphoneAddress* linphone_chat_message_get_to(const LinphoneChatMessage* message); const char* linphone_chat_message_get_external_body_url(const LinphoneChatMessage* message); void linphone_chat_message_set_external_body_url(LinphoneChatMessage* message,const char* url); const char * linphone_chat_message_get_text(const LinphoneChatMessage* message); @@ -686,6 +692,7 @@ void* linphone_chat_message_get_user_data(const LinphoneChatMessage* message); void linphone_chat_message_set_user_data(LinphoneChatMessage* message,void*); LinphoneChatRoom* linphone_chat_message_get_chat_room(LinphoneChatMessage *msg); const LinphoneAddress* linphone_chat_message_get_peer_address(LinphoneChatMessage *msg); +LinphoneAddress *linphone_chat_message_get_local_address(const LinphoneChatMessage* message); void linphone_chat_message_add_custom_header(LinphoneChatMessage* message, const char *header_name, const char *header_value); const char * linphone_chat_message_get_custom_header(LinphoneChatMessage* message, const char *header_name); @@ -1418,9 +1425,7 @@ int linphone_core_get_audio_dscp(const LinphoneCore *lc); void linphone_core_set_video_dscp(LinphoneCore *lc, int dscp); int linphone_core_get_video_dscp(const LinphoneCore *lc); -MSList *linphone_chat_room_get_history(const char *to,LinphoneChatRoom *cr,int nb_message); -void linphone_core_set_messages_flag_read(LinphoneChatRoom *cr,const char *from, int read); -void linphone_core_delete_history(LinphoneCore *lc,const char *from); + #ifdef __cplusplus } diff --git a/coreapi/message_storage.c b/coreapi/message_storage.c index 3d6c45d93..c62fa1ddb 100644 --- a/coreapi/message_storage.c +++ b/coreapi/message_storage.c @@ -38,44 +38,22 @@ static inline char *my_ctime_r(const time_t *t, char *buf){ static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; -#define CONFIG_FILE ".linphone-history.db" -char *linphone_message_storage_get_config_file(const char *filename){ - const int path_max=1024; - char *config_file=(char *)malloc(path_max*sizeof(char)); - if (filename==NULL) filename=CONFIG_FILE; - /*try accessing a local file first if exists*/ - if (access(CONFIG_FILE,F_OK)==0){ - snprintf(config_file,path_max,"%s",filename); - }else{ -#ifdef WIN32 - const char *appdata=getenv("APPDATA"); - if (appdata){ - snprintf(config_file,path_max,"%s\\%s",appdata,LINPHONE_CONFIG_DIR); - CreateDirectory(config_file,NULL); - snprintf(config_file,path_max,"%s\\%s\\%s",appdata,LINPHONE_CONFIG_DIR,filename); - } -#else - const char *home=getenv("HOME"); - if (home==NULL) home="."; - snprintf(config_file,path_max,"%s/%s",home,filename); -#endif - } - return config_file; -} - -void create_chat_message(char **argv, void *data){ +static void create_chat_message(char **argv, void *data){ LinphoneChatRoom *cr = (LinphoneChatRoom *)data; LinphoneChatMessage* new_message = linphone_chat_room_create_message(cr,argv[4]); + LinphoneAddress *from; struct tm ret={0}; char tmp1[80]={0}; char tmp2[80]={0}; - if(atoi(argv[3])==INCOMING){ - linphone_chat_message_set_from(new_message,linphone_address_new(argv[2])); + if(atoi(argv[3])==LinphoneChatMessageIncoming){ + from=linphone_address_new(argv[2]); } else { - linphone_chat_message_set_from(new_message,linphone_address_new(argv[1])); + from=linphone_address_new(argv[1]); } + linphone_chat_message_set_from(new_message,from); + linphone_address_destroy(from); if(argv[5]!=NULL){ int i,j; @@ -91,7 +69,7 @@ void create_chat_message(char **argv, void *data){ } new_message->time=argv[5]!=NULL ? mktime(&ret) : time(NULL); new_message->state=atoi(argv[7]); - cr->messages_hist=ms_list_prepend(cr->messages_hist,(void *)new_message); + cr->messages_hist=ms_list_prepend(cr->messages_hist,new_message); } static int callback(void *data, int argc, char **argv, char **colName){ @@ -99,58 +77,84 @@ static int callback(void *data, int argc, char **argv, char **colName){ return 0; } -void linphone_sql_request_message(sqlite3 *db,const char *stmt,void *data){ +void linphone_sql_request_message(sqlite3 *db,const char *stmt,LinphoneChatRoom *cr){ char* errmsg; int ret; - ret=sqlite3_exec(db,stmt,callback,data,&errmsg); + ret=sqlite3_exec(db,stmt,callback,cr,&errmsg); if(ret != SQLITE_OK) { printf("Error in creation: %s.\n", errmsg); } } void linphone_sql_request(sqlite3* db,const char *stmt){ - char* errmsg; + char* errmsg=NULL; int ret; ret=sqlite3_exec(db,stmt,0,0,&errmsg); if(ret != SQLITE_OK) { - printf("Error in creation: %s.\n", errmsg); + ms_error("linphone_sql_request: error sqlite3_exec(): %s.\n", errmsg); + sqlite3_free(errmsg); } } -void linphone_core_set_history_message(LinphoneChatRoom *cr,const char *local_contact,const char *remote_contact, - int direction, const char *message,const char *date, int read, int state){ - LinphoneCore *lc=linphone_chat_room_get_lc(cr); - char *buf=sqlite3_mprintf("insert into history values(NULL,%Q,%Q,%i,%Q,%Q,%i,%i);", - local_contact,remote_contact,direction,message,date,read,state); - linphone_sql_request(lc->db,buf); +void linphone_chat_message_store(LinphoneChatMessage *msg){ + LinphoneCore *lc=linphone_chat_room_get_lc(msg->chat_room); + if (lc->db){ + const char *peer=msg->chat_room->peer; + char *local_contact=linphone_address_as_string_uri_only(linphone_chat_message_get_local_address(msg)); + char datebuf[26]; + char *buf=sqlite3_mprintf("insert into history values(NULL,%Q,%Q,%i,%Q,%Q,%i,%i);", + local_contact,peer,msg->dir,msg->message,my_ctime_r(&msg->time,datebuf),msg->is_read,msg->state); + linphone_sql_request(lc->db,buf); + sqlite3_free(buf); + ms_free(local_contact); + } } -void linphone_core_set_message_state(LinphoneChatRoom *cr,const char *message, int state, time_t date){ - LinphoneCore *lc=linphone_chat_room_get_lc(cr); - char time_str[26]; - char *buf=sqlite3_mprintf("update history set status=%i where message = %Q and time = %Q;", - state,message,my_ctime_r(&date,time_str)); - linphone_sql_request(lc->db,buf); +void linphone_chat_message_store_state(LinphoneChatMessage *msg){ + LinphoneCore *lc=msg->chat_room->lc; + if (lc->db){ + char time_str[26]; + char *buf=sqlite3_mprintf("update history set status=%i where message = %Q and time = %Q;", + msg->state,msg->message,my_ctime_r(&msg->time,time_str)); + linphone_sql_request(lc->db,buf); + sqlite3_free(buf); + } } -void linphone_core_set_messages_flag_read(LinphoneChatRoom *cr,const char *from, int read){ +void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr){ LinphoneCore *lc=linphone_chat_room_get_lc(cr); + int read=1; + + if (lc->db==NULL) return ; + char *buf=sqlite3_mprintf("update history set read=%i where remoteContact = %Q;", - read,from); + read,cr->peer); linphone_sql_request(lc->db,buf); + sqlite3_free(buf); } -void linphone_core_delete_history(LinphoneCore *lc,const char *from){ - char *buf=sqlite3_mprintf("delete from history where remoteContact = %Q;",from); +void linphone_chat_room_delete_history(LinphoneChatRoom *cr){ + LinphoneCore *lc=cr->lc; + + if (lc->db==NULL) return ; + char *buf=sqlite3_mprintf("delete from history where remoteContact = %Q;",cr->peer); linphone_sql_request(lc->db,buf); + sqlite3_free(buf); } -MSList *linphone_chat_room_get_history(const char *to,LinphoneChatRoom *cr,int nb_message){ +MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message){ LinphoneCore *lc=linphone_chat_room_get_lc(cr); + MSList *ret; + + if (lc->db==NULL) return NULL; + cr->messages_hist = NULL; - char *buf=sqlite3_mprintf("select * from history where remoteContact = %Q order by id DESC limit %i ;",to,nb_message); - linphone_sql_request_message(lc->db,buf,(void *)cr); - return cr->messages_hist; + char *buf=sqlite3_mprintf("select * from history where remoteContact = %Q order by id DESC limit %i ;",cr->peer,nb_message); + linphone_sql_request_message(lc->db,buf,cr); + sqlite3_free(buf); + ret=cr->messages_hist; + cr->messages_hist=NULL; + return ret; } void linphone_close_storage(sqlite3* db){ @@ -167,36 +171,49 @@ void linphone_create_table(sqlite3* db){ } } -sqlite3 * linphone_message_storage_init(){ +void linphone_core_message_storage_init(LinphoneCore *lc){ int ret; - char *errmsg; + char *errmsg=NULL; sqlite3 *db; - char *filename; - filename=linphone_message_storage_get_config_file(NULL); - ret=sqlite3_open(filename,&db); + ret=sqlite3_open(lc->chat_db_file,&db); if(ret != SQLITE_OK) { printf("Error in the opening: %s.\n", errmsg); sqlite3_close(db); + sqlite3_free(errmsg); } linphone_create_table(db); - return db; + lc->db=db; } + +void linphone_core_message_storage_close(LinphoneCore *lc){ + if (lc->db){ + sqlite3_close(lc->db); + lc->db=NULL; + } +} + #else -void linphone_core_set_history_message(LinphoneChatRoom *cr,const char *local_contact,const char *remote_contact, - int direction, const char *message,const char *date, int read, int state){ +void linphone_chat_message_store(LinphoneChatMessage *cr){ } -void linphone_core_set_message_state(LinphoneChatRoom *cr,const char *message, int state, time_t date){ +void linphone_chat_message_store_state(LinphoneChatMessage *cr){ } -void linphone_core_set_messages_flag_read(LinphoneChatRoom *cr,const char *from, int read){ +void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr){ } -MSList *linphone_chat_room_get_history(const char *to,LinphoneChatRoom *cr,int nb_message){ +MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message){ return NULL; } -void linphone_core_delete_history(LinphoneCore *lc,const char *from){ +void linphone_chat_room_delete_history(LinphoneChatRoom *cr){ } -#endif \ No newline at end of file + +void linphone_core_message_storage_init(LinphoneCore *lc){ +} + +void linphone_core_message_storage_close(LinphoneCore *lc){ +} + +#endif diff --git a/coreapi/private.h b/coreapi/private.h index 35578604f..78344ee70 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -119,17 +119,25 @@ typedef struct _CallCallbackObj static const int linphone_call_magic=0x3343; +typedef enum _LinphoneChatMessageDir{ + LinphoneChatMessageIncoming, + LinphoneChatMessageOutgoing +} LinphoneChatMessageDir; + struct _LinphoneChatMessage { - char* message; LinphoneChatRoom* chat_room; + LinphoneChatMessageDir dir; + char* message; LinphoneChatMessageStateChangeCb cb; void* cb_ud; void* message_userdata; char* external_body_url; - LinphoneAddress* from; + LinphoneAddress *from; + LinphoneAddress *to; time_t time; SalCustomHeader *custom_headers; LinphoneChatMessageState state; + bool_t is_read; }; typedef struct StunCandidate{ @@ -616,6 +624,7 @@ struct _LinphoneCore LinphoneTunnel *tunnel; char* device_id; MSList *last_recv_msg_ids; + char *chat_db_file; #ifdef MSG_STORAGE_ENABLED sqlite3 *db; #endif @@ -700,19 +709,13 @@ void linphone_call_params_uninit(LinphoneCallParams *params); int linphone_upnp_init(LinphoneCore *lc); void linphone_upnp_destroy(LinphoneCore *lc); -#define OUTGOING 0 -#define INCOMING 1 - -#define NOT_READ 0 -#define READ 1 - #ifdef MSG_STORAGE_ENABLED sqlite3 * linphone_message_storage_init(); #endif -void linphone_core_set_history_message(LinphoneChatRoom *cr,const char *local_contact,const char *remote_contact, - int direction, const char *message,const char *date, int read, int state); -void linphone_core_set_message_state(LinphoneChatRoom *cr,const char *message, int state,time_t date); - +void linphone_chat_message_store(LinphoneChatMessage *msg); +void linphone_chat_message_store_state(LinphoneChatMessage *msg); +void linphone_core_message_storage_init(LinphoneCore *lc); +void linphone_core_message_storage_close(LinphoneCore *lc); #ifdef __cplusplus } diff --git a/coreapi/sal.h b/coreapi/sal.h index ba232cca3..25d8d20bc 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -430,8 +430,8 @@ int sal_register_refresh(SalOp *op, int expires); int sal_unregister(SalOp *h); /*Messaging */ -int sal_text_send(SalOp *op, const char *from, const char *to, const char *text, const char*t); -int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg, const char*t); +int sal_text_send(SalOp *op, const char *from, const char *to, const char *text); +int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg); /*presence Subscribe/notify*/ int sal_subscribe_presence(SalOp *op, const char *from, const char *to); diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index 2670af472..356d2a9fb 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -81,8 +81,23 @@ void sal_remove_in_subscribe(Sal *sal, SalOp *op){ sal->in_subscribes=ms_list_remove(sal->in_subscribes,op); } -int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg, const char *t){ +#ifdef WIN32 + +static inline char *my_ctime_r(const time_t *t, char *buf){ + strcpy(buf,ctime(t)); + return buf; +} + +#else +#define my_ctime_r ctime_r +#endif + +int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg){ osip_message_t *sip=NULL; + char t[26]; + time_t curtime=time(NULL); + + my_ctime_r(&curtime,t); if(op->cid == -1) { @@ -120,6 +135,8 @@ int sal_message_send(SalOp *op, const char *from, const char *to, const char* co eXosip_unlock(); return -1; } + sal_exosip_add_custom_headers(sip,op->base.custom_headers); + osip_message_set_date(sip,t); osip_message_set_content_type(sip,content_type); if (msg) osip_message_set_body(sip,msg,strlen(msg)); eXosip_call_send_request(op->did,sip); @@ -128,8 +145,8 @@ int sal_message_send(SalOp *op, const char *from, const char *to, const char* co return 0; } -int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg,const char *t) { - return sal_message_send(op,from,to,"text/plain",msg,t); +int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg) { + return sal_message_send(op,from,to,"text/plain",msg); } /*presence Subscribe/notify*/ int sal_subscribe_presence(SalOp *op, const char *from, const char *to){ diff --git a/gtk/chat.c b/gtk/chat.c index b3a5ecfdc..6a65cd9fc 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -25,6 +25,37 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define NB_MSG_HIST 250 +#define CONFIG_FILE ".linphone-history.db" + +const char *linphone_gtk_message_storage_get_db_file(const char *filename){ + const int path_max=1024; + static char *db_file=NULL; + + if (db_file) return db_file; + + db_file=(char *)malloc(path_max*sizeof(char)); + if (filename==NULL) filename=CONFIG_FILE; + /*try accessing a local file first if exists*/ + if (access(CONFIG_FILE,F_OK)==0){ + snprintf(db_file,path_max,"%s",filename); + }else{ +#ifdef WIN32 + const char *appdata=getenv("APPDATA"); + if (appdata){ + snprintf(db_file,path_max,"%s\\%s",appdata,LINPHONE_CONFIG_DIR); + CreateDirectory(db_file,NULL); + snprintf(db_file,path_max,"%s\\%s\\%s",appdata,LINPHONE_CONFIG_DIR,filename); + } +#else + const char *home=getenv("HOME"); + if (home==NULL) home="."; + snprintf(db_file,path_max,"%s/%s",home,filename); +#endif + } + return db_file; +} + + void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { GtkWidget *main_window=linphone_gtk_get_main_window (); GtkWidget *nb=linphone_gtk_get_widget(main_window,"viewswitch"); @@ -92,16 +123,16 @@ void udpate_tab_chat_header(GtkWidget *chat_view,const LinphoneAddress *uri,Linp void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gboolean me,LinphoneChatRoom *cr,LinphoneChatMessage *msg, gboolean hist){ - GtkTextView *text=GTK_TEXT_VIEW(linphone_gtk_get_widget(w,"textview")); - GtkTextBuffer *buffer=gtk_text_view_get_buffer(text); - GtkTextIter iter,begin; + GtkTextView *text=GTK_TEXT_VIEW(linphone_gtk_get_widget(w,"textview")); + GtkTextBuffer *buffer=gtk_text_view_get_buffer(text); + GtkTextIter iter,begin; int off; char *from_str=linphone_address_as_string_uri_only(from); char *from_message=(char *)g_object_get_data(G_OBJECT(w),"from_message"); GList *list=g_object_get_data(G_OBJECT(w),"list"); time_t t; - gtk_text_buffer_get_start_iter(buffer,&begin); + gtk_text_buffer_get_start_iter(buffer,&begin); gtk_text_buffer_get_end_iter(buffer,&iter); off=gtk_text_iter_get_offset(&iter); if(g_strcmp0(from_message,from_str)!=0){ @@ -148,7 +179,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); - gtk_text_view_scroll_mark_onscreen(text,mark); + gtk_text_view_scroll_mark_onscreen(text,mark); } const LinphoneAddress* linphone_gtk_get_used_identity(){ @@ -160,8 +191,8 @@ const LinphoneAddress* linphone_gtk_get_used_identity(){ } void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessage *msg){ - GtkWidget *main_window=linphone_gtk_get_main_window(); - GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); + GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *page=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); GList *list=g_object_get_data(G_OBJECT(page),"list"); @@ -277,7 +308,7 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres colorb.blue = 61952; with_str=linphone_address_as_string_uri_only(with); - linphone_core_set_messages_flag_read(cr,with_str,1); + linphone_chat_room_mark_as_read(cr); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_WORD_CHAR); gtk_text_view_set_editable(GTK_TEXT_VIEW(text),FALSE); gtk_notebook_append_page(notebook,chat_view,create_tab_chat_header(cr,with)); @@ -304,7 +335,7 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres "margin","indent",10,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), "bg","paragraph-background-gdk",&colorb,NULL); - messages = linphone_chat_room_get_history(with_str,cr,NB_MSG_HIST); + messages = linphone_chat_room_get_history(cr,NB_MSG_HIST); display_history_message(chat_view,messages,with); button = linphone_gtk_get_widget(chat_view,"send"); g_signal_connect_swapped(G_OBJECT(button),"clicked",(GCallback)linphone_gtk_send_text,NULL); @@ -325,23 +356,22 @@ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri, LinphoneChatRoom *cr2=(LinphoneChatRoom *)g_object_get_data(G_OBJECT(chat_view),"cr"); char *from_str=linphone_address_as_string(linphone_chat_room_get_peer_address (cr2)); char *uri_str=linphone_address_as_string(uri); - char *uri_only=linphone_address_as_string_uri_only(uri); MSList *messages=NULL; - linphone_core_set_messages_flag_read(cr,uri_only,1); - if(g_strcmp0(from_str,uri_str)!=0){ - GtkTextView *text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); - GtkTextIter start; - GtkTextIter end; + linphone_chat_room_mark_as_read(cr); + if(g_strcmp0(from_str,uri_str)!=0){ + GtkTextView *text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); + GtkTextIter start; + GtkTextIter end; GtkTextBuffer *text_buffer; - text_buffer=gtk_text_view_get_buffer(text_view); - gtk_text_buffer_get_bounds(text_buffer, &start, &end); - gtk_text_buffer_delete (text_buffer, &start, &end); + text_buffer=gtk_text_view_get_buffer(text_view); + gtk_text_buffer_get_bounds(text_buffer, &start, &end); + gtk_text_buffer_delete (text_buffer, &start, &end); udpate_tab_chat_header(chat_view,uri,cr); g_object_set_data(G_OBJECT(chat_view),"cr",cr); g_object_set_data(G_OBJECT(linphone_gtk_get_widget(main_window,"contact_list")),"chatview",(gpointer)chat_view); - messages = linphone_chat_room_get_history(uri_only,cr,NB_MSG_HIST); + messages = linphone_chat_room_get_history(cr,NB_MSG_HIST); g_object_set_data(G_OBJECT(chat_view),"from_message",uri_str); display_history_message(chat_view,messages,uri); } diff --git a/gtk/friendlist.c b/gtk/friendlist.c index 4ae86dfab..fc2c2f4b5 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -174,8 +174,10 @@ void linphone_gtk_delete_history(GtkWidget *button){ select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list"))); if (gtk_tree_selection_get_selected (select, &model, &iter)) { + LinphoneChatRoom *cr; gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); - linphone_core_delete_history(linphone_gtk_get_core(),linphone_address_as_string_uri_only(linphone_friend_get_address(lf))); + cr=linphone_core_get_chat_room(linphone_gtk_get_core(),linphone_friend_get_address(lf)); + linphone_chat_room_delete_history(cr); linphone_gtk_show_friends(); } } diff --git a/gtk/linphone.h b/gtk/linphone.h index f9597849d..aaa021a28 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -58,6 +58,8 @@ GtkWidget *linphone_gtk_create_window(const char *window_name); GtkWidget *linphone_gtk_get_widget(GtkWidget *window, const char *name); GtkWidget *linphone_gtk_create_widget(const char *filename, const char *widget_name); + +const char *linphone_gtk_message_storage_get_db_file(const char *filename); void linphone_gtk_show_assistant(void); void linphone_gtk_close_assistant(void); diff --git a/gtk/main.c b/gtk/main.c index b1dab3d65..c6065241c 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -216,7 +216,7 @@ static const char *linphone_gtk_get_factory_config_file(){ } static void linphone_gtk_init_liblinphone(const char *config_file, - const char *factory_config_file) { + const char *factory_config_file, const char *db_file) { LinphoneCoreVTable vtable={0}; gchar *secrets_file=linphone_gtk_get_config_file(SECRETS_FILE); @@ -248,6 +248,7 @@ static void linphone_gtk_init_liblinphone(const char *config_file, _linphone_gtk_enable_video(FALSE); linphone_gtk_set_ui_config_int("videoselfview",0); } + if (db_file) linphone_core_set_chat_database_path(the_core,db_file); } LinphoneCore *linphone_gtk_get_core(void){ @@ -1840,6 +1841,7 @@ int main(int argc, char *argv[]){ GdkPixbuf *pbuf; const char *app_name="Linphone"; LpConfig *factory; + const char *db_file; #if !GLIB_CHECK_VERSION(2, 31, 0) g_thread_init(NULL); @@ -1946,7 +1948,8 @@ int main(int argc, char *argv[]){ linphone_gtk_create_log_window(); linphone_core_enable_logs_with_cb(linphone_gtk_log_handler); - linphone_gtk_init_liblinphone(config_file, factory_config_file); + db_file=linphone_gtk_message_storage_get_db_file(NULL); + linphone_gtk_init_liblinphone(config_file, factory_config_file, db_file); g_set_application_name(app_name); pbuf=create_pixbuf(linphone_gtk_get_ui_config("icon",LINPHONE_ICON)); From 88d0ac4cdc6f78f378b6fbf3e7d6b7833c53cba6 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 11 Mar 2013 12:03:19 +0100 Subject: [PATCH 129/281] fix android makefile. --- build/android/common.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/android/common.mk b/build/android/common.mk index 9fd68d779..543a9dc19 100644 --- a/build/android/common.mk +++ b/build/android/common.mk @@ -44,7 +44,8 @@ LOCAL_SRC_FILES := \ linphonecall.c \ conference.c \ ec-calibrator.c \ - linphone_tunnel_config.c + linphone_tunnel_config.c \ + message_storage.c ifndef LINPHONE_VERSION LINPHONE_VERSION = "Devel" From a4f1f411ef60a0f9311585ce1118850fe2151b84 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 5 Mar 2013 16:35:40 +0100 Subject: [PATCH 130/281] full LinphoneAuthInfo impl for Android --- coreapi/authentication.c | 28 +++ coreapi/linphonecore.h | 4 + coreapi/linphonecore_jni.cc | 159 +++++++++++++++--- .../org/linphone/core/LinphoneAuthInfo.java | 20 +++ .../linphone/core/LinphoneCoreFactory.java | 10 ++ .../linphone/core/LinphoneAuthInfoImpl.java | 58 +++++-- .../core/LinphoneCoreFactoryImpl.java | 6 + 7 files changed, 250 insertions(+), 35 deletions(-) diff --git a/coreapi/authentication.c b/coreapi/authentication.c index 4b5d10fa8..8ab1c21ff 100644 --- a/coreapi/authentication.c +++ b/coreapi/authentication.c @@ -80,6 +80,13 @@ const char *linphone_auth_info_get_userid(const LinphoneAuthInfo *i){ return i->userid; } +const char *linphone_auth_info_get_realm(const LinphoneAuthInfo *i){ + return i->realm; +} +const char *linphone_auth_info_get_ha1(const LinphoneAuthInfo *i){ + return i->ha1; +} + /** * Sets the password. **/ @@ -113,6 +120,27 @@ void linphone_auth_info_set_userid(LinphoneAuthInfo *info, const char *userid){ if (userid && strlen(userid)>0) info->userid=ms_strdup(userid); } +/** + * Sets realm. +**/ +void linphone_auth_info_set_realm(LinphoneAuthInfo *info, const char *realm){ + if (info->realm){ + ms_free(info->realm); + info->realm=NULL; + } + if (realm && strlen(realm)>0) info->realm=ms_strdup(realm); +} +/** + * Sets ha1. +**/ +void linphone_auth_info_set_ha1(LinphoneAuthInfo *info, const char *ha1){ + if (info->ha1){ + ms_free(info->ha1); + info->ha1=NULL; + } + if (ha1 && strlen(ha1)>0) info->ha1=ms_strdup(ha1); +} + /** * Destroys a LinphoneAuthInfo object. **/ diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 7212f26c4..de8a05afa 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -617,10 +617,14 @@ LinphoneAuthInfo *linphone_auth_info_new(const char *username, const char *useri void linphone_auth_info_set_passwd(LinphoneAuthInfo *info, const char *passwd); void linphone_auth_info_set_username(LinphoneAuthInfo *info, const char *username); void linphone_auth_info_set_userid(LinphoneAuthInfo *info, const char *userid); +void linphone_auth_info_set_realm(LinphoneAuthInfo *info, const char *realm); +void linphone_auth_info_set_ha1(LinphoneAuthInfo *info, const char *ha1); const char *linphone_auth_info_get_username(const LinphoneAuthInfo *i); const char *linphone_auth_info_get_passwd(const LinphoneAuthInfo *i); const char *linphone_auth_info_get_userid(const LinphoneAuthInfo *i); +const char *linphone_auth_info_get_realm(const LinphoneAuthInfo *i); +const char *linphone_auth_info_get_ha1(const LinphoneAuthInfo *i); /* you don't need those function*/ void linphone_auth_info_destroy(LinphoneAuthInfo *info); diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 57ab7c4ca..6b6c3f5ce 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1187,33 +1187,150 @@ extern "C" jboolean Java_org_linphone_core_LinphoneProxyConfigImpl_publishEnable //Auth Info extern "C" jlong Java_org_linphone_core_LinphoneAuthInfoImpl_newLinphoneAuthInfo(JNIEnv* env - , jobject thiz - , jstring jusername - , jstring juserid - , jstring jpassword - , jstring jha1 - , jstring jrealm) { - - const char* username = env->GetStringUTFChars(jusername, NULL); - const char* userid = env->GetStringUTFChars(juserid, NULL); - const char* password = env->GetStringUTFChars(jpassword, NULL); - const char* ha1 = env->GetStringUTFChars(jha1, NULL); - const char* realm = env->GetStringUTFChars(jrealm, NULL); - jlong auth = (jlong)linphone_auth_info_new(username,userid,password,ha1,realm); - - env->ReleaseStringUTFChars(jusername, username); - env->ReleaseStringUTFChars(juserid, userid); - env->ReleaseStringUTFChars(jpassword, password); - env->ReleaseStringUTFChars(jha1, ha1); - env->ReleaseStringUTFChars(jrealm, realm); - return auth; - + , jobject thiz ) { + return (jlong)linphone_auth_info_new(NULL,NULL,NULL,NULL,NULL); } extern "C" void Java_org_linphone_core_LinphoneAuthInfoImpl_delete(JNIEnv* env , jobject thiz , jlong ptr) { linphone_auth_info_destroy((LinphoneAuthInfo*)ptr); } +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: getPassword + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_getPassword +(JNIEnv *env , jobject, jlong auth_info) { + const char* passwd = linphone_auth_info_get_passwd((LinphoneAuthInfo*)auth_info); + if (passwd) { + return env->NewStringUTF(passwd); + } else { + return NULL; + } + +} +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: getRealm + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_getRealm +(JNIEnv *env , jobject, jlong auth_info) { + const char* realm = linphone_auth_info_get_realm((LinphoneAuthInfo*)auth_info); + if (realm) { + return env->NewStringUTF(realm); + } else { + return NULL; + } + +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: getUsername + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_getUsername +(JNIEnv *env , jobject, jlong auth_info) { + const char* username = linphone_auth_info_get_username((LinphoneAuthInfo*)auth_info); + if (username) { + return env->NewStringUTF(username); + } else { + return NULL; + } +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: setPassword + * Signature: (JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_setPassword +(JNIEnv *env, jobject, jlong auth_info, jstring jpassword) { + const char* password = jpassword?env->GetStringUTFChars(jpassword, NULL):NULL; + linphone_auth_info_set_passwd((LinphoneAuthInfo*)auth_info,password); + if (password) env->ReleaseStringUTFChars(jpassword, password); +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: setRealm + * Signature: (JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_setRealm +(JNIEnv *env, jobject, jlong auth_info, jstring jrealm) { + const char* realm = jrealm?env->GetStringUTFChars(jrealm, NULL):NULL; + linphone_auth_info_set_realm((LinphoneAuthInfo*)auth_info,realm); + if (realm) env->ReleaseStringUTFChars(jrealm, realm); +} +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: setUsername + * Signature: (JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_setUsername +(JNIEnv *env, jobject, jlong auth_info, jstring jusername) { + const char* username = jusername?env->GetStringUTFChars(jusername, NULL):NULL; + linphone_auth_info_set_username((LinphoneAuthInfo*)auth_info,username); + if (username) env->ReleaseStringUTFChars(jusername, username); +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: setAuthUserId + * Signature: (JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_setUserId +(JNIEnv *env, jobject, jlong auth_info, jstring juserid) { + const char* userid = juserid?env->GetStringUTFChars(juserid, NULL):NULL; + linphone_auth_info_set_userid((LinphoneAuthInfo*)auth_info,userid); + if (userid) env->ReleaseStringUTFChars(juserid, userid); +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: getAuthUserId + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_getUserId +(JNIEnv *env , jobject, jlong auth_info) { + const char* userid = linphone_auth_info_get_userid((LinphoneAuthInfo*)auth_info); + if (userid) { + return env->NewStringUTF(userid); + } else { + return NULL; + } +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: setHa1 + * Signature: (JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_setHa1 +(JNIEnv *env, jobject, jlong auth_info, jstring jha1) { + const char* ha1 = jha1?env->GetStringUTFChars(jha1, NULL):NULL; + linphone_auth_info_set_ha1((LinphoneAuthInfo*)auth_info,ha1); + if (ha1) env->ReleaseStringUTFChars(jha1, ha1); +} + + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: getHa1 + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_getHa1 +(JNIEnv *env , jobject, jlong auth_info) { + const char* ha1 = linphone_auth_info_get_ha1((LinphoneAuthInfo*)auth_info); + if (ha1) { + return env->NewStringUTF(ha1); + } else { + return NULL; + } +} + //LinphoneAddress diff --git a/java/common/org/linphone/core/LinphoneAuthInfo.java b/java/common/org/linphone/core/LinphoneAuthInfo.java index 6590dafeb..ed8a84017 100644 --- a/java/common/org/linphone/core/LinphoneAuthInfo.java +++ b/java/common/org/linphone/core/LinphoneAuthInfo.java @@ -63,6 +63,26 @@ public interface LinphoneAuthInfo { * @param realm */ void setRealm(String realm); + /** + * get auth userid has used in authentication header. If null, username is taken for authentication + * @return auth userid + */ + String getUserId(); + /** + * set auth userid has used in authentication header. If null, username is taken for authentication + * + */ + void setUserId(String userid); + /** + * get ha1 + * @return ha1 + */ + String getHa1(); + /** + * set ha1 + */ + void setHa1(String ha1); + } diff --git a/java/common/org/linphone/core/LinphoneCoreFactory.java b/java/common/org/linphone/core/LinphoneCoreFactory.java index 399b9ec8d..ea325057e 100644 --- a/java/common/org/linphone/core/LinphoneCoreFactory.java +++ b/java/common/org/linphone/core/LinphoneCoreFactory.java @@ -49,10 +49,20 @@ abstract public class LinphoneCoreFactory { return theLinphoneCoreFactory; } abstract public LinphoneAuthInfo createAuthInfo(String username,String password, String realm); + /** + * create {@link LinphoneAuthInfo} + * @param username + * @param userid user id as set in auth header + * @param passwd + * @param ha1 + * @param realm + * */ + abstract public LinphoneAuthInfo createAuthInfo(String username, String userid, String passwd, String ha1,String realm); abstract public LinphoneCore createLinphoneCore(LinphoneCoreListener listener, String userConfig,String factoryConfig,Object userdata) throws LinphoneCoreException; abstract public LinphoneCore createLinphoneCore(LinphoneCoreListener listener) throws LinphoneCoreException; + /** * Constructs a LinphoneAddress object * @param username diff --git a/java/impl/org/linphone/core/LinphoneAuthInfoImpl.java b/java/impl/org/linphone/core/LinphoneAuthInfoImpl.java index 45fd8a45e..dee96fe5d 100644 --- a/java/impl/org/linphone/core/LinphoneAuthInfoImpl.java +++ b/java/impl/org/linphone/core/LinphoneAuthInfoImpl.java @@ -20,36 +20,66 @@ package org.linphone.core; class LinphoneAuthInfoImpl implements LinphoneAuthInfo { protected final long nativePtr; - private native long newLinphoneAuthInfo(String username, String userid, String passwd, String ha1,String realm); + private native long newLinphoneAuthInfo(); private native void delete(long ptr); + private native String getPassword(long ptr); + private native String getRealm(long ptr); + private native String getUsername(long ptr); + private native void setPassword(long ptr, String password); + private native void setRealm(long ptr, String realm); + private native void setUsername(long ptr, String username); + private native void setUserId(long ptr, String username); + private native void setHa1(long ptr, String ha1); + private native String getUserId(long ptr); + private native String getHa1(long ptr); + protected LinphoneAuthInfoImpl(String username,String password, String realm) { - nativePtr = newLinphoneAuthInfo(username,"",password,"",""); + this(username,null,password,null,null); + } + protected LinphoneAuthInfoImpl(String username, String userid, String passwd, String ha1,String realm) { + nativePtr = newLinphoneAuthInfo(); + this.setUsername(username); + this.setUserId(userid); + this.setPassword(passwd); + this.setHa1(ha1); } protected void finalize() throws Throwable { delete(nativePtr); } public String getPassword() { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + return getPassword (nativePtr); } public String getRealm() { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + return getRealm (nativePtr); } public String getUsername() { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + return getUsername (nativePtr); } public void setPassword(String password) { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + setPassword(nativePtr,password); } public void setRealm(String realm) { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + setRealm(nativePtr,realm); } public void setUsername(String username) { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + setUsername(nativePtr,username); + } + @Override + public String getUserId() { + return getUserId(nativePtr); + } + @Override + public void setUserId(String userid) { + setUserId(nativePtr,userid); + + } + @Override + public String getHa1() { + return getHa1(nativePtr); + } + @Override + public void setHa1(String ha1) { + setHa1(nativePtr,ha1); + } } diff --git a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java index 2e5c4cf59..7b21ecaae 100644 --- a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java @@ -166,4 +166,10 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { { return System.getProperty("os.arch").contains("armv7"); } + + @Override + public LinphoneAuthInfo createAuthInfo(String username, String userid, + String passwd, String ha1, String realm) { + return new LinphoneAuthInfoImpl(username,userid,passwd,ha1,realm); + } } From 9a2784e8f6e9f79e450ac2e31aa5c3cb61e79b9e Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 12 Mar 2013 12:49:19 +0100 Subject: [PATCH 131/281] Fix bug in upnp string compare function --- coreapi/upnp.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 596afe333..e8841c2d6 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -111,22 +111,24 @@ void linphone_upnp_config_remove_port_binding(UpnpContext *lupnp, const UpnpPort int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port, bool_t retry); int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBinding *port, bool_t retry); - static int linphone_upnp_strncmpi(const char *str1, const char *str2, int len) { int i = 0; char char1, char2; - while(*str1 != '\0' && *str2 != '\0' && i < len) { + while(true) { + if(i >= len) { + return 0; + } char1 = toupper(*str1); char2 = toupper(*str2); - if(char1 != char2) { + if(char1 == '\0' || char2 == '\0' || char1 != char2) { return char1 - char2; } str1++; str2++; - len++; + i++; } - return 0; } + static int linphone_upnp_str_min(const char *str1, const char *str2) { int len1 = strlen(str1); int len2 = strlen(str2); @@ -135,6 +137,7 @@ static int linphone_upnp_str_min(const char *str1, const char *str2) { } return len1; } + char * linphone_upnp_format_device_id(const char *device_id) { char *ret = NULL; char *tmp; From ece0ca2799f86a80ae68972d3c45c9367bc843a0 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 12 Mar 2013 12:59:43 +0100 Subject: [PATCH 132/281] Fix previous commit --- coreapi/upnp.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index e8841c2d6..2dfd7f39c 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -114,19 +114,17 @@ int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBind static int linphone_upnp_strncmpi(const char *str1, const char *str2, int len) { int i = 0; char char1, char2; - while(true) { - if(i >= len) { - return 0; - } + while(i < len) { char1 = toupper(*str1); char2 = toupper(*str2); - if(char1 == '\0' || char2 == '\0' || char1 != char2) { + if(char1 == '\0' || char1 != char2) { return char1 - char2; } str1++; str2++; i++; } + return 0; } static int linphone_upnp_str_min(const char *str1, const char *str2) { From ca0954460e11090b2f7be8e62654fdc5c90da86d Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 12 Mar 2013 21:33:40 +0100 Subject: [PATCH 133/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 06e505707..28c3383b5 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 06e505707c31d11e056f2dad4de3ac617985333b +Subproject commit 28c3383b5e98196ab394f6616f11c195e6759d28 From 74edc29206e423985b9a6748c61905ca3157d79a Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 13 Mar 2013 10:20:41 +0100 Subject: [PATCH 134/281] Add rtp config for disabling upnp for rtp streams --- coreapi/linphonecall.c | 18 +++++++++++------- coreapi/linphonecore.c | 1 + coreapi/private.h | 1 + 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index a7cad386c..dba7381c7 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -484,7 +484,9 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr } #ifdef BUILD_UPNP if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseUpnp) { - call->upnp_session = linphone_upnp_session_new(call); + if(!lc->rtp_conf.disable_upnp) { + call->upnp_session = linphone_upnp_session_new(call); + } } #endif //BUILD_UPNP call->camera_active=params->has_video; @@ -558,12 +560,14 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro 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); + if(!lc->rtp_conf.disable_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 diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 2bb9fab32..b704347da 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -751,6 +751,7 @@ static void rtp_config_read(LinphoneCore *lc) linphone_core_enable_audio_adaptive_jittcomp(lc, adaptive_jitt_comp_enabled); adaptive_jitt_comp_enabled = lp_config_get_int(lc->config, "rtp", "video_adaptive_jitt_comp_enabled", TRUE); linphone_core_enable_video_adaptive_jittcomp(lc, adaptive_jitt_comp_enabled); + lc->rtp_conf.disable_upnp = lp_config_get_int(lc->config, "rtp", "disable_upnp", FALSE); } static PayloadType * find_payload(RtpProfile *prof, const char *mime_type, int clock_rate, int channels, const char *recv_fmtp){ diff --git a/coreapi/private.h b/coreapi/private.h index 78344ee70..13087dc04 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -459,6 +459,7 @@ typedef struct rtp_config int audio_jitt_comp; /*jitter compensation*/ int video_jitt_comp; /*jitter compensation*/ int nortp_timeout; + int disable_upnp; bool_t rtp_no_xmit_on_audio_mute; /* stop rtp xmit when audio muted */ bool_t audio_adaptive_jitt_comp_enabled; From cfca813d06ac477cc7f7f6ad6c91a34daae8dcde Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 13 Mar 2013 12:05:45 +0100 Subject: [PATCH 135/281] Expand row in calllog --- gtk/calllogs.c | 46 ++++++++++++++++++++++++++-------------------- gtk/friendlist.c | 3 ++- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 9e703a8ff..45a616119 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -22,7 +22,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. static void fill_renderers(GtkTreeView *v){ GtkTreeViewColumn *c; - GtkCellRenderer *r=gtk_cell_renderer_pixbuf_new (); + GtkCellRenderer *r; + r=gtk_cell_renderer_pixbuf_new(); c=gtk_tree_view_column_new_with_attributes("icon",r,"pixbuf",0,NULL); gtk_tree_view_append_column (v,c); @@ -34,27 +35,27 @@ static void fill_renderers(GtkTreeView *v){ void linphone_gtk_call_log_update(GtkWidget *w){ GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view")); - GtkListStore *store; + GtkTreeStore *store; const MSList *logs; - store=(GtkListStore*)gtk_tree_view_get_model(v); + store=(GtkTreeStore*)gtk_tree_view_get_model(v); if (store==NULL){ - store=gtk_list_store_new(3,GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_POINTER); + store=gtk_tree_store_new(3,GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_POINTER); gtk_tree_view_set_model(v,GTK_TREE_MODEL(store)); g_object_unref(G_OBJECT(store)); fill_renderers(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view"))); // gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")), // create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png"))); } - gtk_list_store_clear (store); + gtk_tree_store_clear (store); for (logs=linphone_core_get_call_logs(linphone_gtk_get_core());logs!=NULL;logs=logs->next){ LinphoneCallLog *cl=(LinphoneCallLog*)logs->data; - GtkTreeIter iter; + GtkTreeIter iter, iter2; LinphoneAddress *la=linphone_call_log_get_dir(cl)==LinphoneCallIncoming ? linphone_call_log_get_from(cl) : linphone_call_log_get_to(cl); char *addr= linphone_address_as_string_uri_only (la); const char *display; - gchar *logtxt, *minutes, *seconds; + gchar *logtxt, *headtxt, *minutes, *seconds; gchar quality[20]; const char *status=NULL; gchar *start_date=NULL; @@ -99,28 +100,33 @@ void linphone_gtk_call_log_update(GtkWidget *w){ seconds=g_markup_printf_escaped( ngettext("%i second", "%i seconds", duration%60), duration%60); - if (status==NULL) logtxt=g_markup_printf_escaped( - _("%s\t%s\t" - "Quality: %s\n%s\t%s %s\t"), - display, addr, quality , - start_date ? start_date : "", minutes, seconds); - else logtxt=g_markup_printf_escaped( - _("%s\t%s\t" - "\n%s\t%s"), - display, addr, - start_date ? start_date : "", status); + if (status==NULL) { + headtxt=g_markup_printf_escaped(_("%s\t%s"),display,start_date ? start_date : ""); + logtxt=g_markup_printf_escaped( + _("%s\t" + "Quality: %s\n%s\t%s\t"), + addr, quality, minutes, seconds); + } else { + headtxt=g_markup_printf_escaped(_("%s\t%s"),display,start_date ? start_date : ""); + logtxt=g_markup_printf_escaped( + _("%s\t" + "\n%s"),addr, status); + } g_free(minutes); g_free(seconds); if (start_date) g_free(start_date); - gtk_list_store_append (store,&iter); + gtk_tree_store_append (store,&iter,NULL); GdkPixbuf *incoming = create_pixbuf("call_status_incoming.png"); GdkPixbuf *outgoing = create_pixbuf("call_status_outgoing.png"); - gtk_list_store_set (store,&iter, + gtk_tree_store_set (store,&iter, 0, linphone_call_log_get_dir(cl)==LinphoneCallOutgoing ? outgoing : incoming, - 1, logtxt,2,la,-1); + 1, headtxt,2,la,-1); + gtk_tree_store_append (store,&iter2,&iter); + gtk_tree_store_set (store,&iter2,1,logtxt,2,la,-1); ms_free(addr); g_free(logtxt); + g_free(headtxt); } } diff --git a/gtk/friendlist.c b/gtk/friendlist.c index fc2c2f4b5..be6a4c3ce 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -581,12 +581,13 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ gtk_tree_view_column_set_max_width(column,60); gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); + /* Call column*/ renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes (_("Call"),renderer,"pixbuf",FRIEND_CALL,NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); - /* chat column*/ + /* Chat column*/ renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes (_("Chat"),renderer,"pixbuf",FRIEND_CHAT,NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); From bee6752f6e6c188481521d74dbd0dfc0bd86b5aa Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 14 Mar 2013 13:27:53 +0100 Subject: [PATCH 136/281] add automatic tone user indications --- coreapi/callbacks.c | 8 +++-- coreapi/conference.c | 4 +-- coreapi/ec-calibrator.c | 11 ++++--- coreapi/linphonecall.c | 3 +- coreapi/linphonecore.c | 69 ++++++++++++++++++++++++++++++++++++----- coreapi/lpconfig.c | 5 ++- coreapi/misc.c | 3 ++ coreapi/private.h | 12 +++++++ mediastreamer2 | 2 +- 9 files changed, 98 insertions(+), 19 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index dd5ab7edc..8a6ea631c 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -151,7 +151,7 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia bool_t send_ringbacktone=FALSE; if (call->audiostream==NULL){ - /*this happens after pausing the call locally. The streams is destroyed and then we wait the 200Ok to recreate it*/ + /*this happens after pausing the call locally. The streams are destroyed and then we wait the 200Ok to recreate them*/ linphone_call_init_media_streams (call); } if (call->state==LinphoneCallIncomingEarlyMedia && linphone_core_get_remote_ringback_tone (lc)!=NULL){ @@ -163,6 +163,9 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia } linphone_call_start_media_streams(call,all_muted,send_ringbacktone); } + if (call->state==LinphoneCallPausing && call->paused_by_app && ms_list_size(lc->calls)==1){ + linphone_core_play_named_tone(lc,LinphoneToneCallOnHold); + } } #if 0 static bool_t is_duplicate_call(LinphoneCore *lc, const LinphoneAddress *from, const LinphoneAddress *to){ @@ -654,6 +657,7 @@ static void call_failure(SalOp *op, SalError error, SalReason sr, const char *de } else if (sr == SalReasonBusy) { call->reason=LinphoneReasonBusy; linphone_call_set_state(call,LinphoneCallError,"User is busy."); + linphone_core_play_named_tone(lc,LinphoneToneBusy); } else { linphone_call_set_state(call,LinphoneCallError,msg); } @@ -809,7 +813,7 @@ static void refer_received(Sal *sal, SalOp *op, const char *referto){ } if (call->state!=LinphoneCallPaused){ ms_message("Automatically pausing current call to accept transfer."); - linphone_core_pause_call(lc,call); + _linphone_core_pause_call(lc,call); call->was_automatically_paused=TRUE; /*then we will start the refered when the pause is accepted, in order to serialize transactions within the dialog. * Indeed we need to avoid to send a NOTIFY to inform about of state of the refered call while the pause isn't completed. diff --git a/coreapi/conference.c b/coreapi/conference.c index 16be62613..c9d51b151 100644 --- a/coreapi/conference.c +++ b/coreapi/conference.c @@ -240,7 +240,7 @@ static int remove_from_conference(LinphoneCore *lc, LinphoneCall *call, bool_t a err=linphone_core_update_call(lc,call,&call->params); } else{ ms_message("Pausing call to actually remove from conference"); - err=linphone_core_pause_call(lc,call); + err=_linphone_core_pause_call(lc,call); } return err; @@ -339,7 +339,7 @@ int linphone_core_enter_conference(LinphoneCore *lc){ return -1; } if (lc->current_call != NULL) { - linphone_core_pause_call(lc, lc->current_call); + _linphone_core_pause_call(lc, lc->current_call); } LinphoneConference *conf=&lc->conf_ctx; if (conf->local_participant==NULL) add_local_endpoint(conf,lc); diff --git a/coreapi/ec-calibrator.c b/coreapi/ec-calibrator.c index 8efbabb1b..e19559fc4 100644 --- a/coreapi/ec-calibrator.c +++ b/coreapi/ec-calibrator.c @@ -133,6 +133,9 @@ static void on_tone_received(void *data, MSFilter *f, unsigned int event_id, voi static void ecc_play_tones(EcCalibrator *ecc){ MSDtmfGenCustomTone tone; MSToneDetectorDef expected_tone; + + memset(&tone,0,sizeof(tone)); + memset(&expected_tone,0,sizeof(expected_tone)); ms_filter_set_notify_callback(ecc->det,on_tone_received,ecc); @@ -161,7 +164,7 @@ static void ecc_play_tones(EcCalibrator *ecc){ /*play an initial tone to startup the audio playback/capture*/ - tone.frequency=140; + tone.frequencies[0]=140; tone.duration=1000; tone.amplitude=0.5; @@ -172,17 +175,17 @@ static void ecc_play_tones(EcCalibrator *ecc){ /* play the three tones*/ - tone.frequency=2000; + tone.frequencies[0]=2000; tone.duration=100; ms_filter_call_method(ecc->gen,MS_DTMF_GEN_PLAY_CUSTOM,&tone); ms_usleep(300000); - tone.frequency=2300; + tone.frequencies[0]=2300; tone.duration=100; ms_filter_call_method(ecc->gen,MS_DTMF_GEN_PLAY_CUSTOM,&tone); ms_usleep(300000); - tone.frequency=2500; + tone.frequencies[0]=2500; tone.duration=100; ms_filter_call_method(ecc->gen,MS_DTMF_GEN_PLAY_CUSTOM,&tone); ms_sleep(1); diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index dba7381c7..6c01c65bd 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -2114,7 +2114,7 @@ static void linphone_core_disconnected(LinphoneCore *lc, LinphoneCall *call){ if (from) { snprintf(temp,sizeof(temp),"Remote end %s seems to have disconnected, the call is going to be closed.",from); - free(from); + ms_free(from); } else { @@ -2123,6 +2123,7 @@ static void linphone_core_disconnected(LinphoneCore *lc, LinphoneCall *call){ if (lc->vtable.display_warning!=NULL) lc->vtable.display_warning(lc,temp); linphone_core_terminate_call(lc,call); + linphone_core_play_named_tone(lc,LinphoneToneCallFailed); } static void handle_ice_events(LinphoneCall *call, OrtpEvent *ev){ diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index b704347da..a2c910064 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2118,9 +2118,10 @@ void linphone_core_iterate(LinphoneCore *lc){ ms_message("incoming call ringing for %i seconds",elapsed); if (elapsed>lc->sip_conf.inc_timeout){ ms_message("incoming call timeout (%i)",lc->sip_conf.inc_timeout); + LinphoneReason decline_reason=lc->current_call ? LinphoneReasonBusy : LinphoneReasonDeclined; call->log->status=LinphoneCallMissed; call->reason=LinphoneReasonNotAnswered; - linphone_core_terminate_call(lc,call); + linphone_core_decline_call(lc,call,decline_reason); } } if (lc->sip_conf.in_call_timeout > 0 && elapsed>lc->sip_conf.in_call_timeout) { @@ -2754,7 +2755,7 @@ void linphone_core_notify_incoming_call(LinphoneCore *lc, LinphoneCall *call){ }else{ /* else play a tone within the context of the current call */ call->ringing_beep=TRUE; - linphone_core_play_tone(lc); + linphone_core_play_named_tone(lc,LinphoneToneCallWaiting); } linphone_call_set_state(call,LinphoneCallIncomingReceived,"Incoming call"); @@ -3305,8 +3306,7 @@ bool_t linphone_core_in_call(const LinphoneCore *lc){ * * @ingroup call_control **/ -LinphoneCall *linphone_core_get_current_call(const LinphoneCore *lc) -{ +LinphoneCall *linphone_core_get_current_call(const LinphoneCore *lc){ return lc->current_call; } @@ -3316,7 +3316,14 @@ LinphoneCall *linphone_core_get_current_call(const LinphoneCore *lc) * * @ingroup call_control **/ -int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call) +int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call){ + int err=_linphone_core_pause_call(lc,call); + if (err==0) call->paused_by_app=TRUE; + return err; +} + +/* Internal version that does not play tone indication*/ +int _linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call) { const char *subject=NULL; @@ -3354,6 +3361,7 @@ int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call) lc->vtable.display_status(lc,_("Pausing the current call...")); if (call->audiostream || call->videostream) linphone_call_stop_media_streams (call); + call->paused_by_app=FALSE; return 0; } @@ -3367,7 +3375,7 @@ int linphone_core_pause_all_calls(LinphoneCore *lc){ LinphoneCall *call=(LinphoneCall *)elem->data; LinphoneCallState cs=linphone_call_get_state(call); if (cs==LinphoneCallStreamsRunning || cs==LinphoneCallPausedByRemote){ - linphone_core_pause_call(lc,call); + _linphone_core_pause_call(lc,call); } } return 0; @@ -3382,7 +3390,11 @@ void linphone_core_preempt_sound_resources(LinphoneCore *lc){ current_call=linphone_core_get_current_call(lc); if(current_call != NULL){ ms_message("Pausing automatically the current call."); - linphone_core_pause_call(lc,current_call); + _linphone_core_pause_call(lc,current_call); + } + if (lc->ringstream){ + ring_stop(lc->ringstream); + lc->ringstream=NULL; } } @@ -4905,13 +4917,54 @@ void linphone_core_play_tone(LinphoneCore *lc){ ms_error("No dtmf generator at this time !"); return; } + memset(&def,0,sizeof(def)); def.duration=300; - def.frequency=500; + def.frequencies[0]=500; def.amplitude=1; def.interval=2000; ms_filter_call_method(f, MS_DTMF_GEN_PLAY_CUSTOM,&def); } +void linphone_core_play_named_tone(LinphoneCore *lc, LinphoneToneID toneid){ + if (linphone_core_tone_indications_enabled(lc)){ + MSFilter *f=get_dtmf_gen(lc); + MSDtmfGenCustomTone def; + if (f==NULL){ + ms_error("No dtmf generator at this time !"); + return; + } + memset(&def,0,sizeof(def)); + def.amplitude=1; + /*these are french tones, excepted the failed one, which is USA congestion tone (does not exist in France)*/ + switch(toneid){ + case LinphoneToneCallOnHold: + case LinphoneToneCallWaiting: + def.duration=300; + def.frequencies[0]=440; + def.interval=2000; + break; + case LinphoneToneBusy: + def.duration=500; + def.frequencies[0]=440; + def.interval=500; + def.repeat_count=3; + break; + case LinphoneToneCallFailed: + def.duration=250; + def.frequencies[0]=480; + def.frequencies[0]=620; + def.interval=250; + def.repeat_count=3; + + break; + default: + ms_warning("Unhandled tone id."); + } + if (def.duration>0) + ms_filter_call_method(f, MS_DTMF_GEN_PLAY_CUSTOM,&def); + } +} + /** * @ingroup media_parameters * diff --git a/coreapi/lpconfig.c b/coreapi/lpconfig.c index 4608beecf..db4e5de5c 100644 --- a/coreapi/lpconfig.c +++ b/coreapi/lpconfig.c @@ -190,6 +190,7 @@ void lp_config_parse(LpConfig *lpconfig, FILE *file){ if (pos2-pos1>=0){ /* found a pair key,value */ + if (cur!=NULL){ LpItem *item=lp_section_find_item(cur,key); if (item==NULL){ @@ -198,7 +199,7 @@ void lp_config_parse(LpConfig *lpconfig, FILE *file){ ms_free(item->value); item->value=strdup(pos1); } - /*printf("Found %s %s={%s}\n",cur->name,key,pos1);*/ + /*ms_message("Found %s=%s",key,pos1);*/ }else{ ms_warning("found key,item but no sections"); } @@ -212,6 +213,7 @@ void lp_config_parse(LpConfig *lpconfig, FILE *file){ LpConfig * lp_config_new(const char *filename){ LpConfig *lpconfig=lp_new0(LpConfig,1); if (filename!=NULL){ + ms_message("Using (r/w) config information from %s", filename); lpconfig->filename=ortp_strdup(filename); lpconfig->file=fopen(filename,"rw"); if (lpconfig->file!=NULL){ @@ -237,6 +239,7 @@ LpConfig * lp_config_new(const char *filename){ int lp_config_read_file(LpConfig *lpconfig, const char *filename){ FILE* f=fopen(filename,"r"); if (f!=NULL){ + ms_message("Reading config information from %s", filename); lp_config_parse(lpconfig,f); fclose(f); return 0; diff --git a/coreapi/misc.c b/coreapi/misc.c index e84c8cce9..d101bb2c4 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -1005,6 +1005,9 @@ unsigned int linphone_core_get_audio_features(LinphoneCore *lc){ return ret; } +bool_t linphone_core_tone_indications_enabled(LinphoneCore*lc){ + return lp_config_get_int(lc->config,"sound","tone_indications",1); +} #ifdef HAVE_GETIFADDRS diff --git a/coreapi/private.h b/coreapi/private.h index 13087dc04..5e265c616 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -211,6 +211,7 @@ struct _LinphoneCall bool_t was_automatically_paused; bool_t ping_replied; bool_t record_active; + bool_t paused_by_app; }; @@ -678,6 +679,8 @@ void ec_calibrator_destroy(EcCalibrator *ecc); void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapsed); void linphone_core_preempt_sound_resources(LinphoneCore *lc); +int _linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call); + /*conferencing subsystem*/ void _post_configure_audio_stream(AudioStream *st, LinphoneCore *lc, bool_t muted); /* When a conference participant pause the conference he may send a music. @@ -718,6 +721,15 @@ void linphone_chat_message_store_state(LinphoneChatMessage *msg); void linphone_core_message_storage_init(LinphoneCore *lc); void linphone_core_message_storage_close(LinphoneCore *lc); +typedef enum _LinphoneToneID{ + LinphoneToneBusy, + LinphoneToneCallWaiting, + LinphoneToneCallOnHold, + LinphoneToneCallFailed +}LinphoneToneID; +void linphone_core_play_named_tone(LinphoneCore *lc, LinphoneToneID id); +bool_t linphone_core_tone_indications_enabled(LinphoneCore*lc); + #ifdef __cplusplus } #endif diff --git a/mediastreamer2 b/mediastreamer2 index 28c3383b5..d1d3e1af5 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 28c3383b5e98196ab394f6616f11c195e6759d28 +Subproject commit d1d3e1af51ab26ecb9808d6f83629e661c67af5f From f6038bf3ef76588a8b71ddfb0e453364b2de89ba Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 15 Mar 2013 10:19:41 +0100 Subject: [PATCH 137/281] Fix bug with the keywordcmp macro. This macro was supposed to be passed a string literal as first argument but was used with a string pointer sometimes. --- coreapi/sal_eXosip2_sdp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/sal_eXosip2_sdp.c b/coreapi/sal_eXosip2_sdp.c index 9297077e6..debd8550f 100644 --- a/coreapi/sal_eXosip2_sdp.c +++ b/coreapi/sal_eXosip2_sdp.c @@ -24,7 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "sal.h" #include -#define keywordcmp(key,b) strncmp(key,b,sizeof(key)) +#define keywordcmp(key,b) strcmp(key,b) #ifdef FOR_LATER From 2566366990a8531763576a222617c35215c32d3f Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 15 Mar 2013 11:28:03 +0100 Subject: [PATCH 138/281] add libiconv patch and document it. --- README.macos | 16 ++++++++++++++++ build/macos/libiconv-macos.patch | 26 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 build/macos/libiconv-macos.patch diff --git a/README.macos b/README.macos index bb78575bf..dd39c2f6e 100644 --- a/README.macos +++ b/README.macos @@ -99,4 +99,20 @@ For a better appearance, you can install the gtk-quartz-engine (a gtk theme) tha Generate a new bundle to have it included. +libiconv hack +************* + +The Makefile.am rules used to generate the bundle fetch a libiconv.2.dylib from a linphone download page. +This library adds some additional symbols so that dependencies requiring the iconv from /usr/lib and the ones requiring from the bundle are both satisfied. +In case this library needs to generated, here are the commands: + $ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz + $ cd libiconv-1.14 + $ patch -p1 < ../linphone/build/macos/libiconv-macos.patch + $ ./configure --prefix=/opt/local --disable-static 'CFLAGS=-arch i386 -arch x86_64 -mmacosx-version-min=10.5' 'LDFLAGS=-arch i386 -arch x86_64 -mmacosx-version-min=10.5' CXXFLAGS="-arch i386 -arch x86_64 -mmacosx-version-min=10.5" && make + $ make install DESTDIR=/tmp + +The resulted library can be found in /tmp/opt/local/lib + + + diff --git a/build/macos/libiconv-macos.patch b/build/macos/libiconv-macos.patch new file mode 100644 index 000000000..e0654843f --- /dev/null +++ b/build/macos/libiconv-macos.patch @@ -0,0 +1,26 @@ +--- libiconv-1.14.orig/lib/iconv.c 2013-03-14 16:30:50.000000000 +0100 ++++ libiconv-1.14/lib/iconv.c 2013-03-15 10:24:38.000000000 +0100 +@@ -607,4 +607,23 @@ + strong_alias (libiconv_close, iconv_close) + #endif + ++#undef iconv_open ++#undef iconv ++#undef iconv_close ++ ++LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode){ ++ return libiconv_open(tocode,fromcode); ++} ++ ++LIBICONV_DLL_EXPORTED size_t iconv (iconv_t icd, ++ ICONV_CONST char* * inbuf, size_t *inbytesleft, ++ char* * outbuf, size_t *outbytesleft){ ++ return libiconv(icd,inbuf,inbytesleft,outbuf,outbytesleft); ++} ++ ++LIBICONV_DLL_EXPORTED int iconv_close (iconv_t icd){ ++ return libiconv_close(icd); ++} ++ ++ + #endif From aefc88365630f314ebaa5409dafa62d88e1a0771 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 15 Mar 2013 14:16:23 +0100 Subject: [PATCH 139/281] Check upnp version --- configure.ac | 7 ++++++- mediastreamer2 | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index ae2d59386..4957eeb58 100644 --- a/configure.ac +++ b/configure.ac @@ -183,7 +183,12 @@ AC_ARG_ENABLE(upnp, ) if test "$build_upnp" != "false" ; then - PKG_CHECK_MODULES([LIBUPNP], [libupnp], [build_upnp=true], + PKG_CHECK_MODULES([LIBUPNP], [libupnp], + [if pkg-config --atleast-version=1.6 "libupnp < 1.7"; then + build_upnp=true + else + AC_MSG_ERROR([libupnp >= 1.6 < 1.5 required.]) + fi], [if test "$build_upnp" == "true" ; then AC_MSG_ERROR([libupnp not found.]) else diff --git a/mediastreamer2 b/mediastreamer2 index d1d3e1af5..f223705f2 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit d1d3e1af51ab26ecb9808d6f83629e661c67af5f +Subproject commit f223705f2853e62f0fb5340b994cd40665b9e854 From f9dcbd6065da2c3e3e658ddef1c3ad581aaff6df Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 15 Mar 2013 14:31:12 +0100 Subject: [PATCH 140/281] Add upnp notice in README --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index 05b0b1dcb..658f07ae0 100644 --- a/README +++ b/README @@ -16,7 +16,7 @@ This is Linphone, a free (GPL) video softphone based on the SIP protocol. - libswscale (part of ffmpeg too) for better scaling performance - theora (optional) + if you want uPnP support: - - libupnp + - libupnp (version 1.6 branch (not patched with 18-url-upnpstrings.patch)) with their corresponding -dev or -devel package if you don't use source packages. From b26e0650d26f31f0345211297e36390981192fac Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 15 Mar 2013 15:52:03 +0100 Subject: [PATCH 141/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index f223705f2..07824fcf3 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit f223705f2853e62f0fb5340b994cd40665b9e854 +Subproject commit 07824fcf3879d265c59beaf970d833b5859f3691 From 2048bac55a33458b4c0a85c9b79f5679045ae252 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 15 Mar 2013 16:02:35 +0100 Subject: [PATCH 142/281] Do not create ICE check list for non-active streams. It may lead to some crashes if a check list exists for a non-active stream. --- coreapi/misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/misc.c b/coreapi/misc.c index d101bb2c4..35a58e200 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -876,7 +876,7 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call, for (i = 0; i < md->n_total_streams; i++) { const SalStreamDescription *stream = &md->streams[i]; IceCheckList *cl = ice_session_check_list(call->ice_session, i); - if (cl == NULL) { + if ((cl == NULL) && (i < md->n_active_streams)) { cl = ice_check_list_new(); ice_session_add_check_list(call->ice_session, cl); switch (stream->type) { From 71f31347fcddaa5f0e9e329a7320efe60bc7c281 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Mon, 18 Mar 2013 15:58:05 +0100 Subject: [PATCH 143/281] Send ZRTP hello hash in SIP SDP. --- coreapi/linphonecall.c | 41 ++++++++++++++++++++++++++++++--------- coreapi/linphonecore.c | 8 +++++++- coreapi/offeranswer.c | 1 + coreapi/sal.h | 3 ++- coreapi/sal_eXosip2_sdp.c | 28 +++++++++++++++++++++++--- mediastreamer2 | 2 +- oRTP | 2 +- 7 files changed, 69 insertions(+), 16 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 6c01c65bd..e9640701f 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -254,6 +254,14 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * l=ms_list_append(l,pt); md->streams[0].payloads=l; + // if ZRTP is enabled, put the hello hash into the audiostream's desc + if (call->audiostream && call->audiostream->ms.zrtp_context!=NULL){ + ortp_zrtp_get_hello_hash(call->audiostream->ms.zrtp_context, + md->streams[0].zrtp_hello_hash, + sizeof(md->streams[0].zrtp_hello_hash)); + ms_message("Audio stream zrtp hash: %s", md->streams[0].zrtp_hello_hash); + } + if (call->params.has_video){ md->n_active_streams++; md->streams[1].rtp_port=call->video_port; @@ -262,6 +270,13 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * md->streams[1].type=SalVideo; l=make_codec_list(lc,lc->codecs_conf.video_codecs,0,NULL,-1); md->streams[1].payloads=l; + // if ZRTP is enabled, put the hello hash into the audiostream's desc + if (call->videostream->ms.zrtp_context!=NULL){ + ortp_zrtp_get_hello_hash(call->videostream->ms.zrtp_context, + md->streams[1].zrtp_hello_hash, + sizeof(md->streams[1].zrtp_hello_hash)); + ms_message("Video stream zrtp hash: %s", md->streams[1].zrtp_hello_hash); + } } if (md->n_total_streams < md->n_active_streams) md->n_total_streams = md->n_active_streams; @@ -1294,6 +1309,20 @@ void linphone_call_init_video_stream(LinphoneCall *call){ void linphone_call_init_media_streams(LinphoneCall *call){ linphone_call_init_audio_stream(call); linphone_call_init_video_stream(call); + + // moved from linphone_call_start_media_streams, because ZRTP needs to be + // at least partially initialized so that the SDP can contain 'zrtp-hash' + if (call->params.media_encryption==LinphoneMediaEncryptionZRTP) { + OrtpZrtpParams params; + /*will be set later when zrtp is activated*/ + call->current_params.media_encryption=LinphoneMediaEncryptionNone; + + params.zid_file=call->core->zrtp_secrets_cache; + audio_stream_enable_zrtp(call->audiostream,¶ms); + } else if (call->params.media_encryption==LinphoneMediaEncryptionSRTP){ + call->current_params.media_encryption=linphone_call_are_all_streams_encrypted(call) ? + LinphoneMediaEncryptionSRTP : LinphoneMediaEncryptionNone; + } } @@ -1736,16 +1765,10 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut call->playing_ringbacktone=send_ringbacktone; call->up_bw=linphone_core_get_upload_bandwidth(lc); + // ZRTP was initialized in linphone_call_init_media_streams with a + // partially iniitalized RtpSession, and now needs to get an update if (call->params.media_encryption==LinphoneMediaEncryptionZRTP) { - OrtpZrtpParams params; - /*will be set later when zrtp is activated*/ - call->current_params.media_encryption=LinphoneMediaEncryptionNone; - - params.zid_file=lc->zrtp_secrets_cache; - audio_stream_enable_zrtp(call->audiostream,¶ms); - }else if (call->params.media_encryption==LinphoneMediaEncryptionSRTP){ - call->current_params.media_encryption=linphone_call_are_all_streams_encrypted(call) ? - LinphoneMediaEncryptionSRTP : LinphoneMediaEncryptionNone; + ortp_zrtp_start_engine(call->audiostream->ms.zrtp_context,call->audiostream->ms.session); } /*also reflect the change if the "wished" params, in order to avoid to propose SAVP or video again diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index a2c910064..431d3e37c 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3125,8 +3125,14 @@ int linphone_core_accept_call_with_params(LinphoneCore *lc, LinphoneCall *call, sal_call_set_local_media_description(call->op,call->localdesc); } - if (call->audiostream==NULL) + if (call->audiostream==NULL){ linphone_call_init_media_streams(call); + // the local media description must be regenerated after the audiostream + // is initialized, otherwise the ZRTP hello hash will not be available + linphone_call_make_local_media_description(lc,call); + sal_call_set_local_media_description(call->op,call->localdesc); + } + if (!was_ringing && call->audiostream->ms.ticker==NULL){ audio_stream_prepare_sound(call->audiostream,lc->sound_conf.play_sndcard,lc->sound_conf.capt_sndcard); } diff --git a/coreapi/offeranswer.c b/coreapi/offeranswer.c index 9823c24a6..eefe34d45 100644 --- a/coreapi/offeranswer.c +++ b/coreapi/offeranswer.c @@ -261,6 +261,7 @@ static void initiate_incoming(const SalStreamDescription *local_cap, result->ice_completed = local_cap->ice_completed; memcpy(result->ice_candidates, local_cap->ice_candidates, sizeof(result->ice_candidates)); memcpy(result->ice_remote_candidates, local_cap->ice_remote_candidates, sizeof(result->ice_remote_candidates)); + memcpy(result->zrtp_hello_hash,local_cap->zrtp_hello_hash, sizeof(result->zrtp_hello_hash)); } /** diff --git a/coreapi/sal.h b/coreapi/sal.h index 25d8d20bc..5f38c15ab 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -140,7 +140,7 @@ typedef struct SalIceRemoteCandidate { } SalIceRemoteCandidate; #define SAL_MEDIA_DESCRIPTION_MAX_ICE_REMOTE_CANDIDATES 2 - +#define SAL_MEDIA_DESCRIPTION_MAX_ZRTP_HELLO_HASH 128 #define SAL_MEDIA_DESCRIPTION_MAX_ICE_UFRAG_LEN 256 #define SAL_MEDIA_DESCRIPTION_MAX_ICE_PWD_LEN 256 @@ -172,6 +172,7 @@ typedef struct SalStreamDescription{ SalIceRemoteCandidate ice_remote_candidates[SAL_MEDIA_DESCRIPTION_MAX_ICE_REMOTE_CANDIDATES]; char ice_ufrag[SAL_MEDIA_DESCRIPTION_MAX_ICE_UFRAG_LEN]; char ice_pwd[SAL_MEDIA_DESCRIPTION_MAX_ICE_PWD_LEN]; + char zrtp_hello_hash[SAL_MEDIA_DESCRIPTION_MAX_ZRTP_HELLO_HASH]; bool_t ice_mismatch; bool_t ice_completed; } SalStreamDescription; diff --git a/coreapi/sal_eXosip2_sdp.c b/coreapi/sal_eXosip2_sdp.c index debd8550f..139446448 100644 --- a/coreapi/sal_eXosip2_sdp.c +++ b/coreapi/sal_eXosip2_sdp.c @@ -108,6 +108,17 @@ static int _sdp_message_get_a_ptime(sdp_message_t *sdp, int mline){ return 0; } +static char * _sdp_message_get_a_zrtp_hash(sdp_message_t *sdp, int mline){ + int i; + sdp_attribute_t *attr; + for (i=0;(attr=sdp_message_attribute_get(sdp,mline,i))!=NULL;i++){ + if (keywordcmp("zrtp-hash",attr->a_att_field)==0){ + return attr->a_att_value; + } + } + return NULL; +} + static int _sdp_message_get_mline_dir(sdp_message_t *sdp, int mline){ int i; sdp_attribute_t *attr; @@ -337,6 +348,11 @@ static void add_line(sdp_message_t *msg, int lineno, const SalStreamDescription int_2char(desc->bandwidth)); if (desc->ptime>0) sdp_message_a_attribute_add(msg,lineno,osip_strdup("ptime"), int_2char(desc->ptime)); + + // if the ZRTP hello hash is available, create an a attribute for it + if (desc->zrtp_hello_hash[0]) + sdp_message_a_attribute_add(msg,lineno,osip_strdup("zrtp-hash"), osip_strdup(desc->zrtp_hello_hash)); + strip_well_known_rtpmaps=ms_list_size(desc->payloads)>5; if (desc->payloads){ for(elem=desc->payloads;elem!=NULL;elem=elem->next){ @@ -433,7 +449,7 @@ static int payload_type_fill_from_rtpmap(PayloadType *pt, const char *rtpmap){ int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){ int i,j; - const char *mtype,*proto,*rtp_port,*rtp_addr,*number; + const char *mtype,*proto,*rtp_port,*rtp_addr,*number,*zrtp_info; const char *sess; sdp_bandwidth_t *sbw=NULL; sdp_attribute_t *attr; @@ -490,7 +506,12 @@ int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){ stream->rtp_port=atoi(rtp_port); if (stream->rtp_port > 0) desc->n_active_streams++; - + + // if the SDP contains a zrtp-hash, add it to the StreamDesc + zrtp_info = _sdp_message_get_a_zrtp_hash(msg, i); + if (zrtp_info != NULL) + strncpy(stream->zrtp_hello_hash, zrtp_info, sizeof(stream->zrtp_hello_hash)); + stream->ptime=_sdp_message_get_a_ptime(msg,i); if (strcasecmp("audio", mtype) == 0){ stream->type=SalAudio; @@ -528,7 +549,8 @@ int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){ for (j = 0; ((attr = sdp_message_attribute_get(msg, i, j)) != NULL); j++) { if ((keywordcmp("rtcp", attr->a_att_field) == 0) && (attr->a_att_value != NULL)) { char tmp[256]; - int nb = sscanf(attr->a_att_value, "%d IN IP4 %s", &stream->rtcp_port, tmp); + // added bounds check + int nb = sscanf(attr->a_att_value, "%d IN IP4 %256s", &stream->rtcp_port, tmp); if (nb == 1) { /* SDP rtcp attribute only contains the port */ } else if (nb == 2) { diff --git a/mediastreamer2 b/mediastreamer2 index 07824fcf3..45c9c6516 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 07824fcf3879d265c59beaf970d833b5859f3691 +Subproject commit 45c9c65168a9912bd2aa97344b396771ff1cdaf0 diff --git a/oRTP b/oRTP index 20b527144..c702c0ea0 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 20b527144f9850dd9065d96db7a20244e8a8b227 +Subproject commit c702c0ea0e66bbe1f27c79690003d9748b01560f From 87de2d8391012ee540e56fae16c9d69ef14d347b Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 19 Mar 2013 12:19:01 +0100 Subject: [PATCH 144/281] fix mis-use of update_call in linphonec. --- console/commands.c | 16 +++++++++------- coreapi/linphonecore.c | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/console/commands.c b/console/commands.c index 22b09a5a6..67b2446f4 100644 --- a/console/commands.c +++ b/console/commands.c @@ -2510,13 +2510,15 @@ static int lpc_cmd_camera(LinphoneCore *lc, char *args){ const LinphoneCallParams *cp=linphone_call_get_current_params (call); if (args){ linphone_call_enable_camera(call,activated); - if ((activated && !linphone_call_params_video_enabled (cp))){ - /*update the call to add the video stream*/ - LinphoneCallParams *ncp=linphone_call_params_copy(cp); - linphone_call_params_enable_video(ncp,TRUE); - linphone_core_update_call(lc,call,ncp); - linphone_call_params_destroy (ncp); - linphonec_out("Trying to bring up video stream...\n"); + if (linphone_call_get_state(call)==LinphoneCallStreamsRunning){ + if ((activated && !linphone_call_params_video_enabled (cp))){ + /*update the call to add the video stream*/ + LinphoneCallParams *ncp=linphone_call_params_copy(cp); + linphone_call_params_enable_video(ncp,TRUE); + linphone_core_update_call(lc,call,ncp); + linphone_call_params_destroy (ncp); + linphonec_out("Trying to bring up video stream...\n"); + } } } if (linphone_call_camera_enabled (call)) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 431d3e37c..93d0b8b80 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -4711,7 +4711,7 @@ int linphone_core_get_device_rotation(LinphoneCore *lc ) { * **/ void linphone_core_set_device_rotation(LinphoneCore *lc, int rotation) { -ms_message("%s : rotation=%d\n", __FUNCTION__, rotation); + ms_message("%s : rotation=%d\n", __FUNCTION__, rotation); lc->device_rotation = rotation; #ifdef VIDEO_ENABLED LinphoneCall *call=linphone_core_get_current_call(lc); From b6b0368a00d888ef0c114e63e5c29a0cdd6c2fb0 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 20 Mar 2013 12:36:12 +0100 Subject: [PATCH 145/281] add number of unread messages --- coreapi/chat.c | 1 + coreapi/linphonecore.h | 3 +- coreapi/message_storage.c | 48 +++++++++++++++++--- gtk/calllogs.c | 18 ++++++++ gtk/chat.c | 47 +++++++++++++++----- gtk/friendlist.c | 93 +++++++++++++++++++++++---------------- gtk/linphone.h | 2 +- 7 files changed, 155 insertions(+), 57 deletions(-) diff --git a/coreapi/chat.c b/coreapi/chat.c index 69893217d..c12bb3398 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -436,6 +436,7 @@ void linphone_chat_message_destroy(LinphoneChatMessage* msg) { if (msg->message) ms_free(msg->message); if (msg->external_body_url) ms_free(msg->external_body_url); if (msg->from) linphone_address_destroy(msg->from); + if (msg->to) linphone_address_destroy(msg->to); if (msg->custom_headers) sal_custom_header_free(msg->custom_headers); ms_free(msg); } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index de8a05afa..ab8836a5d 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -678,6 +678,7 @@ void linphone_chat_room_send_message2(LinphoneChatRoom *cr, LinphoneChatMessage* MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message); void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr); void linphone_chat_room_delete_history(LinphoneChatRoom *cr); +int linphone_chat_room_get_unread_messages_count(LinphoneChatRoom *cr); LinphoneCore* linphone_chat_room_get_lc(LinphoneChatRoom *cr); void linphone_chat_room_set_user_data(LinphoneChatRoom *cr, void * ud); void * linphone_chat_room_get_user_data(LinphoneChatRoom *cr); @@ -685,6 +686,7 @@ void * linphone_chat_room_get_user_data(LinphoneChatRoom *cr); LinphoneChatMessageState linphone_chat_message_get_state(const LinphoneChatMessage* message); const char* linphone_chat_message_state_to_string(const LinphoneChatMessageState state); LinphoneChatMessage* linphone_chat_message_clone(const LinphoneChatMessage* message); +void linphone_chat_message_destroy(LinphoneChatMessage* msg); void linphone_chat_message_set_from(LinphoneChatMessage* message, const LinphoneAddress* from); const LinphoneAddress* linphone_chat_message_get_from(const LinphoneChatMessage* message); const LinphoneAddress* linphone_chat_message_get_to(const LinphoneChatMessage* message); @@ -1430,7 +1432,6 @@ void linphone_core_set_video_dscp(LinphoneCore *lc, int dscp); int linphone_core_get_video_dscp(const LinphoneCore *lc); - #ifdef __cplusplus } #endif diff --git a/coreapi/message_storage.c b/coreapi/message_storage.c index c62fa1ddb..0c41c20d0 100644 --- a/coreapi/message_storage.c +++ b/coreapi/message_storage.c @@ -78,11 +78,12 @@ static int callback(void *data, int argc, char **argv, char **colName){ } void linphone_sql_request_message(sqlite3 *db,const char *stmt,LinphoneChatRoom *cr){ - char* errmsg; + char* errmsg=NULL; int ret; ret=sqlite3_exec(db,stmt,callback,cr,&errmsg); if(ret != SQLITE_OK) { printf("Error in creation: %s.\n", errmsg); + sqlite3_free(errmsg); } } @@ -99,7 +100,7 @@ void linphone_sql_request(sqlite3* db,const char *stmt){ void linphone_chat_message_store(LinphoneChatMessage *msg){ LinphoneCore *lc=linphone_chat_room_get_lc(msg->chat_room); if (lc->db){ - const char *peer=msg->chat_room->peer; + char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(msg->chat_room)); char *local_contact=linphone_address_as_string_uri_only(linphone_chat_message_get_local_address(msg)); char datebuf[26]; char *buf=sqlite3_mprintf("insert into history values(NULL,%Q,%Q,%i,%Q,%Q,%i,%i);", @@ -107,6 +108,7 @@ void linphone_chat_message_store(LinphoneChatMessage *msg){ linphone_sql_request(lc->db,buf); sqlite3_free(buf); ms_free(local_contact); + ms_free(peer); } } @@ -127,19 +129,45 @@ void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr){ if (lc->db==NULL) return ; + char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr)); char *buf=sqlite3_mprintf("update history set read=%i where remoteContact = %Q;", - read,cr->peer); + read,peer); linphone_sql_request(lc->db,buf); sqlite3_free(buf); + ms_free(peer); +} + +int linphone_chat_room_get_unread_messages_count(LinphoneChatRoom *cr){ + LinphoneCore *lc=linphone_chat_room_get_lc(cr); + int numrows=0; + + if (lc->db==NULL) return 0; + + char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr)); + char *buf=sqlite3_mprintf("select count(*) from history where remoteContact = %Q and read = 0;",peer); + sqlite3_stmt *selectStatement; + int returnValue = sqlite3_prepare_v2(lc->db,buf,-1,&selectStatement,NULL); + if (returnValue == SQLITE_OK){ + if(sqlite3_step(selectStatement) == SQLITE_ROW){ + numrows= sqlite3_column_int(selectStatement, 0); + } + } + sqlite3_finalize(selectStatement); + sqlite3_free(buf); + ms_free(peer); + return numrows; } void linphone_chat_room_delete_history(LinphoneChatRoom *cr){ LinphoneCore *lc=cr->lc; if (lc->db==NULL) return ; - char *buf=sqlite3_mprintf("delete from history where remoteContact = %Q;",cr->peer); + + char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr)); + char *buf=sqlite3_mprintf("delete from history where remoteContact = %Q;",peer); linphone_sql_request(lc->db,buf); sqlite3_free(buf); + ms_free(peer); } MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message){ @@ -147,13 +175,14 @@ MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message){ MSList *ret; if (lc->db==NULL) return NULL; - + char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr)); cr->messages_hist = NULL; - char *buf=sqlite3_mprintf("select * from history where remoteContact = %Q order by id DESC limit %i ;",cr->peer,nb_message); + char *buf=sqlite3_mprintf("select * from history where remoteContact = %Q order by id DESC limit %i ;",peer,nb_message); linphone_sql_request_message(lc->db,buf,cr); sqlite3_free(buf); ret=cr->messages_hist; cr->messages_hist=NULL; + ms_free(peer); return ret; } @@ -162,12 +191,13 @@ void linphone_close_storage(sqlite3* db){ } void linphone_create_table(sqlite3* db){ - char* errmsg; + char* errmsg=NULL; int ret; ret=sqlite3_exec(db,"CREATE TABLE if not exists history (id INTEGER PRIMARY KEY AUTOINCREMENT, localContact TEXT NOT NULL, remoteContact TEXT NOT NULL, direction INTEGER, message TEXT, time TEXT NOT NULL, read INTEGER, status INTEGER);", 0,0,&errmsg); if(ret != SQLITE_OK) { printf("Error in creation: %s.\n", errmsg); + sqlite3_free(errmsg); } } @@ -216,4 +246,8 @@ void linphone_core_message_storage_init(LinphoneCore *lc){ void linphone_core_message_storage_close(LinphoneCore *lc){ } +int linphone_chat_room_get_unread_messages_count(LinphoneChatRoom *cr){ + return 0; +} + #endif diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 45a616119..ce4695dd2 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -33,10 +33,25 @@ static void fill_renderers(GtkTreeView *v){ gtk_tree_view_append_column (v,c); } +void call_log_selection_changed(GtkTreeView *v){ + GtkTreeSelection *select; + GtkTreeIter iter; + GtkTreeModel *model; + + select = gtk_tree_view_get_selection(v); + if (gtk_tree_selection_get_selected (select, &model, &iter)){ + GtkTreePath *path=gtk_tree_model_get_path(model,&iter); + gtk_tree_view_collapse_all(v); + gtk_tree_view_expand_row(v,path,TRUE); + gtk_tree_path_free(path); + } +} + void linphone_gtk_call_log_update(GtkWidget *w){ GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view")); GtkTreeStore *store; const MSList *logs; + GtkTreeSelection *select; store=(GtkTreeStore*)gtk_tree_view_get_model(v); if (store==NULL){ @@ -44,6 +59,9 @@ void linphone_gtk_call_log_update(GtkWidget *w){ gtk_tree_view_set_model(v,GTK_TREE_MODEL(store)); g_object_unref(G_OBJECT(store)); fill_renderers(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view"))); + select=gtk_tree_view_get_selection(v); + gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE); + g_signal_connect_swapped(G_OBJECT(select),"changed",(GCallback)call_log_selection_changed,v); // gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")), // create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png"))); } diff --git a/gtk/chat.c b/gtk/chat.c index 6a65cd9fc..7f7e26a56 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -65,7 +65,7 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { g_return_if_fail(w!=NULL); gtk_notebook_remove_page(GTK_NOTEBOOK(nb),idx); - linphone_gtk_create_chat_picture(FALSE); + //linphone_gtk_create_chat_picture(FALSE); g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); g_object_set_data(G_OBJECT(w),"from_message",NULL); g_object_set_data(G_OBJECT(w),"cr",NULL); @@ -265,6 +265,15 @@ void linphone_gtk_send_text(){ } } +static void linphone_gtk_chat_message_destroy(LinphoneChatMessage *msg){ + linphone_chat_message_destroy(msg); +} + +void linphone_gtk_free_list(MSList *messages){ + ms_list_for_each(messages,(void (*)(void*))linphone_gtk_chat_message_destroy); + ms_list_free(messages); +} + void display_history_message(GtkWidget *chat_view,MSList *messages,const LinphoneAddress *with){ if(messages != NULL){ MSList *it; @@ -282,6 +291,7 @@ void display_history_message(GtkWidget *chat_view,MSList *messages,const Linphon g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); ms_free(from_str); ms_free(with_str); + linphone_gtk_free_list(messages); } } @@ -306,7 +316,7 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres colorb.red = 56832; colorb.green = 60928; colorb.blue = 61952; - + with_str=linphone_address_as_string_uri_only(with); linphone_chat_room_mark_as_read(cr); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_WORD_CHAR); @@ -354,12 +364,14 @@ LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with){ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri,GtkWidget *chat_view){ GtkWidget *main_window=linphone_gtk_get_main_window (); LinphoneChatRoom *cr2=(LinphoneChatRoom *)g_object_get_data(G_OBJECT(chat_view),"cr"); - char *from_str=linphone_address_as_string(linphone_chat_room_get_peer_address (cr2)); + const LinphoneAddress *from=linphone_chat_room_get_peer_address(cr2); + char *from_str=linphone_address_as_string_uri_only(from); char *uri_str=linphone_address_as_string(uri); + char *uri_only=linphone_address_as_string_uri_only(uri); MSList *messages=NULL; linphone_chat_room_mark_as_read(cr); - if(g_strcmp0(from_str,uri_str)!=0){ + if(g_strcmp0(from_str,uri_only)!=0){ GtkTextView *text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); GtkTextIter start; GtkTextIter end; @@ -371,7 +383,7 @@ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri, udpate_tab_chat_header(chat_view,uri,cr); g_object_set_data(G_OBJECT(chat_view),"cr",cr); g_object_set_data(G_OBJECT(linphone_gtk_get_widget(main_window,"contact_list")),"chatview",(gpointer)chat_view); - messages = linphone_chat_room_get_history(cr,NB_MSG_HIST); + messages=linphone_chat_room_get_history(cr,NB_MSG_HIST); g_object_set_data(G_OBJECT(chat_view),"from_message",uri_str); display_history_message(chat_view,messages,uri); } @@ -394,15 +406,22 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg){ GtkWidget *main_window=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); - GtkWidget *w; + GtkWidget *w; + gboolean send=TRUE; + char *from=linphone_address_as_string(linphone_chat_message_get_from(msg)); w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); if(w!=NULL){ - linphone_gtk_load_chatroom(room,linphone_chat_message_get_from(msg),w); + char *from_chatview=(char *)g_object_get_data(G_OBJECT(w),"from"); + if(g_strcmp0(from,from_chatview)==0){ + send=TRUE; + } else { + send=FALSE; + } + ms_free(from_chatview); } else { w=linphone_gtk_init_chatroom(room,linphone_chat_message_get_from(msg)); g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); - char *from=linphone_address_as_string(linphone_chat_message_get_from(msg)); g_object_set_data(G_OBJECT(friendlist),"from",from); } get_display_name(linphone_chat_message_get_from(msg)); @@ -419,9 +438,17 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, } } #endif - linphone_gtk_push_text(w,linphone_chat_message_get_from(msg), + if(send){ + linphone_gtk_push_text(w,linphone_chat_message_get_from(msg), FALSE,room,msg,FALSE); - linphone_gtk_update_chat_picture(); + } else { + linphone_gtk_show_friends(); + //linphone_gtk_friend_list_update_message(msg); + } + ms_free(from); + //linphone_gtk_update_chat_picture(); + //TODO: update la zone de notification dans les contacts (problème : lors du refresh de la liste + //connaitre tous les contacts qui ont des messages non lus ... //gtk_window_present(GTK_WINDOW(w)); /*gtk_window_set_urgency_hint(GTK_WINDOW(w),TRUE);*/ } diff --git a/gtk/friendlist.c b/gtk/friendlist.c index be6a4c3ce..e1012f7cd 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -32,7 +32,7 @@ enum{ FRIEND_ICON, FRIEND_CALL, FRIEND_CHAT, - FRIEND_CHAT_CONVERSATION, + FRIEND_NB_UNREAD_MSG, FRIEND_LIST_NCOL }; @@ -253,9 +253,11 @@ void linphone_gtk_chat_selected(GtkWidget *item){ GtkNotebook *notebook=(GtkNotebook *)linphone_gtk_get_widget(w,"viewswitch"); const LinphoneAddress *uri; gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); + gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); uri=linphone_friend_get_address(lf); - if(cr == NULL){ + if(cr==NULL){ cr=linphone_gtk_create_chatroom(uri); + gtk_list_store_set(store,&iter,FRIEND_CHATROOM,cr,-1); } page=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); g_object_set_data(G_OBJECT(friendlist),"from",linphone_address_as_string(uri)); @@ -269,6 +271,7 @@ void linphone_gtk_chat_selected(GtkWidget *item){ linphone_gtk_create_chat_picture(FALSE); g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(page,"text_entry")); gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); + gtk_list_store_set(store,&iter,FRIEND_NB_UNREAD_MSG,"",-1); } } @@ -541,7 +544,8 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ linphone_gtk_init_bookmark_icon(); store = gtk_list_store_new(FRIEND_LIST_NCOL,GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, - G_TYPE_POINTER, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, G_TYPE_STRING); + G_TYPE_POINTER, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, + G_TYPE_STRING, G_TYPE_STRING); gtk_tree_view_set_model(GTK_TREE_VIEW(friendlist),GTK_TREE_MODEL(store)); g_object_unref(G_OBJECT(store)); @@ -579,9 +583,13 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ gtk_tree_view_column_set_clickable(column,TRUE); gtk_tree_view_column_set_expand(column,TRUE); gtk_tree_view_column_set_max_width(column,60); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start(column,renderer,TRUE); + gtk_tree_view_column_add_attribute (column,renderer,"text",FRIEND_NB_UNREAD_MSG); + gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); - /* Call column*/ renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes (_("Call"),renderer,"pixbuf",FRIEND_CALL,NULL); @@ -669,6 +677,7 @@ void linphone_gtk_show_friends(void){ //const gchar *search=NULL; //gboolean lookup=FALSE; MSList *sorted; + LinphoneChatRoom *cr=NULL; linphone_gtk_show_directory_search(); @@ -693,6 +702,9 @@ void linphone_gtk_show_friends(void){ const char *name=linphone_address_get_display_name(f_uri); const char *display=name; char *escaped=NULL; + char buf[26]={0}; + int nbmsg=0; + /*if (lookup){ if (strstr(uri,search)==NULL){ ms_free(uri); @@ -709,9 +721,25 @@ void linphone_gtk_show_friends(void){ FRIEND_PRESENCE_IMG, send_subscribe ? create_status_picture(linphone_friend_get_status(lf)) : NULL, -1); + gtk_tree_model_get(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)),&iter,FRIEND_CHATROOM,&cr,-1); + if(cr!=NULL){ + nbmsg=linphone_chat_room_get_unread_messages_count(cr); + if(nbmsg != 0){ + sprintf(buf,"%i",nbmsg); + } + } else { + cr=linphone_gtk_create_chatroom(f_uri); + gtk_list_store_set(store,&iter,FRIEND_CHATROOM,cr,-1); + nbmsg=linphone_chat_room_get_unread_messages_count(cr); + if(nbmsg != 0){ + sprintf(buf,"%i",nbmsg); + } + + } + gtk_list_store_set(store,&iter,FRIEND_CALL,create_call_picture(),-1); gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); - + gtk_list_store_set(store,&iter,FRIEND_NB_UNREAD_MSG,buf,-1); escaped=g_markup_escape_text(uri,-1); gtk_list_store_set(store,&iter,FRIEND_SIP_ADDRESS,escaped,-1); g_free(escaped); @@ -912,52 +940,41 @@ gboolean linphone_gtk_popup_contact_menu(GtkWidget *list, GdkEventButton *event) } gint get_col_number_from_tree_view_column (GtkTreeViewColumn *col){ - GList *cols; - gint num; - g_return_val_if_fail ( col != NULL, -1 ); - g_return_val_if_fail ( col->tree_view != NULL, -1 ); - cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(col->tree_view)); - num = g_list_index(cols, (gpointer) col); - g_list_free(cols); + GList *cols; + gint num; + g_return_val_if_fail ( col != NULL, -1 ); + g_return_val_if_fail ( col->tree_view != NULL, -1 ); + cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(col->tree_view)); + num = g_list_index(cols, (gpointer) col); + g_list_free(cols); - return num; -} - -int longueur_list (GtkTreeView *tree_view){ - GtkTreeIter iter; - int i=0; - GtkTreeModel *model=gtk_tree_view_get_model(tree_view); - if (gtk_tree_model_get_iter_first(model,&iter)) { - do{ - i++; - }while(gtk_tree_model_iter_next(model,&iter)); - } - return i; + return num; } static gint tree_view_get_cell_from_pos(GtkTreeView *view, guint x, guint y){ GtkTreeViewColumn *col = NULL; GList *node, *columns; gint colx = 0; - gint coly = longueur_list(view); - gint height=0; + GtkTreePath *path; + GtkTreeViewDropPosition pos; g_return_val_if_fail ( view != NULL, 0 ); columns = gtk_tree_view_get_columns(view); - for (node = columns; node != NULL && col == NULL; node = node->next){ - GtkTreeViewColumn *checkcol = (GtkTreeViewColumn*) node->data; - gtk_tree_view_column_cell_get_size(checkcol,NULL,NULL,NULL,NULL,&height); - if (x >= colx && x < (colx + checkcol->width) && y < (height+2)*coly){ - col = checkcol; - gint num = get_col_number_from_tree_view_column(col); + gtk_tree_view_get_dest_row_at_pos(view,x,y,&path,&pos); + if(path != NULL){ + for (node = columns; node != NULL && col == NULL; node = node->next){ + GtkTreeViewColumn *checkcol = (GtkTreeViewColumn*) node->data; + if (x >= colx && x < (colx + checkcol->width)){ + col = checkcol; + gint num = get_col_number_from_tree_view_column(col); return num; - } - else { - colx += checkcol->width; + } else { + colx += checkcol->width; } - } - g_list_free(columns); + } + } + g_list_free(columns); return 0; } diff --git a/gtk/linphone.h b/gtk/linphone.h index aaa021a28..a7d7da506 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -152,4 +152,4 @@ void linphone_gtk_monitor_usb(void); void linphone_gtk_unmonitor_usb(void); gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference); - +void linphone_gtk_friend_list_update_message(LinphoneChatMessage *msg); From c5c826d8f46c7e9aa5655aef7a353d7e1a528ffa Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 20 Mar 2013 12:36:13 +0100 Subject: [PATCH 146/281] fix exosip dscp api detection --- configure.ac | 14 -------------- m4/exosip.m4 | 13 +++++++++++++ mediastreamer2 | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/configure.ac b/configure.ac index 4957eeb58..7bc526bbb 100644 --- a/configure.ac +++ b/configure.ac @@ -444,19 +444,6 @@ fi dnl setup flags for exosip library LP_SETUP_EXOSIP -dnl check exosip support of DSCP in exosip -AC_MSG_CHECKING([for DSCP support in exosip]) -AC_TRY_COMPILE([#include ], - [int dscp=0;eXosip_set_option(EXOSIP_OPT_SET_DSCP,&dscp);], - has_exosip_dscp=yes, - has_exosip_dscp=no -) -AC_MSG_RESULT($has_exosip_dscp) -if test "$has_exosip_dscp" = "yes" ; then - AC_DEFINE( HAVE_EXOSIP_DSCP, 1, [Define if exosip dscp available] ) -fi - - if test "$console_ui" = "true" ; then dnl check gnu readline LP_CHECK_READLINE @@ -684,7 +671,6 @@ AC_ARG_ENABLE(msg-storage, [enable_msg_storage=auto] ) -echo "enable_msg_storage = $enable_msg_storage" AM_CONDITIONAL(BUILD_MSG_STORAGE, test x$enable_msg_storage = xtrue) if test x$enable_msg_storage != xfalse; then diff --git a/m4/exosip.m4 b/m4/exosip.m4 index 31769e00d..e7c72647d 100644 --- a/m4/exosip.m4 +++ b/m4/exosip.m4 @@ -20,6 +20,19 @@ EXOSIP_LIBS="$OSIP_LIBS -leXosip2 " CPPFLAGS_save=$CPPFLAGS CPPFLAGS="$OSIP_CFLAGS $CPPFLAGS" AC_CHECK_HEADER([eXosip2/eXosip.h], ,AC_MSG_ERROR([Could not find eXosip2 headers !])) + +dnl check exosip support of DSCP in exosip +AC_MSG_CHECKING([for DSCP support in exosip]) +AC_TRY_COMPILE([#include ], + [int dscp=0;eXosip_set_option(EXOSIP_OPT_SET_DSCP,&dscp);], + has_exosip_dscp=yes, + has_exosip_dscp=no +) +AC_MSG_RESULT($has_exosip_dscp) +if test "$has_exosip_dscp" = "yes" ; then + AC_DEFINE( HAVE_EXOSIP_DSCP, 1, [Define if exosip dscp available] ) +fi + CPPFLAGS=$CPPFLAGS_save diff --git a/mediastreamer2 b/mediastreamer2 index 45c9c6516..430cc1376 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 45c9c65168a9912bd2aa97344b396771ff1cdaf0 +Subproject commit 430cc1376d68b1a8d82799357abea9e3e1c536f8 From de40178c0229fc0fbbeb2643fbb0bd2271c4c12f Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 20 Mar 2013 12:48:02 +0100 Subject: [PATCH 147/281] fix dispaly unread messages --- gtk/chat.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index 7f7e26a56..38efc1011 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -412,13 +412,12 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, char *from=linphone_address_as_string(linphone_chat_message_get_from(msg)); w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); if(w!=NULL){ - char *from_chatview=(char *)g_object_get_data(G_OBJECT(w),"from"); + char *from_chatview=(char *)g_object_get_data(G_OBJECT(friendlist),"from"); if(g_strcmp0(from,from_chatview)==0){ send=TRUE; } else { send=FALSE; - } - ms_free(from_chatview); + } } else { w=linphone_gtk_init_chatroom(room,linphone_chat_message_get_from(msg)); g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); @@ -445,7 +444,6 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, linphone_gtk_show_friends(); //linphone_gtk_friend_list_update_message(msg); } - ms_free(from); //linphone_gtk_update_chat_picture(); //TODO: update la zone de notification dans les contacts (problème : lors du refresh de la liste //connaitre tous les contacts qui ont des messages non lus ... From ba3a2f0549a9d6d5369d9379c9492df9f292754d Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 20 Mar 2013 14:57:03 +0100 Subject: [PATCH 148/281] fix received messages in chat --- gtk/chat.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index 38efc1011..69c4e832f 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -65,7 +65,7 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { g_return_if_fail(w!=NULL); gtk_notebook_remove_page(GTK_NOTEBOOK(nb),idx); - //linphone_gtk_create_chat_picture(FALSE); + linphone_gtk_create_chat_picture(FALSE); g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); g_object_set_data(G_OBJECT(w),"from_message",NULL); g_object_set_data(G_OBJECT(w),"cr",NULL); @@ -419,6 +419,7 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, send=FALSE; } } else { + send=FALSE; w=linphone_gtk_init_chatroom(room,linphone_chat_message_get_from(msg)); g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); g_object_set_data(G_OBJECT(friendlist),"from",from); @@ -438,6 +439,7 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, } #endif if(send){ + linphone_chat_room_mark_as_read(room); linphone_gtk_push_text(w,linphone_chat_message_get_from(msg), FALSE,room,msg,FALSE); } else { @@ -445,8 +447,6 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, //linphone_gtk_friend_list_update_message(msg); } //linphone_gtk_update_chat_picture(); - //TODO: update la zone de notification dans les contacts (problème : lors du refresh de la liste - //connaitre tous les contacts qui ont des messages non lus ... //gtk_window_present(GTK_WINDOW(w)); /*gtk_window_set_urgency_hint(GTK_WINDOW(w),TRUE);*/ } From dbc944a5f44bbfc7e7a4dd0aaed5e30e45cacaa2 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 20 Mar 2013 15:48:48 +0100 Subject: [PATCH 149/281] Do not define a variable in the middle of a block of code. --- coreapi/linphonecore.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 93d0b8b80..542241262 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2117,8 +2117,9 @@ void linphone_core_iterate(LinphoneCore *lc){ if (call->state==LinphoneCallIncomingReceived){ ms_message("incoming call ringing for %i seconds",elapsed); if (elapsed>lc->sip_conf.inc_timeout){ + LinphoneReason decline_reason; ms_message("incoming call timeout (%i)",lc->sip_conf.inc_timeout); - LinphoneReason decline_reason=lc->current_call ? LinphoneReasonBusy : LinphoneReasonDeclined; + decline_reason=lc->current_call ? LinphoneReasonBusy : LinphoneReasonDeclined; call->log->status=LinphoneCallMissed; call->reason=LinphoneReasonNotAnswered; linphone_core_decline_call(lc,call,decline_reason); From c113bd8c332d7473493f17c27d7cba0817a82592 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 21 Mar 2013 11:13:42 +0100 Subject: [PATCH 150/281] fix crash related to zrtp hello hash when adding video --- coreapi/linphonecall.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index e9640701f..2770d4ada 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -271,7 +271,7 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * l=make_codec_list(lc,lc->codecs_conf.video_codecs,0,NULL,-1); md->streams[1].payloads=l; // if ZRTP is enabled, put the hello hash into the audiostream's desc - if (call->videostream->ms.zrtp_context!=NULL){ + if (call->videostream && call->videostream->ms.zrtp_context!=NULL){ ortp_zrtp_get_hello_hash(call->videostream->ms.zrtp_context, md->streams[1].zrtp_hello_hash, sizeof(md->streams[1].zrtp_hello_hash)); From 1521d1f7f05f2e764ca936685878c65658dacdbd Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 22 Mar 2013 10:56:44 +0100 Subject: [PATCH 151/281] change the way local interface is searched. --- coreapi/misc.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/coreapi/misc.c b/coreapi/misc.c index 35a58e200..158ab0add 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -1110,7 +1110,18 @@ 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 err; strcpy(result,type==AF_INET ? "127.0.0.1" : "::1"); + + if (type==AF_INET) + dest="87.98.157.38"; /*a public IP address*/ + else dest="2a00:1450:8002::68"; + err=get_local_ip_for_with_connect(type,dest,result); + if (err==0) return 0; + + /* if the connect method failed, which happens when no default route is set, + * try to find 'the' running interface with getifaddrs*/ + #ifdef HAVE_GETIFADDRS if (dest==NULL) { /*we use getifaddrs for lookup of default interface */ @@ -1125,11 +1136,7 @@ int linphone_core_get_local_ip_for(int type, const char *dest, char *result){ } } #endif - /*else use connect to find the best local ip address */ - if (type==AF_INET) - dest="87.98.157.38"; /*a public IP address*/ - else dest="2a00:1450:8002::68"; - return get_local_ip_for_with_connect(type,dest,result); + return 0; } #ifndef WIN32 From 76e61b810d069db36232ede60cf507327b231fba Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 22 Mar 2013 10:58:25 +0100 Subject: [PATCH 152/281] fix previous commit. --- coreapi/misc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/coreapi/misc.c b/coreapi/misc.c index 158ab0add..738766746 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -1113,9 +1113,11 @@ int linphone_core_get_local_ip_for(int type, const char *dest, char *result){ int err; strcpy(result,type==AF_INET ? "127.0.0.1" : "::1"); - if (type==AF_INET) - dest="87.98.157.38"; /*a public IP address*/ - else dest="2a00:1450:8002::68"; + if (dest==NULL){ + if (type==AF_INET) + dest="87.98.157.38"; /*a public IP address*/ + else dest="2a00:1450:8002::68"; + } err=get_local_ip_for_with_connect(type,dest,result); if (err==0) return 0; From 654662128fc0d9214c4a52f9242fb7973422c338 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 22 Mar 2013 11:00:23 +0100 Subject: [PATCH 153/281] fix again --- coreapi/misc.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/coreapi/misc.c b/coreapi/misc.c index 738766746..26cdbe224 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -1125,18 +1125,17 @@ int linphone_core_get_local_ip_for(int type, const char *dest, char *result){ * try to find 'the' running interface with getifaddrs*/ #ifdef HAVE_GETIFADDRS - if (dest==NULL) { - /*we use getifaddrs for lookup of default interface */ - int found_ifs; - found_ifs=get_local_ip_with_getifaddrs(type,result,LINPHONE_IPADDR_SIZE); - if (found_ifs==1){ - return 0; - }else if (found_ifs<=0){ - /*absolutely no network on this machine */ - return -1; - } - } + /*we use getifaddrs for lookup of default interface */ + int found_ifs; + + found_ifs=get_local_ip_with_getifaddrs(type,result,LINPHONE_IPADDR_SIZE); + if (found_ifs==1){ + return 0; + }else if (found_ifs<=0){ + /*absolutely no network on this machine */ + return -1; + } #endif return 0; } From 132c497affbc47a3b657b4f76bde161cf3514895 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 22 Mar 2013 12:05:48 +0100 Subject: [PATCH 154/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 430cc1376..dc277cd95 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 430cc1376d68b1a8d82799357abea9e3e1c536f8 +Subproject commit dc277cd95ec334066948c91dd9bf024c1ff1d933 From 824c0e89f2c34298c6c6e749e9dcfbff4265a73f Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 22 Mar 2013 16:34:09 +0100 Subject: [PATCH 155/281] Revert "Send ZRTP hello hash in SIP SDP." This reverts commit 71f31347fcddaa5f0e9e329a7320efe60bc7c281. Conflicts: coreapi/linphonecall.c mediastreamer2 --- coreapi/linphonecall.c | 41 +++++++++------------------------------ coreapi/linphonecore.c | 8 +------- coreapi/offeranswer.c | 1 - coreapi/sal.h | 3 +-- coreapi/sal_eXosip2_sdp.c | 28 +++----------------------- oRTP | 2 +- 6 files changed, 15 insertions(+), 68 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 2770d4ada..6c01c65bd 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -254,14 +254,6 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * l=ms_list_append(l,pt); md->streams[0].payloads=l; - // if ZRTP is enabled, put the hello hash into the audiostream's desc - if (call->audiostream && call->audiostream->ms.zrtp_context!=NULL){ - ortp_zrtp_get_hello_hash(call->audiostream->ms.zrtp_context, - md->streams[0].zrtp_hello_hash, - sizeof(md->streams[0].zrtp_hello_hash)); - ms_message("Audio stream zrtp hash: %s", md->streams[0].zrtp_hello_hash); - } - if (call->params.has_video){ md->n_active_streams++; md->streams[1].rtp_port=call->video_port; @@ -270,13 +262,6 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * md->streams[1].type=SalVideo; l=make_codec_list(lc,lc->codecs_conf.video_codecs,0,NULL,-1); md->streams[1].payloads=l; - // if ZRTP is enabled, put the hello hash into the audiostream's desc - if (call->videostream && call->videostream->ms.zrtp_context!=NULL){ - ortp_zrtp_get_hello_hash(call->videostream->ms.zrtp_context, - md->streams[1].zrtp_hello_hash, - sizeof(md->streams[1].zrtp_hello_hash)); - ms_message("Video stream zrtp hash: %s", md->streams[1].zrtp_hello_hash); - } } if (md->n_total_streams < md->n_active_streams) md->n_total_streams = md->n_active_streams; @@ -1309,20 +1294,6 @@ void linphone_call_init_video_stream(LinphoneCall *call){ void linphone_call_init_media_streams(LinphoneCall *call){ linphone_call_init_audio_stream(call); linphone_call_init_video_stream(call); - - // moved from linphone_call_start_media_streams, because ZRTP needs to be - // at least partially initialized so that the SDP can contain 'zrtp-hash' - if (call->params.media_encryption==LinphoneMediaEncryptionZRTP) { - OrtpZrtpParams params; - /*will be set later when zrtp is activated*/ - call->current_params.media_encryption=LinphoneMediaEncryptionNone; - - params.zid_file=call->core->zrtp_secrets_cache; - audio_stream_enable_zrtp(call->audiostream,¶ms); - } else if (call->params.media_encryption==LinphoneMediaEncryptionSRTP){ - call->current_params.media_encryption=linphone_call_are_all_streams_encrypted(call) ? - LinphoneMediaEncryptionSRTP : LinphoneMediaEncryptionNone; - } } @@ -1765,10 +1736,16 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut call->playing_ringbacktone=send_ringbacktone; call->up_bw=linphone_core_get_upload_bandwidth(lc); - // ZRTP was initialized in linphone_call_init_media_streams with a - // partially iniitalized RtpSession, and now needs to get an update if (call->params.media_encryption==LinphoneMediaEncryptionZRTP) { - ortp_zrtp_start_engine(call->audiostream->ms.zrtp_context,call->audiostream->ms.session); + OrtpZrtpParams params; + /*will be set later when zrtp is activated*/ + call->current_params.media_encryption=LinphoneMediaEncryptionNone; + + params.zid_file=lc->zrtp_secrets_cache; + audio_stream_enable_zrtp(call->audiostream,¶ms); + }else if (call->params.media_encryption==LinphoneMediaEncryptionSRTP){ + call->current_params.media_encryption=linphone_call_are_all_streams_encrypted(call) ? + LinphoneMediaEncryptionSRTP : LinphoneMediaEncryptionNone; } /*also reflect the change if the "wished" params, in order to avoid to propose SAVP or video again diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 542241262..0089dd0fb 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3126,14 +3126,8 @@ int linphone_core_accept_call_with_params(LinphoneCore *lc, LinphoneCall *call, sal_call_set_local_media_description(call->op,call->localdesc); } - if (call->audiostream==NULL){ + if (call->audiostream==NULL) linphone_call_init_media_streams(call); - // the local media description must be regenerated after the audiostream - // is initialized, otherwise the ZRTP hello hash will not be available - linphone_call_make_local_media_description(lc,call); - sal_call_set_local_media_description(call->op,call->localdesc); - } - if (!was_ringing && call->audiostream->ms.ticker==NULL){ audio_stream_prepare_sound(call->audiostream,lc->sound_conf.play_sndcard,lc->sound_conf.capt_sndcard); } diff --git a/coreapi/offeranswer.c b/coreapi/offeranswer.c index eefe34d45..9823c24a6 100644 --- a/coreapi/offeranswer.c +++ b/coreapi/offeranswer.c @@ -261,7 +261,6 @@ static void initiate_incoming(const SalStreamDescription *local_cap, result->ice_completed = local_cap->ice_completed; memcpy(result->ice_candidates, local_cap->ice_candidates, sizeof(result->ice_candidates)); memcpy(result->ice_remote_candidates, local_cap->ice_remote_candidates, sizeof(result->ice_remote_candidates)); - memcpy(result->zrtp_hello_hash,local_cap->zrtp_hello_hash, sizeof(result->zrtp_hello_hash)); } /** diff --git a/coreapi/sal.h b/coreapi/sal.h index 5f38c15ab..25d8d20bc 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -140,7 +140,7 @@ typedef struct SalIceRemoteCandidate { } SalIceRemoteCandidate; #define SAL_MEDIA_DESCRIPTION_MAX_ICE_REMOTE_CANDIDATES 2 -#define SAL_MEDIA_DESCRIPTION_MAX_ZRTP_HELLO_HASH 128 + #define SAL_MEDIA_DESCRIPTION_MAX_ICE_UFRAG_LEN 256 #define SAL_MEDIA_DESCRIPTION_MAX_ICE_PWD_LEN 256 @@ -172,7 +172,6 @@ typedef struct SalStreamDescription{ SalIceRemoteCandidate ice_remote_candidates[SAL_MEDIA_DESCRIPTION_MAX_ICE_REMOTE_CANDIDATES]; char ice_ufrag[SAL_MEDIA_DESCRIPTION_MAX_ICE_UFRAG_LEN]; char ice_pwd[SAL_MEDIA_DESCRIPTION_MAX_ICE_PWD_LEN]; - char zrtp_hello_hash[SAL_MEDIA_DESCRIPTION_MAX_ZRTP_HELLO_HASH]; bool_t ice_mismatch; bool_t ice_completed; } SalStreamDescription; diff --git a/coreapi/sal_eXosip2_sdp.c b/coreapi/sal_eXosip2_sdp.c index 139446448..debd8550f 100644 --- a/coreapi/sal_eXosip2_sdp.c +++ b/coreapi/sal_eXosip2_sdp.c @@ -108,17 +108,6 @@ static int _sdp_message_get_a_ptime(sdp_message_t *sdp, int mline){ return 0; } -static char * _sdp_message_get_a_zrtp_hash(sdp_message_t *sdp, int mline){ - int i; - sdp_attribute_t *attr; - for (i=0;(attr=sdp_message_attribute_get(sdp,mline,i))!=NULL;i++){ - if (keywordcmp("zrtp-hash",attr->a_att_field)==0){ - return attr->a_att_value; - } - } - return NULL; -} - static int _sdp_message_get_mline_dir(sdp_message_t *sdp, int mline){ int i; sdp_attribute_t *attr; @@ -348,11 +337,6 @@ static void add_line(sdp_message_t *msg, int lineno, const SalStreamDescription int_2char(desc->bandwidth)); if (desc->ptime>0) sdp_message_a_attribute_add(msg,lineno,osip_strdup("ptime"), int_2char(desc->ptime)); - - // if the ZRTP hello hash is available, create an a attribute for it - if (desc->zrtp_hello_hash[0]) - sdp_message_a_attribute_add(msg,lineno,osip_strdup("zrtp-hash"), osip_strdup(desc->zrtp_hello_hash)); - strip_well_known_rtpmaps=ms_list_size(desc->payloads)>5; if (desc->payloads){ for(elem=desc->payloads;elem!=NULL;elem=elem->next){ @@ -449,7 +433,7 @@ static int payload_type_fill_from_rtpmap(PayloadType *pt, const char *rtpmap){ int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){ int i,j; - const char *mtype,*proto,*rtp_port,*rtp_addr,*number,*zrtp_info; + const char *mtype,*proto,*rtp_port,*rtp_addr,*number; const char *sess; sdp_bandwidth_t *sbw=NULL; sdp_attribute_t *attr; @@ -506,12 +490,7 @@ int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){ stream->rtp_port=atoi(rtp_port); if (stream->rtp_port > 0) desc->n_active_streams++; - - // if the SDP contains a zrtp-hash, add it to the StreamDesc - zrtp_info = _sdp_message_get_a_zrtp_hash(msg, i); - if (zrtp_info != NULL) - strncpy(stream->zrtp_hello_hash, zrtp_info, sizeof(stream->zrtp_hello_hash)); - + stream->ptime=_sdp_message_get_a_ptime(msg,i); if (strcasecmp("audio", mtype) == 0){ stream->type=SalAudio; @@ -549,8 +528,7 @@ int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){ for (j = 0; ((attr = sdp_message_attribute_get(msg, i, j)) != NULL); j++) { if ((keywordcmp("rtcp", attr->a_att_field) == 0) && (attr->a_att_value != NULL)) { char tmp[256]; - // added bounds check - int nb = sscanf(attr->a_att_value, "%d IN IP4 %256s", &stream->rtcp_port, tmp); + int nb = sscanf(attr->a_att_value, "%d IN IP4 %s", &stream->rtcp_port, tmp); if (nb == 1) { /* SDP rtcp attribute only contains the port */ } else if (nb == 2) { diff --git a/oRTP b/oRTP index c702c0ea0..dbb75fb00 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit c702c0ea0e66bbe1f27c79690003d9748b01560f +Subproject commit dbb75fb00c65ce0102385f235c1da2873e9f6c2e From 24e3c9258e240c425b7949571ea0793d0ba0312a Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 22 Mar 2013 22:54:27 +0100 Subject: [PATCH 156/281] update mediastreamer2 and oRTP for bugfix regarding adaptive rate control in audio only. The rate control algorithm had a bug preventing him to enhance the quality was the network returns fine, and even worse it was setting the worse quality for the rest of the call. --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index dc277cd95..246292160 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit dc277cd95ec334066948c91dd9bf024c1ff1d933 +Subproject commit 2462921605f587a51f82bd439b85fea5bd759b0b diff --git a/oRTP b/oRTP index dbb75fb00..31d242e8c 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit dbb75fb00c65ce0102385f235c1da2873e9f6c2e +Subproject commit 31d242e8c544ed197f60630593515aef2fb580e9 From 222723656a3cd6538409252e0f6b35ae3ca4bf76 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 25 Mar 2013 09:57:30 +0100 Subject: [PATCH 157/281] Updated factory to use new package for CpuUtils (org.linphone.mediastream) --- java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java index 7b21ecaae..0b799f33e 100644 --- a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java @@ -21,7 +21,7 @@ package org.linphone.core; import java.io.File; import java.io.IOException; -import org.linphone.CpuUtils; +import org.linphone.mediastream.CpuUtils; import org.linphone.mediastream.Version; import android.util.Log; From 54f5ba2cda9b15e8d43cd801a51e10b7771ec303 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 25 Mar 2013 11:32:32 +0100 Subject: [PATCH 158/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 246292160..4b8d2b655 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 2462921605f587a51f82bd439b85fea5bd759b0b +Subproject commit 4b8d2b655acc8a329464e7806653dceb04ade445 From 1ba82ad289fccf07297d5411c483f332e639f281 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 26 Mar 2013 09:13:46 +0100 Subject: [PATCH 159/281] fix compilation issue with upnp --- coreapi/upnp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 2dfd7f39c..75d0ef9e2 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -338,7 +338,7 @@ UpnpContext* linphone_upnp_context_new(LinphoneCore *lc) { linphone_core_add_iterate_hook(lc, linphone_core_upnp_hook, lupnp); lupnp->upnp_igd_ctxt = NULL; - lupnp->upnp_igd_ctxt = upnp_igd_create(linphone_upnp_igd_callback, linphone_upnp_igd_print, lupnp); + lupnp->upnp_igd_ctxt = upnp_igd_create(linphone_upnp_igd_callback, linphone_upnp_igd_print, NULL, lupnp); if(lupnp->upnp_igd_ctxt == NULL) { lupnp->state = LinphoneUpnpStateKo; ms_error("Can't create uPnP IGD context"); From 1782284ee3e91b80470b089f6915cd343d06743b Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 21 Mar 2013 11:49:26 +0100 Subject: [PATCH 160/281] patch for gtk --- gtk/main.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/gtk/main.c b/gtk/main.c index c6065241c..ae6c8a010 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -63,12 +63,15 @@ static void linphone_gtk_call_log_updated(LinphoneCore *lc, LinphoneCallLog *cl) static void linphone_gtk_call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cs, const char *msg); static void linphone_gtk_call_encryption_changed(LinphoneCore *lc, LinphoneCall *call, bool_t enabled, const char *token); static void linphone_gtk_transfer_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate); +void linphone_gtk_save_main_window_position(GtkWindow* mw, GdkEvent *event, gpointer data); static gboolean linphone_gtk_auto_answer(LinphoneCall *call); void linphone_gtk_status_icon_set_blinking(gboolean val); void _linphone_gtk_enable_video(gboolean val); +static gint main_window_x=0; +static gint main_window_y=0; static gboolean verbose=0; static gboolean auto_answer = 0; static gchar * addr_to_call = NULL; @@ -1371,11 +1374,20 @@ static GtkWidget *create_icon_menu(){ return menu; } +void linphone_gtk_save_main_window_position(GtkWindow* mw, GdkEvent *event, gpointer data){ + gtk_window_get_position(GTK_WINDOW(mw), &main_window_x, &main_window_y); +} + static void handle_icon_click() { GtkWidget *mw=linphone_gtk_get_main_window(); if (!gtk_window_is_active((GtkWindow*)mw)) { + if(!gtk_widget_is_drawable(mw)){ + //we only move if window was hidden. If it was simply behind the window stack, ie, drawable, we keep it as it was + gtk_window_move (GTK_WINDOW(mw), main_window_x, main_window_y); + } linphone_gtk_show_main_window(); } else { + linphone_gtk_save_main_window_position((GtkWindow*)mw, NULL, NULL); gtk_widget_hide(mw); } } From ccd8bbb69c37b855affe784e5868b250a5620932 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 21 Mar 2013 17:12:16 +0100 Subject: [PATCH 161/281] menu in call log view with call, chat and add contact --- coreapi/linphonefriend.h | 7 ++ gtk/call_logs.ui | 2 + gtk/calllogs.c | 167 +++++++++++++++++++++++++++++++++------ gtk/friendlist.c | 113 +++++++++++++++++--------- gtk/linphone.h | 1 + gtk/main.ui | 2 - 6 files changed, 225 insertions(+), 67 deletions(-) diff --git a/coreapi/linphonefriend.h b/coreapi/linphonefriend.h index ab75b7bf7..6eb2ab2a2 100644 --- a/coreapi/linphonefriend.h +++ b/coreapi/linphonefriend.h @@ -132,6 +132,13 @@ void linphone_friend_destroy(LinphoneFriend *lf); */ int linphone_friend_set_addr(LinphoneFriend *fr, const LinphoneAddress* address); +/** + * set the display name for this friend + * @param lf #LinphoneFriend object + * @param name + */ +int linphone_friend_set_name(LinphoneFriend *lf, const char *name); + /** * get address of this friend * @param lf #LinphoneFriend object diff --git a/gtk/call_logs.ui b/gtk/call_logs.ui index 34c6ba3b2..23184841a 100644 --- a/gtk/call_logs.ui +++ b/gtk/call_logs.ui @@ -82,7 +82,9 @@ True True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False + diff --git a/gtk/calllogs.c b/gtk/calllogs.c index ce4695dd2..2ca86beab 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -47,6 +47,145 @@ void call_log_selection_changed(GtkTreeView *v){ } } +void linphone_gtk_call_log_chat_selected(GtkWidget *w){ + GtkTreeSelection *select; + GtkTreeIter iter; + + select=gtk_tree_view_get_selection(GTK_TREE_VIEW(w)); + if (select!=NULL){ + GtkTreeModel *model=NULL; + if (gtk_tree_selection_get_selected (select,&model,&iter)){ + gpointer pla; + LinphoneAddress *la; + gtk_tree_model_get(model,&iter,2,&pla,-1); + la=(LinphoneAddress*)pla; + if (la!=NULL){ + linphone_gtk_tree_view_set_chat_conversation(la); + } + } + } +} + +void linphone_gtk_call_log_add_contact(GtkWidget *w){ + GtkTreeSelection *select; + GtkTreeIter iter; + + select=gtk_tree_view_get_selection(GTK_TREE_VIEW(w)); + if (select!=NULL){ + GtkTreeModel *model=NULL; + if (gtk_tree_selection_get_selected (select,&model,&iter)){ + gpointer pla; + LinphoneAddress *la; + LinphoneFriend *lf; + gtk_tree_model_get(model,&iter,2,&pla,-1); + la=(LinphoneAddress*)pla; + if (la!=NULL){ + char *uri=linphone_address_as_string(la); + lf=linphone_friend_new_with_addr(uri); + linphone_gtk_show_contact(lf); + ms_free(uri); + } + } + } +} + +static bool_t put_selection_to_uribar(GtkWidget *treeview){ + GtkTreeSelection *sel; + + sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); + if (sel!=NULL){ + GtkTreeModel *model=NULL; + GtkTreeIter iter; + if (gtk_tree_selection_get_selected (sel,&model,&iter)){ + gpointer pla; + LinphoneAddress *la; + char *tmp; + gtk_tree_model_get(model,&iter,2,&pla,-1); + la=(LinphoneAddress*)pla; + tmp=linphone_address_as_string (la); + gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"uribar")),tmp); + ms_free(tmp); + return TRUE; + } + } + return FALSE; +} + +static void linphone_gtk_call_selected(GtkTreeView *treeview){ + put_selection_to_uribar(GTK_WIDGET(treeview)); + linphone_gtk_start_call(linphone_gtk_get_widget(gtk_widget_get_toplevel(GTK_WIDGET(treeview)), + "start_call")); +} + +static GtkWidget *linphone_gtk_create_call_log_menu(GtkWidget *call_log){ + GtkWidget *menu=gtk_menu_new(); + GtkWidget *menu_item; + gchar *call_label=NULL; + gchar *text_label=NULL; + gchar *name=NULL; + GtkWidget *image; + GtkTreeSelection *select; + GtkTreeIter iter; + + select=gtk_tree_view_get_selection(GTK_TREE_VIEW(call_log)); + if (select!=NULL){ + GtkTreeModel *model=NULL; + if (gtk_tree_selection_get_selected (select,&model,&iter)){ + gpointer pla; + LinphoneAddress *la; + gtk_tree_model_get(model,&iter,2,&pla,-1); + la=(LinphoneAddress*)pla; + name=linphone_address_as_string(la); + call_label=g_strdup_printf(_("Call %s"),name); + text_label=g_strdup_printf(_("Send text to %s"),name); + g_free(name); + } + } + if (call_label){ + menu_item=gtk_image_menu_item_new_with_label(call_label); + image=gtk_image_new_from_stock(GTK_STOCK_NETWORK,GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); + gtk_widget_show(image); + gtk_widget_show(menu_item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); + g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_call_selected,call_log); + } + if (text_label){ + menu_item=gtk_image_menu_item_new_with_label(text_label); + image=gtk_image_new_from_stock(GTK_STOCK_NETWORK,GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); + gtk_widget_show(image); + gtk_widget_show(menu_item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); + g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_call_log_chat_selected,call_log); + } + + menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); + gtk_widget_show(menu_item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); + g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_call_log_add_contact,call_log); + gtk_widget_show(menu); + gtk_menu_attach_to_widget(GTK_MENU(menu),call_log, NULL); + + if (call_label) g_free(call_label); + if (text_label) g_free(text_label); + return menu; +} + +gboolean linphone_gtk_call_log_popup_contact(GtkWidget *list, GdkEventButton *event){ + GtkWidget *m=linphone_gtk_create_call_log_menu(list); + gtk_menu_popup (GTK_MENU (m), NULL, NULL, NULL, NULL, + event ? event->button : 0, event ? event->time : gtk_get_current_event_time()); + return TRUE; +} + +gboolean linphone_gtk_call_log_button_pressed(GtkWidget *widget, GdkEventButton *event){ + if (event->button == 3 && event->type == GDK_BUTTON_PRESS){ + return linphone_gtk_call_log_popup_contact(widget, event); + } + return FALSE; +} + void linphone_gtk_call_log_update(GtkWidget *w){ GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view")); GtkTreeStore *store; @@ -62,6 +201,7 @@ void linphone_gtk_call_log_update(GtkWidget *w){ select=gtk_tree_view_get_selection(v); gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE); g_signal_connect_swapped(G_OBJECT(select),"changed",(GCallback)call_log_selection_changed,v); + g_signal_connect(G_OBJECT(v),"button-press-event",(GCallback)linphone_gtk_call_log_button_pressed,NULL); // gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")), // create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png"))); } @@ -149,28 +289,6 @@ void linphone_gtk_call_log_update(GtkWidget *w){ } -static bool_t put_selection_to_uribar(GtkWidget *treeview){ - GtkTreeSelection *sel; - - sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); - if (sel!=NULL){ - GtkTreeModel *model=NULL; - GtkTreeIter iter; - if (gtk_tree_selection_get_selected (sel,&model,&iter)){ - gpointer pla; - LinphoneAddress *la; - char *tmp; - gtk_tree_model_get(model,&iter,2,&pla,-1); - la=(LinphoneAddress*)pla; - tmp=linphone_address_as_string (la); - gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"uribar")),tmp); - ms_free(tmp); - return TRUE; - } - } - return FALSE; -} - void linphone_gtk_history_row_activated(GtkWidget *treeview){ if (put_selection_to_uribar(treeview)){ GtkWidget *mw=linphone_gtk_get_main_window(); @@ -207,8 +325,6 @@ void linphone_gtk_call_log_response(GtkWidget *w, guint response_id){ gtk_widget_destroy(w); } - - GtkWidget * linphone_gtk_show_call_logs(void){ GtkWidget *mw=linphone_gtk_get_main_window(); @@ -223,5 +339,4 @@ GtkWidget * linphone_gtk_show_call_logs(void){ linphone_gtk_call_log_update(w); }else gtk_window_present(GTK_WINDOW(w)); return w; -} - +} \ No newline at end of file diff --git a/gtk/friendlist.c b/gtk/friendlist.c index e1012f7cd..9f5a935b8 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -195,38 +195,11 @@ void linphone_gtk_create_chat_picture(gboolean active){ GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)); if (gtk_tree_model_get_iter_first(model,&iter)) { do{ - if(!active){ + //if(!active){ gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,create_chat_picture(),-1); - } else { - gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,create_active_chat_picture(),-1); - } - }while(gtk_tree_model_iter_next(model,&iter)); - } -} - -void linphone_gtk_update_chat_picture(){ - GtkTreeIter iter; - GtkListStore *store=NULL; - GtkWidget *w = linphone_gtk_get_main_window(); - GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); - GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)); - GtkWidget *chat_view=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); - LinphoneFriend *lf=NULL; - char *uri=(char *)g_object_get_data(G_OBJECT(friendlist),"from"); - store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))); - if (gtk_tree_model_get_iter_first(model,&iter)) { - do{ - gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); - if(chat_view!=NULL){ - if(uri !=NULL) { - if(g_strcmp0(linphone_address_as_string(linphone_friend_get_address(lf)), - uri)==0){ - gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); - } else { - gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); - } - } - } + //} else { + // gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,create_active_chat_picture(),-1); + //} }while(gtk_tree_model_iter_next(model,&iter)); } } @@ -236,6 +209,66 @@ static gboolean grab_focus(GtkWidget *w){ return FALSE; } +void linphone_gtk_tree_view_set_chat_conversation(LinphoneAddress *la){ + GtkTreeIter iter; + GtkListStore *store=NULL; + GtkWidget *w = linphone_gtk_get_main_window(); + GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); + GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)); + GtkWidget *chat_view=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + LinphoneFriend *lf=NULL; + LinphoneChatRoom *cr=NULL; + GtkNotebook *notebook=(GtkNotebook *)linphone_gtk_get_widget(w,"viewswitch"); + char *la_str=linphone_address_as_string(la); + + lf=linphone_core_get_friend_by_address(linphone_gtk_get_core(),la_str); + if(lf==NULL){ + cr=linphone_gtk_create_chatroom(la); + g_object_set_data(G_OBJECT(friendlist),"from",la_str); + if(chat_view==NULL){ + chat_view=linphone_gtk_init_chatroom(cr,la); + g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)chat_view); + } else { + linphone_gtk_load_chatroom(cr,la,chat_view); + } + gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,chat_view)); + linphone_gtk_create_chat_picture(FALSE); + g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(chat_view,"text_entry")); + } else { + store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))); + if (gtk_tree_model_get_iter_first(model,&iter)) { + do{ + const LinphoneAddress *uri; + char *lf_str; + gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); + uri=linphone_friend_get_address(lf); + lf_str=linphone_address_as_string(uri); + if( g_strcmp0(lf_str,la_str)==0){ + gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); + if(cr==NULL){ + cr=linphone_gtk_create_chatroom(uri); + gtk_list_store_set(store,&iter,FRIEND_CHATROOM,cr,-1); + } + g_object_set_data(G_OBJECT(friendlist),"from",linphone_address_as_string(uri)); + if(chat_view==NULL){ + chat_view=linphone_gtk_init_chatroom(cr,uri); + g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)chat_view); + } else { + linphone_gtk_load_chatroom(cr,uri,chat_view); + } + gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,chat_view)); + linphone_gtk_create_chat_picture(FALSE); + g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(chat_view,"text_entry")); + gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); + gtk_list_store_set(store,&iter,FRIEND_NB_UNREAD_MSG,"",-1); + break; + } + }while(gtk_tree_model_iter_next(model,&iter)); + } + } + +} + void linphone_gtk_chat_selected(GtkWidget *item){ GtkWidget *w=gtk_widget_get_toplevel(item); GtkTreeSelection *select; @@ -734,7 +767,6 @@ void linphone_gtk_show_friends(void){ if(nbmsg != 0){ sprintf(buf,"%i",nbmsg); } - } gtk_list_store_set(store,&iter,FRIEND_CALL,create_call_picture(),-1); @@ -743,7 +775,7 @@ void linphone_gtk_show_friends(void){ escaped=g_markup_escape_text(uri,-1); gtk_list_store_set(store,&iter,FRIEND_SIP_ADDRESS,escaped,-1); g_free(escaped); - linphone_gtk_update_chat_picture(); + //linphone_gtk_update_chat_picture(); //bi=linphone_friend_get_info(lf); /*if (bi!=NULL && bi->image_data!=NULL){ GdkPixbuf *pbuf= @@ -787,6 +819,7 @@ void linphone_gtk_contact_cancel(GtkWidget *button){ void linphone_gtk_contact_ok(GtkWidget *button){ GtkWidget *w=gtk_widget_get_toplevel(button); LinphoneFriend *lf=(LinphoneFriend*)g_object_get_data(G_OBJECT(w),"friend_ref"); + LinphoneFriend *lf2; char *fixed_uri=NULL; gboolean show_presence=FALSE,allow_presence=FALSE; const gchar *name,*uri; @@ -811,16 +844,20 @@ void linphone_gtk_contact_ok(GtkWidget *button){ LinphoneAddress* friend_address = linphone_address_new(fixed_uri); linphone_address_set_display_name(friend_address,name); linphone_friend_set_addr(lf,friend_address); - ms_free(fixed_uri); linphone_address_destroy(friend_address); linphone_friend_send_subscribe(lf,show_presence); linphone_friend_set_inc_subscribe_policy(lf,allow_presence==TRUE ? LinphoneSPAccept : LinphoneSPDeny); if (linphone_friend_in_list(lf)) { linphone_friend_done(lf); - }else{ - linphone_core_add_friend(linphone_gtk_get_core(),lf); + } else { + lf2=linphone_core_get_friend_by_address(linphone_gtk_get_core(),fixed_uri); + if(lf2==NULL){ + linphone_friend_set_name(lf,name); + linphone_core_add_friend(linphone_gtk_get_core(),lf); + } } + ms_free(fixed_uri); linphone_gtk_show_friends(); gtk_widget_destroy(w); } @@ -997,6 +1034,4 @@ gboolean linphone_gtk_contact_list_button_pressed(GtkWidget *widget, GdkEventBut void linphone_gtk_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf){ /*refresh the entire list*/ linphone_gtk_show_friends(); -} - - +} \ No newline at end of file diff --git a/gtk/linphone.h b/gtk/linphone.h index a7d7da506..ccdebea69 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -153,3 +153,4 @@ void linphone_gtk_unmonitor_usb(void); gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference); void linphone_gtk_friend_list_update_message(LinphoneChatMessage *msg); +void linphone_gtk_tree_view_set_chat_conversation(LinphoneAddress *la); diff --git a/gtk/main.ui b/gtk/main.ui index e1c8c9129..0b27240e7 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -313,7 +313,6 @@ True False - label center @@ -368,7 +367,6 @@ True False - label True From 4cffe873661443f2a393df800aa6718341e6baf7 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 27 Mar 2013 10:45:06 +0100 Subject: [PATCH 162/281] fix compilation issue --- gtk/main.c | 3 ++- mediastreamer2 | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index ae6c8a010..b188782ab 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -69,9 +69,10 @@ void linphone_gtk_status_icon_set_blinking(gboolean val); void _linphone_gtk_enable_video(gboolean val); - +#ifndef HAVE_GTK_OSX static gint main_window_x=0; static gint main_window_y=0; +#endif static gboolean verbose=0; static gboolean auto_answer = 0; static gchar * addr_to_call = NULL; diff --git a/mediastreamer2 b/mediastreamer2 index 4b8d2b655..5a7ae95e0 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 4b8d2b655acc8a329464e7806653dceb04ade445 +Subproject commit 5a7ae95e0dbe5f485086d4635a655c893c9c44b1 From 1c6d3202e609ff1f688c06b44a79b83b30a6f071 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 27 Mar 2013 10:54:37 +0100 Subject: [PATCH 163/281] fix display name in call_log --- gtk/calllogs.c | 16 ++++++++++++---- po/README | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 2ca86beab..9d2714153 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -210,13 +210,14 @@ void linphone_gtk_call_log_update(GtkWidget *w){ for (logs=linphone_core_get_call_logs(linphone_gtk_get_core());logs!=NULL;logs=logs->next){ LinphoneCallLog *cl=(LinphoneCallLog*)logs->data; GtkTreeIter iter, iter2; - LinphoneAddress *la=linphone_call_log_get_dir(cl)==LinphoneCallIncoming ? linphone_call_log_get_from(cl) : linphone_call_log_get_to(cl); - char *addr= linphone_address_as_string_uri_only (la); + const LinphoneAddress *la=linphone_call_log_get_dir(cl)==LinphoneCallIncoming ? linphone_call_log_get_from(cl) : linphone_call_log_get_to(cl); + char *addr= linphone_address_as_string(la); const char *display; gchar *logtxt, *headtxt, *minutes, *seconds; gchar quality[20]; const char *status=NULL; gchar *start_date=NULL; + LinphoneFriend *lf=NULL; int duration=linphone_call_log_get_duration(cl); time_t start_date_time=linphone_call_log_get_start_date(cl); @@ -229,12 +230,19 @@ void linphone_gtk_call_log_update(GtkWidget *w){ #else start_date=g_strdup(ctime(&start_date_time)); #endif + lf=linphone_core_get_friend_by_address(linphone_gtk_get_core(),addr); + if(lf != NULL){ + la=linphone_friend_get_address(lf); + display=linphone_address_get_display_name(la); + } else { + display=linphone_address_get_display_name(la); + } - display=linphone_address_get_display_name (la); if (display==NULL){ display=linphone_address_get_username (la); - if (display==NULL) + if (display==NULL){ display=linphone_address_get_domain (la); + } } if (linphone_call_log_get_quality(cl)!=-1){ snprintf(quality,sizeof(quality),"%.1f",linphone_call_log_get_quality(cl)); diff --git a/po/README b/po/README index adec33171..19a1dbd53 100644 --- a/po/README +++ b/po/README @@ -5,7 +5,7 @@ To add a translation file in linphone project you should first : - then add the file .po in the directory /po - run ./autogen.sh -Update the tranlation files +Update the translation files *************************** To update all the translation files, in the directory /po run the following command $ make update-po From 81475cbdae3c589390b2e40cb1fd2409b44ee810 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 27 Mar 2013 20:05:25 +0100 Subject: [PATCH 164/281] use git describe --always --- coreapi/Makefile.am | 2 +- mediastreamer2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index bef0613b5..91fc9bd22 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -1,6 +1,6 @@ GITVERSION_FILE=liblinphone_gitversion.h GITVERSION_FILE_TMP=liblinphone_gitversion.h.tmp -GITDESCRIBE=`git describe` +GITDESCRIBE=`git describe --always` GITREVISION=`git rev-parse HEAD` ECHO=/bin/echo diff --git a/mediastreamer2 b/mediastreamer2 index 5a7ae95e0..8596ed901 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 5a7ae95e0dbe5f485086d4635a655c893c9c44b1 +Subproject commit 8596ed9017c0d9b9c63c758d7628bac1fc07efd7 From 700b41b3ae972efc807603739ddc0bc6f4e26d8b Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Thu, 28 Mar 2013 14:31:41 +0100 Subject: [PATCH 165/281] Updated Hungarian translation. --- po/hu.po | 846 ++++++++++++++++++++++++++----------------------------- 1 file changed, 392 insertions(+), 454 deletions(-) diff --git a/po/hu.po b/po/hu.po index 819bb2210..54f7821a5 100644 --- a/po/hu.po +++ b/po/hu.po @@ -1,53 +1,49 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Free Software Foundation, Inc. -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# +# Hungarian translation for Linphone. +# Copyright 2013. +# This file is distributed under the same license as the linphone package. +# msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: Linphone\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-07 12:30+0100\n" -"PO-Revision-Date: 2007-12-14 11:12+0100\n" -"Last-Translator: \n" -"Language-Team: LANGUAGE \n" -"Language: \n" +"PO-Revision-Date: 2013-03-26 19:00+0100\n" +"Last-Translator: Viktor \n" +"Language-Team: \n" +"Language: Hungarian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.4\n" +"Plural-Forms: nplurals=1; plural=1 == 1 ? 0 : 1;\n" #: ../gtk/calllogs.c:82 msgid "n/a" -msgstr "" +msgstr "-" #: ../gtk/calllogs.c:85 -#, fuzzy msgid "Aborted" -msgstr "megszakítva" +msgstr "Megszakítva" #: ../gtk/calllogs.c:88 -#, fuzzy msgid "Missed" -msgstr "elhibázva" +msgstr "Nem fogadott" #: ../gtk/calllogs.c:91 -#, fuzzy msgid "Declined" -msgstr "line" +msgstr "Elutasítva" #: ../gtk/calllogs.c:97 #, c-format msgid "%i minute" msgid_plural "%i minutes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%i perc" #: ../gtk/calllogs.c:100 #, c-format msgid "%i second" msgid_plural "%i seconds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%i másodperc" #: ../gtk/calllogs.c:103 #, c-format @@ -55,6 +51,8 @@ msgid "" "%s\t%s\tQuality: %s\n" "%s\t%s %s\t" msgstr "" +"%s\t%s\tMinőség: %s\n" +"%s\t%s %s\t" #: ../gtk/calllogs.c:108 #, c-format @@ -62,14 +60,16 @@ msgid "" "%s\t%s\t\n" "%s\t%s" msgstr "" +"%s\t%s\t\n" +"%s\t%s" #: ../gtk/conference.c:38 ../gtk/main.ui.h:14 msgid "Conference" -msgstr "" +msgstr "Konferencia" #: ../gtk/conference.c:46 msgid "Me" -msgstr "" +msgstr "én" #: ../gtk/support.c:49 ../gtk/support.c:73 ../gtk/support.c:102 #, c-format @@ -78,38 +78,40 @@ msgstr "Nemtalálható a pixmap fájl: %s" #: ../gtk/main.c:88 msgid "log to stdout some debug information while running." -msgstr "" +msgstr "Futás közben némi hibakeresési információ az stdout-ra naplózása." #: ../gtk/main.c:95 msgid "path to a file to write logs into." -msgstr "" +msgstr "fájl elérési útja, melybe a naplók kerülnek." #: ../gtk/main.c:102 msgid "Start linphone with video disabled." -msgstr "" +msgstr "Linphone indítása, videó kikpacsolva. " #: ../gtk/main.c:109 msgid "Start only in the system tray, do not show the main interface." -msgstr "" +msgstr "Csak a tálcaikon indítása, ne mutassa a fő ablakot." #: ../gtk/main.c:116 msgid "address to call right now" -msgstr "" +msgstr "Cím azonnali híváshoz" #: ../gtk/main.c:123 msgid "if set automatically answer incoming calls" -msgstr "" +msgstr "Bekapcsolva automatikusan válaszol a bejövő hívásokra" #: ../gtk/main.c:130 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" +"Adjon meg egy munkakönyvtárat (ennek az installációs könyvtárnak kéne " +"lennie, pl. C:\\Program Files\\Linphone)" #: ../gtk/main.c:510 -#, fuzzy, c-format +#, c-format msgid "Call with %s" -msgstr "Chat-elés %s -el" +msgstr "Hívás %s -el" #: ../gtk/main.c:941 #, c-format @@ -119,6 +121,10 @@ msgid "" "list ?\n" "If you answer no, this person will be temporarily blacklisted." msgstr "" +"%s szeretné Önt hozzáadni partnerlistájához.\n" +"Szeretné megengedni neki, hogy lássa az Ön jelenlétét, illetve hozzá " +"szeretné adni a partnerlistához?\n" +"Ha nemmel válaszol, ez a személy átmenetileg tiltólistára kerül." #: ../gtk/main.c:1018 #, c-format @@ -126,11 +132,12 @@ msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" +"Kérem, adja meg jelszavát a következő felhasználónévhez: %s\n" +"tartomány %s:" #: ../gtk/main.c:1121 -#, fuzzy msgid "Call error" -msgstr "Linphone - Híváselőzmények" +msgstr "Hiba a hívás közben" #: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 msgid "Call ended" @@ -142,60 +149,59 @@ msgstr "Beérkező hívás" #: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 msgid "Answer" -msgstr "" +msgstr "Hívás fogadása" #: ../gtk/main.c:1131 ../gtk/main.ui.h:7 -#, fuzzy msgid "Decline" -msgstr "line" +msgstr "Elutasítás" #: ../gtk/main.c:1137 -#, fuzzy msgid "Call paused" -msgstr "megszakítva" +msgstr "Hívás várakoztatva" #: ../gtk/main.c:1137 -#, fuzzy, c-format +#, c-format msgid "by %s" -msgstr "Kapcsolatilista" +msgstr "a következő által: %s" #: ../gtk/main.c:1186 #, c-format msgid "%s proposed to start video. Do you accept ?" -msgstr "" +msgstr "%s szerené elidítani a videót. Elfogadja?" #: ../gtk/main.c:1348 msgid "Website link" -msgstr "" +msgstr "Internetes oldal" #: ../gtk/main.c:1388 msgid "Linphone - a video internet phone" -msgstr "" +msgstr "Linphone - internetes videó telefon" #: ../gtk/main.c:1480 #, c-format msgid "%s (Default)" -msgstr "" +msgstr "%s (Alapértelmezett)" #: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 #, c-format msgid "We are transferred to %s" -msgstr "" +msgstr "Át vagyunk irányítva ide: %s" #: ../gtk/main.c:1792 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" +"Hangkártya nincs érzékelve ezen a számítógépen.\n" +"Nem fog tudni hang hívásokat küldeni vagy fogadni." #: ../gtk/main.c:1896 msgid "A free SIP video-phone" msgstr "Egy ingyenes SIP video-telefon" #: ../gtk/friendlist.c:366 -#, fuzzy msgid "Add to addressbook" -msgstr "Címjegyzék" +msgstr "Hozzáadás címjegyzékhez" #: ../gtk/friendlist.c:540 msgid "Presence status" @@ -206,48 +212,46 @@ msgid "Name" msgstr "Név" #: ../gtk/friendlist.c:569 -#, fuzzy msgid "Call" -msgstr "Hivás előzmények" +msgstr "Hivás" #: ../gtk/friendlist.c:574 -#, fuzzy msgid "Chat" -msgstr "Chat szoba" +msgstr "Csevegés" #: ../gtk/friendlist.c:604 #, c-format msgid "Search in %s directory" -msgstr "" +msgstr "Keresés ebben a könyvtárban: %s" #: ../gtk/friendlist.c:762 msgid "Invalid sip contact !" -msgstr "" +msgstr "Érvénytelen sip partner !" #: ../gtk/friendlist.c:807 -#, fuzzy, c-format +#, c-format msgid "Call %s" -msgstr "Hivás előzmények" +msgstr "%s hívása" #: ../gtk/friendlist.c:808 #, c-format msgid "Send text to %s" -msgstr "" +msgstr "Szöveg küldése a következőnek: %s" #: ../gtk/friendlist.c:809 -#, fuzzy, c-format +#, c-format msgid "Edit contact '%s'" -msgstr "Kapcsolatinformációk szerkesztése" +msgstr "Kapcsolatinformációk szerkesztése: '%s'" #: ../gtk/friendlist.c:810 #, c-format msgid "Delete contact '%s'" -msgstr "" +msgstr "'%s' partner törlése" #: ../gtk/friendlist.c:852 #, c-format msgid "Add new contact from %s directory" -msgstr "" +msgstr "Új partner hozzáadása ebből a könyvtárból: %s" #: ../gtk/propertybox.c:373 msgid "Rate (Hz)" @@ -279,76 +283,78 @@ msgstr "Hozzáférés" #: ../gtk/propertybox.c:764 msgid "English" -msgstr "" +msgstr "angol" #: ../gtk/propertybox.c:765 msgid "French" -msgstr "" +msgstr "francia" #: ../gtk/propertybox.c:766 msgid "Swedish" -msgstr "" +msgstr "svéd" #: ../gtk/propertybox.c:767 msgid "Italian" -msgstr "" +msgstr "olasz" #: ../gtk/propertybox.c:768 msgid "Spanish" -msgstr "" +msgstr "spanyol" #: ../gtk/propertybox.c:769 msgid "Brazilian Portugese" -msgstr "" +msgstr "brazil-portugál" #: ../gtk/propertybox.c:770 msgid "Polish" -msgstr "" +msgstr "lengyel" #: ../gtk/propertybox.c:771 msgid "German" -msgstr "" +msgstr "német" #: ../gtk/propertybox.c:772 msgid "Russian" -msgstr "" +msgstr "orosz" #: ../gtk/propertybox.c:773 msgid "Japanese" -msgstr "" +msgstr "japán" #: ../gtk/propertybox.c:774 msgid "Dutch" -msgstr "" +msgstr "holland" #: ../gtk/propertybox.c:775 msgid "Hungarian" -msgstr "" +msgstr "magyar" #: ../gtk/propertybox.c:776 msgid "Czech" -msgstr "" +msgstr "cseh" #: ../gtk/propertybox.c:777 msgid "Chinese" -msgstr "" +msgstr "egyszerúsített kínai" #: ../gtk/propertybox.c:778 msgid "Traditional Chinese" -msgstr "" +msgstr "tradícionális kínai" #: ../gtk/propertybox.c:779 msgid "Norwegian" -msgstr "" +msgstr "norvég" #: ../gtk/propertybox.c:780 msgid "Hebrew" -msgstr "" +msgstr "héber" #: ../gtk/propertybox.c:847 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" +"Újra kell indítania a linphone-t, hogy az új nyelv kiválasztása érvényre " +"jusson. " #: ../gtk/propertybox.c:933 msgid "None" @@ -356,11 +362,11 @@ msgstr "Nincs" #: ../gtk/propertybox.c:937 msgid "SRTP" -msgstr "" +msgstr "SRTP" #: ../gtk/propertybox.c:943 msgid "ZRTP" -msgstr "" +msgstr "ZRTP" #: ../gtk/update.c:80 #, c-format @@ -368,125 +374,123 @@ msgid "" "A more recent version is availalble from %s.\n" "Would you like to open a browser to download it ?" msgstr "" +"Elérhető egy újabb verzió a következőn: %s.\n" +"Szeretné, hogy a letöltéshez egy új böngésző ablak nyíljon?" #: ../gtk/update.c:91 msgid "You are running the lastest version." -msgstr "" +msgstr "Ön a legfrissebb verziót használja." #: ../gtk/buddylookup.c:85 msgid "Firstname, Lastname" -msgstr "" +msgstr "Utónév, Családnév" #: ../gtk/buddylookup.c:160 msgid "Error communicating with server." -msgstr "" +msgstr "Hiba a kiszolgálóval történő kommunikáció során." #: ../gtk/buddylookup.c:164 -#, fuzzy msgid "Connecting..." -msgstr "Kapcsolódás" +msgstr "Kapcsolódás..." #: ../gtk/buddylookup.c:168 -#, fuzzy msgid "Connected" -msgstr "Kapcsolódva." +msgstr "Kapcsolódva" #: ../gtk/buddylookup.c:172 msgid "Receiving data..." -msgstr "" +msgstr "Adatok fogadása..." #: ../gtk/buddylookup.c:180 #, c-format msgid "Found %i contact" msgid_plural "Found %i contacts" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Találat: %i partner" #: ../gtk/setupwizard.c:34 msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." msgstr "" +"Üdvözöljük !\n" +"Ez a varázsló segít Önnek, hogy sip fiókot használjon hívásaihoz." #: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" -msgstr "" +msgstr "Fiók létrehozása a linphone.org -on" #: ../gtk/setupwizard.c:44 msgid "I have already a linphone.org account and I just want to use it" -msgstr "" +msgstr "Már rendelkezem linphone.org fiókkal, azt szeretném használni" #: ../gtk/setupwizard.c:45 msgid "I have already a sip account and I just want to use it" -msgstr "" +msgstr "Már rendelkezem sip fiókkal, azt szeretném használni" #: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" -msgstr "" +msgstr "Adja meg linphone.org felhasználónevét" #: ../gtk/setupwizard.c:92 -#, fuzzy msgid "Username:" -msgstr "felhasználónév:" +msgstr "Felhasználónév:" #: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 -#, fuzzy msgid "Password:" -msgstr "jelszó:" +msgstr "Jelszó:" #: ../gtk/setupwizard.c:114 msgid "Enter your account informations" -msgstr "" +msgstr "Írja be fiókinformációit" #: ../gtk/setupwizard.c:121 -#, fuzzy msgid "Username*" -msgstr "felhasználónév:" +msgstr "Felhasználónév*" #: ../gtk/setupwizard.c:122 -#, fuzzy msgid "Password*" -msgstr "jelszó:" +msgstr "Jelszó*" #: ../gtk/setupwizard.c:125 msgid "Domain*" -msgstr "" +msgstr "Tartomány" #: ../gtk/setupwizard.c:126 msgid "Proxy" -msgstr "" +msgstr "Proxy" #: ../gtk/setupwizard.c:298 msgid "(*) Required fields" -msgstr "" +msgstr "(*) Mező kitöltése szükséges" #: ../gtk/setupwizard.c:299 -#, fuzzy msgid "Username: (*)" -msgstr "felhasználónév:" +msgstr "Felhasználónév: (*)" #: ../gtk/setupwizard.c:301 -#, fuzzy msgid "Password: (*)" -msgstr "jelszó:" +msgstr "Jelszó: (*)" #: ../gtk/setupwizard.c:303 msgid "Email: (*)" -msgstr "" +msgstr "E-mail: (*)" #: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" -msgstr "" +msgstr "Jelszó megerősítése: (*)" #: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" +"Hiba, a fiók nincs érvényesítve. Valaki már használja ezt a felhasználónevet " +"vagy a kiszolgáló nem elérhető.\n" +"Kérjük, lépjen vissza és próbálja újra." #: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." -msgstr "" +msgstr "Köszönjük! Az Ön fiókját beállítottuk és használatra kész." #: ../gtk/setupwizard.c:388 msgid "" @@ -494,105 +498,103 @@ msgid "" "email.\n" "Then come back here and press Next button." msgstr "" +"Kérjük, érvényesítse fiókját az általunk elektronikus levélben küldött " +"hivatkozásra kattintva.\n" +"Azután térjen vissza ide és kattintson a Következő gombra." #: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" -msgstr "" +msgstr "A fiók beállítása varázsló üdvözli Önt" #: ../gtk/setupwizard.c:569 msgid "Account setup assistant" -msgstr "" +msgstr "Fiók beállítása varázsló" #: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" -msgstr "" +msgstr "Az Ön fiókjának beállítása (1/1 lépés)" #: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" -msgstr "" +msgstr "Adja meg sip felhasználónevét (1/2 lépés)" #: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" -msgstr "" +msgstr "Adja meg a fiókinformációt (1/2 lépés)" #: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" -msgstr "" +msgstr "Érvényesítés (2/2 lépés)" #: ../gtk/setupwizard.c:598 msgid "Error" -msgstr "" +msgstr "Hiba" #: ../gtk/setupwizard.c:602 msgid "Terminating" -msgstr "" +msgstr "Befejezés" #: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 -#, fuzzy, c-format +#, c-format msgid "Call #%i" -msgstr "Hivás előzmények" +msgstr "Hívás #%i" #: ../gtk/incall_view.c:154 #, c-format msgid "Transfer to call #%i with %s" -msgstr "" +msgstr "Átirányítás #%i híváshoz ezzel: %s " #: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" -msgstr "" +msgstr "Nem használt" #: ../gtk/incall_view.c:220 msgid "ICE not activated" -msgstr "" +msgstr "ICE nincs aktiválva" #: ../gtk/incall_view.c:222 -#, fuzzy msgid "ICE failed" -msgstr "Hívás elutasítva" +msgstr "ICE nem sikerült" #: ../gtk/incall_view.c:224 msgid "ICE in progress" -msgstr "" +msgstr "ICE folyamatban" #: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" -msgstr "" +msgstr "Átmegy egy vagy több NAT-on" #: ../gtk/incall_view.c:228 -#, fuzzy msgid "Direct" -msgstr "Átirányítva idw %s..." +msgstr "Közvetlen" #: ../gtk/incall_view.c:230 msgid "Through a relay server" -msgstr "" +msgstr "Közvetítő kiszolgálón keresztül" #: ../gtk/incall_view.c:238 msgid "uPnP not activated" -msgstr "" +msgstr "uPnP nincs aktiválva" #: ../gtk/incall_view.c:240 -#, fuzzy msgid "uPnP in progress" -msgstr "Stun keresés folyamatban..." +msgstr "uPnP folyamatban" #: ../gtk/incall_view.c:242 -#, fuzzy msgid "uPnp not available" -msgstr "Nem érhető el információ" +msgstr "uPnP nem elérhető" #: ../gtk/incall_view.c:244 msgid "uPnP is running" -msgstr "" +msgstr "uPnP fut" #: ../gtk/incall_view.c:246 -#, fuzzy msgid "uPnP failed" -msgstr "Hívás elutasítva" +msgstr "uPnP nem sikerült" #: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 msgid "Direct or through server" -msgstr "" +msgstr "közvetlen vagy kiszolgálón keresztül" #: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format @@ -600,115 +602,111 @@ msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" +"letöltés: %f\n" +"feltöltés: %f (kbit/mp)" #: ../gtk/incall_view.c:286 #, c-format msgid "%.3f seconds" -msgstr "" +msgstr "%.3f másodperc" #: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 msgid "Hang up" -msgstr "" +msgstr "Befejezés" #: ../gtk/incall_view.c:477 -#, fuzzy msgid "Calling..." -msgstr "Kapcsolatilista" +msgstr "Hívás folyamatban..." #: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 msgid "00::00::00" -msgstr "" +msgstr "00::00::00" #: ../gtk/incall_view.c:491 -#, fuzzy msgid "Incoming call" -msgstr "Beérkező hívás" +msgstr "Beérkező hívás" #: ../gtk/incall_view.c:528 msgid "good" -msgstr "" +msgstr "jó" #: ../gtk/incall_view.c:530 msgid "average" -msgstr "" +msgstr "közepes" #: ../gtk/incall_view.c:532 msgid "poor" -msgstr "" +msgstr "gyenge" #: ../gtk/incall_view.c:534 msgid "very poor" -msgstr "" +msgstr "nagyon gyenge" #: ../gtk/incall_view.c:536 msgid "too bad" -msgstr "" +msgstr "rossz" #: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 msgid "unavailable" -msgstr "" +msgstr "nem elérhető" #: ../gtk/incall_view.c:652 msgid "Secured by SRTP" -msgstr "" +msgstr "SRTP-vel titkosítva" #: ../gtk/incall_view.c:658 #, c-format msgid "Secured by ZRTP - [auth token: %s]" -msgstr "" +msgstr "ZRTP-vel titkosítva - [hitelesítési jel: %s]" #: ../gtk/incall_view.c:664 msgid "Set unverified" -msgstr "" +msgstr "Beállítás ellenőrizetlenként" #: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 msgid "Set verified" -msgstr "" +msgstr "Beállítás ellenőrzöttként" #: ../gtk/incall_view.c:685 msgid "In conference" -msgstr "" +msgstr "Konferencián" #: ../gtk/incall_view.c:685 -#, fuzzy msgid "In call" -msgstr "Kapcsolatilista" +msgstr "vonalban" #: ../gtk/incall_view.c:719 -#, fuzzy msgid "Paused call" -msgstr "Kapcsolatilista" +msgstr "Várakoztatott hívás" #: ../gtk/incall_view.c:732 #, c-format msgid "%02i::%02i::%02i" -msgstr "" +msgstr "%02i::%02i::%02i" #: ../gtk/incall_view.c:749 -#, fuzzy msgid "Call ended." -msgstr "Hívás vége" +msgstr "Hívás vége." #: ../gtk/incall_view.c:779 msgid "Transfer in progress" -msgstr "" +msgstr "Átvitel folyamatban" #: ../gtk/incall_view.c:782 msgid "Transfer done." -msgstr "" +msgstr "Átvitel befejezve." #: ../gtk/incall_view.c:785 -#, fuzzy msgid "Transfer failed." -msgstr "Hívás elutasítva" +msgstr "Az átvitel sikertelen." #: ../gtk/incall_view.c:829 msgid "Resume" -msgstr "" +msgstr "Visszatérés" #: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 msgid "Pause" -msgstr "" +msgstr "Várakoztatás" #: ../gtk/incall_view.c:901 #, c-format @@ -716,115 +714,109 @@ msgid "" "Recording into\n" "%s %s" msgstr "" +"Felvétel a következőbe\n" +"%s %s" #: ../gtk/incall_view.c:901 msgid "(Paused)" -msgstr "" +msgstr "(Várakoztatva)" #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" -msgstr "" +msgstr "Kérem, adja meg a bejelentkezési információt %s -hoz" #: ../gtk/main.ui.h:1 -#, fuzzy msgid "Callee name" -msgstr "Hívás vége" +msgstr "Hívott neve" #: ../gtk/main.ui.h:2 -#, fuzzy msgid "Send" -msgstr "Hang" +msgstr "Küld" #: ../gtk/main.ui.h:3 msgid "End conference" -msgstr "" +msgstr "Konferencia vége" #: ../gtk/main.ui.h:4 msgid "label" -msgstr "" +msgstr "címke" #: ../gtk/main.ui.h:8 msgid "Record this call to an audio file" -msgstr "" +msgstr "Beszélgetés felvétele hangfájlba" #: ../gtk/main.ui.h:9 msgid "Video" -msgstr "" +msgstr "Videó" #: ../gtk/main.ui.h:11 msgid "Mute" -msgstr "" +msgstr "Elnémítás" #: ../gtk/main.ui.h:12 msgid "Transfer" -msgstr "" +msgstr "Átvitel" #: ../gtk/main.ui.h:15 -#, fuzzy msgid "In call" -msgstr "Beérkező hívás" +msgstr "vonalban" #: ../gtk/main.ui.h:16 -#, fuzzy msgid "Duration" -msgstr "Információk" +msgstr "Időtartam" #: ../gtk/main.ui.h:17 msgid "Call quality rating" -msgstr "" +msgstr "Hívásminőség" #: ../gtk/main.ui.h:18 msgid "_Options" -msgstr "" +msgstr "_Beállítások" #: ../gtk/main.ui.h:19 msgid "Always start video" -msgstr "" +msgstr "Videó indítása mindig" #: ../gtk/main.ui.h:20 -#, fuzzy msgid "Enable self-view" -msgstr "Video engedélyezés" +msgstr "Saját nézet" #: ../gtk/main.ui.h:21 -#, fuzzy msgid "_Help" -msgstr "Help" +msgstr "_Segítség" #: ../gtk/main.ui.h:22 msgid "Show debug window" -msgstr "" +msgstr "Hibakeresési ablak mutatása" #: ../gtk/main.ui.h:23 msgid "_Homepage" -msgstr "" +msgstr "_Honlap" #: ../gtk/main.ui.h:24 msgid "Check _Updates" -msgstr "" +msgstr "Frissítések keresése" #: ../gtk/main.ui.h:25 msgid "Account assistant" -msgstr "" +msgstr "Fiók varázsló" #: ../gtk/main.ui.h:26 -#, fuzzy msgid "SIP address or phone number:" -msgstr "Gépeld ide a sip címet vagy a telefonszámot" +msgstr "Adja meg a SIP címet vagy a telefonszámot:" #: ../gtk/main.ui.h:27 msgid "Initiate a new call" -msgstr "" +msgstr "Új hívás kezdeményezése" #: ../gtk/main.ui.h:28 -#, fuzzy msgid "Contacts" -msgstr "Kapcsolódás" +msgstr "Partnerek" #: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 msgid "Add" -msgstr "" +msgstr "Hozzáadás" #: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 msgid "Edit" @@ -832,95 +824,85 @@ msgstr "Szerkesztés" #: ../gtk/main.ui.h:31 msgid "Search" -msgstr "" +msgstr "Keresés" #: ../gtk/main.ui.h:32 -#, fuzzy msgid "Add contacts from directory" -msgstr "Kapcsolatiinformáció" +msgstr "Partnerek hozzáadása könyvtárból" #: ../gtk/main.ui.h:33 -#, fuzzy msgid "Add contact" -msgstr "Kapcsolatinformációk szerkesztése" +msgstr "Partner hozzáadása" #: ../gtk/main.ui.h:34 -#, fuzzy msgid "Recent calls" -msgstr "Beérkező hívás" +msgstr "Legutóbbi hívások" #: ../gtk/main.ui.h:35 -#, fuzzy msgid "My current identity:" -msgstr "SIP azonosító:" +msgstr "Jelenlegi identitásom:" #: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 -#, fuzzy msgid "Username" -msgstr "felhasználónév:" +msgstr "Felhasználónév" #: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 -#, fuzzy msgid "Password" -msgstr "jelszó:" +msgstr "Jelszó" #: ../gtk/main.ui.h:38 msgid "Internet connection:" -msgstr "" +msgstr "Internet kapcsolat:" #: ../gtk/main.ui.h:39 -#, fuzzy msgid "Automatically log me in" -msgstr "Automatikus valós hostnév megállapítása" +msgstr "Jelentkeztessen be automatikusan" #: ../gtk/main.ui.h:40 -#, fuzzy msgid "Login information" -msgstr "Kapcsolatiinformáció" +msgstr "Bejelentkezési információ" #: ../gtk/main.ui.h:41 -#, fuzzy msgid "Welcome !" -msgstr "Kapcsolatilista" +msgstr "Üdvözöljük !" #: ../gtk/main.ui.h:42 msgid "All users" -msgstr "" +msgstr "Minden felhasználó" #: ../gtk/main.ui.h:43 -#, fuzzy msgid "Online users" msgstr "Elérhető" #: ../gtk/main.ui.h:44 msgid "ADSL" -msgstr "" +msgstr "ADSL" #: ../gtk/main.ui.h:45 msgid "Fiber Channel" -msgstr "" +msgstr "Fiber csatorna" #: ../gtk/main.ui.h:46 -#, fuzzy msgid "Default" -msgstr "SIP azonosító:" +msgstr "Alapértelmezett" #: ../gtk/main.ui.h:47 msgid "Delete" -msgstr "" +msgstr "Törlés" #: ../gtk/about.ui.h:1 -#, fuzzy msgid "About linphone" -msgstr "linphone" +msgstr "Linphone névjegy" #: ../gtk/about.ui.h:2 msgid "(C) Belledonne Communications,2010\n" -msgstr "" +msgstr "(C) Belledonne Communications,2010\n" #: ../gtk/about.ui.h:4 msgid "An internet video phone using the standard SIP (rfc3261) protocol." msgstr "" +"Internetes videó telefon, mely a szabványos SIP (rfc3261) protokolt " +"használja." #: ../gtk/about.ui.h:5 msgid "" @@ -936,342 +918,325 @@ msgid "" "cs: Petr Pisar \n" "hu: anonymous\n" msgstr "" +"francia: Simon Morlat\n" +"angol: Simon Morlat és Delphine Perreau\n" +"olasz: Alberto Zanoni \n" +"német: Jean-Jacques Sarton \n" +"svéd: Daniel Nylander \n" +"spanyol: Jesus Benitez \n" +"japán: YAMAGUCHI YOSHIYA \n" +"brazil-portugál: Rafael Caesar Lenzi \n" +"lengyel: Robert Nasiadek \n" +"cseh: Petr Pisar \n" +"magyar: anonymous és Barczi Viktor \n" #: ../gtk/contact.ui.h:2 -#, fuzzy msgid "SIP Address" -msgstr "Sip cím:" +msgstr "SIP cím" #: ../gtk/contact.ui.h:3 msgid "Show this contact presence status" -msgstr "" +msgstr "A partner jelenlétének mutatása" #: ../gtk/contact.ui.h:4 msgid "Allow this contact to see my presence status" -msgstr "" +msgstr "Megengedem ennek a partnernek, hogy lássa a jelenlétemet" #: ../gtk/contact.ui.h:5 -#, fuzzy msgid "Contact information" -msgstr "Kapcsolatiinformáció" +msgstr "Partner információ" #: ../gtk/log.ui.h:1 msgid "Linphone debug window" -msgstr "" +msgstr "Linphone Hibakereső Ablak" #: ../gtk/log.ui.h:2 msgid "Scroll to end" -msgstr "" +msgstr "Görgetés a végéhez" #: ../gtk/password.ui.h:1 -#, fuzzy msgid "Linphone - Authentication required" -msgstr "Hitelesítést kértek" +msgstr "Linphone - Hitelesítés szükséges" #: ../gtk/password.ui.h:2 msgid "Please enter the domain password" -msgstr "" +msgstr "Kérem adja meg a tartomány jelszavát" #: ../gtk/password.ui.h:3 msgid "UserID" -msgstr "" +msgstr "Felhasználó azonosító" #: ../gtk/call_logs.ui.h:1 -#, fuzzy msgid "Call history" -msgstr "Linphone - Híváselőzmények" +msgstr "Híváselőzmények" #: ../gtk/call_logs.ui.h:2 msgid "Clear all" -msgstr "" +msgstr "Mind törlése" #: ../gtk/call_logs.ui.h:3 -#, fuzzy msgid "Call back" -msgstr "Hivás előzmények" +msgstr "Visszahívás" #: ../gtk/sip_account.ui.h:1 msgid "Linphone - Configure a SIP account" -msgstr "" +msgstr "Linphone - SIP fiók beállítása" #: ../gtk/sip_account.ui.h:2 -#, fuzzy msgid "Your SIP identity:" -msgstr "SIP azonosító:" +msgstr "Az Ön SIP azonosítója:" #: ../gtk/sip_account.ui.h:3 msgid "Looks like sip:@" -msgstr "" +msgstr "Így néz ki: sip:@" #: ../gtk/sip_account.ui.h:4 msgid "sip:" msgstr "sip:" #: ../gtk/sip_account.ui.h:5 -#, fuzzy msgid "SIP Proxy address:" -msgstr "SIP Proxy:" +msgstr "SIP Proxy cím:" #: ../gtk/sip_account.ui.h:6 msgid "Looks like sip:" -msgstr "" +msgstr "Így néz ki: sip:" #: ../gtk/sip_account.ui.h:7 msgid "Route (optional):" msgstr "Út (nem kötelező):" #: ../gtk/sip_account.ui.h:8 -#, fuzzy msgid "Registration duration (sec):" -msgstr "Regisztrálási Időköz:" +msgstr "Regisztrálási Időköz (mp):" #: ../gtk/sip_account.ui.h:9 msgid "Register" -msgstr "" +msgstr "Regisztráció" #: ../gtk/sip_account.ui.h:10 -#, fuzzy msgid "Publish presence information" -msgstr "Jelenléti információ közlése:" +msgstr "Jelenléti információ közlése" #: ../gtk/sip_account.ui.h:11 msgid "Configure a SIP account" -msgstr "" +msgstr "SIP fiók beállítása" #: ../gtk/parameters.ui.h:1 msgid "default soundcard" -msgstr "" +msgstr "alapértelmezett hangkártya" #: ../gtk/parameters.ui.h:2 msgid "a sound card" -msgstr "" +msgstr "egy hangkártya" #: ../gtk/parameters.ui.h:3 msgid "default camera" -msgstr "" +msgstr "alapértelmezett kamera" #: ../gtk/parameters.ui.h:4 msgid "CIF" -msgstr "" +msgstr "CIF" #: ../gtk/parameters.ui.h:5 -#, fuzzy msgid "Audio codecs" -msgstr "Audio kodekek" +msgstr "Audió kódekek" #: ../gtk/parameters.ui.h:6 -#, fuzzy msgid "Video codecs" -msgstr "Audio kodekek" +msgstr "Videó kódekek" #: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 msgid "C" -msgstr "" +msgstr "C" #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" -msgstr "" +msgstr "SIP (UDP)" #: ../gtk/parameters.ui.h:9 msgid "SIP (TCP)" -msgstr "" +msgstr "SIP (TCP)" #: ../gtk/parameters.ui.h:10 msgid "SIP (TLS)" -msgstr "" +msgstr "SIP (TLS)" #: ../gtk/parameters.ui.h:11 msgid "Settings" -msgstr "" +msgstr "Beállítások" #: ../gtk/parameters.ui.h:12 msgid "Set Maximum Transmission Unit:" -msgstr "" +msgstr "Maximum Továbbítási Egység beállítása:" #: ../gtk/parameters.ui.h:13 msgid "Send DTMFs as SIP info" -msgstr "" +msgstr "DTMF küldése SIP infóként" #: ../gtk/parameters.ui.h:14 msgid "Use IPv6 instead of IPv4" -msgstr "" +msgstr "IPv6 használata IPv4 helyett" #: ../gtk/parameters.ui.h:15 -#, fuzzy msgid "Transport" -msgstr "Kapcsolatilista" +msgstr "Átvitel" #: ../gtk/parameters.ui.h:16 msgid "Media encryption type" -msgstr "" +msgstr "Média titkosítás típusa" #: ../gtk/parameters.ui.h:17 msgid "Video RTP/UDP:" -msgstr "" +msgstr "Videó RTP/UDP:" #: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" -msgstr "" +msgstr "Audió RTP/UDP:" #: ../gtk/parameters.ui.h:19 msgid "DSCP fields" -msgstr "" +msgstr "DSCP mezők" #: ../gtk/parameters.ui.h:20 msgid "Fixed" -msgstr "" +msgstr "Javítva" #: ../gtk/parameters.ui.h:21 msgid "Tunnel" -msgstr "" +msgstr "Alagút" #: ../gtk/parameters.ui.h:22 msgid "Media encryption is mandatory" -msgstr "" +msgstr "Média titkosítás kötelező" #: ../gtk/parameters.ui.h:23 msgid "Network protocol and ports" -msgstr "" +msgstr "Hálózati protokoll és port" #: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" -msgstr "" +msgstr "Közvetlen Internet kapcsolat" #: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" -msgstr "" +msgstr "NAT / tűzfal mögött (adja meg az átjáró IP címét)" #: ../gtk/parameters.ui.h:26 -#, fuzzy msgid "Public IP address:" -msgstr "Sip cím:" +msgstr "Publikus IP cím:" #: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" -msgstr "" +msgstr "NAT / tűzfal mögött (STUN használata a feloldáshoz)" #: ../gtk/parameters.ui.h:28 msgid "Behind NAT / Firewall (use ICE)" -msgstr "" +msgstr "NAT / tűzfal mögött (ICE használata)" #: ../gtk/parameters.ui.h:29 msgid "Behind NAT / Firewall (use uPnP)" -msgstr "" +msgstr "NAT / tűzfal mögött (uPnP használata)" #: ../gtk/parameters.ui.h:30 -#, fuzzy msgid "Stun server:" -msgstr "Hang eszköz" +msgstr "STUN kiszolgáló:" #: ../gtk/parameters.ui.h:31 -#, fuzzy msgid "NAT and Firewall" -msgstr "Kapcsolatilista" +msgstr "NAT és tűzfal" #: ../gtk/parameters.ui.h:32 -#, fuzzy msgid "Network settings" -msgstr "Hálózat" +msgstr "Hálózati beállítások" #: ../gtk/parameters.ui.h:33 -#, fuzzy msgid "Ring sound:" msgstr "Csengőhang:" #: ../gtk/parameters.ui.h:34 msgid "ALSA special device (optional):" -msgstr "" +msgstr "Különleges ALSA eszköz (nem kötelező):" #: ../gtk/parameters.ui.h:35 -#, fuzzy msgid "Capture device:" msgstr "Felvevő hang eszköz:" #: ../gtk/parameters.ui.h:36 -#, fuzzy msgid "Ring device:" -msgstr "Csengőhang forrás:" +msgstr "Csengőhang eszköz:" #: ../gtk/parameters.ui.h:37 -#, fuzzy msgid "Playback device:" msgstr "Lejátszó hang eszköz:" #: ../gtk/parameters.ui.h:38 msgid "Enable echo cancellation" -msgstr "" +msgstr "Visszhang-elnyomás engedélyezése" #: ../gtk/parameters.ui.h:39 -#, fuzzy msgid "Audio" -msgstr "Kapcsolatilista" +msgstr "Audió" #: ../gtk/parameters.ui.h:40 -#, fuzzy msgid "Video input device:" -msgstr "Hang eszköz" +msgstr "Videó bemeneti eszköz:" #: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" -msgstr "" +msgstr "Kívánt videó felbontás:" #: ../gtk/parameters.ui.h:42 -#, fuzzy msgid "Video" -msgstr "Kapcsolatilista" +msgstr "Videó" #: ../gtk/parameters.ui.h:43 msgid "Multimedia settings" -msgstr "" +msgstr "Multimédia beállítások" #: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" -msgstr "" +msgstr "Ez a rész határozza meg az Ön SIP címét, amikor nem használ SIP fiókot" #: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" -msgstr "" +msgstr "Az Ön megjelenített neve (pl. Kis József):" #: ../gtk/parameters.ui.h:46 -#, fuzzy msgid "Your username:" -msgstr "felhasználónév:" +msgstr "Az Ön felhasználóneve:" #: ../gtk/parameters.ui.h:47 -#, fuzzy msgid "Your resulting SIP address:" -msgstr "Saját sip cím:" +msgstr "Az Ön így keletkezett SIP címe:" #: ../gtk/parameters.ui.h:48 -#, fuzzy msgid "Default identity" -msgstr "SIP azonosító:" +msgstr "Alapértelmezett identitás" #: ../gtk/parameters.ui.h:49 msgid "Wizard" -msgstr "" +msgstr "Varázsló" #: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Eltávolítás" #: ../gtk/parameters.ui.h:53 -#, fuzzy msgid "Proxy accounts" -msgstr "Kapcsolatilista" +msgstr "Proxy fiókok" #: ../gtk/parameters.ui.h:54 msgid "Erase all passwords" -msgstr "" +msgstr "Minden kulcsszó törlése" #: ../gtk/parameters.ui.h:55 -#, fuzzy msgid "Privacy" -msgstr "Kapcsolatilista" +msgstr "Titoktartás" #: ../gtk/parameters.ui.h:56 msgid "Manage SIP Accounts" -msgstr "" +msgstr "SIP fiókok beállítása" #: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" @@ -1282,80 +1247,72 @@ msgid "Disable" msgstr "Tiltás" #: ../gtk/parameters.ui.h:59 -#, fuzzy msgid "Codecs" -msgstr "Kapcsolatilista" +msgstr "Kódekek" #: ../gtk/parameters.ui.h:60 msgid "0 stands for \"unlimited\"" -msgstr "" +msgstr "A 0 jelentése \"végtelen\"" #: ../gtk/parameters.ui.h:61 -#, fuzzy msgid "Upload speed limit in Kbit/sec:" -msgstr "Feltöltési sávszélesség (kbit/sec):" +msgstr "Feltöltési sebesség korlát (kbit/mp):" #: ../gtk/parameters.ui.h:62 -#, fuzzy msgid "Download speed limit in Kbit/sec:" -msgstr "Letöltési sávszélesség (kbit/sec):" +msgstr "Letöltési sebesség korlát (kbit/mp):" #: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" -msgstr "" +msgstr "Alkalmazkodó mérték-szabályozás engedélyezése" #: ../gtk/parameters.ui.h:64 msgid "" "Adaptive rate control is a technique to dynamically guess the available " "bandwidth during a call." msgstr "" +"Az alkalmazkodó mérték-szabályozás egy módszer, mely erőteljesen próbálja " +"megállapítani a rendelkezésre álló sávszélességet hívás alatt." #: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" -msgstr "" +msgstr "Sávszélesség szabályozása" #: ../gtk/parameters.ui.h:66 -#, fuzzy msgid "Codecs" -msgstr "Kodekek" +msgstr "Kódekek" #: ../gtk/parameters.ui.h:67 -#, fuzzy msgid "Language" -msgstr "Kapcsolatilista" +msgstr "Nyelv" #: ../gtk/parameters.ui.h:68 msgid "Show advanced settings" -msgstr "" +msgstr "Haladó beállítások megjelenítése" #: ../gtk/parameters.ui.h:69 -#, fuzzy msgid "Level" -msgstr "Kapcsolatilista" +msgstr "Szint" #: ../gtk/parameters.ui.h:70 -#, fuzzy msgid "User interface" -msgstr "felhasználónév:" +msgstr "Felhasználói környezet" #: ../gtk/parameters.ui.h:71 -#, fuzzy msgid "Done" -msgstr "Elveszítve" +msgstr "Kész" #: ../gtk/buddylookup.ui.h:1 -#, fuzzy msgid "Search contacts in directory" -msgstr "Kapcsolatiinformáció" +msgstr "Partnerek keresése könyvtárban" #: ../gtk/buddylookup.ui.h:2 msgid "Add to my list" -msgstr "" +msgstr "Hozzáadása a listámhoz" #: ../gtk/buddylookup.ui.h:3 -#, fuzzy msgid "Search somebody" -msgstr "Kapcsolatilista" +msgstr "Keres valakit" #: ../gtk/waiting.ui.h:1 msgid "Linphone" @@ -1363,12 +1320,11 @@ msgstr "Linphone" #: ../gtk/waiting.ui.h:2 msgid "Please wait" -msgstr "" +msgstr "Kérem várjon" #: ../gtk/dscp_settings.ui.h:1 -#, fuzzy msgid "Dscp settings" -msgstr "Hálózat" +msgstr "DSCP beállítások" #: ../gtk/dscp_settings.ui.h:2 msgid "SIP" @@ -1376,80 +1332,75 @@ msgstr "SIP" #: ../gtk/dscp_settings.ui.h:3 msgid "Audio RTP stream" -msgstr "" +msgstr "Audió RTP folyam" #: ../gtk/dscp_settings.ui.h:4 msgid "Video RTP stream" -msgstr "" +msgstr "Videó RTP folyam" #: ../gtk/dscp_settings.ui.h:5 msgid "Set DSCP values (in hexadecimal)" -msgstr "" +msgstr "DSCP értékek beállítása (hexadecimális)" #: ../gtk/call_statistics.ui.h:1 -#, fuzzy msgid "Call statistics" -msgstr "Hivás előzmények" +msgstr "Hívási statisztika" #: ../gtk/call_statistics.ui.h:2 -#, fuzzy msgid "Audio codec" -msgstr "Audio kodekek" +msgstr "Audió kódek" #: ../gtk/call_statistics.ui.h:3 -#, fuzzy msgid "Video codec" -msgstr "Audio kodekek" +msgstr "Videó kódek" #: ../gtk/call_statistics.ui.h:4 msgid "Audio IP bandwidth usage" -msgstr "" +msgstr "Audió IP sávszélesség használat" #: ../gtk/call_statistics.ui.h:5 msgid "Audio Media connectivity" -msgstr "" +msgstr "Audió média kapcsolat" #: ../gtk/call_statistics.ui.h:6 msgid "Video IP bandwidth usage" -msgstr "" +msgstr "Videó IP sávszélesség használat" #: ../gtk/call_statistics.ui.h:7 msgid "Video Media connectivity" -msgstr "" +msgstr "Videó média kapcsolat" #: ../gtk/call_statistics.ui.h:8 -#, fuzzy msgid "Round trip time" -msgstr "Hang beállítások" +msgstr "Körbeérés ideje" #: ../gtk/call_statistics.ui.h:9 -#, fuzzy msgid "Call statistics and information" -msgstr "Kapcsolatiinformáció" +msgstr "Hívási statisztika és információ" #: ../gtk/tunnel_config.ui.h:1 msgid "Configure VoIP tunnel" -msgstr "" +msgstr "VoIP alagút beállítása" #: ../gtk/tunnel_config.ui.h:2 msgid "Host" -msgstr "" +msgstr "Hoszt" #: ../gtk/tunnel_config.ui.h:3 msgid "Port" -msgstr "" +msgstr "Port" #: ../gtk/tunnel_config.ui.h:6 msgid "Configure tunnel" -msgstr "" +msgstr "Alagút beállítása" #: ../gtk/tunnel_config.ui.h:9 msgid "Configure http proxy (optional)" -msgstr "" +msgstr "http proxy beállítása (nem kötelező)" #: ../gtk/keypad.ui.h:1 msgid "D" -msgstr "" +msgstr "D" #: ../gtk/keypad.ui.h:2 msgid "#" @@ -1465,23 +1416,23 @@ msgstr "*" #: ../gtk/keypad.ui.h:6 msgid "9" -msgstr "" +msgstr "9" #: ../gtk/keypad.ui.h:7 msgid "8" -msgstr "" +msgstr "8" #: ../gtk/keypad.ui.h:8 msgid "7" -msgstr "" +msgstr "7" #: ../gtk/keypad.ui.h:9 msgid "B" -msgstr "" +msgstr "B" #: ../gtk/keypad.ui.h:10 msgid "6" -msgstr "" +msgstr "6" #: ../gtk/keypad.ui.h:11 msgid "5" @@ -1489,19 +1440,19 @@ msgstr "5" #: ../gtk/keypad.ui.h:12 msgid "4" -msgstr "" +msgstr "4" #: ../gtk/keypad.ui.h:13 msgid "A" -msgstr "" +msgstr "A" #: ../gtk/keypad.ui.h:14 msgid "3" -msgstr "" +msgstr "3" #: ../gtk/keypad.ui.h:15 msgid "2" -msgstr "" +msgstr "2" #: ../gtk/keypad.ui.h:16 msgid "1" @@ -1562,49 +1513,44 @@ msgid "Contacting" msgstr "Kapcsolódás" #: ../coreapi/linphonecore.c:2439 -#, fuzzy msgid "Could not call" -msgstr "nem sikerült hívni" +msgstr "Nem sikerült hívni" #: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" -msgstr "" +msgstr "Elnézést, elértük a egyidejű hívások maximális számát" #: ../coreapi/linphonecore.c:2731 -#, fuzzy msgid "is contacting you" -msgstr "kapcsolatba lép veled." +msgstr "kapcsolatba lépett veled." #: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." -msgstr "" +msgstr "és automatikus választ kért." #: ../coreapi/linphonecore.c:2732 msgid "." -msgstr "" +msgstr "." #: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." -msgstr "" +msgstr "A hívási jellemzők módosítása..." #: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Kapcsolódva." #: ../coreapi/linphonecore.c:3166 -#, fuzzy msgid "Call aborted" -msgstr "megszakítva" +msgstr "Hívás megszakítva" #: ../coreapi/linphonecore.c:3351 -#, fuzzy msgid "Could not pause the call" -msgstr "nem sikerült hívni" +msgstr "Nem sikerült várakoztatni a hívást" #: ../coreapi/linphonecore.c:3356 -#, fuzzy msgid "Pausing the current call..." -msgstr "nem sikerült hívni" +msgstr "Jelenlegi hívás várakoztatásának aktiválása..." #: ../coreapi/misc.c:148 msgid "" @@ -1636,7 +1582,7 @@ msgstr "Stun keresés folyamatban..." #: ../coreapi/misc.c:630 msgid "ICE local candidates gathering in progress..." -msgstr "" +msgstr "ICE helyi jelentkezők begyűjtése folyamatban..." #: ../coreapi/friend.c:33 msgid "Online" @@ -1647,21 +1593,18 @@ msgid "Busy" msgstr "Foglalt" #: ../coreapi/friend.c:39 -#, fuzzy msgid "Be right back" -msgstr "Legyen igazad" +msgstr "Mindjárt visszajön" #: ../coreapi/friend.c:42 msgid "Away" msgstr "Nem elérhető" #: ../coreapi/friend.c:45 -#, fuzzy msgid "On the phone" -msgstr "Telefonál" +msgstr "Vonalban" #: ../coreapi/friend.c:48 -#, fuzzy msgid "Out to lunch" msgstr "Ebédelni ment" @@ -1670,95 +1613,94 @@ msgid "Do not disturb" msgstr "Ne zavarj" #: ../coreapi/friend.c:54 -#, fuzzy msgid "Moved" -msgstr "Kodekek" +msgstr "Elment" #: ../coreapi/friend.c:57 msgid "Using another messaging service" -msgstr "" +msgstr "Másik üzenő szolgáltatás használata" #: ../coreapi/friend.c:60 -#, fuzzy msgid "Offline" -msgstr "Elérhető" +msgstr "Nem elérhető" #: ../coreapi/friend.c:63 msgid "Pending" -msgstr "" +msgstr "Függőben" #: ../coreapi/friend.c:66 msgid "Unknown-bug" -msgstr "" +msgstr "Ismeretlen programhiba" #: ../coreapi/proxy.c:204 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "" +"Az Ön által megadott SIP proxy cím érvénytelen. \"sip:\"-tal kell kezdődnie, " +"ezt egy hosztnév követi." #: ../coreapi/proxy.c:210 msgid "" "The sip identity you entered is invalid.\n" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" +"Az Ön által megadott SIP identitás érvénytelen.\n" +"Így kéne kinéznie: sip:felhasznalonev@proxytartomany, például sip:" +"aladar@pelda.hu" #: ../coreapi/proxy.c:1068 -#, fuzzy, c-format +#, c-format msgid "Could not login as %s" -msgstr "Nemtalálható a pixmap fájl: %s" +msgstr "Nem sikerült belépni ezzel: %s" #: ../coreapi/callbacks.c:283 -#, fuzzy msgid "Remote ringing." -msgstr "Távoli szolgáltatások" +msgstr "Távoli csengés." #: ../coreapi/callbacks.c:303 -#, fuzzy msgid "Remote ringing..." -msgstr "Távoli szolgáltatások" +msgstr "Távoli csengés..." #: ../coreapi/callbacks.c:314 msgid "Early media." msgstr "Korai médiák." #: ../coreapi/callbacks.c:365 -#, fuzzy, c-format +#, c-format msgid "Call with %s is paused." -msgstr "Chat-elés %s -el" +msgstr "A hívás a következővel: %s várakoztatva" #: ../coreapi/callbacks.c:378 #, c-format msgid "Call answered by %s - on hold." -msgstr "" +msgstr "%s fogadta a hívást - várakoztatva." #: ../coreapi/callbacks.c:389 -#, fuzzy msgid "Call resumed." -msgstr "Hívás vége" +msgstr "Hívás visszatért" #: ../coreapi/callbacks.c:394 -#, fuzzy, c-format +#, c-format msgid "Call answered by %s." -msgstr "" -"Hívás vagy\n" -"Válasz" +msgstr "%s válaszolt a hívásra." #: ../coreapi/callbacks.c:409 msgid "Incompatible, check codecs or security settings..." msgstr "" +"Nem kompatibilis, ellenőrizze a kódek- vagy a biztonsági beállításokat..." #: ../coreapi/callbacks.c:457 msgid "We have been resumed." -msgstr "" +msgstr "Visszatértünk." #: ../coreapi/callbacks.c:466 msgid "We are paused by other party." -msgstr "" +msgstr "Megállítva a másik fél által." #: ../coreapi/callbacks.c:472 msgid "Call is updated by remote." -msgstr "" +msgstr "A hívás távolról frissítve." #: ../coreapi/callbacks.c:541 msgid "Call terminated." @@ -1782,27 +1724,24 @@ msgid "Call declined." msgstr "Hívás elutasítva" #: ../coreapi/callbacks.c:568 -#, fuzzy msgid "No response." -msgstr "időtúllépés után nincs válasz" +msgstr "Nincs válasz." #: ../coreapi/callbacks.c:572 msgid "Protocol error." -msgstr "" +msgstr "Protokol hiba." #: ../coreapi/callbacks.c:588 -#, fuzzy msgid "Redirected" -msgstr "Átirányítva idw %s..." +msgstr "Átirányítva" #: ../coreapi/callbacks.c:624 msgid "Incompatible media parameters." -msgstr "" +msgstr "Nem kompatibilis médiajellemzők." #: ../coreapi/callbacks.c:630 -#, fuzzy msgid "Call failed." -msgstr "Hívás elutasítva" +msgstr "Nem sikerült a hívás." #: ../coreapi/callbacks.c:733 #, c-format @@ -1810,9 +1749,9 @@ msgid "Registration on %s successful." msgstr "A regisztáció a %s -n sikerült." #: ../coreapi/callbacks.c:734 -#, fuzzy, c-format +#, c-format msgid "Unregistration on %s done." -msgstr "A regisztáció a %s -n sikerült." +msgstr "A kiregisztrálás kész a következőn: %s ." #: ../coreapi/callbacks.c:754 msgid "no response timeout" @@ -1824,16 +1763,15 @@ msgid "Registration on %s failed: %s" msgstr "A regisztáció a %s -n nem sikerült: %s" #: ../coreapi/linphonecall.c:129 -#, fuzzy, c-format +#, c-format msgid "Authentication token is %s" -msgstr "Hitelesítési információ" +msgstr "Hitelesítési jel: %s" #: ../coreapi/linphonecall.c:2314 -#, fuzzy, c-format +#, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." -msgstr[0] "Van %i elhibázott hivás." -msgstr[1] "Van %i elhibázott hivás." +msgstr[0] "Van %i nem fogadott hivás." #~ msgid "Chat with %s" #~ msgstr "Chat-elés %s -el" From 12a6e42e5a4f2d7239ca0b527e334841e9bba9ff Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 2 Apr 2013 15:23:29 +0200 Subject: [PATCH 166/281] Allow uPnP 1.0 uuid --- coreapi/upnp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 75d0ef9e2..ec7d1f9c6 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -31,7 +31,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define UPNP_CORE_READY_CHECK 1 #define UPNP_CORE_RETRY_DELAY 4 #define UPNP_CALL_RETRY_DELAY 1 -#define UPNP_UUID_LEN 32 +#define UPNP_UUID_LEN 128 #define UPNP_UUID_LEN_STR UPNP_TOSTRING(UPNP_UUID_LEN) /* * uPnP Definitions @@ -1236,7 +1236,7 @@ static void linphone_upnp_config_list_port_bindings_cb(const char *entry, struct bool_t valid = TRUE; UpnpPortBinding *port; - ret = sscanf(entry, "%"UPNP_UUID_LEN_STR"s-%3s-%i-%i", device_id, protocol_str, &external_port, &local_port); + ret = sscanf(entry, "%"UPNP_UUID_LEN_STR"[^-]-%3s-%i-%i", device_id, protocol_str, &external_port, &local_port); if(ret == 4) { // Handle only wanted device bindings if(device_id != NULL && strcmp(cookie->device_id, device_id) != 0) { From 00c725bcebe3436146feda79297785ffd7a702cd Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 2 Apr 2013 15:41:14 +0200 Subject: [PATCH 167/281] Use correct mode parameter to fopen() call ("r+" instead of "rw"). --- coreapi/lpconfig.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/lpconfig.c b/coreapi/lpconfig.c index db4e5de5c..dd3de63db 100644 --- a/coreapi/lpconfig.c +++ b/coreapi/lpconfig.c @@ -215,7 +215,7 @@ LpConfig * lp_config_new(const char *filename){ if (filename!=NULL){ ms_message("Using (r/w) config information from %s", filename); lpconfig->filename=ortp_strdup(filename); - lpconfig->file=fopen(filename,"rw"); + lpconfig->file=fopen(filename,"r+"); if (lpconfig->file!=NULL){ struct stat fileStat; lp_config_parse(lpconfig,lpconfig->file); From 1736d38e98260bd8441a90e549260ddda8d2243d Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 3 Apr 2013 18:15:59 +0200 Subject: [PATCH 168/281] javadoc enhancements --- coreapi/linphonecore.h | 62 +++- .../org/linphone/core/CallDirection.java | 10 +- .../org/linphone/core/LinphoneAddress.java | 29 +- .../org/linphone/core/LinphoneAuthInfo.java | 2 +- .../org/linphone/core/LinphoneCallLog.java | 20 +- .../org/linphone/core/LinphoneCore.java | 310 +++++++++++++++--- .../linphone/core/LinphoneCoreFactory.java | 6 + .../org/linphone/core/LinphoneCoreImpl.java | 21 +- 8 files changed, 385 insertions(+), 75 deletions(-) diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index ab8836a5d..241813790 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -47,12 +47,29 @@ typedef struct _LinphoneCore LinphoneCore; struct _LpConfig; -struct _LCSipTransports{ +/** + * Linphone core SIP transport ports. + * Use with #linphone_core_set_sip_transports + * @ingroup initializing + */ +typedef struct _LCSipTransports{ + /** + * udp port to listening on, negative value if not set + * */ int udp_port; + /** + * tcp port to listening on, negative value if not set + * */ int tcp_port; + /** + * dtls port to listening on, negative value if not set + * */ int dtls_port; + /** + * tls port to listening on, negative value if not set + * */ int tls_port; -}; +} LCSipTransports; typedef struct _LCSipTransports LCSipTransports; @@ -934,7 +951,12 @@ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const Linpho int linphone_core_defer_call_update(LinphoneCore *lc, LinphoneCall *call); int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params); - +/** + * @ingroup media_parameters + * Get default call parameters reflecting current linphone core configuration + * @param LinphoneCore object + * @return LinphoneCallParams + */ LinphoneCallParams *linphone_core_create_default_call_parameters(LinphoneCore *lc); LinphoneCall *linphone_core_get_call_by_remote_address(LinphoneCore *lc, const char *remote_address); @@ -982,16 +1004,23 @@ const MSList *linphone_core_get_video_codecs(const LinphoneCore *lc); int linphone_core_set_video_codecs(LinphoneCore *lc, MSList *codecs); bool_t linphone_core_payload_type_enabled(LinphoneCore *lc, const PayloadType *pt); - +/** + * Enable payload type + * @param linphone core + * @param pt payload type to enable, can be retrieve from #linphone_core_find_payload_type + * @param TRUE if enabled + * @return 0 if succed + * + */ int linphone_core_enable_payload_type(LinphoneCore *lc, PayloadType *pt, bool_t enable); /** - * Wildcard value used by #linphone_core_find_payload_type to ignore rate in search algirithm + * Wildcard value used by #linphone_core_find_payload_type to ignore rate in search algorithm * @ingroup media_parameters */ #define LINPHONE_FIND_PAYLOAD_IGNORE_RATE -1 /** - * Wildcard value used by #linphone_core_find_payload_type to ignore channel in search algirithm + * Wildcard value used by #linphone_core_find_payload_type to ignore channel in search algorithm * @ingroup media_parameters */ #define LINPHONE_FIND_PAYLOAD_IGNORE_CHANNELS -1 @@ -1370,7 +1399,13 @@ void linphone_core_refresh_registers(LinphoneCore* lc); /* Path to the file storing secrets cache */ void linphone_core_set_zrtp_secrets_file(LinphoneCore *lc, const char* file); const char *linphone_core_get_zrtp_secrets_file(LinphoneCore *lc); - +/** + * Search from the list of current calls if a remote address match uri + * @ingroup call_control + * @param lc + * @param uri which should match call remote uri + * @return LinphoneCall or NULL is no match is found + */ const LinphoneCall* linphone_core_find_call_from_uri(LinphoneCore *lc, const char *uri); int linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call); @@ -1385,8 +1420,19 @@ int linphone_core_terminate_conference(LinphoneCore *lc); int linphone_core_get_conference_size(LinphoneCore *lc); int linphone_core_start_conference_recording(LinphoneCore *lc, const char *path); int linphone_core_stop_conference_recording(LinphoneCore *lc); - +/** + * Get the maximum number of simultaneous calls Linphone core can manage at a time. All new call above this limit are declined with a busy answer + * @ingroup initializing + * @param lc core + * @return max number of simultaneous calls + */ int linphone_core_get_max_calls(LinphoneCore *lc); +/** + * Set the maximum number of simultaneous calls Linphone core can manage at a time. All new call above this limit are declined with a busy answer + * @ingroup initializing + * @param lc core + * @param max number of simultaneous calls + */ void linphone_core_set_max_calls(LinphoneCore *lc, int max); bool_t linphone_core_sound_resources_locked(LinphoneCore *lc); diff --git a/java/common/org/linphone/core/CallDirection.java b/java/common/org/linphone/core/CallDirection.java index 142708cc2..40a5e32d9 100644 --- a/java/common/org/linphone/core/CallDirection.java +++ b/java/common/org/linphone/core/CallDirection.java @@ -18,9 +18,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone.core; - +/** + * Enum representing the direction of a call. +**/ public class CallDirection { + /** + * outgoing calls* + * */ public static CallDirection Outgoing = new CallDirection("CallOutgoing"); + /** + * incoming calls + */ public static CallDirection Incoming = new CallDirection("Callincoming"); private String mStringValue; private CallDirection(String aStringValue) { diff --git a/java/common/org/linphone/core/LinphoneAddress.java b/java/common/org/linphone/core/LinphoneAddress.java index b2a2c9380..fe5164b01 100644 --- a/java/common/org/linphone/core/LinphoneAddress.java +++ b/java/common/org/linphone/core/LinphoneAddress.java @@ -39,21 +39,48 @@ public interface LinphoneAddress { */ public String getUserName(); /** - * + * Domain name * @return null if not set */ public String getDomain(); + /** + * Port as String + * @return null if not set + */ public String getPort(); + /** + * Port as integer value. + * @return negative value if not set if not set + */ public int getPortInt(); /** * set display name * @param name */ public void setDisplayName(String name); + /** + * set user name + * @param username + */ public void setUserName(String username); + /** + * set domain name + * @param domain + */ public void setDomain(String domain); + /** + * set port as String + * @param port, null if not set + */ public void setPort(String port); + /** + * set port as int + * @param port, negative value if not set + */ public void setPortInt(int port); + /** + * Removes address's tags and uri headers so that it is displayable to the user. + **/ public void clean(); /** diff --git a/java/common/org/linphone/core/LinphoneAuthInfo.java b/java/common/org/linphone/core/LinphoneAuthInfo.java index ed8a84017..0213720eb 100644 --- a/java/common/org/linphone/core/LinphoneAuthInfo.java +++ b/java/common/org/linphone/core/LinphoneAuthInfo.java @@ -20,7 +20,7 @@ package org.linphone.core; /** * Object holding authentication information. * In most case, authentication information consists of a username and password. Sometimes, a userid is required by proxy, and realm can be useful to discriminate different SIP domains. - *
This object is instanciated using {@link LinphoneCoreFactory#createAuthInfo(String, String, String)}. + *
This object is instantiated using either {@link LinphoneCoreFactory#createAuthInfo(String, String, String)} or {@link LinphoneCoreFactory#createAuthInfo(String, String, String, String, String)}. *
*Once created and filled, a LinphoneAuthInfo must be added to the LinphoneCore in order to become known and used automatically when needed. *Use {@link LinphoneCore#addAuthInfo(LinphoneAuthInfo)} for that purpose. diff --git a/java/common/org/linphone/core/LinphoneCallLog.java b/java/common/org/linphone/core/LinphoneCallLog.java index 2e839234f..f1dd742b3 100644 --- a/java/common/org/linphone/core/LinphoneCallLog.java +++ b/java/common/org/linphone/core/LinphoneCallLog.java @@ -24,7 +24,11 @@ package org.linphone.core; import java.util.Vector; - +/** + * Object representing a call log. + * + * +**/ public interface LinphoneCallLog { /** * Represents call status @@ -91,26 +95,30 @@ public interface LinphoneCallLog { public CallDirection getDirection(); /** * get status of this call - * @return + * @return CallStatus */ public CallStatus getStatus(); /** - * @return a human readble String with the start date/time of the call + * A human readable String with the start date/time of the call + * @return String */ public String getStartDate(); /** - * @return a timestamp of the start date/time of the call in milliseconds since January 1st 1970 + * A timestamp of the start date/time of the call in milliseconds since January 1st 1970 + * @return long */ public long getTimestamp(); /** - * @return the call duration, in seconds + * The call duration, in seconds + * @return int */ public int getCallDuration(); /** - * @return the call id from signaling + * Call id from signaling + * @return int */ public int getCallId(); } diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index ab25520a4..144b7dfe2 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -20,6 +20,9 @@ package org.linphone.core; import java.util.Vector; +import org.linphone.core.LinphoneCall.State; +import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration; + /** * Linphone core main object created by method {@link LinphoneCoreFactory#createLinphoneCore(LinphoneCoreListener, String, String, Object)}. * @@ -172,11 +175,22 @@ public interface LinphoneCore { } /** - * Signaling transports ports. + * Linphone core SIP transport ports. + * Use with {@link LinphoneCore#setSignalingTransportPorts(Transports)} + * @ingroup initializing */ static public class Transports { + /** + * udp port to listening on, negative value if not set + * */ public int udp; + /** + * tcp port to listening on, negative value if not set + * */ public int tcp; + /** + * tls port to listening on, negative value if not set + * */ public int tls; public Transports() {}; @@ -389,10 +403,10 @@ public interface LinphoneCore { public LinphoneCall invite(String destination)throws LinphoneCoreException; /** * Initiates an outgoing call given a destination LinphoneAddress - *
The LinphoneAddress can be constructed directly using linphone_address_new(), or created by linphone_core_interpret_url(). The application doesn't own a reference to the returned LinphoneCall object. Use linphone_call_ref() to safely keep the LinphoneCall pointer valid within your application. + *
The LinphoneAddress can be constructed directly using {@link LinphoneCoreFactory#createLinphoneAddress} , or created {@link LinphoneCore#interpretUrl(String)}. . * @param to the destination of the call (sip address). - * @return LinphoneCall - * @throws LinphoneCoreException + * @return linphone call + * @throws LinphoneCoreException if linphone call cannot be created */ public LinphoneCall invite(LinphoneAddress to)throws LinphoneCoreException; /** @@ -402,6 +416,8 @@ public interface LinphoneCore { public void terminateCall(LinphoneCall aCall); /** * Declines an incoming call, providing a reason for declining it. + * @param call the LinphoneCall, must be in the {@link LinphoneCall.State#IncomingReceived} state. + * @param reason the reason for rejecting the call: {@link Reason#Declined} or {@link Reason#Busy} */ public void declineCall(LinphoneCall aCall, Reason reason); /** @@ -417,7 +433,7 @@ public interface LinphoneCore { public LinphoneAddress getRemoteAddress(); /** * - * @return TRUE if there is a call running or pending. + * @return true if there is a call running or pending. */ public boolean isIncall(); /** @@ -482,8 +498,6 @@ public interface LinphoneCore { */ public void deferCallUpdate(LinphoneCall aCall) throws LinphoneCoreException; - public void startRinging(); - /** * @return a list of LinphoneCallLog */ @@ -499,7 +513,7 @@ public interface LinphoneCore { */ public void setNetworkReachable(boolean isReachable); /** - * + * Get network state has known by {@link LinphoneCore} * @return if false, there is no network connection. */ public boolean isNetworkReachable(); @@ -541,16 +555,16 @@ public interface LinphoneCore { /** * Initiate a dtmf signal if in call - * @param number + * @param send dtmf ['0'..'9'] | '#', '*' */ void sendDtmf(char number); /** * Initiate a dtmf signal to the speaker if not in call. * Sending of the DTMF is done in another function. - * @param number + * @param dtmf ['0'..'9'] | '#', '*' * @param duration in ms , -1 for unlimited */ - void playDtmf(char number,int duration); + void playDtmf(char dtmf,int duration); /** * stop current dtmf */ @@ -560,23 +574,43 @@ public interface LinphoneCore { * remove all call logs */ void clearCallLogs(); - /*** - * get payload type from mime type, clock rate, and number of channels.- - * - * return null if not found - */ + + + + + /** + * Get payload type from mime type and clock rate + * + * This function searches in audio and video codecs for the given payload type name and clockrate. + * @param mime payload mime type (I.E SPEEX, PCMU, VP8) + * @param clockRate (I.E 8000, 16000, 90000, ...) + * @param channels number of channels + * @return Returns null if not found. + */ PayloadType findPayloadType(String mime, int clockRate, int channels); /*** * get payload type from mime type and clock rate.. - * - * return null if not found + * Same as @{link {@link #findPayloadType(String, int, int)} but ignoring channels params + * @param mime payload mime type (I.E SPEEX, PCMU, VP8) + * @param clockRate (I.E 8000, 16000, 90000, ...) + * @return null if not found */ PayloadType findPayloadType(String mime, int clockRate); + + /*** + * get payload type from mime type + * Same as @{link {@link #findPayloadType(String, int, int)} but ignoring channels and clock rate params + * @param mime payload mime type (I.E SPEEX, PCMU, VP8) + * @return null if not found + */ + PayloadType findPayloadType(String mime); + /** - * not implemented yet - * @param pt - * @param enable - * @throws LinphoneCoreException + * Enable payload type + * @param pt payload type to enable, can be retrieve from {@link #findPayloadType} + * @param true if enabled + * @exception LinphoneCoreException + * */ void enablePayloadType(PayloadType pt, boolean enable) throws LinphoneCoreException; /** @@ -595,10 +629,11 @@ public interface LinphoneCore { */ boolean isEchoLimiterEnabled(); /** - * @param transports used for signaling (TCP, UDP and TLS) + * Set transport ports linphone core will listen on + * @param local transports ports used for signaling (TCP, UDP and TLS) */ void setSignalingTransportPorts(Transports transports); - /** + /**Get * @return transports used for signaling (TCP, UDP, TLS) */ Transports getSignalingTransportPorts(); @@ -632,12 +667,36 @@ public interface LinphoneCore { * @return {@link LinphoneChatRoom} where messaging can take place. */ LinphoneChatRoom createChatRoom(String to); - + /** + * Set the native video window id where the video is to be displayed. + * On Android, it must be of type {@link AndroidVideoWindowImpl} + * @param video window of type {@link AndroidVideoWindowImpl} + **/ void setVideoWindow(Object w); + /** + * Set the native video window id where the video preview is to be displayed. + * On Android, it must of type {@link SurfaceView} + * @param video window of type {@link SurfaceView} + **/ void setPreviewWindow(Object w); + /** + * Tells the core the device current orientation. This can be used by capture filters + * on mobile devices to select between portrait/landscape mode and to produce properly + * oriented images. The exact meaning of the value in rotation if left to each device + * specific implementations. + *@param rotation . Android supported values are 0, 90, 180 and 270. + * + **/ void setDeviceRotation(int rotation); - + /** + * Sets the active video device. + * + * @param id of the video device as returned by {@link AndroidCameraConfiguration#retrieveCameras} + **/ void setVideoDevice(int id); + /** + * Returns the id of the currently active video device as found in {@link AndroidCameraConfiguration#retrieveCameras}. + **/ int getVideoDevice(); /** @@ -665,6 +724,7 @@ public interface LinphoneCore { */ void setStunServer(String stun_server); /** + * Get STUN server * @return stun server address if previously set. */ String getStunServer(); @@ -678,11 +738,35 @@ public interface LinphoneCore { * @return previously set firewall policy. */ FirewallPolicy getFirewallPolicy(); - + /** + * Initiates an outgoing call given a destination LinphoneAddress + * + * @param addr the destination of the call {@link #LinphoneAddress }. + * @param params call parameters {@link #LinphoneCallParams } + * + *
The LinphoneAddress can be constructed directly using {@link LinphoneCoreFactory#createLinphoneAddress} , or created {@link LinphoneCore#interpretUrl(String)}. . + * + * @return a {@link #LinphoneCall LinphoneCall} object + * @throws LinphoneCoreException in case of failure + **/ LinphoneCall inviteAddressWithParams(LinphoneAddress destination, LinphoneCallParams params) throws LinphoneCoreException ; - + /** + * Updates a running call according to supplied call parameters or parameters changed in the LinphoneCore. + * + * In this version this is limited to the following use cases: + * - setting up/down the video stream according to the video parameter of the {@link LinphoneCallParams} (see {@link LinphoneCallParams#enableVideo} ). + * - changing the size of the transmitted video after calling {@link LinphoneCore#setPreferredVideoSize(VideoSize)} + * + * In case no changes are requested through the {@link LinphoneCallParams} argument, then this argument can be omitted and set to null. + * @param call the {@link LinphoneCall} to be updated + * @param params the new {@link LinphoneCallParams call parameters} to use. (may be NULL) + * @return 0 if successful, -1 otherwise. + **/ int updateCall(LinphoneCall call, LinphoneCallParams params); - + /** + * Get default call parameters reflecting current linphone core configuration + * @return LinphoneCallParams + */ LinphoneCallParams createDefaultCallParameters(); /** @@ -694,7 +778,7 @@ public interface LinphoneCore { /** * gets the path to a wav file used for ringing. * - * @param null if not set + * @return null if not set */ String getRing(); @@ -706,7 +790,18 @@ public interface LinphoneCore { void setRootCA(String path); void setUploadBandwidth(int bw); - + /** + * Sets maximum available download bandwidth + * + * + * This is IP bandwidth, in kbit/s. + * This information is used signaled to other parties during + * calls (within SDP messages) so that the remote end can have + * sufficient knowledge to properly configure its audio & video + * codec output bitrate to not overflow available bandwidth. + * + * @param bw the bandwidth in kbits/s, 0 for infinite + */ void setDownloadBandwidth(int bw); /** @@ -720,9 +815,20 @@ public interface LinphoneCore { * @param ptime packetization interval in milliseconds */ void setUploadPtime(int ptime); - + /** + * Sets the preferred video size. + * + * This applies only to the stream that is captured and sent to the remote party, + * since we accept all standard video size on the receive path. + * @param vSize + * + **/ void setPreferredVideoSize(VideoSize vSize); - + /** + * get current preferred video size for sending. + * @return video size + * + **/ VideoSize getPreferredVideoSize(); /** @@ -766,13 +872,18 @@ public interface LinphoneCore { void adjustSoftwareVolume(int i); /** - * Pause a call. + * Pauses a call. If a music file has been setup using {@link LinphoneCore#setPlayFile(String)}, + * this file will be played to the remote user. + * **/ boolean pauseCall(LinphoneCall call); /** * Resume a call. **/ boolean resumeCall(LinphoneCall call); + /** + * Pause all currently running calls. + **/ boolean pauseAllCalls(); void setZrtpSecretsCache(String file); @@ -783,33 +894,75 @@ public interface LinphoneCore { **/ boolean isInConference(); /** - * Connect the local user to the conference. + * Moves the local participant inside the conference. + * + * Makes the local participant to join the conference. + * Typically, the local participant is by default always part of the conference when joining an active call into a conference. + * However, by calling {@link #leaveConference()} and {@link #enterConference()} the application can decide to temporarily + * move out and in the local participant from the conference. + * + * @returns true if successful **/ boolean enterConference(); /** - * Disconnect the local user from the conference. + * Moves the local participant out of the conference. + * When the local participant is out of the conference, the remote participants can continue to talk normally. **/ void leaveConference(); /** - * Add an established call to the conference. The LinphoneCore is able to manage one client based conference. + * Merge a call into a conference. + * + * If this is the first call that enters the conference, the virtual conference will be created automatically. + * If the local user was actively part of the call (ie not in paused state), then the local user is automatically entered into the conference. + * If the call was in paused state, then it is automatically resumed when entering into the conference. + * @param call an established call, either in {@link LinphoneCall.State#StreamsRunning} or {@link LinphoneCall.State#Paused} state. + * **/ void addToConference(LinphoneCall call); /** - * Remove an established call from the conference. - **/ + * Remove a call from the conference. + * @param call a call that has been previously merged into the conference. + * + * After removing the remote participant belonging to the supplied call, the call becomes a normal call in paused state. + * If one single remote participant is left alone together with the local user in the conference after the removal, then the conference is + * automatically transformed into a simple call in StreamsRunning state. + * The conference's resources are then automatically destroyed. + * + * In other words, unless {@link #leaveConference()} is explicitely called, the last remote participant of a conference is automatically + * put in a simple call in running state. + * + **/ void removeFromConference(LinphoneCall call); + /** + * Add all calls into a conference. + * + * Merge all established calls (either in {@link LinphoneCall.State#StreamsRunning} or {@link LinphoneCall.State#Paused}) into a conference. + * + **/ void addAllToConference(); /** - * Terminate the conference, all users are disconnected. + * Terminates the conference and the calls associated with it. + * + * All the calls that were merged to the conference are terminated, and the conference resources are destroyed. + * **/ void terminateConference(); + /** + * Returns the number of participants to the conference, including the local participant. + * + * Typically, after merging two calls into the conference, there is total of 3 participants: + * the local participant (or local user), and two remote participants that were the destinations of the two previously establised calls. + * + * @returns the number of participants to the conference + **/ int getConferenceSize(); /** * Request recording of the conference into a supplied file path. * The format is wav. + * @param path where to write recording file **/ void startConferenceRecording(String path); @@ -817,22 +970,60 @@ public interface LinphoneCore { * Stop recording of the conference. **/ void stopConferenceRecording(); - + /** + * Terminates all the calls. + */ void terminateAllCalls(); /** * Returns all calls. + * @return an array with all call currently handle by Linphone core **/ LinphoneCall[] getCalls(); + /** + * Get number of calls currently handled by Linphone core + * @returns number of calls + * */ int getCallsNb(); - + /** + * Performs a simple call transfer to the specified destination. + * + * @param call The current local call remains active and thus can be later paused or terminated. + * @param referTo The remote call party endpoint is expected to issue a new call to this specified destination. + **/ void transferCall(LinphoneCall call, String referTo); + /** + * Transfer a call to destination of another running call. This is used for "attended transfer" scenarios. + * The transfered call is supposed to be in paused state, so that it is able to accept the transfer immediately. + * The destination call is a call previously established to introduce the transfered person. + * This method will send a transfer request to the transfered person. The phone of the transfered is then + * expected to automatically call to the destination of the transfer. The receiver of the transfer will then automatically + * close the call with us (the 'dest' call). + * @param call a running call you want to transfer + * @param dest a running call whose remote person will receive the transfer + **/ void transferCallToAnother(LinphoneCall callToTransfer, LinphoneCall destination); - + /** + * Search from the list of current calls if a remote address match uri + * @param uri which should match call remote uri + * @return LinphoneCall or NULL is no match is found + */ LinphoneCall findCallFromUri(String uri); - + /** + * Get the maximum number of simultaneous calls Linphone core can manage at a time. All new call above this limit are declined with a busy answer + * @return max number of simultaneous calls + */ int getMaxCalls(); + /** + * Set the maximum number of simultaneous calls Linphone core can manage at a time. All new call above this limit are declined with a busy answer + * @param max number of simultaneous calls + */ void setMaxCalls(int max); + /** + * @deprecated + * @param uri + * @return + */ boolean isMyself(String uri); /** @@ -884,15 +1075,31 @@ public interface LinphoneCore { void tunnelAddServerAndMirror(String host, int port, int udpMirrorPort, int roundTripDelay); boolean isTunnelAvailable(); - + /** + * Returns an unmodifiable list of entered proxy configurations. + * @return list of proxy config + **/ LinphoneProxyConfig[] getProxyConfigList(); - + /** + * Sets the default policy for video. + * This policy defines whether: + * @param autoInitiate video shall be initiated by default for outgoing calls + * @param autoAccept video shall be accepter by default for incoming calls + **/ void setVideoPolicy(boolean autoInitiate, boolean autoAccept); - + /** Set static picture to be used when "Static picture" is the video device + * @param path to the static picture file + * */ void setStaticPicture(String path); - + /** + * Sets the user agent string used in SIP messages. + * @param user agent name + * @param user agent version + **/ void setUserAgent(String name, String version); - + /** + * Set the number of cores used for media processing + * */ void setCpuCount(int count); /** @@ -961,7 +1168,10 @@ public interface LinphoneCore { * Once this time is elapsed (ringing included), the call is automatically hung up. **/ void setInCallTimeout(int timeout); - + /** + * Allow to control microphone level: + * @param gain in db + **/ void setMicrophoneGain(float gain); /** diff --git a/java/common/org/linphone/core/LinphoneCoreFactory.java b/java/common/org/linphone/core/LinphoneCoreFactory.java index ea325057e..5e8637999 100644 --- a/java/common/org/linphone/core/LinphoneCoreFactory.java +++ b/java/common/org/linphone/core/LinphoneCoreFactory.java @@ -48,6 +48,12 @@ abstract public class LinphoneCoreFactory { } return theLinphoneCoreFactory; } + /** + * create {@link LinphoneAuthInfo} + * @param username + * @param userid user id as set in auth header + * @param passwd + * */ abstract public LinphoneAuthInfo createAuthInfo(String username,String password, String realm); /** * create {@link LinphoneAuthInfo} diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java index 5a52f7559..0b4c984d6 100644 --- a/java/impl/org/linphone/core/LinphoneCoreImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java @@ -745,12 +745,6 @@ class LinphoneCoreImpl implements LinphoneCore { deferCallUpdate(nativePtr, getCallPtr(aCall)); } - public synchronized void startRinging() { - if (!contextInitialized()) return; - if (Hacks.needGalaxySAudioHack()) { - mAudioManager.setMode(MODE_RINGTONE); - } - } private native void setVideoPolicy(long nativePtr, boolean autoInitiate, boolean autoAccept); public synchronized void setVideoPolicy(boolean autoInitiate, boolean autoAccept) { @@ -801,10 +795,17 @@ class LinphoneCoreImpl implements LinphoneCore { public String getVersion() { return getVersion(nativePtr); } - + /** + * Wildcard value used by #linphone_core_find_payload_type to ignore rate in search algorithm + */ + static int FIND_PAYLOAD_IGNORE_RATE = -1; + /** + * Wildcard value used by #linphone_core_find_payload_type to ignore channel in search algorithm + */ + static int FIND_PAYLOAD_IGNORE_CHANNELS = -1; @Override public synchronized PayloadType findPayloadType(String mime, int clockRate) { - return findPayloadType(mime, clockRate, 1); + return findPayloadType(mime, clockRate, FIND_PAYLOAD_IGNORE_CHANNELS); } private native void removeFriend(long ptr, long lf); @@ -908,4 +909,8 @@ class LinphoneCoreImpl implements LinphoneCore { public void stopConferenceRecording() { stopConferenceRecording(nativePtr); } + @Override + public PayloadType findPayloadType(String mime) { + return findPayloadType(mime, FIND_PAYLOAD_IGNORE_RATE); + } } From 12577918593030541fd4d7b12e5881347e0eafb4 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 4 Apr 2013 08:23:33 +0200 Subject: [PATCH 169/281] fix compilation issue --- coreapi/linphonecore.h | 1 - 1 file changed, 1 deletion(-) diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 241813790..fefd050e7 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -71,7 +71,6 @@ typedef struct _LCSipTransports{ int tls_port; } LCSipTransports; -typedef struct _LCSipTransports LCSipTransports; /** * Object that represents a SIP address. From 2692dca3c728118be6f87a9527ec6c588dad258c Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 4 Apr 2013 16:30:32 +0200 Subject: [PATCH 170/281] Automatically adding friends in the address book Display missed call in recent calls tab Notification for chat message --- gtk/calllogs.c | 82 ++++++++++++++++++++++++------- gtk/chat.c | 92 ++++++++++++++++++++++++++-------- gtk/friendlist.c | 123 +++++++++++++++++++++++++++++----------------- gtk/incall_view.c | 9 ++-- gtk/linphone.h | 4 +- gtk/main.c | 2 +- gtk/main.ui | 121 +++++++++++++++++++++++++++++---------------- 7 files changed, 299 insertions(+), 134 deletions(-) diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 9d2714153..481c8d3d3 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -19,7 +19,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "linphone.h" - static void fill_renderers(GtkTreeView *v){ GtkTreeViewColumn *c; GtkCellRenderer *r; @@ -36,14 +35,16 @@ static void fill_renderers(GtkTreeView *v){ void call_log_selection_changed(GtkTreeView *v){ GtkTreeSelection *select; GtkTreeIter iter; - GtkTreeModel *model; + GtkTreeModel *model=NULL; select = gtk_tree_view_get_selection(v); - if (gtk_tree_selection_get_selected (select, &model, &iter)){ - GtkTreePath *path=gtk_tree_model_get_path(model,&iter); - gtk_tree_view_collapse_all(v); - gtk_tree_view_expand_row(v,path,TRUE); - gtk_tree_path_free(path); + if (select!=NULL){ + if (gtk_tree_selection_get_selected (select, &model, &iter)){ + GtkTreePath *path=gtk_tree_model_get_path(model,&iter); + gtk_tree_view_collapse_all(v); + gtk_tree_view_expand_row(v,path,TRUE); + gtk_tree_path_free(path); + } } } @@ -91,19 +92,18 @@ void linphone_gtk_call_log_add_contact(GtkWidget *w){ static bool_t put_selection_to_uribar(GtkWidget *treeview){ GtkTreeSelection *sel; - + sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); if (sel!=NULL){ GtkTreeModel *model=NULL; GtkTreeIter iter; if (gtk_tree_selection_get_selected (sel,&model,&iter)){ - gpointer pla; - LinphoneAddress *la; char *tmp; - gtk_tree_model_get(model,&iter,2,&pla,-1); - la=(LinphoneAddress*)pla; - tmp=linphone_address_as_string (la); - gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"uribar")),tmp); + LinphoneAddress *la; + gtk_tree_model_get(model,&iter,2,&la,-1); + tmp=linphone_address_as_string(la); + if(tmp!=NULL) + gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"uribar")),tmp); ms_free(tmp); return TRUE; } @@ -159,7 +159,6 @@ static GtkWidget *linphone_gtk_create_call_log_menu(GtkWidget *call_log){ gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_call_log_chat_selected,call_log); } - menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); gtk_widget_show(menu_item); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); @@ -186,25 +185,74 @@ gboolean linphone_gtk_call_log_button_pressed(GtkWidget *widget, GdkEventButton return FALSE; } +void linphone_gtk_call_log_clear_missed_call(){ + GtkWidget *mw=linphone_gtk_get_main_window(); + GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(mw,"viewswitch")); + GtkWidget *page=gtk_notebook_get_nth_page(notebook,0); + GtkWidget *box=gtk_hbox_new(FALSE,0); + GtkWidget *image=gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_MENU); + GtkWidget *l; + + l=gtk_label_new("Recent calls"); + gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,0); + gtk_box_pack_start(GTK_BOX(box),l,FALSE,FALSE,0); + gtk_notebook_set_tab_label(notebook,page,box); + gtk_widget_show_all(box); +} + +gboolean linphone_gtk_call_log_reset_missed_call(GtkWidget *w, GdkEvent *event,gpointer user_data){ + linphone_core_reset_missed_calls_count(linphone_gtk_get_core()); + linphone_gtk_call_log_clear_missed_call(); + return TRUE; +} + +void linphone_gtk_call_log_display_missed_call(int nb){ + GtkWidget *mw=linphone_gtk_get_main_window(); + GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(mw,"viewswitch")); + GtkWidget *page=gtk_notebook_get_nth_page(notebook,0); + GtkWidget *ebox=gtk_event_box_new(); + GtkWidget *box=gtk_hbox_new(FALSE,0); + GtkWidget *image=gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_MENU); + GtkWidget *l; + gchar *buf; + + buf=g_markup_printf_escaped(_("Recent calls (%i)"),nb); + l=gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(l),buf); + gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,0); + gtk_box_pack_start(GTK_BOX(box),l,FALSE,FALSE,0); + gtk_container_add(GTK_CONTAINER(ebox),box); + gtk_notebook_set_tab_label(notebook,page,ebox); + gtk_widget_add_events(ebox,GDK_BUTTON_PRESS_MASK); + g_signal_connect(G_OBJECT(ebox),"button_press_event",(GCallback)linphone_gtk_call_log_reset_missed_call,NULL); + gtk_widget_show_all(ebox); +} + void linphone_gtk_call_log_update(GtkWidget *w){ GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view")); GtkTreeStore *store; const MSList *logs; GtkTreeSelection *select; + GtkWidget *notebook=linphone_gtk_get_widget(w,"viewswitch"); + gint nb; store=(GtkTreeStore*)gtk_tree_view_get_model(v); if (store==NULL){ - store=gtk_tree_store_new(3,GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_POINTER); + store=gtk_tree_store_new(3,GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_POINTER,G_TYPE_STRING); gtk_tree_view_set_model(v,GTK_TREE_MODEL(store)); g_object_unref(G_OBJECT(store)); fill_renderers(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view"))); select=gtk_tree_view_get_selection(v); gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE); g_signal_connect_swapped(G_OBJECT(select),"changed",(GCallback)call_log_selection_changed,v); + g_signal_connect(G_OBJECT(notebook),"focus-tab",(GCallback)linphone_gtk_call_log_reset_missed_call,NULL); g_signal_connect(G_OBJECT(v),"button-press-event",(GCallback)linphone_gtk_call_log_button_pressed,NULL); // gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")), // create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png"))); } + nb=linphone_core_get_missed_calls_count(linphone_gtk_get_core()); + if(nb > 0) + linphone_gtk_call_log_display_missed_call(nb); gtk_tree_store_clear (store); for (logs=linphone_core_get_call_logs(linphone_gtk_get_core());logs!=NULL;logs=logs->next){ @@ -237,7 +285,6 @@ void linphone_gtk_call_log_update(GtkWidget *w){ } else { display=linphone_address_get_display_name(la); } - if (display==NULL){ display=linphone_address_get_username (la); if (display==NULL){ @@ -294,7 +341,6 @@ void linphone_gtk_call_log_update(GtkWidget *w){ g_free(logtxt); g_free(headtxt); } - } void linphone_gtk_history_row_activated(GtkWidget *treeview){ diff --git a/gtk/chat.c b/gtk/chat.c index 69c4e832f..9c0f64bbb 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -61,10 +61,9 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { GtkWidget *nb=linphone_gtk_get_widget(main_window,"viewswitch"); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *w=g_object_get_data(G_OBJECT(friendlist),"chatview"); - int idx = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"idx")); g_return_if_fail(w!=NULL); - gtk_notebook_remove_page(GTK_NOTEBOOK(nb),idx); + gtk_notebook_remove_page(GTK_NOTEBOOK(nb),gtk_notebook_page_num(GTK_NOTEBOOK(nb),w)); linphone_gtk_create_chat_picture(FALSE); g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); g_object_set_data(G_OBJECT(w),"from_message",NULL); @@ -74,7 +73,8 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { } const char* get_display_name(const LinphoneAddress *from){ - const char *display=linphone_address_get_display_name(from); + const char *display; + display=linphone_address_get_display_name(from); if (display==NULL || display[0]=='\0') { display=linphone_address_get_username(from); } @@ -92,7 +92,7 @@ GtkWidget *create_tab_chat_header(LinphoneChatRoom *cr,const LinphoneAddress *ur gtk_button_set_relief(GTK_BUTTON(b),GTK_RELIEF_NONE); gtk_widget_set_size_request(b,25,20); g_signal_connect_swapped(G_OBJECT(b),"clicked",G_CALLBACK(linphone_gtk_quit_chatroom),cr); - l=gtk_label_new (get_display_name(uri)); + l=gtk_label_new(get_display_name(uri)); gtk_box_pack_start (GTK_BOX(w),i,FALSE,FALSE,0); gtk_box_pack_start (GTK_BOX(w),l,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(w),b,TRUE,TRUE,0); @@ -131,7 +131,12 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, char *from_message=(char *)g_object_get_data(G_OBJECT(w),"from_message"); GList *list=g_object_get_data(G_OBJECT(w),"list"); time_t t; - + char buf[80]; + time_t tnow; + struct tm *tm; + int tnow_day; + int tnow_year; + gtk_text_buffer_get_start_iter(buffer,&begin); gtk_text_buffer_get_end_iter(buffer,&iter); off=gtk_text_iter_get_offset(&iter); @@ -162,15 +167,22 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, } case LinphoneChatMessageStateDelivered: { - struct tm *tm=localtime(&t); - char buf[80]; + tnow=time(NULL); + tm=gmtime(&tnow); + tnow_day=tm->tm_yday; + tnow_year=tm->tm_year; + tm=gmtime(&t); + if(tnow_day != tm->tm_yday || (tnow_day == tm->tm_yday && tnow_year != tm->tm_year)) { + strftime(buf,80,"%a %x, %H:%M",tm); + } else { strftime(buf,80,"%H:%M",tm); - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,buf,-1, - "right","small","italic","font_grey",me ? "bg":NULL,NULL); - break; + } + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,buf,-1, + "right","small","italic","font_grey",me ? "bg":NULL,NULL); + break; } case LinphoneChatMessageStateNotDelivered: - gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Error",-1, + gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Message not sent",-1, "right","small","italic","font_grey",me ? "bg":NULL,NULL); break; default : gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Sending ..",-1, @@ -202,6 +214,7 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag GtkTextIter iter; GtkTextIter end; GtkTextIter start; + gchar *result; gtk_text_buffer_get_iter_at_line(b,&iter, GPOINTER_TO_INT(g_list_nth_data(list,0))); @@ -217,7 +230,6 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag GPOINTER_TO_INT(g_list_nth_data(list,0)),0); gtk_text_buffer_delete(b,&start,&end); gtk_text_buffer_get_iter_at_line(b,&iter,GPOINTER_TO_INT(g_list_nth_data(list,0))); - gchar *result; switch (state) { case LinphoneChatMessageStateInProgress: result="Sending "; @@ -295,6 +307,29 @@ void display_history_message(GtkWidget *chat_view,MSList *messages,const Linphon } } +void linphone_gtk_chat_add_contact(const LinphoneAddress *addr){ + //LinphoneAddress *addr=(LinphoneAddress *)data; + LinphoneFriend *lf=NULL; + char *uri=linphone_address_as_string(addr); + lf=linphone_friend_new_with_addr(uri); + ms_free(uri); + char *fixed_uri=NULL; + gboolean show_presence=FALSE; + + linphone_friend_set_inc_subscribe_policy(lf,LinphoneSPDeny); + linphone_friend_send_subscribe(lf,show_presence); + + linphone_core_interpret_friend_uri(linphone_gtk_get_core(),uri,&fixed_uri); + if (fixed_uri==NULL){ + linphone_gtk_display_something(GTK_MESSAGE_WARNING,_("Invalid sip contact !")); + return ; + } + linphone_friend_set_addr(lf,addr); + linphone_core_add_friend(linphone_gtk_get_core(),lf); + ms_free(fixed_uri); + linphone_gtk_show_friends(); +} + GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddress *with){ GtkWidget *chat_view=linphone_gtk_create_widget("main","chatroom_frame"); GtkWidget *main_window=linphone_gtk_get_main_window (); @@ -312,7 +347,6 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres color.red = 32512; color.green = 32512; color.blue = 32512; - colorb.red = 56832; colorb.green = 60928; colorb.blue = 61952; @@ -321,12 +355,12 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres linphone_chat_room_mark_as_read(cr); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_WORD_CHAR); gtk_text_view_set_editable(GTK_TEXT_VIEW(text),FALSE); + gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text),FALSE); gtk_notebook_append_page(notebook,chat_view,create_tab_chat_header(cr,with)); idx = gtk_notebook_page_num(notebook, chat_view); gtk_notebook_set_current_page(notebook, idx); gtk_widget_show(chat_view); g_object_set_data(G_OBJECT(chat_view),"cr",cr); - g_object_set_data(G_OBJECT(chat_view),"idx",GINT_TO_POINTER(idx)); g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); g_object_set_data(G_OBJECT(chat_view),"list",list); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), @@ -369,18 +403,25 @@ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri, char *uri_str=linphone_address_as_string(uri); char *uri_only=linphone_address_as_string_uri_only(uri); MSList *messages=NULL; - + linphone_chat_room_mark_as_read(cr); if(g_strcmp0(from_str,uri_only)!=0){ GtkTextView *text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); GtkTextIter start; GtkTextIter end; GtkTextBuffer *text_buffer; + GtkWidget *cb; text_buffer=gtk_text_view_get_buffer(text_view); gtk_text_buffer_get_bounds(text_buffer, &start, &end); gtk_text_buffer_delete (text_buffer, &start, &end); udpate_tab_chat_header(chat_view,uri,cr); + cb=linphone_gtk_get_widget(chat_view,"contact_bar"); + if(!linphone_gtk_friend_list_is_contact(uri)){ + gtk_widget_show(cb); + } else { + gtk_widget_hide(cb); + } g_object_set_data(G_OBJECT(chat_view),"cr",cr); g_object_set_data(G_OBJECT(linphone_gtk_get_widget(main_window,"contact_list")),"chatview",(gpointer)chat_view); messages=linphone_chat_room_get_history(cr,NB_MSG_HIST); @@ -389,6 +430,7 @@ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri, } ms_free(from_str); ms_free(uri_str); + ms_free(uri_only); } void linphone_gtk_chat_destroyed(GtkWidget *w){ @@ -408,18 +450,27 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *w; gboolean send=TRUE; - + GtkNotebook *notebook=(GtkNotebook *)linphone_gtk_get_widget(main_window,"viewswitch"); char *from=linphone_address_as_string(linphone_chat_message_get_from(msg)); + w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); if(w!=NULL){ char *from_chatview=(char *)g_object_get_data(G_OBJECT(friendlist),"from"); if(g_strcmp0(from,from_chatview)==0){ send=TRUE; } else { + if(!linphone_gtk_friend_list_is_contact(linphone_chat_message_get_from(msg))){ + //linphone_gtk_load_chatroom(room,linphone_chat_message_get_from(msg),w); + linphone_gtk_chat_add_contact(linphone_chat_message_get_from(msg)); + } send=FALSE; } } else { send=FALSE; + if(!linphone_gtk_friend_list_is_contact(linphone_chat_message_get_from(msg))){ + //linphone_gtk_load_chatroom(room,linphone_chat_message_get_from(msg),w); + linphone_gtk_chat_add_contact(linphone_chat_message_get_from(msg)); + } w=linphone_gtk_init_chatroom(room,linphone_chat_message_get_from(msg)); g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); g_object_set_data(G_OBJECT(friendlist),"from",from); @@ -439,14 +490,13 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, } #endif if(send){ - linphone_chat_room_mark_as_read(room); + if(gtk_notebook_get_current_page(notebook)!=gtk_notebook_page_num(notebook,w)){ + linphone_gtk_show_friends(); + } linphone_gtk_push_text(w,linphone_chat_message_get_from(msg), FALSE,room,msg,FALSE); } else { linphone_gtk_show_friends(); - //linphone_gtk_friend_list_update_message(msg); } - //linphone_gtk_update_chat_picture(); - //gtk_window_present(GTK_WINDOW(w)); - /*gtk_window_set_urgency_hint(GTK_WINDOW(w),TRUE);*/ + //linphone_gtk_update_chat_picture(); } diff --git a/gtk/friendlist.c b/gtk/friendlist.c index 9f5a935b8..3997e29f3 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -32,7 +32,6 @@ enum{ FRIEND_ICON, FRIEND_CALL, FRIEND_CHAT, - FRIEND_NB_UNREAD_MSG, FRIEND_LIST_NCOL }; @@ -76,17 +75,23 @@ static GdkPixbuf *create_call_picture(){ return pixbuf; } +static GdkPixbuf *create_unread_msg(){ + GdkPixbuf *pixbuf; + pixbuf = create_pixbuf("active_chat.png"); + return pixbuf; +} + static GdkPixbuf *create_chat_picture(){ GdkPixbuf *pixbuf; pixbuf = create_pixbuf("chat.png"); return pixbuf; } -static GdkPixbuf *create_active_chat_picture(){ +/*static GdkPixbuf *create_active_chat_picture(){ GdkPixbuf *pixbuf; pixbuf = create_pixbuf("active_chat.png"); return pixbuf; -} +}*/ /* void linphone_gtk_set_friend_status(GtkWidget *friendlist , LinphoneFriend * fid, const gchar *url, const gchar *status, const gchar *img){ GtkTreeIter iter; @@ -110,6 +115,16 @@ void linphone_gtk_set_friend_status(GtkWidget *friendlist , LinphoneFriend * fid } } */ + +gboolean linphone_gtk_friend_list_is_contact(const LinphoneAddress *addr){ + LinphoneFriend *lf; + char *addr_str=linphone_address_as_string(addr); + lf=linphone_core_get_friend_by_address(linphone_gtk_get_core(),addr_str); + if(lf == NULL){ + return FALSE; + } return TRUE; +} + static void linphone_gtk_set_selection_to_uri_bar(GtkTreeView *treeview){ GtkTreeSelection *select; GtkTreeIter iter; @@ -156,28 +171,51 @@ void linphone_gtk_remove_contact(GtkWidget *button){ GtkTreeIter iter; GtkTreeModel *model; LinphoneFriend *lf=NULL; + LinphoneChatRoom *cr=NULL; select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list"))); if (gtk_tree_selection_get_selected (select, &model, &iter)) { gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); linphone_core_remove_friend(linphone_gtk_get_core(),lf); + gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); + linphone_chat_room_delete_history(cr); linphone_gtk_show_friends(); } } void linphone_gtk_delete_history(GtkWidget *button){ - GtkWidget *w=gtk_widget_get_toplevel(button); + GtkWidget *w=linphone_gtk_get_main_window(); GtkTreeSelection *select; GtkTreeIter iter; GtkTreeModel *model; + GtkWidget *chat_view; LinphoneFriend *lf=NULL; - select = gtk_tree_view_get_selection(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"contact_list"))); + GtkWidget *friendlist; + + friendlist=linphone_gtk_get_widget(w,"contact_list"); + chat_view=(GtkWidget *)g_object_get_data(G_OBJECT(friendlist),"chatview"); + select = gtk_tree_view_get_selection(GTK_TREE_VIEW(friendlist)); if (gtk_tree_selection_get_selected (select, &model, &iter)) { LinphoneChatRoom *cr; gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); - cr=linphone_core_get_chat_room(linphone_gtk_get_core(),linphone_friend_get_address(lf)); + gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); linphone_chat_room_delete_history(cr); + if(chat_view!=NULL){ + char *from=g_object_get_data(G_OBJECT(friendlist),"from"); + char *addr=linphone_address_as_string(linphone_friend_get_address(lf)); + if(g_strcmp0(from,addr)==0){ + GtkTextView *text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); + GtkTextIter start; + GtkTextIter end; + GtkTextBuffer *text_buffer; + + text_buffer=gtk_text_view_get_buffer(text_view); + gtk_text_buffer_get_bounds(text_buffer, &start, &end); + gtk_text_buffer_delete (text_buffer, &start, &end); + g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); + } + } linphone_gtk_show_friends(); } } @@ -209,7 +247,7 @@ static gboolean grab_focus(GtkWidget *w){ return FALSE; } -void linphone_gtk_tree_view_set_chat_conversation(LinphoneAddress *la){ +void linphone_gtk_tree_view_set_chat_conversation(const LinphoneAddress *la){ GtkTreeIter iter; GtkListStore *store=NULL; GtkWidget *w = linphone_gtk_get_main_window(); @@ -240,7 +278,7 @@ void linphone_gtk_tree_view_set_chat_conversation(LinphoneAddress *la){ do{ const LinphoneAddress *uri; char *lf_str; - gtk_tree_model_get (model, &iter,FRIEND_ID , &lf, -1); + gtk_tree_model_get(model, &iter,FRIEND_ID , &lf, -1); uri=linphone_friend_get_address(lf); lf_str=linphone_address_as_string(uri); if( g_strcmp0(lf_str,la_str)==0){ @@ -259,14 +297,30 @@ void linphone_gtk_tree_view_set_chat_conversation(LinphoneAddress *la){ gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,chat_view)); linphone_gtk_create_chat_picture(FALSE); g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(chat_view,"text_entry")); - gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); - gtk_list_store_set(store,&iter,FRIEND_NB_UNREAD_MSG,"",-1); break; } }while(gtk_tree_model_iter_next(model,&iter)); } + } +} + +void linphone_gtk_notebook_tab_select(GtkNotebook *notebook,GtkWidget *page,guint page_num, gpointer data){ + GtkWidget *w=linphone_gtk_get_main_window(); + GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); + GtkWidget *chat_view; + LinphoneChatRoom *cr=NULL; + const LinphoneAddress *addr=(const LinphoneAddress *)data; + chat_view=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + if(page != NULL){ + notebook=(GtkNotebook *)linphone_gtk_get_widget(w,"viewswitch"); + if(gtk_notebook_page_num(notebook,page)==gtk_notebook_page_num(notebook,chat_view)){ + cr=linphone_core_get_chat_room(linphone_gtk_get_core(),addr); + if(cr!=NULL){ + linphone_chat_room_mark_as_read(cr); + linphone_gtk_show_friends(); + } + } } - } void linphone_gtk_chat_selected(GtkWidget *item){ @@ -303,8 +357,7 @@ void linphone_gtk_chat_selected(GtkWidget *item){ gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,page)); linphone_gtk_create_chat_picture(FALSE); g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(page,"text_entry")); - gtk_list_store_set(store,&iter,FRIEND_CHAT,create_active_chat_picture(),-1); - gtk_list_store_set(store,&iter,FRIEND_NB_UNREAD_MSG,"",-1); + g_signal_connect(G_OBJECT(notebook),"switch_page",(GCallback)linphone_gtk_notebook_tab_select,(gpointer)uri); } } @@ -577,8 +630,7 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ linphone_gtk_init_bookmark_icon(); store = gtk_list_store_new(FRIEND_LIST_NCOL,GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, - G_TYPE_POINTER, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, - G_TYPE_STRING, G_TYPE_STRING); + G_TYPE_POINTER, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF); gtk_tree_view_set_model(GTK_TREE_VIEW(friendlist),GTK_TREE_MODEL(store)); g_object_unref(G_OBJECT(store)); @@ -588,7 +640,7 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(friendlist),friend_search_func,NULL,NULL); gtk_tree_view_set_search_column(GTK_TREE_VIEW(friendlist),FRIEND_NAME); gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(store),FRIEND_NAME,friend_sort,NULL,NULL); - + /*Name and presence column*/ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Presence status"), @@ -599,6 +651,7 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ g_signal_connect_swapped(G_OBJECT(column),"clicked",(GCallback)on_presence_column_clicked,GTK_TREE_MODEL(store)); gtk_tree_view_column_set_clickable(column,TRUE); gtk_tree_view_column_set_visible(column,linphone_gtk_get_ui_config_int("friendlist_status",1)); + gtk_tree_view_column_set_min_width(column,50); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column,renderer,TRUE); @@ -616,11 +669,6 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ gtk_tree_view_column_set_clickable(column,TRUE); gtk_tree_view_column_set_expand(column,TRUE); gtk_tree_view_column_set_max_width(column,60); - - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column,renderer,TRUE); - gtk_tree_view_column_add_attribute (column,renderer,"text",FRIEND_NB_UNREAD_MSG); - gtk_tree_view_append_column (GTK_TREE_VIEW (friendlist), column); /* Call column*/ @@ -641,7 +689,7 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(friendlist),FRIEND_SIP_ADDRESS); #endif - gtk_widget_set_size_request(friendlist,200,100); + gtk_widget_set_size_request(friendlist,200,120); /*gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget( gtk_widget_get_toplevel(friendlist),"show_category")),0);*/ } @@ -713,7 +761,6 @@ void linphone_gtk_show_friends(void){ LinphoneChatRoom *cr=NULL; linphone_gtk_show_directory_search(); - if (gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))==NULL){ linphone_gtk_friend_list_init(friendlist); } @@ -735,7 +782,7 @@ void linphone_gtk_show_friends(void){ const char *name=linphone_address_get_display_name(f_uri); const char *display=name; char *escaped=NULL; - char buf[26]={0}; + //char buf[26]={0}; int nbmsg=0; /*if (lookup){ @@ -752,26 +799,13 @@ void linphone_gtk_show_friends(void){ gtk_list_store_append(store,&iter); gtk_list_store_set(store,&iter,FRIEND_NAME, display,FRIEND_ID,lf, FRIEND_PRESENCE_IMG, send_subscribe ? create_status_picture(linphone_friend_get_status(lf)) : NULL, - -1); - - gtk_tree_model_get(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)),&iter,FRIEND_CHATROOM,&cr,-1); - if(cr!=NULL){ - nbmsg=linphone_chat_room_get_unread_messages_count(cr); - if(nbmsg != 0){ - sprintf(buf,"%i",nbmsg); - } - } else { - cr=linphone_gtk_create_chatroom(f_uri); - gtk_list_store_set(store,&iter,FRIEND_CHATROOM,cr,-1); - nbmsg=linphone_chat_room_get_unread_messages_count(cr); - if(nbmsg != 0){ - sprintf(buf,"%i",nbmsg); - } + FRIEND_CHAT,create_chat_picture(),FRIEND_CALL,create_call_picture(),-1); + cr=linphone_gtk_create_chatroom(f_uri); + gtk_list_store_set(store,&iter,FRIEND_CHATROOM,cr,-1); + nbmsg=linphone_chat_room_get_unread_messages_count(cr); + if(nbmsg != 0){ + gtk_list_store_set(store,&iter,FRIEND_CHAT,create_unread_msg(),-1); } - - gtk_list_store_set(store,&iter,FRIEND_CALL,create_call_picture(),-1); - gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); - gtk_list_store_set(store,&iter,FRIEND_NB_UNREAD_MSG,buf,-1); escaped=g_markup_escape_text(uri,-1); gtk_list_store_set(store,&iter,FRIEND_SIP_ADDRESS,escaped,-1); g_free(escaped); @@ -823,6 +857,7 @@ void linphone_gtk_contact_ok(GtkWidget *button){ char *fixed_uri=NULL; gboolean show_presence=FALSE,allow_presence=FALSE; const gchar *name,*uri; + LinphoneAddress* friend_address; if (lf==NULL){ lf=linphone_friend_new(); if (linphone_gtk_get_ui_config_int("use_subscribe_notify",1)==1){ @@ -841,7 +876,7 @@ void linphone_gtk_contact_ok(GtkWidget *button){ linphone_gtk_display_something(GTK_MESSAGE_WARNING,_("Invalid sip contact !")); return ; } - LinphoneAddress* friend_address = linphone_address_new(fixed_uri); + friend_address = linphone_address_new(fixed_uri); linphone_address_set_display_name(friend_address,name); linphone_friend_set_addr(lf,friend_address); linphone_address_destroy(friend_address); diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 0a64a1041..4ab0bd72e 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -431,8 +431,6 @@ void linphone_gtk_remove_in_call_view(LinphoneCall *call){ int idx; g_return_if_fail(w!=NULL); idx=gtk_notebook_page_num(GTK_NOTEBOOK(nb),w); - gtk_notebook_remove_page (GTK_NOTEBOOK(nb),idx); - gtk_widget_destroy(w); if (in_conf){ linphone_gtk_unset_from_conference(call); } @@ -444,12 +442,13 @@ void linphone_gtk_remove_in_call_view(LinphoneCall *call){ /*show the conference*/ gtk_notebook_set_current_page(GTK_NOTEBOOK(nb),gtk_notebook_page_num(GTK_NOTEBOOK(nb), g_object_get_data(G_OBJECT(main_window),"conf_frame"))); - }else gtk_notebook_set_current_page(GTK_NOTEBOOK(nb), 0); + }else gtk_notebook_prev_page(GTK_NOTEBOOK(nb)); }else{ /*show the active call*/ - gtk_notebook_set_current_page(GTK_NOTEBOOK(nb),gtk_notebook_page_num(GTK_NOTEBOOK(nb), - linphone_call_get_user_pointer(call))); + gtk_notebook_set_current_page(GTK_NOTEBOOK(nb),gtk_notebook_page_num(GTK_NOTEBOOK(nb), linphone_call_get_user_pointer(call))); } + gtk_notebook_remove_page (GTK_NOTEBOOK(nb),idx); + gtk_widget_destroy(w); } static void display_peer_name_in_label(GtkWidget *label, const LinphoneAddress *from){ diff --git a/gtk/linphone.h b/gtk/linphone.h index ccdebea69..00484a04f 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -152,5 +152,5 @@ void linphone_gtk_monitor_usb(void); void linphone_gtk_unmonitor_usb(void); gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference); -void linphone_gtk_friend_list_update_message(LinphoneChatMessage *msg); -void linphone_gtk_tree_view_set_chat_conversation(LinphoneAddress *la); +void linphone_gtk_tree_view_set_chat_conversation(const LinphoneAddress *la); +gboolean linphone_gtk_friend_list_is_contact(const LinphoneAddress *addr); \ No newline at end of file diff --git a/gtk/main.c b/gtk/main.c index b188782ab..e3699757f 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1726,6 +1726,7 @@ static void linphone_gtk_init_main_window(){ linphone_gtk_load_identities(); linphone_gtk_set_my_presence(linphone_core_get_presence_info(linphone_gtk_get_core())); linphone_gtk_show_friends(); + linphone_core_reset_missed_calls_count(linphone_gtk_get_core()); main_window=linphone_gtk_get_main_window(); linphone_gtk_call_log_update(main_window); @@ -1748,7 +1749,6 @@ static void linphone_gtk_init_main_window(){ linphone_gtk_check_menu_items(); } - void linphone_gtk_log_handler(OrtpLogLevel lev, const char *fmt, va_list args){ if (verbose){ const char *lname="undef"; diff --git a/gtk/main.ui b/gtk/main.ui index 0b27240e7..5875bc844 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -104,6 +104,41 @@ True False + + + True + False + + + True + False + + + True + True + 0 + + + + + True + True + True + False + + + False + False + 1 + + + + + False + True + 0 + + True @@ -120,7 +155,7 @@ True True - 0 + 1 @@ -192,7 +227,8 @@ False False - 1 + end + 2 @@ -794,6 +830,8 @@ False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 660 + 450 True @@ -1042,6 +1080,7 @@ False False + 6 end 1 @@ -1247,49 +1286,11 @@ 0 - - - True - False - end - - - gtk-clear - True - True - True - False - True - - - - False - False - 0 - - - - - - - - - - - False - True - end - 1 - - True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - False @@ -1375,7 +1376,7 @@ False False 5 - 2 + 0 @@ -1401,14 +1402,47 @@ False False - 3 + 1 False False - end + 1 + + + + + True + False + end + + + gtk-clear + True + True + True + False + True + + + + False + False + 0 + + + + + + + + + + + False + True 2 @@ -1428,6 +1462,7 @@ True False + True From ca5daeab3376200f72d681492bff907a36bf1c7a Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 4 Apr 2013 16:49:46 +0200 Subject: [PATCH 171/281] Fix tab click --- gtk/calllogs.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 481c8d3d3..7daa1b011 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -201,6 +201,9 @@ void linphone_gtk_call_log_clear_missed_call(){ } gboolean linphone_gtk_call_log_reset_missed_call(GtkWidget *w, GdkEvent *event,gpointer user_data){ + GtkWidget *mw=linphone_gtk_get_main_window(); + GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(mw,"viewswitch")); + gtk_notebook_set_current_page(notebook,0); linphone_core_reset_missed_calls_count(linphone_gtk_get_core()); linphone_gtk_call_log_clear_missed_call(); return TRUE; From 4d9f81bd1c30b3a84f28e9659b9065b517721a92 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Thu, 4 Apr 2013 16:44:46 +0200 Subject: [PATCH 172/281] Fix upnp binding loop when not getting provided port --- coreapi/upnp.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index ec7d1f9c6..71a3c9d2a 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -553,9 +553,8 @@ int linphone_upnp_context_send_add_port_binding(UpnpContext *lupnp, UpnpPortBind mapping.local_port = port->local_port; mapping.local_host = port->local_addr; if(port->external_port == -1) - mapping.remote_port = rand()%(0xffff - 1024) + 1024; - else - mapping.remote_port = port->external_port; + port->external_port = rand()%(0xffff - 1024) + 1024; + mapping.remote_port = port->external_port; mapping.remote_host = ""; snprintf(description, 128, "%s %s at %s:%d", PACKAGE_NAME, @@ -877,7 +876,7 @@ void linphone_upnp_update_port_binding(UpnpContext *lupnp, UpnpPortBinding **por } } if(*port_mapping == NULL) { - *port_mapping = linphone_upnp_port_binding_new_or_collect(lupnp->pending_bindings, protocol, port, port); + *port_mapping = linphone_upnp_port_binding_new_or_collect(lupnp->pending_bindings, protocol, port, -1); } // Get addresses @@ -1107,8 +1106,8 @@ void linphone_upnp_port_binding_log(int level, const char *msg, const UpnpPortBi bool_t linphone_upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2) { return port1->protocol == port2->protocol && - port1->local_port == port2->local_port && - port1->external_port == port2->external_port; + port1->local_port == port2->local_port && + (port1->external_port == -1 || port2->external_port == -1 || port1->external_port == port2->external_port); } UpnpPortBinding *linphone_upnp_port_binding_equivalent_in_list(MSList *list, const UpnpPortBinding *port) { From c42f7ec0904969b090fc752aa0dc2506b1a21952 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 4 Apr 2013 17:06:01 +0200 Subject: [PATCH 173/281] remove some features in the interface change date --- gtk/chat.c | 9 +-------- gtk/main.ui | 40 ++-------------------------------------- 2 files changed, 3 insertions(+), 46 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index 9c0f64bbb..cf6d61c98 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -237,7 +237,7 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag case LinphoneChatMessageStateDelivered: { time_t t=time(NULL); - struct tm *tm=localtime(&t); + struct tm *tm=gmtime(&t); char buf[80]; strftime(buf,80,"%H:%M",tm); result=buf; @@ -410,18 +410,11 @@ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri, GtkTextIter start; GtkTextIter end; GtkTextBuffer *text_buffer; - GtkWidget *cb; text_buffer=gtk_text_view_get_buffer(text_view); gtk_text_buffer_get_bounds(text_buffer, &start, &end); gtk_text_buffer_delete (text_buffer, &start, &end); udpate_tab_chat_header(chat_view,uri,cr); - cb=linphone_gtk_get_widget(chat_view,"contact_bar"); - if(!linphone_gtk_friend_list_is_contact(uri)){ - gtk_widget_show(cb); - } else { - gtk_widget_hide(cb); - } g_object_set_data(G_OBJECT(chat_view),"cr",cr); g_object_set_data(G_OBJECT(linphone_gtk_get_widget(main_window,"contact_list")),"chatview",(gpointer)chat_view); messages=linphone_chat_room_get_history(cr,NB_MSG_HIST); diff --git a/gtk/main.ui b/gtk/main.ui index 5875bc844..347a402ea 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -104,41 +104,6 @@ True False - - - True - False - - - True - False - - - True - True - 0 - - - - - True - True - True - False - - - False - False - 1 - - - - - False - True - 0 - - True @@ -155,7 +120,7 @@ True True - 1 + 0 @@ -227,8 +192,7 @@ False False - end - 2 + 1 From 622c8f30d2a96740d25a7d410a3e8cdd85839083 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 5 Apr 2013 12:16:05 +0200 Subject: [PATCH 174/281] fix sending of PUBLISH requests (was not set to the proxy address actually) --- coreapi/proxy.c | 1 + coreapi/sal_eXosip2_presence.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 5546102ba..42c21f01b 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -792,6 +792,7 @@ int linphone_proxy_config_send_publish(LinphoneProxyConfig *proxy, LinphoneOnlineStatus presence_mode){ int err; SalOp *op=sal_op_new(proxy->lc->sal); + sal_op_set_route(op,proxy->reg_proxy); err=sal_publish(op,linphone_proxy_config_get_identity(proxy), linphone_proxy_config_get_identity(proxy),linphone_online_status_to_sal(presence_mode)); if (proxy->publish_op!=NULL) diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index 356d2a9fb..ffa7ed920 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -635,7 +635,7 @@ int sal_publish(SalOp *op, const char *from, const char *to, SalPresenceStatus p mk_presence_body (presence_mode, from, buf, sizeof (buf), presence_style); - i = eXosip_build_publish(&pub,from, to, NULL, "presence", "300", + i = eXosip_build_publish(&pub,from, to, sal_op_get_route(op), "presence", "300", presence_style ? "application/xpidf+xml" : "application/pidf+xml", buf); if (i<0){ ms_warning("Failed to build publish request."); From d630e0a99decbed3e9a5437b680801dd236beb40 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 5 Apr 2013 12:45:00 +0200 Subject: [PATCH 175/281] Don't include xml2lpc and lpc2xml in android.mk --- build/android/Android-no-neon.mk | 2 -- build/android/Android.mk | 7 ------- build/android/lpc2xml.mk | 1 + build/android/xml2lpc.mk | 1 + 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/build/android/Android-no-neon.mk b/build/android/Android-no-neon.mk index d0c87b4f8..d8e75ca0b 100644 --- a/build/android/Android-no-neon.mk +++ b/build/android/Android-no-neon.mk @@ -21,7 +21,6 @@ LOCAL_PATH:= $(call my-dir)/../../coreapi - include $(CLEAR_VARS) include $(linphone-root-dir)/submodules/linphone/build/android/common.mk @@ -43,4 +42,3 @@ include $(BUILD_SHARED_LIBRARY) $(call import-module,android/cpufeatures) - diff --git a/build/android/Android.mk b/build/android/Android.mk index 7fb75d0a4..10fba32dd 100755 --- a/build/android/Android.mk +++ b/build/android/Android.mk @@ -39,10 +39,3 @@ include $(BUILD_SHARED_LIBRARY) $(call import-module,android/cpufeatures) - -ifeq ($(BUILD_REMOTE_PROVISIONING),1) - -include $(linphone-root-dir)/submodules/linphone/build/android/xml2lpc.mk -include $(linphone-root-dir)/submodules/linphone/build/android/lpc2xml.mk - -endif diff --git a/build/android/lpc2xml.mk b/build/android/lpc2xml.mk index f7858f94d..b5757ad99 100644 --- a/build/android/lpc2xml.mk +++ b/build/android/lpc2xml.mk @@ -40,6 +40,7 @@ LOCAL_C_INCLUDES = \ LOCAL_SHARED_LIBRARIES = \ libxml2 \ + liblinphonenoneon \ liblinphone \ LOCAL_MODULE := liblpc2xml diff --git a/build/android/xml2lpc.mk b/build/android/xml2lpc.mk index 32bfb38c3..449251cc8 100644 --- a/build/android/xml2lpc.mk +++ b/build/android/xml2lpc.mk @@ -40,6 +40,7 @@ LOCAL_C_INCLUDES = \ LOCAL_SHARED_LIBRARIES = \ libxml2 \ + liblinphonenoneon \ liblinphone \ LOCAL_MODULE := libxml2lpc From fe1f6272324192e625a983808baa1dc8de17ccbb Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 5 Apr 2013 18:24:07 +0200 Subject: [PATCH 176/281] set mtu to 1300 because mtu detection is absolutely not reliable. This is making a lot of problems with video packets especially. --- coreapi/linphonecore.c | 2 +- mediastreamer2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 0089dd0fb..7b4d6a998 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -463,7 +463,7 @@ static void net_config_read (LinphoneCore *lc) linphone_core_set_firewall_policy(lc,tmp); tmp=lp_config_get_int(lc->config,"net","nat_sdp_only",0); lc->net_conf.nat_sdp_only=tmp; - tmp=lp_config_get_int(lc->config,"net","mtu",0); + tmp=lp_config_get_int(lc->config,"net","mtu",1300); linphone_core_set_mtu(lc,tmp); tmp=lp_config_get_int(lc->config,"net","download_ptime",0); linphone_core_set_download_ptime(lc,tmp); diff --git a/mediastreamer2 b/mediastreamer2 index 8596ed901..f6c51a11f 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 8596ed9017c0d9b9c63c758d7628bac1fc07efd7 +Subproject commit f6c51a11f1ef1156c6f768b8466698a2305a2188 From 03734b6bf5f52b6a366a5e9f2444cb1c00a0b165 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Mon, 8 Apr 2013 12:59:42 +0200 Subject: [PATCH 177/281] change unread messages picture chnage time for time change --- coreapi/message_storage.c | 1 + coreapi/sal_eXosip2.c | 1 + gtk/chat.c | 11 +++++------ pixmaps/active_chat.png | Bin 3103 -> 3415 bytes 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/coreapi/message_storage.c b/coreapi/message_storage.c index 0c41c20d0..8ba642b68 100644 --- a/coreapi/message_storage.c +++ b/coreapi/message_storage.c @@ -66,6 +66,7 @@ static void create_chat_message(char **argv, void *data){ for(j=0;j<12;j++) { if(strcmp(tmp2,months[j])==0) ret.tm_mon=j; } + ret.tm_isdst=-1; } new_message->time=argv[5]!=NULL ? mktime(&ret) : time(NULL); new_message->state=atoi(argv[7]); diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 2ea0f9aff..b86fc26e0 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1798,6 +1798,7 @@ static void text_received(Sal *sal, eXosip_event_t *ev){ for(j=0;j<12;j++) { if(strcmp(tmp2,months[j])==0) ret.tm_mon=j; } + ret.tm_isdst=-1; }else ms_warning("No date header in SIP MESSAGE, we don't know when it was sent."); content_type= osip_message_get_content_type(ev->request); diff --git a/gtk/chat.c b/gtk/chat.c index cf6d61c98..9bcf0bb8b 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -168,10 +168,10 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, case LinphoneChatMessageStateDelivered: { tnow=time(NULL); - tm=gmtime(&tnow); + tm=localtime(&tnow); tnow_day=tm->tm_yday; tnow_year=tm->tm_year; - tm=gmtime(&t); + tm=localtime(&t); if(tnow_day != tm->tm_yday || (tnow_day == tm->tm_yday && tnow_year != tm->tm_year)) { strftime(buf,80,"%a %x, %H:%M",tm); } else { @@ -237,7 +237,7 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag case LinphoneChatMessageStateDelivered: { time_t t=time(NULL); - struct tm *tm=gmtime(&t); + struct tm *tm=localtime(&t); char buf[80]; strftime(buf,80,"%H:%M",tm); result=buf; @@ -450,10 +450,10 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, if(w!=NULL){ char *from_chatview=(char *)g_object_get_data(G_OBJECT(friendlist),"from"); if(g_strcmp0(from,from_chatview)==0){ + linphone_chat_room_mark_as_read(room); send=TRUE; } else { if(!linphone_gtk_friend_list_is_contact(linphone_chat_message_get_from(msg))){ - //linphone_gtk_load_chatroom(room,linphone_chat_message_get_from(msg),w); linphone_gtk_chat_add_contact(linphone_chat_message_get_from(msg)); } send=FALSE; @@ -461,7 +461,6 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, } else { send=FALSE; if(!linphone_gtk_friend_list_is_contact(linphone_chat_message_get_from(msg))){ - //linphone_gtk_load_chatroom(room,linphone_chat_message_get_from(msg),w); linphone_gtk_chat_add_contact(linphone_chat_message_get_from(msg)); } w=linphone_gtk_init_chatroom(room,linphone_chat_message_get_from(msg)); @@ -469,6 +468,7 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, g_object_set_data(G_OBJECT(friendlist),"from",from); } get_display_name(linphone_chat_message_get_from(msg)); + #ifdef HAVE_GTK_OSXs /* Notified when a new message is sent */ linphone_gtk_status_icon_set_blinking(TRUE); @@ -491,5 +491,4 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, } else { linphone_gtk_show_friends(); } - //linphone_gtk_update_chat_picture(); } diff --git a/pixmaps/active_chat.png b/pixmaps/active_chat.png index e428845d55648e21ab59ad6c9d94e48b7e8a70ea..d82b7c595c8a90fddb3c313be4bd9c6c524b0af4 100644 GIT binary patch delta 677 zcmV;W0$Tl_7}pxGzY2c>f=NU{RCwCVRbNO`Q5^ox_1e8H-8F<|u7Uc{LqQStVh@I- zL7*WNJ@_L1c?hWpst0>4DC(_25Co>ih(Z&I>_x1mlL&$+v_h*%CexQ~y0-3hp0B55 zy1VHdK|lB&4u^Ao=ljF&2$J~MrEK(|Iq?AA^9L~-9)tYxth#^6B`Ad8Vefe7(Yq5U zb=TnZy+D3VwBjNRJohWLwfB|Jn?3WM9l`|4(Qv@?y1mqg_{5 zni&xqd&LR`1X6$CE~6`Dy{+ZW49RpRx~{|NbgnIzQI4CwN7yt!ftCx`V46wbX9#lu z%63-6REuxTPJR0T0BKB~_VzNTS~7WNUooM80)j#-VtdyJ&kp<&?n{FpX=8j!q%F%r zwusAQ0v%URqU-$vb{#u~%f}m_nK8WRybUWBI?;6GkZym=q&Ej9;jeG$7J`6I-^eVZ z(eG^BzLfyD=iI|57l&D5>&aTFO0AO0{rEUNiN_s-XsmI;sQ@=_wV^UxgO}WUg(f1l zO#1rzY+o&NX)7DA_8<@lFc=I%*L4_% zf%^J-0Kn+zC?b&vgb)xyEKBtF)ly23gp?A^&CMds=uGJD?j}k4{eBJ&4RO8xtVUMj zHBCcLPY)Is7g1MNCpMh8OdDRWmxf`WwY62``~4k?|N4*5rTz>6c>+{F&e}*B00000 LNkvXXu0mjfl!8b} delta 362 zcmV-w0hRvO8lM=jzY2c=N=ZaPRCwCdl`)ROFc3xmShk!rP6OL5$3WV2G*l^a1MZX~ zP^6;a0+A9aRM1j$0Hn~6CXr{GRm8%QC`3V8OKvQWM}GhNo0u764}mv~w=|J|EpE44 zCZb*k5fQAl_?S-d<@>*i>0XmKjyVVdxUP%7dNDH&`#q#mn9qOb^zj6GMdlX z49DZKT@xC}zp87vT6bu2gJ`$g;e0-K9z2;$;QM}4FQja5!Z(69g?$VFz*;-5h55&6 zofaN~ivfr}O0*z-KBR;!_z`KZai{eHg(02kWB6|-2`r~m)}07*qo IM6N<$f~JM4GXMYp From ffb950b2a646e73c2c3052725f54cd87c8162d93 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 8 Apr 2013 13:56:44 +0200 Subject: [PATCH 178/281] update ms2 and ortp for call quality indicator improvements. --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index f6c51a11f..d9ce543de 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit f6c51a11f1ef1156c6f768b8466698a2305a2188 +Subproject commit d9ce543dee40d7cb7da55e50c6716a25f53ea2ba diff --git a/oRTP b/oRTP index 31d242e8c..35f5efbfb 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 31d242e8c544ed197f60630593515aef2fb580e9 +Subproject commit 35f5efbfbf7814bd0403249431a6b94d6c4286b4 From d421f2410dbaf972bbd621f92be77b1ce8833fee Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Mon, 8 Apr 2013 14:09:45 +0200 Subject: [PATCH 179/281] fix unread messages --- gtk/chat.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gtk/chat.c b/gtk/chat.c index 9bcf0bb8b..a61afcf21 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -450,7 +450,6 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, if(w!=NULL){ char *from_chatview=(char *)g_object_get_data(G_OBJECT(friendlist),"from"); if(g_strcmp0(from,from_chatview)==0){ - linphone_chat_room_mark_as_read(room); send=TRUE; } else { if(!linphone_gtk_friend_list_is_contact(linphone_chat_message_get_from(msg))){ @@ -485,6 +484,8 @@ void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, if(send){ if(gtk_notebook_get_current_page(notebook)!=gtk_notebook_page_num(notebook,w)){ linphone_gtk_show_friends(); + } else { + linphone_chat_room_mark_as_read(room); } linphone_gtk_push_text(w,linphone_chat_message_get_from(msg), FALSE,room,msg,FALSE); From 9b7ac9b79375f845edd0e8366e602863a223d2c0 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 9 Apr 2013 10:02:59 +0200 Subject: [PATCH 180/281] Fix upnp forgotten retain --- coreapi/upnp.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/coreapi/upnp.c b/coreapi/upnp.c index 71a3c9d2a..0922dad59 100644 --- a/coreapi/upnp.c +++ b/coreapi/upnp.c @@ -29,8 +29,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define UPNP_REMOVE_MAX_RETRY 4 #define UPNP_SECTION_NAME "uPnP" #define UPNP_CORE_READY_CHECK 1 -#define UPNP_CORE_RETRY_DELAY 4 -#define UPNP_CALL_RETRY_DELAY 1 +#define UPNP_CORE_RETRY_DELAY 10 +#define UPNP_CALL_RETRY_DELAY 3 #define UPNP_UUID_LEN 128 #define UPNP_UUID_LEN_STR UPNP_TOSTRING(UPNP_UUID_LEN) /* @@ -876,7 +876,7 @@ void linphone_upnp_update_port_binding(UpnpContext *lupnp, UpnpPortBinding **por } } if(*port_mapping == NULL) { - *port_mapping = linphone_upnp_port_binding_new_or_collect(lupnp->pending_bindings, protocol, port, -1); + *port_mapping = linphone_upnp_port_binding_new_or_collect(lupnp->pending_bindings, protocol, port, port); } // Get addresses @@ -1053,11 +1053,17 @@ UpnpPortBinding *linphone_upnp_port_binding_new_with_parameters(upnp_igd_ip_prot UpnpPortBinding *linphone_upnp_port_binding_new_or_collect(MSList *list, upnp_igd_ip_protocol protocol, int local_port, int external_port) { UpnpPortBinding *tmp_binding; UpnpPortBinding *end_binding; - end_binding = linphone_upnp_port_binding_new_with_parameters(protocol, local_port, external_port); + + // Seek an binding with same protocol and local port + end_binding = linphone_upnp_port_binding_new_with_parameters(protocol, local_port, -1); tmp_binding = linphone_upnp_port_binding_equivalent_in_list(list, end_binding); - if(tmp_binding != NULL) { + + // Must be not attached to any struct + if(tmp_binding != NULL && tmp_binding->ref == 1) { linphone_upnp_port_binding_release(end_binding); - end_binding = tmp_binding; + end_binding = linphone_upnp_port_binding_retain(tmp_binding); + } else { + end_binding->external_port = external_port; } return end_binding; } @@ -1104,6 +1110,7 @@ void linphone_upnp_port_binding_log(int level, const char *msg, const UpnpPortBi } } +// Return true if the binding are equivalent. (Note external_port == -1 means "don't care") bool_t linphone_upnp_port_binding_equal(const UpnpPortBinding *port1, const UpnpPortBinding *port2) { return port1->protocol == port2->protocol && port1->local_port == port2->local_port && From 50410790fb12e3405ea7040b4341ab131698bbc4 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Tue, 9 Apr 2013 10:49:08 +0200 Subject: [PATCH 181/281] Updated translation file Clear missed call Add picture for unread messages --- gtk/calllogs.c | 6 +- gtk/chat.c | 7 +- gtk/friendlist.c | 46 +++--- gtk/incall_view.c | 8 +- gtk/linphone.h | 30 ++-- gtk/main.c | 4 +- po/cs.po | 342 ++++++++++++++++++++------------------- po/de.po | 339 +++++++++++++++++++------------------- po/es.po | 348 ++++++++++++++++++++------------------- po/fr.po | 402 ++++++++++++++++++++++++---------------------- po/he.po | 352 +++++++++++++++++++++------------------- po/hu.po | 360 +++++++++++++++++++++-------------------- po/it.po | 344 ++++++++++++++++++++------------------- po/ja.po | 341 ++++++++++++++++++++------------------- po/nb_NO.po | 344 ++++++++++++++++++++------------------- po/nl.po | 341 ++++++++++++++++++++------------------- po/pl.po | 341 ++++++++++++++++++++------------------- po/pt_BR.po | 341 ++++++++++++++++++++------------------- po/ru.po | 348 ++++++++++++++++++++------------------- po/sr.po | 348 ++++++++++++++++++++------------------- po/sv.po | 344 ++++++++++++++++++++------------------- po/zh_CN.po | 344 ++++++++++++++++++++------------------- po/zh_TW.po | 344 ++++++++++++++++++++------------------- 23 files changed, 3157 insertions(+), 2867 deletions(-) diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 7daa1b011..466541006 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -61,7 +61,7 @@ void linphone_gtk_call_log_chat_selected(GtkWidget *w){ gtk_tree_model_get(model,&iter,2,&pla,-1); la=(LinphoneAddress*)pla; if (la!=NULL){ - linphone_gtk_tree_view_set_chat_conversation(la); + linphone_gtk_friend_list_set_chat_conversation(la); } } } @@ -192,8 +192,9 @@ void linphone_gtk_call_log_clear_missed_call(){ GtkWidget *box=gtk_hbox_new(FALSE,0); GtkWidget *image=gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_MENU); GtkWidget *l; + const gchar*text=gtk_label_get_text(GTK_LABEL(linphone_gtk_get_widget(mw,"label3"))); - l=gtk_label_new("Recent calls"); + l=gtk_label_new(text); gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(box),l,FALSE,FALSE,0); gtk_notebook_set_tab_label(notebook,page,box); @@ -359,6 +360,7 @@ void linphone_gtk_history_row_selected(GtkWidget *treeview){ void linphone_gtk_clear_call_logs(GtkWidget *button){ linphone_core_clear_call_logs (linphone_gtk_get_core()); + linphone_gtk_call_log_clear_missed_call(); linphone_gtk_call_log_update(gtk_widget_get_toplevel(button)); } diff --git a/gtk/chat.c b/gtk/chat.c index a61afcf21..4fa1c917c 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -64,7 +64,7 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { g_return_if_fail(w!=NULL); gtk_notebook_remove_page(GTK_NOTEBOOK(nb),gtk_notebook_page_num(GTK_NOTEBOOK(nb),w)); - linphone_gtk_create_chat_picture(FALSE); + linphone_gtk_friend_list_update_chat_picture(); g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); g_object_set_data(G_OBJECT(w),"from_message",NULL); g_object_set_data(G_OBJECT(w),"cr",NULL); @@ -385,6 +385,7 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres g_signal_connect_swapped(G_OBJECT(button),"clicked",(GCallback)linphone_gtk_send_text,NULL); entry = linphone_gtk_get_widget(chat_view,"text_entry"); g_signal_connect_swapped(G_OBJECT(entry),"activate",(GCallback)linphone_gtk_send_text,NULL); + g_signal_connect(G_OBJECT(notebook),"switch_page",(GCallback)linphone_gtk_notebook_tab_select,NULL); ms_free(with_str); return chat_view; } @@ -404,13 +405,13 @@ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri, char *uri_only=linphone_address_as_string_uri_only(uri); MSList *messages=NULL; - linphone_chat_room_mark_as_read(cr); if(g_strcmp0(from_str,uri_only)!=0){ GtkTextView *text_view=GTK_TEXT_VIEW(linphone_gtk_get_widget(chat_view,"textview")); GtkTextIter start; GtkTextIter end; GtkTextBuffer *text_buffer; - + + linphone_chat_room_mark_as_read(cr); text_buffer=gtk_text_view_get_buffer(text_view); gtk_text_buffer_get_bounds(text_buffer, &start, &end); gtk_text_buffer_delete (text_buffer, &start, &end); diff --git a/gtk/friendlist.c b/gtk/friendlist.c index 3997e29f3..8f73c2fcb 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -87,11 +87,6 @@ static GdkPixbuf *create_chat_picture(){ return pixbuf; } -/*static GdkPixbuf *create_active_chat_picture(){ - GdkPixbuf *pixbuf; - pixbuf = create_pixbuf("active_chat.png"); - return pixbuf; -}*/ /* void linphone_gtk_set_friend_status(GtkWidget *friendlist , LinphoneFriend * fid, const gchar *url, const gchar *status, const gchar *img){ GtkTreeIter iter; @@ -226,18 +221,22 @@ static void linphone_gtk_call_selected(GtkTreeView *treeview){ "start_call")); } -void linphone_gtk_create_chat_picture(gboolean active){ +void linphone_gtk_friend_list_update_chat_picture(){ GtkTreeIter iter; GtkWidget *w = linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist)); + LinphoneChatRoom *cr=NULL; + int nbmsg=0; if (gtk_tree_model_get_iter_first(model,&iter)) { do{ - //if(!active){ + gtk_tree_model_get (model, &iter,FRIEND_CHATROOM , &cr, -1); + nbmsg=linphone_chat_room_get_unread_messages_count(cr); + if(nbmsg != 0){ + gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,create_unread_msg(),-1); + } else { gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,create_chat_picture(),-1); - //} else { - // gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,create_active_chat_picture(),-1); - //} + } }while(gtk_tree_model_iter_next(model,&iter)); } } @@ -247,7 +246,7 @@ static gboolean grab_focus(GtkWidget *w){ return FALSE; } -void linphone_gtk_tree_view_set_chat_conversation(const LinphoneAddress *la){ +void linphone_gtk_friend_list_set_chat_conversation(const LinphoneAddress *la){ GtkTreeIter iter; GtkListStore *store=NULL; GtkWidget *w = linphone_gtk_get_main_window(); @@ -270,7 +269,7 @@ void linphone_gtk_tree_view_set_chat_conversation(const LinphoneAddress *la){ linphone_gtk_load_chatroom(cr,la,chat_view); } gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,chat_view)); - linphone_gtk_create_chat_picture(FALSE); + linphone_gtk_friend_list_update_chat_picture(); g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(chat_view,"text_entry")); } else { store=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(friendlist))); @@ -295,7 +294,7 @@ void linphone_gtk_tree_view_set_chat_conversation(const LinphoneAddress *la){ linphone_gtk_load_chatroom(cr,uri,chat_view); } gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,chat_view)); - linphone_gtk_create_chat_picture(FALSE); + linphone_gtk_friend_list_update_chat_picture(); g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(chat_view,"text_entry")); break; } @@ -309,17 +308,16 @@ void linphone_gtk_notebook_tab_select(GtkNotebook *notebook,GtkWidget *page,guin GtkWidget *friendlist=linphone_gtk_get_widget(w,"contact_list"); GtkWidget *chat_view; LinphoneChatRoom *cr=NULL; - const LinphoneAddress *addr=(const LinphoneAddress *)data; - chat_view=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); - if(page != NULL){ - notebook=(GtkNotebook *)linphone_gtk_get_widget(w,"viewswitch"); - if(gtk_notebook_page_num(notebook,page)==gtk_notebook_page_num(notebook,chat_view)){ - cr=linphone_core_get_chat_room(linphone_gtk_get_core(),addr); - if(cr!=NULL){ + chat_view=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + if(page != NULL){ + notebook=(GtkNotebook *)linphone_gtk_get_widget(w,"viewswitch"); + if(gtk_notebook_page_num(notebook,page)==gtk_notebook_page_num(notebook,chat_view)){ + cr=g_object_get_data(G_OBJECT(chat_view),"cr"); + if(cr!=NULL){ linphone_chat_room_mark_as_read(cr); - linphone_gtk_show_friends(); + linphone_gtk_show_friends(); } - } + } } } @@ -355,9 +353,8 @@ void linphone_gtk_chat_selected(GtkWidget *item){ linphone_gtk_load_chatroom(cr,uri,page); } gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,page)); - linphone_gtk_create_chat_picture(FALSE); + linphone_gtk_friend_list_update_chat_picture(); g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(page,"text_entry")); - g_signal_connect(G_OBJECT(notebook),"switch_page",(GCallback)linphone_gtk_notebook_tab_select,(gpointer)uri); } } @@ -809,7 +806,6 @@ void linphone_gtk_show_friends(void){ escaped=g_markup_escape_text(uri,-1); gtk_list_store_set(store,&iter,FRIEND_SIP_ADDRESS,escaped,-1); g_free(escaped); - //linphone_gtk_update_chat_picture(); //bi=linphone_friend_get_info(lf); /*if (bi!=NULL && bi->image_data!=NULL){ GdkPixbuf *pbuf= diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 4ab0bd72e..44b35c03c 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -75,7 +75,7 @@ static GtkWidget *make_tab_header(int number){ return w; } -void update_tab_header(LinphoneCall *call,gboolean pause){ +void linphone_gtk_call_update_tab_header(LinphoneCall *call,gboolean pause){ GtkWidget *w=(GtkWidget*)linphone_call_get_user_pointer(call); GtkWidget *main_window=linphone_gtk_get_main_window(); GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(main_window,"viewswitch")); @@ -688,7 +688,7 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ gtk_label_set_text(GTK_LABEL(duration),_("00::00::00")); linphone_gtk_in_call_set_animation_image(callview,GTK_STOCK_MEDIA_PLAY,TRUE); - update_tab_header(call,FALSE); + linphone_gtk_call_update_tab_header(call,FALSE); linphone_gtk_enable_mute_button( GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),TRUE); @@ -843,7 +843,7 @@ void linphone_gtk_draw_hold_button(GtkButton *button, gboolean active){ void linphone_gtk_hold_clicked(GtkButton *button){ int active=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button),"active")); LinphoneCall *call=linphone_gtk_get_currently_displayed_call(NULL); - update_tab_header(call,active); + linphone_gtk_call_update_tab_header(call,active); if (!call) return; if(!active) { @@ -859,7 +859,7 @@ void linphone_gtk_enable_hold_button(LinphoneCall *call, gboolean sensitive, gbo GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer (call); GtkWidget *button; g_return_if_fail(callview!=NULL); - update_tab_header(call,!holdon); + linphone_gtk_call_update_tab_header(call,!holdon); button=linphone_gtk_get_widget(callview,"hold_call"); gtk_widget_set_sensitive(GTK_WIDGET(button),sensitive); gtk_widget_set_visible(GTK_WIDGET(button),sensitive); diff --git a/gtk/linphone.h b/gtk/linphone.h index 00484a04f..f987b2abe 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -58,7 +58,6 @@ GtkWidget *linphone_gtk_create_window(const char *window_name); GtkWidget *linphone_gtk_get_widget(GtkWidget *window, const char *name); GtkWidget *linphone_gtk_create_widget(const char *filename, const char *widget_name); - const char *linphone_gtk_message_storage_get_db_file(const char *filename); void linphone_gtk_show_assistant(void); void linphone_gtk_close_assistant(void); @@ -68,15 +67,11 @@ GtkWidget *linphone_gtk_get_main_window(); void linphone_gtk_display_something(GtkMessageType type,const gchar *message); void linphone_gtk_start_call(GtkWidget *button); void linphone_gtk_call_terminated(); -void linphone_gtk_show_friends(void); -void linphone_gtk_show_contact(LinphoneFriend *lf); void linphone_gtk_set_my_presence(LinphoneOnlineStatus ss); void linphone_gtk_show_parameters(void); void linphone_gtk_fill_soundcards(GtkWidget *pb); void linphone_gtk_fill_webcams(GtkWidget *pb); void linphone_gtk_load_identities(void); -LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with); -void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg); void linphone_gtk_call_log_update(GtkWidget *w); void linphone_gtk_create_log_window(void); void linphone_gtk_log_show(void); @@ -85,7 +80,6 @@ void linphone_gtk_log_push(OrtpLogLevel lev, const char *fmt, va_list args); void linphone_gtk_destroy_log_window(void); void linphone_gtk_refer_received(LinphoneCore *lc, const char *refer_to); gboolean linphone_gtk_check_logs(); -void linphone_gtk_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf); const gchar *linphone_gtk_get_ui_config(const char *key, const char *def); int linphone_gtk_get_ui_config_int(const char *key, int def); void linphone_gtk_set_ui_config_int(const char *key , int val); @@ -99,21 +93,25 @@ SipSetupContext* linphone_gtk_get_default_sip_setup_context(void); GtkWidget * linphone_gtk_show_buddy_lookup_window(SipSetupContext *ctx); void linphone_gtk_buddy_lookup_set_keyword(GtkWidget *w, const char *kw); void * linphone_gtk_wait(LinphoneCore *lc, void *ctx, LinphoneWaitingState ws, const char *purpose, float progress); - void linphone_gtk_terminate_call(GtkWidget *button); -void update_tab_header(LinphoneCall *call,gboolean pause); - +void linphone_gtk_call_update_tab_header(LinphoneCall *call,gboolean pause); void linphone_gtk_show_directory_search(void); void linphone_gtk_status_icon_set_blinking(gboolean val); void linphone_gtk_notify(LinphoneCall *call, const char *msg); -LinphoneChatRoom *linphone_gtk_start_chat(GtkTreeView* t); + void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri,GtkWidget *chat_view); void linphone_gtk_send_text(); GtkWidget * linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddress *with); -void linphone_gtk_create_chat_picture(gboolean active); -void linphone_gtk_update_chat_picture(); -void linphone_gtk_chat_set_conversation(const LinphoneAddress *uri,gchar *conversation); -gchar * linphone_gtk_chat_get_conversation(const LinphoneAddress *uri); +LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with); +void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg); + +void linphone_gtk_friend_list_update_chat_picture(); +void linphone_gtk_friend_list_set_chat_conversation(const LinphoneAddress *la); +gboolean linphone_gtk_friend_list_is_contact(const LinphoneAddress *addr); +void linphone_gtk_notebook_tab_select(GtkNotebook *notebook,GtkWidget *page,guint page_num, gpointer data); +void linphone_gtk_show_friends(void); +void linphone_gtk_show_contact(LinphoneFriend *lf); +void linphone_gtk_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf); /*functions controlling the different views*/ gboolean linphone_gtk_use_in_call_view(); @@ -151,6 +149,4 @@ void linphone_gtk_uninit_instance(void); void linphone_gtk_monitor_usb(void); void linphone_gtk_unmonitor_usb(void); -gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference); -void linphone_gtk_tree_view_set_chat_conversation(const LinphoneAddress *la); -gboolean linphone_gtk_friend_list_is_contact(const LinphoneAddress *addr); \ No newline at end of file +gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference); \ No newline at end of file diff --git a/gtk/main.c b/gtk/main.c index e3699757f..e914e42bd 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1232,10 +1232,10 @@ static void linphone_gtk_call_state_changed(LinphoneCore *lc, LinphoneCall *call break; case LinphoneCallPausing: linphone_gtk_enable_hold_button(call,TRUE,FALSE); - update_tab_header(call,FALSE); + linphone_gtk_call_update_tab_header(call,FALSE); case LinphoneCallPausedByRemote: linphone_gtk_in_call_view_set_paused(call); - update_tab_header(call,TRUE); + linphone_gtk_call_update_tab_header(call,TRUE); break; case LinphoneCallConnected: linphone_gtk_enable_hold_button (call,TRUE,TRUE); diff --git a/po/cs.po b/po/cs.po index 726ba26a4..481b7aa17 100644 --- a/po/cs.po +++ b/po/cs.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone-3.4.99.4\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2011-11-04 22:30+0100\n" "Last-Translator: Petr Pisar \n" "Language-Team: Czech \n" @@ -27,26 +27,41 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "Volat komu: %s" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "Poslat text komu: %s" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "Probíhá hovor" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "–" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "přerušen" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "promeškán" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "Odmítnout" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" @@ -54,7 +69,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" @@ -62,21 +77,26 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +msgid "%s\t%s" msgstr "" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "Konference" @@ -89,31 +109,35 @@ msgstr "Já" msgid "Couldn't find pixmap file: %s" msgstr "Nelze najít soubor s obrázkem: %s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "Neplatný sipový kontakt!" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "Za běhu vypisuje některé ladicí informace na standardní výstup." -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "Soubor, kam zapisovat protokol." -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "Spustí se pouze do systémové oblasti, nezobrazí hlavní okno." -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "Zavolá právě teď na tuto adresu" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "je-li nastaveno, automaticky zvedne příchozí hovor" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -121,12 +145,12 @@ msgstr "" "Zadejte pracovní adresář (měl by být základní instalační adresář, například " "c:\\Program Files\\Linphone)" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Hovor s %s" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -139,7 +163,7 @@ msgstr "" "do svého adresáře?\n" "Odpovíte-li ne, tato osobo bude dočasně blokována." -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -148,59 +172,59 @@ msgstr "" "Prosím, zadejte heslo pro uživatele %s\n" "v doméně %s:" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "Chyba hovoru" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Hovor ukončen" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Příchozí hovor" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Odpovědět" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Odmítnout" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "Hovor odložen" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "Porty" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Odkaz na webovou stránku" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Lipnhone – internetový videofon" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Výchozí)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Byly jsme přepojeni na %s" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -208,63 +232,54 @@ msgstr "" "Na tomto počítači nebyla objevena žádná zvuková karta.\n" "Nebudete moci vytáčet a přijímat a zvukové hovory." -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "Volný SIP videofon" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 #, fuzzy msgid "Add to addressbook" msgstr "Zobrazit adresář" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Stav" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Jméno" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Volat komu: %s" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 #, fuzzy msgid "Chat" msgstr "Diskuzní skupina" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Hledat v adresáři %s" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "Neplatný sipový kontakt!" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "Volat komu: %s" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "Poslat text komu: %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Upravit kontakt „%s“" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Odstranit kontakt „%s“" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "Odstranit kontakt „%s“" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "Přidat nový kontakt z adresáře %s" @@ -365,20 +380,24 @@ msgstr "norština" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Aby se projevil výběr nového jazyka, je nutné znovu spustit linphone." -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Žádná" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "ZRTP" @@ -634,114 +653,114 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Volá se…" -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00:00:00" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Příchozí hovor" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "dobrá" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "průměrná" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "slabá" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "velmi slabá" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "příliš špatná" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "nedostupná" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "Probíhá konference" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "Probíhá hovor" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Odložený hovor" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i:%02i:%02i" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Hovor skončil." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 #, fuzzy msgid "Transfer done." msgstr "Přepojit" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Přepojit" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Obnovit" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Odložit" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, fuzzy msgid "(Paused)" msgstr "Odložit" @@ -764,157 +783,152 @@ msgstr "Odeslat" msgid "End conference" msgstr "Probíhá konference" -# XXX: Do not translate, this is GTK identifier -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "Přepojit" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "Telefonuje se" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "Délka" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "Hodnocení kvality hovoru" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "V_olby" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "Zobrazovat sám sebe" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "Nápo_věda" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "Zobrazit ladicí okno" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "_Domovská stránka" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "Vyhledat akt_ualizace" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 #, fuzzy msgid "Account assistant" msgstr "Průvodce nastavením účtu" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "SIP adresa nebo telefonní číslo:" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "Zahájit nový hovor" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 msgid "Contacts" msgstr "Kontakty" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Přidat" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Upravit" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "Hledat" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 msgid "Add contacts from directory" msgstr "Přidat kontakty z adresáře" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 msgid "Add contact" msgstr "Přidat kontakt" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 msgid "Recent calls" msgstr "Nedávné hovory" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Moje současná totožnost:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Uživatelské jméno" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Heslo" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Připojení k Internetu:" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Přihlašovat mě automaticky" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Informace o přihlášení" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Vítejte!" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "všech uživatelích" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "připojených uživatelích" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "Fiber Channel" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Výchozí" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1529,7 +1543,7 @@ msgstr "" msgid "Outgoing call" msgstr "Odchozí hovor" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "Připraven." @@ -1584,11 +1598,11 @@ msgstr "Připojeno." msgid "Call aborted" msgstr "Hovor přerušen" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "Hovor nebylo možné odložit" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "Současný hovor se odkládá…" @@ -1688,116 +1702,116 @@ msgstr "" "SIP identita, kterou jste zadali, není platná.\n" "Měla by mít tvar sip:uživatel@proxydoména, například sip:alice@example.net" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Nelze se přihlásit jako %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Vyzvání na druhé straně." -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "Vyzvání na druhé straně…" -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Časná média." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "Hovor s %s je odložen." -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "Hovor přijat kým: %s – odložen." -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Hovor obnoven." -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "Hovor přijat kým: %s." -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "Byli jsme obnoveni…" -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 #, fuzzy msgid "Call is updated by remote." msgstr "Hovor byl aktualizován protistranou…" -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Hovor ukončen." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Uživatel je zaneprázdněn." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Uživatel je dočasně nedostupný." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Uživatel si nepřeje být rušen." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Volání odmítnuto." -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Žádná odpověď." -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Chyba protokolu." -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Přesměrováno" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "Volání se nezdařilo." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registrace na %s byla úspěšná." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Odregistrování z %s hotovo." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "odpověď nedorazila včas" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrace na %s selhala: %s" @@ -1807,7 +1821,7 @@ msgstr "Registrace na %s selhala: %s" msgid "Authentication token is %s" msgstr "Klíč k ověření totožnosti je %s" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/de.po b/po/de.po index a4745d95f..44c1e66ea 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2012-11-07 19:27+0100\n" "Last-Translator: Gerhard Stengel \n" "Language-Team: German \n" @@ -17,53 +17,73 @@ msgstr "" "X-Generator: Lokalize 1.5\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "„%s“ anrufen" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "Text zu „%s“ schicken" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "Im Gespräch" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "nicht verfügbar" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 msgid "Aborted" msgstr "Abgebrochen" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 msgid "Missed" msgstr "Entgangen" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 msgid "Declined" msgstr "Abgewiesen" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i Minute" msgstr[1] "%i Minuten" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i Sekunde" msgstr[1] "%i Sekunden" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format +msgid "%s\t%s" +msgstr "" + +#: ../gtk/calllogs.c:323 +#, fuzzy, c-format msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" "%s\t%s\tQualität: %s\n" "%s\t%s %s\t" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:329 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "Konferenz" @@ -76,33 +96,37 @@ msgstr "Eigenes Telefon" msgid "Couldn't find pixmap file: %s" msgstr "Pixmapdatei %s kann nicht gefunden werden." -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "Ungültiger SIP-Kontakt!" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "Ausgabe von Debug-Informationen auf stdout während der Laufzeit" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "Pfad zu einer Datei, in die Protokolle geschrieben werden." -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "Linphone mit ausgeschaltetem Video starten." -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "" "Nur im Systemabschnitt der Kontrollleiste starten, aber das Hauptfenster " "nicht zeigen." -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "Im Moment anzurufende Adresse" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "Falls aktiviert, werden eingehende Anrufe automatisch beantwortet" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -110,12 +134,12 @@ msgstr "" "Geben Sie einen Arbeitsordner an (sollte der Installationsordner sein, z. B. " "C:\\Programme\\Linphone)" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Im Gespräch mit %s" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -128,7 +152,7 @@ msgstr "" "Ihrer Kontaktliste hinzufügen?\n" "Wenn Sie mit Nein antworten, wird diese Person vorläufig blockiert." -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -137,59 +161,59 @@ msgstr "" "Geben Sie bitte Ihr Passwort für den Benutzernamen %s\n" " auf der Domäne %s ein:" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "Anruf fehlgeschlagen" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Anruf beendet" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Eingehender Anruf" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Annehmen" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Abweisen" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "Anruf wird gehalten" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, c-format msgid "by %s" msgstr "von %s" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s schlägt vor, eine Videoübertragung zu starten. Nehmen Sie an?" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Website-Verknüpfung" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - ein Internet-Video-Telefon" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Vorgabe)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Vermittlung nach %s" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -197,61 +221,52 @@ msgstr "" "Auf diesem Rechner können keine Soundkarten gefunden werden.\n" "Sie können keine Audio-Anrufe tätigen oder entgegennehmen." -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "Ein freies SIP-Video-Telefon" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "Zum Adressbuch hinzufügen" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Anwesenheitsstatus" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Name" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 msgid "Call" msgstr "Anrufen" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 #, fuzzy msgid "Chat" msgstr "Chat Raum" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Im %s-Verzeichnis suchen" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "Ungültiger SIP-Kontakt!" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "„%s“ anrufen" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "Text zu „%s“ schicken" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Kontakt „%s“ bearbeiten" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Kontakt „%s“ löschen" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "Kontakt „%s“ löschen" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "Einen neuen Kontakt aus dem %s-Verzeichnis hinzufügen" @@ -352,22 +367,26 @@ msgstr "Norwegisch" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" "Linphone muss neu gestartet werden, damit die neue Spracheinstellung wirksam " "wird." -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Keinen" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -621,112 +640,112 @@ msgstr "" msgid "%.3f seconds" msgstr "%i Sekunde" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Verbindungsaufbau..." -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Eingehender Anruf" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "gut" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "durchschnittlich" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "schlecht" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "sehr schlecht" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "zu schlecht" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "nicht verfügbar" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "Gesichert durch SRTP" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Gesichert durch ZRTP - [Auth.-Token: %s]" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "Auf „Ungeprüft“ setzen" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Auf „Geprüft“ setzen" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "In Konferenz" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "Im Gespräch" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Gehaltener Anruf" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Anruf beendet." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "Vermittlung läuft" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "Vermittlung abgeschlossen." -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 msgid "Transfer failed." msgstr "Vermittlung fehlgeschlagen." -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Fortsetzen" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Halten" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, fuzzy msgid "(Paused)" msgstr "Halten" @@ -749,155 +768,151 @@ msgstr "Senden" msgid "End conference" msgstr "In Konferenz" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "Vermittlung" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "Im Gespräch" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "Dauer" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "Bewertung der Verbindungsqualität" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "_Optionen" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "Video immer starten" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "Selbstansicht ein" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "_Hilfe" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "Debug-Fenster anzeigen" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "Auf _Aktualisierungen überprüfen" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 msgid "Account assistant" msgstr "Konto-Einrichtungsassistent" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "SIP-Adresse oder Telefonnummer:" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "Einen neuen Anruf beginnen" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 msgid "Contacts" msgstr "Kontakte" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Hinzufügen" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Bearbeiten" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "Suchen" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 msgid "Add contacts from directory" msgstr "Kontakte aus einem Verzeichnis hinzufügen" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 msgid "Add contact" msgstr "Kontakt hinzufügen" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 msgid "Recent calls" msgstr "Letzte Gespräche" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Aktuelle Identität:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Benutzername" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Passwort" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Internetverbindung:" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Automatisch anmelden" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Anmeldeinformationen" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Willkommen !" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "Alle Teilnehmer" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "Angemeldete Teilnehmer" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "Glasfaserkabel" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Vorgabe" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1508,7 +1523,7 @@ msgstr "" msgid "Outgoing call" msgstr "Abgehender Anruf" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "Bereit" @@ -1564,11 +1579,11 @@ msgstr "Verbunden." msgid "Call aborted" msgstr "Anruf abgebrochen" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "Anruf kann nicht gehalten werden" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "Aktueller Anruf wird gehalten..." @@ -1669,115 +1684,115 @@ msgstr "" "Sie sollte wie sip:benutzername@proxydomain aussehen, also z.B. sip:" "alice@beispiel.net" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Anmeldung als %s fehlgeschlagen" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Klingeln bei der Gegenseite." -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "Klingeln bei der Gegenseite..." -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "Anruf mit %s wird gehalten." -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "Der von %s entgegengenommene Anruf wird gehalten." -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Anruf fortgesetzt." -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "Anruf wird von %s entgegengenommen." -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 #, fuzzy msgid "Incompatible, check codecs or security settings..." msgstr "Inkompatibel, überprüfen Sie die Codecs..." -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "Anruf wird fortgesetzt." -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "Anruf wird von der Gegenseite gehalten." -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "Anruf ist von der Gegenseite aktualisiert worden." -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Anruf beendet." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Teilnehmer ist besetzt." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Teilnehmer zur Zeit nicht verfügbar." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Teilnehmer möchte nicht gestört werden." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Anruf abgewiesen" -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Keine Antwort." -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Protokollfehler" -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Umgeleitet" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "Inkompatible Medienparameter." -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "Anruf fehlgeschlagen." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registrierung auf %s erfolgreich." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Abmeldung von %s ist erfolgt." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "Zeitüberschreitung bei der Antwort" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrierung auf %s fehlgeschlagen: %s" @@ -1787,7 +1802,7 @@ msgstr "Registrierung auf %s fehlgeschlagen: %s" msgid "Authentication token is %s" msgstr "Authentifizierungs-Token ist %s" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/es.po b/po/es.po index 9bdca11b7..90fa0f926 100644 --- a/po/es.po +++ b/po/es.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Linphone 0.9.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2012-12-06 15:54+0100\n" "Last-Translator: BERAUDO Guillaume \n" "Language-Team: es \n" @@ -15,58 +15,80 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "Llamar a %s" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "Enviar mensaje a %s" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "En llamada " + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "n/a" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "abortada" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "perdida" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "Rechazar" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minuto" msgstr[1] "%i minutos" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i segundo" msgstr[1] "%i segundos" -#: ../gtk/calllogs.c:103 -#, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, fuzzy, c-format +msgid "%s\t%s" msgstr "" "%s\t%s\tCalidad: %s\n" "%s\t%s %s\t" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, fuzzy, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" "%s\t%s\tCalidad: %s\n" "%s\t%s %s\t" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, fuzzy, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" +"%s\t%s\tCalidad: %s\n" +"%s\t%s %s\t" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "Conferencia" @@ -79,32 +101,36 @@ msgstr "Yo" msgid "Couldn't find pixmap file: %s" msgstr "No se pudo encontrar el archivo pixmap: %s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "¡Contacto SIP no válido!" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "" "registra a stdout cierta información de depuración durante la ejecución." -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "ruta a un fichero donde escribir logs." -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "Iniciar sólo en la barra de tareas, no mostrar la interfaz principal." -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "dirección a la que llamar inmediatamente" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "si está activo, responder a llamadas entrantes automáticamente" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -112,12 +138,12 @@ msgstr "" "Especifique un directorio de trabajo (debería ser la raíz de la instalación, " "ej: c:\\Archivos de Programa\\Linphone)" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Llamar con %s" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -130,7 +156,7 @@ msgstr "" "contactos?\n" "Si responde no, esta persona será bloqueada temporalmente." -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -139,63 +165,63 @@ msgstr "" "Por favor, introduzca la contraseña para el usuario %s\n" " en el dominio %s:" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Error en la llamada." -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 #, fuzzy msgid "Call ended" msgstr "Llamada terminada" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Llamada entrante" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Contestar" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 #, fuzzy msgid "Decline" msgstr "Rechazar" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "Llamada en pausa" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "Puertos" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Enlace a la Web" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - un video-teléfono a través de Internet" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Opción predeterminada)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Somos transferidos a %s" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -203,63 +229,54 @@ msgstr "" "No se ha encontrado una tarjeta de sonido en este equipo.\n" "No será posible realizar o recibir llamadas de audio." -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "Un video-teléfono SIP gratuito" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 #, fuzzy msgid "Add to addressbook" msgstr "Añadir a la agenda" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 #, fuzzy msgid "Presence status" msgstr "Estado de Presencia" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nombre" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Llamada" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Buscar en el directorio %s" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "¡Contacto SIP no válido!" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "Llamar a %s" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "Enviar mensaje a %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "Editar contacto '%s'" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Eliminar contacto '%s'" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "Eliminar contacto '%s'" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "Añadir nuevo contacto desde el directorio %s" @@ -360,21 +377,25 @@ msgstr "Noruego" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Deberá reiniciar linphone para aplicar la nueva selección de lenguaje" -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 #, fuzzy msgid "None" msgstr "Ninguno." -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "ZRTP" @@ -632,119 +653,119 @@ msgstr "" msgid "%.3f seconds" msgstr "%i segundo" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." msgstr " Llamando..." -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "Llamada entrante" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "buena" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "media" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "mala" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "muy mala" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "demasiado mala" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "no disponible" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "Cifrada con SRTP" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Cifrada con ZRTP - [token de autenticación: %s]" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "Set sin verificar" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Set verificado" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "En conferencia" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "En llamada " -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "Llamada en pausa" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 #, fuzzy msgid "Call ended." msgstr "Llamada finalizada." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 #, fuzzy msgid "Transfer done." msgstr "Transferir" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Transferir" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Reanudar" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Pausar" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, fuzzy msgid "(Paused)" msgstr "Pausar" @@ -769,172 +790,168 @@ msgstr "Enviar" msgid "End conference" msgstr "En conferencia" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "etiqueta" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "Transferir" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 #, fuzzy msgid "In call" msgstr "En llamada " -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 #, fuzzy msgid "Duration" msgstr "Duración" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "Calidad de la llamada" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "_Opciones" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 #, fuzzy msgid "Enable self-view" msgstr "Activar vista propia" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "_Ayuda" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 #, fuzzy msgid "Show debug window" msgstr "Mostrar ventana de depuración" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "_Pagina_de_Inicio" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "Buscar_Actualizaciones" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 #, fuzzy msgid "Account assistant" msgstr "Asistente de configuración de cuenta" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 #, fuzzy msgid "SIP address or phone number:" msgstr "Dirección SIP o número de teléfono" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "Iniciar nueva llamada" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 #, fuzzy msgid "Contacts" msgstr "Contactos" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Añadir" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Editar" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "Buscar" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 #, fuzzy msgid "Add contacts from directory" msgstr "Añadir contactos desde un directorio" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" msgstr "Añadir contacto" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "Llamadas recientes " -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "My current identity:" msgstr "Mi identidad actual:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 #, fuzzy msgid "Username" msgstr "Nombre de usuario" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 #, fuzzy msgid "Password" msgstr "Contraseña:" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Conexión a Internet" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Iniciar sesión automáticamente" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Login information" msgstr "Datos de inicio de sesión" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Welcome !" msgstr "¡Bienvenido/a!" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "Todos los usuarios" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "Usuarios conectados" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "Canal de Fibra" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" msgstr "Predeterminado" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1586,7 +1603,7 @@ msgstr "" msgid "Outgoing call" msgstr "Llamada saliente" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 #, fuzzy msgid "Ready" msgstr "Preparado" @@ -1648,11 +1665,11 @@ msgstr "Conectado." msgid "Call aborted" msgstr "Llamada abortada" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "No se pudo pausar la llamada" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "Pausando la llamada actual..." @@ -1757,121 +1774,121 @@ msgstr "" "Debe ser del tipo sip:username@proxydomain, como por ejemplo sip:" "alice@example.net" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, fuzzy, c-format msgid "Could not login as %s" msgstr "No se pudo iniciar sesión como %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 #, fuzzy msgid "Remote ringing." msgstr "El destinatario está sonando..." -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "El destinatario está sonando..." -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Medios iniciales." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "La llamada con %s está puesta en pausa." -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "Llamada respondida por %s - en espera." -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "Llamada reanudada." -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, fuzzy, c-format msgid "Call answered by %s." msgstr "Llamada respondida por %s." -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "Nos han reanudado..." -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 #, fuzzy msgid "Call is updated by remote." msgstr "La llamada ha sido actualizada por el destinatario..." -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 #, fuzzy msgid "Call terminated." msgstr "Llamada finalizada." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "El usuario está ocupado." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "El usuario no está disponible temporalmente." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "El usuario no quiere que le molesten." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Llamada rechazada." -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "No hay respuesta." -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Error de protocolo." -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Redigirida" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "La llamada ha fallado." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, fuzzy, c-format msgid "Registration on %s successful." msgstr "Se ha registrado con éxito en %s." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "Cancelación de registro en %s completada." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "timeout sin respuesta" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "El registro en %s ha fallado." @@ -1881,13 +1898,16 @@ msgstr "El registro en %s ha fallado." msgid "Authentication token is %s" msgstr "El tóken de autenticación es%s" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "Tiene %i llamada perdida." msgstr[1] "Tiene %i llamadas perdidas." +#~ msgid "label" +#~ msgstr "etiqueta" + #~ msgid "Chat with %s" #~ msgstr "Conversación con %s" diff --git a/po/fr.po b/po/fr.po index 322a2ff4c..d4cb84c52 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Linphone 0.9.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" -"PO-Revision-Date: 2002-12-06 17:33+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"PO-Revision-Date: 2013-04-08 16:46+0100\n" "Last-Translator: Simon Morlat \n" "Language-Team: french \n" "Language: \n" @@ -15,51 +15,71 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "Appeler %s" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "Chatter avec %s" + +#: ../gtk/calllogs.c:223 +#, c-format +msgid "Recent calls (%i)" +msgstr "Appels récents (%i)" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "inconnu" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 msgid "Aborted" msgstr "Abandonné" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 msgid "Missed" msgstr "Manqué" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 msgid "Declined" msgstr "Refusé" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +msgid "%s\t%s" msgstr "" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "Conférence" @@ -72,31 +92,35 @@ msgstr "Moi" msgid "Couldn't find pixmap file: %s" msgstr "Icone non trouvée: %s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "Contact sip invalide !" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "affiche des informations de debogage" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." -msgstr "" +msgstr "Démarrer linphone avec la vidéo désactivée." -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "Démarre iconifié, sans interface principale." -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "addresse à appeler maintenant" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "si positionné, répond automatiquement aux appels entrants" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -104,12 +128,12 @@ msgstr "" "Spécifie un répertoire de travail (qui devrait être le répertoire " "d'installation, par exemple c:\\Program Files\\Linphone)" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Appel avec %s" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -123,7 +147,7 @@ msgstr "" "Si vous répondez non, cette personne sera mise temporairement sur liste " "noire." -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -132,59 +156,59 @@ msgstr "" "Entrez le mot de passe pour %s\n" " sur le domaine %s:" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "Erreur lors de l'appel" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Appel terminé." -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Appel entrant" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Répondre" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Refuser" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "Appel en pause" -#: ../gtk/main.c:1137 -#, fuzzy, c-format +#: ../gtk/main.c:1142 +#, c-format msgid "by %s" -msgstr "Ports utilisés" +msgstr "" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Lien site web" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - un téléphone video pour l'internet" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (par défaut)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Transfert vers %s" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -192,60 +216,51 @@ msgstr "" "Aucune carte son n'a été détectée sur cet ordinateur.\n" "Vous ne pourrez pas effectuer d'appels audio." -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "Un visiophone libre" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "Ajouter au carnet d'adresse" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Info de présence" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nom" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 msgid "Call" msgstr "Appeler" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Rechercher dans l'annuaire de %s" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "Contact sip invalide !" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "Appeler %s" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "Chatter avec %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Editer le contact '%s'" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Supprimer le contact '%s'" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, c-format +msgid "Delete chat history of '%s'" +msgstr "Supprimer l'historique de chat de '%s'" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "Ajouter un contact depuis l'annuaire %s" @@ -346,22 +361,26 @@ msgstr "Norvégien" msgid "Hebrew" msgstr "Hébreu" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "Serbe" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" "La nouvelle selection de langue prendra effet au prochain démarrage de " "linphone." -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" -msgstr "" +msgstr "Aucun" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -382,7 +401,7 @@ msgstr "Prénom, Nom" #: ../gtk/buddylookup.c:160 msgid "Error communicating with server." -msgstr "" +msgstr "Erreur de communication avec le serveur." #: ../gtk/buddylookup.c:164 msgid "Connecting..." @@ -408,22 +427,24 @@ msgid "" "Welcome !\n" "This assistant will help you to use a SIP account for your calls." msgstr "" +"Bienvenue!\n" +"Cet assistant va vous aider à utiliser un compte SIP pour vos appels." #: ../gtk/setupwizard.c:43 msgid "Create an account on linphone.org" -msgstr "" +msgstr "Créer un compte sur linphone.org" #: ../gtk/setupwizard.c:44 msgid "I have already a linphone.org account and I just want to use it" -msgstr "" +msgstr "J'ai déjà un compte linphone.org et je souhaite l'utiliser" #: ../gtk/setupwizard.c:45 msgid "I have already a sip account and I just want to use it" -msgstr "" +msgstr "J'ai déjà un compte Sip et je souhaite l'utiliser" #: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" -msgstr "" +msgstr "Entrez votre identifiant linphone.org" #: ../gtk/setupwizard.c:92 msgid "Username:" @@ -447,7 +468,7 @@ msgstr "Mot de passe*" #: ../gtk/setupwizard.c:125 msgid "Domain*" -msgstr "" +msgstr "Domaine*" #: ../gtk/setupwizard.c:126 msgid "Proxy" @@ -455,7 +476,7 @@ msgstr "" #: ../gtk/setupwizard.c:298 msgid "(*) Required fields" -msgstr "" +msgstr "(*) Champs requis" #: ../gtk/setupwizard.c:299 msgid "Username: (*)" @@ -471,7 +492,7 @@ msgstr "" #: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" -msgstr "" +msgstr "Confirmez votre mot de passe: (*)" #: ../gtk/setupwizard.c:369 msgid "" @@ -499,9 +520,8 @@ msgid "Account setup assistant" msgstr "" #: ../gtk/setupwizard.c:575 -#, fuzzy msgid "Configure your account (step 1/1)" -msgstr "Configuer un compte SIP" +msgstr "Configurez votre compte" #: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" @@ -566,7 +586,7 @@ msgstr "" #: ../gtk/incall_view.c:238 msgid "uPnP not activated" -msgstr "" +msgstr "uPnP non activé" #: ../gtk/incall_view.c:240 #, fuzzy @@ -603,112 +623,112 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" -msgstr "" +msgstr "Raccrocher" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Tentative d'appel..." -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Appel entrant" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "bon" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "moyen" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "faible" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "très faible" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "nulle" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "indisponible" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "Sécurisé par SRTP" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Sécurisé par ZRTP- [jeton: %s]" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "Marquer comme non vérifié" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Marquer comme vérifié" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "En conférence" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "Appel en cours" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Appel en attente" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Appel terminé." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" -msgstr "" +msgstr "Transfert en cours" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "Transfert terminé" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 msgid "Transfer failed." msgstr "Transfert échoué" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Reprendre" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Pause" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, fuzzy msgid "(Paused)" msgstr "Pause" @@ -730,157 +750,153 @@ msgstr "Envoyer" msgid "End conference" msgstr "Fin de conférence" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "Vidéo" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "Transfert" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "Appel en cours" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "Durée" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "Qualité de l'appel" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" -msgstr "" +msgstr "Toujours démarrer la vidéo" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "Se voir" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "_Aide" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "Fenêtre de débogage" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "_Site web" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 msgid "Account assistant" msgstr "" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "Adresse SIP ou numéro" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "Démarrer un nouvel appel" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 msgid "Contacts" msgstr "Contacts" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Ajouter" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Editer" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "Rechercher" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 msgid "Add contacts from directory" msgstr "Ajouter un contact depuis l'annuaire" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 msgid "Add contact" msgstr "Ajouter un contact." -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 msgid "Recent calls" msgstr "Appels récents" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Mon identité sip:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Nom d'utilisateur" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Mot de passe" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Me connecter automatiquement" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Information de login" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Bienvenue !" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "Tous" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "En ligne" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Par défaut" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" -msgstr "" +msgstr "Supprimer" #: ../gtk/about.ui.h:1 msgid "About linphone" @@ -935,7 +951,7 @@ msgstr "" #: ../gtk/password.ui.h:1 msgid "Linphone - Authentication required" -msgstr "Linphone - Autentification demandée" +msgstr "Linphone - Authentification demandée" #: ../gtk/password.ui.h:2 msgid "Please enter the domain password" @@ -975,7 +991,7 @@ msgstr "" #: ../gtk/sip_account.ui.h:5 msgid "SIP Proxy address:" -msgstr "Addresse du proxy SIP:" +msgstr "Adresse du proxy SIP:" #: ../gtk/sip_account.ui.h:6 msgid "Looks like sip:" @@ -999,7 +1015,7 @@ msgstr "Publier la présence" #: ../gtk/sip_account.ui.h:11 msgid "Configure a SIP account" -msgstr "Configuer un compte SIP" +msgstr "Configurer un compte SIP" #: ../gtk/parameters.ui.h:1 msgid "default soundcard" @@ -1023,7 +1039,7 @@ msgstr "Codecs audio" #: ../gtk/parameters.ui.h:6 msgid "Video codecs" -msgstr "Codecs video" +msgstr "Codecs vidéo" #: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 msgid "C" @@ -1162,11 +1178,11 @@ msgstr "Son" #: ../gtk/parameters.ui.h:40 msgid "Video input device:" -msgstr "Périphérique d'entrée video" +msgstr "Périphérique d'entrée vidéo" #: ../gtk/parameters.ui.h:41 msgid "Prefered video resolution:" -msgstr "Résolution video préférée:" +msgstr "Résolution de vidéo préférée:" #: ../gtk/parameters.ui.h:42 msgid "Video" @@ -1179,8 +1195,8 @@ msgstr "Paramètres multimedia" #: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" msgstr "" -"Cette rubrique permet de définir son addresse SIP lorsqu'on ne possède pas " -"de compte SIP" +"Cette rubrique permet de définir son adresse SIP lorsqu'on ne possède pas de " +"compte SIP" #: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" @@ -1192,7 +1208,7 @@ msgstr "Votre nom d'utilisateur:" #: ../gtk/parameters.ui.h:47 msgid "Your resulting SIP address:" -msgstr "Votre addresse SIP:" +msgstr "Votre adresse SIP:" #: ../gtk/parameters.ui.h:48 msgid "Default identity" @@ -1480,7 +1496,7 @@ msgstr "" msgid "Outgoing call" msgstr "Appel sortant" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "Prêt." @@ -1535,11 +1551,11 @@ msgstr "En ligne." msgid "Call aborted" msgstr "Appel abandonné" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "La mise en attente a échoué" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "Mise en attente de l'appel..." @@ -1641,116 +1657,116 @@ msgstr "" "Elle doit être de la forme sip:username@domain, comme par example sip:" "alice@example.net" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Echec de la connexion en tant que %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Sonnerie distante." -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "Sonnerie distante..." -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." -msgstr "Prise d'appel anticipée" +msgstr "Prise d'appel anticipée." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "%s est maintenant en attente." -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "Appel répondu par %s - en attente" -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Appel repris." -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "Appel répondu par %s." -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "Reprise..." -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 #, fuzzy msgid "Call is updated by remote." msgstr "L'appel a été repris par le correspondant." -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Appel terminé." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Occupé..." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "L'usager est temporairement indisponible." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "L'usager ne souhaite pas être dérangé" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Appel décliné." -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Pas de réponse." -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Erreur de protocole" -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Redirection" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "L'appel a échoué." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Enregistrement sur %s effectué." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Désenregistrement sur %s effectué." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "Pas de réponse" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Echec de l'enregistrement sur %s: %s" @@ -1760,7 +1776,7 @@ msgstr "Echec de l'enregistrement sur %s: %s" msgid "Authentication token is %s" msgstr "Le jeton d'authentification est %s" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/he.po b/po/he.po index 7439d2651..b8b2895b8 100644 --- a/po/he.po +++ b/po/he.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Linphone 3.5.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2012-12-27 10:14+0200\n" "Last-Translator: Isratine Citizen \n" "Language-Team: Rahut \n" @@ -19,59 +19,82 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.5.4\n" -#: ../gtk/calllogs.c:82 +# צור קשר עם +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "התקשר אל %s" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "שלח טקסט אל %s" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "בשיחה כעת" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "לא זמין (n/a)" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "ננטשה" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "הוחמצה" # דחיה -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "לדחות" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "דקה %i" msgstr[1] "%i דקות" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "שניה %i" msgstr[1] "%i שניות" -#: ../gtk/calllogs.c:103 -#, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, fuzzy, c-format +msgid "%s\t%s" msgstr "" "%s\t%s\tאיכות: %s\n" "%s\t%s %s\t" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, fuzzy, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" "%s\t%s\tאיכות: %s\n" "%s\t%s %s\t" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, fuzzy, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" +"%s\t%s\tאיכות: %s\n" +"%s\t%s %s\t" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "ועידה" @@ -84,42 +107,47 @@ msgstr "אני" msgid "Couldn't find pixmap file: %s" msgstr "לא ניתן למצוא קובץ ‫pixmap: ‫%s" +# איש־קשר +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "כתובת sip לא תקפה !" + # cli -#: ../gtk/main.c:88 +#: ../gtk/main.c:92 #, fuzzy msgid "log to stdout some debug information while running." msgstr "רשום אל stdout מידע ניפוי שגיאות מסוים בזמן ביצוע." # cli -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 #, fuzzy msgid "path to a file to write logs into." msgstr "נתיב אל קובץ שברצונך לרשום אליו את הרשומות." -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" # cli -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 #, fuzzy msgid "Start only in the system tray, do not show the main interface." msgstr "התחל במגש המערכת בלבד, אל תציג את הממשק הראשי." # cli -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 #, fuzzy msgid "address to call right now" msgstr "כתובת להתקשרות ברגע זה" # cli -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 #, fuzzy msgid "if set automatically answer incoming calls" msgstr "באם אפשרות זו נקבעת ענה אוטומטית לקריאות נכנסות" # cli -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 #, fuzzy msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" @@ -128,14 +156,14 @@ msgstr "" "ציין מדור העבודה (אמור להיות מבוסס על ההתקנה, למשל: c:\\Program Files" "\\Linphone)" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "התקשרות באמצעות %s" # הקשר שלהם # אם התשובה -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -148,7 +176,7 @@ msgstr "" "שלך ?\n" "היה ותשובתך תהיה לא, אדם זה יהיה מסומן באופן זמני ברשימה השחורה." -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -158,64 +186,64 @@ msgstr "" " בתחום %s:" # שיחה -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "שגיאת קריאה" # Conversation ended -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "שיחה הסתיימה" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "קריאה נכנסת" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "לענות" # דחיה -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "לדחות" # Conversation paused -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "שיחה הושהתה" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "Ports utilisés" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "קישור אתר רשת" # ‫Linphone - וידאופון במרשתת -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "‫Linphone - וידאופון אינטרנטי" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "‫%s (משתמטת)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "אנחנו מועברים אל %s" # קריאות שמע -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -223,63 +251,52 @@ msgstr "" "לא אותרו כרטיסי קול במחשב זה.\n" "לא תהיה ביכולתך לשלוח או לקבל שיחות שמע." -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "וידאופון SIP חופשי" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "הוסף אל ספר כתובות" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "מצב נוכחות" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "שם" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 msgid "Call" msgstr "קריאה" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" # a name or a number -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "חיפוש במדור %s" -# איש־קשר -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "כתובת sip לא תקפה !" - -# צור קשר עם -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "התקשר אל %s" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "שלח טקסט אל %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "ערוך איש קשר '%s'" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "מחק איש קשר '%s'" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "מחק איש קשר '%s'" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "הוסף איש קשר חדש מן מדור %s" @@ -384,21 +401,25 @@ msgstr "norsk" msgid "Hebrew" msgstr "" +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + # selected הנבחרת -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "עליך לאתחל את לינפון כדי שהשפה החדשה תיכנס לתוקף." -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "ללא" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -659,121 +680,121 @@ msgstr "" msgid "%.3f seconds" msgstr "שניה %i" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "מתקשר כעת..." -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "‭00::00::00" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "קריאה נכנסת" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "טובה" # רגילה -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "ממוצעת" # weak חלשה חלושה רפויה רופפת -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "דלה" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "דלה מאוד" # רעה -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "גרועה מדי" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "לא זמינה" # באמצעות -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "מאובטחת על ידי SRTP" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "מאובטחת על ידי ZRTP - [אות אימות: %s]" # set or unset verification state of ZRTP SAS. -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "הגדר כלא מאומתת" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "הגדר כמאומתת" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "בשיחת ועידה" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "בשיחה כעת" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "שיחה מושהית" # שעות %02i דקות %02i שניות %02i # Force LTR time format (hours::minutes::seconds) with LRO chatacter (U+202D) -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "‭%02i::%02i::%02i" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "שיחה הסתיימה." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 #, fuzzy msgid "Transfer done." msgstr "העברה" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "העברה" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "חזרה" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "השהיה" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, fuzzy msgid "(Paused)" msgstr "השהיה" @@ -798,159 +819,155 @@ msgstr "שיגור" msgid "End conference" msgstr "בשיחת ועידה" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "תוויות" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "העברה" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "בשיחה כעת" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "משך זמן" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "אומדן איכות שיחה" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "_אפשרויות" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "אפשר ראות-עצמית" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "_עזרה" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "הצג חלון ניפוי שגיאות" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "_עמוד הבית" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "בדיקת _עדכונים" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 msgid "Account assistant" msgstr "אשף חשבון" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "כתובת SIP או מספר טלפון" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "התחלת שיחה חדשה" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 msgid "Contacts" msgstr "אנשי קשר" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "הוסף" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "ערוך" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "חיפוש" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 msgid "Add contacts from directory" msgstr "הוסף אנשי קשר מן מדור" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 msgid "Add contact" msgstr "הוספת איש קשר" # קריאות אחרונות -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 msgid "Recent calls" msgstr "שיחות אחרונות" # הזהות הנוכחית שלי -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "זהותי הנוכחית:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "שם משתמש" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "סיסמה" # מרשתת -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "חיבור אינטרנט:" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "חבר אותי אוטומטית" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "מידע התחברות" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "ברוך בואך !" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "כל המשתמשים" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "משתמשים מקוונים" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "‫ADSL" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "ערוץ סיב" # משתמט -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "ברירת מחדל" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1577,7 +1594,7 @@ msgstr "" msgid "Outgoing call" msgstr "קריאה יוצאת" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "מוכן" @@ -1636,11 +1653,11 @@ msgstr "מקושר." msgid "Call aborted" msgstr "קריאה בוטלה" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "לא ניתן להשהות את השיחה" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "משהה כעת שיחה נוכחית..." @@ -1747,40 +1764,40 @@ msgstr "" "זו צריכה להיראות כמו sip:username@proxydomain, למשל sip:alice@example.net" # בשם כ־ -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "לא ניתן להתחבר בזהות %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "צלצול מרוחק." -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "צלצול מרוחק..." # A SIP state -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "מדיה מוקדמת." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "שיחה עם %s מושהית." -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "קריאה נענתה על ידי %s - בהמתנה." # renewed -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "קריאה חודשה." -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "קריאה נענתה על ידי %s." @@ -1788,89 +1805,89 @@ msgstr "קריאה נענתה על ידי %s." # לא תואם # אי תאימות # אי התאמה -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 #, fuzzy msgid "Incompatible, check codecs or security settings..." msgstr "חוסר תאימות, נא לבדוק קודקים..." -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "חזרנו..." -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" # באופן מרוחק -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 #, fuzzy msgid "Call is updated by remote." msgstr "שיחה עודכנה מרחוק..." -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "קריאה הסתיימה." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "משתמש עסוק כעת." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "משתמש לא זמין זמנית." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "משתמש לא מעוניין שיפריעו לו." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "קריאה סורבה." -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "אין תגובה." -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "שגיאת פרוטוקול." -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "מכוון מחדש" # לא תואם # אי תאימות # אי התאמה -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 #, fuzzy msgid "Incompatible media parameters." msgstr "חוסר תאימות, נא לבדוק קודקים..." -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "קריאה נכשלה." # הרשמה אצל %s הושלמה בהצלחה. -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "רישום אצל %s הושלם בהצלחה." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "אי רישום אצל %s סוים." # Pas de réponse # no response in defined time -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "אין היענות תוך זמן מוגדר" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "רישום אצל %s נכשל: %s" @@ -1881,13 +1898,16 @@ msgid "Authentication token is %s" msgstr "אות האימות הינה %s" # האם כדאי לחקות את הטלפונים הניידים? שיחות של נענו -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "החמצת שיחה %i." msgstr[1] "החמצת %i שיחות." +#~ msgid "label" +#~ msgstr "תוויות" + #~ msgid "by %s" #~ msgstr "מאת %s" diff --git a/po/hu.po b/po/hu.po index 54f7821a5..256e7ffba 100644 --- a/po/hu.po +++ b/po/hu.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Linphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2013-03-26 19:00+0100\n" "Last-Translator: Viktor \n" "Language-Team: \n" @@ -17,53 +17,75 @@ msgstr "" "X-Generator: Poedit 1.5.4\n" "Plural-Forms: nplurals=1; plural=1 == 1 ? 0 : 1;\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "%s hívása" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "Szöveg küldése a következőnek: %s" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "vonalban" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "-" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 msgid "Aborted" msgstr "Megszakítva" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 msgid "Missed" msgstr "Nem fogadott" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 msgid "Declined" msgstr "Elutasítva" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i perc" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i másodperc" -#: ../gtk/calllogs.c:103 -#, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" -msgstr "" -"%s\t%s\tMinőség: %s\n" -"%s\t%s %s\t" - -#: ../gtk/calllogs.c:108 -#, c-format -msgid "" -"%s\t%s\t\n" -"%s\t%s" +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, fuzzy, c-format +msgid "%s\t%s" msgstr "" "%s\t%s\t\n" "%s\t%s" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:323 +#, fuzzy, c-format +msgid "" +"%s\tQuality: %s\n" +"%s\t%s\t" +msgstr "" +"%s\t%s\tMinőség: %s\n" +"%s\t%s %s\t" + +#: ../gtk/calllogs.c:329 +#, fuzzy, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" +"%s\t%s\t\n" +"%s\t%s" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "Konferencia" @@ -76,31 +98,35 @@ msgstr "én" msgid "Couldn't find pixmap file: %s" msgstr "Nemtalálható a pixmap fájl: %s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "Érvénytelen sip partner !" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "Futás közben némi hibakeresési információ az stdout-ra naplózása." -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "fájl elérési útja, melybe a naplók kerülnek." -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "Linphone indítása, videó kikpacsolva. " -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "Csak a tálcaikon indítása, ne mutassa a fő ablakot." -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "Cím azonnali híváshoz" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "Bekapcsolva automatikusan válaszol a bejövő hívásokra" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -108,12 +134,12 @@ msgstr "" "Adjon meg egy munkakönyvtárat (ennek az installációs könyvtárnak kéne " "lennie, pl. C:\\Program Files\\Linphone)" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Hívás %s -el" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -126,7 +152,7 @@ msgstr "" "szeretné adni a partnerlistához?\n" "Ha nemmel válaszol, ez a személy átmenetileg tiltólistára kerül." -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -135,59 +161,59 @@ msgstr "" "Kérem, adja meg jelszavát a következő felhasználónévhez: %s\n" "tartomány %s:" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "Hiba a hívás közben" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Hívás vége" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Beérkező hívás" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Hívás fogadása" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Elutasítás" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "Hívás várakoztatva" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, c-format msgid "by %s" msgstr "a következő által: %s" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "%s szerené elidítani a videót. Elfogadja?" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Internetes oldal" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - internetes videó telefon" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Alapértelmezett)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Át vagyunk irányítva ide: %s" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -195,60 +221,51 @@ msgstr "" "Hangkártya nincs érzékelve ezen a számítógépen.\n" "Nem fog tudni hang hívásokat küldeni vagy fogadni." -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "Egy ingyenes SIP video-telefon" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "Hozzáadás címjegyzékhez" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Jelenlét státusz" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Név" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 msgid "Call" msgstr "Hivás" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "Csevegés" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Keresés ebben a könyvtárban: %s" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "Érvénytelen sip partner !" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "%s hívása" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "Szöveg küldése a következőnek: %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Kapcsolatinformációk szerkesztése: '%s'" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "'%s' partner törlése" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "'%s' partner törlése" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "Új partner hozzáadása ebből a könyvtárból: %s" @@ -349,22 +366,26 @@ msgstr "norvég" msgid "Hebrew" msgstr "héber" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" "Újra kell indítania a linphone-t, hogy az új nyelv kiválasztása érvényre " "jusson. " -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Nincs" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "ZRTP" @@ -610,105 +631,105 @@ msgstr "" msgid "%.3f seconds" msgstr "%.3f másodperc" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "Befejezés" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Hívás folyamatban..." -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Beérkező hívás" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "jó" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "közepes" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "gyenge" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "nagyon gyenge" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "rossz" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "nem elérhető" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "SRTP-vel titkosítva" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "ZRTP-vel titkosítva - [hitelesítési jel: %s]" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "Beállítás ellenőrizetlenként" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Beállítás ellenőrzöttként" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "Konferencián" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "vonalban" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Várakoztatott hívás" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Hívás vége." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "Átvitel folyamatban" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "Átvitel befejezve." -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 msgid "Transfer failed." msgstr "Az átvitel sikertelen." -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Visszatérés" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Várakoztatás" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" @@ -717,7 +738,7 @@ msgstr "" "Felvétel a következőbe\n" "%s %s" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 msgid "(Paused)" msgstr "(Várakoztatva)" @@ -738,155 +759,151 @@ msgstr "Küld" msgid "End conference" msgstr "Konferencia vége" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "címke" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "Beszélgetés felvétele hangfájlba" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "Videó" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "Elnémítás" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "Átvitel" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "vonalban" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "Időtartam" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "Hívásminőség" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "_Beállítások" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "Videó indítása mindig" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "Saját nézet" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "_Segítség" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "Hibakeresési ablak mutatása" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "_Honlap" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "Frissítések keresése" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 msgid "Account assistant" msgstr "Fiók varázsló" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "Adja meg a SIP címet vagy a telefonszámot:" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "Új hívás kezdeményezése" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 msgid "Contacts" msgstr "Partnerek" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Hozzáadás" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Szerkesztés" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "Keresés" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 msgid "Add contacts from directory" msgstr "Partnerek hozzáadása könyvtárból" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 msgid "Add contact" msgstr "Partner hozzáadása" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 msgid "Recent calls" msgstr "Legutóbbi hívások" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Jelenlegi identitásom:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Felhasználónév" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Jelszó" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Internet kapcsolat:" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Jelentkeztessen be automatikusan" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Bejelentkezési információ" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Üdvözöljük !" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "Minden felhasználó" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "Elérhető" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "Fiber csatorna" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Alapértelmezett" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "Törlés" @@ -1489,7 +1506,7 @@ msgstr "" msgid "Outgoing call" msgstr "Kimenő hívás" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "Kész" @@ -1544,11 +1561,11 @@ msgstr "Kapcsolódva." msgid "Call aborted" msgstr "Hívás megszakítva" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "Nem sikerült várakoztatni a hívást" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "Jelenlegi hívás várakoztatásának aktiválása..." @@ -1649,115 +1666,115 @@ msgstr "" "Így kéne kinéznie: sip:felhasznalonev@proxytartomany, például sip:" "aladar@pelda.hu" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Nem sikerült belépni ezzel: %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Távoli csengés." -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "Távoli csengés..." -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Korai médiák." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "A hívás a következővel: %s várakoztatva" -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "%s fogadta a hívást - várakoztatva." -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Hívás visszatért" -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "%s válaszolt a hívásra." -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" "Nem kompatibilis, ellenőrizze a kódek- vagy a biztonsági beállításokat..." -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "Visszatértünk." -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "Megállítva a másik fél által." -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "A hívás távolról frissítve." -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "A hívás befejezve." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "A felhasználó foglalt." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "A felhasználó ideiglenesen nem elérhető" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "A felhasználó nem akarja, hogy zavarják." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Hívás elutasítva" -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Nincs válasz." -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Protokol hiba." -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Átirányítva" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "Nem kompatibilis médiajellemzők." -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "Nem sikerült a hívás." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "A regisztáció a %s -n sikerült." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "A kiregisztrálás kész a következőn: %s ." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "időtúllépés után nincs válasz" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "A regisztáció a %s -n nem sikerült: %s" @@ -1767,12 +1784,15 @@ msgstr "A regisztáció a %s -n nem sikerült: %s" msgid "Authentication token is %s" msgstr "Hitelesítési jel: %s" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "Van %i nem fogadott hivás." +#~ msgid "label" +#~ msgstr "címke" + #~ msgid "Chat with %s" #~ msgstr "Chat-elés %s -el" diff --git a/po/it.po b/po/it.po index 9e9a1183d..f1c29e8b0 100644 --- a/po/it.po +++ b/po/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Linphone 3.2.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2002-10-15 HO:MI+ZONE\n" "Last-Translator: Matteo Piazza \n" "Language-Team: it \n" @@ -15,54 +15,74 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "Chiamata %s" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "Invia testo a %s" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "In chiamata con" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "annullato" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "mancante" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "Rifiuta" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +msgid "%s\t%s" msgstr "" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" @@ -78,42 +98,46 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "Contatto SIP non valido" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, fuzzy, c-format msgid "Call with %s" msgstr "Chat con %s" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -125,128 +149,119 @@ msgstr "" "veda il tuo stato o aggiungerlo alla tua lista dei contatti Se rispondi no " "questo utente sarà momentaneamente bloccato." -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "Prego inserire la password per username %s e dominio %s" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Cronologia" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Chiamata terminata" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Chimata in entrata" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Rifiuta" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "annullato" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "Porte" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Presenza" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nome" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Chiamata %s" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Cerca contatti nella directory %s" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "Contatto SIP non valido" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "Chiamata %s" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "Invia testo a %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Modifica contatto %s" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Elimina contatto %s" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "Elimina contatto %s" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "Aggiungi nuovo contatto dalla directory %s" @@ -347,20 +362,24 @@ msgstr "" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Riavviare il software per utilizzare la nuova lingua selezionata" -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -612,117 +631,117 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." msgstr "Linguaggio" -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "Chimata in entrata" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "In chiamata con" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "Termina chiamata" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Chiamata terminata." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Chiamata rifiutata" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 msgid "(Paused)" msgstr "" @@ -744,167 +763,163 @@ msgstr "Invia" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "etichetta" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "In chiamata" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "Durata" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "Self-view abilitato" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 #, fuzzy msgid "Show debug window" msgstr "Linphone debug window" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 #, fuzzy msgid "Account assistant" msgstr "Configuratore di account" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "Indirizzo sip o numero." -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 #, fuzzy msgid "Contacts" msgstr "In connessione" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Aggiungi" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Edita" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 #, fuzzy msgid "Add contacts from directory" msgstr "Aggiungi nuovo contatto dalla directory %s" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" msgstr "Trovato %i contatto" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "In chiamata" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Identità corrente" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Username" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Password" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Connessione Internet:" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Login Automatico" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Credenziali di accesso" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Benvenuto !" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "" "Tutti gli utenti\n" "Utenti Online" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 #, fuzzy msgid "Fiber Channel" msgstr "" "ADSL\n" "Fibra Ottica" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Default" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1521,7 +1536,7 @@ msgstr "" msgid "Outgoing call" msgstr "Chiamata in uscita" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "Pronto" @@ -1580,12 +1595,12 @@ msgstr "Connessione" msgid "Call aborted" msgstr "annullato" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 #, fuzzy msgid "Could not pause the call" msgstr "chiamata fallita" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 #, fuzzy msgid "Pausing the current call..." msgstr "Mostra chiamata corrente" @@ -1686,118 +1701,118 @@ msgstr "" "L'identità sip utilizza è invalida.\n" "Dovrebbre essere sip:username@proxydomain, esempio: sip:alice@example.net" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "impossibile login come %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "" -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Chat con %s" -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "Chiamata terminata" -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Chiamata terminata." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Utente occupato" -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Utente non disponibile" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "L'utente non vuole essere disturbato" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Chiamata rifiutata" -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 #, fuzzy msgid "No response." msgstr "timeout no risposta" -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 #, fuzzy msgid "Redirected" msgstr "Rediretto verso %s..." -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "Chiamata rifiutata" -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registrazione su %s attiva" -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Unregistrazione su %s" -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "timeout no risposta" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrazione su %s fallita: %s" @@ -1807,13 +1822,16 @@ msgstr "Registrazione su %s fallita: %s" msgid "Authentication token is %s" msgstr "Linphone - Autenticazione richiesta" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "" msgstr[1] "" +#~ msgid "label" +#~ msgstr "etichetta" + #~ msgid "Chat with %s" #~ msgstr "Chat con %s" diff --git a/po/ja.po b/po/ja.po index e95879bb8..668018fd1 100644 --- a/po/ja.po +++ b/po/ja.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.10\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2003-01-21 00:05+9000\n" "Last-Translator: YAMAGUCHI YOSHIYA \n" "Language-Team: \n" @@ -17,53 +17,73 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "接続中" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "通話はキャンセルされました。" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 msgid "Missed" msgstr "" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "ライン入力" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +msgid "%s\t%s" msgstr "" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" @@ -76,42 +96,46 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "pixmapファイルが見つかりません %s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -120,132 +144,123 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "通話はキャンセルされました。" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 #, fuzzy msgid "Call ended" msgstr "通話は拒否されました。" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 #, fuzzy msgid "Decline" msgstr "ライン入力" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "通話はキャンセルされました。" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "接続中" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 #, fuzzy msgid "Add to addressbook" msgstr "電話帳" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 #, fuzzy msgid "Presence status" msgstr "状態" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名前" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "通話はキャンセルされました。" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "(接続するための情報がありません!)" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, c-format +msgid "Delete chat history of '%s'" +msgstr "" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "" @@ -346,21 +361,25 @@ msgstr "" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 #, fuzzy msgid "None" msgstr "ありません。" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -606,118 +625,118 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." msgstr "接続中" -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "接続中" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "接続中" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "接続中" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 #, fuzzy msgid "Call ended." msgstr "通話は拒否されました。" -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "通話はキャンセルされました。" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 msgid "(Paused)" msgstr "" @@ -740,170 +759,166 @@ msgstr "サウンド" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 #, fuzzy msgid "In call" msgstr "接続中" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 #, fuzzy msgid "Duration" msgstr "情報" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 #, fuzzy msgid "Enable self-view" msgstr "使用する" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 msgid "Account assistant" msgstr "" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 #, fuzzy msgid "SIP address or phone number:" msgstr "レジストラサーバーのSIPアドレス" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 #, fuzzy msgid "Contacts" msgstr "接続中" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "追加する" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 #, fuzzy msgid "Add contacts from directory" msgstr "コーデックの情報" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" msgstr "(接続するための情報がありません!)" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "接続中" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "My current identity:" msgstr "個人情報" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 #, fuzzy msgid "Username" msgstr "ユーザーマニュアル" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 #, fuzzy msgid "Password" msgstr "パスワード" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Login information" msgstr "コーデックの情報" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Welcome !" msgstr "接続中" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "ライン入力" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" msgstr "個人情報" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1527,7 +1542,7 @@ msgstr "" msgid "Outgoing call" msgstr "" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 #, fuzzy msgid "Ready" msgstr "準備完了。" @@ -1589,11 +1604,11 @@ msgstr "接続しました。" msgid "Call aborted" msgstr "通話はキャンセルされました。" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "" @@ -1693,121 +1708,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, fuzzy, c-format msgid "Could not login as %s" msgstr "pixmapファイルが見つかりません %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 #, fuzzy msgid "Remote ringing." msgstr "登録中……" -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "登録中……" -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "通話は拒否されました。" -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "電話をかける\n" "電話に出る" -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 #, fuzzy msgid "Call terminated." msgstr "通話は拒否されました。" -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "ユーザーはビジーです" -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "ユーザーは、今出られません。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "ユーザーは手が離せないようです。" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "通話は拒否されました。" -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "通話はキャンセルされました。" -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, fuzzy, c-format msgid "Registration on %s successful." msgstr "登録しました。" -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "登録しました。" -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "登録しました。" @@ -1817,7 +1832,7 @@ msgstr "登録しました。" msgid "Authentication token is %s" msgstr "コーデックの情報" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/nb_NO.po b/po/nb_NO.po index c1500d304..8b7f20c28 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2011-04-05 01:56+0200\n" "Last-Translator: Øyvind Sæther \n" "Language-Team: Norwegian Bokmål \n" @@ -17,54 +17,74 @@ msgstr "" "X-Generator: Lokalize 1.2\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "Ring %s" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "Send tekst til %s" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "I samtale med" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "avbrutt" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "ubesvart" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "Avvis" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +msgid "%s\t%s" msgstr "" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" @@ -78,31 +98,35 @@ msgstr "Skru mikrofonen av" msgid "Couldn't find pixmap file: %s" msgstr "Fant ikke pixmap fli: %s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "Ugyldig SIP kontakt !" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "skriv logg-informasjon under kjøring" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "Start skjult i systemkurven, ikke vis programbildet." -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "address som skal ringes nå" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "besvarer innkommende samtaler automatisk om valgt" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -110,12 +134,12 @@ msgstr "" "Spesifiser arbeidsmappe (bør være base for installasjonen, f.eks: c:" "\\Programfiler\\Linphone)" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Ring med %s" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -128,7 +152,7 @@ msgstr "" "din kontaktliste?\n" "Hvis du svarer nei vil personen bli svartelyst midlertidig." -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -137,61 +161,61 @@ msgstr "" "Skriv inn ditt passord for brukernavn %s\n" " på domene %s:i>:" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Samtalehistorikk" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Samtale avsluttet" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Innkommende samtale" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Svarer" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Avvis" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "Samtale avbrutt" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "Porter" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Peker til nettsted" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - en video Internet telefon" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Standard)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Vi er overført til %s" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -199,61 +223,52 @@ msgstr "" "Klarte ikke å finne noe lydkort på denne datamaskinen.\n" "Du vil ikke kunne sende eller motta lydsamtaler." -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Tilstedestatus" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Navn" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Ring %s" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Søk i %s katalogen" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "Ugyldig SIP kontakt !" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "Ring %s" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "Send tekst til %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Rediger kontakt '%s'" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Slett kontakt '%s'" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "Slett kontakt '%s'" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "Legg til kontakt fra %s katalogen" @@ -354,20 +369,24 @@ msgstr "" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Du må restarte linphone for at det nye språkvalget skal iverksettes." -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -620,114 +639,114 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Ringer..." -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00:00:00" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Innkommende samtale" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "I samtale med" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Pauset samtale" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i:%02i:%02i" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Samtale avsluttet." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 #, fuzzy msgid "Transfer done." msgstr "Overfører" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Overfører" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Fortsett" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Pause" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, fuzzy msgid "(Paused)" msgstr "Pause" @@ -750,157 +769,153 @@ msgstr "Send" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "etikett" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "Overfører" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "I samtale" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "Varighet" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "_Alternativer" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "Vis video av deg selv" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "_Hjelp" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "Vis avlusningsvindu" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "H_jemmeside" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "Sjekk _Oppdateringer" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 #, fuzzy msgid "Account assistant" msgstr "Brukerkontoveiviser" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "Sip adresse eller telefonnummer:" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "Start en ny samtale" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 msgid "Contacts" msgstr "Kontakter" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Legg til" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Rediger" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "Søk" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 msgid "Add contacts from directory" msgstr "Legg til kontakter fra katalogen" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 msgid "Add contact" msgstr "Legg til kontakt" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "I samtale" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Min nåværende identitet:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Brukernavn" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Passord" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Internet forbindelse:" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Logg meg på automatisk" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Innlogginsinformasjon" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Velkommen!" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "Alle brukere" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "Tilkoblede brukere" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "Fiber Kanal" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Standard" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1514,7 +1529,7 @@ msgstr "" msgid "Outgoing call" msgstr "Utgående samtale" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "Klar" @@ -1570,11 +1585,11 @@ msgstr "Tilkoblet" msgid "Call aborted" msgstr "Samtale avbrutt" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "Kunne ikke pause samtalen" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "Pauser nåværende samtale" @@ -1676,116 +1691,116 @@ msgstr "" "SIP adressen du har angitt er feil. Adressen bør se ut som sip: " "brukernavn@domenenavn, f.eks sip:ola@eksempel.no" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Ikke ikke logge inn som %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Tidlig media" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "Samtalen med %s er pauset." -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "Samtale besvart av %s - på vent." -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Samtale gjenopptatt." -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "Samtale besvart av %s." -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "Vi har blitt gjenopptatt..." -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Samtale avsluttet." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Brukeren er opptatt." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Brukeren er midlertidig ikke tilgjengelig." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Brukeren vil ikke bli forstyrret." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Samtale avvist." -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Ikke noe svar." -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Protokollfeil." -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Omdirigert" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "Samtale feilet." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registrering hos %s lykkes." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Avregistrering hos %s lykkes." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "ingen svar innen angitt tid" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrering hos %s mislykkes: %s" @@ -1795,13 +1810,16 @@ msgstr "Registrering hos %s mislykkes: %s" msgid "Authentication token is %s" msgstr "Autorisering kreves" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "Du har %i ubesvarte anrop." msgstr[1] "Du har %i missade samtal" +#~ msgid "label" +#~ msgstr "etikett" + #~ msgid "Keypad" #~ msgstr "Tastatur" diff --git a/po/nl.po b/po/nl.po index 926bd7bb6..8cfe7febd 100644 --- a/po/nl.po +++ b/po/nl.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: nl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2007-09-05 10:40+0200\n" "Last-Translator: Hendrik-Jan Heins \n" "Language-Team: Nederlands \n" @@ -19,54 +19,74 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, fuzzy, c-format +msgid "Call %s" +msgstr "Oproepgeschiedenis" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "Contactlijst" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "afgebroken" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "gemist" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "lijn" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +msgid "%s\t%s" msgstr "" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" @@ -79,42 +99,46 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Kon pixmap bestand %s niet vinden" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, fuzzy, c-format msgid "Call with %s" msgstr "Chat met %s" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -123,131 +147,122 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Linphone - Oproepgeschiedenis" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Oproep beeindigd" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Inkomende oproep" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 #, fuzzy msgid "Decline" msgstr "lijn" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "afgebroken" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "Contactlijst" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "Een Vrije SIP video-telefoon" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 #, fuzzy msgid "Add to addressbook" msgstr "Adresboek" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Aanwezigheidsstatus" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Naam" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Oproepgeschiedenis" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 #, fuzzy msgid "Chat" msgstr "Chat box" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "" - -#: ../gtk/friendlist.c:807 -#, fuzzy, c-format -msgid "Call %s" -msgstr "Oproepgeschiedenis" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "Bewerk contactgegevens" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, c-format +msgid "Delete chat history of '%s'" +msgstr "" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "" @@ -348,20 +363,24 @@ msgstr "" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Geen" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -609,118 +628,118 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." msgstr "Contactlijst" -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "Inkomende oproep" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "Contactlijst" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "Contactlijst" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 #, fuzzy msgid "Call ended." msgstr "Oproep beeindigd" -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Oproep geannuleerd." -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 msgid "(Paused)" msgstr "" @@ -743,173 +762,169 @@ msgstr "Geluid" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 #, fuzzy msgid "In call" msgstr "Inkomende oproep" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 #, fuzzy msgid "Duration" msgstr "Informatie" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 #, fuzzy msgid "Enable self-view" msgstr "Video aan" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 #, fuzzy msgid "_Help" msgstr "Help" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 msgid "Account assistant" msgstr "" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 #, fuzzy msgid "SIP address or phone number:" msgstr "Geef het SIP adres of telefoonnummer in" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 #, fuzzy msgid "Contacts" msgstr "Verbinden" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 #, fuzzy msgid "Add" msgstr "Adres" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Bewerken" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 #, fuzzy msgid "Add contacts from directory" msgstr "Contact informatie" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" msgstr "Bewerk contactgegevens" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "Inkomende oproep" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "My current identity:" msgstr "SIP-identiteit:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 #, fuzzy msgid "Username" msgstr "gebruikersnaam:" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 #, fuzzy msgid "Password" msgstr "wachtwoord:" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 #, fuzzy msgid "Automatically log me in" msgstr "Automatisch een geldige hostnaam raden" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Login information" msgstr "Contact informatie" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Welcome !" msgstr "Contactlijst" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "Aanwezig" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" msgstr "SIP-identiteit:" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1543,7 +1558,7 @@ msgstr "" msgid "Outgoing call" msgstr "Uitgaande oproep" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "Gereed." @@ -1602,12 +1617,12 @@ msgstr "Verbonden." msgid "Call aborted" msgstr "afgebroken" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 #, fuzzy msgid "Could not pause the call" msgstr "Kon niet oproepen" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 #, fuzzy msgid "Pausing the current call..." msgstr "Kon niet oproepen" @@ -1709,121 +1724,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, fuzzy, c-format msgid "Could not login as %s" msgstr "Kon pixmap bestand %s niet vinden" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 #, fuzzy msgid "Remote ringing." msgstr "Externe diensten" -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "Externe diensten" -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Chat met %s" -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "Oproep beeindigd" -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "Oproepen of\n" "beantwoorden" -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Oproep beeindigd." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Gebruiker is bezet." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Gebruiker is tijdelijk niet beschikbaar." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "De gebruiker wenst niet gestoord te worden." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Oproep geweigerd." -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 #, fuzzy msgid "Redirected" msgstr "Doorgeschakeld naar %s..." -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "Oproep geannuleerd." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registratie op %s gelukt." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "Registratie op %s gelukt." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "Registratie op %s mislukt (time-out)." @@ -1833,7 +1848,7 @@ msgstr "Registratie op %s mislukt (time-out)." msgid "Authentication token is %s" msgstr "Authorisatie gegevens" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, fuzzy, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/pl.po b/po/pl.po index 7999a657d..4512b7230 100644 --- a/po/pl.po +++ b/po/pl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2003-08-22 12:50+0200\n" "Last-Translator: Robert Nasiadek \n" "Language-Team: Polski \n" @@ -15,53 +15,73 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "Dzwonie do " + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "Połączenie odwołane." -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 msgid "Missed" msgstr "" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "linia" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +msgid "%s\t%s" msgstr "" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" @@ -74,42 +94,46 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Nie można znaleźć pixmapy: %s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -118,132 +142,123 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Połączenie odwołane." -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 #, fuzzy msgid "Call ended" msgstr "Rozmowa odrzucona." -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 #, fuzzy msgid "Decline" msgstr "linia" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "Połączenie odwołane." -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "Dzwonie do " -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 #, fuzzy msgid "Add to addressbook" msgstr "Książka adresowa" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 #, fuzzy msgid "Presence status" msgstr "Obecność" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nazwa" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Połączenie odwołane." -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "(Brak informacji kontaktowych !)" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, c-format +msgid "Delete chat history of '%s'" +msgstr "" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "" @@ -344,21 +359,25 @@ msgstr "" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 #, fuzzy msgid "None" msgstr "Brak." -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -604,118 +623,118 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." msgstr "Dzwonie do " -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "Dzwonie do " -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "Dzwonie do " -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "Dzwonie do " -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 #, fuzzy msgid "Call ended." msgstr "Rozmowa odrzucona." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Połączenie odwołane." -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 msgid "(Paused)" msgstr "" @@ -738,171 +757,167 @@ msgstr "Dźwięk" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 #, fuzzy msgid "In call" msgstr "Dzwonie do " -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 #, fuzzy msgid "Duration" msgstr "Informacja" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 #, fuzzy msgid "Enable self-view" msgstr "Włączone" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 msgid "Account assistant" msgstr "" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 #, fuzzy msgid "SIP address or phone number:" msgstr "Adres serwera rejestracji sip" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 #, fuzzy msgid "Contacts" msgstr "Dzwonie do " -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 #, fuzzy msgid "Add" msgstr "Adres" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 #, fuzzy msgid "Add contacts from directory" msgstr "Informacje o kodeku" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" msgstr "(Brak informacji kontaktowych !)" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "Dzwonie do " -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "My current identity:" msgstr "Tożsamość" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 #, fuzzy msgid "Username" msgstr "Podręcznik" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 #, fuzzy msgid "Password" msgstr "Twoje hasło:" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Login information" msgstr "Informacje o kodeku" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Welcome !" msgstr "Dzwonie do " -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "linia" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" msgstr "Tożsamość" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1526,7 +1541,7 @@ msgstr "" msgid "Outgoing call" msgstr "" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 #, fuzzy msgid "Ready" msgstr "Gotowy." @@ -1586,11 +1601,11 @@ msgstr "Połączony" msgid "Call aborted" msgstr "Połączenie odwołane." -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "" @@ -1690,121 +1705,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, fuzzy, c-format msgid "Could not login as %s" msgstr "Nie można znaleźć pixmapy: %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 #, fuzzy msgid "Remote ringing." msgstr "Rejestruje..." -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "Rejestruje..." -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "Rozmowa odrzucona." -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "Zadzwoń lub\n" "Odpowiedz" -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 #, fuzzy msgid "Call terminated." msgstr "Rozmowa odrzucona." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Osoba jest zajęta." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Osoba jest tymczasowo niedostępna." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Osoba nie chce, aby jej przeszkadzać." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Rozmowa odrzucona." -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "Połączenie odwołane." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, fuzzy, c-format msgid "Registration on %s successful." msgstr "Rejestracja powiodła się." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "Rejestracja powiodła się." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "Rejestracja powiodła się." @@ -1814,7 +1829,7 @@ msgstr "Rejestracja powiodła się." msgid "Authentication token is %s" msgstr "Informacje o kodeku" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/pt_BR.po b/po/pt_BR.po index 9cd72ea90..821ba910f 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone-1.1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2006-07-11 23:30+0200\n" "Last-Translator: Rafael Caesar Lenzi \n" "Language-Team: pt_BR \n" @@ -17,54 +17,74 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, fuzzy, c-format +msgid "Call %s" +msgstr "Histórico de chamadas" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "Contatando " + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "Abortado" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "Perdido" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "linha" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +msgid "%s\t%s" msgstr "" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" @@ -77,42 +97,46 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Não é possível achar arquivo pixmap: %s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, fuzzy, c-format msgid "Call with %s" msgstr "Bate-papo com %s" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -121,132 +145,123 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Linphone - Histórico de chamadas" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 #, fuzzy msgid "Call ended" msgstr "Chamada cancelada." -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Camadas recebidas" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 #, fuzzy msgid "Decline" msgstr "linha" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "Abortado" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "Contatando " -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 #, fuzzy msgid "Add to addressbook" msgstr "Catálogo de endereços" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Status de presença" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nome" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Histórico de chamadas" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 #, fuzzy msgid "Chat" msgstr "Sala de bate-papo" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "" - -#: ../gtk/friendlist.c:807 -#, fuzzy, c-format -msgid "Call %s" -msgstr "Histórico de chamadas" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "Edicar informação de contato" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, c-format +msgid "Delete chat history of '%s'" +msgstr "" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "" @@ -348,20 +363,24 @@ msgstr "" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Nenhum" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -608,118 +627,118 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." msgstr "Contatando " -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "Camadas recebidas" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "Contatando " -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "Contatando " -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 #, fuzzy msgid "Call ended." msgstr "Chamada cancelada." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Histórico de chamadas" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 msgid "(Paused)" msgstr "" @@ -742,171 +761,167 @@ msgstr "Som" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 #, fuzzy msgid "In call" msgstr "Camadas recebidas" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 #, fuzzy msgid "Duration" msgstr "Informações" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 #, fuzzy msgid "Enable self-view" msgstr "Ativado" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 msgid "Account assistant" msgstr "" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 #, fuzzy msgid "Contacts" msgstr "Contatando " -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 #, fuzzy msgid "Add" msgstr "Endereço" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Editar" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 #, fuzzy msgid "Add contacts from directory" msgstr "Informação de contato" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" msgstr "Edicar informação de contato" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "Camadas recebidas" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "My current identity:" msgstr "Identificação SIP:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 #, fuzzy msgid "Username" msgstr "Usuário" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 #, fuzzy msgid "Password" msgstr "Senha:" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 #, fuzzy msgid "Automatically log me in" msgstr "Adquirir automaticamente um nome de servidor válido." -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Login information" msgstr "Informação de contato" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Welcome !" msgstr "Contatando " -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "linha" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" msgstr "Identificação SIP:" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1535,7 +1550,7 @@ msgstr "" msgid "Outgoing call" msgstr "Chamadas efetuadas" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 #, fuzzy msgid "Ready" msgstr "Pronto." @@ -1594,11 +1609,11 @@ msgstr "Conectado." msgid "Call aborted" msgstr "Abortado" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "" @@ -1688,121 +1703,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, fuzzy, c-format msgid "Could not login as %s" msgstr "Não é possível achar arquivo pixmap: %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 #, fuzzy msgid "Remote ringing." msgstr "Serviços remotos" -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "Serviços remotos" -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Bate-papo com %s" -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "Chamada cancelada." -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "Ligar ou\n" "atender" -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "" -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Usuário está ocupado." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Usuário está temporáriamente indisponível." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "" -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 #, fuzzy msgid "Redirected" msgstr "Redirecionado para %s..." -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "Histórico de chamadas" -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, fuzzy, c-format msgid "Registration on %s successful." msgstr "Registro em %s efetuado." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "Registro em %s efetuado." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "Registro falhou (tempo esgotado)." @@ -1812,7 +1827,7 @@ msgstr "Registro falhou (tempo esgotado)." msgid "Authentication token is %s" msgstr "Informações de autenticação" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, fuzzy, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/ru.po b/po/ru.po index a7fd4a832..66419e69a 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2010-01-22 18:43+0300\n" "Last-Translator: Maxim Prokopyev \n" "Language-Team: Russian \n" @@ -17,26 +17,41 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "Набрать %s" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "Послать текст к %s" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "Соединен с" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "н/д" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "отмененный" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "пропущенный" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "Отклонить" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" @@ -44,7 +59,7 @@ msgstr[0] "%i минута" msgstr[1] "%i минуты" msgstr[2] "%i минут" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" @@ -52,25 +67,32 @@ msgstr[0] "%i секунда" msgstr[1] "%i секунды" msgstr[2] "%i секунд" -#: ../gtk/calllogs.c:103 -#, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, fuzzy, c-format +msgid "%s\t%s" msgstr "" "%s\t%s\tКачество: %s\n" "%s\t%s %s\t" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, fuzzy, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" "%s\t%s\tКачество: %s\n" "%s\t%s %s\t" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, fuzzy, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" +"%s\t%s\tКачество: %s\n" +"%s\t%s %s\t" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "Конференция" @@ -83,33 +105,37 @@ msgstr "Я" msgid "Couldn't find pixmap file: %s" msgstr "Невозможно найти графический файл: %s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "Неверный sip-контакт!" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "" "Вывод некоторой отладочной информации на устройство стандартного вывода во " "время работы" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "путь к файлу для записи журнала работы." -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "Запускать только в системном лотке, не показывая главное окно" -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "адрес для звонка" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "автоматически принимать входящие вызовы, если включено" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -117,12 +143,12 @@ msgstr "" "Укажите рабочий каталог (должен содержать установленные файлы приложения, " "например: c:\\Program Files\\Linphone)" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Чат с %s" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -135,7 +161,7 @@ msgstr "" "его(её) в свой контактный лист?\n" "Если вы ответите Нет, этот человек будет временно заблокирован." -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -144,59 +170,59 @@ msgstr "" "Пожалуйста, введите пароль для пользователя %s\n" " в домене %s:" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "Ошибка вызова" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Разговор окончен" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Входящий вызов" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Ответить" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Отклонить" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "Вызов приостановлен" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "Порты" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Ссылка на сайт" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - видео-телефон для интернета" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (По умолчанию)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Мы переведены на %s" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -204,61 +230,52 @@ msgstr "" "На этом компьютере не обнаружено ни одной звуковой карты.\n" "Вы не сможете совершать или принимать аудио-вызовы." -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "Свободный SIP видео-телефон" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "Добавить в адресную книгу" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Статус присутствия" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Имя" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 msgid "Call" msgstr "Вызов" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 #, fuzzy msgid "Chat" msgstr "Комната чата" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Поиск в директории %s" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "Неверный sip-контакт!" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "Набрать %s" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "Послать текст к %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Редактировать контакт '%s'" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Удалить контакт '%s'" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "Удалить контакт '%s'" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "Добавить новый контакт из директории '%s'" @@ -359,22 +376,26 @@ msgstr "Норвежский" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" "Вы должны перезапустить Linphone для того, чтобы языковые настройки вступили " "в силу." -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Нет" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "ZRTP" @@ -627,114 +648,114 @@ msgstr "" msgid "%.3f seconds" msgstr "%i секунда" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Вызов..." -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Входящий вызов" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "хорошее" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "среднее" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "плохое" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "очень плохое" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "слишком плохое" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "недоступно" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "Защищено SRTP" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Защищено ZRTP - [токен: %s]" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "Не проверен" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Проверен" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "В конференции" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "Соединен с" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Приостановленный вызов" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Звонок закончен." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 #, fuzzy msgid "Transfer done." msgstr "Перевести" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Перевести" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Продолжить" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Пауза" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, fuzzy msgid "(Paused)" msgstr "Пауза" @@ -757,155 +778,151 @@ msgstr "Отправить" msgid "End conference" msgstr "В конференции" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "метка" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "Перевести" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "Вызов" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "Продолжительность" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "Уровень качества звонка" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "_Настройки" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "Включить своё видео" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "_Помощь" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "Показать окно отладки" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "_Домашняя страница" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "Проверить _Обновления" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 msgid "Account assistant" msgstr "Помощник настройки учётной записи" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "SIP-адрес или номер телефона:" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "Совершить новый вызов" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 msgid "Contacts" msgstr "Контакты" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Добавить" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Редактировать" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "Поиск" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 msgid "Add contacts from directory" msgstr "Добавить контакты из директории" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 msgid "Add contact" msgstr "Добавить контакт" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 msgid "Recent calls" msgstr "Недавние вызовы" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Мой текущий идентификатор:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Имя пользователя" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Пароль" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Интернет-соединение:" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Входить автоматически" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Информация для входа" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Добро пожаловать!" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "Все пользователи" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "Пользователи в сети" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "Оптоволокно" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "По умолчанию" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1522,7 +1539,7 @@ msgstr "" msgid "Outgoing call" msgstr "Исходящий звонок" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "Готов" @@ -1578,11 +1595,11 @@ msgstr "Соединён." msgid "Call aborted" msgstr "Вызов отменён" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "Не удалось приостановить вызов" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "Приостановление текущего вызова..." @@ -1685,118 +1702,118 @@ msgstr "" "Они должны выглядеть как sip:username@proxydomain, например such as sip:" "alice@example.net" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Невозможно зайти как %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Абонент вызывается." -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "Абонент вызывается..." -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Гудки." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "Вызов %s приостановлен." -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "Вызов отвечен %s - в ожидании." -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Разговор продолжен." -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "Вызов отвечен %s." -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 #, fuzzy msgid "Incompatible, check codecs or security settings..." msgstr "Несовместимо, проверьте кодеки..." -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "Наш вызов продолжен..." -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 #, fuzzy msgid "Call is updated by remote." msgstr "Вызов обновлён вызываемым абонентом..." -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Звонок прерван." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Пользователь занят." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Пользователь временно недоступен." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Абонент не хочет отвечать." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Звонок отклонён." -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Нет ответа." -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Ошибка протокола." -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Переадресован" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 #, fuzzy msgid "Incompatible media parameters." msgstr "Несовместимо, проверьте кодеки..." -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "Не удалось совершить вызов." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Регистрация на %s прошла успешно." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Отмена регистрации на %s завершена." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "время ожидания истекло" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Регистрация на %s не удалась: %s" @@ -1806,7 +1823,7 @@ msgstr "Регистрация на %s не удалась: %s" msgid "Authentication token is %s" msgstr "Аутентификационный токен: %s" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1814,6 +1831,9 @@ msgstr[0] "У вас пропущен %i звонок." msgstr[1] "У вас пропущено %i звонка." msgstr[2] "У вас пропущено %i звонков." +#~ msgid "label" +#~ msgstr "метка" + #~ msgid "by %s" #~ msgstr "со стороны: %s" diff --git a/po/sr.po b/po/sr.po index 4a465ec8e..814b4d050 100644 --- a/po/sr.po +++ b/po/sr.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2013-02-11 19:03+0200\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" @@ -16,26 +16,41 @@ msgstr "" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "Позови „%s“" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "Пошаљи текст за %s" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "У позиву" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "н/д" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "прекинути" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "пропуштени" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "Одбиј" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" @@ -44,7 +59,7 @@ msgstr[1] "%i минута" msgstr[2] "%i минута" msgstr[3] "Један минут" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" @@ -53,25 +68,32 @@ msgstr[1] "%i секунде" msgstr[2] "%i секунде" msgstr[3] "Једна секунда" -#: ../gtk/calllogs.c:103 -#, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, fuzzy, c-format +msgid "%s\t%s" msgstr "" "%s\t%s\tКвалитет: %s\n" "%s\t%s %s\t" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, fuzzy, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" "%s\t%s\tКвалитет: %s\n" "%s\t%s %s\t" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, fuzzy, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" +"%s\t%s\tКвалитет: %s\n" +"%s\t%s %s\t" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "Конференција" @@ -84,31 +106,35 @@ msgstr "Ја" msgid "Couldn't find pixmap file: %s" msgstr "Не могу да пронађем датотеку сличице: %s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "Неисправан сип контакт !" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "бележи у стандардни излаз неке податке за уклањање грешака док ради." -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "путања до датотеке за уписивање бележака." -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "Покреће се само у системској фиоци, не приказује главно сучеље." -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "адреса за позивање управо сада" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "ако је подешено сам ће се јављати на долазне позиве" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -116,12 +142,12 @@ msgstr "" "Наводи радни директоријум (треба да буде основа инсталације, нпр: c:" "\\Program Files\\Linphone)" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Позив са корисником %s" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -134,7 +160,7 @@ msgstr "" "на ваш списак пријатеља ?\n" "Ако одговорите са не, ова особа ће привремено бити стављена на црни списак." -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -143,59 +169,59 @@ msgstr "" "Унесите вашу лозинку за корисничко име %s\n" " на домену %s:" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "Грешка позива" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Позив је завршен" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Долазни позив" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Јави се" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Одбиј" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "Позив је заустављен" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "Кодеци" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Веза веб сајта" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Линфон — интернет телефон са снимком" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (основно)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Преселили смо се на %s" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -203,60 +229,51 @@ msgstr "" "Ниједна звучна картица није откривен ана овом рачунару.\n" "Нећете бити у могућности да шаљете или да примате звучне позиве." -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "Слободан СИП телефон са снимком" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "Додајте у адресар" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Стање присуства" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Име" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 msgid "Call" msgstr "Позови" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Тражи у директоријуму „%s“" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "Неисправан сип контакт !" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "Позови „%s“" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "Пошаљи текст за %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Уредите контакт „%s“" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Обришите контакт „%s“" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "Обришите контакт „%s“" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "Додајте нови контакт из директоријума „%s“" @@ -357,21 +374,25 @@ msgstr "Норвешки" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "" "Трба поново да покренете линфон да би нови изабрани језик ступио на снагу." -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Ништа" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "СРТП" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "ЗРТП" @@ -626,114 +647,114 @@ msgstr "" msgid "%.3f seconds" msgstr "%i секунда" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Позивам..." -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Долазни позив" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "добро" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "просечно" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "оскудно" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "јадно" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "много лоше" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "недоступно" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "Осигурано СРТП-ом" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Осигурано ЗРТП-ом [потврђивање идентитета: %s]" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "Непроверено подешавање" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Проверено подешавање" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "На конференцији" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "У позиву" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Заустављен позив" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Позив је завршен." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 #, fuzzy msgid "Transfer done." msgstr "Пребаци" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Пребаци" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Настави" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Застани" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, fuzzy msgid "(Paused)" msgstr "Застани" @@ -756,156 +777,152 @@ msgstr "Пошаљи" msgid "End conference" msgstr "На конференцији" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "натпис" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "Пребаци" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "Долазни позив" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "Трајање" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "Оцена квалитета позива" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "_Могућности" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "Укључи самовиђење" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "По_моћ" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "Прикажи прозорче прочишћавања" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "_Матична страница" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "Провери _ажурирања" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 #, fuzzy msgid "Account assistant" msgstr "Помоћник подешавања налога" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "СИП адреса или број телефона:" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "Започните нови позив" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 msgid "Contacts" msgstr "Пријатељи" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Додај" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Уреди" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "Тражи" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 msgid "Add contacts from directory" msgstr "Додај пријатеље из директоријума" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 msgid "Add contact" msgstr "Додај пријатеља" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 msgid "Recent calls" msgstr "Скорашњи позиви" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Мој тренутни идентитет:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Корисничко име" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Лозинка" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Интернет веза:" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Сам ме пријави" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Подаци пријављивања" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Добродошли !" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "Сви корисници" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "Корисницима на мрежи" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "АДСЛ" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "Оптички канал" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Основно" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1517,7 +1534,7 @@ msgstr "" msgid "Outgoing call" msgstr "Одлазни позив" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "Спреман" @@ -1573,11 +1590,11 @@ msgstr "Повезан сам." msgid "Call aborted" msgstr "Позив је прекинут" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "Не могу да зауставим позив" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "Заустављам тренутни позив..." @@ -1678,116 +1695,116 @@ msgstr "" "Треба да изгледа као „sip:корисник@домен-посредника, као што је „sip:" "alice@example.net“" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Не могу да се пријавим као %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Удаљено звоњење." -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "Удаљено звоњење..." -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Ранији медиј." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "Позив са „%s“ је заустављен." -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "Позив на који је одговорио „%s“ — на чекању." -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Позив је настављен." -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "На позив је одговорио „%s“." -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "Позив нам је настављен..." -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 #, fuzzy msgid "Call is updated by remote." msgstr "Позив је ажуриран удаљеним..." -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Позив је завршен." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Корисник је заузет." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Корисник је привремено недоступан." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Корисник не жели да буде узнемираван." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Позив је одбијен." -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Нема одговора." -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Грешка у протоколу." -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Преусмерен" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "Позив није успео." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Уписивање на „%s“ је успело." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Исписивање са „%s“ је обављено." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "нема ограничења одговора" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Уписивање на „%s“ није успело: %s" @@ -1797,7 +1814,7 @@ msgstr "Уписивање на „%s“ није успело: %s" msgid "Authentication token is %s" msgstr "Симбол потврђивања идентитета је „%s“" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1806,6 +1823,9 @@ msgstr[1] "Пропустили сте %i позива." msgstr[2] "Пропустили сте %i позива." msgstr[3] "Пропустили сте један позив." +#~ msgid "label" +#~ msgstr "натпис" + #~ msgid "Chat with %s" #~ msgstr "Ћаскајте са „%s“" diff --git a/po/sv.po b/po/sv.po index 0b2882efc..4f7ec762c 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2009-02-17 15:22+0100\n" "Last-Translator: Emmanuel Frécon \n" "Language-Team: SWEDISH \n" @@ -16,54 +16,74 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "Ringer %s" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "Skicka text till %s" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "I samtal med" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "avbrytade" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "missade" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "Avböj" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +msgid "%s\t%s" msgstr "" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" @@ -77,31 +97,35 @@ msgstr "Mikrofon av" msgid "Couldn't find pixmap file: %s" msgstr "Kunde inte hitta pixmap filen: %s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "ogiltig SIP kontakt!" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "skriv loggning information under körning" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "Starta ikonifierat, visa inte huvudfönstret" -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "Samtalsmottagare" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "Om på, besvara automatisk alla inkommande samtal" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -109,12 +133,12 @@ msgstr "" "Välj en arbetskatalog som ska vara basen för installationen, såsom C:" "\\Program\\Linphone" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Samtal med %s" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -127,7 +151,7 @@ msgstr "" "henne till din kontaktlista?\n" "Om du svarar nej, personen kommer att vara bannlyst." -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -136,121 +160,112 @@ msgstr "" "Mata in ditt lösenord för användaren %s\n" "vid domänen %s:" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Samtalshistorik" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Samtalet slut" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Inkommande samtal" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Avböj" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "avbrytade" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "Portar" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Webbsajt" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - en video Internet telefon" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." msgstr "" -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Närvarostatus" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Namn" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Ringer %s" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Sök i %s katalogen" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "ogiltig SIP kontakt!" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "Ringer %s" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "Skicka text till %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Ändra kontakt '%s'" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Ta bort kontakt '%s'" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "Ta bort kontakt '%s'" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "Lägg till kontakt ifrån %s katalogen" @@ -351,20 +366,24 @@ msgstr "" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Du behöver starta om programmet för att det nya språket ska synas." -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -616,116 +635,116 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Ringer..." -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00:00:00" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "Inkommande samtal" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "I samtal med" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "Lägg på" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i:%02i:%02i" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Samtalet slut." -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Samtalet avböjdes." -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 msgid "(Paused)" msgstr "" @@ -747,169 +766,165 @@ msgstr "Skicka" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "etikett" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "I samtal" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "Förlopp" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "Själv bild" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 #, fuzzy msgid "Show debug window" msgstr "Linphone debug fönster" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 #, fuzzy msgid "_Homepage" msgstr "Hemsidan" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 #, fuzzy msgid "Check _Updates" msgstr "Letar efter uppdateringar" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 #, fuzzy msgid "Account assistant" msgstr "Kontoinstallationsassistenten" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "Användarnamn" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 #, fuzzy msgid "Contacts" msgstr "Kontaktar" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Lägg till" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Editera" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "Sök" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 msgid "Add contacts from directory" msgstr "Lägg till kontakt ifrån katalogen" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" msgstr "Hittat kontakt %i" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "I samtal" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Min nuvarande identitet" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Användarnamn" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Lösenord" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Internet förbindelse:" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Logga mig automatiskt" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Login information" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Välkommen!" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "" "Alla användare\n" "Online användare" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 #, fuzzy msgid "Fiber Channel" msgstr "" "ADSL\n" "Fiber" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" msgstr "%s (Default)" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1519,7 +1534,7 @@ msgstr "" msgid "Outgoing call" msgstr "Utgående samtal" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "Redo" @@ -1578,12 +1593,12 @@ msgstr "Kopplad" msgid "Call aborted" msgstr "avbrytade" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 #, fuzzy msgid "Could not pause the call" msgstr "Kunde inte ringa" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 #, fuzzy msgid "Pausing the current call..." msgstr "Nuvarande samtal" @@ -1684,119 +1699,119 @@ msgstr "" "SIP adressen som du matade in är inte rätt. Adressen borde se ut som sip:" "namn@domän, såsom sip:peter@exempel.se" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Kunde inte logga in som %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Tidig media" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Samtal med %s" -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "Samtalet slut" -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Samtalet slut." -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Användare upptagen." -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Användaren temporärt inte tillgänglig." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Användaren vill inte bli störd." -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Samtalet avböjdes." -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 #, fuzzy msgid "No response." msgstr "Inget svar inom angiven tid" -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 #, fuzzy msgid "Redirected" msgstr "Omdirigerat till %s..." -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "Samtalet avböjdes." -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registrering hos %s lyckades." -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Avregistrering hos %s lyckades." -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "Inget svar inom angiven tid" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrering hos %s mislyckades: %s" @@ -1806,13 +1821,16 @@ msgstr "Registrering hos %s mislyckades: %s" msgid "Authentication token is %s" msgstr "Linphone - Autentisering krävs" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "Du har %i missat samtal" msgstr[1] "Du har %i missade samtal" +#~ msgid "label" +#~ msgstr "etikett" + #~ msgid "Chat with %s" #~ msgstr "Chatta med %s" diff --git a/po/zh_CN.po b/po/zh_CN.po index f03c496d8..7c81df3fc 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 3.3.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2011-01-08 23:51+0800\n" "Last-Translator: Aron Xu \n" "Language-Team: Chinese (simplified) \n" @@ -18,52 +18,72 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "呼叫 %s" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "发送消息给 %s" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "正在呼叫" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "中断" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "丢失" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "拒绝" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +msgid "%s\t%s" msgstr "" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" @@ -77,42 +97,46 @@ msgstr "静音" msgid "Couldn't find pixmap file: %s" msgstr "无法打开位图文件:%s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "无效的 SIP 联系人!" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "运行时向标准输出记录调试信息。" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "启动到系统托盘,不显示主界面。" -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "现在呼叫的地址" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "是否设置呼叫自动应答" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "指定工作目录(应为安装目录例如 C:\\Program Files\\Linphone)" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "与 %s 通话" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -124,68 +148,68 @@ msgstr "" "您是否允许他看到您的在线状态或者将它加为您的联系人允许?\n" "如果您回答否,则会将该人临时性的放入黑名单" -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "请输入 %s@%s 的密码:" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "呼叫历史" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "呼叫结束" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "呼入" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒绝" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "中断" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "端口" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "网站" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - 互联网视频电话" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (默认)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -193,61 +217,52 @@ msgstr "" "未在此计算机上检测到声卡。\n" "您无法发送或接收音频呼叫。" -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "免费的 SIP 视频电话" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "在线状态" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名称" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "呼叫 %s" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "在 %s 目录中查找 " -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "无效的 SIP 联系人!" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "呼叫 %s" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "发送消息给 %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "编辑联系人 %s" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "删除联系人 %s" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "删除联系人 %s" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "从 %s 目录增加联系人 " @@ -348,20 +363,24 @@ msgstr "" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "您需要重启 linphone 以使语言选择生效。" -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -613,116 +632,116 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "正在呼叫..." -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "呼入" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "正在呼叫" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "正在呼叫" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "通话结束。" -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "呼叫失败。" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 msgid "(Paused)" msgstr "" @@ -744,167 +763,163 @@ msgstr "发送" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "标签" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "呼入" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "通话时间" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "启用自视" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 #, fuzzy msgid "Show debug window" msgstr "Linphone 调试窗口" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 #, fuzzy msgid "_Homepage" msgstr "主页" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 #, fuzzy msgid "Check _Updates" msgstr "检查更新" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 #, fuzzy msgid "Account assistant" msgstr "帐户设置向导" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "SIP 地址或电话号码:" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 msgid "Contacts" msgstr "联系人" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "添加" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "编辑" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "搜索" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 msgid "Add contacts from directory" msgstr "从目录增加联系人" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" msgstr "找到 %i 联系方式" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "呼入" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "当前地址:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "用户名" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "密码" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "网络连接:" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "自动登录" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "登录信息" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "欢迎!" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "" "全部用户\n" "在线用户" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 #, fuzzy msgid "Fiber Channel" msgstr "" "ADSL\n" "光纤" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "默认" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1530,7 +1545,7 @@ msgstr "" msgid "Outgoing call" msgstr "呼出" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "就绪" @@ -1588,12 +1603,12 @@ msgstr "已连接。" msgid "Call aborted" msgstr "中断" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 #, fuzzy msgid "Could not pause the call" msgstr "无法呼叫" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "" @@ -1689,116 +1704,116 @@ msgstr "" "您输入的地址无效。\n" "它应具有“sip:用户名@代理域”的形式,例如 sip:alice@example.net" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "无法登录为 %s" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "响铃。" -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "响铃。" -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "与 %s 通话" -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "呼叫结束" -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "通话结束。" -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "被叫正忙。" -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "您呼叫的用户暂时无法接通。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "用户已开启免打扰功能。" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "呼叫被拒绝。" -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "没有响应。" -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "协议错误。" -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "已重定向" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "呼叫失败。" -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "成功注册到 %s" -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "已在 %s 解除注册。" -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "没有响应,超时" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "注册到 %s 失败: %s" @@ -1808,12 +1823,15 @@ msgstr "注册到 %s 失败: %s" msgid "Authentication token is %s" msgstr "Linphone - 需要认证" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "您错过了 %i 个呼叫。" +#~ msgid "label" +#~ msgstr "标签" + #~ msgid "Keypad" #~ msgstr "数字键盘" diff --git a/po/zh_TW.po b/po/zh_TW.po index c65dcb84f..d1b2ce1a7 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 3.4\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-03-07 12:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" "PO-Revision-Date: 2011-04-06 21:24+0800\n" "Last-Translator: Chao-Hsiung Liao \n" "Language-Team: \n" @@ -17,52 +17,72 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../gtk/calllogs.c:82 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#, c-format +msgid "Call %s" +msgstr "播打給 %s" + +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#, c-format +msgid "Send text to %s" +msgstr "傳送文字給 %s" + +#: ../gtk/calllogs.c:223 +#, fuzzy, c-format +msgid "Recent calls (%i)" +msgstr "通話中" + +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:303 #, fuzzy msgid "Aborted" msgstr "已放棄" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "未接" -#: ../gtk/calllogs.c:91 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "拒接" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" -#: ../gtk/calllogs.c:103 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +msgid "%s\t%s" msgstr "" -#: ../gtk/calllogs.c:108 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:14 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" @@ -76,43 +96,47 @@ msgstr "靜音" msgid "Couldn't find pixmap file: %s" msgstr "找不到 pixmap 檔:%s" -#: ../gtk/main.c:88 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +msgid "Invalid sip contact !" +msgstr "無效的 sip 連絡人!" + +#: ../gtk/main.c:92 msgid "log to stdout some debug information while running." msgstr "執行時將一些除錯資訊記錄到標準輸出。" -#: ../gtk/main.c:95 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:102 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:109 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "只在系統匣啟動,不要顯示主要介面。" -#: ../gtk/main.c:116 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "現在要打電話的位址" -#: ../gtk/main.c:123 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "如啟用此項,將會自動接聽來電" -#: ../gtk/main.c:130 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" msgstr "" "指定一個工作目錄(應該為安裝的根目錄,例如:c:\\Program Files\\Linphone)" -#: ../gtk/main.c:510 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "和 %s 通話" -#: ../gtk/main.c:941 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -124,7 +148,7 @@ msgstr "" "您是否要允許他看見您的上線狀態或將他加入您的連絡人清單?\n" "如果您回答否,這個人會被暫時列入黑名單。" -#: ../gtk/main.c:1018 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -133,61 +157,61 @@ msgstr "" "請輸入您使用者名稱 %s\n" "於網域 %s 的密碼:" -#: ../gtk/main.c:1121 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "通話紀錄" -#: ../gtk/main.c:1124 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "通話已結束" -#: ../gtk/main.c:1127 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "來電" -#: ../gtk/main.c:1129 ../gtk/incall_view.c:498 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "接聽" -#: ../gtk/main.c:1131 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒接" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "通話已放棄" -#: ../gtk/main.c:1137 +#: ../gtk/main.c:1142 #, fuzzy, c-format msgid "by %s" msgstr "連接埠" -#: ../gtk/main.c:1186 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1348 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "網站連結" -#: ../gtk/main.c:1388 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - 網路視訊電話" -#: ../gtk/main.c:1480 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (預設值)" -#: ../gtk/main.c:1782 ../coreapi/callbacks.c:806 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "我們被轉接到 %s" -#: ../gtk/main.c:1792 +#: ../gtk/main.c:1806 msgid "" "No sound cards have been detected on this computer.\n" "You won't be able to send or receive audio calls." @@ -195,61 +219,52 @@ msgstr "" "在這臺電腦中偵測不到音效卡。\n" "您將無法傳送或接收語音電話。" -#: ../gtk/main.c:1896 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "自由的 SIP 視訊電話" -#: ../gtk/friendlist.c:366 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:540 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "上線狀態" -#: ../gtk/friendlist.c:557 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名稱" -#: ../gtk/friendlist.c:569 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "播打給 %s" -#: ../gtk/friendlist.c:574 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:604 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "在 %s 目錄中搜尋" -#: ../gtk/friendlist.c:762 -msgid "Invalid sip contact !" -msgstr "無效的 sip 連絡人!" - -#: ../gtk/friendlist.c:807 -#, c-format -msgid "Call %s" -msgstr "播打給 %s" - -#: ../gtk/friendlist.c:808 -#, c-format -msgid "Send text to %s" -msgstr "傳送文字給 %s" - -#: ../gtk/friendlist.c:809 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "編輯連絡人「%s」" -#: ../gtk/friendlist.c:810 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "刪除連絡人「%s」" -#: ../gtk/friendlist.c:852 +#: ../gtk/friendlist.c:926 +#, fuzzy, c-format +msgid "Delete chat history of '%s'" +msgstr "刪除連絡人「%s」" + +#: ../gtk/friendlist.c:977 #, c-format msgid "Add new contact from %s directory" msgstr "從 %s 目錄加入新的連絡人" @@ -350,20 +365,24 @@ msgstr "" msgid "Hebrew" msgstr "" -#: ../gtk/propertybox.c:847 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "" + +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "您需要重新啟動 linphone 才能讓新選擇的語言生效。" -#: ../gtk/propertybox.c:933 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "" -#: ../gtk/propertybox.c:937 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:943 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -614,114 +633,114 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:13 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:477 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "播打..." -#: ../gtk/incall_view.c:480 ../gtk/incall_view.c:690 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:491 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "來電" -#: ../gtk/incall_view.c:528 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:530 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:532 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:534 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:537 ../gtk/incall_view.c:553 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:652 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:658 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:664 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:664 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:685 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "通話中" -#: ../gtk/incall_view.c:719 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "暫停通話" -#: ../gtk/incall_view.c:732 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:749 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "通話結束。" -#: ../gtk/incall_view.c:779 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:782 +#: ../gtk/incall_view.c:781 #, fuzzy msgid "Transfer done." msgstr "轉接" -#: ../gtk/incall_view.c:785 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "轉接" -#: ../gtk/incall_view.c:829 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "繼續" -#: ../gtk/incall_view.c:836 ../gtk/main.ui.h:10 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "暫停" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, c-format msgid "" "Recording into\n" "%s %s" msgstr "" -#: ../gtk/incall_view.c:901 +#: ../gtk/incall_view.c:900 #, fuzzy msgid "(Paused)" msgstr "暫停" @@ -744,157 +763,153 @@ msgstr "傳送" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "標籤" - -#: ../gtk/main.ui.h:8 +#: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" msgstr "" -#: ../gtk/main.ui.h:9 +#: ../gtk/main.ui.h:8 msgid "Video" msgstr "" -#: ../gtk/main.ui.h:11 +#: ../gtk/main.ui.h:10 msgid "Mute" msgstr "" -#: ../gtk/main.ui.h:12 +#: ../gtk/main.ui.h:11 msgid "Transfer" msgstr "轉接" -#: ../gtk/main.ui.h:15 +#: ../gtk/main.ui.h:14 msgid "In call" msgstr "通話中" -#: ../gtk/main.ui.h:16 +#: ../gtk/main.ui.h:15 msgid "Duration" msgstr "時間長度" -#: ../gtk/main.ui.h:17 +#: ../gtk/main.ui.h:16 msgid "Call quality rating" msgstr "" -#: ../gtk/main.ui.h:18 +#: ../gtk/main.ui.h:17 msgid "_Options" msgstr "選項(_O)" -#: ../gtk/main.ui.h:19 +#: ../gtk/main.ui.h:18 msgid "Always start video" msgstr "" -#: ../gtk/main.ui.h:20 +#: ../gtk/main.ui.h:19 msgid "Enable self-view" msgstr "啟用自拍檢視" -#: ../gtk/main.ui.h:21 +#: ../gtk/main.ui.h:20 msgid "_Help" msgstr "求助(_H)" -#: ../gtk/main.ui.h:22 +#: ../gtk/main.ui.h:21 msgid "Show debug window" msgstr "顯示除錯視窗" -#: ../gtk/main.ui.h:23 +#: ../gtk/main.ui.h:22 msgid "_Homepage" msgstr "官方網頁(_H)" -#: ../gtk/main.ui.h:24 +#: ../gtk/main.ui.h:23 msgid "Check _Updates" msgstr "檢查更新(_U)" -#: ../gtk/main.ui.h:25 +#: ../gtk/main.ui.h:24 #, fuzzy msgid "Account assistant" msgstr "帳號設定助理" -#: ../gtk/main.ui.h:26 +#: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" msgstr "SIP 位址或電話號碼:" -#: ../gtk/main.ui.h:27 +#: ../gtk/main.ui.h:26 msgid "Initiate a new call" msgstr "打出新電話" -#: ../gtk/main.ui.h:28 +#: ../gtk/main.ui.h:27 msgid "Contacts" msgstr "連絡人" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "加入" -#: ../gtk/main.ui.h:30 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "編輯" -#: ../gtk/main.ui.h:31 +#: ../gtk/main.ui.h:30 msgid "Search" msgstr "搜尋" -#: ../gtk/main.ui.h:32 +#: ../gtk/main.ui.h:31 msgid "Add contacts from directory" msgstr "從目錄加入連絡人" -#: ../gtk/main.ui.h:33 +#: ../gtk/main.ui.h:32 msgid "Add contact" msgstr "加入聯絡人" -#: ../gtk/main.ui.h:34 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "通話中" -#: ../gtk/main.ui.h:35 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "我目前的使用者識別:" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "使用者名稱" -#: ../gtk/main.ui.h:37 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "密碼" -#: ../gtk/main.ui.h:38 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "網路連線:" -#: ../gtk/main.ui.h:39 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "將我自動登入" -#: ../gtk/main.ui.h:40 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "登入資訊" -#: ../gtk/main.ui.h:41 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "歡迎使用!" -#: ../gtk/main.ui.h:42 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "所有使用者" -#: ../gtk/main.ui.h:43 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "線上使用者" -#: ../gtk/main.ui.h:44 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:45 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "光纖通道" -#: ../gtk/main.ui.h:46 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "預設值" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1505,7 +1520,7 @@ msgstr "" msgid "Outgoing call" msgstr "去電" -#: ../coreapi/linphonecore.c:1314 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "準備就緒" @@ -1559,11 +1574,11 @@ msgstr "已連線。" msgid "Call aborted" msgstr "通話已放棄" -#: ../coreapi/linphonecore.c:3351 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "無法暫停通話" -#: ../coreapi/linphonecore.c:3356 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "暫停目前的通話..." @@ -1662,115 +1677,115 @@ msgstr "" "您輸入的 sip 身分是無效的。\n" "它應該看起來像 sip:使用者名稱@代理網域,像是 sip:alice@example.net" -#: ../coreapi/proxy.c:1068 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "無法以 %s 登入" -#: ../coreapi/callbacks.c:283 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "遠端響鈴。" -#: ../coreapi/callbacks.c:303 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "遠端響鈴..." -#: ../coreapi/callbacks.c:314 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "早期媒體。" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "和 %s 的通話已暫停。" -#: ../coreapi/callbacks.c:378 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "通話由 %s 接聽 - 保留中。" -#: ../coreapi/callbacks.c:389 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "通話已繼續。" -#: ../coreapi/callbacks.c:394 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "通話由 %s 接聽。" -#: ../coreapi/callbacks.c:409 +#: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:457 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "我們要繼續了..." -#: ../coreapi/callbacks.c:466 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:472 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:541 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "通話已終止。" -#: ../coreapi/callbacks.c:552 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "使用者現正忙碌。" -#: ../coreapi/callbacks.c:553 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "使用者暫時無法聯繫。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:555 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "使用者不想要被打擾。" -#: ../coreapi/callbacks.c:556 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "通話被拒接。" -#: ../coreapi/callbacks.c:568 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "沒有回應。" -#: ../coreapi/callbacks.c:572 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "通訊協定錯誤。" -#: ../coreapi/callbacks.c:588 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "已重新導向" -#: ../coreapi/callbacks.c:624 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:630 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "通話失敗。" -#: ../coreapi/callbacks.c:733 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "在 %s 註冊成功。" -#: ../coreapi/callbacks.c:734 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "在 %s 取消註冊完成。" -#: ../coreapi/callbacks.c:754 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "沒有回應逾時" -#: ../coreapi/callbacks.c:757 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "在 %s 註冊失敗:%s" @@ -1780,12 +1795,15 @@ msgstr "在 %s 註冊失敗:%s" msgid "Authentication token is %s" msgstr "驗證失敗" -#: ../coreapi/linphonecall.c:2314 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "您有 %i 通未接來電。" +#~ msgid "label" +#~ msgstr "標籤" + #~ msgid "Keypad" #~ msgstr "撥號盤" From 9f58698136035018a6dbc34a6c449de762f89232 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 9 Apr 2013 14:06:02 +0200 Subject: [PATCH 182/281] improve call quality indicator (takes into account video) add accessors to late and loss rate in LinphoneCallStats. --- coreapi/linphonecall.c | 56 ++++++++++++++++++++++++++++++++++-------- coreapi/linphonecore.c | 1 + coreapi/linphonecore.h | 6 +++-- mediastreamer2 | 2 +- 4 files changed, 52 insertions(+), 13 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 6c01c65bd..ab917920c 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1857,9 +1857,13 @@ void linphone_call_delete_upnp_session(LinphoneCall *call){ } #endif //BUILD_UPNP -static void linphone_call_log_fill_stats(LinphoneCallLog *log, AudioStream *st){ - audio_stream_get_local_rtp_stats (st,&log->local_stats); - log->quality=audio_stream_get_average_quality_rating(st); +static void linphone_call_log_fill_stats(LinphoneCallLog *log, MediaStream *st){ + float quality=media_stream_get_average_quality_rating(st); + if (quality>=0){ + if (log->quality!=-1){ + log->quality*=quality/5.0; + }else log->quality=quality; + } } void linphone_call_stop_audio_stream(LinphoneCall *call) { @@ -1877,7 +1881,8 @@ void linphone_call_stop_audio_stream(LinphoneCall *call) { lp_config_set_string(call->core->config,"sound","ec_state",state_str); } } - linphone_call_log_fill_stats (call->log,call->audiostream); + audio_stream_get_local_rtp_stats(call->audiostream,&call->log->local_stats); + linphone_call_log_fill_stats (call->log,(MediaStream*)call->audiostream); if (call->endpoint){ linphone_call_remove_from_conf(call); } @@ -1893,6 +1898,7 @@ void linphone_call_stop_video_stream(LinphoneCall *call) { ortp_ev_queue_flush(call->videostream_app_evq); ortp_ev_queue_destroy(call->videostream_app_evq); call->videostream_app_evq=NULL; + linphone_call_log_fill_stats(call->log,(MediaStream*)call->videostream); video_stream_stop(call->videostream); call->videostream=NULL; } @@ -2009,10 +2015,20 @@ float linphone_call_get_record_volume(LinphoneCall *call){ * active audio stream exist. Otherwise it returns the quality rating. **/ float linphone_call_get_current_quality(LinphoneCall *call){ + float audio_rating=-1; + float video_rating=-1; + float result; if (call->audiostream){ - return audio_stream_get_quality_rating(call->audiostream); + audio_rating=media_stream_get_quality_rating((MediaStream*)call->audiostream)/5.0; } - return -1; + if (call->videostream){ + video_rating=media_stream_get_quality_rating((MediaStream*)call->videostream)/5.0; + } + if (audio_rating<0 && video_rating<0) result=-1; + else if (audio_rating<0) result=video_rating*5.0; + else if (video_rating<0) result=audio_rating*5.0; + else result=audio_rating*video_rating*5.0; + return result; } /** @@ -2027,18 +2043,34 @@ float linphone_call_get_average_quality(LinphoneCall *call){ return -1; } +static void update_local_stats(LinphoneCallStats *stats, MediaStream *stream){ + const MSQualityIndicator *qi=media_stream_get_quality_indicator(stream); + if (qi) { + stats->local_late_rate=ms_quality_indicator_get_local_late_rate(qi); + stats->local_loss_rate=ms_quality_indicator_get_local_loss_rate(qi); + } +} + /** * Access last known statistics for audio stream, for a given call. **/ -const LinphoneCallStats *linphone_call_get_audio_stats(const LinphoneCall *call) { - return &call->stats[LINPHONE_CALL_STATS_AUDIO]; +const LinphoneCallStats *linphone_call_get_audio_stats(LinphoneCall *call) { + LinphoneCallStats *stats=&call->stats[LINPHONE_CALL_STATS_AUDIO]; + if (call->audiostream){ + update_local_stats(stats,(MediaStream*)call->audiostream); + } + return stats; } /** * Access last known statistics for video stream, for a given call. **/ -const LinphoneCallStats *linphone_call_get_video_stats(const LinphoneCall *call) { - return &call->stats[LINPHONE_CALL_STATS_VIDEO]; +const LinphoneCallStats *linphone_call_get_video_stats(LinphoneCall *call) { + LinphoneCallStats *stats=&call->stats[LINPHONE_CALL_STATS_VIDEO]; + if (call->videostream){ + update_local_stats(stats,(MediaStream*)call->videostream); + } + return stats; } /** @@ -2242,6 +2274,7 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse freemsg(call->stats[LINPHONE_CALL_STATS_VIDEO].received_rtcp); call->stats[LINPHONE_CALL_STATS_VIDEO].received_rtcp = evd->packet; evd->packet = NULL; + update_local_stats(&call->stats[LINPHONE_CALL_STATS_VIDEO],(MediaStream*)call->videostream); if (lc->vtable.call_stats_updated) lc->vtable.call_stats_updated(lc, call, &call->stats[LINPHONE_CALL_STATS_VIDEO]); } else if (evt == ORTP_EVENT_RTCP_PACKET_EMITTED) { @@ -2250,6 +2283,7 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse freemsg(call->stats[LINPHONE_CALL_STATS_VIDEO].sent_rtcp); call->stats[LINPHONE_CALL_STATS_VIDEO].sent_rtcp = evd->packet; evd->packet = NULL; + update_local_stats(&call->stats[LINPHONE_CALL_STATS_VIDEO],(MediaStream*)call->videostream); if (lc->vtable.call_stats_updated) lc->vtable.call_stats_updated(lc, call, &call->stats[LINPHONE_CALL_STATS_VIDEO]); } else if ((evt == ORTP_EVENT_ICE_SESSION_PROCESSING_FINISHED) || (evt == ORTP_EVENT_ICE_GATHERING_FINISHED) @@ -2283,6 +2317,7 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse freemsg(call->stats[LINPHONE_CALL_STATS_AUDIO].received_rtcp); call->stats[LINPHONE_CALL_STATS_AUDIO].received_rtcp = evd->packet; evd->packet = NULL; + update_local_stats(&call->stats[LINPHONE_CALL_STATS_AUDIO],(MediaStream*)call->audiostream); if (lc->vtable.call_stats_updated) lc->vtable.call_stats_updated(lc, call, &call->stats[LINPHONE_CALL_STATS_AUDIO]); } else if (evt == ORTP_EVENT_RTCP_PACKET_EMITTED) { @@ -2291,6 +2326,7 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse freemsg(call->stats[LINPHONE_CALL_STATS_AUDIO].sent_rtcp); call->stats[LINPHONE_CALL_STATS_AUDIO].sent_rtcp = evd->packet; evd->packet = NULL; + update_local_stats(&call->stats[LINPHONE_CALL_STATS_AUDIO],(MediaStream*)call->audiostream); if (lc->vtable.call_stats_updated) lc->vtable.call_stats_updated(lc, call, &call->stats[LINPHONE_CALL_STATS_AUDIO]); } else if ((evt == ORTP_EVENT_ICE_SESSION_PROCESSING_FINISHED) || (evt == ORTP_EVENT_ICE_GATHERING_FINISHED) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 7b4d6a998..f4782908a 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -116,6 +116,7 @@ LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneAddress *fro cl->from=from; cl->to=to; cl->status=LinphoneCallAborted; /*default status*/ + cl->quality=-1; return cl; } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index fefd050e7..37001d367 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -343,14 +343,16 @@ struct _LinphoneCallStats { LinphoneUpnpState upnp_state; /**< State of uPnP processing. */ float download_bandwidth; /** Date: Tue, 9 Apr 2013 14:12:21 +0200 Subject: [PATCH 183/281] french translation --- po/fr.po | 244 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 126 insertions(+), 118 deletions(-) diff --git a/po/fr.po b/po/fr.po index d4cb84c52..48e85b46b 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,20 +7,22 @@ msgstr "" "Project-Id-Version: Linphone 0.9.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-04-08 16:59+0200\n" -"PO-Revision-Date: 2013-04-08 16:46+0100\n" -"Last-Translator: Simon Morlat \n" +"PO-Revision-Date: 2013-04-09 13:57+0100\n" +"Last-Translator: Simon Morlat \n" "Language-Team: french \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 +#: ../gtk/calllogs.c:139 +#: ../gtk/friendlist.c:922 #, c-format msgid "Call %s" msgstr "Appeler %s" -#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 +#: ../gtk/calllogs.c:140 +#: ../gtk/friendlist.c:923 #, c-format msgid "Send text to %s" msgstr "Chatter avec %s" @@ -60,7 +62,8 @@ msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#: ../gtk/calllogs.c:321 +#: ../gtk/calllogs.c:327 #, c-format msgid "%s\t%s" msgstr "" @@ -71,6 +74,8 @@ msgid "" "%s\tQuality: %s\n" "%s\t%s\t" msgstr "" +"%s\tQualité: %s\n" +"%s\t%s\t" #: ../gtk/calllogs.c:329 #, c-format @@ -79,7 +84,8 @@ msgid "" "%s" msgstr "" -#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 +#: ../gtk/main.ui.h:13 msgid "Conference" msgstr "Conférence" @@ -87,12 +93,15 @@ msgstr "Conférence" msgid "Me" msgstr "Moi" -#: ../gtk/support.c:49 ../gtk/support.c:73 ../gtk/support.c:102 +#: ../gtk/support.c:49 +#: ../gtk/support.c:73 +#: ../gtk/support.c:102 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Icone non trouvée: %s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:324 +#: ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "Contact sip invalide !" @@ -102,7 +111,7 @@ msgstr "affiche des informations de debogage" #: ../gtk/main.c:99 msgid "path to a file to write logs into." -msgstr "" +msgstr "chemin vers le fichier de logs." #: ../gtk/main.c:106 msgid "Start linphone with video disabled." @@ -114,19 +123,15 @@ msgstr "Démarre iconifié, sans interface principale." #: ../gtk/main.c:120 msgid "address to call right now" -msgstr "addresse à appeler maintenant" +msgstr "adresse à appeler maintenant" #: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "si positionné, répond automatiquement aux appels entrants" #: ../gtk/main.c:134 -msgid "" -"Specifiy a working directory (should be the base of the installation, eg: c:" -"\\Program Files\\Linphone)" -msgstr "" -"Spécifie un répertoire de travail (qui devrait être le répertoire " -"d'installation, par exemple c:\\Program Files\\Linphone)" +msgid "Specifiy a working directory (should be the base of the installation, eg: c:\\Program Files\\Linphone)" +msgstr "Spécifie un répertoire de travail (qui devrait être le répertoire d'installation, par exemple c:\\Program Files\\Linphone)" #: ../gtk/main.c:515 #, c-format @@ -137,15 +142,12 @@ msgstr "Appel avec %s" #, c-format msgid "" "%s would like to add you to his contact list.\n" -"Would you allow him to see your presence status or add him to your contact " -"list ?\n" +"Would you allow him to see your presence status or add him to your contact list ?\n" "If you answer no, this person will be temporarily blacklisted." msgstr "" "%s souhaite vous ajouter à sa liste de contact.\n" -"Souhaitez vous l'autoriser à voir votre information de présence et l'ajouter " -"à votre liste également ?\n" -"Si vous répondez non, cette personne sera mise temporairement sur liste " -"noire." +"Souhaitez vous l'autoriser à voir votre information de présence et l'ajouter à votre liste également ?\n" +"Si vous répondez non, cette personne sera mise temporairement sur liste noire." #: ../gtk/main.c:1023 #, c-format @@ -160,19 +162,24 @@ msgstr "" msgid "Call error" msgstr "Erreur lors de l'appel" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 +#: ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Appel terminé." -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 +#: ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Appel entrant" -#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 +#: ../gtk/main.c:1134 +#: ../gtk/incall_view.c:497 +#: ../gtk/main.ui.h:5 msgid "Answer" msgstr "Répondre" -#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1136 +#: ../gtk/main.ui.h:6 msgid "Decline" msgstr "Refuser" @@ -183,12 +190,12 @@ msgstr "Appel en pause" #: ../gtk/main.c:1142 #, c-format msgid "by %s" -msgstr "" +msgstr "b>par %s" #: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" -msgstr "" +msgstr "%s propose de démarrer la vidéo. Acceptez-vous ?" #: ../gtk/main.c:1353 msgid "Website link" @@ -203,7 +210,8 @@ msgstr "Linphone - un téléphone video pour l'internet" msgid "%s (Default)" msgstr "%s (par défaut)" -#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 +#: ../gtk/main.c:1796 +#: ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Transfert vers %s" @@ -228,7 +236,9 @@ msgstr "Ajouter au carnet d'adresse" msgid "Presence status" msgstr "Info de présence" -#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 +#: ../gtk/propertybox.c:367 +#: ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nom" @@ -281,11 +291,13 @@ msgstr "Débit min. (kbit/s)" msgid "Parameters" msgstr "Paramètres" -#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 +#: ../gtk/propertybox.c:435 +#: ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Activé" -#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 +#: ../gtk/propertybox.c:437 +#: ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Désactivé" @@ -366,11 +378,8 @@ msgid "Serbian" msgstr "Serbe" #: ../gtk/propertybox.c:848 -msgid "" -"You need to restart linphone for the new language selection to take effect." -msgstr "" -"La nouvelle selection de langue prendra effet au prochain démarrage de " -"linphone." +msgid "You need to restart linphone for the new language selection to take effect." +msgstr "La nouvelle selection de langue prendra effet au prochain démarrage de linphone." #: ../gtk/propertybox.c:934 msgid "None" @@ -390,10 +399,12 @@ msgid "" "A more recent version is availalble from %s.\n" "Would you like to open a browser to download it ?" msgstr "" +"Une version plus récente est disponible sur %s.\n" +"Voulez vous ouvrir le navigateur afin de pouvoir télécharger la dernière version ?" #: ../gtk/update.c:91 msgid "You are running the lastest version." -msgstr "" +msgstr "Vous utilisez la dernière version." #: ../gtk/buddylookup.c:85 msgid "Firstname, Lastname" @@ -450,13 +461,14 @@ msgstr "Entrez votre identifiant linphone.org" msgid "Username:" msgstr "Nom d'utilisateur:" -#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 +#: ../gtk/password.ui.h:4 msgid "Password:" msgstr "Mot de passe:" #: ../gtk/setupwizard.c:114 msgid "Enter your account informations" -msgstr "" +msgstr "Entrez les informations concernant votre compte" #: ../gtk/setupwizard.c:121 msgid "Username*" @@ -499,41 +511,44 @@ msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" +"Erreur, le compte n'est pas validé, l'identifiant est déjà utilisé ou le serveur n'est pas accessible.\n" +"Merci d'essayer à nouveau." #: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." -msgstr "" +msgstr "Merci. Votre compte est maintenant configuré et prêt à être utilisé." #: ../gtk/setupwizard.c:388 msgid "" -"Please validate your account by clicking on the link we just sent you by " -"email.\n" +"Please validate your account by clicking on the link we just sent you by email.\n" "Then come back here and press Next button." msgstr "" +"Merci de valider votre compte en cliquant sur le lien que nous avons envoyé par email.\n" +"Puis appuyez sur suivant." #: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" -msgstr "" +msgstr "Bienvenue dans l'assistant de configuration de compte." #: ../gtk/setupwizard.c:569 msgid "Account setup assistant" -msgstr "" +msgstr "Assistant de configuration de compte." #: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" -msgstr "Configurez votre compte" +msgstr "Configurez votre compte (étape 1/1)" #: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" -msgstr "" +msgstr "Entrez votre identifiant sip (étape 1/1)" #: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" -msgstr "" +msgstr "Entrez les informations concernant votre compte (étape 1/2)" #: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" -msgstr "" +msgstr "Validation (étape 2/2)" #: ../gtk/setupwizard.c:598 msgid "Error" @@ -541,9 +556,10 @@ msgstr "Erreur" #: ../gtk/setupwizard.c:602 msgid "Terminating" -msgstr "" +msgstr "En cours d’arrêt." -#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 +#: ../gtk/incall_view.c:70 +#: ../gtk/incall_view.c:94 #, c-format msgid "Call #%i" msgstr "Appel #%i" @@ -553,14 +569,15 @@ msgstr "Appel #%i" msgid "Transfer to call #%i with %s" msgstr "Transférer vers l'appel #%i avec %s" -#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 +#: ../gtk/incall_view.c:210 +#: ../gtk/incall_view.c:213 #, fuzzy msgid "Not used" msgstr "Non trouvé" #: ../gtk/incall_view.c:220 msgid "ICE not activated" -msgstr "" +msgstr "ICE non activé" #: ../gtk/incall_view.c:222 #, fuzzy @@ -569,11 +586,11 @@ msgstr "L'appel a échoué." #: ../gtk/incall_view.c:224 msgid "ICE in progress" -msgstr "" +msgstr "Négociation ICE en cours" #: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" -msgstr "" +msgstr "Via un ou plusieurs NATs" #: ../gtk/incall_view.c:228 #, fuzzy @@ -582,36 +599,35 @@ msgstr "Redirection" #: ../gtk/incall_view.c:230 msgid "Through a relay server" -msgstr "" +msgstr "Via un serveur relais" #: ../gtk/incall_view.c:238 msgid "uPnP not activated" msgstr "uPnP non activé" #: ../gtk/incall_view.c:240 -#, fuzzy msgid "uPnP in progress" -msgstr "Découverte STUN en cours" +msgstr "uPnP en cours" #: ../gtk/incall_view.c:242 -#, fuzzy msgid "uPnp not available" -msgstr "indisponible" +msgstr "uPnP est indisponible" #: ../gtk/incall_view.c:244 msgid "uPnP is running" -msgstr "" +msgstr "uPnP en cours d’exécution" #: ../gtk/incall_view.c:246 -#, fuzzy msgid "uPnP failed" -msgstr "L'appel a échoué." +msgstr "uPnP a échoué." -#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +#: ../gtk/incall_view.c:256 +#: ../gtk/incall_view.c:257 msgid "Direct or through server" -msgstr "" +msgstr "Directe ou via un serveur" -#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 +#: ../gtk/incall_view.c:259 +#: ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" @@ -623,7 +639,8 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:384 +#: ../gtk/main.ui.h:12 msgid "Hang up" msgstr "Raccrocher" @@ -631,7 +648,8 @@ msgstr "Raccrocher" msgid "Calling..." msgstr "Tentative d'appel..." -#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 +#: ../gtk/incall_view.c:479 +#: ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" @@ -659,7 +677,8 @@ msgstr "très faible" msgid "too bad" msgstr "nulle" -#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 +#: ../gtk/incall_view.c:536 +#: ../gtk/incall_view.c:552 msgid "unavailable" msgstr "indisponible" @@ -676,7 +695,8 @@ msgstr "Sécurisé par ZRTP- [jeton: %s]" msgid "Set unverified" msgstr "Marquer comme non vérifié" -#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:663 +#: ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Marquer comme vérifié" @@ -717,7 +737,8 @@ msgstr "Transfert échoué" msgid "Resume" msgstr "Reprendre" -#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 +#: ../gtk/main.ui.h:9 msgid "Pause" msgstr "Pause" @@ -752,7 +773,7 @@ msgstr "Fin de conférence" #: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" -msgstr "" +msgstr "Enregistrement de l'appel dans un fichier audio." #: ../gtk/main.ui.h:8 msgid "Video" @@ -760,7 +781,7 @@ msgstr "Vidéo" #: ../gtk/main.ui.h:10 msgid "Mute" -msgstr "" +msgstr "Couper le son" #: ../gtk/main.ui.h:11 msgid "Transfer" @@ -808,7 +829,7 @@ msgstr "" #: ../gtk/main.ui.h:24 msgid "Account assistant" -msgstr "" +msgstr "Assistant de compte" #: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" @@ -822,11 +843,13 @@ msgstr "Démarrer un nouvel appel" msgid "Contacts" msgstr "Contacts" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 +#: ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Ajouter" -#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 +#: ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Editer" @@ -850,17 +873,19 @@ msgstr "Appels récents" msgid "My current identity:" msgstr "Mon identité sip:" -#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 +#: ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Nom d'utilisateur" -#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 +#: ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Mot de passe" #: ../gtk/main.ui.h:37 msgid "Internet connection:" -msgstr "" +msgstr "Connexion internet:" #: ../gtk/main.ui.h:38 msgid "Automatically log me in" @@ -1041,7 +1066,8 @@ msgstr "Codecs audio" msgid "Video codecs" msgstr "Codecs vidéo" -#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 +#: ../gtk/parameters.ui.h:7 +#: ../gtk/keypad.ui.h:5 msgid "C" msgstr "" @@ -1091,7 +1117,7 @@ msgstr "" #: ../gtk/parameters.ui.h:19 msgid "DSCP fields" -msgstr "" +msgstr "Champs DSCP" #: ../gtk/parameters.ui.h:20 msgid "Fixed" @@ -1127,14 +1153,12 @@ msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Derrière un pare-feu (utiliser STUN)" #: ../gtk/parameters.ui.h:28 -#, fuzzy msgid "Behind NAT / Firewall (use ICE)" -msgstr "Derrière un pare-feu (utiliser STUN)" +msgstr "Derrière un pare-feu (utiliser ICE)" #: ../gtk/parameters.ui.h:29 -#, fuzzy msgid "Behind NAT / Firewall (use uPnP)" -msgstr "Derrière un pare-feu (utiliser STUN)" +msgstr "Derrière un pare-feu (utiliser uPnP)" #: ../gtk/parameters.ui.h:30 msgid "Stun server:" @@ -1194,9 +1218,7 @@ msgstr "Paramètres multimedia" #: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" -msgstr "" -"Cette rubrique permet de définir son adresse SIP lorsqu'on ne possède pas de " -"compte SIP" +msgstr "Cette rubrique permet de définir son adresse SIP lorsqu'on ne possède pas de compte SIP" #: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" @@ -1238,11 +1260,13 @@ msgstr "Sécurité" msgid "Manage SIP Accounts" msgstr "Gérer mes comptes SIP" -#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 +#: ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Activer" -#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 +#: ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Désactiver" @@ -1267,13 +1291,8 @@ msgid "Enable adaptive rate control" msgstr "Activer le control de débit adaptatif." #: ../gtk/parameters.ui.h:64 -msgid "" -"Adaptive rate control is a technique to dynamically guess the available " -"bandwidth during a call." -msgstr "" -"Le control de débit adaptatif est une technique pour adapter la qualité " -"de l'audio et de la video en fonction de la bande passante disponible, " -"durant l'appel." +msgid "Adaptive rate control is a technique to dynamically guess the available bandwidth during a call." +msgstr "Le control de débit adaptatif est une technique pour adapter la qualité de l'audio et de la video en fonction de la bande passante disponible, durant l'appel." #: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" @@ -1324,9 +1343,8 @@ msgid "Please wait" msgstr "En attente" #: ../gtk/dscp_settings.ui.h:1 -#, fuzzy msgid "Dscp settings" -msgstr "Réglages" +msgstr "Réglages Dscp" #: ../gtk/dscp_settings.ui.h:2 msgid "SIP" @@ -1346,10 +1364,9 @@ msgstr "" #: ../gtk/call_statistics.ui.h:1 msgid "Call statistics" -msgstr "" +msgstr "Statistiques de l'appel" #: ../gtk/call_statistics.ui.h:2 -#, fuzzy msgid "Audio codec" msgstr "Codecs audio" @@ -1380,9 +1397,8 @@ msgid "Round trip time" msgstr "" #: ../gtk/call_statistics.ui.h:9 -#, fuzzy msgid "Call statistics and information" -msgstr "Information sur le contact" +msgstr "Statistiques de l'appel et informations" #: ../gtk/tunnel_config.ui.h:1 #, fuzzy @@ -1509,11 +1525,8 @@ msgid "Could not resolve this number." msgstr "La destination n'a pu être trouvée." #: ../coreapi/linphonecore.c:2231 -msgid "" -"Could not parse given sip address. A sip url usually looks like sip:" -"user@domain" -msgstr "" -"Adresse SIP mal formulée. Une address sip ressemble à " +msgid "Could not parse given sip address. A sip url usually looks like sip:user@domain" +msgstr "Adresse SIP mal formulée. Une address sip ressemble à " #: ../coreapi/linphonecore.c:2432 msgid "Contacting" @@ -1626,7 +1639,7 @@ msgstr "Parti" #: ../coreapi/friend.c:57 msgid "Using another messaging service" -msgstr "" +msgstr "Utilisation d'un autre service de messagerie" #: ../coreapi/friend.c:60 msgid "Offline" @@ -1641,12 +1654,8 @@ msgid "Unknown-bug" msgstr "Bug inconnu" #: ../coreapi/proxy.c:204 -msgid "" -"The sip proxy address you entered is invalid, it must start with \"sip:\" " -"followed by a hostname." -msgstr "" -"L'addresse SIP du proxy est invalide. Elle doit commencer par \"sip:\" " -"suivie par un nom de domaine." +msgid "The sip proxy address you entered is invalid, it must start with \"sip:\" followed by a hostname." +msgstr "L'adresse SIP du proxy est invalide. Elle doit commencer par \"sip:\" suivie par un nom de domaine." #: ../coreapi/proxy.c:210 msgid "" @@ -1654,8 +1663,7 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" "L'identité SIP que vous avez fourni est invalide.\n" -"Elle doit être de la forme sip:username@domain, comme par example sip:" -"alice@example.net" +"Elle doit être de la forme sip:username@domain, comme par example sip:alice@example.net" #: ../coreapi/proxy.c:1069 #, c-format @@ -1801,7 +1809,7 @@ msgstr[1] "Vous avez manqué %i appels" #~ msgid "Enter username, phone number, or full sip address" #~ msgstr "" -#~ "Entrez un nom d'utilisateur, un numéro de téléphone, ou une addresse SIP" +#~ "Entrez un nom d'utilisateur, un numéro de téléphone, ou une adresse SIP" #~ msgid "Lookup:" #~ msgstr "Rechercher:" From 374f170fb2a06ca20fe882e00958adc795201134 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 9 Apr 2013 15:52:30 +0200 Subject: [PATCH 184/281] add jni and java accessors for realtime late and loss rates --- coreapi/linphonecore_jni.cc | 18 ++++++++++++++- .../org/linphone/core/LinphoneCallStats.java | 20 +++++++++++++---- .../org/linphone/core/LinphoneCallImpl.java | 2 ++ .../linphone/core/LinphoneCallStatsImpl.java | 22 +++++++++++++++++++ mediastreamer2 | 2 +- 5 files changed, 58 insertions(+), 6 deletions(-) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 6b6c3f5ce..ddc26f657 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1578,6 +1578,23 @@ extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getJitterBufferSi return (jfloat)((LinphoneCallStats *)stats_ptr)->jitter_stats.jitter_buffer_size_ms; } +extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getLocalLossRate(JNIEnv *env, jobject thiz,jlong stats_ptr) { + const LinphoneCallStats *stats = (LinphoneCallStats *)stats_ptr; + return stats->local_loss_rate; +} + +extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getLocalLateRate(JNIEnv *env, jobject thiz, jlong stats_ptr) { + const LinphoneCallStats *stats = (LinphoneCallStats *)stats_ptr; + return stats->local_late_rate; +} + +extern "C" void Java_org_linphone_core_LinphoneCallStatsImpl_updateStats(JNIEnv *env, jobject thiz, jlong call_ptr, jint mediatype) { + if (mediatype==LINPHONE_CALL_STATS_AUDIO) + linphone_call_get_audio_stats((LinphoneCall*)call_ptr); + else + linphone_call_get_video_stats((LinphoneCall*)call_ptr); +} + /*payloadType*/ extern "C" jstring Java_org_linphone_core_PayloadTypeImpl_toString(JNIEnv* env,jobject thiz,jlong ptr) { PayloadType* pt = (PayloadType*)ptr; @@ -1702,7 +1719,6 @@ extern "C" jfloat Java_org_linphone_core_LinphoneCallImpl_getAverageQuality( JNI return (jfloat)linphone_call_get_average_quality((LinphoneCall*)ptr); } - //LinphoneFriend extern "C" jlong Java_org_linphone_core_LinphoneFriendImpl_newLinphoneFriend(JNIEnv* env ,jobject thiz diff --git a/java/common/org/linphone/core/LinphoneCallStats.java b/java/common/org/linphone/core/LinphoneCallStats.java index f1248c445..295c99484 100644 --- a/java/common/org/linphone/core/LinphoneCallStats.java +++ b/java/common/org/linphone/core/LinphoneCallStats.java @@ -121,25 +121,25 @@ public interface LinphoneCallStats { public float getUploadBandwidth(); /** - * Get the sender loss rate since last report + * Get the local loss rate since last report * @return The sender loss rate */ public float getSenderLossRate(); /** - * Get the receiver loss rate since last report + * Get the remote reported loss rate since last report * @return The receiver loss rate */ public float getReceiverLossRate(); /** - * Get the sender interarrival jitter + * Get the local interarrival jitter * @return The interarrival jitter at last emitted sender report */ public float getSenderInterarrivalJitter(); /** - * Get the receiver interarrival jitter + * Get the remote reported interarrival jitter * @return The interarrival jitter at last received receiver report */ public float getReceiverInterarrivalJitter(); @@ -161,4 +161,16 @@ public interface LinphoneCallStats { * @return The jitter buffer size in milliseconds */ public float getJitterBufferSize(); + + /** + * Get the local loss rate. Unlike getSenderLossRate() that returns this loss rate "since last emitted RTCP report", the value returned here is updated every second. + * @return The local loss rate percentage. + **/ + public float getLocalLossRate(); + + /** + * Get the local late packets rate. The value returned here is updated every second. + * @return The local late rate percentage. + **/ + public float getLocalLateRate(); } diff --git a/java/impl/org/linphone/core/LinphoneCallImpl.java b/java/impl/org/linphone/core/LinphoneCallImpl.java index 30bcd528f..041acaef2 100644 --- a/java/impl/org/linphone/core/LinphoneCallImpl.java +++ b/java/impl/org/linphone/core/LinphoneCallImpl.java @@ -68,9 +68,11 @@ class LinphoneCallImpl implements LinphoneCall { videoStats = stats; } public LinphoneCallStats getAudioStats() { + if (audioStats!=null) ((LinphoneCallStatsImpl)audioStats).updateRealTimeStats(this); return audioStats; } public LinphoneCallStats getVideoStats() { + if (videoStats!=null) ((LinphoneCallStatsImpl)videoStats).updateRealTimeStats(this); return videoStats; } public CallDirection getDirection() { diff --git a/java/impl/org/linphone/core/LinphoneCallStatsImpl.java b/java/impl/org/linphone/core/LinphoneCallStatsImpl.java index 53fcb5ffd..4657ba01a 100644 --- a/java/impl/org/linphone/core/LinphoneCallStatsImpl.java +++ b/java/impl/org/linphone/core/LinphoneCallStatsImpl.java @@ -31,6 +31,9 @@ class LinphoneCallStatsImpl implements LinphoneCallStats { private float roundTripDelay; private long latePacketsCumulativeNumber; private float jitterBufferSize; + private float localLossRate; + private float localLateRate; + private long nativePtr; private native int getMediaType(long nativeStatsPtr); private native int getIceState(long nativeStatsPtr); @@ -43,8 +46,12 @@ class LinphoneCallStatsImpl implements LinphoneCallStats { private native float getRoundTripDelay(long nativeStatsPtr); private native long getLatePacketsCumulativeNumber(long nativeStatsPtr, long nativeCallPtr); private native float getJitterBufferSize(long nativeStatsPtr); + private native float getLocalLossRate(long nativeStatsPtr); + private native float getLocalLateRate(long nativeStatsPtr); + private native void updateStats(long nativeCallPtr, int mediaType); protected LinphoneCallStatsImpl(long nativeCallPtr, long nativeStatsPtr) { + nativePtr=nativeStatsPtr; mediaType = getMediaType(nativeStatsPtr); iceState = getIceState(nativeStatsPtr); downloadBandwidth = getDownloadBandwidth(nativeStatsPtr); @@ -56,6 +63,13 @@ class LinphoneCallStatsImpl implements LinphoneCallStats { roundTripDelay = getRoundTripDelay(nativeStatsPtr); latePacketsCumulativeNumber = getLatePacketsCumulativeNumber(nativeStatsPtr, nativeCallPtr); jitterBufferSize = getJitterBufferSize(nativeStatsPtr); + + } + + protected void updateRealTimeStats(LinphoneCall call){ + updateStats( ((LinphoneCallImpl)call).nativePtr, mediaType); + localLossRate=getLocalLossRate(nativePtr); + localLateRate=getLocalLateRate(nativePtr); } public MediaType getMediaType() { @@ -101,4 +115,12 @@ class LinphoneCallStatsImpl implements LinphoneCallStats { public float getJitterBufferSize() { return jitterBufferSize; } + + public float getLocalLossRate(){ + return localLossRate; + } + + public float getLocalLateRate(){ + return localLateRate; + } } diff --git a/mediastreamer2 b/mediastreamer2 index abf2a7ec4..4f93003c1 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit abf2a7ec461ac411703233e3554e985d62fa0b9c +Subproject commit 4f93003c1eade1442fdedd8dee10f18c98ec47c3 From f8728ffca088b8dc292ae5071d0f772b118acc16 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 9 Apr 2013 17:56:49 +0200 Subject: [PATCH 185/281] Update oRTP submodule. --- oRTP | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oRTP b/oRTP index 35f5efbfb..9f51aa254 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 35f5efbfbf7814bd0403249431a6b94d6c4286b4 +Subproject commit 9f51aa254fc5c24834614612036485406a8d06a7 From f0136172b063c81e399dea3c2b325d66e7b3fab3 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 9 Apr 2013 18:07:53 +0200 Subject: [PATCH 186/281] Change API to set log handler and log level. - Deprecate linphone_core_enable_logs(), linphone_core_enable_logs_with_cb() and linphone_core_disable_logs() functions. - Introduce linphone_core_set_log_handler(), linphone_core_set_log_file() and linphone_core_set_log_level() functions. --- coreapi/linphonecore.c | 32 +++++++++++++++++++++++++++++--- coreapi/linphonecore.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index f4782908a..5f70f45e1 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -407,10 +407,29 @@ const LinphoneAddress *linphone_core_get_current_call_remote_address(struct _Lin return linphone_call_get_remote_address(call); } +void linphone_core_set_log_handler(OrtpLogFunc logfunc) { + ortp_set_log_handler(logfunc); +} + +void linphone_core_set_log_file(FILE *file) { + if (file == NULL) file = stdout; + ortp_set_log_file(file); +} + +void linphone_core_set_log_level(OrtpLogLevel loglevel) { + ortp_set_log_level_mask(loglevel); + if (loglevel == 0) { + sal_disable_logs(); + } else { + sal_enable_logs(); + } +} + /** * Enable logs in supplied FILE*. * * @ingroup misc + * @deprecated Use #linphone_core_set_log_file and #linphone_core_set_log_level instead. * * @param file a C FILE* where to fprintf logs. If null stdout is used. * @@ -425,6 +444,7 @@ void linphone_core_enable_logs(FILE *file){ * Enable logs through the user's supplied log callback. * * @ingroup misc + * @deprecated Use #linphone_core_set_log_handler and #linphone_core_set_log_level instead. * * @param logfunc The address of a OrtpLogFunc callback whose protoype is * typedef void (*OrtpLogFunc)(OrtpLogLevel lev, const char *fmt, va_list args); @@ -439,6 +459,7 @@ void linphone_core_enable_logs_with_cb(OrtpLogFunc logfunc){ * Entirely disable logging. * * @ingroup misc + * @deprecated Use #linphone_core_set_log_level instead. **/ void linphone_core_disable_logs(){ ortp_set_log_level_mask(ORTP_ERROR|ORTP_FATAL); @@ -1197,6 +1218,7 @@ static void misc_config_read (LinphoneCore *lc) { LpConfig *config=lc->config; lc->max_call_logs=lp_config_get_int(config,"misc","history_max_size",15); lc->max_calls=lp_config_get_int(config,"misc","max_calls",NB_MAX_CALLS); + linphone_core_set_log_level((OrtpLogLevel)lp_config_get_int(config,"misc","log_level",0)); } @@ -2152,9 +2174,13 @@ void linphone_core_iterate(LinphoneCore *lc){ lc->initial_subscribes_sent=TRUE; } - if (one_second_elapsed && lp_config_needs_commit(lc->config)){ - lp_config_sync(lc->config); - } + if (one_second_elapsed) { + if (ortp_get_log_level_mask() != lp_config_get_int(lc->config, "misc", "log_level", 0)) { + lp_config_set_int(lc->config, "misc", "log_level", ortp_get_log_level_mask()); + } + if (lp_config_needs_commit(lc->config)) { + lp_config_sync(lc->config); + } } /** diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 37001d367..f8e1dcb88 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -874,6 +874,35 @@ typedef void * (*LinphoneWaitingCallback)(struct _LinphoneCore *lc, void *contex /* THE main API */ +/** + * Define a log handler. + * + * @ingroup misc + * + * @param logfunc The function pointer of the log handler. + */ +void linphone_core_set_log_handler(OrtpLogFunc logfunc); +/** + * Define a log file. + * + * @ingroup misc + * + * If the file pointer passed as an argument is NULL, stdout is used instead. + * + * @param file A pointer to the FILE structure of the file to write to. + */ +void linphone_core_set_log_file(FILE *file); +/** + * Define the log level. + * + * @ingroup misc + * + * The loglevel parameter is a bitmask parameter. Therefore to enable only warning and error + * messages, use ORTP_WARNING | ORTP_ERROR. To disable logs, simply set loglevel to 0. + * + * @param loglevel A bitmask of the log levels to set. + */ +void linphone_core_set_log_level(OrtpLogLevel loglevel); void linphone_core_enable_logs(FILE *file); void linphone_core_enable_logs_with_cb(OrtpLogFunc logfunc); void linphone_core_disable_logs(void); From c764afab71ddc1a69fb9f8a9901f40575e771bc1 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 9 Apr 2013 18:25:12 +0200 Subject: [PATCH 187/281] Fix compilation (missing }). --- coreapi/linphonecore.c | 1 + 1 file changed, 1 insertion(+) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 5f70f45e1..cb1808836 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2181,6 +2181,7 @@ void linphone_core_iterate(LinphoneCore *lc){ if (lp_config_needs_commit(lc->config)) { lp_config_sync(lc->config); } + } } /** From f497147309295e92054e1cc9f500ef833e811d5c Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 10 Apr 2013 09:20:13 +0200 Subject: [PATCH 188/281] Fix compilation. --- coreapi/linphonecore.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index cb1808836..e1d88b292 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -418,11 +418,6 @@ void linphone_core_set_log_file(FILE *file) { void linphone_core_set_log_level(OrtpLogLevel loglevel) { ortp_set_log_level_mask(loglevel); - if (loglevel == 0) { - sal_disable_logs(); - } else { - sal_enable_logs(); - } } /** From 043f9122fdc37c0c544357735429f4c114241dec Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 10 Apr 2013 14:05:20 +0200 Subject: [PATCH 189/281] Use static lib for xml2lpc and lpc2xml --- build/android/common.mk | 5 +++++ build/android/lpc2xml.mk | 8 ++++---- build/android/xml2lpc.mk | 8 ++++---- java/impl/org/linphone/tools/Lpc2Xml.java | 2 +- java/impl/org/linphone/tools/Xml2Lpc.java | 2 +- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/build/android/common.mk b/build/android/common.mk index 543a9dc19..584649735 100644 --- a/build/android/common.mk +++ b/build/android/common.mk @@ -95,6 +95,11 @@ LOCAL_STATIC_LIBRARIES := \ libeXosip2 \ libosip2 \ libgsm +ifeq ($(BUILD_REMOTE_PROVISIONING),1) +LOCAL_STATIC_LIBRARIES += \ + libxml2lpc \ + liblpc2xml +endif ifeq ($(BUILD_TUNNEL),1) LOCAL_CFLAGS +=-DTUNNEL_ENABLED diff --git a/build/android/lpc2xml.mk b/build/android/lpc2xml.mk index b5757ad99..91038adce 100644 --- a/build/android/lpc2xml.mk +++ b/build/android/lpc2xml.mk @@ -39,10 +39,10 @@ LOCAL_C_INCLUDES = \ $(LOCAL_PATH)/../../externals/build/libxml2 \ LOCAL_SHARED_LIBRARIES = \ - libxml2 \ - liblinphonenoneon \ - liblinphone \ + libxml2 +# liblinphonenoneon \ +# liblinphone \ LOCAL_MODULE := liblpc2xml -include $(BUILD_SHARED_LIBRARY) +include $(BUILD_STATIC_LIBRARY) diff --git a/build/android/xml2lpc.mk b/build/android/xml2lpc.mk index 449251cc8..e89ab383b 100644 --- a/build/android/xml2lpc.mk +++ b/build/android/xml2lpc.mk @@ -39,10 +39,10 @@ LOCAL_C_INCLUDES = \ $(LOCAL_PATH)/../../externals/build/libxml2 \ LOCAL_SHARED_LIBRARIES = \ - libxml2 \ - liblinphonenoneon \ - liblinphone \ + libxml2 +# liblinphonenoneon \ +# liblinphone \ LOCAL_MODULE := libxml2lpc -include $(BUILD_SHARED_LIBRARY) +include $(BUILD_STATIC_LIBRARY) diff --git a/java/impl/org/linphone/tools/Lpc2Xml.java b/java/impl/org/linphone/tools/Lpc2Xml.java index 97ef99637..2f3d90751 100644 --- a/java/impl/org/linphone/tools/Lpc2Xml.java +++ b/java/impl/org/linphone/tools/Lpc2Xml.java @@ -59,7 +59,7 @@ public class Lpc2Xml { static { try { System.loadLibrary("xml2"); - System.loadLibrary("lpc2xml"); + //System.loadLibrary("lpc2xml"); mAvailable = true; } catch (Throwable e) { mAvailable = false; diff --git a/java/impl/org/linphone/tools/Xml2Lpc.java b/java/impl/org/linphone/tools/Xml2Lpc.java index 9f6cb0f27..5e0a81880 100644 --- a/java/impl/org/linphone/tools/Xml2Lpc.java +++ b/java/impl/org/linphone/tools/Xml2Lpc.java @@ -63,7 +63,7 @@ public class Xml2Lpc { static { try { System.loadLibrary("xml2"); - System.loadLibrary("xml2lpc"); + //System.loadLibrary("xml2lpc"); mAvailable = true; } catch (Throwable e) { mAvailable = false; From 0fa5d7c73b672772a8841c65ff0c7fcdc4e1fce7 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 11 Apr 2013 14:24:06 +0200 Subject: [PATCH 190/281] fix bug when choosing SDP connection address restore logs --- coreapi/linphonecall.c | 4 ++-- coreapi/linphonecore.c | 8 ++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index ab917920c..db3190bbb 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -469,7 +469,7 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr call->op=sal_op_new(lc->sal); sal_op_set_user_pointer(call->op,call); call->core=lc; - linphone_core_get_local_ip(lc,linphone_address_get_domain(to),call->localip); + linphone_core_get_local_ip(lc,NULL,call->localip); linphone_call_init_common(call,from,to); _linphone_call_params_copy(&call->params,params); sal_op_set_custom_header(call->op,call->params.custom_headers); @@ -528,7 +528,7 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro } linphone_address_clean(from); - linphone_core_get_local_ip(lc,linphone_address_get_domain(from),call->localip); + linphone_core_get_local_ip(lc,NULL,call->localip); linphone_call_init_common(call, from, to); call->log->call_id=ms_strdup(sal_op_get_call_id(op)); /*must be known at that time*/ linphone_core_init_default_params(lc, &call->params); diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index e1d88b292..729df1fc6 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1211,9 +1211,8 @@ void linphone_core_set_state(LinphoneCore *lc, LinphoneGlobalState gstate, const } static void misc_config_read (LinphoneCore *lc) { LpConfig *config=lc->config; - lc->max_call_logs=lp_config_get_int(config,"misc","history_max_size",15); - lc->max_calls=lp_config_get_int(config,"misc","max_calls",NB_MAX_CALLS); - linphone_core_set_log_level((OrtpLogLevel)lp_config_get_int(config,"misc","log_level",0)); + lc->max_call_logs=lp_config_get_int(config,"misc","history_max_size",15); + lc->max_calls=lp_config_get_int(config,"misc","max_calls",NB_MAX_CALLS); } @@ -2170,9 +2169,6 @@ void linphone_core_iterate(LinphoneCore *lc){ } if (one_second_elapsed) { - if (ortp_get_log_level_mask() != lp_config_get_int(lc->config, "misc", "log_level", 0)) { - lp_config_set_int(lc->config, "misc", "log_level", ortp_get_log_level_mask()); - } if (lp_config_needs_commit(lc->config)) { lp_config_sync(lc->config); } From a3e275c1262d042df636bd1d54a5d24aaac3e3d2 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 11 Apr 2013 14:34:04 +0200 Subject: [PATCH 191/281] Added GetTime method to LinphoneChatMessage java impl --- coreapi/linphonecore_jni.cc | 6 ++++++ java/common/org/linphone/core/LinphoneChatMessage.java | 6 ++++++ java/impl/org/linphone/core/LinphoneChatMessageImpl.java | 5 +++++ 3 files changed, 17 insertions(+) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index ddc26f657..5046d83bb 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1871,6 +1871,12 @@ extern "C" jlong Java_org_linphone_core_LinphoneChatMessageImpl_getPeerAddress(J return (jlong) linphone_chat_message_get_peer_address((LinphoneChatMessage*)ptr); } +extern "C" jlong Java_org_linphone_core_LinphoneChatMessageImpl_getTime(JNIEnv* env + ,jobject thiz + ,jlong ptr) { + return (jlong) linphone_chat_message_get_time((LinphoneChatMessage*)ptr); +} + extern "C" void Java_org_linphone_core_LinphoneChatRoomImpl_sendMessage(JNIEnv* env ,jobject thiz ,jlong ptr diff --git a/java/common/org/linphone/core/LinphoneChatMessage.java b/java/common/org/linphone/core/LinphoneChatMessage.java index 3a2a45718..b6b6c30ec 100644 --- a/java/common/org/linphone/core/LinphoneChatMessage.java +++ b/java/common/org/linphone/core/LinphoneChatMessage.java @@ -106,4 +106,10 @@ public interface LinphoneChatMessage { * @return the value of the header, or null if not found. */ String getCustomHeader(String name); + + /** + * Gets the time at which the message was sent + * @return the time in milliseconds + */ + long getTime(); } diff --git a/java/impl/org/linphone/core/LinphoneChatMessageImpl.java b/java/impl/org/linphone/core/LinphoneChatMessageImpl.java index 1373708ca..2a256f2f5 100644 --- a/java/impl/org/linphone/core/LinphoneChatMessageImpl.java +++ b/java/impl/org/linphone/core/LinphoneChatMessageImpl.java @@ -8,6 +8,7 @@ public class LinphoneChatMessageImpl implements LinphoneChatMessage { private native String getExternalBodyUrl(long ptr); private native void setExternalBodyUrl(long ptr, String url); private native long getFrom(long ptr); + private native long getTime(long ptr); protected LinphoneChatMessageImpl(long aNativePtr) { nativePtr = aNativePtr; @@ -64,4 +65,8 @@ public class LinphoneChatMessageImpl implements LinphoneChatMessage { public String getCustomHeader(String name) { return getCustomHeader(nativePtr,name); } + + public long getTime() { + return getTime(nativePtr); + } } From 8563691595111d6c26be1346f0290af971986aed Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 11 Apr 2013 15:39:25 +0200 Subject: [PATCH 192/281] Add the linphone_core_new_with_config() function to instantiate a LinphoneCore given an already existing LpConfig. This enables the creation of the LpConfig before creating the LinphoneCore. It is useful on some systems to read some configuration parameters and perform some customization before creating the LinphoneCore. The LpConfig can now also be created given a factory config filename using the new lp_config_new_with_factory() function. --- coreapi/linphonecore.c | 20 +++++++++++--------- coreapi/linphonecore.h | 14 ++++++++++++++ coreapi/lpconfig.c | 19 +++++++++++++------ coreapi/lpconfig.h | 22 ++++++++++++++++++++++ 4 files changed, 60 insertions(+), 15 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 729df1fc6..edf11a407 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1218,11 +1218,11 @@ static void misc_config_read (LinphoneCore *lc) { -static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vtable, const char *config_path, - const char *factory_config_path, void * userdata) +static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vtable, LpConfig *config, void * userdata) { ms_message("Initializing LinphoneCore %s", linphone_core_get_version()); memset (lc, 0, sizeof (LinphoneCore)); + lc->config=config; lc->data=userdata; lc->ringstream_autorelease=TRUE; @@ -1299,10 +1299,6 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta lc->msevq=ms_event_queue_new(); ms_set_global_event_queue(lc->msevq); - lc->config=lp_config_new(config_path); - if (factory_config_path) - lp_config_read_file(lc->config,factory_config_path); - lc->sal=sal_init(); sal_set_user_pointer(lc->sal,lc); sal_set_callbacks(lc->sal,&linphone_sal_callbacks); @@ -1348,13 +1344,19 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta * It is OPTIONAL, use NULL if unneeded. * @param userdata an opaque user pointer that can be retrieved at any time (for example in * callbacks) using linphone_core_get_user_data(). - * + * @see linphone_core_new_with_config **/ LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable, const char *config_path, const char *factory_config_path, void * userdata) { - LinphoneCore *core=ms_new(LinphoneCore,1); - linphone_core_init(core,vtable,config_path, factory_config_path, userdata); + LpConfig *config = lp_config_new_with_factory(config_path, factory_config_path); + return linphone_core_new_with_config(vtable, config, userdata); +} + +LinphoneCore *linphone_core_new_with_config(const LinphoneCoreVTable *vtable, struct _LpConfig *config, void *userdata) +{ + LinphoneCore *core = ms_new(LinphoneCore, 1); + linphone_core_init(core, vtable, config, userdata); return core; } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index f8e1dcb88..5ae73cc4d 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -913,6 +913,20 @@ const char *linphone_core_get_user_agent_version(void); LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable, const char *config_path, const char *factory_config, void* userdata); +/** + * Instantiates a LinphoneCore object with a given LpConfig. + * @ingroup initializing + * + * The LinphoneCore object is the primary handle for doing all phone actions. + * It should be unique within your application. + * @param vtable a LinphoneCoreVTable structure holding your application callbacks + * @param config a pointer to an LpConfig object holding the configuration of the LinphoneCore to be instantiated. + * @param userdata an opaque user pointer that can be retrieved at any time (for example in + * callbacks) using linphone_core_get_user_data(). + * @see linphone_core_new +**/ +LinphoneCore *linphone_core_new_with_config(const LinphoneCoreVTable *vtable, struct _LpConfig *config, void *userdata); + /* function to be periodically called in a main loop */ /* For ICE to work properly it should be called every 20ms */ void linphone_core_iterate(LinphoneCore *lc); diff --git a/coreapi/lpconfig.c b/coreapi/lpconfig.c index dd3de63db..ca65fd1ff 100644 --- a/coreapi/lpconfig.c +++ b/coreapi/lpconfig.c @@ -211,19 +211,23 @@ void lp_config_parse(LpConfig *lpconfig, FILE *file){ } LpConfig * lp_config_new(const char *filename){ + return lp_config_new_with_factory(filename, NULL); +} + +LpConfig *lp_config_new_with_factory(const char *config_filename, const char *factory_config_filename) { LpConfig *lpconfig=lp_new0(LpConfig,1); - if (filename!=NULL){ - ms_message("Using (r/w) config information from %s", filename); - lpconfig->filename=ortp_strdup(filename); - lpconfig->file=fopen(filename,"r+"); + if (config_filename!=NULL){ + ms_message("Using (r/w) config information from %s", config_filename); + lpconfig->filename=ortp_strdup(config_filename); + lpconfig->file=fopen(config_filename,"r+"); if (lpconfig->file!=NULL){ struct stat fileStat; lp_config_parse(lpconfig,lpconfig->file); fclose(lpconfig->file); #if !defined(_WIN32_WCE) - if ((stat(filename,&fileStat) == 0) && (S_ISREG(fileStat.st_mode))) { + if ((stat(config_filename,&fileStat) == 0) && (S_ISREG(fileStat.st_mode))) { /* make existing configuration files non-group/world-accessible */ - if (chmod(filename, S_IRUSR | S_IWUSR) == -1) { + if (chmod(config_filename, S_IRUSR | S_IWUSR) == -1) { ms_warning("unable to correct permissions on " "configuration file: %s", strerror(errno)); } @@ -233,6 +237,9 @@ LpConfig * lp_config_new(const char *filename){ lpconfig->modified=0; } } + if (factory_config_filename != NULL) { + lp_config_read_file(lpconfig, factory_config_filename); + } return lpconfig; } diff --git a/coreapi/lpconfig.h b/coreapi/lpconfig.h index 310baaff3..43f761adb 100644 --- a/coreapi/lpconfig.h +++ b/coreapi/lpconfig.h @@ -65,7 +65,29 @@ extern "C" { (config) ? (lp_config_get_float(config, "default_values", name, default)) : (default) +/** + * Instantiates a LpConfig object from a user config file. + * + * @ingroup misc + * @param filename the filename of the config file to read to fill the instantiated LpConfig + * @see lp_config_new_with_factory + */ LpConfig * lp_config_new(const char *filename); + +/** + * Instantiates a LpConfig object from a user config file and a factory config file. + * + * @ingroup misc + * @param config_filename the filename of the user config file to read to fill the instantiated LpConfig + * @param factory_config_filename the filename of the factory config file to read to fill the instantiated LpConfig + * @see lp_config_new + * + * The user config file is read first to fill the LpConfig and then the factory config file is read. + * Therefore the configuration parameters defined in the user config file will be overwritten by the parameters + * defined in the factory config file. + */ +LpConfig * lp_config_new_with_factory(const char *config_filename, const char *factory_config_filename); + int lp_config_read_file(LpConfig *lpconfig, const char *filename); /** * Retrieves a configuration item as a string, given its section, key, and default value. From 6a9dafbb64cdea8a239ccafa9430bc9a3cd90cf3 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 11 Apr 2013 16:36:40 +0200 Subject: [PATCH 193/281] try to fix date issues --- coreapi/sal_eXosip2.c | 2 +- coreapi/sal_eXosip2_presence.c | 31 ++++++++++++++++++------------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index b86fc26e0..1bbbe36e6 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1798,7 +1798,7 @@ static void text_received(Sal *sal, eXosip_event_t *ev){ for(j=0;j<12;j++) { if(strcmp(tmp2,months[j])==0) ret.tm_mon=j; } - ret.tm_isdst=-1; + ret.tm_isdst=0; }else ms_warning("No date header in SIP MESSAGE, we don't know when it was sent."); content_type= osip_message_get_content_type(ev->request); diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index ffa7ed920..1b64fe429 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -81,23 +81,28 @@ void sal_remove_in_subscribe(Sal *sal, SalOp *op){ sal->in_subscribes=ms_list_remove(sal->in_subscribes,op); } -#ifdef WIN32 +static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; +static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; -static inline char *my_ctime_r(const time_t *t, char *buf){ - strcpy(buf,ctime(t)); - return buf; +static void msg_add_current_date(osip_message_t *msg){ + char tmp[64]={0}; + time_t curtime=time(NULL); + struct tm *ret; +#ifndef WIN32 + struct tm gmt; + ret=gmtime_r(&curtime,&gmt); +#else + ret=gmtime(&curtime); +#endif + /*cannot use strftime because it is locale dependant*/ + snprintf(tmp,sizeof(tmp)-1,"%s, %i %s %i %02i:%02i:%02i GMT", + days[ret->tm_wday],ret->tm_mday,months[ret->tm_mon],1900+ret->tm_year,ret->tm_hour,ret->tm_min,ret->tm_sec); + osip_message_replace_header(msg,"Date",tmp); } -#else -#define my_ctime_r ctime_r -#endif int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg){ osip_message_t *sip=NULL; - char t[26]; - time_t curtime=time(NULL); - - my_ctime_r(&curtime,t); if(op->cid == -1) { @@ -113,7 +118,7 @@ int sal_message_send(SalOp *op, const char *from, const char *to, const char* co sal_op_get_from(op),sal_op_get_route(op)); if (sip!=NULL){ sal_exosip_add_custom_headers(sip,op->base.custom_headers); - osip_message_set_date(sip,t); + msg_add_current_date(sip); osip_message_set_content_type(sip,content_type); if (msg) osip_message_set_body(sip,msg,strlen(msg)); sal_add_other(op->base.root,op,sip); @@ -136,7 +141,7 @@ int sal_message_send(SalOp *op, const char *from, const char *to, const char* co return -1; } sal_exosip_add_custom_headers(sip,op->base.custom_headers); - osip_message_set_date(sip,t); + msg_add_current_date(sip); osip_message_set_content_type(sip,content_type); if (msg) osip_message_set_body(sip,msg,strlen(msg)); eXosip_call_send_request(op->did,sip); From 3bf7dd21dc68302928e90b5c33949e5ea913bec6 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 11 Apr 2013 18:02:53 +0200 Subject: [PATCH 194/281] Fix java impl for LinphoneMessage.GetTime --- java/impl/org/linphone/core/LinphoneChatMessageImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/impl/org/linphone/core/LinphoneChatMessageImpl.java b/java/impl/org/linphone/core/LinphoneChatMessageImpl.java index 2a256f2f5..8162f67bf 100644 --- a/java/impl/org/linphone/core/LinphoneChatMessageImpl.java +++ b/java/impl/org/linphone/core/LinphoneChatMessageImpl.java @@ -67,6 +67,6 @@ public class LinphoneChatMessageImpl implements LinphoneChatMessage { } public long getTime() { - return getTime(nativePtr); + return getTime(nativePtr) * 1000; // Need milliseconds, not seconds } } From 5d9d44d5a6fd0969464a48b5a1954d1f8576a418 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 12 Apr 2013 08:58:57 +0200 Subject: [PATCH 195/281] fix various compilation issue --- gtk/logging.c | 1 + oRTP | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/gtk/logging.c b/gtk/logging.c index 15bef85e0..26027251f 100644 --- a/gtk/logging.c +++ b/gtk/logging.c @@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #endif +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" extern gchar *linphone_logfile; diff --git a/oRTP b/oRTP index 9f51aa254..1172caa98 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 9f51aa254fc5c24834614612036485406a8d06a7 +Subproject commit 1172caa98c7fc70d98bf6e508699a9bead5e9592 From 5ddf9069f0c5f487b65ef5b64dbd19a56066b350 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 12 Apr 2013 10:26:57 +0200 Subject: [PATCH 196/281] Set UTC time in received chat messages. --- coreapi/sal_eXosip2.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 1bbbe36e6..75ee46298 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1771,6 +1771,26 @@ static bool_t comes_from_local_if(osip_message_t *msg){ static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; +static int utc_offset() { + time_t ref = 24 * 60 * 60L; + struct tm * timeptr; + int gmtime_hours; + + /* get the local reference time for Jan 2, 1900 00:00 UTC */ + timeptr = localtime(&ref); + gmtime_hours = timeptr->tm_hour; + + /* if the local time is the "day before" the UTC, subtract 24 hours + from the hours to get the UTC offset */ + if (timeptr->tm_mday < 2) gmtime_hours -= 24; + + return gmtime_hours; +} + +time_t mktime_utc(struct tm *timeptr) { + return mktime(timeptr) + utc_offset() * 3600; +} + static void text_received(Sal *sal, eXosip_event_t *ev){ osip_body_t *body=NULL; char *from=NULL,*msg=NULL; @@ -1842,7 +1862,7 @@ static void text_received(Sal *sal, eXosip_event_t *ev){ salmsg.text=msg; salmsg.url=external_body_size>0 ? unquoted_external_body_url : NULL; salmsg.message_id=message_id; - salmsg.time=date!=NULL ? mktime(&ret) : time(NULL); + salmsg.time=date!=NULL ? mktime_utc(&ret) : time(NULL); sal->callbacks.text_received(op,&salmsg); sal_op_release(op); osip_free(from); From 2bab2ebf2bd51fc22dbde282214c1c63e0a3a7bd Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 16 Apr 2013 13:00:34 +0200 Subject: [PATCH 197/281] fix memory leak in gtk fix indentation (had spaces instead of tabs) update ms2 --- gtk/chat.c | 90 +++++++++++++++++++++++++------------------------- mediastreamer2 | 2 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index 4fa1c917c..58f1a23ce 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -148,12 +148,13 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_insert_with_tags_by_name(buffer,&iter," : ",-1,"bold",me ? "bg":NULL,NULL); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); + ms_free(from_message); g_object_set_data(G_OBJECT(w),"from_message",from_str); } - gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,linphone_chat_message_get_text(msg),-1,"margin",me ? "bg":NULL,NULL); - gtk_text_buffer_get_end_iter(buffer,&iter); - gtk_text_buffer_insert(buffer,&iter,"\n",-1);; + gtk_text_buffer_get_end_iter(buffer,&iter); + gtk_text_buffer_insert(buffer,&iter,"\n",-1); gtk_text_buffer_get_end_iter(buffer,&iter); t=linphone_chat_message_get_time(msg); switch (linphone_chat_message_get_state (msg)){ @@ -260,9 +261,9 @@ static void on_chat_state_changed(LinphoneChatMessage *msg, LinphoneChatMessageS } void linphone_gtk_send_text(){ - GtkWidget *main_window=linphone_gtk_get_main_window(); + GtkWidget *main_window=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); - GtkWidget *w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); + GtkWidget *w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); GtkWidget *entry=linphone_gtk_get_widget(w,"text_entry"); const gchar *entered; LinphoneChatRoom *cr=g_object_get_data(G_OBJECT(w),"cr"); @@ -271,7 +272,7 @@ void linphone_gtk_send_text(){ LinphoneChatMessage *msg; msg=linphone_chat_room_create_message(cr,entered); linphone_chat_room_send_message2(cr,msg,on_chat_state_changed,NULL); - linphone_gtk_push_text(w,linphone_gtk_get_used_identity(), + linphone_gtk_push_text(w,linphone_chat_message_get_from(msg), TRUE,cr,msg,FALSE); gtk_entry_set_text(GTK_ENTRY(entry),""); } @@ -438,58 +439,57 @@ void linphone_gtk_chat_close(GtkWidget *button){ } -void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, - LinphoneChatMessage *msg){ +void linphone_gtk_text_received ( LinphoneCore *lc, LinphoneChatRoom *room, + LinphoneChatMessage *msg ) { GtkWidget *main_window=linphone_gtk_get_main_window(); - GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); - GtkWidget *w; + GtkWidget *friendlist=linphone_gtk_get_widget ( main_window,"contact_list" ); + GtkWidget *w; gboolean send=TRUE; - GtkNotebook *notebook=(GtkNotebook *)linphone_gtk_get_widget(main_window,"viewswitch"); - char *from=linphone_address_as_string(linphone_chat_message_get_from(msg)); - - w=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); - if(w!=NULL){ - char *from_chatview=(char *)g_object_get_data(G_OBJECT(friendlist),"from"); - if(g_strcmp0(from,from_chatview)==0){ + GtkNotebook *notebook= ( GtkNotebook * ) linphone_gtk_get_widget ( main_window,"viewswitch" ); + char *from=linphone_address_as_string ( linphone_chat_message_get_from ( msg ) ); + + w= ( GtkWidget* ) g_object_get_data ( G_OBJECT ( friendlist ),"chatview" ); + if ( w!=NULL ) { + char *from_chatview= ( char * ) g_object_get_data ( G_OBJECT ( friendlist ),"from" ); + if ( g_strcmp0 ( from,from_chatview ) ==0 ) { send=TRUE; } else { - if(!linphone_gtk_friend_list_is_contact(linphone_chat_message_get_from(msg))){ - linphone_gtk_chat_add_contact(linphone_chat_message_get_from(msg)); - } + if ( !linphone_gtk_friend_list_is_contact ( linphone_chat_message_get_from ( msg ) ) ) { + linphone_gtk_chat_add_contact ( linphone_chat_message_get_from ( msg ) ); + } send=FALSE; - } - } else { + } + } else { send=FALSE; - if(!linphone_gtk_friend_list_is_contact(linphone_chat_message_get_from(msg))){ - linphone_gtk_chat_add_contact(linphone_chat_message_get_from(msg)); - } - w=linphone_gtk_init_chatroom(room,linphone_chat_message_get_from(msg)); - g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); - g_object_set_data(G_OBJECT(friendlist),"from",from); - } - get_display_name(linphone_chat_message_get_from(msg)); - - #ifdef HAVE_GTK_OSXs + if ( !linphone_gtk_friend_list_is_contact ( linphone_chat_message_get_from ( msg ) ) ) { + linphone_gtk_chat_add_contact ( linphone_chat_message_get_from ( msg ) ); + } + w=linphone_gtk_init_chatroom ( room,linphone_chat_message_get_from ( msg ) ); + g_object_set_data ( G_OBJECT ( friendlist ),"chatview", ( gpointer ) w ); + g_object_set_data ( G_OBJECT ( friendlist ),"from",from ); + } + +#ifdef HAVE_GTK_OSXs /* Notified when a new message is sent */ - linphone_gtk_status_icon_set_blinking(TRUE); - #else - if(!gtk_window_is_active(GTK_WINDOW(main_window))){ - if(!GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_notified"))){ - linphone_gtk_notify(NULL,linphone_chat_message_get_text(msg)); - g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(TRUE)); + linphone_gtk_status_icon_set_blinking ( TRUE ); +#else + if ( !gtk_window_is_active ( GTK_WINDOW ( main_window ) ) ) { + if ( !GPOINTER_TO_INT ( g_object_get_data ( G_OBJECT ( w ),"is_notified" ) ) ) { + linphone_gtk_notify ( NULL,linphone_chat_message_get_text ( msg ) ); + g_object_set_data ( G_OBJECT ( w ),"is_notified",GINT_TO_POINTER ( TRUE ) ); } else { - g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(FALSE)); + g_object_set_data ( G_OBJECT ( w ),"is_notified",GINT_TO_POINTER ( FALSE ) ); } } - #endif - if(send){ - if(gtk_notebook_get_current_page(notebook)!=gtk_notebook_page_num(notebook,w)){ +#endif + if ( send ) { + if ( gtk_notebook_get_current_page ( notebook ) !=gtk_notebook_page_num ( notebook,w ) ) { linphone_gtk_show_friends(); } else { - linphone_chat_room_mark_as_read(room); + linphone_chat_room_mark_as_read ( room ); } - linphone_gtk_push_text(w,linphone_chat_message_get_from(msg), - FALSE,room,msg,FALSE); + linphone_gtk_push_text ( w,linphone_chat_message_get_from ( msg ), + FALSE,room,msg,FALSE ); } else { linphone_gtk_show_friends(); } diff --git a/mediastreamer2 b/mediastreamer2 index 4f93003c1..25b0496db 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 4f93003c1eade1442fdedd8dee10f18c98ec47c3 +Subproject commit 25b0496dbc62183f195528481fe44c73e0d201e9 From bf492b4278d1c68b2da55c65da173a33aec32ea1 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 17 Apr 2013 15:49:34 +0200 Subject: [PATCH 198/281] fix publish request, whose request uri must identify the resources for which the event is to be published. --- coreapi/sal_eXosip2.c | 8 ++++---- coreapi/sal_eXosip2.h | 2 ++ coreapi/sal_eXosip2_presence.c | 11 +++++++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 75ee46298..e577b6422 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -2317,7 +2317,7 @@ static void register_set_contact(osip_message_t *msg, const char *contact){ osip_uri_uparam_add(ct->url,osip_strdup("line"),line); } -static void sal_register_add_route(osip_message_t *msg, const char *proxy){ +void sal_message_add_route(osip_message_t *msg, const char *proxy){ osip_route_t *route; osip_list_special_free(&msg->routes,(void (*)(void*))osip_route_free); @@ -2364,7 +2364,7 @@ int sal_register(SalOp *h, const char *proxy, const char *from, int expires){ h->rid=eXosip_register_build_initial_register(from,domain,NULL,expires,&msg); if (msg){ if (contact) register_set_contact(msg,contact); - sal_register_add_route(msg,proxy); + sal_message_add_route(msg,proxy); sal_add_register(h->base.root,h); }else{ ms_error("Could not build initial register."); @@ -2374,7 +2374,7 @@ int sal_register(SalOp *h, const char *proxy, const char *from, int expires){ }else{ eXosip_lock(); eXosip_register_build_register(h->rid,expires,&msg); - sal_register_add_route(msg,proxy); + sal_message_add_route(msg,proxy); } if (msg){ eXosip_register_send_register(h->rid,msg); @@ -2412,7 +2412,7 @@ int sal_register_refresh(SalOp *op, int expires){ eXosip_register_build_register(op->rid,expires,&msg); if (msg!=NULL){ if (contact) register_set_contact(msg,contact); - sal_register_add_route(msg,sal_op_get_route(op)); + sal_message_add_route(msg,sal_op_get_route(op)); eXosip_register_send_register(op->rid,msg); }else ms_error("Could not build REGISTER refresh message."); eXosip_unlock(); diff --git a/coreapi/sal_eXosip2.h b/coreapi/sal_eXosip2.h index 68a2d05ef..e00dd64d9 100644 --- a/coreapi/sal_eXosip2.h +++ b/coreapi/sal_eXosip2.h @@ -99,4 +99,6 @@ SalCustomHeader * sal_exosip_get_custom_headers(osip_message_t *msg); void _osip_list_set_empty(osip_list_t *l, void (*freefunc)(void*)); +void sal_message_add_route(osip_message_t *msg, const char *proxy); + #endif diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index 1b64fe429..c81910986 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -637,23 +637,26 @@ int sal_publish(SalOp *op, const char *from, const char *to, SalPresenceStatus p osip_message_t *pub; int i; char buf[1024]; + const char *route=sal_op_get_route(op); mk_presence_body (presence_mode, from, buf, sizeof (buf), presence_style); - i = eXosip_build_publish(&pub,from, to, sal_op_get_route(op), "presence", "300", + i = eXosip_build_publish(&pub,to, from, NULL, "presence", "600", presence_style ? "application/xpidf+xml" : "application/pidf+xml", buf); if (i<0){ ms_warning("Failed to build publish request."); return -1; } - + if (route) + sal_message_add_route(pub,route); + eXosip_lock(); i = eXosip_publish(pub, to); /* should update the sip-if-match parameter from sip-etag from last 200ok of PUBLISH */ eXosip_unlock(); if (i<0){ - ms_message("Failed to send publish request."); - return -1; + ms_message("Failed to send publish request."); + return -1; } sal_add_other(sal_op_get_sal(op),op,pub); return 0; From 846d2c57afa43494aa7e533ca8816d40edeff126 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 19 Apr 2013 15:39:40 +0200 Subject: [PATCH 199/281] wrap DSCP API for java --- coreapi/linphonecore_jni.cc | 24 +++++++++++ .../org/linphone/core/LinphoneCore.java | 40 +++++++++++++++++++ .../org/linphone/core/LinphoneCoreImpl.java | 35 ++++++++++++++++ 3 files changed, 99 insertions(+) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 5046d83bb..b721c6892 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -2143,6 +2143,14 @@ extern "C" jint Java_org_linphone_core_LinphoneCallImpl_getDuration(JNIEnv* env return (jint)linphone_call_get_duration((LinphoneCall *) ptr); } +extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setSipDscp(JNIEnv* env,jobject thiz,jlong ptr, jint dscp){ + linphone_core_set_sip_dscp((LinphoneCore*)ptr,dscp); +} + +extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getSipDscp(JNIEnv* env,jobject thiz,jlong ptr){ + return linphone_core_get_sip_dscp((LinphoneCore*)ptr); +} + extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getSignalingTransportPort(JNIEnv* env,jobject thiz,jlong ptr, jint code) { LCSipTransports tr; linphone_core_get_sip_transports((LinphoneCore *) ptr, &tr); @@ -2447,6 +2455,22 @@ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setVideoPortRange(JNIEnv linphone_core_set_video_port_range((LinphoneCore *)lc, min_port, max_port); } +extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setAudioDscp(JNIEnv* env,jobject thiz,jlong ptr, jint dscp){ + linphone_core_set_audio_dscp((LinphoneCore*)ptr,dscp); +} + +extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getAudioDscp(JNIEnv* env,jobject thiz,jlong ptr){ + return linphone_core_get_audio_dscp((LinphoneCore*)ptr); +} + +extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setVideoDscp(JNIEnv* env,jobject thiz,jlong ptr, jint dscp){ + linphone_core_set_video_dscp((LinphoneCore*)ptr,dscp); +} + +extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getVideoDscp(JNIEnv* env,jobject thiz,jlong ptr){ + return linphone_core_get_video_dscp((LinphoneCore*)ptr); +} + extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setIncomingTimeout(JNIEnv *env, jobject thiz, jlong lc, jint timeout) { linphone_core_set_inc_timeout((LinphoneCore *)lc, timeout); } diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index 144b7dfe2..d76acad9a 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -637,6 +637,20 @@ public interface LinphoneCore { * @return transports used for signaling (TCP, UDP, TLS) */ Transports getSignalingTransportPorts(); + + /** + * Assign a dscp value for the SIP socket. + * DSCP is an IP packet field used to indicate the type of routing service to routers. + * @param dscp + */ + void setSipDscp(int dscp); + + /** + * Get DSCP used for SIP socket. + * @return the DSCP value used for the SIP socket. + */ + int getSipDscp(); + /** * Activates or deactivates the speaker. * @param value @@ -1146,6 +1160,19 @@ public interface LinphoneCore { */ void setAudioPortRange(int minPort, int maxPort); + /** + * Assign a DSCP value to the audio RTP sockets. + * @param dscp the DSCP value. + * DSCP is an IP header field used to indicate a type of service to routers. + */ + void setAudioDscp(int dscp); + + /** + * Return DSCP value used for the audio RTP sockets. + * @return the DSCP value used for the audio RTP sockets. + */ + int getAudioDscp(); + /** * Sets the UDP port used for video streaming. **/ @@ -1156,6 +1183,19 @@ public interface LinphoneCore { */ void setVideoPortRange(int minPort, int maxPort); + /** + * Assign a DSCP value to the video RTP sockets. + * @param dscp the DSCP value. + * DSCP is an IP header field used to indicate a type of service to routers. + */ + void setVideoDscp(int dscp); + + /** + * Return DSCP value used for the video RTP sockets. + * @return the DSCP value used for the video RTP sockets. + */ + int getVideoDscp(); + /** * Set the incoming call timeout in seconds. * If an incoming call isn't answered for this timeout period, it is diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java index 0b4c984d6..f9a7abf39 100644 --- a/java/impl/org/linphone/core/LinphoneCoreImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java @@ -913,4 +913,39 @@ class LinphoneCoreImpl implements LinphoneCore { public PayloadType findPayloadType(String mime) { return findPayloadType(mime, FIND_PAYLOAD_IGNORE_RATE); } + + private native void setSipDscp(long nativePtr, int dscp); + @Override + public void setSipDscp(int dscp) { + setSipDscp(nativePtr,dscp); + } + + private native int getSipDscp(long nativePtr); + @Override + public int getSipDscp() { + return getSipDscp(nativePtr); + } + private native void setAudioDscp(long nativePtr, int dscp); + @Override + public void setAudioDscp(int dscp) { + setAudioDscp(nativePtr, dscp); + } + + private native int getAudioDscp(long nativePtr); + @Override + public int getAudioDscp() { + return getAudioDscp(nativePtr); + } + + private native void setVideoDscp(long nativePtr, int dscp); + @Override + public void setVideoDscp(int dscp) { + setVideoDscp(nativePtr,dscp); + } + + private native int getVideoDscp(long nativePtr); + @Override + public int getVideoDscp() { + return getVideoDscp(nativePtr); + } } From 58e13184e6afbcbb844a26edda067422c0a3ac32 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 19 Apr 2013 15:43:51 +0200 Subject: [PATCH 200/281] fix crash in gtk chat --- gtk/chat.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index 58f1a23ce..b1da70822 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -61,12 +61,17 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { GtkWidget *nb=linphone_gtk_get_widget(main_window,"viewswitch"); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *w=g_object_get_data(G_OBJECT(friendlist),"chatview"); + gchar *from; g_return_if_fail(w!=NULL); gtk_notebook_remove_page(GTK_NOTEBOOK(nb),gtk_notebook_page_num(GTK_NOTEBOOK(nb),w)); linphone_gtk_friend_list_update_chat_picture(); g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); - g_object_set_data(G_OBJECT(w),"from_message",NULL); + from=g_object_get_data(G_OBJECT(w),"from_message"); + if (from){ + g_object_set_data(G_OBJECT(w),"from_message",NULL); + g_free(from); + } g_object_set_data(G_OBJECT(w),"cr",NULL); g_object_set_data(G_OBJECT(friendlist),"from",NULL); gtk_widget_destroy(w); @@ -128,7 +133,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, GtkTextIter iter,begin; int off; char *from_str=linphone_address_as_string_uri_only(from); - char *from_message=(char *)g_object_get_data(G_OBJECT(w),"from_message"); + gchar *from_message=(gchar *)g_object_get_data(G_OBJECT(w),"from_message"); GList *list=g_object_get_data(G_OBJECT(w),"list"); time_t t; char buf[80]; @@ -148,8 +153,8 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_insert_with_tags_by_name(buffer,&iter," : ",-1,"bold",me ? "bg":NULL,NULL); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); - ms_free(from_message); - g_object_set_data(G_OBJECT(w),"from_message",from_str); + g_free(from_message); + g_object_set_data(G_OBJECT(w),"from_message",g_strdup(from_str)); } gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,linphone_chat_message_get_text(msg),-1,"margin",me ? "bg":NULL,NULL); @@ -193,6 +198,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gtk_text_buffer_insert(buffer,&iter,"\n",-1); GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); gtk_text_view_scroll_mark_onscreen(text,mark); + ms_free(from_str); } const LinphoneAddress* linphone_gtk_get_used_identity(){ @@ -292,6 +298,7 @@ void display_history_message(GtkWidget *chat_view,MSList *messages,const Linphon MSList *it; char *from_str; char *with_str; + gchar *tmp; for(it=messages;it!=NULL;it=it->next){ LinphoneChatMessage *msg=(LinphoneChatMessage *)it->data; from_str=linphone_address_as_string_uri_only(linphone_chat_message_get_from(msg)); @@ -301,7 +308,11 @@ void display_history_message(GtkWidget *chat_view,MSList *messages,const Linphon strcmp(from_str,with_str)==0? FALSE : TRUE, linphone_chat_message_get_chat_room(msg),msg,TRUE); } - g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); + tmp=g_object_get_data(G_OBJECT(chat_view),"from_message"); + if (tmp){ + g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); + g_free(tmp); + } ms_free(from_str); ms_free(with_str); linphone_gtk_free_list(messages); @@ -420,7 +431,7 @@ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri, g_object_set_data(G_OBJECT(chat_view),"cr",cr); g_object_set_data(G_OBJECT(linphone_gtk_get_widget(main_window,"contact_list")),"chatview",(gpointer)chat_view); messages=linphone_chat_room_get_history(cr,NB_MSG_HIST); - g_object_set_data(G_OBJECT(chat_view),"from_message",uri_str); + g_object_set_data(G_OBJECT(chat_view),"from_message",g_strdup(uri_str)); display_history_message(chat_view,messages,uri); } ms_free(from_str); From 8b35826ddd1bdbdd88c61c3b76e6f4b1d3b43a39 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 19 Apr 2013 16:52:40 +0200 Subject: [PATCH 201/281] update ms2 for ringstream bugfix --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 25b0496db..9fa2247c2 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 25b0496dbc62183f195528481fe44c73e0d201e9 +Subproject commit 9fa2247c2446d4b06f4a60b72eee65dc591764da From 600115e4cc0d0bddf0b051684b11c2e336df0fa0 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 20 Apr 2013 08:59:24 +0200 Subject: [PATCH 202/281] update ms2 (repair build) --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 9fa2247c2..2720ab1d1 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 9fa2247c2446d4b06f4a60b72eee65dc591764da +Subproject commit 2720ab1d1568ced6f0bf63e454a35f340d8ace64 From 99e73613bd0bf169f8990a6f889ff4dec7663eed Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Sun, 21 Apr 2013 22:06:07 +0200 Subject: [PATCH 203/281] Add aac-eld paylaod type to linphone core. - add two configurations with their respective fmtp config string --- coreapi/linphonecore.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index edf11a407..e967b5737 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1291,6 +1291,8 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta linphone_core_assign_payload_type(lc,&payload_type_silk_wb,-1,NULL); linphone_core_assign_payload_type(lc,&payload_type_silk_swb,-1,NULL); linphone_core_assign_payload_type(lc,&payload_type_g729,18,"annexb=no"); + linphone_core_assign_payload_type(lc,&payload_type_aaceld_nb,-1,"config=F8EE2000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=24; sizeLength=13; streamType=5"); + linphone_core_assign_payload_type(lc,&payload_type_aaceld_wb,-1,"config=F8E82000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=24; sizeLength=13; streamType=5"); linphone_core_handle_static_payloads(lc); ms_init(); From 40511edc2c5c5a7c4bd0fc160d3166f7701153b7 Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Mon, 22 Apr 2013 11:04:48 +0200 Subject: [PATCH 204/281] Rename aac-eld modes to 22k and 44k --- coreapi/linphonecore.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index e967b5737..24515d33d 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1291,8 +1291,8 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta linphone_core_assign_payload_type(lc,&payload_type_silk_wb,-1,NULL); linphone_core_assign_payload_type(lc,&payload_type_silk_swb,-1,NULL); linphone_core_assign_payload_type(lc,&payload_type_g729,18,"annexb=no"); - linphone_core_assign_payload_type(lc,&payload_type_aaceld_nb,-1,"config=F8EE2000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=24; sizeLength=13; streamType=5"); - linphone_core_assign_payload_type(lc,&payload_type_aaceld_wb,-1,"config=F8E82000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=24; sizeLength=13; streamType=5"); + linphone_core_assign_payload_type(lc,&payload_type_aaceld_22k,-1,"config=F8EE2000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=24; sizeLength=13; streamType=5"); + linphone_core_assign_payload_type(lc,&payload_type_aaceld_44k,-1,"config=F8E82000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=24; sizeLength=13; streamType=5"); linphone_core_handle_static_payloads(lc); ms_init(); From 87a6e07ad9eb8ceddd7d451f438d140e92f82e3d Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Mon, 22 Apr 2013 11:11:25 +0200 Subject: [PATCH 205/281] Add oRTP with aac-eld payload changes --- oRTP | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oRTP b/oRTP index 1172caa98..26ee84a1e 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 1172caa98c7fc70d98bf6e508699a9bead5e9592 +Subproject commit 26ee84a1e3053b7b4426033ddc273cc60bf43902 From 12540ce01c9f024266f6f465c972f72a0c2594bb Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Mon, 22 Apr 2013 11:26:57 +0200 Subject: [PATCH 206/281] Typo in oRTP aac-eld payload type name --- oRTP | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oRTP b/oRTP index 26ee84a1e..bd64df514 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 26ee84a1e3053b7b4426033ddc273cc60bf43902 +Subproject commit bd64df5148bdfd4a2ff5153927676fc497118279 From 70b92a72d8838872c97f36f8baad63da85472cf6 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 22 Apr 2013 12:57:44 +0200 Subject: [PATCH 207/281] Save DTMFs settings immediately. --- coreapi/linphonecore.c | 20 ++++++++------------ coreapi/private.h | 2 -- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 24515d33d..a17543d22 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -598,9 +598,6 @@ static void sip_config_read(LinphoneCore *lc) int ipv6; int random_port; - tmp=lp_config_get_int(lc->config,"sip","use_info",0); - linphone_core_set_use_info_for_dtmf(lc,tmp); - if (lp_config_get_int(lc->config,"sip","use_session_timers",0)==1){ sal_use_session_timers(lc->sal,200); } @@ -610,9 +607,6 @@ static void sip_config_read(LinphoneCore *lc) sal_reuse_authorization(lc->sal, lp_config_get_int(lc->config,"sip","reuse_authorization",0)); sal_expire_old_registration_contacts(lc->sal,lp_config_get_int(lc->config,"sip","expire_old_registration_contacts",0)); - tmp=lp_config_get_int(lc->config,"sip","use_rfc2833",1); - linphone_core_set_use_rfc2833_for_dtmf(lc,tmp); - ipv6=lp_config_get_int(lc->config,"sip","use_ipv6",-1); if (ipv6==-1){ ipv6=0; @@ -1725,7 +1719,7 @@ void linphone_core_set_nortp_timeout(LinphoneCore *lc, int nortp_timeout){ **/ bool_t linphone_core_get_use_info_for_dtmf(LinphoneCore *lc) { - return lc->sip_conf.use_info; + return lp_config_get_int(lc->config, "sip", "use_info", 0); } /** @@ -1735,7 +1729,9 @@ bool_t linphone_core_get_use_info_for_dtmf(LinphoneCore *lc) **/ void linphone_core_set_use_info_for_dtmf(LinphoneCore *lc,bool_t use_info) { - lc->sip_conf.use_info=use_info; + if (linphone_core_ready()) { + lp_config_set_int(lc->config, "sip", "use_info", use_info); + } } /** @@ -1745,7 +1741,7 @@ void linphone_core_set_use_info_for_dtmf(LinphoneCore *lc,bool_t use_info) **/ bool_t linphone_core_get_use_rfc2833_for_dtmf(LinphoneCore *lc) { - return lc->sip_conf.use_rfc2833; + return lp_config_get_int(lc->config, "sip", "use_rfc2833", 1); } /** @@ -1755,7 +1751,9 @@ bool_t linphone_core_get_use_rfc2833_for_dtmf(LinphoneCore *lc) **/ void linphone_core_set_use_rfc2833_for_dtmf(LinphoneCore *lc,bool_t use_rfc2833) { - lc->sip_conf.use_rfc2833=use_rfc2833; + if (linphone_core_ready()) { + lp_config_set_int(lc->config, "sip", "use_rfc2833", use_rfc2833); + } } /** @@ -5128,8 +5126,6 @@ void sip_config_uninit(LinphoneCore *lc) lp_config_set_int(lc->config,"sip","inc_timeout",config->inc_timeout); lp_config_set_int(lc->config,"sip","in_call_timeout",config->in_call_timeout); lp_config_set_int(lc->config,"sip","delayed_timeout",config->delayed_timeout); - lp_config_set_int(lc->config,"sip","use_info",config->use_info); - lp_config_set_int(lc->config,"sip","use_rfc2833",config->use_rfc2833); lp_config_set_int(lc->config,"sip","use_ipv6",config->ipv6_enabled); lp_config_set_int(lc->config,"sip","register_only_when_network_is_up",config->register_only_when_network_is_up); lp_config_set_int(lc->config,"sip","register_only_when_upnp_is_ok",config->register_only_when_upnp_is_ok); diff --git a/coreapi/private.h b/coreapi/private.h index 5e265c616..d80607ca9 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -438,8 +438,6 @@ typedef struct sip_config int delayed_timeout; /*timeout after a delayed call is resumed */ unsigned int keepalive_period; /* interval in ms between keep alive messages sent to the proxy server*/ LCSipTransports transports; - bool_t use_info; - bool_t use_rfc2833; /*force RFC2833 to be sent*/ bool_t guess_hostname; bool_t loopback_only; bool_t ipv6_enabled; From f429ce65eb40117f4ebedaeeff54e13d889f7cc4 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 22 Apr 2013 13:11:27 +0200 Subject: [PATCH 208/281] Oops... Forgot the lc parameter. --- coreapi/linphonecore.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index a17543d22..559048c59 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1729,7 +1729,7 @@ bool_t linphone_core_get_use_info_for_dtmf(LinphoneCore *lc) **/ void linphone_core_set_use_info_for_dtmf(LinphoneCore *lc,bool_t use_info) { - if (linphone_core_ready()) { + if (linphone_core_ready(lc)) { lp_config_set_int(lc->config, "sip", "use_info", use_info); } } @@ -1751,7 +1751,7 @@ bool_t linphone_core_get_use_rfc2833_for_dtmf(LinphoneCore *lc) **/ void linphone_core_set_use_rfc2833_for_dtmf(LinphoneCore *lc,bool_t use_rfc2833) { - if (linphone_core_ready()) { + if (linphone_core_ready(lc)) { lp_config_set_int(lc->config, "sip", "use_rfc2833", use_rfc2833); } } From 1408227088dcc118f7b07b08a2170bb6266daf98 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 23 Apr 2013 09:17:36 +0200 Subject: [PATCH 209/281] Improve echo canceller calibrator. - Use the void source filter instead of the file player. - Handle the number of channels. --- coreapi/ec-calibrator.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/coreapi/ec-calibrator.c b/coreapi/ec-calibrator.c index e19559fc4..d724669a4 100644 --- a/coreapi/ec-calibrator.c +++ b/coreapi/ec-calibrator.c @@ -29,6 +29,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. static void ecc_init_filters(EcCalibrator *ecc){ unsigned int rate; + int channels = 1; + int ecc_channels = 1; MSTickerParams params={0}; params.name="Echo calibrator"; params.prio=MS_TICKER_PRIO_HIGH; @@ -37,9 +39,13 @@ static void ecc_init_filters(EcCalibrator *ecc){ ecc->sndread=ms_snd_card_create_reader(ecc->play_card); ms_filter_call_method(ecc->sndread,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ms_filter_call_method(ecc->sndread,MS_FILTER_GET_SAMPLE_RATE,&rate); + ms_filter_call_method(ecc->sndread,MS_FILTER_SET_NCHANNELS,&ecc_channels); + ms_filter_call_method(ecc->sndread,MS_FILTER_GET_NCHANNELS,&channels); ecc->read_resampler=ms_filter_new(MS_RESAMPLE_ID); ms_filter_call_method(ecc->read_resampler,MS_FILTER_SET_SAMPLE_RATE,&rate); ms_filter_call_method(ecc->read_resampler,MS_FILTER_SET_OUTPUT_SAMPLE_RATE,&ecc->rate); + ms_filter_call_method(ecc->read_resampler,MS_FILTER_SET_NCHANNELS,&ecc_channels); + ms_filter_call_method(ecc->read_resampler,MS_FILTER_SET_OUTPUT_NCHANNELS,&channels); ecc->det=ms_filter_new(MS_TONE_DETECTOR_ID); @@ -50,7 +56,7 @@ static void ecc_init_filters(EcCalibrator *ecc){ ms_filter_link(ecc->read_resampler,0,ecc->det,0); ms_filter_link(ecc->det,0,ecc->rec,0); - ecc->play=ms_filter_new(MS_FILE_PLAYER_ID); + ecc->play=ms_filter_new(MS_VOID_SOURCE_ID); ecc->gen=ms_filter_new(MS_DTMF_GEN_ID); ms_filter_call_method(ecc->gen,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ecc->write_resampler=ms_filter_new(MS_RESAMPLE_ID); @@ -58,8 +64,12 @@ static void ecc_init_filters(EcCalibrator *ecc){ ms_filter_call_method(ecc->sndwrite,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ms_filter_call_method(ecc->sndwrite,MS_FILTER_GET_SAMPLE_RATE,&rate); + ms_filter_call_method(ecc->sndwrite,MS_FILTER_SET_NCHANNELS,&ecc_channels); + ms_filter_call_method(ecc->sndwrite,MS_FILTER_GET_NCHANNELS,&channels); ms_filter_call_method(ecc->write_resampler,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ms_filter_call_method(ecc->write_resampler,MS_FILTER_SET_OUTPUT_SAMPLE_RATE,&rate); + ms_filter_call_method(ecc->write_resampler,MS_FILTER_SET_NCHANNELS,&ecc_channels); + ms_filter_call_method(ecc->write_resampler,MS_FILTER_SET_OUTPUT_NCHANNELS,&channels); ms_filter_link(ecc->play,0,ecc->gen,0); ms_filter_link(ecc->gen,0,ecc->write_resampler,0); From e1830ee3077b47d1557a1292e8c8b80cd01fc403 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 23 Apr 2013 10:45:01 +0200 Subject: [PATCH 210/281] Add callbacks for audio (un)initialization in the echo canceller calibrator. --- coreapi/ec-calibrator.c | 19 +++++++++++++++---- coreapi/linphonecore_jni.cc | 2 ++ coreapi/linphonecore_utils.h | 5 ++++- coreapi/private.h | 2 ++ coreapi/test_ecc.c | 2 +- 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/coreapi/ec-calibrator.c b/coreapi/ec-calibrator.c index d724669a4..223fb087d 100644 --- a/coreapi/ec-calibrator.c +++ b/coreapi/ec-calibrator.c @@ -77,10 +77,17 @@ static void ecc_init_filters(EcCalibrator *ecc){ ms_ticker_attach(ecc->ticker,ecc->sndread); ms_ticker_attach(ecc->ticker,ecc->play); - + + if (ecc->audio_init_cb != NULL) { + (*ecc->audio_init_cb)(ecc->cb_data); + } } static void ecc_deinit_filters(EcCalibrator *ecc){ + if (ecc->audio_uninit_cb != NULL) { + (*ecc->audio_uninit_cb)(ecc->cb_data); + } + ms_ticker_detach(ecc->ticker,ecc->sndread); ms_ticker_detach(ecc->ticker,ecc->play); @@ -232,12 +239,15 @@ static void * ecc_thread(void *p){ return NULL; } -EcCalibrator * ec_calibrator_new(MSSndCard *play_card, MSSndCard *capt_card, unsigned int rate, LinphoneEcCalibrationCallback cb, void *cb_data ){ +EcCalibrator * ec_calibrator_new(MSSndCard *play_card, MSSndCard *capt_card, unsigned int rate, LinphoneEcCalibrationCallback cb, + LinphoneEcCalibrationAudioInit audio_init_cb, LinphoneEcCalibrationAudioUninit audio_uninit_cb, void *cb_data){ EcCalibrator *ecc=ms_new0(EcCalibrator,1); ecc->rate=rate; ecc->cb=cb; ecc->cb_data=cb_data; + ecc->audio_init_cb=audio_init_cb; + ecc->audio_uninit_cb=audio_uninit_cb; ecc->capt_card=capt_card; ecc->play_card=play_card; ms_thread_create(&ecc->thread,NULL,ecc_thread,ecc); @@ -253,13 +263,14 @@ void ec_calibrator_destroy(EcCalibrator *ecc){ ms_free(ecc); } -int linphone_core_start_echo_calibration(LinphoneCore *lc, LinphoneEcCalibrationCallback cb, void *cb_data){ +int linphone_core_start_echo_calibration(LinphoneCore *lc, LinphoneEcCalibrationCallback cb, + LinphoneEcCalibrationAudioInit audio_init_cb, LinphoneEcCalibrationAudioUninit audio_uninit_cb, void *cb_data){ if (lc->ecc!=NULL){ ms_error("Echo calibration is still on going !"); return -1; } unsigned int rate = lp_config_get_int(lc->config,"sound","echo_cancellation_rate",8000); - lc->ecc=ec_calibrator_new(lc->sound_conf.play_sndcard,lc->sound_conf.capt_sndcard,rate,cb,cb_data); + lc->ecc=ec_calibrator_new(lc->sound_conf.play_sndcard,lc->sound_conf.capt_sndcard,rate,cb,audio_init_cb,audio_uninit_cb,cb_data); return 0; } diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index b721c6892..02ac62c7a 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -996,6 +996,8 @@ extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_startEchoCalibration(JNI ,jobject data) { return (jint)linphone_core_start_echo_calibration((LinphoneCore*)lc , LinphoneCoreData::ecCalibrationStatus + , NULL + , NULL , data?env->NewGlobalRef(data):NULL); } diff --git a/coreapi/linphonecore_utils.h b/coreapi/linphonecore_utils.h index cc0a6f692..b80992ad1 100644 --- a/coreapi/linphonecore_utils.h +++ b/coreapi/linphonecore_utils.h @@ -64,12 +64,15 @@ typedef enum { typedef void (*LinphoneEcCalibrationCallback)(LinphoneCore *lc, LinphoneEcCalibratorStatus status, int delay_ms, void *data); +typedef void (*LinphoneEcCalibrationAudioInit)(void *data); +typedef void (*LinphoneEcCalibrationAudioUninit)(void *data); /** * * Start an echo calibration of the sound devices, in order to find adequate settings for the echo canceller automatically. **/ -int linphone_core_start_echo_calibration(LinphoneCore *lc, LinphoneEcCalibrationCallback cb, void *cb_data); +int linphone_core_start_echo_calibration(LinphoneCore *lc, LinphoneEcCalibrationCallback cb, + LinphoneEcCalibrationAudioInit audio_init_cb, LinphoneEcCalibrationAudioUninit audio_uninit_cb, void *cb_data); /** * @ingroup IOS * Special function to warm up dtmf feeback stream. #linphone_core_stop_dtmf_stream must() be called before entering FG mode diff --git a/coreapi/private.h b/coreapi/private.h index d80607ca9..b5312bd60 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -662,6 +662,8 @@ struct _EcCalibrator{ MSTicker *ticker; LinphoneEcCalibrationCallback cb; void *cb_data; + LinphoneEcCalibrationAudioInit audio_init_cb; + LinphoneEcCalibrationAudioUninit audio_uninit_cb; int64_t acc; int delay; unsigned int rate; diff --git a/coreapi/test_ecc.c b/coreapi/test_ecc.c index 43ae0dcb2..38ba72765 100644 --- a/coreapi/test_ecc.c +++ b/coreapi/test_ecc.c @@ -45,7 +45,7 @@ int main(int argc, char *argv[]){ linphone_core_enable_logs(NULL); - linphone_core_start_echo_calibration(lc,calibration_finished,NULL); + linphone_core_start_echo_calibration(lc,calibration_finished,NULL,NULL,NULL); while(count++<1000){ linphone_core_iterate(lc); From 6fcf76e405a695f86a446f430903682f42155f43 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 22 Apr 2013 23:11:10 +0200 Subject: [PATCH 211/281] update ms2 and cleanup dead function --- coreapi/linphonecore.c | 20 -------------------- mediastreamer2 | 2 +- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 559048c59..bb2b4a83c 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -4927,26 +4927,6 @@ void linphone_core_play_dtmf(LinphoneCore *lc, char dtmf, int duration_ms){ else ms_filter_call_method(f, MS_DTMF_GEN_START, &dtmf); } -/** - * @ingroup media_parameters - * Plays a repeated tone to the local user until next further call to #linphone_core_stop_dtmf() - * @param lc #LinphoneCore -**/ -void linphone_core_play_tone(LinphoneCore *lc){ - MSFilter *f=get_dtmf_gen(lc); - MSDtmfGenCustomTone def; - if (f==NULL){ - ms_error("No dtmf generator at this time !"); - return; - } - memset(&def,0,sizeof(def)); - def.duration=300; - def.frequencies[0]=500; - def.amplitude=1; - def.interval=2000; - ms_filter_call_method(f, MS_DTMF_GEN_PLAY_CUSTOM,&def); -} - void linphone_core_play_named_tone(LinphoneCore *lc, LinphoneToneID toneid){ if (linphone_core_tone_indications_enabled(lc)){ MSFilter *f=get_dtmf_gen(lc); diff --git a/mediastreamer2 b/mediastreamer2 index 2720ab1d1..23b802c46 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 2720ab1d1568ced6f0bf63e454a35f340d8ace64 +Subproject commit 23b802c4631fdf909a218a0dd0a77c6cf6d4d5a9 From 6bf49e2a67c6bd11a573eae46d3d42a13c652388 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Tue, 23 Apr 2013 11:39:03 +0200 Subject: [PATCH 212/281] Change the README for linphone desktop (linux) --- README | 56 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/README b/README index 658f07ae0..db78b72e5 100644 --- a/README +++ b/README @@ -2,24 +2,64 @@ This is Linphone, a free (GPL) video softphone based on the SIP protocol. ******************Building linphone *********************************** + +- Install build time dependencies + - libtool + - intltool + - you need at least: - - libosip2>=3.0.3 - - libeXosip2>=3.0.3 - - speex>=1.2.0 (including libspeexdsp part) - - libreadline (optional: for convenient command line in linphonec) - + gsm codec (gsm source package or libgsm-dev or gsm-devel) (optional) - + if you want to gtk/glade interface: - - gtk>=2.16.0 + - libosip2>=3.0.3 + - libeXosip2>=3.0.3 + - speex>=1.2.0 (including libspeexdsp part) + + + if you want the gtk/glade interface: + - libgtk >=2.16.0 + if you want video support: - SDL>=1.2.10 - libavcodec (ffmpeg) - libswscale (part of ffmpeg too) for better scaling performance + - libxv (x11 video extension) + - ligl1-mesa (OpenGL API -- GLX development files) + - libglew (OpenGL Extension Wrangler library) + - libv4l (Video for linux) + - libx11 (x11) - theora (optional) - + if you want uPnP support: + + + gsm codec (gsm source package or libgsm-dev or gsm-devel) (optional) + + libreadline (optional: for convenient command line in linphonec) + + libsoup (optional: for wizard - account creation assistant) + + libsqlite3 (optional : for a local history of messages) + + if you want uPnP support (optional): - libupnp (version 1.6 branch (not patched with 18-url-upnpstrings.patch)) + + + Install srtp (optional) for call encryption : + $ git clone git://git.linphone.org/srtp.git + $ cd srtp && autoconf && ./configure && make + $ sudo make install + + + Install zrtpcpp (optional), for unbreakable call encryption + $ sudo apt-get install cmake libssl-dev + $ git clone git://git.linphone.org/zrtpcpp.git + $ cd zrtpcpp && cmake -Denable-ccrtp=false . && make + $ sudo make install with their corresponding -dev or -devel package if you don't use source packages. +- Compile linphone + + $ ./autogen.sh + $ ./configure + $ sudo make install + $ sudo ldconfig + +- Command line for Ubuntu && Debian + + $ sudo apt-get install libtool intltool libgtk2.0-dev libosip2-dev libexosip2-dev libspeexdsp-dev libavcodec-dev libswscale-dev libx11-dev libvx-dev ligl1-mesa-dev libglew-dev libv4l-dev + + + for optional library + $ sudo apt-get install libreadline-dev liggsm1-dev libtheora-dev libsoup2.4-dev libsqlit3-dev libupnp6-dev + + For windows compilation see README.mingw. For macOS X, see README.macos From adb9fa635e81c5e0521b4f0aa69b377454c6ad5d Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Tue, 23 Apr 2013 12:38:58 +0200 Subject: [PATCH 213/281] update chat state message changed --- gtk/chat.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index b1da70822..2cba0754f 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -62,6 +62,7 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *w=g_object_get_data(G_OBJECT(friendlist),"chatview"); gchar *from; + GHashTable *table=g_object_get_data(G_OBJECT(w),"table"); g_return_if_fail(w!=NULL); gtk_notebook_remove_page(GTK_NOTEBOOK(nb),gtk_notebook_page_num(GTK_NOTEBOOK(nb),w)); @@ -72,6 +73,7 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { g_object_set_data(G_OBJECT(w),"from_message",NULL); g_free(from); } + g_hash_table_destroy(table); g_object_set_data(G_OBJECT(w),"cr",NULL); g_object_set_data(G_OBJECT(friendlist),"from",NULL); gtk_widget_destroy(w); @@ -134,7 +136,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, int off; char *from_str=linphone_address_as_string_uri_only(from); gchar *from_message=(gchar *)g_object_get_data(G_OBJECT(w),"from_message"); - GList *list=g_object_get_data(G_OBJECT(w),"list"); + GHashTable *table=(GHashTable*)g_object_get_data(G_OBJECT(w),"table"); time_t t; char buf[80]; time_t tnow; @@ -165,10 +167,10 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, switch (linphone_chat_message_get_state (msg)){ case LinphoneChatMessageStateInProgress: { - list=g_list_append(list,GINT_TO_POINTER(gtk_text_iter_get_line(&iter))); + g_hash_table_insert(table,(gpointer)msg,GINT_TO_POINTER(gtk_text_iter_get_line(&iter))); gtk_text_buffer_insert_with_tags_by_name(buffer,&iter,"Sending .. ",-1, "right","small","italic","font_grey","bg",NULL); - g_object_set_data(G_OBJECT(w),"list",list); + g_object_set_data(G_OBJECT(w),"table",table); break; } case LinphoneChatMessageStateDelivered: @@ -213,7 +215,7 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag GtkWidget *main_window=linphone_gtk_get_main_window(); GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); GtkWidget *page=(GtkWidget*)g_object_get_data(G_OBJECT(friendlist),"chatview"); - GList *list=g_object_get_data(G_OBJECT(page),"list"); + GHashTable *table=(GHashTable*)g_object_get_data(G_OBJECT(page),"table"); if(page!=NULL){ GtkTextView *text=GTK_TEXT_VIEW(linphone_gtk_get_widget(page,"textview")); @@ -222,21 +224,20 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag GtkTextIter end; GtkTextIter start; gchar *result; + gint line; + line=GPOINTER_TO_INT(g_hash_table_lookup(table,msg)); - gtk_text_buffer_get_iter_at_line(b,&iter, - GPOINTER_TO_INT(g_list_nth_data(list,0))); + gtk_text_buffer_get_iter_at_line(b,&iter,line); if(gtk_text_iter_get_chars_in_line(&iter) >0) { - gtk_text_buffer_get_iter_at_line_offset(b,&start, - GPOINTER_TO_INT(g_list_nth_data(list,0)), - gtk_text_iter_get_chars_in_line(&iter)-1); + gtk_text_buffer_get_iter_at_line_offset(b,&start,line, + gtk_text_iter_get_chars_in_line(&iter)-1); }else{ - gtk_text_buffer_get_iter_at_line_offset(b,&start, - GPOINTER_TO_INT(g_list_nth_data(list,0)),0); + gtk_text_buffer_get_iter_at_line_offset(b,&start,line,0); } - gtk_text_buffer_get_iter_at_line_offset(b,&end, - GPOINTER_TO_INT(g_list_nth_data(list,0)),0); + gtk_text_buffer_get_iter_at_line_offset(b,&end,line,0); gtk_text_buffer_delete(b,&start,&end); - gtk_text_buffer_get_iter_at_line(b,&iter,GPOINTER_TO_INT(g_list_nth_data(list,0))); + gtk_text_buffer_get_iter_at_line(b,&iter,line); + switch (state) { case LinphoneChatMessageStateInProgress: result="Sending "; @@ -251,14 +252,14 @@ void update_chat_state_message(LinphoneChatMessageState state,LinphoneChatMessag break; } case LinphoneChatMessageStateNotDelivered: - result="Error "; + result="Message not sent"; break; default : result="Sending .."; } gtk_text_buffer_insert_with_tags_by_name(b,&iter,result,-1, "right","small","italic","font_grey","bg",NULL); - list=g_list_remove(list,g_list_nth_data(list,0)); - g_object_set_data(G_OBJECT(page),"list",list); + g_hash_table_remove(table,msg); + g_object_set_data(G_OBJECT(page),"table",table); } } @@ -320,7 +321,6 @@ void display_history_message(GtkWidget *chat_view,MSList *messages,const Linphon } void linphone_gtk_chat_add_contact(const LinphoneAddress *addr){ - //LinphoneAddress *addr=(LinphoneAddress *)data; LinphoneFriend *lf=NULL; char *uri=linphone_address_as_string(addr); lf=linphone_friend_new_with_addr(uri); @@ -352,8 +352,8 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres int idx; GtkWidget *button; GtkWidget *entry; - GList *list=NULL; MSList *messages; + GHashTable *table; char *with_str; color.red = 32512; @@ -372,9 +372,10 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres idx = gtk_notebook_page_num(notebook, chat_view); gtk_notebook_set_current_page(notebook, idx); gtk_widget_show(chat_view); + table=g_hash_table_new_full(g_direct_hash,g_direct_equal,NULL,NULL); g_object_set_data(G_OBJECT(chat_view),"cr",cr); g_object_set_data(G_OBJECT(chat_view),"from_message",NULL); - g_object_set_data(G_OBJECT(chat_view),"list",list); + g_object_set_data(G_OBJECT(chat_view),"table",table); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), "right","justification", GTK_JUSTIFY_RIGHT,NULL); gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), From cf2c2337e334c4de95d3fca4732e996c9e2d0e3a Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 24 Apr 2013 11:57:52 +0200 Subject: [PATCH 214/281] link to libxml2 statically (shared version not working with android-ndk-r8e) --- build/android/common.mk | 4 +++- build/android/lpc2xml.mk | 1 - build/android/xml2lpc.mk | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/android/common.mk b/build/android/common.mk index 584649735..d0bf70cad 100644 --- a/build/android/common.mk +++ b/build/android/common.mk @@ -95,10 +95,12 @@ LOCAL_STATIC_LIBRARIES := \ libeXosip2 \ libosip2 \ libgsm + ifeq ($(BUILD_REMOTE_PROVISIONING),1) LOCAL_STATIC_LIBRARIES += \ libxml2lpc \ - liblpc2xml + liblpc2xml \ + liblpxml2 endif ifeq ($(BUILD_TUNNEL),1) diff --git a/build/android/lpc2xml.mk b/build/android/lpc2xml.mk index 91038adce..d93be9b79 100644 --- a/build/android/lpc2xml.mk +++ b/build/android/lpc2xml.mk @@ -39,7 +39,6 @@ LOCAL_C_INCLUDES = \ $(LOCAL_PATH)/../../externals/build/libxml2 \ LOCAL_SHARED_LIBRARIES = \ - libxml2 # liblinphonenoneon \ # liblinphone \ diff --git a/build/android/xml2lpc.mk b/build/android/xml2lpc.mk index e89ab383b..55e4a03a0 100644 --- a/build/android/xml2lpc.mk +++ b/build/android/xml2lpc.mk @@ -39,7 +39,6 @@ LOCAL_C_INCLUDES = \ $(LOCAL_PATH)/../../externals/build/libxml2 \ LOCAL_SHARED_LIBRARIES = \ - libxml2 # liblinphonenoneon \ # liblinphone \ From a3f10ccd2f494b834eb4f8dfc48cb3d1593f5dfd Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 25 Apr 2013 10:36:18 +0200 Subject: [PATCH 215/281] add special case to compute aac network birate --- coreapi/misc.c | 11 ++++++++++- mediastreamer2 | 2 +- oRTP | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/coreapi/misc.c b/coreapi/misc.c index 35a58e200..5d4c0ebcc 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -234,12 +234,21 @@ static int get_codec_bitrate(LinphoneCore *lc, const PayloadType *pt){ return pt->normal_bitrate; } +/* + *((codec-birate*ptime/8) + RTP header + UDP header + IP header)*8/ptime; + *ptime=1/npacket + */ static double get_audio_payload_bandwidth(LinphoneCore *lc, const PayloadType *pt){ double npacket=50; double packet_size; int bitrate; + if (strcmp(payload_type_get_mime(&payload_type_aaceld_44k), payload_type_get_mime(pt))==0) { + /*special case of aac 44K because ptime= 10ms*/ + npacket=100; + } + bitrate=get_codec_bitrate(lc,pt); - packet_size= (((double)bitrate)/(50*8))+UDP_HDR_SZ+RTP_HDR_SZ+IP4_HDR_SZ; + packet_size= (((double)bitrate)/(npacket*8))+UDP_HDR_SZ+RTP_HDR_SZ+IP4_HDR_SZ; return packet_size*8.0*npacket; } diff --git a/mediastreamer2 b/mediastreamer2 index 07824fcf3..23b802c46 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 07824fcf3879d265c59beaf970d833b5859f3691 +Subproject commit 23b802c4631fdf909a218a0dd0a77c6cf6d4d5a9 diff --git a/oRTP b/oRTP index 20b527144..bd64df514 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 20b527144f9850dd9065d96db7a20244e8a8b227 +Subproject commit bd64df5148bdfd4a2ff5153927676fc497118279 From beb437ef55b7f1bc6c5fcd408bb53a67453cdb00 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 25 Apr 2013 10:54:29 +0200 Subject: [PATCH 216/281] Update ms2 submodule. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 23b802c46..c3e5bad58 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 23b802c4631fdf909a218a0dd0a77c6cf6d4d5a9 +Subproject commit c3e5bad583aad848e1e0d5391092311a31f3ea5a From 4b18b115a4377abc3ac9e5b898f004ca3ac7c2c6 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 25 Apr 2013 11:17:11 +0200 Subject: [PATCH 217/281] Increment tries in loop that have a maximum number of tries. --- coreapi/sal_eXosip2.c | 1 + 1 file changed, 1 insertion(+) diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index e577b6422..222e7c329 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -2400,6 +2400,7 @@ int sal_register_refresh(SalOp *op, int expires){ * the exosip lock in a non blocking way, and give up if it takes too long*/ while (eXosip_trylock()!=0){ ms_usleep(100000); + tries++; if (tries>30) {/*after 3 seconds, give up*/ ms_warning("Could not obtain exosip lock in a reasonable time, giving up."); return -1; From 5f109bfb55224b69dd598d95c2c0dd47fa87b960 Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Thu, 25 Apr 2013 17:00:31 +0200 Subject: [PATCH 218/281] Aac-eld add missing header according to RFC3640 3.3.6 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index c3e5bad58..bec2520cb 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit c3e5bad583aad848e1e0d5391092311a31f3ea5a +Subproject commit bec2520cbb80daf9420bf71c05e25394e2b6024d From a0a70a59dfedfe22ed3fae3df88a6363bd8596e0 Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Fri, 26 Apr 2013 01:12:51 +0200 Subject: [PATCH 219/281] aac-eld support multiframe per packet decoding --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index bec2520cb..3acaa7372 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit bec2520cbb80daf9420bf71c05e25394e2b6024d +Subproject commit 3acaa7372423ffb0d18923e9e41e1076cec51905 From dd0bb74c0a88ed4ba4679033c4fda9cfead1067d Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Fri, 26 Apr 2013 10:47:04 +0200 Subject: [PATCH 220/281] Fix UI feedbacks : - updates pixmaps - contact list resizable - property.ui modified - call stats remove when a call ends - update hebrew translation file --- README | 2 +- gtk/about.ui | 1 + gtk/incall_view.c | 3 +- gtk/main.ui | 76 +++++++--- gtk/parameters.ui | 252 +++++++++++++++++--------------- gtk/propertybox.c | 27 +++- pixmaps/contact_unstarred.png | Bin 3243 -> 2894 bytes pixmaps/startcall-small.png | Bin 3869 -> 3726 bytes po/cs.po | 50 +++---- po/de.po | 50 +++---- po/es.po | 50 +++---- po/fr.po | 207 +++++++++++++------------- po/he.po | 266 +++++++++++++++------------------- po/hu.po | 50 +++---- po/it.po | 50 +++---- po/ja.po | 50 +++---- po/nb_NO.po | 50 +++---- po/nl.po | 50 +++---- po/pl.po | 50 +++---- po/pt_BR.po | 50 +++---- po/ru.po | 50 +++---- po/sr.po | 50 +++---- po/sv.po | 50 +++---- po/zh_CN.po | 50 +++---- po/zh_TW.po | 50 +++---- 25 files changed, 807 insertions(+), 777 deletions(-) diff --git a/README b/README index db78b72e5..1a66f4a27 100644 --- a/README +++ b/README @@ -49,7 +49,7 @@ with their corresponding -dev or -devel package if you don't use source packages $ ./autogen.sh $ ./configure - $ sudo make install + $ make && sudo make install $ sudo ldconfig - Command line for Ubuntu && Debian diff --git a/gtk/about.ui b/gtk/about.ui index 1d79dbf7e..38fc2e796 100644 --- a/gtk/about.ui +++ b/gtk/about.ui @@ -30,6 +30,7 @@ pt_BR: Rafael Caesar Lenzi <rc_lenzi@yahoo.com.br> pl: Robert Nasiadek <darkone@darkone.pl> cs: Petr Pisar <petr.pisar@atlas.cz> hu: anonymous +he: Eli Zaretskii <eliz@gnu.org> Icons by kerosine.fr diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 44b35c03c..01e3b3cd9 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -758,10 +758,11 @@ void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_m gtk_widget_hide(linphone_gtk_get_widget(callview,"record_hbox")); gtk_widget_hide(linphone_gtk_get_widget(callview,"buttons_panel")); gtk_widget_hide(linphone_gtk_get_widget(callview,"incall_audioview")); + gtk_widget_hide(linphone_gtk_get_widget(callview,"quality_indicator")); linphone_gtk_enable_mute_button( GTK_BUTTON(linphone_gtk_get_widget(callview,"incall_mute")),FALSE); linphone_gtk_enable_hold_button(call,FALSE,TRUE); - + if (taskid!=0) g_source_remove(taskid); g_timeout_add_seconds(2,(GSourceFunc)in_call_view_terminated,call); if (in_conf) diff --git a/gtk/main.ui b/gtk/main.ui index 347a402ea..591b042ae 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -7,6 +7,16 @@ False gtk-add + + True + False + gtk-add + + + True + False + gtk-add + False @@ -701,6 +711,16 @@ False gtk-edit + + True + False + gtk-edit + + + True + False + gtk-edit + True False @@ -751,11 +771,21 @@ False gtk-select-color + + True + False + gtk-add + True False gtk-refresh + + True + False + gtk-add + True False @@ -1088,9 +1118,9 @@ - + True - False + True True @@ -1144,16 +1174,14 @@ True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True True True True - Add immediate False - add_image + add_image2 1 @@ -1168,9 +1196,8 @@ True True True - Edit False - edit_image + edit_image2 @@ -1185,7 +1212,7 @@ True True False - remove_image + remove_image2 @@ -1203,10 +1230,8 @@ - False - False - 6 - 0 + False + True @@ -1353,7 +1378,7 @@ True True False - image16 + image20 @@ -1467,10 +1492,8 @@ - True - True - 6 - 1 + True + True @@ -1529,13 +1552,6 @@ False none - - - True - False - gtk-refresh - - True @@ -1880,4 +1896,16 @@ Delete gtk-remove + + True + False + Delete + gtk-remove + + + True + False + Delete + gtk-remove + diff --git a/gtk/parameters.ui b/gtk/parameters.ui index e4a6430fa..b8063792f 100644 --- a/gtk/parameters.ui +++ b/gtk/parameters.ui @@ -639,53 +639,115 @@ 0 none - + True False - - Direct connection to the Internet - True - True - False - False - True - True - - - - False - False - 0 - - - - + True False - - Behind NAT / Firewall (specify gateway IP below) + + Direct connection to the Internet True True False False True True + + + + False + False + 0 + + + + + Behind NAT / Firewall (specify gateway IP ) + True + True + False + False + True no_nat True True - 0 + 1 + + + Behind NAT / Firewall (use STUN to resolve) + True + True + False + False + True + no_nat + + + + True + True + 2 + + + + + Behind NAT / Firewall (use ICE) + True + True + False + False + True + no_nat + + + + True + True + 3 + + + + + Behind NAT / Firewall (use uPnP) + True + True + False + False + True + no_nat + + + + True + True + 4 + + + + + True + True + 0 + + + + + True + False True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True True @@ -705,6 +767,8 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + True False False True @@ -720,7 +784,53 @@ True - True + False + 0 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Stun server: + right + + + True + True + 0 + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + True + False + False + True + True + + + + True + True + 1 + + + + + True + False 1 @@ -731,102 +841,6 @@ 1 - - - Behind NAT / Firewall (use STUN to resolve) - True - True - False - False - True - no_nat - - - - True - True - 2 - - - - - Behind NAT / Firewall (use ICE) - True - True - False - False - True - no_nat - - - - True - True - 3 - - - - - Behind NAT / Firewall (use uPnP) - False - True - True - False - True - no_nat - - - - True - True - 4 - - - - - True - False - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - False - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Stun server: - right - - - True - True - 0 - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - True - False - False - True - True - - - - True - True - 1 - - - - - True - True - 4 - - diff --git a/gtk/propertybox.c b/gtk/propertybox.c index 1c189e0b8..f30b55d05 100644 --- a/gtk/propertybox.c +++ b/gtk/propertybox.c @@ -131,6 +131,13 @@ void linphone_gtk_update_my_port(GtkWidget *w){ linphone_core_set_sip_transports(lc,&tr); } +void linphone_gtk_set_propety_entry(GtkWidget *w, gboolean stunServer, gboolean ip){ + GtkWidget *stun_entry=linphone_gtk_get_widget(gtk_widget_get_toplevel(w),"stun_server"); + GtkWidget *ip_entry=linphone_gtk_get_widget(gtk_widget_get_toplevel(w),"nat_address"); + gtk_widget_set_sensitive(stun_entry,stunServer); + gtk_widget_set_sensitive(ip_entry,ip); +} + void linphone_gtk_stun_server_changed(GtkWidget *w){ const gchar *addr=gtk_entry_get_text(GTK_ENTRY(w)); linphone_core_set_stun_server(linphone_gtk_get_core(),addr); @@ -217,28 +224,38 @@ void linphone_gtk_max_video_port_changed(GtkWidget *w){ } void linphone_gtk_no_firewall_toggled(GtkWidget *w){ - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))){ + linphone_gtk_set_propety_entry(w,FALSE,FALSE); linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyNoFirewall); + } } void linphone_gtk_use_nat_address_toggled(GtkWidget *w){ - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))){ + linphone_gtk_set_propety_entry(w,FALSE,TRUE); linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseNatAddress); + } } void linphone_gtk_use_stun_toggled(GtkWidget *w){ - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))){ + linphone_gtk_set_propety_entry(w,TRUE,FALSE); linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseStun); + } } void linphone_gtk_use_ice_toggled(GtkWidget *w){ - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))){ + linphone_gtk_set_propety_entry(w,TRUE,FALSE); 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))) + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))){ + linphone_gtk_set_propety_entry(w,FALSE,FALSE); linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseUpnp); + } } void linphone_gtk_mtu_changed(GtkWidget *w){ diff --git a/pixmaps/contact_unstarred.png b/pixmaps/contact_unstarred.png index ad041095b4696747d24dbc5d4392a74efb589bd1..38fdbbb7740c1712054214af3d63427b1b7201a7 100644 GIT binary patch delta 2861 zcmV+|3)1wf8O|1vBo78+OGiWi000000Qp0^e~~~Qf87Ka47tXjq#>wDYImCUg4&JWa%ekFB};FHBlL zt3;8qY16d+9*k{A_nLiN=)|Vm7U1wktS|KKwk|uM;;(=>0-H9l$!eqWOI>r%pE4W! zf6?0(fQ{X;Zr8W0Z(IP#0Gt7F9>h7MwYSjL{UDrM(ecVN)OFhdy!->ovs=-h@46o$ z{Qyi3Oqr$!I13=aCqo$6`6mW!w%>LDMtSS{U4ID)rPjy}#1V|igH0A>vheX~bPar# z2-rM$;KNDg4+($>;O$)lkFoeM5ZR`&e*>F5*yLb13-MQATrax%@280>HrzGX zaTd%uu*rf=79ly0_U;Fe&G)yxvj672a8m%UeTVq)M!v6W&7=8j$5u!f1Cdc8f1?Da z;7Hlzlubs7GfETz8bf6Y8+QMVCF}Mc+)tf16}-RJdEjZHLmP0HG3J5xt}Sl!!_Qe} zfrKe#b^uur8IbJ;Nev-+7b+g22{bfFL2&u|F?Mdh4jub@f$Dpjq(}FBMa#Do;NbVE z!-2N}*w()C9$vTe8?LSAK}aY`ZY66u8g4Cf>C#ZwXZbR@> z7(4g8TpIj=D$-G(`V(OT&hOi&@}U5{_8sCl!X{&BC)JW*c zQlADQ2{AOpP#Cc5gK>RG<57%X_zA|}|G5NTzpP$=wf70VxGaEI_fwA=bFXpj8@mU7 zi+a|5f?aN%5)mYnLBum6e?bmRuDSYbX8_Q;XWI)%9g@5aRSyXbh)jE;1t4+jc{~G1 z+yN8y6C;bMD@QPK@mFa)HPjH1V^foO`%_=la2>#_2gp*x>@k_{t^Id>+H|ho3o;#0 zscGwX^OlzacC~>A$^E20k5GV_Ppprnf(X(z4DMNf2!B?PC zK?r4tFB1`iO$IjVe}&83!S(Vbeec-6cnS6A_WqGp?A2y~RQ9Ff3{e6T` zf%rN^5|BnPt`lrmz_>0Ly8^~`fo&&@Er3lY*mi)p4a|9v$$_YWAb_d>Do{I6J?RcXV9pgf=`Poq2B6iW?K%-Ic;4*CIjY{XUHMf^?MM_p)~TNR`}FG zlmePIy&-jKUSp`#0I9b;Q-g#W0g6n16EbbvU~CUfjh)2E>HiH1dHsPuNRM8Z#DfRO zla z3ZekOPXmx@0@XSoaZ|j;%`&SVCc1+%ZFfUMg2~ZAEnPgJqIx+b{@{aO*6~Hl=->e| z6IE<7*4}5LY`%N#4%^YQ1tMkmd*%Do&!Alj8YuK` zL}Ardo9(<4;>QuvVW=;)8n#HANgaX60%VZu{5V2jl*eBLK>#QKPYMrc0@4)37B;g6 z#`eLde-%`&yorfRC%jMU4Tzpd6odPo(B!6Di9^p(hCMceXoqpxT=&}TuCV$(7~{~W zzS-K?qM02TWRNR73?CTP;?Jf%KneliK@eo}TVSKrsFvQs#D&*7co^4(%V%Hm3Oe@C6F5Fw{Bq`95@5MM20)+t zb0k6Z_}KYlo^3Zms6u=dAyg533BebkQiJ*`RBAA;2l3P?#8Z><%X4yKIi6ok3*Vq{ znq@qFf9M#F*Gr@DjS2uepEauJEGhM)Jnq;!N_0z0~)i&f8j-7 z7KPwtipM;nXM^w`KZR0AYH<=zQk1&`*0zI<1DgoOwUM<2vYCD=jhyqBMs;w`SaZk6 zav^vL@$g}g9YlvBl#v%zNi$=G(XCPQqqWNbTJrXL}xA*q$+t50Kip4F#i%)P8C zM2o=Ctl!aG5#RkG&Q-@RfYiWde|o?s2W#@MwjDOJ8pYu=VPX=e$7tNha=2$NNFt~7F1ZL|u;09}*V z-}_Hgt2HTB#)sfsHyPVOYzs6x^oIV=FZ`(miUH=CZy_B^0_YO&WdV>Gd*zLE@Pl`c z1a<{-u7}E3hN#}~<-gmH;tkBVln$t>F6IH9BYN)O+IlXtpcH^S^-mZnPt{77hh7sX z;r){@`4?VJj?VqwJmcw{fB6>j{I%Wa5_`d-iMv29;PFqQ?av-}pEOKvWL!^v{_E+9 zS)yf*=(*3944>(ab*7zOMk|2@D#n7l_3mA;pM400Z~Y@C=6F#TS@k93es;Tk&3RxM z9q4@3f|u9;7b^yGBMCd-Ibq%d%`#i*g=+Rf;$WD--_dcLsofFHF1i z9^Xk01HJ!()*1IG<28JI>*LgV&I4?HiqcSKY4h}3RjIHW&IKq3yD(|yO>ATM>^Tn* z3Ewhl#wQhAbQCWCAgkn}Vs6W`try;E0J`J(M=5sh0)MO^X2QMg@BLh?9KP90t3Z(N1NI^b-Er)&RKxX)A6x%>t!k9Pk}_odWbz?m2|B9L&c$=z1lwe(+O7k z?sFD^mHyn+x%VZb;z5AaGvHWAoM7U3P%gao-DJ~37}GF)(^{H+&H=pgB(@G?Da<|q``=Ni8&fX%R1B;>ea-C0>Cz~*-q?1sRUU0 zOv-;C3ihCJ$~B6BrMuRXcMbs%0sL2uQ?51=9S4!_BGMkQ0jmU9#YM62OLVMDnHDs* zy`TH@xaOPz*t{0kHBVbyue~NXJG711Y#`EcVt>yNCqV3j*k4ZUt+1v2U2U^&O)71^ zIt>2X23SE%$~-jX;yV&H>IbpzBGMa)O`gar6Z>F}gO%US%I~tJ{VP*Ve+WO(*0yO4 zuKle7Y+FTU^K`zyvHhx6ziuYP9tV-yN2KBeW5FI+#lb2D;uwfLzy<&5WbkOmW%nmZ zn}2Vym2ipEhW^!y5^bpOuy`FzLfg_XIB!bAAoc~tQ?UZdHQiM`yl0k z$OPr!wY{n4g?9R-cTG0h`_+~wyr(v=rfI)c_Pv`InwOuT=>~i&fZI|NX2+&pa#t$Z zybxkDaFSa|WbP%>1H=YI8l)xwE`*f!!hg9EoD^XtBq!k_IP;+PXU(FDsT zCnJaQPoi@4i0#0SJ3C$U8v)q1icH{PiPCf@>$+L37cN#4I+hqOaXy^nAvOyFKx`U_ z^Z=2;Fn|H;762u<@?KaQ!bu3R!7zvo{=!M|>!h07m1ze^BX@Koj=ZrxpF6SB0)Mnd zoP2BHQn%;V0(j-S)WV8yC&KNi=J$9l=YK3w-+C2@eTdBgE?h}ueoSm$BGOI7<}i_o zY5_>;4Tu!sYzUD6PC{54DktH^VuKyd2AvM-3O23Fm1#veID!)g|06na;H8p{!fh^c z4=z~dHoPN%Eo*3wQ|dltQdc)k`G0-YJoO`v55E=Ev$SA?c?*W_*|3)PEOX4~xudR*Yrv{I0MgO6n4+VqW z{UY+!!2zsUbh|5_2C!v4#i^+NQN@~;wO#Zle*L5cOsWn}3b0WQ#QIr~xqp+%^n$g= zoNrD1PKSOIhrVvb1YIU9=D;8TEHsbf>ywAY#{ z2Lm|1|E0pfu^lI1?G5vnx-D-5*!+~YYQoeH-8gyHO+Il9Vu#>t8RE(-A$A2=Yhv#p zlLxQ|rWlC5;qo|AB8SIQA%6t&0T7&&;9POoYygo0oD?8-XxO40oa7);4mKK!IT?br zxfY3Xtwg+>Rcx{LT3}-5AKKGh7+?L`uEnJSbDotQ$m`Mx}Ivr*vb$x*kfW!Kxmt>p+|Ya{{E|Ab%>t3bb=#;lw#t zhO|$V2mQaxb5j#Jkp$mks%DBHW!wPf^X&=B51f6qJK* zghRiA*xWW&@h;}X3|8^CSj9Im$Db$VTV@}`qX5G>5pTR2R)0K|>3!M~9EdD{=oEk} zY3ITS5_Cesxy}Xe6C1#}s8f08b;OeIg|j6L9N86R54~Cv=YDQW(H#qKc00x`qr29V z*Pq7?O6&WT=TB;yJSSDxJcC4Xh)Rbr+;JL^^1&Rxl9k^zEZ!T*g<$}{VG%@(KXCMi zA;AH#BUXZQWq$=%Y=e{@bS_*57ht&hv_qMR2nP2e+qbKbKi&f(`ks{K8w+lByWjOe zw&@94$e=Gc&>y8+rn~gSnF+uCd`NTxw%iLBWxI&|70h1Oa8i39(f}#M>px7^ay)n9 zg#tkUH~vW$G@MG%}1*w8^5 zfM^y$z7k8!=+xdM4#|KPTKK697|?%$omW20sAH`)uGgjq}T6w_A#y1cpLeSXvA zE4Y;Z1%Jd2b`hH;MEW?0tzS1EHgYHoYyk+GAQ8xV0RBFno_|-Va0o~Cyf73D4VE0a zzl(gV?Y!O%ot0*e==7J57guARr|DbiiRWL^deKMxVBlpC(FZ_k6G2HVbt$X`g4{1a zF7f)5cThXWfdk9>43${P=nEPYk ztpoLK-B6|lQSrb$klI1uK^tXYt-!fF05mv}h*@8)OyiusJ?rug^tH>Exo?iQ@0nnD zEa6q+slvE&e%)s=V8uOreE;@aUk5 z6S^pGhuep|M=FhM&+B0^au0oeISLi))Pgu82#*miG=}(5;i_`}w~wMwj%Zz>|FAW& zb^vm%bERv<4rV0kx6TC?F05mYKLBSjlz%yfpYFh#>UApipz%OX1E?V$HH252s#9a^WC>sTAIefx5UkGPc;!pHJLC4U6Q zg5VlY9<`FS2FPhZM>6twrti&A$J(HDYLZs5kFxgDN~b3K)Ge_8&opG1#Wgk5#4V;s?A={qe4Tn&?|xzt$jZF#ckm*v$xZ)`2FNyC_Cuu?D+qB&8c;e;Gp$D%%VmXQ5icN6l7QR53=&{~4QegN5BkySG_5!hxL|g6Cc- zJurH`>K>_@+ZubjF?0@hqkm(Z1$YOiv978{qa!W(DB3@>#C%^drTR{|RUiL+`LQbT zQUhMj@Z?=}lXtS69_KX17)eZ3mFTns=(4#;Tyr_5-}e}Hj)-(MyeL(|tXQM&aYW(2N68J?9#8s!_McDj=1p5RUO;eXRF_ Z{{;vjA1VGm?-u|7002ovPDHLkV1m_)B}o7P diff --git a/pixmaps/startcall-small.png b/pixmaps/startcall-small.png index 30b32789a802b49afbd0e0c576ca3fd92a743520..d5726e12c03df86864df4c48e8f98c33ba6af9fe 100644 GIT binary patch delta 1068 zcmV+{1k?MS9*!L$iBL{Q4GJ0x0000DNk~Le0000I0000G2nGNE02>A`T(Kc^3V#FR zNklr{;7}lhmBejO@CNpwn>|YB7(MCmq#Tc@+t)ijnqOAmUdxTmfgEE<6IIF(n;>U zXXebDd%o{{XMl4K*5l zxU3`6b-FI>t5%R>fJC-{)!lIxUqcGC^k(q9pqhku$e?fvR;E#w(68g>&J2>4_%w+cY~+)I2Mq#eI!NN@6t zYI6;XIPX@$U6M9C}h}hbS8`5u*oBt@;q1If7>#!xa_J5YF&+HENI8@Jw zeo;xo*OL+WQbq-BkibaN1zAcG@;E`@NnQa8%@GG@^1UFp113BE0%9oY-Xz5=+{F35 z%IG4eyazZoNeVBJSOS1kR*-6BPXZ@5iBpgv!!Tc>Ggbx@0!EvVhc0WyjN{L;0s$$7 ze^GkfwTCgh3leMqLw`*Y)fylUZ0yRNO=yt=ry%USC8<~`@0UKU88==o3#z$!S6q8& z63P(apqz$wV#fl7Q9Cls5aM)+RQ{HdBzD#=JBnYMDmwj3`NZtK)#c-Mp7|Y7Yz^XX zovK^v$ttEDih(C34Ir_~fl+>;@5Sh%oPu5&13QbuMWHFcBYz|5UqA1zZ^@IM`{a$x zlOJ1<%KK7E(XmmlI_-s`gWQ5Qlg9ZhH(BSSx%iFL9IaIleU?VpH^HLVJKGHlec(KG zuld5wh@U@9-tU@R8*ct#^@M9jH~FpL$o7G5&C7qc71m7Y-`7s-yz)=IyYvqu(^^L# z_epKg#;^sI(SOeaZ)V$aK3X9Q?%uVl_xo0QX8)m6^GL`RnA9comV-7d5>OOmaE`4h zXL_r`k1UOCcmE|gM!evs7NmuTvwP>2@y4M@?<=C?pZ$01&ORcmAV^&kcg3_M^GH*C5S9P{002ovPDHLkU;%doSNKD2@fdL&*7-8tx7RFZw-GBk@ZF}!IzULypJ;`a$ zdEfVW-p_M^a}IkOf*^g&f$rV^?|;9x2b`V>e)oV~3x~Y{*JL90sC)uH8t6XJ#;*)1l_5w}8PGQ(41cm3rGC zKnnCo1Q%{Rpl@uSp+oYjapkl`;XJiKny$hUW85?7j?dFXj@pL8eW1~kdt?G6z=8yi zqEXDCMJFN(RKlP;b`jmYti>QHDdd1e=;s1Qypzf#f|o)^;!SlCC4WyNa2DZ1A$PpP zFxZXMh|IWSbp9Y#t^}lDF;7-c+5(c9pJOVZkk?QI7lQ^P!dU0zU2`^VqYC-f8?k*Q zWP53fGe#_G&Vx8!f=tLv+Q5`Vg$qw5=J`v)~+geG1{^%!C)KO~gENFPQA*g+JsFZ#V(Yk>fv zwY?yTNb9H5U7iW+@3Nha$hOp&XVlg#U>wMlXcytcN-^<4^xuG+WGvTw!s7g@oFN)Z zU-FKpH~!WFQco?{1W;8qCzW}Vu5y=bCwX}G2|3ovPI2y8ihtjwjPq~IIW(^^vj6SQ zXFC&xCZC_JTYi)sya;!fm0E|Z$E_E=lh!jJNgrVGb&wF8Kq85R3_?m8bu1cZ>}OIE zEHP&m%#0S;E6eg}Y2$}^Uv~?m=Bc6=9_b6OA++9{O-z`H$PH2(n7j^a1ZS}SNbI~X zVtZb)!xe3lhkruun9q1AN5iDV>#QGgJ3aP7>ONha{oI#^XZ)#{CXbm@)+Zqa2XQc| zY=U{qYOJrjf$w<6Y|T{Sm(k3OQ(GZk3;4NT63_3<-z{YwE1%wq@;M%jFOGKI|E}$` zg*Wpt9>b}y+1tKRrK);D3D(`Qa_@w)?Fn0(gbwFZGJlK%y#cwswp|O1JZ*oy?ECjo z_s%_KTIpNrg2>jjI}6%B%MvvuIny(+J^3al$;8G0*6p&1v$H+r>YVtxt1G=;p36*VRtmSc!+`t>&WlpP~PMkze\n" "Language-Team: Czech \n" @@ -109,7 +109,7 @@ msgstr "Já" msgid "Couldn't find pixmap file: %s" msgstr "Nelze najít soubor s obrázkem: %s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "Neplatný sipový kontakt!" @@ -176,11 +176,11 @@ msgstr "" msgid "Call error" msgstr "Chyba hovoru" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Hovor ukončen" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Příchozí hovor" @@ -1512,19 +1512,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "přerušen" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "dokončen" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "promeškán" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1539,70 +1539,70 @@ msgstr "" "Stav: %s\n" "Délka: %i min %i s\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Odchozí hovor" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Připraven." -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Vyhledává se umístění čísla…" -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Toto číslo nelze vyhledat." -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "" "Špatně zadaná SIP adresa. Adresa má mít tento formát " -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Kontaktuji" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "Nelze volat" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Je nám líto, ale byl dosažen maximální počet současných hovorů." -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "vás volá" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr " a požaduje automatickou zvednutí." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "Upravují se parametry hovoru…" -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Připojeno." -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "Hovor přerušen" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "Hovor nebylo možné odložit" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Současný hovor se odkládá…" @@ -1821,7 +1821,7 @@ msgstr "Registrace na %s selhala: %s" msgid "Authentication token is %s" msgstr "Klíč k ověření totožnosti je %s" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/de.po b/po/de.po index 44c1e66ea..855048c94 100644 --- a/po/de.po +++ b/po/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2012-11-07 19:27+0100\n" "Last-Translator: Gerhard Stengel \n" "Language-Team: German \n" @@ -96,7 +96,7 @@ msgstr "Eigenes Telefon" msgid "Couldn't find pixmap file: %s" msgstr "Pixmapdatei %s kann nicht gefunden werden." -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "Ungültiger SIP-Kontakt!" @@ -165,11 +165,11 @@ msgstr "" msgid "Call error" msgstr "Anruf fehlgeschlagen" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Anruf beendet" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Eingehender Anruf" @@ -1492,19 +1492,19 @@ msgstr "" msgid "1" msgstr "" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "abgebrochen" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "beendet" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "entgangen" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1519,23 +1519,23 @@ msgstr "" "Status: %s\n" "Dauer: %i min %i sec\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Abgehender Anruf" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Bereit" -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Telefonnummernziel wird gesucht..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Diese Nummer kann nicht aufgelöst werden." -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1543,47 +1543,47 @@ msgstr "" "SIP-Adresse kann nicht eingelesen werden. Eine SIP-Adresse hat folgenden " "Aufbau " -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Verbindungsaufbau" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "Anruf kann nicht getätigt werden." -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Die maximale Anzahl der gleichzeitigen Anrufe ist erreicht." -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "ruft Sie an" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr " und fragt nach automatischer Antwort." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "Die Anrufparameter werden verändert..." -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Verbunden." -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "Anruf abgebrochen" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "Anruf kann nicht gehalten werden" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Aktueller Anruf wird gehalten..." @@ -1802,7 +1802,7 @@ msgstr "Registrierung auf %s fehlgeschlagen: %s" msgid "Authentication token is %s" msgstr "Authentifizierungs-Token ist %s" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/es.po b/po/es.po index 90fa0f926..474f630f4 100644 --- a/po/es.po +++ b/po/es.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Linphone 0.9.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2012-12-06 15:54+0100\n" "Last-Translator: BERAUDO Guillaume \n" "Language-Team: es \n" @@ -101,7 +101,7 @@ msgstr "Yo" msgid "Couldn't find pixmap file: %s" msgstr "No se pudo encontrar el archivo pixmap: %s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "¡Contacto SIP no válido!" @@ -170,12 +170,12 @@ msgstr "" msgid "Call error" msgstr "Error en la llamada." -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 #, fuzzy msgid "Call ended" msgstr "Llamada terminada" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Llamada entrante" @@ -1572,19 +1572,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "abortada" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "completada" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "perdida" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1599,24 +1599,24 @@ msgstr "" "Estado: %s\n" "Duración: %i min %i seg\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Llamada saliente" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 #, fuzzy msgid "Ready" msgstr "Preparado" -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Buscando el número de teléfono del destinatario…" -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "No se ha podido resolver este número." -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 #, fuzzy msgid "" "Could not parse given sip address. A sip url usually looks like sip:" @@ -1625,51 +1625,51 @@ msgstr "" "Dirección SIP mal escrita. Una dirección SIP es del tipo " -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 #, fuzzy msgid "Contacting" msgstr "Contactando" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "No se pudo llamar" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Disculpe, se ha alcanzado el máximo número de llamadas simultáneas" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "le está llamando" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "y ha solicitado auto respuesta." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "Modificando parámetros de llamada…" -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "Llamada abortada" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "No se pudo pausar la llamada" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Pausando la llamada actual..." @@ -1898,7 +1898,7 @@ msgstr "El registro en %s ha fallado." msgid "Authentication token is %s" msgstr "El tóken de autenticación es%s" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/fr.po b/po/fr.po index 48e85b46b..02c1f8fca 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Linphone 0.9.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2013-04-09 13:57+0100\n" "Last-Translator: Simon Morlat \n" "Language-Team: french \n" @@ -15,14 +15,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../gtk/calllogs.c:139 -#: ../gtk/friendlist.c:922 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 #, c-format msgid "Call %s" msgstr "Appeler %s" -#: ../gtk/calllogs.c:140 -#: ../gtk/friendlist.c:923 +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 #, c-format msgid "Send text to %s" msgstr "Chatter avec %s" @@ -62,8 +60,7 @@ msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:321 -#: ../gtk/calllogs.c:327 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format msgid "%s\t%s" msgstr "" @@ -84,8 +81,7 @@ msgid "" "%s" msgstr "" -#: ../gtk/conference.c:38 -#: ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "Conférence" @@ -93,15 +89,12 @@ msgstr "Conférence" msgid "Me" msgstr "Moi" -#: ../gtk/support.c:49 -#: ../gtk/support.c:73 -#: ../gtk/support.c:102 +#: ../gtk/support.c:49 ../gtk/support.c:73 ../gtk/support.c:102 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Icone non trouvée: %s" -#: ../gtk/chat.c:324 -#: ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "Contact sip invalide !" @@ -130,8 +123,12 @@ msgid "if set automatically answer incoming calls" msgstr "si positionné, répond automatiquement aux appels entrants" #: ../gtk/main.c:134 -msgid "Specifiy a working directory (should be the base of the installation, eg: c:\\Program Files\\Linphone)" -msgstr "Spécifie un répertoire de travail (qui devrait être le répertoire d'installation, par exemple c:\\Program Files\\Linphone)" +msgid "" +"Specifiy a working directory (should be the base of the installation, eg: c:" +"\\Program Files\\Linphone)" +msgstr "" +"Spécifie un répertoire de travail (qui devrait être le répertoire " +"d'installation, par exemple c:\\Program Files\\Linphone)" #: ../gtk/main.c:515 #, c-format @@ -142,12 +139,15 @@ msgstr "Appel avec %s" #, c-format msgid "" "%s would like to add you to his contact list.\n" -"Would you allow him to see your presence status or add him to your contact list ?\n" +"Would you allow him to see your presence status or add him to your contact " +"list ?\n" "If you answer no, this person will be temporarily blacklisted." msgstr "" "%s souhaite vous ajouter à sa liste de contact.\n" -"Souhaitez vous l'autoriser à voir votre information de présence et l'ajouter à votre liste également ?\n" -"Si vous répondez non, cette personne sera mise temporairement sur liste noire." +"Souhaitez vous l'autoriser à voir votre information de présence et l'ajouter " +"à votre liste également ?\n" +"Si vous répondez non, cette personne sera mise temporairement sur liste " +"noire." #: ../gtk/main.c:1023 #, c-format @@ -162,24 +162,19 @@ msgstr "" msgid "Call error" msgstr "Erreur lors de l'appel" -#: ../gtk/main.c:1129 -#: ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Appel terminé." -#: ../gtk/main.c:1132 -#: ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Appel entrant" -#: ../gtk/main.c:1134 -#: ../gtk/incall_view.c:497 -#: ../gtk/main.ui.h:5 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Répondre" -#: ../gtk/main.c:1136 -#: ../gtk/main.ui.h:6 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Refuser" @@ -210,8 +205,7 @@ msgstr "Linphone - un téléphone video pour l'internet" msgid "%s (Default)" msgstr "%s (par défaut)" -#: ../gtk/main.c:1796 -#: ../coreapi/callbacks.c:810 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Transfert vers %s" @@ -236,9 +230,7 @@ msgstr "Ajouter au carnet d'adresse" msgid "Presence status" msgstr "Info de présence" -#: ../gtk/friendlist.c:661 -#: ../gtk/propertybox.c:367 -#: ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nom" @@ -291,13 +283,11 @@ msgstr "Débit min. (kbit/s)" msgid "Parameters" msgstr "Paramètres" -#: ../gtk/propertybox.c:435 -#: ../gtk/propertybox.c:578 +#: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "Activé" -#: ../gtk/propertybox.c:437 -#: ../gtk/propertybox.c:578 +#: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "Désactivé" @@ -378,8 +368,11 @@ msgid "Serbian" msgstr "Serbe" #: ../gtk/propertybox.c:848 -msgid "You need to restart linphone for the new language selection to take effect." -msgstr "La nouvelle selection de langue prendra effet au prochain démarrage de linphone." +msgid "" +"You need to restart linphone for the new language selection to take effect." +msgstr "" +"La nouvelle selection de langue prendra effet au prochain démarrage de " +"linphone." #: ../gtk/propertybox.c:934 msgid "None" @@ -400,7 +393,8 @@ msgid "" "Would you like to open a browser to download it ?" msgstr "" "Une version plus récente est disponible sur %s.\n" -"Voulez vous ouvrir le navigateur afin de pouvoir télécharger la dernière version ?" +"Voulez vous ouvrir le navigateur afin de pouvoir télécharger la dernière " +"version ?" #: ../gtk/update.c:91 msgid "You are running the lastest version." @@ -461,8 +455,7 @@ msgstr "Entrez votre identifiant linphone.org" msgid "Username:" msgstr "Nom d'utilisateur:" -#: ../gtk/setupwizard.c:94 -#: ../gtk/password.ui.h:4 +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" msgstr "Mot de passe:" @@ -511,7 +504,8 @@ msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" -"Erreur, le compte n'est pas validé, l'identifiant est déjà utilisé ou le serveur n'est pas accessible.\n" +"Erreur, le compte n'est pas validé, l'identifiant est déjà utilisé ou le " +"serveur n'est pas accessible.\n" "Merci d'essayer à nouveau." #: ../gtk/setupwizard.c:380 @@ -520,10 +514,12 @@ msgstr "Merci. Votre compte est maintenant configuré et prêt à être utilisé #: ../gtk/setupwizard.c:388 msgid "" -"Please validate your account by clicking on the link we just sent you by email.\n" +"Please validate your account by clicking on the link we just sent you by " +"email.\n" "Then come back here and press Next button." msgstr "" -"Merci de valider votre compte en cliquant sur le lien que nous avons envoyé par email.\n" +"Merci de valider votre compte en cliquant sur le lien que nous avons envoyé " +"par email.\n" "Puis appuyez sur suivant." #: ../gtk/setupwizard.c:564 @@ -558,8 +554,7 @@ msgstr "Erreur" msgid "Terminating" msgstr "En cours d’arrêt." -#: ../gtk/incall_view.c:70 -#: ../gtk/incall_view.c:94 +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, c-format msgid "Call #%i" msgstr "Appel #%i" @@ -569,8 +564,7 @@ msgstr "Appel #%i" msgid "Transfer to call #%i with %s" msgstr "Transférer vers l'appel #%i avec %s" -#: ../gtk/incall_view.c:210 -#: ../gtk/incall_view.c:213 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 #, fuzzy msgid "Not used" msgstr "Non trouvé" @@ -621,13 +615,11 @@ msgstr "uPnP en cours d’exécution" msgid "uPnP failed" msgstr "uPnP a échoué." -#: ../gtk/incall_view.c:256 -#: ../gtk/incall_view.c:257 +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 msgid "Direct or through server" msgstr "Directe ou via un serveur" -#: ../gtk/incall_view.c:259 -#: ../gtk/incall_view.c:265 +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" @@ -639,8 +631,7 @@ msgstr "" msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:384 -#: ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" msgstr "Raccrocher" @@ -648,8 +639,7 @@ msgstr "Raccrocher" msgid "Calling..." msgstr "Tentative d'appel..." -#: ../gtk/incall_view.c:479 -#: ../gtk/incall_view.c:689 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" @@ -677,8 +667,7 @@ msgstr "très faible" msgid "too bad" msgstr "nulle" -#: ../gtk/incall_view.c:536 -#: ../gtk/incall_view.c:552 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "indisponible" @@ -695,8 +684,7 @@ msgstr "Sécurisé par ZRTP- [jeton: %s]" msgid "Set unverified" msgstr "Marquer comme non vérifié" -#: ../gtk/incall_view.c:663 -#: ../gtk/main.ui.h:4 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Marquer comme vérifié" @@ -737,8 +725,7 @@ msgstr "Transfert échoué" msgid "Resume" msgstr "Reprendre" -#: ../gtk/incall_view.c:835 -#: ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Pause" @@ -843,13 +830,11 @@ msgstr "Démarrer un nouvel appel" msgid "Contacts" msgstr "Contacts" -#: ../gtk/main.ui.h:28 -#: ../gtk/parameters.ui.h:50 +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Ajouter" -#: ../gtk/main.ui.h:29 -#: ../gtk/parameters.ui.h:51 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" msgstr "Editer" @@ -873,13 +858,11 @@ msgstr "Appels récents" msgid "My current identity:" msgstr "Mon identité sip:" -#: ../gtk/main.ui.h:35 -#: ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Nom d'utilisateur" -#: ../gtk/main.ui.h:36 -#: ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Mot de passe" @@ -1066,8 +1049,7 @@ msgstr "Codecs audio" msgid "Video codecs" msgstr "Codecs vidéo" -#: ../gtk/parameters.ui.h:7 -#: ../gtk/keypad.ui.h:5 +#: ../gtk/parameters.ui.h:7 ../gtk/keypad.ui.h:5 msgid "C" msgstr "" @@ -1218,7 +1200,9 @@ msgstr "Paramètres multimedia" #: ../gtk/parameters.ui.h:44 msgid "This section defines your SIP address when not using a SIP account" -msgstr "Cette rubrique permet de définir son adresse SIP lorsqu'on ne possède pas de compte SIP" +msgstr "" +"Cette rubrique permet de définir son adresse SIP lorsqu'on ne possède pas de " +"compte SIP" #: ../gtk/parameters.ui.h:45 msgid "Your display name (eg: John Doe):" @@ -1260,13 +1244,11 @@ msgstr "Sécurité" msgid "Manage SIP Accounts" msgstr "Gérer mes comptes SIP" -#: ../gtk/parameters.ui.h:57 -#: ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:57 ../gtk/tunnel_config.ui.h:4 msgid "Enable" msgstr "Activer" -#: ../gtk/parameters.ui.h:58 -#: ../gtk/tunnel_config.ui.h:5 +#: ../gtk/parameters.ui.h:58 ../gtk/tunnel_config.ui.h:5 msgid "Disable" msgstr "Désactiver" @@ -1291,8 +1273,13 @@ msgid "Enable adaptive rate control" msgstr "Activer le control de débit adaptatif." #: ../gtk/parameters.ui.h:64 -msgid "Adaptive rate control is a technique to dynamically guess the available bandwidth during a call." -msgstr "Le control de débit adaptatif est une technique pour adapter la qualité de l'audio et de la video en fonction de la bande passante disponible, durant l'appel." +msgid "" +"Adaptive rate control is a technique to dynamically guess the available " +"bandwidth during a call." +msgstr "" +"Le control de débit adaptatif est une technique pour adapter la qualité " +"de l'audio et de la video en fonction de la bande passante disponible, " +"durant l'appel." #: ../gtk/parameters.ui.h:65 msgid "Bandwidth control" @@ -1481,19 +1468,19 @@ msgstr "" msgid "1" msgstr "" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "abandonné" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "terminé" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "manqué" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1508,67 +1495,70 @@ msgstr "" "Etat: %s\n" "Durée: %i mn %i sec\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Appel sortant" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Prêt." -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Recherche de la destination du numéro de téléphone..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "La destination n'a pu être trouvée." -#: ../coreapi/linphonecore.c:2231 -msgid "Could not parse given sip address. A sip url usually looks like sip:user@domain" -msgstr "Adresse SIP mal formulée. Une address sip ressemble à " +#: ../coreapi/linphonecore.c:2252 +msgid "" +"Could not parse given sip address. A sip url usually looks like sip:" +"user@domain" +msgstr "" +"Adresse SIP mal formulée. Une address sip ressemble à " -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Appel de" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "Echec de l'appel" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Désolé, le nombre maximum d'appels simultanés est atteint." -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "vous appelle" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "et sollicite un décrochage automatique." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "Modifications des paramètres d'appels..." -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "En ligne." -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "Appel abandonné" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "La mise en attente a échoué" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Mise en attente de l'appel..." @@ -1654,8 +1644,12 @@ msgid "Unknown-bug" msgstr "Bug inconnu" #: ../coreapi/proxy.c:204 -msgid "The sip proxy address you entered is invalid, it must start with \"sip:\" followed by a hostname." -msgstr "L'adresse SIP du proxy est invalide. Elle doit commencer par \"sip:\" suivie par un nom de domaine." +msgid "" +"The sip proxy address you entered is invalid, it must start with \"sip:\" " +"followed by a hostname." +msgstr "" +"L'adresse SIP du proxy est invalide. Elle doit commencer par \"sip:\" suivie " +"par un nom de domaine." #: ../coreapi/proxy.c:210 msgid "" @@ -1663,7 +1657,8 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" "L'identité SIP que vous avez fourni est invalide.\n" -"Elle doit être de la forme sip:username@domain, comme par example sip:alice@example.net" +"Elle doit être de la forme sip:username@domain, comme par example sip:" +"alice@example.net" #: ../coreapi/proxy.c:1069 #, c-format @@ -1784,7 +1779,7 @@ msgstr "Echec de l'enregistrement sur %s: %s" msgid "Authentication token is %s" msgstr "Le jeton d'authentification est %s" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/he.po b/po/he.po index b8b2895b8..32e51337c 100644 --- a/po/he.po +++ b/po/he.po @@ -2,16 +2,16 @@ # Copyright (C) Belledonne Communications,2010 # This file is distributed under the same license as the linphone package. # Eli Zaretskii , 2012. -# Isratine Citizen , 2012. +# Isratine Citizen , 2012, 2013. # msgid "" msgstr "" -"Project-Id-Version: Linphone 3.5.2\n" +"Project-Id-Version: Linphone 3.5.99.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-04-08 16:59+0200\n" -"PO-Revision-Date: 2012-12-27 10:14+0200\n" +"PO-Revision-Date: 2013-04-24 21:31+0200\n" "Last-Translator: Isratine Citizen \n" -"Language-Team: Rahut \n" +"Language-Team: Rahut Project \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,29 +31,25 @@ msgid "Send text to %s" msgstr "שלח טקסט אל %s" #: ../gtk/calllogs.c:223 -#, fuzzy, c-format +#, c-format msgid "Recent calls (%i)" -msgstr "בשיחה כעת" +msgstr "שיחות אחרונות (%i)" #: ../gtk/calllogs.c:300 msgid "n/a" msgstr "לא זמין (n/a)" #: ../gtk/calllogs.c:303 -#, fuzzy msgid "Aborted" msgstr "ננטשה" #: ../gtk/calllogs.c:306 -#, fuzzy msgid "Missed" msgstr "הוחמצה" -# דחיה #: ../gtk/calllogs.c:309 -#, fuzzy msgid "Declined" -msgstr "לדחות" +msgstr "נדחתה" #: ../gtk/calllogs.c:315 #, c-format @@ -70,29 +66,25 @@ msgstr[0] "שניה %i" msgstr[1] "%i שניות" #: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 -#, fuzzy, c-format +#, c-format msgid "%s\t%s" msgstr "" -"%s\t%s\tאיכות: %s\n" -"%s\t%s %s\t" #: ../gtk/calllogs.c:323 -#, fuzzy, c-format +#, c-format msgid "" "%s\tQuality: %s\n" "%s\t%s\t" msgstr "" -"%s\t%s\tאיכות: %s\n" -"%s\t%s %s\t" +"%s\tאיכות: %s\n" +"%s\t%s\t" #: ../gtk/calllogs.c:329 -#, fuzzy, c-format +#, c-format msgid "" "%s\t\n" "%s" msgstr "" -"%s\t%s\tאיכות: %s\n" -"%s\t%s %s\t" #: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" @@ -124,9 +116,11 @@ msgstr "רשום אל stdout מידע ניפוי שגיאות מסוים בזמ msgid "path to a file to write logs into." msgstr "נתיב אל קובץ שברצונך לרשום אליו את הרשומות." +# cli #: ../gtk/main.c:106 +#, fuzzy msgid "Start linphone with video disabled." -msgstr "" +msgstr "התחל את לינפון עם וידאו מנוטרל." # cli #: ../gtk/main.c:113 @@ -214,14 +208,14 @@ msgid "Call paused" msgstr "שיחה הושהתה" #: ../gtk/main.c:1142 -#, fuzzy, c-format +#, c-format msgid "by %s" -msgstr "Ports utilisés" +msgstr "על ידי %s" #: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" -msgstr "" +msgstr "‏%s רוצה להתחיל וידאו. האם אתה מסכים ?" #: ../gtk/main.c:1353 msgid "Website link" @@ -232,10 +226,11 @@ msgstr "קישור אתר רשת" msgid "Linphone - a video internet phone" msgstr "‫Linphone - וידאופון אינטרנטי" +# משתמטת #: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" -msgstr "‫%s (משתמטת)" +msgstr "‫%s (ברירת מחדל)" #: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format @@ -249,7 +244,7 @@ msgid "" "You won't be able to send or receive audio calls." msgstr "" "לא אותרו כרטיסי קול במחשב זה.\n" -"לא תהיה ביכולתך לשלוח או לקבל שיחות שמע." +"לא תהיה ביכולתך לשלוח או לקבל שיחות אודיו." #: ../gtk/main.c:1911 msgid "A free SIP video-phone" @@ -273,7 +268,7 @@ msgstr "קריאה" #: ../gtk/friendlist.c:678 msgid "Chat" -msgstr "" +msgstr "שיחה" # a name or a number #: ../gtk/friendlist.c:708 @@ -292,9 +287,9 @@ msgid "Delete contact '%s'" msgstr "מחק איש קשר '%s'" #: ../gtk/friendlist.c:926 -#, fuzzy, c-format +#, c-format msgid "Delete chat history of '%s'" -msgstr "מחק איש קשר '%s'" +msgstr "מחק היסטוריית שיחה של '%s'" #: ../gtk/friendlist.c:977 #, c-format @@ -319,10 +314,12 @@ msgstr "קצב נתונים מינימלי (קי״ב/שנ׳)" msgid "Parameters" msgstr "פרמטרים" +# מאופשר #: ../gtk/propertybox.c:435 ../gtk/propertybox.c:578 msgid "Enabled" msgstr "מופעל" +# מנוטרל #: ../gtk/propertybox.c:437 ../gtk/propertybox.c:578 msgid "Disabled" msgstr "לא מופעל" @@ -399,11 +396,11 @@ msgstr "norsk" #: ../gtk/propertybox.c:780 msgid "Hebrew" -msgstr "" +msgstr "עברית" #: ../gtk/propertybox.c:781 msgid "Serbian" -msgstr "" +msgstr "српски srpski" # selected הנבחרת #: ../gtk/propertybox.c:848 @@ -548,7 +545,6 @@ msgstr "" "שגיאה, חשבון לא אומת, שם משתמש כבר בשימוש או שרת לא ניתן להשגה.\n" "נא לחזור ולנסות שוב." -# תודה רבה #: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." msgstr "תודה לך. חשבונך מוגדר ומוכן לשימוש כעת." @@ -610,63 +606,56 @@ msgid "Transfer to call #%i with %s" msgstr "העברה אל שיחה מס׳ %i עם %s" #: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 -#, fuzzy msgid "Not used" -msgstr "לא נמצא" +msgstr "לא בשימוש" #: ../gtk/incall_view.c:220 msgid "ICE not activated" -msgstr "" +msgstr "‏ICE לא מופעלת" #: ../gtk/incall_view.c:222 -#, fuzzy msgid "ICE failed" -msgstr "קריאה נכשלה." +msgstr "‏ICE נכשלה" #: ../gtk/incall_view.c:224 msgid "ICE in progress" -msgstr "" +msgstr "‏ICE מצויה כעת בעיצומה" #: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" -msgstr "" +msgstr "עובר דרך NAT אחד או יותר" #: ../gtk/incall_view.c:228 -#, fuzzy msgid "Direct" -msgstr "מכוון מחדש" +msgstr "ישיר" #: ../gtk/incall_view.c:230 msgid "Through a relay server" -msgstr "" +msgstr "דרך שרת ממסר" #: ../gtk/incall_view.c:238 msgid "uPnP not activated" -msgstr "" +msgstr "‏uPnP לא מופעלת" -# במהלך (או) באמצע חיפוש... #: ../gtk/incall_view.c:240 -#, fuzzy msgid "uPnP in progress" -msgstr "בדיקת STUN מצויה כעת בעיצומה..." +msgstr "‏uPnP מצויה כעת בעיצומה" #: ../gtk/incall_view.c:242 -#, fuzzy msgid "uPnp not available" -msgstr "לא זמינה" +msgstr "‏uPnp לא זמינה" #: ../gtk/incall_view.c:244 msgid "uPnP is running" -msgstr "" +msgstr "‏uPnP מורצת כעת" #: ../gtk/incall_view.c:246 -#, fuzzy msgid "uPnP failed" -msgstr "קריאה נכשלה." +msgstr "‏uPnP נכשלה" #: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 msgid "Direct or through server" -msgstr "" +msgstr "ישיר או דרך שרת" #: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format @@ -674,15 +663,17 @@ msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" +"הורדה: %f\n" +"העלאה: %f (קי״ב/שנ׳)" #: ../gtk/incall_view.c:286 -#, fuzzy, c-format +#, c-format msgid "%.3f seconds" -msgstr "שניה %i" +msgstr "%.3f שניות" #: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" -msgstr "" +msgstr "נתק" #: ../gtk/incall_view.c:476 msgid "Calling..." @@ -767,25 +758,23 @@ msgstr "שיחה הסתיימה." #: ../gtk/incall_view.c:778 msgid "Transfer in progress" -msgstr "" +msgstr "העברה מצויה כעת בעיצומה" #: ../gtk/incall_view.c:781 -#, fuzzy msgid "Transfer done." -msgstr "העברה" +msgstr "העברה הסתיימה." #: ../gtk/incall_view.c:784 -#, fuzzy msgid "Transfer failed." -msgstr "העברה" +msgstr "העברה נכשלה." #: ../gtk/incall_view.c:828 msgid "Resume" -msgstr "חזרה" +msgstr "חזור" #: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" -msgstr "השהיה" +msgstr "השהה" #: ../gtk/incall_view.c:900 #, c-format @@ -793,11 +782,12 @@ msgid "" "Recording into\n" "%s %s" msgstr "" +"מקליט אל תוך\n" +"%s %s" #: ../gtk/incall_view.c:900 -#, fuzzy msgid "(Paused)" -msgstr "השהיה" +msgstr "(מושהה)" #: ../gtk/loginframe.c:93 #, c-format @@ -808,32 +798,32 @@ msgstr "נא להזין מידע התחברות עבור %s" # זה ש: נתקשר או מתוקשר או הותקשר? #: ../gtk/main.ui.h:1 msgid "Callee name" -msgstr "שם המקבל" +msgstr "שם מקבל" +# שגר #: ../gtk/main.ui.h:2 msgid "Send" -msgstr "שיגור" +msgstr "שלח" #: ../gtk/main.ui.h:3 -#, fuzzy msgid "End conference" -msgstr "בשיחת ועידה" +msgstr "סיים ועידה" #: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" -msgstr "" +msgstr "הקלט את שיחה זו אל קובץ אודיו" #: ../gtk/main.ui.h:8 msgid "Video" -msgstr "" +msgstr "וידאו" #: ../gtk/main.ui.h:10 msgid "Mute" -msgstr "" +msgstr "השתק" #: ../gtk/main.ui.h:11 msgid "Transfer" -msgstr "העברה" +msgstr "העבר" #: ../gtk/main.ui.h:14 msgid "In call" @@ -853,7 +843,7 @@ msgstr "_אפשרויות" #: ../gtk/main.ui.h:18 msgid "Always start video" -msgstr "" +msgstr "התחל תמיד וידאו" #: ../gtk/main.ui.h:19 msgid "Enable self-view" @@ -885,7 +875,7 @@ msgstr "כתובת SIP או מספר טלפון" #: ../gtk/main.ui.h:26 msgid "Initiate a new call" -msgstr "התחלת שיחה חדשה" +msgstr "התחל שיחה חדשה" #: ../gtk/main.ui.h:27 msgid "Contacts" @@ -909,7 +899,7 @@ msgstr "הוסף אנשי קשר מן מדור" #: ../gtk/main.ui.h:32 msgid "Add contact" -msgstr "הוספת איש קשר" +msgstr "הוסף איש קשר" # קריאות אחרונות #: ../gtk/main.ui.h:33 @@ -969,7 +959,7 @@ msgstr "ברירת מחדל" #: ../gtk/main.ui.h:46 msgid "Delete" -msgstr "" +msgstr "מחק" #: ../gtk/about.ui.h:1 msgid "About linphone" @@ -1035,7 +1025,7 @@ msgstr "נא להזין את סיסמת המתחם" #: ../gtk/password.ui.h:3 msgid "UserID" -msgstr "זהות משתמש (‫UID)" +msgstr "מזהה משתמש" # קריאות #: ../gtk/call_logs.ui.h:1 @@ -1113,7 +1103,7 @@ msgstr "" #: ../gtk/parameters.ui.h:5 msgid "Audio codecs" -msgstr "קודקים של שמע" +msgstr "קודקים של אודיו" #: ../gtk/parameters.ui.h:6 msgid "Video codecs" @@ -1125,15 +1115,15 @@ msgstr "" #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" -msgstr "" +msgstr "‏SIP ‏(UDP)" #: ../gtk/parameters.ui.h:9 msgid "SIP (TCP)" -msgstr "" +msgstr "‏SIP ‏(TCP)" #: ../gtk/parameters.ui.h:10 msgid "SIP (TLS)" -msgstr "" +msgstr "‏SIP ‏(TLS)" #: ../gtk/parameters.ui.h:11 msgid "Settings" @@ -1167,29 +1157,27 @@ msgstr "וידאו RTP/UDP:" #: ../gtk/parameters.ui.h:18 msgid "Audio RTP/UDP:" -msgstr "שמע RTP/UDP:" +msgstr "אודיו RTP/UDP:" #: ../gtk/parameters.ui.h:19 msgid "DSCP fields" -msgstr "" +msgstr "שדות DSCP" #: ../gtk/parameters.ui.h:20 msgid "Fixed" -msgstr "" +msgstr "מקובע" -# מנהרה #: ../gtk/parameters.ui.h:21 msgid "Tunnel" -msgstr "" +msgstr "מינהור" #: ../gtk/parameters.ui.h:22 -#, fuzzy msgid "Media encryption is mandatory" -msgstr "סוג הצפנת מדיה" +msgstr "הצפנת מדיה הינה מנדטורית" #: ../gtk/parameters.ui.h:23 msgid "Network protocol and ports" -msgstr "פרוטוקולי רשת עבודה ופורטים" +msgstr "פרוטוקולי רשת תקשורת ופורטים" #: ../gtk/parameters.ui.h:24 msgid "Direct connection to the Internet" @@ -1197,31 +1185,30 @@ msgstr "חיבור ישיר אל האינטרנט" #: ../gtk/parameters.ui.h:25 msgid "Behind NAT / Firewall (specify gateway IP below)" -msgstr "מאחורי NAT \\ חומת־אש (ציון כתובת שער (Gateway IP) למטה)" +msgstr "מאחורי NAT / חומת אש (ציון כתובת שער (Gateway IP) למטה)" #: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "כתובת IP פומבית:" +# ניצול STUN # שימוש ב־STUN # utilize #: ../gtk/parameters.ui.h:27 msgid "Behind NAT / Firewall (use STUN to resolve)" -msgstr "מאחורי NAT \\ חומת־אש (ניצול STUN)" +msgstr "מאחורי NAT / חומת אש (בעזרת STUN לפתירה)" # שימוש ב־STUN # utilize #: ../gtk/parameters.ui.h:28 -#, fuzzy msgid "Behind NAT / Firewall (use ICE)" -msgstr "מאחורי NAT \\ חומת־אש (ניצול STUN)" +msgstr "מאחורי NAT / חומת אש (בעזרת ICE)" # שימוש ב־STUN # utilize #: ../gtk/parameters.ui.h:29 -#, fuzzy msgid "Behind NAT / Firewall (use uPnP)" -msgstr "מאחורי NAT \\ חומת־אש (ניצול STUN)" +msgstr "מאחורי NAT / חומת אש (בעזרת uPnP)" #: ../gtk/parameters.ui.h:30 msgid "Stun server:" @@ -1233,7 +1220,7 @@ msgstr "‫NAT וחומת אש" #: ../gtk/parameters.ui.h:32 msgid "Network settings" -msgstr "הגדרות רשת עבודה" +msgstr "הגדרות רשת תקשורת" #: ../gtk/parameters.ui.h:33 msgid "Ring sound:" @@ -1261,7 +1248,7 @@ msgstr "אפשר ביטול הד" #: ../gtk/parameters.ui.h:39 msgid "Audio" -msgstr "שמע" +msgstr "אודיו" #: ../gtk/parameters.ui.h:40 msgid "Video input device:" @@ -1342,12 +1329,12 @@ msgstr "קודקים" msgid "0 stands for \"unlimited\"" msgstr "0 מסמל \"בלי הגבלה\"" -# האם KiB means kibibyte? +# does KiB mean kibibyte? #: ../gtk/parameters.ui.h:61 msgid "Upload speed limit in Kbit/sec:" msgstr "מגבלת מהירות העלאה בקי״ב/שנ׳:" -# האם KiB means kibibyte? +# האם KiB זה kibibyte? # קי״ב (1024) אל מול ק״ב (1000) #: ../gtk/parameters.ui.h:62 msgid "Download speed limit in Kbit/sec:" @@ -1418,89 +1405,80 @@ msgid "Please wait" msgstr "נא להמתין" #: ../gtk/dscp_settings.ui.h:1 -#, fuzzy msgid "Dscp settings" -msgstr "הגדרות" +msgstr "הגדרות Dscp" #: ../gtk/dscp_settings.ui.h:2 msgid "SIP" msgstr "" #: ../gtk/dscp_settings.ui.h:3 -#, fuzzy msgid "Audio RTP stream" -msgstr "שמע RTP/UDP:" +msgstr "זרם RTP אודיו" #: ../gtk/dscp_settings.ui.h:4 -#, fuzzy msgid "Video RTP stream" -msgstr "וידאו RTP/UDP:" +msgstr "זרם RTP וידאו" #: ../gtk/dscp_settings.ui.h:5 msgid "Set DSCP values (in hexadecimal)" -msgstr "" +msgstr "קבע ערכי DSCP (בהקסדצימלי)" #: ../gtk/call_statistics.ui.h:1 msgid "Call statistics" -msgstr "" +msgstr "סטטיסטיקות שיחה" #: ../gtk/call_statistics.ui.h:2 -#, fuzzy msgid "Audio codec" -msgstr "קודקים של שמע" +msgstr "קודק של אודיו" #: ../gtk/call_statistics.ui.h:3 -#, fuzzy msgid "Video codec" -msgstr "קודקים של וידאו" +msgstr "קודק של וידאו" #: ../gtk/call_statistics.ui.h:4 msgid "Audio IP bandwidth usage" -msgstr "" +msgstr "ניצול רוחב פס IP אודיו" #: ../gtk/call_statistics.ui.h:5 -#, fuzzy msgid "Audio Media connectivity" -msgstr "סוג הצפנת מדיה" +msgstr "קישוריות מדיום אודיו" #: ../gtk/call_statistics.ui.h:6 msgid "Video IP bandwidth usage" -msgstr "" +msgstr "ניצול רוחב פס IP וידאו" #: ../gtk/call_statistics.ui.h:7 -#, fuzzy msgid "Video Media connectivity" -msgstr "סוג הצפנת מדיה" +msgstr "קישוריות מדיום וידאו" #: ../gtk/call_statistics.ui.h:8 msgid "Round trip time" -msgstr "" +msgstr "זמן הלוך ושוב" #: ../gtk/call_statistics.ui.h:9 -#, fuzzy msgid "Call statistics and information" -msgstr "מידע איש קשר" +msgstr "סטטיסטיקות ומידע שיחה" #: ../gtk/tunnel_config.ui.h:1 -#, fuzzy msgid "Configure VoIP tunnel" -msgstr "הגדרת חשבון ‫SIP" +msgstr "הגדר תיעול VoIP" #: ../gtk/tunnel_config.ui.h:2 msgid "Host" -msgstr "" +msgstr "מארח" #: ../gtk/tunnel_config.ui.h:3 msgid "Port" -msgstr "" +msgstr "פורט" #: ../gtk/tunnel_config.ui.h:6 msgid "Configure tunnel" -msgstr "" +msgstr "הגדר מינהור" #: ../gtk/tunnel_config.ui.h:9 msgid "Configure http proxy (optional)" -msgstr "" +msgstr "הגדר http proxy (רשות)" #: ../gtk/keypad.ui.h:1 msgid "D" @@ -1520,15 +1498,15 @@ msgstr "" #: ../gtk/keypad.ui.h:6 msgid "9" -msgstr "9 (סעפ)" +msgstr "9 [סעפ]" #: ../gtk/keypad.ui.h:7 msgid "8" -msgstr "8 (צק)" +msgstr "8 [צק]" #: ../gtk/keypad.ui.h:8 msgid "7" -msgstr "7 (רשת)" +msgstr "7 [רשת]" #: ../gtk/keypad.ui.h:9 msgid "B" @@ -1536,15 +1514,15 @@ msgstr "" #: ../gtk/keypad.ui.h:10 msgid "6" -msgstr "6 (זחט)" +msgstr "6 [זחט]" #: ../gtk/keypad.ui.h:11 msgid "5" -msgstr "5 (יכל)" +msgstr "5 [יכל]" #: ../gtk/keypad.ui.h:12 msgid "4" -msgstr "4 (מנ)" +msgstr "4 [מנ]" #: ../gtk/keypad.ui.h:13 msgid "A" @@ -1552,11 +1530,11 @@ msgstr "" #: ../gtk/keypad.ui.h:14 msgid "3" -msgstr "3 (אבג)" +msgstr "3 [אבג]" #: ../gtk/keypad.ui.h:15 msgid "2" -msgstr "2 (דהו)" +msgstr "2 [דהו]" #: ../gtk/keypad.ui.h:16 msgid "1" @@ -1692,7 +1670,7 @@ msgstr "בדיקת STUN מצויה כעת בעיצומה..." #: ../coreapi/misc.c:630 msgid "ICE local candidates gathering in progress..." -msgstr "" +msgstr "צבירת מועמדים מקומיים של ICE מצויה כעת בעיצומה..." #: ../coreapi/friend.c:33 msgid "Online" @@ -1745,14 +1723,14 @@ msgstr "בהמתנה" #: ../coreapi/friend.c:66 msgid "Unknown-bug" -msgstr "תקלה לא ידועה" +msgstr "תקלה לא מוכרת" #: ../coreapi/proxy.c:204 msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "" -"כתובת sip proxy שהוזנה הינה שגויה, זו צריכה להתחיל עם‭\"sip:\" ‬ לאחר שם מארח." +"כתובת sip proxy שהזנת הינה שגויה, זו צריכה להתחיל עם‭\"sip:\" ‬ לאחר שם מארח." # כמו למשל #: ../coreapi/proxy.c:210 @@ -1806,24 +1784,21 @@ msgstr "קריאה נענתה על ידי %s." # אי תאימות # אי התאמה #: ../coreapi/callbacks.c:412 -#, fuzzy msgid "Incompatible, check codecs or security settings..." -msgstr "חוסר תאימות, נא לבדוק קודקים..." +msgstr "חוסר תאימות, בדוק קודקים או הגדרות אבטחה..." #: ../coreapi/callbacks.c:460 -#, fuzzy msgid "We have been resumed." -msgstr "חזרנו..." +msgstr "חזרנו." #: ../coreapi/callbacks.c:469 msgid "We are paused by other party." -msgstr "" +msgstr "אנו מושהים על ידי צד אחר." # באופן מרוחק #: ../coreapi/callbacks.c:475 -#, fuzzy msgid "Call is updated by remote." -msgstr "שיחה עודכנה מרחוק..." +msgstr "שיחה עודכנה מרחוק." #: ../coreapi/callbacks.c:544 msgid "Call terminated." @@ -1862,9 +1837,8 @@ msgstr "מכוון מחדש" # אי תאימות # אי התאמה #: ../coreapi/callbacks.c:627 -#, fuzzy msgid "Incompatible media parameters." -msgstr "חוסר תאימות, נא לבדוק קודקים..." +msgstr "פרמטריי מדיה חסרי תואמים." #: ../coreapi/callbacks.c:633 msgid "Call failed." diff --git a/po/hu.po b/po/hu.po index 256e7ffba..65bbb3e7b 100644 --- a/po/hu.po +++ b/po/hu.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Linphone\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2013-03-26 19:00+0100\n" "Last-Translator: Viktor \n" "Language-Team: \n" @@ -98,7 +98,7 @@ msgstr "én" msgid "Couldn't find pixmap file: %s" msgstr "Nemtalálható a pixmap fájl: %s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "Érvénytelen sip partner !" @@ -165,11 +165,11 @@ msgstr "" msgid "Call error" msgstr "Hiba a hívás közben" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Hívás vége" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Beérkező hívás" @@ -1475,19 +1475,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "megszakítva" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "befejezve" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "elhibázva" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1502,70 +1502,70 @@ msgstr "" "Állapot: %s\n" "Időtartam: %i perc %i másodperc\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Kimenő hívás" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Kész" -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Telefonszám-cél keresése..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Nem sikkerült értelmezni a számot." -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "" "Az adott szám nem értelmezhető. Egy sip cím általában így néz ki: user@domain" -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Kapcsolódás" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "Nem sikerült hívni" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Elnézést, elértük a egyidejű hívások maximális számát" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "kapcsolatba lépett veled." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "és automatikus választ kért." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "A hívási jellemzők módosítása..." -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Kapcsolódva." -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "Hívás megszakítva" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "Nem sikerült várakoztatni a hívást" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Jelenlegi hívás várakoztatásának aktiválása..." @@ -1784,7 +1784,7 @@ msgstr "A regisztáció a %s -n nem sikerült: %s" msgid "Authentication token is %s" msgstr "Hitelesítési jel: %s" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/it.po b/po/it.po index f1c29e8b0..e7c8cfc13 100644 --- a/po/it.po +++ b/po/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Linphone 3.2.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2002-10-15 HO:MI+ZONE\n" "Last-Translator: Matteo Piazza \n" "Language-Team: it \n" @@ -98,7 +98,7 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "Contatto SIP non valido" @@ -161,11 +161,11 @@ msgstr "Prego inserire la password per username %s e dominio %s" msgid "Call error" msgstr "Cronologia" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Chiamata terminata" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Chimata in entrata" @@ -1505,19 +1505,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "annullato" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "comletato" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "mancante" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1532,23 +1532,23 @@ msgstr "" "Stato: %s\n" "Durata: %i mn %i sec\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Chiamata in uscita" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Pronto" -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Ricerca numero destinazione..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Impossibile risolvere il numero." -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1556,51 +1556,51 @@ msgstr "" "Errore nel formato del contatto sip. Usualmente un indirizzo appare sip:" "user@domain" -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "In connessione" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "chiamata fallita" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "ti sta conttatando." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Connessione" -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "annullato" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 #, fuzzy msgid "Could not pause the call" msgstr "chiamata fallita" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 #, fuzzy msgid "Pausing the current call..." msgstr "Mostra chiamata corrente" @@ -1822,7 +1822,7 @@ msgstr "Registrazione su %s fallita: %s" msgid "Authentication token is %s" msgstr "Linphone - Autenticazione richiesta" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/ja.po b/po/ja.po index 668018fd1..56362238b 100644 --- a/po/ja.po +++ b/po/ja.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.10\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2003-01-21 00:05+9000\n" "Last-Translator: YAMAGUCHI YOSHIYA \n" "Language-Team: \n" @@ -96,7 +96,7 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "pixmapファイルが見つかりません %s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "" @@ -156,12 +156,12 @@ msgstr "" msgid "Call error" msgstr "通話はキャンセルされました。" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 #, fuzzy msgid "Call ended" msgstr "通話は拒否されました。" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "" @@ -1516,19 +1516,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1538,24 +1538,24 @@ msgid "" "Duration: %i mn %i sec\n" msgstr "" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 #, fuzzy msgid "Ready" msgstr "準備完了。" -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "" -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 #, fuzzy msgid "" "Could not parse given sip address. A sip url usually looks like sip:" @@ -1564,51 +1564,51 @@ msgstr "" "SIPアドレスの形式エラーです。SIPアドレスは、のような" "形式です。" -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 #, fuzzy msgid "Contacting" msgstr "接続中" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "pixmapファイルが見つかりません %s" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "から電話です。" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "接続しました。" -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "通話はキャンセルされました。" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "" @@ -1832,7 +1832,7 @@ msgstr "登録しました。" msgid "Authentication token is %s" msgstr "コーデックの情報" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/nb_NO.po b/po/nb_NO.po index 8b7f20c28..470e0d024 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2011-04-05 01:56+0200\n" "Last-Translator: Øyvind Sæther \n" "Language-Team: Norwegian Bokmål \n" @@ -98,7 +98,7 @@ msgstr "Skru mikrofonen av" msgid "Couldn't find pixmap file: %s" msgstr "Fant ikke pixmap fli: %s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "Ugyldig SIP kontakt !" @@ -166,11 +166,11 @@ msgstr "" msgid "Call error" msgstr "Samtalehistorikk" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Samtale avsluttet" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Innkommende samtale" @@ -1498,19 +1498,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "avbrutt" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "Fullført" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "ubesvart" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1525,23 +1525,23 @@ msgstr "" "Status: %s\n" "Lengde: %i min %i sek\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Utgående samtale" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Klar" -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Ser etter telefonnummer for destinasjonen..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Kan ikke tilkoble dette nummeret." -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1549,47 +1549,47 @@ msgstr "" "Klarer ikke å tolke angitt SIP-adresse. En SIP-adresse er vanligvis ut som " "sip: brukernavn@domenenavn" -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Tilknytter" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "Kunne ikke ringe" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Beklager, du har nådd maksimalt antall samtidige samtaler" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "Kontakter deg." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr " og ba om autosvar." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "Endrer ringeparametre..." -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Tilkoblet" -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "Samtale avbrutt" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "Kunne ikke pause samtalen" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Pauser nåværende samtale" @@ -1810,7 +1810,7 @@ msgstr "Registrering hos %s mislykkes: %s" msgid "Authentication token is %s" msgstr "Autorisering kreves" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/nl.po b/po/nl.po index 8cfe7febd..fcd4ca42b 100644 --- a/po/nl.po +++ b/po/nl.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: nl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2007-09-05 10:40+0200\n" "Last-Translator: Hendrik-Jan Heins \n" "Language-Team: Nederlands \n" @@ -99,7 +99,7 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Kon pixmap bestand %s niet vinden" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "" @@ -159,11 +159,11 @@ msgstr "" msgid "Call error" msgstr "Linphone - Oproepgeschiedenis" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Oproep beeindigd" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Inkomende oproep" @@ -1527,19 +1527,19 @@ msgstr "" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "afgebroken" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "voltooid" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "gemist" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1554,23 +1554,23 @@ msgstr "" "Status: %s\n" "Tijdsduur: %i mins %i secs\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Uitgaande oproep" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Gereed." -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Zoekt de lokatie van het telefoonnummer..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Kon dit nummer niet vinden." -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1578,51 +1578,51 @@ msgstr "" "Slecht geformuleerd SIP-adres. Een SIP-adres ziet er uit als sip:" "gebruikersnaam@domeinnaam" -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Verbinden" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "Kon niet oproepen" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "belt u." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Verbonden." -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "afgebroken" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 #, fuzzy msgid "Could not pause the call" msgstr "Kon niet oproepen" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 #, fuzzy msgid "Pausing the current call..." msgstr "Kon niet oproepen" @@ -1848,7 +1848,7 @@ msgstr "Registratie op %s mislukt (time-out)." msgid "Authentication token is %s" msgstr "Authorisatie gegevens" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, fuzzy, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/pl.po b/po/pl.po index 4512b7230..869f9b85e 100644 --- a/po/pl.po +++ b/po/pl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2003-08-22 12:50+0200\n" "Last-Translator: Robert Nasiadek \n" "Language-Team: Polski \n" @@ -94,7 +94,7 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Nie można znaleźć pixmapy: %s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "" @@ -154,12 +154,12 @@ msgstr "" msgid "Call error" msgstr "Połączenie odwołane." -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 #, fuzzy msgid "Call ended" msgstr "Rozmowa odrzucona." -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "" @@ -1515,19 +1515,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1537,75 +1537,75 @@ msgid "" "Duration: %i mn %i sec\n" msgstr "" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 #, fuzzy msgid "Ready" msgstr "Gotowy." -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "" -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 #, fuzzy msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "Nie poprawny adres sip. Adres sip wygląda tak " -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 #, fuzzy msgid "Contacting" msgstr "Dzwonie do " -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "Nie można znaleźć pixmapy: %s" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "dzwoni do Ciebie." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Połączony" -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "Połączenie odwołane." -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "" @@ -1829,7 +1829,7 @@ msgstr "Rejestracja powiodła się." msgid "Authentication token is %s" msgstr "Informacje o kodeku" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/pt_BR.po b/po/pt_BR.po index 821ba910f..1ebd70a43 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone-1.1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2006-07-11 23:30+0200\n" "Last-Translator: Rafael Caesar Lenzi \n" "Language-Team: pt_BR \n" @@ -97,7 +97,7 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Não é possível achar arquivo pixmap: %s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "" @@ -157,12 +157,12 @@ msgstr "" msgid "Call error" msgstr "Linphone - Histórico de chamadas" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 #, fuzzy msgid "Call ended" msgstr "Chamada cancelada." -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Camadas recebidas" @@ -1520,19 +1520,19 @@ msgstr "" msgid "1" msgstr "" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "Abortado" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "Competado" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "Perdido" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, fuzzy, c-format msgid "" "%s at %s\n" @@ -1546,74 +1546,74 @@ msgstr "" "Status: %s\n" "Duração: %i min %i seg\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Chamadas efetuadas" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 #, fuzzy msgid "Ready" msgstr "Pronto." -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Procurando por telefone de destino..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Não foi possível encontrar este número." -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "" -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 #, fuzzy msgid "Contacting" msgstr "Contatando " -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "Não é possível achar arquivo pixmap: %s" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "está chamado você." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "Abortado" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "" @@ -1827,7 +1827,7 @@ msgstr "Registro falhou (tempo esgotado)." msgid "Authentication token is %s" msgstr "Informações de autenticação" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, fuzzy, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/ru.po b/po/ru.po index 66419e69a..0c81d472b 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2010-01-22 18:43+0300\n" "Last-Translator: Maxim Prokopyev \n" "Language-Team: Russian \n" @@ -105,7 +105,7 @@ msgstr "Я" msgid "Couldn't find pixmap file: %s" msgstr "Невозможно найти графический файл: %s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "Неверный sip-контакт!" @@ -174,11 +174,11 @@ msgstr "" msgid "Call error" msgstr "Ошибка вызова" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Разговор окончен" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Входящий вызов" @@ -1508,19 +1508,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "отмененный" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "завершённый" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "пропущенный" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1535,23 +1535,23 @@ msgstr "" "Статус: %s\n" "Длительность: %i мин %i сек\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Исходящий звонок" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Готов" -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Поиск адреса для телефонного номера..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Не могу найти этот номер." -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1559,47 +1559,47 @@ msgstr "" "Не могу опознать sip адрес. SIP-URL обычно выглядит как sip:" "username@domainname" -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Соединение" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "Не удалось позвонить" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Извините, мы превысили максимальное количество одновременных вызовов" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "пытается связаться с вами" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr " и ответил автоответчик." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "Изменение параметров вызова..." -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Соединён." -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "Вызов отменён" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "Не удалось приостановить вызов" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Приостановление текущего вызова..." @@ -1823,7 +1823,7 @@ msgstr "Регистрация на %s не удалась: %s" msgid "Authentication token is %s" msgstr "Аутентификационный токен: %s" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/sr.po b/po/sr.po index 814b4d050..d0b470f95 100644 --- a/po/sr.po +++ b/po/sr.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 0.7.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2013-02-11 19:03+0200\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" @@ -106,7 +106,7 @@ msgstr "Ја" msgid "Couldn't find pixmap file: %s" msgstr "Не могу да пронађем датотеку сличице: %s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "Неисправан сип контакт !" @@ -173,11 +173,11 @@ msgstr "" msgid "Call error" msgstr "Грешка позива" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Позив је завршен" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Долазни позив" @@ -1503,19 +1503,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "прекинути" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "завршени" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "пропуштени" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1530,23 +1530,23 @@ msgstr "" "Стање: %s\n" "Трајање: %i мин %i сек\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Одлазни позив" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Спреман" -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Тражим одредиште телефонског броја..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Не могу да решим овај број." -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1554,47 +1554,47 @@ msgstr "" "Не могу да обрадим дату сип адресу. Сип адреса обично изгледа као „sip:" "корисник@домен“" -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Ступам у везу" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "Не могу да позовем" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Извините, достигли смо највећи број истовремених позива" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "вам се обраћа" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr " и затражени само-одговор." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "Мењам параметре позива..." -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Повезан сам." -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "Позив је прекинут" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "Не могу да зауставим позив" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Заустављам тренутни позив..." @@ -1814,7 +1814,7 @@ msgstr "Уписивање на „%s“ није успело: %s" msgid "Authentication token is %s" msgstr "Симбол потврђивања идентитета је „%s“" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/sv.po b/po/sv.po index 4f7ec762c..c814f86c4 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2009-02-17 15:22+0100\n" "Last-Translator: Emmanuel Frécon \n" "Language-Team: SWEDISH \n" @@ -97,7 +97,7 @@ msgstr "Mikrofon av" msgid "Couldn't find pixmap file: %s" msgstr "Kunde inte hitta pixmap filen: %s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "ogiltig SIP kontakt!" @@ -165,11 +165,11 @@ msgstr "" msgid "Call error" msgstr "Samtalshistorik" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Samtalet slut" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Inkommande samtal" @@ -1503,19 +1503,19 @@ msgstr "" msgid "1" msgstr "" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "avbrytade" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "avslutade" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "missade" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1530,23 +1530,23 @@ msgstr "" "Status: %s\n" "Längd: %i min %i sek\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Utgående samtal" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Redo" -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Leta efter telefonnummer för destinationen..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Kan inte nå dett nummer." -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1554,51 +1554,51 @@ msgstr "" "Kan inte förstå angiven SIP adress. En SIP adress vanligen ser ut som sip:" "användare@domänen" -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Kontaktar" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "Kunde inte ringa" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "kontaktar dig." -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Kopplad" -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "avbrytade" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 #, fuzzy msgid "Could not pause the call" msgstr "Kunde inte ringa" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 #, fuzzy msgid "Pausing the current call..." msgstr "Nuvarande samtal" @@ -1821,7 +1821,7 @@ msgstr "Registrering hos %s mislyckades: %s" msgid "Authentication token is %s" msgstr "Linphone - Autentisering krävs" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/zh_CN.po b/po/zh_CN.po index 7c81df3fc..0d21351a8 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 3.3.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2011-01-08 23:51+0800\n" "Last-Translator: Aron Xu \n" "Language-Team: Chinese (simplified) \n" @@ -97,7 +97,7 @@ msgstr "静音" msgid "Couldn't find pixmap file: %s" msgstr "无法打开位图文件:%s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "无效的 SIP 联系人!" @@ -160,11 +160,11 @@ msgstr "请输入 %s@%s 的密码:" msgid "Call error" msgstr "呼叫历史" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "呼叫结束" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "呼入" @@ -1514,19 +1514,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "中断" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "完成" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "丢失" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1541,23 +1541,23 @@ msgstr "" "状态:%s\n" "状态:%i 分 %i 秒\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "呼出" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "就绪" -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "查询电话号码目的地..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "该号码无法解析。" -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1565,50 +1565,50 @@ msgstr "" "无法解析给定的 SIP 地址,SIP 地址应有如下格式:\n" "sip:用户名@域名" -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "联系中" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "无法呼叫" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "正在联系您" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr " 并询问了自动回答。" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "已连接。" -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "中断" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 #, fuzzy msgid "Could not pause the call" msgstr "无法呼叫" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "" @@ -1823,7 +1823,7 @@ msgstr "注册到 %s 失败: %s" msgid "Authentication token is %s" msgstr "Linphone - 需要认证" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." diff --git a/po/zh_TW.po b/po/zh_TW.po index d1b2ce1a7..26a086150 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: linphone 3.4\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"POT-Creation-Date: 2013-04-24 14:04+0200\n" "PO-Revision-Date: 2011-04-06 21:24+0800\n" "Last-Translator: Chao-Hsiung Liao \n" "Language-Team: \n" @@ -96,7 +96,7 @@ msgstr "靜音" msgid "Couldn't find pixmap file: %s" msgstr "找不到 pixmap 檔:%s" -#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "無效的 sip 連絡人!" @@ -162,11 +162,11 @@ msgstr "" msgid "Call error" msgstr "通話紀錄" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "通話已結束" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "來電" @@ -1489,19 +1489,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:227 +#: ../coreapi/linphonecore.c:228 msgid "aborted" msgstr "已放棄" -#: ../coreapi/linphonecore.c:230 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "已完成" -#: ../coreapi/linphonecore.c:233 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "未接" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1516,69 +1516,69 @@ msgstr "" "狀態:%s\n" "持續時間:%i 分 %i 秒\n" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "去電" -#: ../coreapi/linphonecore.c:1312 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "準備就緒" -#: ../coreapi/linphonecore.c:2184 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "尋找電話號碼目的端..." -#: ../coreapi/linphonecore.c:2187 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "無法解析這個號碼。" -#: ../coreapi/linphonecore.c:2231 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "無法解析指定的 sip 位址。sip 網址通常看起來像 sip:user@domain" -#: ../coreapi/linphonecore.c:2432 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "正在連絡" -#: ../coreapi/linphonecore.c:2439 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "無法通話" -#: ../coreapi/linphonecore.c:2549 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "抱歉,我們已達瀏同步通話的最大數目" -#: ../coreapi/linphonecore.c:2731 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "正在連絡您" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "並要求自動接聽。" -#: ../coreapi/linphonecore.c:2732 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2799 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "修改通話參數..." -#: ../coreapi/linphonecore.c:3138 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "已連線。" -#: ../coreapi/linphonecore.c:3166 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "通話已放棄" -#: ../coreapi/linphonecore.c:3357 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "無法暫停通話" -#: ../coreapi/linphonecore.c:3362 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "暫停目前的通話..." @@ -1795,7 +1795,7 @@ msgstr "在 %s 註冊失敗:%s" msgid "Authentication token is %s" msgstr "驗證失敗" -#: ../coreapi/linphonecall.c:2319 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." From dd1a451c363a88f01094f5f85f018bcf098bdc6c Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Fri, 26 Apr 2013 12:24:38 +0200 Subject: [PATCH 221/281] hold_call disabled in conf set minimum size to contact list --- gtk/incall_view.c | 2 ++ gtk/main.ui | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 01e3b3cd9..5e13f2602 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -701,9 +701,11 @@ void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call){ if (in_conf){ linphone_gtk_set_in_conference(call); gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"incall_mute"),FALSE); + gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"hold_call"),FALSE); }else{ linphone_gtk_unset_from_conference(call); /*in case it was previously*/ gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"incall_mute"),TRUE); + gtk_widget_set_sensitive(linphone_gtk_get_widget(callview,"hold_call"),TRUE); } gtk_widget_show_all(linphone_gtk_get_widget(callview,"buttons_panel")); if (!in_conf) gtk_widget_show_all(linphone_gtk_get_widget(callview,"record_hbox")); diff --git a/gtk/main.ui b/gtk/main.ui index 591b042ae..dde462ec3 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -1118,7 +1118,7 @@ - + True True @@ -1231,7 +1231,7 @@ False - True + False From f7c594507b16a3f158f75cbaa0a4fe8f92b1e49a Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 29 Apr 2013 13:42:04 +0200 Subject: [PATCH 222/281] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 3acaa7372..89c644022 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 3acaa7372423ffb0d18923e9e41e1076cec51905 +Subproject commit 89c644022b1dbf32be6afb08b0425bd4c788fc1b From 009630c1b5093505b5e55af6b29ae9fc37e037e2 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 29 Apr 2013 17:04:11 +0200 Subject: [PATCH 223/281] Fix swapped soundcards and use voidsink. --- coreapi/ec-calibrator.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/coreapi/ec-calibrator.c b/coreapi/ec-calibrator.c index 223fb087d..fa92b4992 100644 --- a/coreapi/ec-calibrator.c +++ b/coreapi/ec-calibrator.c @@ -36,7 +36,7 @@ static void ecc_init_filters(EcCalibrator *ecc){ params.prio=MS_TICKER_PRIO_HIGH; ecc->ticker=ms_ticker_new_with_params(¶ms); - ecc->sndread=ms_snd_card_create_reader(ecc->play_card); + ecc->sndread=ms_snd_card_create_reader(ecc->capt_card); ms_filter_call_method(ecc->sndread,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ms_filter_call_method(ecc->sndread,MS_FILTER_GET_SAMPLE_RATE,&rate); ms_filter_call_method(ecc->sndread,MS_FILTER_SET_NCHANNELS,&ecc_channels); @@ -50,7 +50,7 @@ static void ecc_init_filters(EcCalibrator *ecc){ ecc->det=ms_filter_new(MS_TONE_DETECTOR_ID); ms_filter_call_method(ecc->det,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); - ecc->rec=ms_filter_new(MS_FILE_REC_ID); + ecc->rec=ms_filter_new(MS_VOID_SINK_ID); ms_filter_link(ecc->sndread,0,ecc->read_resampler,0); ms_filter_link(ecc->read_resampler,0,ecc->det,0); @@ -60,7 +60,7 @@ static void ecc_init_filters(EcCalibrator *ecc){ ecc->gen=ms_filter_new(MS_DTMF_GEN_ID); ms_filter_call_method(ecc->gen,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ecc->write_resampler=ms_filter_new(MS_RESAMPLE_ID); - ecc->sndwrite=ms_snd_card_create_writer(ecc->capt_card); + ecc->sndwrite=ms_snd_card_create_writer(ecc->play_card); ms_filter_call_method(ecc->sndwrite,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ms_filter_call_method(ecc->sndwrite,MS_FILTER_GET_SAMPLE_RATE,&rate); From f906188cefb6da53193f5cd60f58fdf140c0edf1 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 30 Apr 2013 10:32:56 +0200 Subject: [PATCH 224/281] fix crash when receiving an incorrect SDP message in a 200Ok. fix indentation --- coreapi/callbacks.c | 3 ++- coreapi/sal_eXosip2_presence.c | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 8a6ea631c..a6b49a0e8 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -351,7 +351,8 @@ static void call_accepted(SalOp *op){ #endif //BUILD_UPNP md=sal_call_get_final_media_description(op); - call->params.has_video &= linphone_core_media_description_contains_video_stream(md); + if (md) + call->params.has_video &= linphone_core_media_description_contains_video_stream(md); if (call->state==LinphoneCallOutgoingProgress || call->state==LinphoneCallOutgoingRinging || diff --git a/coreapi/sal_eXosip2_presence.c b/coreapi/sal_eXosip2_presence.c index c81910986..b9f7b5763 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -85,19 +85,19 @@ static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; static void msg_add_current_date(osip_message_t *msg){ - char tmp[64]={0}; - time_t curtime=time(NULL); - struct tm *ret; + char tmp[64]={0}; + time_t curtime=time(NULL); + struct tm *ret; #ifndef WIN32 - struct tm gmt; - ret=gmtime_r(&curtime,&gmt); + struct tm gmt; + ret=gmtime_r(&curtime,&gmt); #else - ret=gmtime(&curtime); + ret=gmtime(&curtime); #endif - /*cannot use strftime because it is locale dependant*/ - snprintf(tmp,sizeof(tmp)-1,"%s, %i %s %i %02i:%02i:%02i GMT", - days[ret->tm_wday],ret->tm_mday,months[ret->tm_mon],1900+ret->tm_year,ret->tm_hour,ret->tm_min,ret->tm_sec); - osip_message_replace_header(msg,"Date",tmp); + /*cannot use strftime because it is locale dependant*/ + snprintf(tmp,sizeof(tmp)-1,"%s, %i %s %i %02i:%02i:%02i GMT", + days[ret->tm_wday],ret->tm_mday,months[ret->tm_mon],1900+ret->tm_year,ret->tm_hour,ret->tm_min,ret->tm_sec); + osip_message_replace_header(msg,"Date",tmp); } From 9aa335252136a56a21c83b83d5cf247c3ef49e70 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 30 Apr 2013 10:34:40 +0200 Subject: [PATCH 225/281] update ms2 and oRTP --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 89c644022..4ad5b7bec 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 89c644022b1dbf32be6afb08b0425bd4c788fc1b +Subproject commit 4ad5b7becb57b10775d024f89140c8c462c9de57 diff --git a/oRTP b/oRTP index bd64df514..8cf1bea6d 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit bd64df5148bdfd4a2ff5153927676fc497118279 +Subproject commit 8cf1bea6dfa66332cad995fc1c9f38b0b98d77c0 From 288fa8fd7d67820ad51b2ff1fb1a4bd583ecf3fd Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 30 Apr 2013 12:17:24 +0200 Subject: [PATCH 226/281] Update oRTP submodule. --- oRTP | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oRTP b/oRTP index 8cf1bea6d..2d8a82247 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 8cf1bea6dfa66332cad995fc1c9f38b0b98d77c0 +Subproject commit 2d8a82247fbebbd690ae2fc8300522ab9b71a542 From 0b03d319099ce66435b44b2ea1450c32eb782ce6 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 30 Apr 2013 15:30:30 +0200 Subject: [PATCH 227/281] Update ms2 submodule for NEON detection fix. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 4ad5b7bec..239be1a39 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 4ad5b7becb57b10775d024f89140c8c462c9de57 +Subproject commit 239be1a39fa3f4ab460e8e7ab6d4d3d31e15e72a From 4da039cd52a3258f6ce0c09a9a53da1026beadfb Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 3 May 2013 14:36:21 +0200 Subject: [PATCH 228/281] fix bug when comparing event name (there can be parameters) --- coreapi/sal_eXosip2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 222e7c329..0c1b12445 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1653,7 +1653,7 @@ static void process_notify(Sal *sal, eXosip_event_t *ev){ //osip_content_type_t *ct=NULL; osip_message_get_body(ev->request,0,&body); //ct=osip_message_get_content_type(ev->request); - if (h->hvalue && strcasecmp(h->hvalue,"refer")==0){ + if (h->hvalue && strncasecmp(h->hvalue,"refer",strlen("refer"))==0){ /*special handling of refer events*/ if (body && body->body){ osip_message_t *msg; From ca42ee87ded3fa4cbf44757f13e2f5537afbb498 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 6 May 2013 22:09:31 +0200 Subject: [PATCH 229/281] important conference bugfixes --- coreapi/conference.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/coreapi/conference.c b/coreapi/conference.c index c9d51b151..0d8ea39a0 100644 --- a/coreapi/conference.c +++ b/coreapi/conference.c @@ -182,7 +182,6 @@ float linphone_core_get_conference_local_input_volume(LinphoneCore *lc){ * @returns 0 if successful, -1 otherwise. **/ int linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call){ - LinphoneCallParams params; LinphoneConference *conf=&lc->conf_ctx; if (call->current_params.in_conference){ @@ -190,21 +189,25 @@ int linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call){ return -1; } conference_check_init(&lc->conf_ctx, lp_config_get_int(lc->config, "sound","conference_rate",16000)); - call->params.in_conference=TRUE; - call->params.has_video=FALSE; - call->params.media_encryption=LinphoneMediaEncryptionNone; - params=call->params; - if (call->state==LinphoneCallPaused) + + if (call->state==LinphoneCallPaused){ + call->params.in_conference=TRUE; + call->params.has_video=FALSE; linphone_core_resume_call(lc,call); - else if (call->state==LinphoneCallStreamsRunning){ - /*this will trigger a reINVITE that will later redraw the streams */ + }else if (call->state==LinphoneCallStreamsRunning){ + LinphoneCallParams *params=linphone_call_params_copy(linphone_call_get_current_params(call)); + params->in_conference=TRUE; + params->has_video=FALSE; + if (call->audiostream || call->videostream){ linphone_call_stop_media_streams (call); /*free the audio & video local resources*/ } if (call==lc->current_call){ lc->current_call=NULL; } - linphone_core_update_call(lc,call,¶ms); + /*this will trigger a reINVITE that will later redraw the streams */ + linphone_core_update_call(lc,call,params); + linphone_call_params_destroy(params); add_local_endpoint(conf,lc); }else{ ms_error("Call is in state %s, it cannot be added to the conference.",linphone_call_state_to_string(call->state)); @@ -231,13 +234,16 @@ static int remove_from_conference(LinphoneCore *lc, LinphoneCall *call, bool_t a ms_message("%s will be removed from conference", str); ms_free(str); if (active){ + LinphoneCallParams *params=linphone_call_params_copy(linphone_call_get_current_params(call)); + params->in_conference=FALSE; // reconnect local audio with this call if (linphone_core_is_in_conference(lc)){ ms_message("Leaving conference for reconnecting with unique call."); linphone_core_leave_conference(lc); } ms_message("Updating call to actually remove from conference"); - err=linphone_core_update_call(lc,call,&call->params); + err=linphone_core_update_call(lc,call,params); + linphone_call_params_destroy(params); } else{ ms_message("Pausing call to actually remove from conference"); err=_linphone_core_pause_call(lc,call); From bfd0d728ec6a185bfcb4d8836d611765f8bc45e2 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Tue, 7 May 2013 09:19:46 +0200 Subject: [PATCH 230/281] Update Czech translation Add patch for search in friendlist no case sensitive --- gtk/dscp_settings.ui | 2 +- gtk/friendlist.c | 6 +- po/cs.po | 346 ++++++++++++++++++++----------------------- 3 files changed, 166 insertions(+), 188 deletions(-) diff --git a/gtk/dscp_settings.ui b/gtk/dscp_settings.ui index 22679a49b..7f5061f72 100644 --- a/gtk/dscp_settings.ui +++ b/gtk/dscp_settings.ui @@ -5,7 +5,7 @@ False 5 - Dscp settings + DSCP settings True dialog diff --git a/gtk/friendlist.c b/gtk/friendlist.c index 8f73c2fcb..f7e683f95 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -513,7 +513,11 @@ static gboolean friend_search_func(GtkTreeModel *model, gint column, gboolean ret=TRUE; gtk_tree_model_get(model,iter,FRIEND_NAME,&name,-1); if (name!=NULL){ - ret=strstr(name,key)==NULL; + gchar *uname=g_utf8_casefold(name,-1); /* need that to perform case-insensitive search in utf8 */ + gchar *ukey=g_utf8_casefold(key,-1); + ret=strstr(uname,ukey)==NULL; + g_free(uname); + g_free(ukey); g_free(name); } return ret; diff --git a/po/cs.po b/po/cs.po index 233eddbcf..4c1cb6503 100644 --- a/po/cs.po +++ b/po/cs.po @@ -2,12 +2,13 @@ # This file is distributed under the same license as the linphone package. # Copyright (C) 2009 Simon Morlat (msgids) # Klara Cihlarova , 2005. -# Petr Pisar , 2006, 2007, 2008, 2009, 2010, 2011. +# Petr Pisar , 2006, 2007, 2008, 2009, 2010, 2011, 2013. # # XXX: Don't translate gtk-* messages. They will be replaced from GTK+ # catalogue. # # On hold → odložen +# chat → diskuze # Pause call → odložit hovor # Resume call → obnovit hovor # token → klíč @@ -15,10 +16,10 @@ # msgid "" msgstr "" -"Project-Id-Version: linphone-3.4.99.4\n" +"Project-Id-Version: linphone-3.5.99.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-04-24 14:04+0200\n" -"PO-Revision-Date: 2011-11-04 22:30+0100\n" +"POT-Creation-Date: 2013-04-08 16:59+0200\n" +"PO-Revision-Date: 2013-05-01 09:55+0200\n" "Last-Translator: Petr Pisar \n" "Language-Team: Czech \n" "Language: cs\n" @@ -38,49 +39,46 @@ msgid "Send text to %s" msgstr "Poslat text komu: %s" #: ../gtk/calllogs.c:223 -#, fuzzy, c-format +#, c-format msgid "Recent calls (%i)" -msgstr "Probíhá hovor" +msgstr "Nedávné hovory (%i)" #: ../gtk/calllogs.c:300 msgid "n/a" msgstr "–" #: ../gtk/calllogs.c:303 -#, fuzzy msgid "Aborted" -msgstr "přerušen" +msgstr "Přerušen" #: ../gtk/calllogs.c:306 -#, fuzzy msgid "Missed" -msgstr "promeškán" +msgstr "Zmeškán" #: ../gtk/calllogs.c:309 -#, fuzzy msgid "Declined" -msgstr "Odmítnout" +msgstr "Odmítnut" #: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%i minuta" +msgstr[1] "%i minuty" +msgstr[2] "%i minut" #: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%i sekunda" +msgstr[1] "%i sekundy" +msgstr[2] "%i sekund" #: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 #, c-format msgid "%s\t%s" -msgstr "" +msgstr "%s\t%s" #: ../gtk/calllogs.c:323 #, c-format @@ -88,6 +86,8 @@ msgid "" "%s\tQuality: %s\n" "%s\t%s\t" msgstr "" +"%s\tKvalita: %s\n" +"%s\t%s\t" #: ../gtk/calllogs.c:329 #, c-format @@ -95,6 +95,8 @@ msgid "" "%s\t\n" "%s" msgstr "" +"%s\t\n" +"%s" #: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" @@ -109,7 +111,7 @@ msgstr "Já" msgid "Couldn't find pixmap file: %s" msgstr "Nelze najít soubor s obrázkem: %s" -#: ../gtk/chat.c:336 ../gtk/friendlist.c:872 +#: ../gtk/chat.c:324 ../gtk/friendlist.c:872 msgid "Invalid sip contact !" msgstr "Neplatný sipový kontakt!" @@ -123,7 +125,7 @@ msgstr "Soubor, kam zapisovat protokol." #: ../gtk/main.c:106 msgid "Start linphone with video disabled." -msgstr "" +msgstr "Spustí linphone se zakázaným obrazem." #: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." @@ -176,11 +178,11 @@ msgstr "" msgid "Call error" msgstr "Chyba hovoru" -#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Hovor ukončen" -#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:239 msgid "Incoming call" msgstr "Příchozí hovor" @@ -197,14 +199,14 @@ msgid "Call paused" msgstr "Hovor odložen" #: ../gtk/main.c:1142 -#, fuzzy, c-format +#, c-format msgid "by %s" -msgstr "Porty" +msgstr "kým: %s" #: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" -msgstr "" +msgstr "%s navrhuje začít videohovor. Přijímáte?" #: ../gtk/main.c:1353 msgid "Website link" @@ -237,9 +239,8 @@ msgid "A free SIP video-phone" msgstr "Volný SIP videofon" #: ../gtk/friendlist.c:469 -#, fuzzy msgid "Add to addressbook" -msgstr "Zobrazit adresář" +msgstr "Přidat do adresáře" #: ../gtk/friendlist.c:643 msgid "Presence status" @@ -250,14 +251,12 @@ msgid "Name" msgstr "Jméno" #: ../gtk/friendlist.c:673 -#, fuzzy msgid "Call" -msgstr "Volat komu: %s" +msgstr "Zavolat" #: ../gtk/friendlist.c:678 -#, fuzzy msgid "Chat" -msgstr "Diskuzní skupina" +msgstr "Diskuze" #: ../gtk/friendlist.c:708 #, c-format @@ -275,9 +274,9 @@ msgid "Delete contact '%s'" msgstr "Odstranit kontakt „%s“" #: ../gtk/friendlist.c:926 -#, fuzzy, c-format +#, c-format msgid "Delete chat history of '%s'" -msgstr "Odstranit kontakt „%s“" +msgstr "Odstranit historii diskuze u kontaktu „%s“" #: ../gtk/friendlist.c:977 #, c-format @@ -378,20 +377,21 @@ msgstr "norština" #: ../gtk/propertybox.c:780 msgid "Hebrew" -msgstr "" +msgstr "hebrejština" #: ../gtk/propertybox.c:781 msgid "Serbian" -msgstr "" +msgstr "srbština" #: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "Aby se projevil výběr nového jazyka, je nutné znovu spustit linphone." +# Media encryption type: #: ../gtk/propertybox.c:934 msgid "None" -msgstr "Žádná" +msgstr "Žádné" #: ../gtk/propertybox.c:938 msgid "SRTP" @@ -451,23 +451,20 @@ msgstr "" "Tento průvodce vám pomůže používat sipový účet při vašich hovorech." #: ../gtk/setupwizard.c:43 -#, fuzzy msgid "Create an account on linphone.org" -msgstr "Vytvořit účet vybráním uživatelského jména" +msgstr "Vytvořit účet na linphone.org" #: ../gtk/setupwizard.c:44 -#, fuzzy msgid "I have already a linphone.org account and I just want to use it" -msgstr "Účet již mám a chci jej použít" +msgstr "Účet na linphone.org již mám a chci jej použít" #: ../gtk/setupwizard.c:45 -#, fuzzy msgid "I have already a sip account and I just want to use it" -msgstr "Účet již mám a chci jej použít" +msgstr "SIP účet již mám a chci jej použít" #: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" -msgstr "" +msgstr "Zadejte uživatelské jméno na linphone.org" #: ../gtk/setupwizard.c:92 msgid "Username:" @@ -479,53 +476,52 @@ msgstr "Heslo:" #: ../gtk/setupwizard.c:114 msgid "Enter your account informations" -msgstr "" +msgstr "Zadejte údaje o vašem účtu" #: ../gtk/setupwizard.c:121 -#, fuzzy msgid "Username*" -msgstr "Uživatelské jméno" +msgstr "Uživatelské jméno*" #: ../gtk/setupwizard.c:122 -#, fuzzy msgid "Password*" -msgstr "Heslo" +msgstr "Heslo*" #: ../gtk/setupwizard.c:125 msgid "Domain*" -msgstr "" +msgstr "Doména*" #: ../gtk/setupwizard.c:126 msgid "Proxy" -msgstr "" +msgstr "Proxy" #: ../gtk/setupwizard.c:298 msgid "(*) Required fields" -msgstr "" +msgstr "(*) Povinné položky" #: ../gtk/setupwizard.c:299 -#, fuzzy msgid "Username: (*)" -msgstr "Uživatelské jméno:" +msgstr "Uživatelské jméno: (*)" #: ../gtk/setupwizard.c:301 -#, fuzzy msgid "Password: (*)" -msgstr "Heslo:" +msgstr "Heslo: (*)" #: ../gtk/setupwizard.c:303 msgid "Email: (*)" -msgstr "" +msgstr "E-mail: (*)" #: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" -msgstr "" +msgstr "Potvrďte heslo: (*)" #: ../gtk/setupwizard.c:369 msgid "" "Error, account not validated, username already used or server unreachable.\n" "Please go back and try again." msgstr "" +"Došlo k chybě (účet nebyl ověřen, uživatelské jméno již existuje nebo server " +"není dostupný).\n" +"Prosím, vraťte se a zkoste to znovu." #: ../gtk/setupwizard.c:380 msgid "Thank you. Your account is now configured and ready for use." @@ -537,6 +533,9 @@ msgid "" "email.\n" "Then come back here and press Next button." msgstr "" +"Prosím, ověřte svůj účet tak, že kliknete na odkaz, který jsme vám právě " +"zaslali e-mailem.\n" +"Pak se sem vraťte a stiskněte tlačítko Další." #: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" @@ -547,31 +546,28 @@ msgid "Account setup assistant" msgstr "Průvodce nastavením účtu" #: ../gtk/setupwizard.c:575 -#, fuzzy msgid "Configure your account (step 1/1)" -msgstr "Nastavit SIP účet" +msgstr "Nastavit účet (krok 1/1)" #: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" -msgstr "" +msgstr "Zadejte vaše sipové uživatelské jméno (krok 1/1)" #: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" -msgstr "" +msgstr "Zadejte údaje o účtu (krok 1/2)" #: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" -msgstr "" +msgstr "Ověření (krok 2/2)" #: ../gtk/setupwizard.c:598 -#, fuzzy msgid "Error" -msgstr "Chyba." +msgstr "Chyba" #: ../gtk/setupwizard.c:602 -#, fuzzy msgid "Terminating" -msgstr "Ukončit hovor" +msgstr "Ukončuje se" #: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 #, c-format @@ -584,62 +580,56 @@ msgid "Transfer to call #%i with %s" msgstr "Přepojit hovor č. %i s %s" #: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 -#, fuzzy msgid "Not used" -msgstr "Nenalezeno" +msgstr "Nepoužito" #: ../gtk/incall_view.c:220 msgid "ICE not activated" -msgstr "" +msgstr "ICE není zapnuto" #: ../gtk/incall_view.c:222 -#, fuzzy msgid "ICE failed" -msgstr "Filtr ICE" +msgstr "ICE selhalo" #: ../gtk/incall_view.c:224 msgid "ICE in progress" -msgstr "" +msgstr "Probíhá ICE" #: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" -msgstr "" +msgstr "Prochází se jedním nebo více NATy" #: ../gtk/incall_view.c:228 -#, fuzzy msgid "Direct" -msgstr "Přesměrováno" +msgstr "Přímé" #: ../gtk/incall_view.c:230 msgid "Through a relay server" -msgstr "" +msgstr "Skrze relay server" #: ../gtk/incall_view.c:238 msgid "uPnP not activated" -msgstr "" +msgstr "UPnP není zapnuto" #: ../gtk/incall_view.c:240 -#, fuzzy msgid "uPnP in progress" -msgstr "Hledá se adresa pomocí STUN…" +msgstr "Probíhá UPnP" #: ../gtk/incall_view.c:242 -#, fuzzy msgid "uPnp not available" -msgstr "nedostupná" +msgstr "UPnP není nedostupné" #: ../gtk/incall_view.c:244 msgid "uPnP is running" -msgstr "" +msgstr "UPnP běží" #: ../gtk/incall_view.c:246 -#, fuzzy msgid "uPnP failed" -msgstr "Filtr ICE" +msgstr "UPnP selhalo" #: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 msgid "Direct or through server" -msgstr "" +msgstr "Přímé nebo skrze server" #: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format @@ -647,15 +637,17 @@ msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" +"příchozí: %f\n" +"odchozí: %f (kb/s)" #: ../gtk/incall_view.c:286 #, c-format msgid "%.3f seconds" -msgstr "" +msgstr "%.3f sekund" #: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" -msgstr "" +msgstr "Zavěsit" #: ../gtk/incall_view.c:476 msgid "Calling..." @@ -695,20 +687,20 @@ msgstr "nedostupná" #: ../gtk/incall_view.c:651 msgid "Secured by SRTP" -msgstr "" +msgstr "Zabezpečeno pomocí SRTP" #: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" -msgstr "" +msgstr "Zabezpečeno pomocí ZRTP – [ověřovací klíč: %s]" #: ../gtk/incall_view.c:663 msgid "Set unverified" -msgstr "" +msgstr "Nastavit na neověřeno" #: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" -msgstr "" +msgstr "Nastavit na ověřeno" #: ../gtk/incall_view.c:684 msgid "In conference" @@ -733,17 +725,15 @@ msgstr "Hovor skončil." #: ../gtk/incall_view.c:778 msgid "Transfer in progress" -msgstr "" +msgstr "Probíhá přepojení" #: ../gtk/incall_view.c:781 -#, fuzzy msgid "Transfer done." -msgstr "Přepojit" +msgstr "Přepojení dokončeno." #: ../gtk/incall_view.c:784 -#, fuzzy msgid "Transfer failed." -msgstr "Přepojit" +msgstr "Přepojení selhalo." #: ../gtk/incall_view.c:828 msgid "Resume" @@ -759,11 +749,12 @@ msgid "" "Recording into\n" "%s %s" msgstr "" +"Nahrává se do\n" +"%s %s" #: ../gtk/incall_view.c:900 -#, fuzzy msgid "(Paused)" -msgstr "Odložit" +msgstr "(Odloženo)" #: ../gtk/loginframe.c:93 #, c-format @@ -779,21 +770,20 @@ msgid "Send" msgstr "Odeslat" #: ../gtk/main.ui.h:3 -#, fuzzy msgid "End conference" -msgstr "Probíhá konference" +msgstr "Ukončit konferenci" #: ../gtk/main.ui.h:7 msgid "Record this call to an audio file" -msgstr "" +msgstr "Nahrát tento hovor do zvukového souboru" #: ../gtk/main.ui.h:8 msgid "Video" -msgstr "" +msgstr "Obraz" #: ../gtk/main.ui.h:10 msgid "Mute" -msgstr "" +msgstr "Ztišit" #: ../gtk/main.ui.h:11 msgid "Transfer" @@ -817,7 +807,7 @@ msgstr "V_olby" #: ../gtk/main.ui.h:18 msgid "Always start video" -msgstr "" +msgstr "Vždy spustit obraz" #: ../gtk/main.ui.h:19 msgid "Enable self-view" @@ -840,9 +830,8 @@ msgid "Check _Updates" msgstr "Vyhledat akt_ualizace" #: ../gtk/main.ui.h:24 -#, fuzzy msgid "Account assistant" -msgstr "Průvodce nastavením účtu" +msgstr "Průvodce účtem" #: ../gtk/main.ui.h:25 msgid "SIP address or phone number:" @@ -930,7 +919,7 @@ msgstr "Výchozí" #: ../gtk/main.ui.h:46 msgid "Delete" -msgstr "" +msgstr "Smazat" #: ../gtk/about.ui.h:1 msgid "About linphone" @@ -992,7 +981,7 @@ msgstr "Ladicí okno Linphonu" #: ../gtk/log.ui.h:2 msgid "Scroll to end" -msgstr "" +msgstr "Přejít na konec" #: ../gtk/password.ui.h:1 msgid "Linphone - Authentication required" @@ -1052,7 +1041,7 @@ msgstr "Registrační období (s):" #: ../gtk/sip_account.ui.h:9 msgid "Register" -msgstr "" +msgstr "Zaregistrovat se" #: ../gtk/sip_account.ui.h:10 msgid "Publish presence information" @@ -1136,20 +1125,20 @@ msgstr "Zvukový RTP/UDP:" #: ../gtk/parameters.ui.h:19 msgid "DSCP fields" -msgstr "" +msgstr "Položky DSCP" +# Port number #: ../gtk/parameters.ui.h:20 msgid "Fixed" -msgstr "" +msgstr "Stálý" #: ../gtk/parameters.ui.h:21 msgid "Tunnel" -msgstr "" +msgstr "Tunel" #: ../gtk/parameters.ui.h:22 -#, fuzzy msgid "Media encryption is mandatory" -msgstr "Druh šifrování médií" +msgstr "Šifrování médií je povinné" #: ../gtk/parameters.ui.h:23 msgid "Network protocol and ports" @@ -1172,14 +1161,12 @@ msgid "Behind NAT / Firewall (use STUN to resolve)" msgstr "Za NAT/firewallem (adresu určí STUN)" #: ../gtk/parameters.ui.h:28 -#, fuzzy msgid "Behind NAT / Firewall (use ICE)" -msgstr "Za NAT/firewallem (adresu určí STUN)" +msgstr "Za NAT/firewallem (adresu určí ICE)" #: ../gtk/parameters.ui.h:29 -#, fuzzy msgid "Behind NAT / Firewall (use uPnP)" -msgstr "Za NAT/firewallem (adresu určí STUN)" +msgstr "Za NAT/firewallem (adresu určí UPnP)" #: ../gtk/parameters.ui.h:30 msgid "Stun server:" @@ -1259,7 +1246,7 @@ msgstr "Implicitní totožnost" #: ../gtk/parameters.ui.h:49 msgid "Wizard" -msgstr "" +msgstr "Průvodce" #: ../gtk/parameters.ui.h:52 msgid "Remove" @@ -1307,7 +1294,7 @@ msgstr "Omezení příchozí rychlosti (kb/s):" #: ../gtk/parameters.ui.h:63 msgid "Enable adaptive rate control" -msgstr "Zapnout přizpůsobující řízení rychlosti" +msgstr "Zapnout přizpůsobující se řízení rychlosti" #: ../gtk/parameters.ui.h:64 msgid "" @@ -1366,91 +1353,80 @@ msgid "Please wait" msgstr "Prosím, čekejte" #: ../gtk/dscp_settings.ui.h:1 -#, fuzzy msgid "Dscp settings" -msgstr "Nastavení" +msgstr "Nastavení DSCP" #: ../gtk/dscp_settings.ui.h:2 msgid "SIP" msgstr "SIP" #: ../gtk/dscp_settings.ui.h:3 -#, fuzzy msgid "Audio RTP stream" -msgstr "Převzorkování zvuku" +msgstr "RTP proud zvuku" #: ../gtk/dscp_settings.ui.h:4 -#, fuzzy msgid "Video RTP stream" -msgstr "Obrazový RTP/UDP:" +msgstr "RTP proud obrazu" #: ../gtk/dscp_settings.ui.h:5 msgid "Set DSCP values (in hexadecimal)" -msgstr "" +msgstr "Nastavit hodnoty DSCP (šestnáctkově)" #: ../gtk/call_statistics.ui.h:1 -#, fuzzy msgid "Call statistics" -msgstr "Informace o hovoru" +msgstr "Statistické údaje o hovoru" #: ../gtk/call_statistics.ui.h:2 -#, fuzzy msgid "Audio codec" -msgstr "Kodeky zvuku" +msgstr "Kodek zvuku" #: ../gtk/call_statistics.ui.h:3 -#, fuzzy msgid "Video codec" -msgstr "Kodeky obrazu" +msgstr "Kodek obrazu" #: ../gtk/call_statistics.ui.h:4 msgid "Audio IP bandwidth usage" -msgstr "" +msgstr "Přenosová rychlost zvuku na úrovni IP" #: ../gtk/call_statistics.ui.h:5 -#, fuzzy msgid "Audio Media connectivity" -msgstr "Druh šifrování médií" +msgstr "Zvukové spojení" #: ../gtk/call_statistics.ui.h:6 msgid "Video IP bandwidth usage" -msgstr "" +msgstr "Přenosová rychlost obrazu na úrovni IP" #: ../gtk/call_statistics.ui.h:7 -#, fuzzy msgid "Video Media connectivity" -msgstr "Druh šifrování médií" +msgstr "Obrazové spojení" #: ../gtk/call_statistics.ui.h:8 -#, fuzzy msgid "Round trip time" -msgstr "Vlastnosti zvuku" +msgstr "Odezva" #: ../gtk/call_statistics.ui.h:9 -#, fuzzy msgid "Call statistics and information" -msgstr "Informace o kontaktu" +msgstr "Statistické a ostatní údaje o hovoru" #: ../gtk/tunnel_config.ui.h:1 -#, fuzzy msgid "Configure VoIP tunnel" -msgstr "Nastavit SIP účet" +msgstr "Nastavit VoIP tunel" #: ../gtk/tunnel_config.ui.h:2 msgid "Host" -msgstr "" +msgstr "Stroj" #: ../gtk/tunnel_config.ui.h:3 msgid "Port" -msgstr "" +msgstr "Port" #: ../gtk/tunnel_config.ui.h:6 msgid "Configure tunnel" -msgstr "" +msgstr "Nastavit tunel" #: ../gtk/tunnel_config.ui.h:9 msgid "Configure http proxy (optional)" -msgstr "" +msgstr "Nastavit HTTP proxy (volitelné)" #: ../gtk/keypad.ui.h:1 msgid "D" @@ -1512,19 +1488,19 @@ msgstr "2" msgid "1" msgstr "1" -#: ../coreapi/linphonecore.c:228 +#: ../coreapi/linphonecore.c:227 msgid "aborted" msgstr "přerušen" -#: ../coreapi/linphonecore.c:231 +#: ../coreapi/linphonecore.c:230 msgid "completed" msgstr "dokončen" -#: ../coreapi/linphonecore.c:234 +#: ../coreapi/linphonecore.c:233 msgid "missed" msgstr "promeškán" -#: ../coreapi/linphonecore.c:239 +#: ../coreapi/linphonecore.c:238 #, c-format msgid "" "%s at %s\n" @@ -1539,70 +1515,70 @@ msgstr "" "Stav: %s\n" "Délka: %i min %i s\n" -#: ../coreapi/linphonecore.c:240 +#: ../coreapi/linphonecore.c:239 msgid "Outgoing call" msgstr "Odchozí hovor" -#: ../coreapi/linphonecore.c:1321 +#: ../coreapi/linphonecore.c:1312 msgid "Ready" msgstr "Připraven." -#: ../coreapi/linphonecore.c:2205 +#: ../coreapi/linphonecore.c:2184 msgid "Looking for telephone number destination..." msgstr "Vyhledává se umístění čísla…" -#: ../coreapi/linphonecore.c:2208 +#: ../coreapi/linphonecore.c:2187 msgid "Could not resolve this number." msgstr "Toto číslo nelze vyhledat." -#: ../coreapi/linphonecore.c:2252 +#: ../coreapi/linphonecore.c:2231 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "" "Špatně zadaná SIP adresa. Adresa má mít tento formát " -#: ../coreapi/linphonecore.c:2453 +#: ../coreapi/linphonecore.c:2432 msgid "Contacting" -msgstr "Kontaktuji" +msgstr "Navazuje se spojení" -#: ../coreapi/linphonecore.c:2460 +#: ../coreapi/linphonecore.c:2439 msgid "Could not call" msgstr "Nelze volat" -#: ../coreapi/linphonecore.c:2570 +#: ../coreapi/linphonecore.c:2549 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Je nám líto, ale byl dosažen maximální počet současných hovorů." -#: ../coreapi/linphonecore.c:2752 +#: ../coreapi/linphonecore.c:2731 msgid "is contacting you" msgstr "vás volá" -#: ../coreapi/linphonecore.c:2753 +#: ../coreapi/linphonecore.c:2732 msgid " and asked autoanswer." msgstr " a požaduje automatickou zvednutí." -#: ../coreapi/linphonecore.c:2753 +#: ../coreapi/linphonecore.c:2732 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2820 +#: ../coreapi/linphonecore.c:2799 msgid "Modifying call parameters..." msgstr "Upravují se parametry hovoru…" -#: ../coreapi/linphonecore.c:3159 +#: ../coreapi/linphonecore.c:3138 msgid "Connected." msgstr "Připojeno." -#: ../coreapi/linphonecore.c:3187 +#: ../coreapi/linphonecore.c:3166 msgid "Call aborted" msgstr "Hovor přerušen" -#: ../coreapi/linphonecore.c:3378 +#: ../coreapi/linphonecore.c:3357 msgid "Could not pause the call" msgstr "Hovor nebylo možné odložit" -#: ../coreapi/linphonecore.c:3383 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "Současný hovor se odkládá…" @@ -1636,11 +1612,11 @@ msgstr "Hledá se adresa pomocí STUN…" #: ../coreapi/misc.c:630 msgid "ICE local candidates gathering in progress..." -msgstr "" +msgstr "Shromažďují se místní kandidáti ICE…" #: ../coreapi/friend.c:33 msgid "Online" -msgstr "Připojeno" +msgstr "Připojen" #: ../coreapi/friend.c:36 msgid "Busy" @@ -1668,19 +1644,19 @@ msgstr "Nerušit" #: ../coreapi/friend.c:54 msgid "Moved" -msgstr "Přestěhoval se" +msgstr "Přestěhoval jsem se" #: ../coreapi/friend.c:57 msgid "Using another messaging service" -msgstr "Používá jinou službu přenosu zpráv" +msgstr "Používám jinou službu přenosu zpráv" #: ../coreapi/friend.c:60 msgid "Offline" -msgstr "Odpojeno" +msgstr "Odpojen" #: ../coreapi/friend.c:63 msgid "Pending" -msgstr "Čeká" +msgstr "Čekám" #: ../coreapi/friend.c:66 msgid "Unknown-bug" @@ -1691,7 +1667,7 @@ msgid "" "The sip proxy address you entered is invalid, it must start with \"sip:\" " "followed by a hostname." msgstr "" -"Adresa SIP proxy, kterou jste zadali, není platná. Musí začínat na „sip:“ a " +"Adresa SIP proxy, kterou jste zadali, není platná. Musí začínat na „sip:“ a " "pak musí následovat jméno stroje." #: ../coreapi/proxy.c:210 @@ -1740,21 +1716,19 @@ msgstr "Hovor přijat kým: %s." #: ../coreapi/callbacks.c:412 msgid "Incompatible, check codecs or security settings..." -msgstr "" +msgstr "Není slučitelné. Zkontrolujte nastavení kodeků a zabezpečení…" #: ../coreapi/callbacks.c:460 -#, fuzzy msgid "We have been resumed." -msgstr "Byli jsme obnoveni…" +msgstr "Byli jsme obnoveni." #: ../coreapi/callbacks.c:469 msgid "We are paused by other party." -msgstr "" +msgstr "Byli jsme odloženi protistranou." #: ../coreapi/callbacks.c:475 -#, fuzzy msgid "Call is updated by remote." -msgstr "Hovor byl aktualizován protistranou…" +msgstr "Hovor byl aktualizován protistranou." #: ../coreapi/callbacks.c:544 msgid "Call terminated." @@ -1791,7 +1765,7 @@ msgstr "Přesměrováno" #: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." -msgstr "" +msgstr "Neslučitelné parametry médií." #: ../coreapi/callbacks.c:633 msgid "Call failed." @@ -1821,7 +1795,7 @@ msgstr "Registrace na %s selhala: %s" msgid "Authentication token is %s" msgstr "Klíč k ověření totožnosti je %s" -#: ../coreapi/linphonecall.c:2355 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." From f9236d1a0be70edcba7db7e8c51271d83b208f25 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Tue, 7 May 2013 11:49:54 +0200 Subject: [PATCH 231/281] Fix bug report --- console/linphonec.c | 3 +++ coreapi/message_storage.c | 4 ++-- coreapi/sal_eXosip2.c | 1 + coreapi/sal_eXosip2_sdp.c | 2 +- gtk/incall_view.c | 3 ++- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/console/linphonec.c b/console/linphonec.c index fca5a9b86..60c3c2af1 100644 --- a/console/linphonec.c +++ b/console/linphonec.c @@ -1400,6 +1400,7 @@ copy_file(const char *from, const char *to) snprintf(message, 255, "Can't open %s for writing: %s\n", to, strerror(errno)); fprintf(stderr, "%s", message); + fclose(in); return 0; } @@ -1408,6 +1409,8 @@ copy_file(const char *from, const char *to) { if ( ! fwrite(buf, 1, n, out) ) { + fclose(in); + fclose(out); return 0; } } diff --git a/coreapi/message_storage.c b/coreapi/message_storage.c index 8ba642b68..deed140c7 100644 --- a/coreapi/message_storage.c +++ b/coreapi/message_storage.c @@ -204,13 +204,13 @@ void linphone_create_table(sqlite3* db){ void linphone_core_message_storage_init(LinphoneCore *lc){ int ret; - char *errmsg=NULL; + const char *errmsg; sqlite3 *db; ret=sqlite3_open(lc->chat_db_file,&db); if(ret != SQLITE_OK) { + errmsg=sqlite3_errmsg(db); printf("Error in the opening: %s.\n", errmsg); sqlite3_close(db); - sqlite3_free(errmsg); } linphone_create_table(db); lc->db=db; diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 0c1b12445..284773c9d 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1464,6 +1464,7 @@ static bool_t call_failure(Sal *sal, eXosip_event_t *ev){ case 480: error=SalErrorFailure; sr=SalReasonTemporarilyUnavailable; + break; case 486: error=SalErrorFailure; sr=SalReasonBusy; diff --git a/coreapi/sal_eXosip2_sdp.c b/coreapi/sal_eXosip2_sdp.c index debd8550f..54865aab6 100644 --- a/coreapi/sal_eXosip2_sdp.c +++ b/coreapi/sal_eXosip2_sdp.c @@ -547,7 +547,7 @@ int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){ for (k=0;valid_count < SAL_CRYPTO_ALGO_MAX && (attr=sdp_message_attribute_get(msg,i,k))!=NULL;k++){ char tmp[256], tmp2[256]; if (keywordcmp("crypto",attr->a_att_field)==0 && attr->a_att_value!=NULL){ - int nb = sscanf(attr->a_att_value, "%d %256s inline:%256s", + int nb = sscanf(attr->a_att_value, "%d %255s inline:%255s", &stream->crypto[valid_count].tag, tmp, tmp2); diff --git a/gtk/incall_view.c b/gtk/incall_view.c index 5e13f2602..da954a45b 100644 --- a/gtk/incall_view.c +++ b/gtk/incall_view.c @@ -741,11 +741,12 @@ static gboolean in_call_view_terminated(LinphoneCall *call){ void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_msg){ GtkWidget *callview=(GtkWidget*)linphone_call_get_user_pointer(call); + if(callview==NULL) return; GtkWidget *status=linphone_gtk_get_widget(callview,"in_call_status"); guint taskid=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(callview),"taskid")); gboolean in_conf=linphone_call_params_local_conference_mode(linphone_call_get_current_params(call)); - if ((callview==NULL) || (status==NULL)) return; + if (status==NULL) return; if (error_msg==NULL) gtk_label_set_markup(GTK_LABEL(status),_("Call ended.")); else{ From 12a3d795131ab1b367ae000f8b70f9b8af684df6 Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Thu, 9 May 2013 21:48:20 +0200 Subject: [PATCH 232/281] AAC-EL: fix SDP/fmtp content according to new recommendation from Fraunhofer --- coreapi/linphonecore.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index bb2b4a83c..12c8880b6 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1285,8 +1285,8 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta linphone_core_assign_payload_type(lc,&payload_type_silk_wb,-1,NULL); linphone_core_assign_payload_type(lc,&payload_type_silk_swb,-1,NULL); linphone_core_assign_payload_type(lc,&payload_type_g729,18,"annexb=no"); - linphone_core_assign_payload_type(lc,&payload_type_aaceld_22k,-1,"config=F8EE2000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=24; sizeLength=13; streamType=5"); - linphone_core_assign_payload_type(lc,&payload_type_aaceld_44k,-1,"config=F8E82000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=24; sizeLength=13; streamType=5"); + linphone_core_assign_payload_type(lc,&payload_type_aaceld_22k,-1,"config=F8EE2000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=76; sizeLength=13; streamType=5"); + linphone_core_assign_payload_type(lc,&payload_type_aaceld_44k,-1,"config=F8E82000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=76; sizeLength=13; streamType=5"); linphone_core_handle_static_payloads(lc); ms_init(); From 5f0d5793b7e65a518076de6f8e253770503f8824 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 10 May 2013 15:05:42 +0200 Subject: [PATCH 233/281] - do not register outside of tunnel when tunnel is activated but not yet connected. - move TUNNEL_ENABLED to config.h, which avoids recompilation issues with -D flags. --- configure.ac | 4 +- coreapi/TunnelManager.cc | 7 +- coreapi/TunnelManager.hh | 3 +- coreapi/linphone_tunnel.cc | 4 + coreapi/linphone_tunnel.h | 6 + coreapi/linphone_tunnel_stubs.c | 4 + coreapi/proxy.c | 411 ++++++++++++++++---------------- 7 files changed, 233 insertions(+), 206 deletions(-) diff --git a/configure.ac b/configure.ac index 7bc526bbb..5bd0570cc 100644 --- a/configure.ac +++ b/configure.ac @@ -656,9 +656,7 @@ AC_ARG_ENABLE(tunnel, AM_CONDITIONAL(BUILD_TUNNEL, test x$enable_tunnel = xtrue) if test x$enable_tunnel = xtrue; then PKG_CHECK_MODULES(TUNNEL, tunnel >= 0.3.3) - TUNNEL_CFLAGS+="-DTUNNEL_ENABLED" - AC_SUBST(TUNNEL_CFLAGS) - AC_SUBST(TUNNEL_LIBS) + AC_DEFINE(TUNNEL_ENABLED,1,[Tells tunnel extension is built-in]) fi AC_ARG_ENABLE(msg-storage, diff --git a/coreapi/TunnelManager.cc b/coreapi/TunnelManager.cc index d1020b1b2..409f9c42a 100644 --- a/coreapi/TunnelManager.cc +++ b/coreapi/TunnelManager.cc @@ -189,7 +189,7 @@ bool TunnelManager::isStarted() { } bool TunnelManager::isReady() const { - return mTunnelClient && mTunnelClient->isReady(); + return mTunnelClient && mTunnelClient->isReady() && mReady; } int TunnelManager::customSendto(struct _RtpTransport *t, mblk_t *msg , int flags, const struct sockaddr *to, socklen_t tolen){ @@ -214,6 +214,7 @@ TunnelManager::TunnelManager(LinphoneCore* lc) :TunnelClientController() ,mEnabled(false) ,mTunnelClient(NULL) ,mAutoDetectStarted(false) +,mReady(false) ,mHttpProxyPort(0){ mExosipTransport.data=this; @@ -271,6 +272,7 @@ void TunnelManager::processTunnelEvent(const Event &ev){ if (lProxy) { linphone_proxy_config_done(lProxy); } + mReady=true; }else if (mEnabled && !mTunnelClient->isReady()){ /* we got disconnected from the tunnel */ if (lProxy && linphone_proxy_config_is_registered(lProxy)) { @@ -278,6 +280,7 @@ void TunnelManager::processTunnelEvent(const Event &ev){ linphone_proxy_config_edit(lProxy); linphone_core_iterate(mCore); } + mReady=false; } } @@ -317,7 +320,7 @@ void TunnelManager::enable(bool isEnable) { mEnabled=false; stopClient(); - + mReady=false; linphone_core_set_rtp_transport_factories(mCore,NULL); eXosip_transport_hook_register(NULL); diff --git a/coreapi/TunnelManager.hh b/coreapi/TunnelManager.hh index d4c1458fc..113f76786 100644 --- a/coreapi/TunnelManager.hh +++ b/coreapi/TunnelManager.hh @@ -129,6 +129,7 @@ class UdpMirrorClient; */ LinphoneCore *getLinphoneCore(); virtual void setHttpProxy(const char *host,int port, const char *username, const char *passwd); + virtual bool isReady() const; private: enum EventType{ UdpMirrorClientEvent, @@ -143,7 +144,6 @@ class UdpMirrorClient; }; typedef std::list UdpMirrorClientList; virtual bool isStarted(); - virtual bool isReady() const; void onIterate(); static int customSendto(struct _RtpTransport *t, mblk_t *msg , int flags, const struct sockaddr *to, socklen_t tolen); static int customRecvfrom(struct _RtpTransport *t, mblk_t *msg, int flags, struct sockaddr *from, socklen_t *fromlen); @@ -173,6 +173,7 @@ class UdpMirrorClient; Mutex mMutex; static Mutex sMutex; bool mAutoDetectStarted; + bool mReady; LinphoneRtpTransportFactories mTransportFactories; std::string mHttpUserName; std::string mHttpPasswd; diff --git a/coreapi/linphone_tunnel.cc b/coreapi/linphone_tunnel.cc index f0de56694..079074aa8 100644 --- a/coreapi/linphone_tunnel.cc +++ b/coreapi/linphone_tunnel.cc @@ -233,6 +233,10 @@ bool_t linphone_tunnel_enabled(LinphoneTunnel *tunnel){ return bcTunnel(tunnel)->isEnabled(); } +bool_t linphone_tunnel_connected(LinphoneTunnel *tunnel){ + return bcTunnel(tunnel)->isReady(); +} + static OrtpLogFunc tunnelOrtpLogHandler=NULL; /* diff --git a/coreapi/linphone_tunnel.h b/coreapi/linphone_tunnel.h index e42a054dc..f02baab54 100644 --- a/coreapi/linphone_tunnel.h +++ b/coreapi/linphone_tunnel.h @@ -165,6 +165,12 @@ void linphone_tunnel_enable(LinphoneTunnel *tunnel, bool_t enabled); **/ bool_t linphone_tunnel_enabled(LinphoneTunnel *tunnel); +/** + * @param tunnel object + * Returns a boolean indicating whether tunnel is connected successfully. +**/ +bool_t linphone_tunnel_connected(LinphoneTunnel *tunnel); + /** * @param tunnel object * Forces reconnection to the tunnel server. diff --git a/coreapi/linphone_tunnel_stubs.c b/coreapi/linphone_tunnel_stubs.c index 0560b3956..0865704a0 100644 --- a/coreapi/linphone_tunnel_stubs.c +++ b/coreapi/linphone_tunnel_stubs.c @@ -59,6 +59,10 @@ bool_t linphone_tunnel_enabled(LinphoneTunnel *tunnel){ return FALSE; } +bool_t linphone_tunnel_connected(LinphoneTunnel *tunnel){ + return FALSE; +} + void linphone_tunnel_enable_logs_with_handler(LinphoneTunnel *tunnel, bool_t enabled, OrtpLogFunc logHandler){ } diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 42c21f01b..05258c1d1 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -413,7 +413,7 @@ static dial_plan_t const dial_plans[]={ {"Bahrain" ,"BH" , "973" , 8 , "00" }, {"Bangladesh" ,"BD" , "880" , 10 , "00" }, {"Barbados" ,"BB" , "1" , 10 , "011" }, - {"Belarus" ,"BY" , "375" , 9 , "00" }, + {"Belarus" ,"BY" , "375" , 9 , "00" }, {"Belgium" ,"BE" , "32" , 9 , "00" }, {"Belize" ,"BZ" , "501" , 7 , "00" }, {"Benin" ,"BJ" , "229" , 8 , "00" }, @@ -422,12 +422,12 @@ static dial_plan_t const dial_plans[]={ {"Bolivia" ,"BO" , "591" , 8 , "00" }, {"Bosnia and Herzegovina" ,"BA" , "387" , 8 , "00" }, {"Botswana" ,"BW" , "267" , 8 , "00" }, - {"Brazil" ,"BR" , "55" , 10 , "00" }, + {"Brazil" ,"BR" , "55" , 10 , "00" }, {"Brunei Darussalam" ,"BN" , "673" , 7 , "00" }, {"Bulgaria" ,"BG" , "359" , 9 , "00" }, {"Burkina Faso" ,"BF" , "226" , 8 , "00" }, {"Burundi" ,"BI" , "257" , 8 , "011" }, - {"Cambodia" ,"KH" , "855" , 9 , "00" }, + {"Cambodia" ,"KH" , "855" , 9 , "00" }, {"Cameroon" ,"CM" , "237" , 8 , "00" }, {"Canada" ,"CA" , "1" , 10 , "011" }, {"Cape Verde" ,"CV" , "238" , 7 , "00" }, @@ -436,188 +436,188 @@ static dial_plan_t const dial_plans[]={ {"Chad" ,"TD" , "235" , 8 , "00" }, {"Chile" ,"CL" , "56" , 9 , "00" }, {"China" ,"CN" , "86" , 11 , "00" }, - {"Colombia" ,"CO" , "57" , 10 , "00" }, - {"Comoros" ,"KM" , "269" , 7 , "00" }, - {"Congo" ,"CG" , "242" , 9 , "00" }, - {"Congo Democratic Republic" ,"CD" , "243" , 9 , "00" }, - {"Cook Islands" ,"CK" , "682" , 5 , "00" }, - {"Costa Rica" ,"CR" , "506" , 8 , "00" }, - {"C�te d'Ivoire" ,"AD" , "225" , 8 , "00" }, - {"Croatia" ,"HR" , "385" , 9 , "00" }, - {"Cuba" ,"CU" , "53" , 8 , "119" }, - {"Cyprus" ,"CY" , "357" , 8 , "00" }, - {"Czech Republic" ,"CZ" , "420" , 9 , "00" }, - {"Denmark" ,"DK" , "45" , 8 , "00" }, - {"Djibouti" ,"DJ" , "253" , 8 , "00" }, - {"Dominica" ,"DM" , "1" , 10 , "011" }, - {"Dominican Republic" ,"DO" , "1" , 10 , "011" }, - {"Ecuador" ,"EC" , "593" , 9 , "00" }, - {"Egypt" ,"EG" , "20" , 10 , "00" }, - {"El Salvador" ,"SV" , "503" , 8 , "00" }, - {"Equatorial Guinea" ,"GQ" , "240" , 9 , "00" }, - {"Eritrea" ,"ER" , "291" , 7 , "00" }, - {"Estonia" ,"EE" , "372" , 8 , "00" }, - {"Ethiopia" ,"ET" , "251" , 9 , "00" }, - {"Falkland Islands" ,"FK" , "500" , 5 , "00" }, - {"Faroe Islands" ,"FO" , "298" , 6 , "00" }, - {"Fiji" ,"FJ" , "679" , 7 , "00" }, - {"Finland" ,"FI" , "358" , 9 , "00" }, - {"France" ,"FR" , "33" , 9 , "00" }, - {"French Guiana" ,"GF" , "594" , 9 , "00" }, - {"French Polynesia" ,"PF" , "689" , 6 , "00" }, - {"Gabon" ,"GA" , "241" , 8 , "00" }, - {"Gambia" ,"GM" , "220" , 7 , "00" }, - {"Georgia" ,"GE" , "995" , 9 , "00" }, - {"Germany" ,"DE" , "49" , 11 , "00" }, - {"Ghana" ,"GH" , "233" , 9 , "00" }, - {"Gibraltar" ,"GI" , "350" , 8 , "00" }, - {"Greece" ,"GR" , "30" ,10 , "00" }, - {"Greenland" ,"GL" , "299" , 6 , "00" }, - {"Grenada" ,"GD" , "1" , 10 , "011" }, - {"Guadeloupe" ,"GP" , "590" , 9 , "00" }, - {"Guam" ,"GU" , "1" , 10 , "011" }, - {"Guatemala" ,"GT" , "502" , 8 , "00" }, - {"Guinea" ,"GN" , "224" , 8 , "00" }, - {"Guinea-Bissau" ,"GW" , "245" , 7 , "00" }, - {"Guyana" ,"GY" , "592" , 7 , "001" }, - {"Haiti" ,"HT" , "509" , 8 , "00" }, - {"Honduras" ,"HN" , "504" , 8 , "00" }, - {"Hong Kong" ,"HK" , "852" , 8 , "001" }, - {"Hungary" ,"HU" , "36" , 9 , "00" }, - {"Iceland" ,"IS" , "354" , 9 , "00" }, - {"India" ,"IN" , "91" , 10 , "00" }, - {"Indonesia" ,"ID" , "62" , 10 , "001" }, - {"Iran" ,"IR" , "98" , 10 , "00" }, - {"Iraq" ,"IQ" , "964" , 10 , "00" }, - {"Ireland" ,"IE" , "353" , 9 , "00" }, - {"Israel" ,"IL" , "972" , 9 , "00" }, - {"Italy" ,"IT" , "39" , 10 , "00" }, - {"Jamaica" ,"JM" , "1" , 10 , "011" }, - {"Japan" ,"JP" , "81" , 10 , "010" }, - {"Jordan" ,"JO" , "962" , 9 , "00" }, - {"Kazakhstan" ,"KZ" , "7" , 10 , "00" }, - {"Kenya" ,"KE" , "254" , 9 , "000" }, - {"Kiribati" ,"KI" , "686" , 5 , "00" }, - {"Korea, North" ,"KP" , "850" , 12 , "99" }, - {"Korea, South" ,"KR" , "82" , 12 , "001" }, - {"Kuwait" ,"KW" , "965" , 8 , "00" }, - {"Kyrgyzstan" ,"KG" , "996" , 9 , "00" }, - {"Laos" ,"LA" , "856" , 10 , "00" }, - {"Latvia" ,"LV" , "371" , 8 , "00" }, - {"Lebanon" ,"LB" , "961" , 7 , "00" }, - {"Lesotho" ,"LS" , "266" , 8 , "00" }, - {"Liberia" ,"LR" , "231" , 8 , "00" }, - {"Libya" ,"LY" , "218" , 8 , "00" }, - {"Liechtenstein" ,"LI" , "423" , 7 , "00" }, - {"Lithuania" ,"LT" , "370" , 8 , "00" }, - {"Luxembourg" ,"LU" , "352" , 9 , "00" }, - {"Macau" ,"MO" , "853" , 8 , "00" }, - {"Macedonia" ,"MK" , "389" , 8 , "00" }, - {"Madagascar" ,"MG" , "261" , 9 , "00" }, - {"Malawi" ,"MW" , "265" , 9 , "00" }, - {"Malaysia" ,"MY" , "60" , 9 , "00" }, - {"Maldives" ,"MV" , "960" , 7 , "00" }, - {"Mali" ,"ML" , "223" , 8 , "00" }, - {"Malta" ,"MT" , "356" , 8 , "00" }, - {"Marshall Islands" ,"MH" , "692" , 7 , "011" }, - {"Martinique" ,"MQ" , "596" , 9 , "00" }, - {"Mauritania" ,"MR" , "222" , 8 , "00" }, - {"Mauritius" ,"MU" , "230" , 7 , "00" }, - {"Mayotte Island" ,"YT" , "262" , 9 , "00" }, - {"Mexico" ,"MX" , "52" , 10 , "00" }, - {"Micronesia" ,"FM" , "691" , 7 , "011" }, - {"Moldova" ,"MD" , "373" , 8 , "00" }, - {"Monaco" ,"MC" , "377" , 8 , "00" }, - {"Mongolia" ,"MN" , "976" , 8 , "001" }, - {"Montenegro" ,"ME" , "382" , 8 , "00" }, - {"Montserrat" ,"MS" , "664" , 10 , "011" }, - {"Morocco" ,"MA" , "212" , 9 , "00" }, - {"Mozambique" ,"MZ" , "258" , 9 , "00" }, - {"Myanmar" ,"MM" , "95" , 8 , "00" }, - {"Namibia" ,"NA" , "264" , 9 , "00" }, - {"Nauru" ,"NR" , "674" , 7 , "00" }, - {"Nepal" ,"NP" , "43" , 10 , "00" }, - {"Netherlands" ,"NL" , "31" , 9 , "00" }, - {"New Caledonia" ,"NC" , "687" , 6 , "00" }, - {"New Zealand" ,"NZ" , "64" , 10 , "00" }, - {"Nicaragua" ,"NI" , "505" , 8 , "00" }, - {"Niger" ,"NE" , "227" , 8 , "00" }, - {"Nigeria" ,"NG" , "234" , 10 , "009" }, - {"Niue" ,"NU" , "683" , 4 , "00" }, - {"Norfolk Island" ,"NF" , "672" , 5 , "00" }, - {"Northern Mariana Islands" ,"MP" , "1" , 10 , "011" }, - {"Norway" ,"NO" , "47" , 8 , "00" }, - {"Oman" ,"OM" , "968" , 8 , "00" }, - {"Pakistan" ,"PK" , "92" , 10 , "00" }, - {"Palau" ,"PW" , "680" , 7 , "011" }, - {"Palestine" ,"PS" , "970" , 9 , "00" }, - {"Panama" ,"PA" , "507" , 8 , "00" }, - {"Papua New Guinea" ,"PG" , "675" , 8 , "00" }, - {"Paraguay" ,"PY" , "595" , 9 , "00" }, - {"Peru" ,"PE" , "51" , 9 , "00" }, - {"Philippines" ,"PH" , "63" , 10 , "00" }, - {"Poland" ,"PL" , "48" , 9 , "00" }, - {"Portugal" ,"PT" , "351" , 9 , "00" }, - {"Puerto Rico" ,"PR" , "1" , 10 , "011" }, - {"Qatar" ,"QA" , "974" , 8 , "00" }, - {"R�union Island" ,"RE" , "262" , 9 , "011" }, - {"Romania" ,"RO" , "40" , 9 , "00" }, - {"Russian Federation" ,"RU" , "7" , 10 , "8" }, - {"Rwanda" ,"RW" , "250" , 9 , "00" }, - {"Saint Helena" ,"SH" , "290" , 4 , "00" }, - {"Saint Kitts and Nevis" ,"KN" , "1" , 10 , "011" }, - {"Saint Lucia" ,"LC" , "1" , 10 , "011" }, - {"Saint Pierre and Miquelon" ,"PM" , "508" , 6 , "00" }, - {"Saint Vincent and the Grenadines","VC" , "1" , 10 , "011" }, - {"Samoa" ,"WS" , "685" , 7 , "0" }, - {"San Marino" ,"SM" , "378" , 10 , "00" }, - {"S�o Tom� and Pr�ncipe" ,"ST" , "239" , 7 , "00" }, - {"Saudi Arabia" ,"SA" , "966" , 9 , "00" }, - {"Senegal" ,"SN" , "221" , 9 , "00" }, - {"Serbia" ,"RS" , "381" , 9 , "00" }, - {"Seychelles" ,"SC" , "248" , 7 , "00" }, - {"Sierra Leone" ,"SL" , "232" , 8 , "00" }, - {"Singapore" ,"SG" , "65" , 8 , "001" }, - {"Slovakia" ,"SK" , "421" , 9 , "00" }, - {"Slovenia" ,"SI" , "386" , 8 , "00" }, - {"Solomon Islands" ,"SB" , "677" , 7 , "00" }, - {"Somalia" ,"SO" , "252" , 8 , "00" }, - {"South Africa" ,"ZA" , "27" , 9 , "00" }, - {"Spain" ,"ES" , "34" , 9 , "00" }, - {"Sri Lanka" ,"LK" , "94" , 9 , "00" }, - {"Sudan" ,"SD" , "249" , 9 , "00" }, - {"Suriname" ,"SR" , "597" , 7 , "00" }, - {"Swaziland" ,"SZ" , "268" , 8 , "00" }, - {"Sweden" ,"SE" , "1" , 9 , "00" }, - {"Switzerland" ,"XK" , "41" , 9 , "00" }, - {"Syria" ,"SY" , "963" , 9 , "00" }, - {"Taiwan" ,"TW" , "886" , 9 , "810" }, - {"Tajikistan" ,"TJ" , "992" , 9 , "002" }, - {"Tanzania" ,"TZ" , "255" , 9 , "000" }, - {"Thailand" ,"TH" , "66" , 9 , "001" }, - {"Togo" ,"TG" , "228" , 8 , "00" }, - {"Tokelau" ,"TK" , "690" , 4 , "00" }, - {"Tonga" ,"TO" , "676" , 5 , "00" }, - {"Trinidad and Tobago" ,"TT" , "1" , 10 , "011" }, - {"Tunisia" ,"TN" , "216" , 8 , "00" }, - {"Turkey" ,"TR" , "90" , 10 , "00" }, - {"Turkmenistan" ,"TM" , "993" , 8 , "00" }, - {"Turks and Caicos Islands" ,"TC" , "1" , 7 , "0" }, - {"Tuvalu" ,"TV" , "688" , 5 , "00" }, - {"Uganda" ,"UG" , "256" , 9 , "000" }, - {"Ukraine" ,"UA" , "380" , 9 , "00" }, - {"United Arab Emirates" ,"AE" , "971" , 9 , "00" }, - {"United Kingdom" ,"UK" , "44" , 10 , "00" }, - {"United States" ,"US" , "1" , 10 , "011" }, - {"Uruguay" ,"UY" , "598" , 8 , "00" }, - {"Uzbekistan" ,"UZ" , "998" , 9 , "8" }, - {"Vanuatu" ,"VU" , "678" , 7 , "00" }, - {"Venezuela" ,"VE" , "58" , 10 , "00" }, - {"Vietnam" ,"VN" , "84" , 9 , "00" }, - {"Wallis and Futuna" ,"WF" , "681" , 5 , "00" }, - {"Yemen" ,"YE" , "967" , 9 , "00" }, - {"Zambia" ,"ZM" , "260" , 9 , "00" }, - {"Zimbabwe" ,"ZW" , "263" , 9 , "00" }, + {"Colombia" ,"CO" , "57" , 10 , "00" }, + {"Comoros" ,"KM" , "269" , 7 , "00" }, + {"Congo" ,"CG" , "242" , 9 , "00" }, + {"Congo Democratic Republic" ,"CD" , "243" , 9 , "00" }, + {"Cook Islands" ,"CK" , "682" , 5 , "00" }, + {"Costa Rica" ,"CR" , "506" , 8 , "00" }, + {"C�te d'Ivoire" ,"AD" , "225" , 8 , "00" }, + {"Croatia" ,"HR" , "385" , 9 , "00" }, + {"Cuba" ,"CU" , "53" , 8 , "119" }, + {"Cyprus" ,"CY" , "357" , 8 , "00" }, + {"Czech Republic" ,"CZ" , "420" , 9 , "00" }, + {"Denmark" ,"DK" , "45" , 8 , "00" }, + {"Djibouti" ,"DJ" , "253" , 8 , "00" }, + {"Dominica" ,"DM" , "1" , 10 , "011" }, + {"Dominican Republic" ,"DO" , "1" , 10 , "011" }, + {"Ecuador" ,"EC" , "593" , 9 , "00" }, + {"Egypt" ,"EG" , "20" , 10 , "00" }, + {"El Salvador" ,"SV" , "503" , 8 , "00" }, + {"Equatorial Guinea" ,"GQ" , "240" , 9 , "00" }, + {"Eritrea" ,"ER" , "291" , 7 , "00" }, + {"Estonia" ,"EE" , "372" , 8 , "00" }, + {"Ethiopia" ,"ET" , "251" , 9 , "00" }, + {"Falkland Islands" ,"FK" , "500" , 5 , "00" }, + {"Faroe Islands" ,"FO" , "298" , 6 , "00" }, + {"Fiji" ,"FJ" , "679" , 7 , "00" }, + {"Finland" ,"FI" , "358" , 9 , "00" }, + {"France" ,"FR" , "33" , 9 , "00" }, + {"French Guiana" ,"GF" , "594" , 9 , "00" }, + {"French Polynesia" ,"PF" , "689" , 6 , "00" }, + {"Gabon" ,"GA" , "241" , 8 , "00" }, + {"Gambia" ,"GM" , "220" , 7 , "00" }, + {"Georgia" ,"GE" , "995" , 9 , "00" }, + {"Germany" ,"DE" , "49" , 11 , "00" }, + {"Ghana" ,"GH" , "233" , 9 , "00" }, + {"Gibraltar" ,"GI" , "350" , 8 , "00" }, + {"Greece" ,"GR" , "30" ,10 , "00" }, + {"Greenland" ,"GL" , "299" , 6 , "00" }, + {"Grenada" ,"GD" , "1" , 10 , "011" }, + {"Guadeloupe" ,"GP" , "590" , 9 , "00" }, + {"Guam" ,"GU" , "1" , 10 , "011" }, + {"Guatemala" ,"GT" , "502" , 8 , "00" }, + {"Guinea" ,"GN" , "224" , 8 , "00" }, + {"Guinea-Bissau" ,"GW" , "245" , 7 , "00" }, + {"Guyana" ,"GY" , "592" , 7 , "001" }, + {"Haiti" ,"HT" , "509" , 8 , "00" }, + {"Honduras" ,"HN" , "504" , 8 , "00" }, + {"Hong Kong" ,"HK" , "852" , 8 , "001" }, + {"Hungary" ,"HU" , "36" , 9 , "00" }, + {"Iceland" ,"IS" , "354" , 9 , "00" }, + {"India" ,"IN" , "91" , 10 , "00" }, + {"Indonesia" ,"ID" , "62" , 10 , "001" }, + {"Iran" ,"IR" , "98" , 10 , "00" }, + {"Iraq" ,"IQ" , "964" , 10 , "00" }, + {"Ireland" ,"IE" , "353" , 9 , "00" }, + {"Israel" ,"IL" , "972" , 9 , "00" }, + {"Italy" ,"IT" , "39" , 10 , "00" }, + {"Jamaica" ,"JM" , "1" , 10 , "011" }, + {"Japan" ,"JP" , "81" , 10 , "010" }, + {"Jordan" ,"JO" , "962" , 9 , "00" }, + {"Kazakhstan" ,"KZ" , "7" , 10 , "00" }, + {"Kenya" ,"KE" , "254" , 9 , "000" }, + {"Kiribati" ,"KI" , "686" , 5 , "00" }, + {"Korea, North" ,"KP" , "850" , 12 , "99" }, + {"Korea, South" ,"KR" , "82" , 12 , "001" }, + {"Kuwait" ,"KW" , "965" , 8 , "00" }, + {"Kyrgyzstan" ,"KG" , "996" , 9 , "00" }, + {"Laos" ,"LA" , "856" , 10 , "00" }, + {"Latvia" ,"LV" , "371" , 8 , "00" }, + {"Lebanon" ,"LB" , "961" , 7 , "00" }, + {"Lesotho" ,"LS" , "266" , 8 , "00" }, + {"Liberia" ,"LR" , "231" , 8 , "00" }, + {"Libya" ,"LY" , "218" , 8 , "00" }, + {"Liechtenstein" ,"LI" , "423" , 7 , "00" }, + {"Lithuania" ,"LT" , "370" , 8 , "00" }, + {"Luxembourg" ,"LU" , "352" , 9 , "00" }, + {"Macau" ,"MO" , "853" , 8 , "00" }, + {"Macedonia" ,"MK" , "389" , 8 , "00" }, + {"Madagascar" ,"MG" , "261" , 9 , "00" }, + {"Malawi" ,"MW" , "265" , 9 , "00" }, + {"Malaysia" ,"MY" , "60" , 9 , "00" }, + {"Maldives" ,"MV" , "960" , 7 , "00" }, + {"Mali" ,"ML" , "223" , 8 , "00" }, + {"Malta" ,"MT" , "356" , 8 , "00" }, + {"Marshall Islands" ,"MH" , "692" , 7 , "011" }, + {"Martinique" ,"MQ" , "596" , 9 , "00" }, + {"Mauritania" ,"MR" , "222" , 8 , "00" }, + {"Mauritius" ,"MU" , "230" , 7 , "00" }, + {"Mayotte Island" ,"YT" , "262" , 9 , "00" }, + {"Mexico" ,"MX" , "52" , 10 , "00" }, + {"Micronesia" ,"FM" , "691" , 7 , "011" }, + {"Moldova" ,"MD" , "373" , 8 , "00" }, + {"Monaco" ,"MC" , "377" , 8 , "00" }, + {"Mongolia" ,"MN" , "976" , 8 , "001" }, + {"Montenegro" ,"ME" , "382" , 8 , "00" }, + {"Montserrat" ,"MS" , "664" , 10 , "011" }, + {"Morocco" ,"MA" , "212" , 9 , "00" }, + {"Mozambique" ,"MZ" , "258" , 9 , "00" }, + {"Myanmar" ,"MM" , "95" , 8 , "00" }, + {"Namibia" ,"NA" , "264" , 9 , "00" }, + {"Nauru" ,"NR" , "674" , 7 , "00" }, + {"Nepal" ,"NP" , "43" , 10 , "00" }, + {"Netherlands" ,"NL" , "31" , 9 , "00" }, + {"New Caledonia" ,"NC" , "687" , 6 , "00" }, + {"New Zealand" ,"NZ" , "64" , 10 , "00" }, + {"Nicaragua" ,"NI" , "505" , 8 , "00" }, + {"Niger" ,"NE" , "227" , 8 , "00" }, + {"Nigeria" ,"NG" , "234" , 10 , "009" }, + {"Niue" ,"NU" , "683" , 4 , "00" }, + {"Norfolk Island" ,"NF" , "672" , 5 , "00" }, + {"Northern Mariana Islands" ,"MP" , "1" , 10 , "011" }, + {"Norway" ,"NO" , "47" , 8 , "00" }, + {"Oman" ,"OM" , "968" , 8 , "00" }, + {"Pakistan" ,"PK" , "92" , 10 , "00" }, + {"Palau" ,"PW" , "680" , 7 , "011" }, + {"Palestine" ,"PS" , "970" , 9 , "00" }, + {"Panama" ,"PA" , "507" , 8 , "00" }, + {"Papua New Guinea" ,"PG" , "675" , 8 , "00" }, + {"Paraguay" ,"PY" , "595" , 9 , "00" }, + {"Peru" ,"PE" , "51" , 9 , "00" }, + {"Philippines" ,"PH" , "63" , 10 , "00" }, + {"Poland" ,"PL" , "48" , 9 , "00" }, + {"Portugal" ,"PT" , "351" , 9 , "00" }, + {"Puerto Rico" ,"PR" , "1" , 10 , "011" }, + {"Qatar" ,"QA" , "974" , 8 , "00" }, + {"R�union Island" ,"RE" , "262" , 9 , "011" }, + {"Romania" ,"RO" , "40" , 9 , "00" }, + {"Russian Federation" ,"RU" , "7" , 10 , "8" }, + {"Rwanda" ,"RW" , "250" , 9 , "00" }, + {"Saint Helena" ,"SH" , "290" , 4 , "00" }, + {"Saint Kitts and Nevis" ,"KN" , "1" , 10 , "011" }, + {"Saint Lucia" ,"LC" , "1" , 10 , "011" }, + {"Saint Pierre and Miquelon" ,"PM" , "508" , 6 , "00" }, + {"Saint Vincent and the Grenadines","VC" , "1" , 10 , "011" }, + {"Samoa" ,"WS" , "685" , 7 , "0" }, + {"San Marino" ,"SM" , "378" , 10 , "00" }, + {"S�o Tom� and Pr�ncipe" ,"ST" , "239" , 7 , "00" }, + {"Saudi Arabia" ,"SA" , "966" , 9 , "00" }, + {"Senegal" ,"SN" , "221" , 9 , "00" }, + {"Serbia" ,"RS" , "381" , 9 , "00" }, + {"Seychelles" ,"SC" , "248" , 7 , "00" }, + {"Sierra Leone" ,"SL" , "232" , 8 , "00" }, + {"Singapore" ,"SG" , "65" , 8 , "001" }, + {"Slovakia" ,"SK" , "421" , 9 , "00" }, + {"Slovenia" ,"SI" , "386" , 8 , "00" }, + {"Solomon Islands" ,"SB" , "677" , 7 , "00" }, + {"Somalia" ,"SO" , "252" , 8 , "00" }, + {"South Africa" ,"ZA" , "27" , 9 , "00" }, + {"Spain" ,"ES" , "34" , 9 , "00" }, + {"Sri Lanka" ,"LK" , "94" , 9 , "00" }, + {"Sudan" ,"SD" , "249" , 9 , "00" }, + {"Suriname" ,"SR" , "597" , 7 , "00" }, + {"Swaziland" ,"SZ" , "268" , 8 , "00" }, + {"Sweden" ,"SE" , "1" , 9 , "00" }, + {"Switzerland" ,"XK" , "41" , 9 , "00" }, + {"Syria" ,"SY" , "963" , 9 , "00" }, + {"Taiwan" ,"TW" , "886" , 9 , "810" }, + {"Tajikistan" ,"TJ" , "992" , 9 , "002" }, + {"Tanzania" ,"TZ" , "255" , 9 , "000" }, + {"Thailand" ,"TH" , "66" , 9 , "001" }, + {"Togo" ,"TG" , "228" , 8 , "00" }, + {"Tokelau" ,"TK" , "690" , 4 , "00" }, + {"Tonga" ,"TO" , "676" , 5 , "00" }, + {"Trinidad and Tobago" ,"TT" , "1" , 10 , "011" }, + {"Tunisia" ,"TN" , "216" , 8 , "00" }, + {"Turkey" ,"TR" , "90" , 10 , "00" }, + {"Turkmenistan" ,"TM" , "993" , 8 , "00" }, + {"Turks and Caicos Islands" ,"TC" , "1" , 7 , "0" }, + {"Tuvalu" ,"TV" , "688" , 5 , "00" }, + {"Uganda" ,"UG" , "256" , 9 , "000" }, + {"Ukraine" ,"UA" , "380" , 9 , "00" }, + {"United Arab Emirates" ,"AE" , "971" , 9 , "00" }, + {"United Kingdom" ,"UK" , "44" , 10 , "00" }, + {"United States" ,"US" , "1" , 10 , "011" }, + {"Uruguay" ,"UY" , "598" , 8 , "00" }, + {"Uzbekistan" ,"UZ" , "998" , 9 , "8" }, + {"Vanuatu" ,"VU" , "678" , 7 , "00" }, + {"Venezuela" ,"VE" , "58" , 10 , "00" }, + {"Vietnam" ,"VN" , "84" , 9 , "00" }, + {"Wallis and Futuna" ,"WF" , "681" , 5 , "00" }, + {"Yemen" ,"YE" , "967" , 9 , "00" }, + {"Zambia" ,"ZM" , "260" , 9 , "00" }, + {"Zimbabwe" ,"ZW" , "263" , 9 , "00" }, {NULL ,NULL , "" , 0 , NULL } }; static dial_plan_t most_common_dialplan={ "generic" ,"", "", 10, "00"}; @@ -1092,29 +1092,40 @@ SipSetup *linphone_proxy_config_get_sip_setup(LinphoneProxyConfig *cfg){ return NULL; } +static bool_t can_register(LinphoneProxyConfig *cfg){ + LinphoneCore *lc=cfg->lc; +#ifdef BUILD_UPNP + if (linphone_core_get_firewall_policy(lc)==LinphonePolicyUseUpnp){ + if(lc->sip_conf.register_only_when_upnp_is_ok && + (lc->upnp == NULL || !linphone_upnp_context_is_ready_for_register(lc->upnp))) { + return FALSE; + } + } +#endif //BUILD_UPNP + if (lc->sip_conf.register_only_when_network_is_up){ + LinphoneTunnel *tunnel=linphone_core_get_tunnel(lc); + if (tunnel && linphone_tunnel_enabled(tunnel)){ + return linphone_tunnel_connected(tunnel); + }else{ + return lc->network_reachable; + } + } + return TRUE; +} + void linphone_proxy_config_update(LinphoneProxyConfig *cfg){ LinphoneCore *lc=cfg->lc; if (cfg->commit){ if (cfg->type && cfg->ssctx==NULL){ linphone_proxy_config_activate_sip_setup(cfg); } - switch(linphone_core_get_firewall_policy(lc)) { - case LinphonePolicyUseUpnp: -#ifdef BUILD_UPNP - if(lc->sip_conf.register_only_when_upnp_is_ok && - (lc->upnp == NULL || !linphone_upnp_context_is_ready_for_register(lc->upnp))) { - break; + if (can_register(cfg)){ + linphone_proxy_config_register(cfg); + if (cfg->publish && cfg->publish_op==NULL){ + linphone_proxy_config_send_publish(cfg,lc->presence_mode); } -#endif //BUILD_UPNP - default: - if ((!lc->sip_conf.register_only_when_network_is_up || lc->network_reachable)) { - linphone_proxy_config_register(cfg); - } - } - if (cfg->publish && cfg->publish_op==NULL){ - linphone_proxy_config_send_publish(cfg,lc->presence_mode); + cfg->commit=FALSE; } - cfg->commit=FALSE; } } From 02b7c282a153ba96b3f82d5f38a06c27cc207518 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 13 May 2013 15:12:14 +0200 Subject: [PATCH 234/281] Remove useless arguement in linphone_core_upnp_available --- coreapi/linphonecore.c | 2 +- coreapi/linphonecore.h | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 12c8880b6..02db3b54f 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -4190,7 +4190,7 @@ const char * linphone_core_get_stun_server(const LinphoneCore *lc){ return lc->net_conf.stun_server; } -bool_t linphone_core_upnp_available(const LinphoneCore *lc){ +bool_t linphone_core_upnp_available(){ #ifdef BUILD_UPNP return TRUE; #else diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 5ae73cc4d..67d4fb255 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1199,10 +1199,9 @@ const char * linphone_core_get_stun_server(const LinphoneCore *lc); * @ingroup network_parameters * Return the availability of uPnP. * - * @param lc #LinphoneCore * @return true if uPnP is available otherwise return false. */ -bool_t linphone_core_upnp_available(const LinphoneCore *lc); +bool_t linphone_core_upnp_available(); /** * @ingroup network_parameters From 440d51434a3214a994a3db9955712080b202cc35 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 14 May 2013 11:57:30 +0200 Subject: [PATCH 235/281] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 239be1a39..382f7d766 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 239be1a39fa3f4ab460e8e7ab6d4d3d31e15e72a +Subproject commit 382f7d766dcc2505a2bce2f2144d5f48103dfbd5 From d42202ac67387f668e7201ab4b1e6b5d39b769ea Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 14 May 2013 12:03:41 +0200 Subject: [PATCH 236/281] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 382f7d766..3f06cd60f 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 382f7d766dcc2505a2bce2f2144d5f48103dfbd5 +Subproject commit 3f06cd60f1864b8c811e0f4e4590991802ce5ea7 From 66dd5cec662d83030955966da96bb6addcde55f1 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 14 May 2013 12:13:37 +0200 Subject: [PATCH 237/281] Renamed android libraries to avoid confusion --- build/android/Android-no-neon.mk | 8 ++++++- build/android/Android.mk | 3 +++ .../core/LinphoneCoreFactoryImpl.java | 24 +++++++++---------- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/build/android/Android-no-neon.mk b/build/android/Android-no-neon.mk index d8e75ca0b..061a96217 100644 --- a/build/android/Android-no-neon.mk +++ b/build/android/Android-no-neon.mk @@ -35,7 +35,13 @@ endif LOCAL_MODULE := liblinphonenoneon ifeq ($(TARGET_ARCH_ABI),armeabi) -LOCAL_MODULE_FILENAME := liblinphonearmv5 +LOCAL_MODULE_FILENAME := liblinphonearmv5noneon +endif +ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) +LOCAL_MODULE_FILENAME := liblinphonearmv7noneon +endif +ifeq ($(TARGET_ARCH_ABI),x86) +LOCAL_MODULE_FILENAME := liblinphonex86noneon endif include $(BUILD_SHARED_LIBRARY) diff --git a/build/android/Android.mk b/build/android/Android.mk index 10fba32dd..0dc0bd041 100755 --- a/build/android/Android.mk +++ b/build/android/Android.mk @@ -34,6 +34,9 @@ LOCAL_SHARED_LIBRARIES += \ endif LOCAL_MODULE := liblinphone +ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) +LOCAL_MODULE_FILENAME := liblinphonearmv7 +endif include $(BUILD_SHARED_LIBRARY) diff --git a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java index 0b799f33e..1d14ceb14 100644 --- a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java @@ -71,20 +71,20 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { loadOptionalLibrary("bcg729"); //Main library - if (!hasNeonInCpuFeatures()) { - try { - if (!isArmv7() && !Version.isX86()) { - System.loadLibrary("linphonearmv5"); - } else { - System.loadLibrary("linphonenoneon"); - } - Log.w("linphone", "No-neon liblinphone loaded"); - } catch (UnsatisfiedLinkError ule) { - Log.w("linphone", "Failed to load no-neon liblinphone, loading neon liblinphone"); - System.loadLibrary("linphone"); + if (isArmv7()) { + if (hasNeonInCpuFeatures()) { + Log.d("linphone", "armv7 liblinphone loaded"); + System.loadLibrary("linphonearmv7"); + } else { + Log.w("linphone", "No-neon armv7 liblinphone loaded"); + System.loadLibrary("linphonearmv7noneon"); } + } else if (Version.isX86()) { + Log.d("linphone", "No-neon x86 liblinphone loaded"); + System.loadLibrary("linphonex86noneon"); } else { - System.loadLibrary("linphone"); + Log.d("linphone", "No-neon armv5 liblinphone loaded"); + System.loadLibrary("linphonearmv5noneon"); } Version.dumpCapabilities(); From 381690328a26dfbb4d5258c7d060e2bafaef5b13 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Wed, 15 May 2013 10:46:15 +0200 Subject: [PATCH 238/281] Remove core argument in upnp_available in jni --- coreapi/linphonecore_jni.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 02ac62c7a..5619993ab 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -2491,7 +2491,7 @@ extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_getConfig(JNIEnv *env, } extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_upnpAvailable(JNIEnv *env, jobject thiz, jlong lc) { - return (jboolean) linphone_core_upnp_available((LinphoneCore *)lc); + return (jboolean) linphone_core_upnp_available(); } extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_getUpnpState(JNIEnv *env, jobject thiz, jlong lc) { From 7a9df2a1f7166e8516b47fe4b365e6187911b0ad Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 15 May 2013 10:50:30 +0200 Subject: [PATCH 239/281] Renamed liblinphonex86noneon to liblinphonex86 --- build/android/Android-no-neon.mk | 2 +- java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/android/Android-no-neon.mk b/build/android/Android-no-neon.mk index 061a96217..39818fbf4 100644 --- a/build/android/Android-no-neon.mk +++ b/build/android/Android-no-neon.mk @@ -41,7 +41,7 @@ ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) LOCAL_MODULE_FILENAME := liblinphonearmv7noneon endif ifeq ($(TARGET_ARCH_ABI),x86) -LOCAL_MODULE_FILENAME := liblinphonex86noneon +LOCAL_MODULE_FILENAME := liblinphonex86 endif include $(BUILD_SHARED_LIBRARY) diff --git a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java index 1d14ceb14..8cedba445 100644 --- a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java @@ -81,7 +81,7 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { } } else if (Version.isX86()) { Log.d("linphone", "No-neon x86 liblinphone loaded"); - System.loadLibrary("linphonex86noneon"); + System.loadLibrary("linphonex86"); } else { Log.d("linphone", "No-neon armv5 liblinphone loaded"); System.loadLibrary("linphonearmv5noneon"); From 771c7f0e71699d60f2c2c8860a35154a8140c44d Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 21 Nov 2012 16:12:35 +0100 Subject: [PATCH 240/281] Add opus codec. --- coreapi/linphonecore.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 02db3b54f..186f6f976 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -825,6 +825,7 @@ typedef struct codec_desc{ }codec_desc_t; static codec_desc_t codec_pref_order[]={ + {"opus", 48000}, {"SILK", 16000}, {"speex", 16000}, {"speex", 8000}, @@ -1287,6 +1288,7 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta linphone_core_assign_payload_type(lc,&payload_type_g729,18,"annexb=no"); linphone_core_assign_payload_type(lc,&payload_type_aaceld_22k,-1,"config=F8EE2000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=76; sizeLength=13; streamType=5"); linphone_core_assign_payload_type(lc,&payload_type_aaceld_44k,-1,"config=F8E82000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=76; sizeLength=13; streamType=5"); + linphone_core_assign_payload_type(lc,&payload_type_opus,-1,NULL); linphone_core_handle_static_payloads(lc); ms_init(); From 1a38d9fd74ae654adceff746be61d0dd29557924 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 15 May 2013 14:30:41 +0200 Subject: [PATCH 241/281] improve notifications of incoming chat messages - star appears even if already in the good chat tab - contact with active chats are displayed first in the friend list - activate icon pumping on Mac OS --- gtk/chat.c | 28 ++++++++++------------------ gtk/friendlist.c | 8 ++++++++ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index 2cba0754f..a58f443d6 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -66,6 +66,7 @@ void linphone_gtk_quit_chatroom(LinphoneChatRoom *cr) { g_return_if_fail(w!=NULL); gtk_notebook_remove_page(GTK_NOTEBOOK(nb),gtk_notebook_page_num(GTK_NOTEBOOK(nb),w)); + linphone_chat_room_mark_as_read(cr); linphone_gtk_friend_list_update_chat_picture(); g_object_set_data(G_OBJECT(friendlist),"chatview",NULL); from=g_object_get_data(G_OBJECT(w),"from_message"); @@ -364,7 +365,6 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres colorb.blue = 61952; with_str=linphone_address_as_string_uri_only(with); - linphone_chat_room_mark_as_read(cr); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text),GTK_WRAP_WORD_CHAR); gtk_text_view_set_editable(GTK_TEXT_VIEW(text),FALSE); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text),FALSE); @@ -404,8 +404,9 @@ GtkWidget* linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddres } LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with){ - LinphoneChatRoom *cr=linphone_core_create_chat_room(linphone_gtk_get_core(),linphone_address_as_string(with)); - if (!cr) return NULL; + char *tmp=linphone_address_as_string(with); + LinphoneChatRoom *cr=linphone_core_create_chat_room(linphone_gtk_get_core(),tmp); + ms_free(tmp); return cr; } @@ -424,7 +425,6 @@ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri, GtkTextIter end; GtkTextBuffer *text_buffer; - linphone_chat_room_mark_as_read(cr); text_buffer=gtk_text_view_get_buffer(text_view); gtk_text_buffer_get_bounds(text_buffer, &start, &end); gtk_text_buffer_delete (text_buffer, &start, &end); @@ -434,6 +434,8 @@ void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri, messages=linphone_chat_room_get_history(cr,NB_MSG_HIST); g_object_set_data(G_OBJECT(chat_view),"from_message",g_strdup(uri_str)); display_history_message(chat_view,messages,uri); + gtk_text_buffer_get_end_iter(text_buffer,&end); + gtk_text_view_scroll_to_iter(text_view,&end,0,FALSE,1.0,0); } ms_free(from_str); ms_free(uri_str); @@ -445,11 +447,6 @@ void linphone_gtk_chat_destroyed(GtkWidget *w){ linphone_chat_room_destroy(cr); } -void linphone_gtk_chat_close(GtkWidget *button){ - GtkWidget *w=gtk_widget_get_toplevel(button); - gtk_widget_destroy(w); -} - void linphone_gtk_text_received ( LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg ) { @@ -457,7 +454,7 @@ void linphone_gtk_text_received ( LinphoneCore *lc, LinphoneChatRoom *room, GtkWidget *friendlist=linphone_gtk_get_widget ( main_window,"contact_list" ); GtkWidget *w; gboolean send=TRUE; - GtkNotebook *notebook= ( GtkNotebook * ) linphone_gtk_get_widget ( main_window,"viewswitch" ); + /*GtkNotebook *notebook= ( GtkNotebook * ) linphone_gtk_get_widget ( main_window,"viewswitch" );*/ char *from=linphone_address_as_string ( linphone_chat_message_get_from ( msg ) ); w= ( GtkWidget* ) g_object_get_data ( G_OBJECT ( friendlist ),"chatview" ); @@ -481,7 +478,7 @@ void linphone_gtk_text_received ( LinphoneCore *lc, LinphoneChatRoom *room, g_object_set_data ( G_OBJECT ( friendlist ),"from",from ); } -#ifdef HAVE_GTK_OSXs +#ifdef HAVE_GTK_OSX /* Notified when a new message is sent */ linphone_gtk_status_icon_set_blinking ( TRUE ); #else @@ -495,14 +492,9 @@ void linphone_gtk_text_received ( LinphoneCore *lc, LinphoneChatRoom *room, } #endif if ( send ) { - if ( gtk_notebook_get_current_page ( notebook ) !=gtk_notebook_page_num ( notebook,w ) ) { - linphone_gtk_show_friends(); - } else { - linphone_chat_room_mark_as_read ( room ); - } linphone_gtk_push_text ( w,linphone_chat_message_get_from ( msg ), FALSE,room,msg,FALSE ); - } else { - linphone_gtk_show_friends(); } + linphone_gtk_show_friends(); + } diff --git a/gtk/friendlist.c b/gtk/friendlist.c index f7e683f95..12da891f4 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -352,6 +352,7 @@ void linphone_gtk_chat_selected(GtkWidget *item){ } else { linphone_gtk_load_chatroom(cr,uri,page); } + linphone_chat_room_mark_as_read(cr); gtk_notebook_set_current_page(notebook,gtk_notebook_page_num(notebook,page)); linphone_gtk_friend_list_update_chat_picture(); g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(page,"text_entry")); @@ -556,6 +557,13 @@ static void on_name_column_clicked(GtkTreeModel *model){ static int get_friend_weight(const LinphoneFriend *lf){ int w=0; + LinphoneCore *lc=linphone_gtk_get_core(); + LinphoneChatRoom *cr=linphone_core_get_chat_room(lc,linphone_friend_get_address(lf)); + + if (cr && linphone_chat_room_get_unread_messages_count(cr)>0){ + w+=2000; + } + switch(linphone_friend_get_status(lf)){ case LinphoneStatusOnline: w+=1000; From f9bd7bb035d6e5df573cd9530e381bf2a1d33c76 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 16 May 2013 12:25:53 +0200 Subject: [PATCH 242/281] scroll to the end when load chat history --- gtk/chat.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gtk/chat.c b/gtk/chat.c index a58f443d6..13c140615 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -129,6 +129,15 @@ void udpate_tab_chat_header(GtkWidget *chat_view,const LinphoneAddress *uri,Linp gtk_widget_show_all(w); } +static gboolean scroll_to_end(GtkTextView *w){ + GtkTextBuffer *buffer=gtk_text_view_get_buffer(w); + GtkTextIter iter; + gtk_text_buffer_get_end_iter(buffer,&iter); + GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); + gtk_text_view_scroll_mark_onscreen(w,mark); + return FALSE; +} + void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, gboolean me,LinphoneChatRoom *cr,LinphoneChatMessage *msg, gboolean hist){ GtkTextView *text=GTK_TEXT_VIEW(linphone_gtk_get_widget(w,"textview")); @@ -199,8 +208,7 @@ void linphone_gtk_push_text(GtkWidget *w, const LinphoneAddress *from, } gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\n",-1); - GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); - gtk_text_view_scroll_mark_onscreen(text,mark); + g_idle_add((GSourceFunc)scroll_to_end,text); ms_free(from_str); } From eacf974c7430bab29a414bb370a0a458b1f61f15 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 20 May 2013 12:02:34 +0200 Subject: [PATCH 243/281] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 3f06cd60f..9b3487265 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 3f06cd60f1864b8c811e0f4e4590991802ce5ea7 +Subproject commit 9b3487265555c933375ce932f4e3e6511cf532dd From 223915d43c16044deccc57569b133106ed0d1a38 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Mon, 20 May 2013 12:08:10 +0200 Subject: [PATCH 244/281] Update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 9b3487265..c799531d9 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 9b3487265555c933375ce932f4e3e6511cf532dd +Subproject commit c799531d9403c50fb06965a921e1530c814e02a1 From ac52794f58320bbce6fdfea23d6ab33350a3ff49 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 21 May 2013 09:23:38 +0200 Subject: [PATCH 245/281] Update ms2 (ffmpeg version issue) --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index c799531d9..1a69168c1 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit c799531d9403c50fb06965a921e1530c814e02a1 +Subproject commit 1a69168c1f30a7be439606069bd8dc4d5becac02 From 16706307e0ba3d9012a4faf041d5c2215ffc95f0 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Tue, 21 May 2013 14:03:27 +0200 Subject: [PATCH 246/281] Update ms2 (ffmpeg) --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 1a69168c1..47483a49a 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 1a69168c1f30a7be439606069bd8dc4d5becac02 +Subproject commit 47483a49a55765197c855eefd29c9d382eaa329a From b4a955f4d040a13d07b9a89bbb77758e57f2db1e Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 21 May 2013 14:02:18 +0200 Subject: [PATCH 247/281] Declare variables at the beginning of code blocks to fix compilation errors. --- coreapi/linphonecall.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index db3190bbb..d5366e5c6 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -84,9 +84,11 @@ static bool_t linphone_call_are_all_streams_encrypted(LinphoneCall *call) { #ifdef VIDEO_ENABLED // If video enabled, check ZRTP encryption in videostream - const LinphoneCallParams *params=linphone_call_get_current_params(call); - if (params->has_video && !call->videostream_encrypted) { - return FALSE; + { + const LinphoneCallParams *params=linphone_call_get_current_params(call); + if (params->has_video && !call->videostream_encrypted) { + return FALSE; + } } #endif @@ -110,9 +112,9 @@ void propagate_encryption_changed(LinphoneCall *call){ #ifdef VIDEO_ENABLED static void linphone_call_videostream_encryption_changed(void *data, bool_t encrypted){ - ms_message("Video stream is %s", encrypted ? "encrypted" : "not encrypted"); - LinphoneCall *call = (LinphoneCall *)data; + + ms_message("Video stream is %s", encrypted ? "encrypted" : "not encrypted"); call->videostream_encrypted=encrypted; propagate_encryption_changed(call); } @@ -135,12 +137,14 @@ static void linphone_call_audiostream_encryption_changed(void *data, bool_t encr #ifdef VIDEO_ENABLED // Enable video encryption - const LinphoneCallParams *params=linphone_call_get_current_params(call); - if (params->has_video) { - ms_message("Trying to enable encryption on video stream"); - OrtpZrtpParams params; - params.zid_file=NULL; //unused - video_stream_enable_zrtp(call->videostream,call->audiostream,¶ms); + { + const LinphoneCallParams *params=linphone_call_get_current_params(call); + if (params->has_video) { + OrtpZrtpParams params; + ms_message("Trying to enable encryption on video stream"); + params.zid_file=NULL; //unused + video_stream_enable_zrtp(call->videostream,call->audiostream,¶ms); + } } #endif } @@ -1627,11 +1631,11 @@ static void linphone_call_start_video_stream(LinphoneCall *call, const char *cna const char *rtcp_addr=vstream->rtcp_addr[0]!='\0' ? vstream->rtcp_addr : call->resultdesc->addr; call->video_profile=make_profile(call,call->resultdesc,vstream,&used_pt); if (used_pt!=-1){ - call->current_params.video_codec = rtp_profile_get_payload(call->video_profile, used_pt); VideoStreamDir dir=VideoStreamSendRecv; MSWebCam *cam=lc->video_conf.device; bool_t is_inactive=FALSE; + call->current_params.video_codec = rtp_profile_get_payload(call->video_profile, used_pt); call->current_params.has_video=TRUE; video_stream_enable_adaptive_bitrate_control(call->videostream, @@ -1701,9 +1705,6 @@ static void linphone_call_start_video_stream(LinphoneCall *call, const char *cna void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_muted, bool_t send_ringbacktone){ LinphoneCore *lc=call->core; - call->current_params.audio_codec = NULL; - call->current_params.video_codec = NULL; - LinphoneAddress *me=linphone_core_get_primary_contact_parsed(lc); char *cname; bool_t use_arc=linphone_core_adaptive_rate_control_enabled(lc); @@ -1712,6 +1713,9 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut SalProtoRtpAvp,SalVideo); #endif + call->current_params.audio_codec = NULL; + call->current_params.video_codec = NULL; + if ((call->audiostream == NULL) && (call->videostream == NULL)) { ms_fatal("start_media_stream() called without prior init !"); return; From c87b06a6e6476b191009f079d661bbf09ed8c917 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 21 May 2013 14:40:16 +0200 Subject: [PATCH 248/281] Declare variables at the beginning of code blocks to fix compilation errors. --- coreapi/linphonecore.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 02db3b54f..f60640160 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2838,10 +2838,13 @@ int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call){ **/ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params){ int err=0; +#ifdef VIDEO_ENABLED + bool_t has_video = FALSE; +#endif if (params!=NULL){ linphone_call_set_state(call,LinphoneCallUpdating,"Updating call"); #ifdef VIDEO_ENABLED - bool_t has_video = call->params.has_video; + has_video = call->params.has_video; // Video removing if((call->videostream != NULL) && !params->has_video) { @@ -4677,9 +4680,9 @@ unsigned long linphone_core_get_native_preview_window_id(const LinphoneCore *lc) * If not set the core will create its own window. **/ void linphone_core_set_native_preview_window_id(LinphoneCore *lc, unsigned long id){ - lc->preview_window_id=id; #ifdef VIDEO_ENABLED LinphoneCall *call=linphone_core_get_current_call(lc); + lc->preview_window_id=id; if (call!=NULL && call->videostream){ video_stream_set_native_preview_window_id(call->videostream,id); }else if (lc->previewstream){ @@ -4693,8 +4696,8 @@ void linphone_core_set_native_preview_window_id(LinphoneCore *lc, unsigned long **/ void linphone_core_show_video(LinphoneCore *lc, bool_t show){ #ifdef VIDEO_ENABLED - ms_error("linphone_core_show_video %d", show); LinphoneCall *call=linphone_core_get_current_call(lc); + ms_error("linphone_core_show_video %d", show); if (call!=NULL && call->videostream){ video_stream_show_video(call->videostream,show); } @@ -4730,9 +4733,11 @@ void linphone_core_set_device_rotation(LinphoneCore *lc, int rotation) { ms_message("%s : rotation=%d\n", __FUNCTION__, rotation); lc->device_rotation = rotation; #ifdef VIDEO_ENABLED - LinphoneCall *call=linphone_core_get_current_call(lc); - if (call!=NULL && call->videostream){ - video_stream_set_device_rotation(call->videostream,rotation); + { + LinphoneCall *call=linphone_core_get_current_call(lc); + if (call!=NULL && call->videostream){ + video_stream_set_device_rotation(call->videostream,rotation); + } } #endif } From da264d2cc56a7c56b9c4b30ac005d68574df70ba Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 21 May 2013 15:02:49 +0200 Subject: [PATCH 249/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 47483a49a..3f2672fcf 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 47483a49a55765197c855eefd29c9d382eaa329a +Subproject commit 3f2672fcf8a8d8f951047844d38dca1631999d7e From 889ff55a035ece493d053d5bd631df560c28c062 Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Wed, 22 May 2013 22:58:08 +0200 Subject: [PATCH 250/281] AAC-ELD: support PLC and multiple frames per RTP packet and fix uninit to free the audio converter. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 3f2672fcf..6e4adda46 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 3f2672fcf8a8d8f951047844d38dca1631999d7e +Subproject commit 6e4adda46186fdb197a6bca1dd7097b313fff09d From 7cb2aa2639fd6180e8996eee303cfbbcb3048941 Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Thu, 23 May 2013 11:52:29 +0200 Subject: [PATCH 251/281] AAC-ELD : set an initial max ptime at 50ms - to avoid ptime automatic growing too high when packets are losts - setting overridden up to 100 by initial set ptime --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 6e4adda46..58745e586 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 6e4adda46186fdb197a6bca1dd7097b313fff09d +Subproject commit 58745e5866d325c07255bf34225c8b621e87870b From fe3c0692c2c8196924febb81c205fef298f24f37 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 24 May 2013 10:36:22 +0200 Subject: [PATCH 252/281] update ms2&ortp to support opus --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index 58745e586..f0c613987 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 58745e5866d325c07255bf34225c8b621e87870b +Subproject commit f0c61398705609e28cbcb82f4c650ebd16ec0917 diff --git a/oRTP b/oRTP index 2d8a82247..68bdfc201 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 2d8a82247fbebbd690ae2fc8300522ab9b71a542 +Subproject commit 68bdfc20122f0231c6853e3b4b9a07e57955ad76 From c8620874e4e3a487d0fd27f204b774dbed34d80f Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 24 May 2013 10:55:41 +0200 Subject: [PATCH 253/281] ready for release --- NEWS | 22 ++++++++++++++++++++-- README | 31 +++++++++++++++---------------- mediastreamer2 | 2 +- oRTP | 2 +- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/NEWS b/NEWS index 413970e6a..0eede9fa5 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,24 @@ -linphone-3.xxx -- +linphone-3.6.0 -- May 27, 2013 + UI: + * new friend list and chat messaging UI + * enhanced call history + * call and conference audio recording + * persistent chat history + * DSCP settings for SIP and RTP + * display of call statistics (when clicking on the quality indicator bar) + core: + * ICE for efficient RTP exchange * fix bug in zRTP support (upgrade required) - * + * call recording + * uPnP + * call statistics + * adaptive bitrate control improvements + * faster call quality indicator feedback + * DSCP settings for SIP and RTP + * detailed call statistics feedback API + + Requires: mediastreamer2 = 2.9.0 and ortp = 0.22.0 + linphone-3.5.2 -- February 22, 2012 * updated oRTP to 0.20.0 diff --git a/README b/README index 1a66f4a27..a1fb5bd3d 100644 --- a/README +++ b/README @@ -8,29 +8,35 @@ This is Linphone, a free (GPL) video softphone based on the SIP protocol. - intltool - you need at least: - - libosip2>=3.0.3 - - libeXosip2>=3.0.3 + - libosip2>=3.5.0 + - libeXosip2>=3.5.0 - speex>=1.2.0 (including libspeexdsp part) + if you want the gtk/glade interface: - libgtk >=2.16.0 + if you want video support: - - SDL>=1.2.10 + - libvpx (VP8 codec) - libavcodec (ffmpeg) - libswscale (part of ffmpeg too) for better scaling performance - libxv (x11 video extension) - - ligl1-mesa (OpenGL API -- GLX development files) - - libglew (OpenGL Extension Wrangler library) - - libv4l (Video for linux) - - libx11 (x11) + - ligl1-mesa (OpenGL API -- GLX development files) + - libglew (OpenGL Extension Wrangler library) + - libv4l (Video for linux) + - libx11 (x11) - theora (optional) - + gsm codec (gsm source package or libgsm-dev or gsm-devel) (optional) + libreadline (optional: for convenient command line in linphonec) + libsoup (optional: for wizard - account creation assistant) - + libsqlite3 (optional : for a local history of messages) + + libsqlite3 (optional : for a local history of chat messages) + if you want uPnP support (optional): - libupnp (version 1.6 branch (not patched with 18-url-upnpstrings.patch)) + + Here is the command line to get these dependencies installed for Ubuntu && Debian + + $ sudo apt-get install libtool intltool libgtk2.0-dev libosip2-dev libexosip2-dev libspeexdsp-dev libavcodec-dev libswscale-dev libx11-dev libvx-dev ligl1-mesa-dev libglew-dev libv4l-dev + + + for optional library + $ sudo apt-get install libreadline-dev liggsm1-dev libtheora-dev libsoup2.4-dev libsqlit3-dev libupnp6-dev + Install srtp (optional) for call encryption : $ git clone git://git.linphone.org/srtp.git @@ -43,7 +49,6 @@ This is Linphone, a free (GPL) video softphone based on the SIP protocol. $ cd zrtpcpp && cmake -Denable-ccrtp=false . && make $ sudo make install -with their corresponding -dev or -devel package if you don't use source packages. - Compile linphone @@ -52,13 +57,7 @@ with their corresponding -dev or -devel package if you don't use source packages $ make && sudo make install $ sudo ldconfig -- Command line for Ubuntu && Debian - $ sudo apt-get install libtool intltool libgtk2.0-dev libosip2-dev libexosip2-dev libspeexdsp-dev libavcodec-dev libswscale-dev libx11-dev libvx-dev ligl1-mesa-dev libglew-dev libv4l-dev - - + for optional library - $ sudo apt-get install libreadline-dev liggsm1-dev libtheora-dev libsoup2.4-dev libsqlit3-dev libupnp6-dev - For windows compilation see README.mingw. For macOS X, see README.macos diff --git a/mediastreamer2 b/mediastreamer2 index f0c613987..2b43ce538 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit f0c61398705609e28cbcb82f4c650ebd16ec0917 +Subproject commit 2b43ce538299df8d9bc9d8f37de5f74a05342792 diff --git a/oRTP b/oRTP index 68bdfc201..2c37d1205 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 68bdfc20122f0231c6853e3b4b9a07e57955ad76 +Subproject commit 2c37d1205e9dd0e30a918ccf666ab217b66c2899 From 369a1f56fbdfb52fea97de4b17b1bad8ff8f506a Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 24 May 2013 11:04:37 +0200 Subject: [PATCH 254/281] fix ms2 version for opus --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 2b43ce538..ef59e9370 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 2b43ce538299df8d9bc9d8f37de5f74a05342792 +Subproject commit ef59e93709972e8e7ed1a4b642f0c113b575916f From e03affb6664da313913ee45dd30ca4313d106204 Mon Sep 17 00:00:00 2001 From: Johan Pascal Date: Fri, 24 May 2013 13:28:47 +0200 Subject: [PATCH 255/281] Add fmtp parameters to opus payload to enable FEC and DTX - update ms2 to get opus filter with locks on ptime --- coreapi/linphonecore.c | 2 +- mediastreamer2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index f4e5536ed..f0963f904 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1288,7 +1288,7 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta linphone_core_assign_payload_type(lc,&payload_type_g729,18,"annexb=no"); linphone_core_assign_payload_type(lc,&payload_type_aaceld_22k,-1,"config=F8EE2000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=76; sizeLength=13; streamType=5"); linphone_core_assign_payload_type(lc,&payload_type_aaceld_44k,-1,"config=F8E82000; constantDuration=512; indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=76; sizeLength=13; streamType=5"); - linphone_core_assign_payload_type(lc,&payload_type_opus,-1,NULL); + linphone_core_assign_payload_type(lc,&payload_type_opus,-1,"useinbandfec=1; usedtx=1"); linphone_core_handle_static_payloads(lc); ms_init(); diff --git a/mediastreamer2 b/mediastreamer2 index ef59e9370..2278eb3fc 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit ef59e93709972e8e7ed1a4b642f0c113b575916f +Subproject commit 2278eb3fca4601bd5911f1fe9585d0a3f643f965 From 7b6bf69ed818b15c9aad31150a9d5a223bc46619 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 24 May 2013 16:11:47 +0200 Subject: [PATCH 256/281] update ms2 --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 2278eb3fc..f8ca60656 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 2278eb3fca4601bd5911f1fe9585d0a3f643f965 +Subproject commit f8ca6065676eff95752d546e387684ccc90e7b1e From ca9e8b9baa3a5d12712c666a6f266cae2577ddcf Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Fri, 24 May 2013 16:18:11 +0200 Subject: [PATCH 257/281] Update README.mingw for sqlite3 building --- README.mingw | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.mingw b/README.mingw index 42b130f33..be45614f2 100644 --- a/README.mingw +++ b/README.mingw @@ -136,11 +136,21 @@ libgnutls (from the web) libgsm (from the web) libxml2 (compiled) libsoup (compiled) +libsqlite3 (compiled) Remarks: For every package compiled that goes into linphone-deps, .la files (libtool files) must be removed to avoid libtool errors. When running "make install DESTDIR=", somepath must be absolute and should not contain any ~ or space. +- building sqlite3 + * download the sources on the following website: + http://www.sqlite.org/download.html (choose the sqlite-autoconf-3XXX.tar.gz) + + * install: + ./configure + make && make install DESTDIR=/home//sqlite3-install + then copy the content of ~/sqlite3-install/usr/local/ into linphone-deps/. + - building ffmpeg ./configure --enable-shared --disable-static --enable-memalign-hack --extra-cflags="-fno-common" --enable-gpl && make make install DESTDIR=/home//ffmpeg-install @@ -152,6 +162,7 @@ When running "make install DESTDIR=", somepath must be absolute and sh ./configure --enable-shared --disable-static && make && make install DESTDIR=/home//libxml2-install copy ~/libxml2-install/usr/local/* into linphone-deps/. + - building x264: * download yasm normal version windows executable from yasm project page: From 415d0a159e50a94b716d1eb150976d542f02dbff Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 24 May 2013 17:59:24 +0200 Subject: [PATCH 258/281] ready for 3.6 release --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 5bd0570cc..0fcf38fc9 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT([linphone],[3.5.99.0],[linphone-developers@nongnu.org]) +AC_INIT([linphone],[3.6.0],[linphone-developers@nongnu.org]) AC_CANONICAL_SYSTEM AC_CONFIG_SRCDIR([coreapi/linphonecore.c]) From 6596c7f4cef274152a0d9b4bc2f89d31ee33f8e0 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 27 May 2013 10:47:45 +0200 Subject: [PATCH 259/281] add missing sqlite dll --- linphone-deps.filelist | 1 + 1 file changed, 1 insertion(+) diff --git a/linphone-deps.filelist b/linphone-deps.filelist index 1df0777a6..7eef0eea5 100755 --- a/linphone-deps.filelist +++ b/linphone-deps.filelist @@ -14,3 +14,4 @@ ./bin/libgpg-error-0.dll ./bin/libgnutls-26.dll ./bin/libtasn1-3.dll +./bin/libsqlite3-0.dll From 09a5a4ed601029dafd7d792d6d36877fc7fc6270 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Tue, 28 May 2013 15:12:02 +0200 Subject: [PATCH 260/281] Add zrtp dll in linphone-deps --- linphone-deps.filelist | 1 + 1 file changed, 1 insertion(+) diff --git a/linphone-deps.filelist b/linphone-deps.filelist index 7eef0eea5..98d759b14 100755 --- a/linphone-deps.filelist +++ b/linphone-deps.filelist @@ -15,3 +15,4 @@ ./bin/libgnutls-26.dll ./bin/libtasn1-3.dll ./bin/libsqlite3-0.dll +./bin/libzrtpcpp.dll From facaaffdc273909f84df10377a904bec9702906c Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 30 May 2013 10:12:31 +0200 Subject: [PATCH 261/281] update ms2 for syntax error fixes in configure. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index f8ca60656..5b7873ee3 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit f8ca6065676eff95752d546e387684ccc90e7b1e +Subproject commit 5b7873ee3cbc460138015ba244330d99aa861d7f From f1eb0ec07fda4221722ef1de098824299c85fd0a Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 31 May 2013 12:02:17 +0200 Subject: [PATCH 262/281] generate rootca.pem at compilation time using mk-ca-bundle.pl from curl which gather trusted certificates from modizilla --- scripts/mk-ca-bundle.pl | 242 +++ share/.gitignore | 1 + share/Makefile.am | 12 +- share/rootca.pem | 3965 --------------------------------------- 4 files changed, 250 insertions(+), 3970 deletions(-) create mode 100755 scripts/mk-ca-bundle.pl delete mode 100644 share/rootca.pem diff --git a/scripts/mk-ca-bundle.pl b/scripts/mk-ca-bundle.pl new file mode 100755 index 000000000..edede4261 --- /dev/null +++ b/scripts/mk-ca-bundle.pl @@ -0,0 +1,242 @@ +#!/usr/bin/perl -w +# *************************************************************************** +# * _ _ ____ _ +# * Project ___| | | | _ \| | +# * / __| | | | |_) | | +# * | (__| |_| | _ <| |___ +# * \___|\___/|_| \_\_____| +# * +# * Copyright (C) 1998 - 2013, Daniel Stenberg, , et al. +# * +# * This software is licensed as described in the file COPYING, which +# * you should have received as part of this distribution. The terms +# * are also available at http://curl.haxx.se/docs/copyright.html. +# * +# * You may opt to use, copy, modify, merge, publish, distribute and/or sell +# * copies of the Software, and permit persons to whom the Software is +# * furnished to do so, under the terms of the COPYING file. +# * +# * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# * KIND, either express or implied. +# * +# *************************************************************************** +# This Perl script creates a fresh ca-bundle.crt file for use with libcurl. +# It downloads certdata.txt from Mozilla's source tree (see URL below), +# then parses certdata.txt and extracts CA Root Certificates into PEM format. +# These are then processed with the OpenSSL commandline tool to produce the +# final ca-bundle.crt file. +# The script is based on the parse-certs script written by Roland Krikava. +# This Perl script works on almost any platform since its only external +# dependency is the OpenSSL commandline tool for optional text listing. +# Hacked by Guenter Knauf. +# +use Getopt::Std; +use MIME::Base64; +use LWP::UserAgent; +use strict; +use vars qw($opt_b $opt_f $opt_h $opt_i $opt_l $opt_n $opt_q $opt_t $opt_u $opt_v $opt_w); + +my $url = 'http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1'; +# If the OpenSSL commandline is not in search path you can configure it here! +my $openssl = 'openssl'; + +my $version = '1.18'; + +$opt_w = 76; # default base64 encoded lines length + +$0 =~ s@.*(/|\\)@@; +$Getopt::Std::STANDARD_HELP_VERSION = 1; +getopts('bfhilnqtuvw:'); + +if ($opt_i) { + print ("=" x 78 . "\n"); + print "Script Version : $version\n"; + print "Perl Version : $]\n"; + print "Operating System Name : $^O\n"; + print "Getopt::Std.pm Version : ${Getopt::Std::VERSION}\n"; + print "MIME::Base64.pm Version : ${MIME::Base64::VERSION}\n"; + print "LWP::UserAgent.pm Version : ${LWP::UserAgent::VERSION}\n"; + print "LWP.pm Version : ${LWP::VERSION}\n"; + print ("=" x 78 . "\n"); +} + +sub HELP_MESSAGE() { + print "Usage:\t${0} [-b] [-f] [-i] [-l] [-n] [-q] [-t] [-u] [-v] [-w] []\n"; + print "\t-b\tbackup an existing version of ca-bundle.crt\n"; + print "\t-f\tforce rebuild even if certdata.txt is current\n"; + print "\t-i\tprint version info about used modules\n"; + print "\t-l\tprint license info about certdata.txt\n"; + print "\t-n\tno download of certdata.txt (to use existing)\n"; + print "\t-q\tbe really quiet (no progress output at all)\n"; + print "\t-t\tinclude plain text listing of certificates\n"; + print "\t-u\tunlink (remove) certdata.txt after processing\n"; + print "\t-v\tbe verbose and print out processed CAs\n"; + print "\t-w \twrap base64 output lines after chars (default: ${opt_w})\n"; + exit; +} + +sub VERSION_MESSAGE() { + print "${0} version ${version} running Perl ${]} on ${^O}\n"; +} + +HELP_MESSAGE() if ($opt_h); + +my $crt = $ARGV[0] || 'ca-bundle.crt'; +(my $txt = $url) =~ s@(.*/|\?.*)@@g; + +my $stdout = $crt eq '-'; +my $resp; +my $fetched; + +unless ($opt_n and -e $txt) { + print STDERR "Downloading '$txt' ...\n" if (!$opt_q); + my $ua = new LWP::UserAgent(agent => "$0/$version"); + $ua->env_proxy(); + $resp = $ua->mirror($url, $txt); + if ($resp && $resp->code eq '304') { + print STDERR "Not modified\n" unless $opt_q; + exit 0 if -e $crt && !$opt_f; + } else { + $fetched = 1; + } + if( !$resp || $resp->code !~ /^(?:200|304)$/ ) { + print STDERR "Unable to download latest data: " + . ($resp? $resp->code . ' - ' . $resp->message : "LWP failed") . "\n" + unless $opt_q; + exit 1 if -e $crt || ! -r $txt; + } +} + +my $currentdate = scalar gmtime($fetched ? $resp->last_modified : (stat($txt))[9]); + +my $format = $opt_t ? "plain text and " : ""; +if( $stdout ) { + open(CRT, '> -') or die "Couldn't open STDOUT: $!\n"; +} else { + open(CRT,">$crt.~") or die "Couldn't open $crt.~: $!\n"; +} +print CRT <) { + if (/\*\*\*\*\* BEGIN LICENSE BLOCK \*\*\*\*\*/) { + print CRT; + print if ($opt_l); + while () { + print CRT; + print if ($opt_l); + last if (/\*\*\*\*\* END LICENSE BLOCK \*\*\*\*\*/); + } + } + next if /^#|^\s*$/; + chomp; + if (/^CVS_ID\s+\"(.*)\"/) { + print CRT "# $1\n"; + } + + # this is a match for the start of a certificate + if (/^CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE/) { + $start_of_cert = 1 + } + if ($start_of_cert && /^CKA_LABEL UTF8 \"(.*)\"/) { + $caname = $1; + } + my $untrusted = 0; + if ($start_of_cert && /^CKA_VALUE MULTILINE_OCTAL/) { + my $data; + while () { + last if (/^END/); + chomp; + my @octets = split(/\\/); + shift @octets; + for (@octets) { + $data .= chr(oct); + } + } + # scan forwards until the trust part + while () { + last if (/^CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST/); + chomp; + } + # now scan the trust part for untrusted certs + while () { + last if (/^#/); + if (/^CKA_TRUST_SERVER_AUTH\s+CK_TRUST\s+CKT_NSS_NOT_TRUSTED$/ + or /^CKA_TRUST_SERVER_AUTH\s+CK_TRUST\s+CKT_NSS_TRUST_UNKNOWN$/) { + $untrusted = 1; + } + } + if ($untrusted) { + $skipnum ++; + } else { + my $encoded = MIME::Base64::encode_base64($data, ''); + $encoded =~ s/(.{1,${opt_w}})/$1\n/g; + my $pem = "-----BEGIN CERTIFICATE-----\n" + . $encoded + . "-----END CERTIFICATE-----\n"; + print CRT "\n$caname\n"; + print CRT ("=" x length($caname) . "\n"); + if (!$opt_t) { + print CRT $pem; + } else { + my $pipe = "|$openssl x509 -md5 -fingerprint -text -inform PEM"; + if (!$stdout) { + $pipe .= " >> $crt.~"; + close(CRT) or die "Couldn't close $crt.~: $!"; + } + open(TMP, $pipe) or die "Couldn't open openssl pipe: $!"; + print TMP $pem; + close(TMP) or die "Couldn't close openssl pipe: $!"; + if (!$stdout) { + open(CRT, ">>$crt.~") or die "Couldn't open $crt.~: $!"; + } + } + print STDERR "Parsing: $caname\n" if ($opt_v); + $certnum ++; + $start_of_cert = 0; + } + } +} +close(TXT) or die "Couldn't close $txt: $!\n"; +close(CRT) or die "Couldn't close $crt.~: $!\n"; +unless( $stdout ) { + if ($opt_b && -e $crt) { + my $bk = 1; + while (-e "$crt.~${bk}~") { + $bk++; + } + rename $crt, "$crt.~${bk}~" or die "Failed to create backup $crt.~$bk}~: $!\n"; + } elsif( -e $crt ) { + unlink( $crt ) or die "Failed to remove $crt: $!\n"; + } + rename "$crt.~", $crt or die "Failed to rename $crt.~ to $crt: $!\n"; +} +unlink $txt if ($opt_u); +print STDERR "Done ($certnum CA certs processed, $skipnum untrusted skipped).\n" if (!$opt_q); + +exit; + + diff --git a/share/.gitignore b/share/.gitignore index 3d11e0206..3470e9d61 100644 --- a/share/.gitignore +++ b/share/.gitignore @@ -2,3 +2,4 @@ Makefile Makefile.in *.raw linphone.pc +rootca.pem diff --git a/share/Makefile.am b/share/Makefile.am index 83c3a934e..6f8fe9198 100644 --- a/share/Makefile.am +++ b/share/Makefile.am @@ -31,11 +31,13 @@ pkgconfig_DATA=linphone.pc linphonedir=$(datadir)/linphone linphone_DATA=rootca.pem +rootca.pem: + $(top_srcdir)/scripts/mk-ca-bundle.pl rootca.pem EXTRA_DIST = $(LINPHONE_SOUNDS) \ - $(LINPHONE_RINGS) \ - linphone.desktop.in \ - linphone.pc.in \ - Makefile.inc \ - rootca.pem + $(LINPHONE_RINGS) \ + linphone.desktop.in \ + linphone.pc.in \ + Makefile.inc \ + rootca.pem diff --git a/share/rootca.pem b/share/rootca.pem deleted file mode 100644 index cb25772cd..000000000 --- a/share/rootca.pem +++ /dev/null @@ -1,3965 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE -AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x -CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW -MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF -RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC -AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 -09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 -XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P -Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK -t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb -X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 -MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU -fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI -2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH -K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae -ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP -BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ -MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw -RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm -fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 -gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe -I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i -5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi -ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn -MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ -o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 -zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN -GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt -r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK -Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx -CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp -ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa -QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw -NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft -ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu -QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG -qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL -fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ -Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 -Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ -54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b -MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j -ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej -YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt -A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF -rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ -pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB -lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy -YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 -7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs -YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 -xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc -unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ -Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp -ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 -gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 -jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ -XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD -W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ -RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r -MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk -BYn8eNZcLCZDqQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw -MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD -VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul -CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n -tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl -dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch -PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC -+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O -BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X -7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz -43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl -pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA -WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx -MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB -ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV -BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV -6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX -GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP -dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH -1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF -62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW -BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv -b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 -IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ -iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh -4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm -XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 -MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK -EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh -BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq -xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G -87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i -2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U -WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 -0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G -A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr -pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm -aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv -hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm -hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 -P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y -iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no -xqE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk -hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym -1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW -OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb -2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko -O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU -AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb -LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir -oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C -MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC -206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci -KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 -JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 -BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e -Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B -PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 -Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq -Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 -+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj -FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn -xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 -LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc -obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 -CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe -IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA -DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F -AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX -Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb -AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl -Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw -RY8mkaKO/qk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 -MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U -0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI -TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf -RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF -zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh -BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA -AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY -PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ -BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn -9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT -Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF -Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX -n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW -H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz -NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ -7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb -m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY -xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ -YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq -JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx -I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz -kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh -EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S -Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM -gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu -rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO -1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu -h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP -yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q -7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT -RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ -ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB -M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ -my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO -AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT -9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H -hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 -fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc -MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp -b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT -AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs -aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H -j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K -f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 -IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw -FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht -QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm -/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ -k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ -MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC -seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ -hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ -eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U -DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj -B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx -EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h -bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy -YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp -Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy -MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG -A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt -YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD -VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA -isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj -Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 -QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt -bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR -yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID -AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 -cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f -BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj -cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 -U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl -YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos -SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ -t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u -mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb -K+9A46sd33oqK8n8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg -Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL -MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD -VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 -ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX -l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB -HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B -5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 -WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD -AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP -gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ -DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu -BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs -h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk -LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg -Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL -MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD -VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg -isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z -NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI -+MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R -hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ -mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD -AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP -Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s -EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 -mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC -e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow -dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO -BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi -MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ -ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ -8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 -zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y -fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 -w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc -G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k -epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q -laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ -QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU -fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 -YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w -ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY -gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe -MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 -IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy -dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw -czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 -dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl -aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC -AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg -b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB -ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc -nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg -18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c -gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl -Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY -sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T -SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF -CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum -GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk -zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW -omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS -BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v -cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 -4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB -Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J -0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ -FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx -bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q -SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb -6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV -m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g -eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG -kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 -6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG -CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc -aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB -gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w -aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 -tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 -nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M -77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV -Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L -ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM -zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU -rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF -YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT -oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu -FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB -0m6lG5kngOcLqagA ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET -MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE -AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw -CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg -YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE -Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX -mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD -XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW -S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp -FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD -AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu -ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z -ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv -Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw -DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 -yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq -EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB -EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN -PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV -BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK -EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq -b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow -djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx -EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG -9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa -F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1 -eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV -Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB -k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0 -ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV -dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO -txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD -VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD -QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY -S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+ -mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR -qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE -TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe -1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG -UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v -U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN -AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw -MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD -VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM -BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m -cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws -ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx -8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/ -s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c -9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V -pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+ -pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC -aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y -CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ -6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG -A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0 -MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF -AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob -sRQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT -AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ -TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG -9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw -MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM -BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO -MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 -LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI -s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 -xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 -u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b -F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx -Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd -PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV -HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx -NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF -AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ -L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY -YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a -NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R -0982gaEbeC9xs/FZTEYYKKuF0mBWWg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD -TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 -MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF -Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh -IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 -dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO -V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC -GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN -v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB -AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB -Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO -76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK -OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH -ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi -yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL -buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj -2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp -ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow -fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV -BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM -cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S -HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 -CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk -3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz -6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV -HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw -Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww -DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 -5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI -gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ -aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl -izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 -aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla -MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO -BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD -VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW -fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt -TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL -fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW -1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 -kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G -A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo -dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu -Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ -HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS -jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ -xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn -dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0 -MRMwEQYDVQQDEwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQG -EwJJTDAeFw0wNDAzMjQxMTMyMThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMT -CkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNpZ24xCzAJBgNVBAYTAklMMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49qROR+WCf4C9DklBKK -8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTyP2Q2 -98CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb -2CEJKHxNGGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxC -ejVb7Us6eva1jsz/D3zkYDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7Kpi -Xd3DTKaCQeQzC6zJMw9kglcq/QytNuEMrkvF7zuZ2SOzW120V+x0cAwqTwIDAQAB -o4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2Zl -ZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0PAQH/BAQD -AgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRL -AZs+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWd -foPPbrxHbvUanlR2QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0M -cXS6hMTXcpuEfDhOZAYnKuGntewImbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq -8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb/627HOkthIDYIb6FUtnUdLlp -hbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VGzT2ouvDzuFYk -Res3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U -AGegcQCCSA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw -PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu -MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx -GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL -MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf -HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh -gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW -v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue -Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr -9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt -6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 -MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl -Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 -ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq -hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p -iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC -dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL -kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL -hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBf -MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdp -Tm90YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmww -HhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgxOTIxWjBfMQswCQYDVQQGEwJOTDES -MBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEg -MB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B -8cp86Yxq7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXY -tsMW2YiwsYcdcNqGtA8Ui3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIl -HgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8ZkqQfioLBQftFl9VkHXYRskbg+IIvvEj -zJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEqbYRAhU52mXyC8/O3AlnU -JgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4iHomGgVM -ktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXv -a5pkXuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57p -K6kwe6AYHw4YC+VbqdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMi -puih2TkGl/VujQKQjBR7P4DNG5y6xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovT -yD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHcBmfFlHqabWJMfczgZICynkeO -owIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC -jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXy -fJ9oHbtdzno5wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBo -Y6pFITlIYXg23PFDk9Qlx/KAZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHo -M/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedTFLJgQT2EkTFoPSdE2+Xe9PpjRchM -Ppj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKfyvBovWsdst+Nbwed -2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoAZbwH -/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQl -nQ7KN+ZQ/YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jE -O1hZibCMjFCz2IbLaKPECudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU -9jQZjHkJNsphFyUXC4KYcwx3dMPVDceoEkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9 -j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV -UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL -EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ -BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x -ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg -bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ -j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV -Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG -SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx -JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI -RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw -MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 -fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i -+DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG -SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN -QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ -gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV -UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL -EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ -BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x -ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ -k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso -LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o -TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG -SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx -JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI -RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 -MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C -TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 -WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG -SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR -xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL -B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV -BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt -ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 -MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg -SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl -a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h -4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk -tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s -tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL -dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 -c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um -TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z -+kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O -Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW -OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW -fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 -l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw -FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ -8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI -6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO -TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME -wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY -Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn -xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q -DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q -Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t -hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 -7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 -QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp -Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp -a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx -MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg -R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU -MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT -L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H -5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC -90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 -c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE -VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP -qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S -/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj -/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X -KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy -MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA -vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G -CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA -WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ -h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 -f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN -B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy -vUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj -dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 -NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD -VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G -vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ -BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl -IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw -NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq -y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 -E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u -Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY -rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z -hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay -BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL -iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb -AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv -bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 -MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E -FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n -VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m -hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl -ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp -QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 -quGnM/b9Sh/22WA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs -IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A -PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 -Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL -TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL -5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 -S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe -2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap -EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td -EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv -/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 -abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF -I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz -4iIprn2DQKi6bA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT -AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ -TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG -9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw -MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM -BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO -MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 -LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI -s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 -xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 -u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b -F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx -Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd -PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV -HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx -NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF -AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ -L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY -YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a -NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R -0982gaEbeC9xs/FZTEYYKKuF0mBWWg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN -AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp -dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw -MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw -CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ -MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB -SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz -ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH -LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP -PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL -2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w -ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC -MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk -AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 -AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz -AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz -AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f -BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY -P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi -CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g -kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 -HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS -na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q -qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z -TbvGRNs2yyqcjg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw -cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy -b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z -ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 -NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN -TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p -Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u -uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ -LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA -vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 -Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx -62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB -AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw -LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP -BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB -AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov -MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 -ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT -AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh -ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo -AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa -AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln -bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p -Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP -PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv -Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB -EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu -w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj -cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV -HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI -VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS -BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS -b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS -8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds -ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl -7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR -hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ -MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV -MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe -TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 -dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 -N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC -dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu -MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL -b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD -zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi -3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 -WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY -Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi -NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC -ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 -QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 -YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz -aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm -ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg -ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs -amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv -IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 -Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 -ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 -YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg -dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs -b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G -CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO -xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP -0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ -QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk -f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK -8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD -EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz -aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w -MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l -dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh -bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq -eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe -r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 -3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd -vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l -mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC -wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg -hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 -TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh -biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg -ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg -dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 -b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl -c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 -ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 -dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu -ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo -ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 -Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u -ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA -A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ -MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ -NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR -VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY -83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 -macqaJVmlaut74nLYKkGEsaUR+ko ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy -MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp -eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg -/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl -wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh -AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 -PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu -AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR -MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc -HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ -Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO -rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch -6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 -7CAFYd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz -MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N -IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 -bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE -RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO -zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 -bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF -MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 -VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC -OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW -tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ -q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb -EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ -Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O -VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw -OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu -ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h -gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K -5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy -9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE -gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 -eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs -YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp -aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp -dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb -sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB -FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy -f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W -+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 -uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf -tXncwKJrMiE3lvgOOBITRzcahirLer4c ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa -Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g -eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND -IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu -QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui -me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm -RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ -OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G -O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF -BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI -KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh -c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl -cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw -HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX -hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV -Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw -6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF -6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e -Pr3WHV1wA7EY6oT4zBx+2gT9XBTB ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE -ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE -AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ -BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT -aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl -KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX -GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj -93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ -P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow -ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g -ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN -W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB -IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB -ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA -ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb -MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv -J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW -pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J -HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu -dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD -QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG -A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV -BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln -bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo -VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs -Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI -iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD -VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 -oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey -LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF -BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi -UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg -T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 -b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS -C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt -iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M -eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 -iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp -ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv -hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg -U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN -MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G -A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD -ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts -YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO -4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF -KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL -/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw -EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3 -dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh -My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB -BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g -IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93 -IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5 -dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM -GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+ -MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq -bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ -xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU -upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk -GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug -5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma -M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ -HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW -Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 -JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x -W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE -82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx -UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan -ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 -2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV -tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue -Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA -iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE -OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db -w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC -3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM -ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 -7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG -dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF -JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz -1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw -OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu -ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks -ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX -REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D -CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU -YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP -l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 -MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz -dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg -Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg -Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt -L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf -BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN -AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI -cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 -CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW -ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB -KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX -DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 -IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg -U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd -uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v -LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c -ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w -bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM -MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH -AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr -YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC -ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf -MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO -Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz -+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB -vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx -MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG -29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk -oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk -3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL -qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN -nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX -ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H -DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO -TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv -kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w -zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE -ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z -dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq -hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3 -WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh -bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g -dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE -AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt -YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6 -rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL -VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40 -I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV -HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/ -vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ -bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl -IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe -BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW -iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms -1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD -VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz -MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD -VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx -JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz -MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh -cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe -MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 -GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 -fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx -Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u -jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx -ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp -/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ -co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s -zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo -+uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F -TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w -ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm -gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO -BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf -U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h -c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN -AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ -BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC -AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC -AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG -+EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV -HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN -BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y -PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M -AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP -qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP -sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v -dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ -O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P -+UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg -g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg -T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa -yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE -o2A= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICqDCCAZACCQCHc5eBqnSyFTANBgkqhkiG9w0BAQUFADAWMRQwEgYDVQQDEwt0 -aGlua3BhZC1wZTAeFw0xMTA3MTExNzU4NTVaFw0yMTA3MDgxNzU4NTVaMBYxFDAS -BgNVBAMTC3RoaW5rcGFkLXBlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAtS6SgGwg+IEzl85WsXc2TnfLPZZTjoNGL/tb/fLIyaEx1/YopEyo0zSsenyA -95RFvPs4fK6+onmiRLq3YgYtbxSbv83/no/ggMkhMZw7Il2cguoxaiTpf6Z+zGNA -nX98M7ig5ISPnq+06Sw869NEAsYbiReNgazAJM53RdfSqZsok1A5CyXd3XUERLNm -UoCw917DNhu+N3xed/1t376yW4Bo/kkyrn1CRTG8jxi5xe+tCsDTWSjJzkS0e6WJ -MVK6PJxP0if7lw28Qh0zd9orR26HDbQ6TPpAF2sj7UhPleA4xkKjtiir3nITHkRR -bMvyd22gDAPIhZsF19X+dua8UwIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQCm+aKc -dvClUqqhe/wACAHn+NOLGAYK6kLVJaWUzvcSFMU9M6iyJllpxO0BwhdxXrmLtG72 -lermeKh4wTiREP16Qdh0nNbtiB4cOAzBvHNzj6RymGAL50RBugu0zlY3wDUxDGS8 -M/7c4ZAB/BvieA09o2tnUGmL7PijDGPLE5bclIwVAkXaeXKa6bG0kJnr0ndxX68d -AJGNoSFTdxBMPw6gau77w7wQULFKFj4xTEKkYngNDsKERc/u/yrYRfkeehehRNmT -BcKocK4dDPPPzcJ12AjBnYtxitTRlJyXAkNVjLMTSg7lAU36JjNkvXqhSqDQJf04 -yW2ZnchxqK6f0gWO ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO -TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy -MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk -ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn -ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 -9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO -hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U -tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o -BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh -SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww -OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv -cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA -7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k -/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm -eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 -u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy -7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js -LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM -BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy -dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh -cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh -YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg -dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp -bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ -YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ -9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 -jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW -FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz -ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 -ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L -EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu -L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC -O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V -um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh -NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCB -rjELMAkGA1UEBhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcp -MRIwEAYDVQQHEwlTdHV0dGdhcnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fz -c2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVTLVRSVVNUIEF1dGhlbnRpY2F0aW9u -IGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0wNTA2MjIwMDAwMDBa -Fw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFkZW4t -V3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMg -RGV1dHNjaGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJV -U1QgQXV0aGVudGljYXRpb24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBO -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1 -toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob4QSwI7+Vio5bG0F/WsPo -TUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXLg3KSwlOy -ggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1 -XgqfeN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteF -hy+S8dF2g08LOlk3KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm -7QIDAQABo4GSMIGPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEG -MCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJvbmxpbmUxLTIwNDgtNTAdBgNV -HQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAUD8oeXHngovMp -ttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD -pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFo -LtU96G7m1R08P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersF -iXOMy6ZNwPv2AtawB6MDwidAnwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0y -h9WUUpY6RsZxlj33mA6ykaqP2vROJAA5VeitF7nTNCtKqUDMFypVZUF0Qn71wK/I -k63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8bHz2eBIPdltkdOpQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 -m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih -FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ -TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F -EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco -kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu -HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF -vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo -19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC -L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW -bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX -JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc -K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf -ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik -Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB -sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e -3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR -ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip -mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH -b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf -rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms -hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y -zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 -MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu -IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw -WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD -ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y -IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn -IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ -6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob -jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw -izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl -+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY -zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP -pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF -KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW -ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB -AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 -ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW -IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA -A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 -uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ -FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 -jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ -u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D -YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 -puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa -icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG -DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x -kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z -Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV -BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 -Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 -OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i -SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc -VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf -tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg -uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J -XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK -8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 -5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 -kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 -Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz -JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 -Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS -GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt -ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 -au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV -hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI -dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV -BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 -Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 -OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i -SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc -VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW -Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q -Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 -1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq -ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 -Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX -XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 -Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz -JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 -Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN -irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 -TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 -g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB -95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj -S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 -c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y -AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw -TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8 -/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/ -jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms -Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 -c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF -Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw -Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW -w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE -Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD -2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV -BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1 -c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy -MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl -ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm -BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF -5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv -DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v -zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT -yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj -dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh -MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI -4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz -dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY -aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G -DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH -LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV -BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 -c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx -MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg -R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD -VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR -JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T -fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu -jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z -wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ -fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD -VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G -CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 -7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn -8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs -ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ -2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE -SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg -Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV -BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl -cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA -vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu -Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a -0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 -4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN -eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD -R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG -A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu -dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME -Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 -WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ -KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO -Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX -wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 -9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 -jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 -aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE -SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw -ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU -REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr -2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s -2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU -GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj -dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r -TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB -AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv -c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl -ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu -MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg -T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud -HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD -VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny -bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ -J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG -SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom -JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO -inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y -caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB -mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ -YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 -BKNDLdr8C2LqL19iUw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt -YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu -Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa -MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG -cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh -d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY -DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E -rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq -uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN -BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa -/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei -gQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN -BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd -BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN -MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g -Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG -A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l -c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT -6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa -Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL -8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC -9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ -pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ -CayJSdM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS -MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp -bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw -VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy -YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy -dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe -Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx -GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls -aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU -QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh -xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 -aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr -IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h -gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK -O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO -fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw -lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID -AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP -NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t -wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM -7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh -gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n -oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs -yZyQ2uypQjyttgI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg -MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz -MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy -dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD -VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg -xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu -xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 -XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k -heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J -YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C -urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 -JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 -b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV -9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 -kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh -fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA -aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS -RGQDJereW26fyfJOrN3H ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 -WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv -bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU -UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw -bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe -LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef -J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh -R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ -Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX -JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p -zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S -Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ -KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq -ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz -gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH -uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS -y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB -kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw -IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu -dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 -E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ -D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK -4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq -lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW -bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB -o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js -LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr -BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB -AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj -j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH -KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv -2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 -mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB -rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt -Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa -Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV -BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l -dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE -AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B -YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 -hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l -L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm -SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM -1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws -6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw -Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 -aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH -AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u -7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 -xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ -rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim -eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk -USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK -VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm -Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J -h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 -DzFc6PLZ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 -nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO -8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV -ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb -PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr -n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a -qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 -wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs -pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 -E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f -zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi -TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAFgVKTk8d6PaXCUDfGD67gmZPCcQcMgMCeazh88K4hiW -NWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n0a3hUKw8fGJLj7qE1xIV -Gx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZRjXZ+Hxb ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns -YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y -aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe -Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj -IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx -KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM -HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw -DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji -nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn -jBJ7xUS0rg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy -aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp -Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g -Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt -IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU -J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO -JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY -wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o -koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E -Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe -xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u -7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI -sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP -cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh -YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 -FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg -J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc -r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM -HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK -qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj -cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP -T8qAkbYp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 -GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ -+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd -U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm -NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ -ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 -CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq -g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c -2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ -bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 -MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww -KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G -A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 -5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE -SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O -JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu -ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE -AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB -AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB -CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw -b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo -7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ -0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 -nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ -33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx -IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs -cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 -MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl -bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD -DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r -WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU -Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs -HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj -z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf -SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl -AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG -KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P -AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j -BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC -VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX -ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB -ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd -/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB -A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn -k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 -iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv -2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- From 638cff9433c3787a74b2db79aebc19092d6323b4 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 3 Jun 2013 16:23:58 +0200 Subject: [PATCH 263/281] ipdate ms2 to fix build issue when compiling whitout opus --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 5b7873ee3..bc1cb1d1f 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 5b7873ee3cbc460138015ba244330d99aa861d7f +Subproject commit bc1cb1d1f2b996c84828ba7d81ae43b95bcceacb From 0231328392bb818bc24cf723d316f1f74eb2d8c0 Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Wed, 5 Jun 2013 14:30:01 +0200 Subject: [PATCH 264/281] Add strtok in ortp for mingw compilation --- coreapi/message_storage.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/coreapi/message_storage.c b/coreapi/message_storage.c index deed140c7..765543f7a 100644 --- a/coreapi/message_storage.c +++ b/coreapi/message_storage.c @@ -83,7 +83,7 @@ void linphone_sql_request_message(sqlite3 *db,const char *stmt,LinphoneChatRoom int ret; ret=sqlite3_exec(db,stmt,callback,cr,&errmsg); if(ret != SQLITE_OK) { - printf("Error in creation: %s.\n", errmsg); + ms_error("Error in creation: %s.\n", errmsg); sqlite3_free(errmsg); } } @@ -197,7 +197,7 @@ void linphone_create_table(sqlite3* db){ ret=sqlite3_exec(db,"CREATE TABLE if not exists history (id INTEGER PRIMARY KEY AUTOINCREMENT, localContact TEXT NOT NULL, remoteContact TEXT NOT NULL, direction INTEGER, message TEXT, time TEXT NOT NULL, read INTEGER, status INTEGER);", 0,0,&errmsg); if(ret != SQLITE_OK) { - printf("Error in creation: %s.\n", errmsg); + ms_error("Error in creation: %s.\n", errmsg); sqlite3_free(errmsg); } } @@ -209,7 +209,7 @@ void linphone_core_message_storage_init(LinphoneCore *lc){ ret=sqlite3_open(lc->chat_db_file,&db); if(ret != SQLITE_OK) { errmsg=sqlite3_errmsg(db); - printf("Error in the opening: %s.\n", errmsg); + ms_error("Error in the opening: %s.\n", errmsg); sqlite3_close(db); } linphone_create_table(db); From 0fd44a7a545221fcc7cedee97b2eed9ae916b43e Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Thu, 6 Jun 2013 09:35:22 +0200 Subject: [PATCH 265/281] Really add strtok in oRTP --- mediastreamer2 | 2 +- oRTP | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mediastreamer2 b/mediastreamer2 index bc1cb1d1f..b40cd2308 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit bc1cb1d1f2b996c84828ba7d81ae43b95bcceacb +Subproject commit b40cd2308ed594e2f4f311654a4291b22c72b5ac diff --git a/oRTP b/oRTP index 2c37d1205..462296433 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 2c37d1205e9dd0e30a918ccf666ab217b66c2899 +Subproject commit 462296433f10bd84cb605edb0b38d16a4cd81d9e From 6a87488991fe206bc72deda1274610ceab9e3376 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 6 Jun 2013 11:12:17 +0200 Subject: [PATCH 266/281] fix warning in gtk app --- gtk/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk/main.c b/gtk/main.c index e914e42bd..1aa2e287c 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -568,7 +568,7 @@ static gboolean linphone_gtk_iterate(LinphoneCore *lc){ if (id!=0){ ms_message("Updating window decorations"); #ifndef WIN32 - w=gdk_window_foreign_new(id); + w=gdk_window_foreign_new((GdkNativeWindow)id); #else w=gdk_window_foreign_new((HANDLE)id); #endif @@ -587,7 +587,7 @@ static gboolean linphone_gtk_iterate(LinphoneCore *lc){ if (id!=0){ ms_message("Updating window decorations for preview"); #ifndef WIN32 - w=gdk_window_foreign_new(id); + w=gdk_window_foreign_new((GdkNativeWindow)id); #else w=gdk_window_foreign_new((HANDLE)id); #endif From d1dc89b52078c002eeb2686179d70fe80c6f6ef2 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 6 Jun 2013 15:44:11 +0200 Subject: [PATCH 267/281] Update ms2 for VP8 fixes. --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index b40cd2308..60edaade5 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit b40cd2308ed594e2f4f311654a4291b22c72b5ac +Subproject commit 60edaade52a6f123f2cde6140ca90378d95c9d87 From f2738da8d9e4b0e34ca07dae482a0fa5dcf10c9a Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 6 Jun 2013 15:26:21 +0200 Subject: [PATCH 268/281] Add linphone_core_get_camera_sensor_rotation(). --- coreapi/linphonecore.c | 10 ++++++++++ coreapi/linphonecore.h | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index f0963f904..202519d76 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -4744,6 +4744,16 @@ void linphone_core_set_device_rotation(LinphoneCore *lc, int rotation) { #endif } +int linphone_core_get_camera_sensor_rotation(LinphoneCore *lc) { +#ifdef VIDEO_ENABLED + LinphoneCall *call = linphone_core_get_current_call(lc); + if ((call != NULL) && (call->videostream != NULL)) { + return video_stream_get_camera_sensor_rotation(call->videostream); + } +#endif + return -1; +} + static MSVideoSizeDef supported_resolutions[]={ #ifdef ENABLE_HD { {MS_VIDEO_SIZE_1080P_W,MS_VIDEO_SIZE_1080P_H} , "1080p" }, diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 67d4fb255..50686a2c9 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1354,6 +1354,17 @@ void linphone_core_use_preview_window(LinphoneCore *lc, bool_t yesno); int linphone_core_get_device_rotation(LinphoneCore *lc ); void linphone_core_set_device_rotation(LinphoneCore *lc, int rotation); +/** + * @brief Get the camera sensor rotation. + * + * This is needed on some mobile platforms to get the number of degrees the camera sensor + * is rotated relative to the screen. + * + * @param lc The linphone core related to the operation + * @return The camera sensor rotation in degrees (0 to 360) or -1 if it could not be retrieved + */ +int linphone_core_get_camera_sensor_rotation(LinphoneCore *lc); + /* start or stop streaming video in case of embedded window */ void linphone_core_show_video(LinphoneCore *lc, bool_t show); From 2cc690382793142801ddb7480ee7bb6dd3082de7 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 7 Jun 2013 16:23:07 +0200 Subject: [PATCH 269/281] update ms2 with better opus integration --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 60edaade5..ff9b20e9f 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 60edaade52a6f123f2cde6140ca90378d95c9d87 +Subproject commit ff9b20e9fbccb0c3ca401544d2cdc39dd8ee629e From 74359410314eb7a49e5eeb56c4d995f234d36bac Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 11 Jun 2013 14:23:27 +0200 Subject: [PATCH 270/281] Added setDomain to Java LinphoneAddress --- coreapi/linphonecore_jni.cc | 9 ++++++++- java/impl/org/linphone/core/LinphoneAddressImpl.java | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 5619993ab..1dfaf3c3c 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1387,7 +1387,14 @@ extern "C" jstring Java_org_linphone_core_LinphoneAddressImpl_getDomain(JNIEnv* return NULL; } } - +extern "C" void Java_org_linphone_core_LinphoneAddressImpl_setDomain(JNIEnv* env + ,jobject thiz + ,jlong ptr + ,jstring jdomain) { + const char* domain = env->GetStringUTFChars(jdomain, NULL); + linphone_address_set_domain((LinphoneAddress*)ptr, domain); + env->ReleaseStringUTFChars(jdomain, domain); +} extern "C" jstring Java_org_linphone_core_LinphoneAddressImpl_toString(JNIEnv* env ,jobject thiz ,jlong ptr) { diff --git a/java/impl/org/linphone/core/LinphoneAddressImpl.java b/java/impl/org/linphone/core/LinphoneAddressImpl.java index b9d290971..8d76da77a 100644 --- a/java/impl/org/linphone/core/LinphoneAddressImpl.java +++ b/java/impl/org/linphone/core/LinphoneAddressImpl.java @@ -31,6 +31,7 @@ public class LinphoneAddressImpl implements LinphoneAddress { private native String toUri(long ptr); private native void setDisplayName(long ptr,String name); private native String toString(long ptr); + private native void setDomain(long ptr, String domain); protected LinphoneAddressImpl(String identity) { nativePtr = newLinphoneAddressImpl(identity, null); @@ -85,7 +86,7 @@ public class LinphoneAddressImpl implements LinphoneAddress { return getPortInt(); } public void setDomain(String domain) { - throw new RuntimeException("Not implemented"); + setDomain(nativePtr, domain); } public void setPort(String port) { throw new RuntimeException("Not implemented"); From e88b7a3f68f3528d7808a673d162e6a89dd3361d Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 12 Jun 2013 11:11:35 +0200 Subject: [PATCH 271/281] update ms2 for H263 4CIF support --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index ff9b20e9f..f4b3768c9 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit ff9b20e9fbccb0c3ca401544d2cdc39dd8ee629e +Subproject commit f4b3768c9b92bf8d0977374b4a8b5d229c4d393e From fce91b4cf8ac95efa752951433d7e9ffa4e074ae Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Thu, 13 Jun 2013 09:38:41 +0200 Subject: [PATCH 272/281] Depend on automake 1.9 and tar-pax (posix2001) make dist was limited to 99 character long filenames. --- configure.ac | 2 +- mediastreamer2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 0fcf38fc9..ddeebd5ce 100644 --- a/configure.ac +++ b/configure.ac @@ -29,7 +29,7 @@ AC_SUBST(LINPHONE_VERSION) AC_MSG_NOTICE([$PACKAGE_NAME-$PACKAGE_VERSION A full featured audio/video sip phone.]) AC_MSG_NOTICE([licensed under the terms of the General Public License (GPL)]) -AM_INIT_AUTOMAKE +AM_INIT_AUTOMAKE([1.9 tar-pax]) AC_SUBST([LIBTOOL_DEPS]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],) AC_SUBST([docdir], [${datadir}/doc]) diff --git a/mediastreamer2 b/mediastreamer2 index f4b3768c9..64cf0f92e 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit f4b3768c9b92bf8d0977374b4a8b5d229c4d393e +Subproject commit 64cf0f92ee8550ce2a330726b46782eda9819a73 From e2ea0a739f43655d7130641b9170cac5383c4bb3 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 14 Jun 2013 10:52:58 +0200 Subject: [PATCH 273/281] Update oRTP (strtok issue) --- oRTP | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oRTP b/oRTP index 462296433..9853da618 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 462296433f10bd84cb605edb0b38d16a4cd81d9e +Subproject commit 9853da61897a3c01303f9b71f331231b65b2979e From fdd9db221175b00f1d8c127732fd8a1ba6ce7c58 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Fri, 14 Jun 2013 14:37:52 +0200 Subject: [PATCH 274/281] Change silk payload bitrate. --- oRTP | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oRTP b/oRTP index 9853da618..020d921f8 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 9853da61897a3c01303f9b71f331231b65b2979e +Subproject commit 020d921f876ed04d434425fb2176642bbe9b3004 From 4b89219dba3706ad4892e848602a52beb79ade96 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 14 Jun 2013 15:03:42 +0200 Subject: [PATCH 275/281] MS2:fix wrong sampling rate at first startup --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 64cf0f92e..7564a5073 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 64cf0f92ee8550ce2a330726b46782eda9819a73 +Subproject commit 7564a50732292a017363bc39bba63e225c8b93c9 From 8013b13e166d9bfd4cea8bf99eddfa8a4d124dcc Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 17 Jun 2013 14:33:21 +0200 Subject: [PATCH 276/281] fix memory leak with some camera on windows (mainly) --- NEWS | 5 +++++ configure.ac | 2 +- mediastreamer2 | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 0eede9fa5..e1a271db1 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,8 @@ +linphone-3.6.1 -- June 17, 2013 + * fix memory leak with some video cameras on windows. + + Requires: mediastreamer2 = 2.9.1 and ortp = 0.22.0 + linphone-3.6.0 -- May 27, 2013 UI: * new friend list and chat messaging UI diff --git a/configure.ac b/configure.ac index ddeebd5ce..eb4d533e8 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT([linphone],[3.6.0],[linphone-developers@nongnu.org]) +AC_INIT([linphone],[3.6.1],[linphone-developers@nongnu.org]) AC_CANONICAL_SYSTEM AC_CONFIG_SRCDIR([coreapi/linphonecore.c]) diff --git a/mediastreamer2 b/mediastreamer2 index 7564a5073..51d3c20b5 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 7564a50732292a017363bc39bba63e225c8b93c9 +Subproject commit 51d3c20b5ac8c0c8ad4be8fc73d8fa4df195d017 From 569217eacb807835ac74e5909a68c6ee1c7151c2 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Tue, 18 Jun 2013 18:39:44 +0200 Subject: [PATCH 277/281] improve documentation of macos x compilation, especially regarding generating bundle compatible with older macos version. --- README.macos | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/README.macos b/README.macos index dd39c2f6e..e2f1593bd 100644 --- a/README.macos +++ b/README.macos @@ -7,6 +7,10 @@ You need: - Macports: http://www.macports.org/ Download and install macports using its user friendly installer. +- In order to enable generation of bundle for multiple macos version it is recommended to edit /opt/local/etc/macports/macports.conf to add the + following line: + macosx_deployment_target 10.6 + - Install build time dependencies $ sudo port install automake autoconf libtool intltool @@ -17,7 +21,22 @@ You need: $ sudo port install ffmpeg-devel -gpl2 $ sudo port install libvpx $ sudo port install readline - + + +- Install gtk. It is recommended to use the quartz backend for better integration. + $ sudo port install gtk2 +quartz +no_x11 + $ sudo port install gtk-osx-application -python27 + $ sudo port install hicolor-icon-theme + +- Install additional librairies required for wizard (linphone.org account creation assistant) + $ sudo port install libsoup + +- Install sqlite3 for message storage + $ sudo port install sqlite3 + +The softwares below need to be compiled manually. To ensure compatibility with multiple mac os version it is recommended to do: + $ export MACOSX_DEPLOYMENT_TARGET=10.6 + - Install srtp (optional) for call encryption $ sudo port install srtp If that fails, get from source: @@ -31,17 +50,6 @@ You need: $ cd zrtpcpp && cmake -Denable-ccrtp=false . && make $ sudo make install -- Install gtk. It is recommended to use the quartz backend for better integration. - $ sudo port install gtk2 +quartz +no_x11 - $ sudo port install gtk-osx-application -python27 - $ sudo port install hicolor-icon-theme - -- Install additional librairies required for wizard (linphone.org account creation assistant) - $ sudo port install libsoup - - - Install sqlite3 for message storage - $ sudo port install sqlite3 - ** WARNING 2013-03-06 glib-networking is currently broken in macports - generates crashes or hangs when used in a bundle ** As a temporary workaround, build a newer version by yourself: $ wget http://ftp.gnome.org/pub/gnome/sources/glib-networking/2.34/glib-networking-2.34.2.tar.xz @@ -58,7 +66,6 @@ You need: $ ./configure --prefix=/opt/local && make && sudo make install - - Compile linphone If you got the source code from git, run ./autogen.sh first. @@ -82,8 +89,7 @@ Use git: $ sudo touch touch /opt/local/lib/charset.alias Then run, inside linphone source tree: - 1. Run configure as told before but with "--enable-relativeprefix" appended. - + Run configure as told before but with "--enable-relativeprefix" appended. $ make $ make bundle From 3bff0cef821cf8f8c42fc78aa30917469d7bf0b2 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 20 Jun 2013 11:36:58 +0200 Subject: [PATCH 278/281] allow contact address to be changed during call updates --- coreapi/linphonecore.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 202519d76..34c849595 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2821,6 +2821,10 @@ int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call){ if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Modifying call parameters...")); sal_call_set_local_media_description (call->op,call->localdesc); + if (call->dest_proxy && call->dest_proxy->op){ + /*give a chance to update the contact address if connectivity has changed*/ + sal_op_set_contact(call->op,sal_op_get_contact(call->dest_proxy->op)); + }else sal_op_set_contact(call->op,NULL); return sal_call_update(call->op,subject); } From 928315fcf1a88c3a1dded5fd2ec113c9a1e476d9 Mon Sep 17 00:00:00 2001 From: Yann Diorcet Date: Fri, 21 Jun 2013 11:31:49 +0200 Subject: [PATCH 279/281] Update ms2 (msdscap bug fix) --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 51d3c20b5..08e53b3ae 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 51d3c20b5ac8c0c8ad4be8fc73d8fa4df195d017 +Subproject commit 08e53b3ae265c5927efc420ae68e16e500ac0500 From eae019e10e202c5f3c2c7bfdf280f8d0166ef9ee Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 24 Jun 2013 11:53:32 +0200 Subject: [PATCH 280/281] update MS2 for 32bits video on macosx --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 08e53b3ae..94b4434c3 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 08e53b3ae265c5927efc420ae68e16e500ac0500 +Subproject commit 94b4434c34d1ae9de5438b9cfa614ee1821eb709 From 398f7905d87446ecd71946a487ea6656bade7cb1 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 25 Jun 2013 12:16:34 +0200 Subject: [PATCH 281/281] fix linux 32 bits compilation issue --- mediastreamer2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mediastreamer2 b/mediastreamer2 index 94b4434c3..4ccd8ca51 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 94b4434c34d1ae9de5438b9cfa614ee1821eb709 +Subproject commit 4ccd8ca511eb46375699f5efaf8f41b655e0dbb8