diff --git a/Makefile.am b/Makefile.am index 70d680fdf..d4e2be854 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) @@ -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/NEWS b/NEWS index 413970e6a..e1a271db1 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,29 @@ -linphone-3.xxx -- +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 + * 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 7e68bb199..a1fb5bd3d 100644 --- a/README +++ b/README @@ -2,21 +2,62 @@ 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.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) - 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 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 + $ 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 + + +- Compile linphone + + $ ./autogen.sh + $ ./configure + $ make && sudo make install + $ sudo ldconfig + -with their corresponding -dev or -devel package if you don't use source packages. For windows compilation see README.mingw. For macOS X, see README.macos diff --git a/README.macos b/README.macos index 1648a3135..e2f1593bd 100644 --- a/README.macos +++ b/README.macos @@ -7,57 +7,78 @@ 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 - $ 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 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 - $ 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 ige-mac-integration - $ port install hicolor-icon-theme + ** 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 --without-ca-certificates && 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: @@ -68,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 @@ -85,4 +105,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/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: diff --git a/build/android/Android-no-neon.mk b/build/android/Android-no-neon.mk index d0c87b4f8..39818fbf4 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 @@ -36,11 +35,16 @@ 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 := liblinphonex86 endif include $(BUILD_SHARED_LIBRARY) $(call import-module,android/cpufeatures) - diff --git a/build/android/Android.mk b/build/android/Android.mk index b46664b61..0dc0bd041 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 @@ -35,7 +34,11 @@ LOCAL_SHARED_LIBRARIES += \ endif LOCAL_MODULE := liblinphone +ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) +LOCAL_MODULE_FILENAME := liblinphonearmv7 +endif include $(BUILD_SHARED_LIBRARY) $(call import-module,android/cpufeatures) + diff --git a/build/android/common.mk b/build/android/common.mk index d629b54af..d0bf70cad 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.cc + linphone_tunnel_config.c \ + message_storage.c ifndef LINPHONE_VERSION LINPHONE_VERSION = "Devel" @@ -55,13 +56,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 +77,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 \ @@ -97,15 +96,24 @@ LOCAL_STATIC_LIBRARIES := \ libosip2 \ libgsm +ifeq ($(BUILD_REMOTE_PROVISIONING),1) +LOCAL_STATIC_LIBRARIES += \ + libxml2lpc \ + liblpc2xml \ + liblpxml2 +endif + 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 @@ -152,6 +160,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/build/android/lpc2xml.mk b/build/android/lpc2xml.mk new file mode 100644 index 000000000..d93be9b79 --- /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 = \ +# liblinphonenoneon \ +# liblinphone \ + +LOCAL_MODULE := liblpc2xml + +include $(BUILD_STATIC_LIBRARY) diff --git a/build/android/xml2lpc.mk b/build/android/xml2lpc.mk new file mode 100644 index 000000000..55e4a03a0 --- /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 = \ +# liblinphonenoneon \ +# liblinphone \ + +LOCAL_MODULE := libxml2lpc + +include $(BUILD_STATIC_LIBRARY) 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" 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 diff --git a/configure.ac b/configure.ac index c53e02f24..d74897614 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.1],[linphone-developers@nongnu.org]) AC_CANONICAL_SYSTEM AC_CONFIG_SRCDIR([coreapi/linphonecore.c]) @@ -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]) @@ -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,21 +82,38 @@ 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]) -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 +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 -],[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 -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]) @@ -123,62 +140,101 @@ 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] +) + +if test "$build_upnp" != "false" ; then + 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 + 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 >= 2.9 ],[], - [ - if test "$build_tools" = "true" ; then + PKG_CHECK_MODULES(LIBXML2, [libxml-2.0],[], + [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) 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 @@ -186,33 +242,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 @@ -221,37 +279,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]) @@ -260,12 +322,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 @@ -274,29 +338,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 @@ -305,21 +375,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} @@ -356,12 +429,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) @@ -369,29 +444,20 @@ 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 + 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, @@ -403,16 +469,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 @@ -429,29 +499,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) @@ -474,44 +550,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) @@ -523,9 +599,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 " @@ -540,26 +616,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) @@ -569,31 +645,50 @@ 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) + AC_DEFINE(TUNNEL_ENABLED,1,[Tells tunnel extension is built-in]) +fi + +AC_ARG_ENABLE(msg-storage, + [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=auto] +) + + +AM_CONDITIONAL(BUILD_MSG_STORAGE, test x$enable_msg_storage = xtrue) +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 - - - - - - - - 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 @@ -606,19 +701,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]) @@ -631,7 +728,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(<<, >>) @@ -644,12 +741,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) @@ -663,44 +762,46 @@ 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 -daemon/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 + daemon/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" "Message storage" $enable_msg_storage +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/console/Makefile.am b/console/Makefile.am index 23a7635d1..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 @@ -26,11 +27,9 @@ 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) \ + $(SQLITE3_LIBS) \ $(X11_LIBS) if BUILD_WIN32 diff --git a/console/commands.c b/console/commands.c index 472531795..67b2446f4 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" @@ -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); @@ -896,6 +902,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; } @@ -1962,7 +1971,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; @@ -2501,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/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/Makefile.am b/coreapi/Makefile.am index 790612cab..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 @@ -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 @@ -47,15 +47,22 @@ liblinphone_la_SOURCES=\ lsd.c linphonecore_utils.h \ ec-calibrator.c \ conference.c \ - linphone_tunnel.cc \ + message_storage.c \ $(GITVERSION_FILE) + +if BUILD_UPNP +liblinphone_la_SOURCES+=upnp.c upnp.h +endif if BUILD_WIZARD liblinphone_la_SOURCES+=sipwizard.c endif +liblinphone_la_SOURCES+=linphone_tunnel_config.c if BUILD_TUNNEL -liblinphone_la_SOURCES+=TunnelManager.cc TunnelManager.hh +liblinphone_la_SOURCES+=linphone_tunnel.cc TunnelManager.cc TunnelManager.hh +else +liblinphone_la_SOURCES+=linphone_tunnel_stubs.c endif @@ -67,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 @@ -100,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/TunnelManager.cc b/coreapi/TunnelManager.cc index 8ce6da7e5..409f9c42a 100644 --- a/coreapi/TunnelManager.cc +++ b/coreapi/TunnelManager.cc @@ -102,11 +102,19 @@ 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)); } 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); } @@ -181,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){ @@ -206,6 +214,7 @@ TunnelManager::TunnelManager(LinphoneCore* lc) :TunnelClientController() ,mEnabled(false) ,mTunnelClient(NULL) ,mAutoDetectStarted(false) +,mReady(false) ,mHttpProxyPort(0){ mExosipTransport.data=this; @@ -253,7 +262,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; @@ -263,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)) { @@ -270,6 +280,7 @@ void TunnelManager::processTunnelEvent(const Event &ev){ linphone_proxy_config_edit(lProxy); linphone_core_iterate(mCore); } + mReady=false; } } @@ -309,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/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/callbacks.c b/coreapi/callbacks.c index 1f7ff42fd..a6b49a0e8 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) { @@ -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){ @@ -261,6 +264,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); } @@ -334,9 +344,15 @@ 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); + if (md) + call->params.has_video &= linphone_core_media_description_contains_video_stream(md); if (call->state==LinphoneCallOutgoingProgress || call->state==LinphoneCallOutgoingRinging || @@ -345,6 +361,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_core_incompatible_security(lc,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 +442,13 @@ 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_upnp_from_remote_media_description(call, rmd); + linphone_core_update_local_media_description_from_upnp(call->localdesc,call->upnp_session); + } +#endif //BUILD_UPNP + linphone_call_update_remote_session_id_and_ver(call); sal_call_accept(call->op); md=sal_call_get_final_media_description(call->op); if (md && !sal_media_description_empty(md)) @@ -520,6 +544,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"); } @@ -589,7 +617,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)); } @@ -616,12 +644,21 @@ 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."); } 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."); + linphone_core_play_named_tone(lc,LinphoneToneBusy); } else { linphone_call_set_state(call,LinphoneCallError,msg); } @@ -777,7 +814,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. @@ -810,10 +847,10 @@ 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->from,msg->text,msg->url); + linphone_core_message_received(lc,op,msg); } } @@ -902,9 +939,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); + 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 00f237377..c12bb3398 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,15 +49,19 @@ 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){ @@ -55,8 +70,9 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM SalOp *op=NULL; LinphoneCall *call; char* content_type; + time_t t=time(NULL); - 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 || @@ -69,26 +85,39 @@ 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); 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); } - - + msg->dir=LinphoneChatMessageOutgoing; + msg->from=linphone_address_new(identity); + linphone_chat_message_store(msg); } +/** + * 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,14 +132,15 @@ 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){ - 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; - LinphoneChatMessage* msg; - addr=linphone_address_new(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)){ @@ -118,59 +148,114 @@ void linphone_core_message_received(LinphoneCore *lc, const char *from, const ch } cr=NULL; } + 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){ /* 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); + + { + 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); + + if (sal_msg->url) { + linphone_chat_message_set_external_body_url(msg, sal_msg->url); } linphone_address_destroy(addr); + linphone_chat_message_store(msg); linphone_chat_room_message_received(cr,lc,msg); ms_free(cleanfrom); + ms_free(from); } +/** + * 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; + msg->is_read=TRUE; 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) { +/** + * 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; + msg->state=LinphoneChatMessageStateInProgress; _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"; @@ -182,48 +267,143 @@ 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); - } -LinphoneAddress* linphone_chat_message_get_from(const LinphoneChatMessage* message) { + +/** + * Get origin of the message + *@param message #LinphoneChatMessage obj + *@return #LinphoneAddress + */ +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. + */ +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. + */ 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; @@ -233,6 +413,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); @@ -240,6 +423,27 @@ 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; } + +/** + * 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); + 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/conference.c b/coreapi/conference.c index 9f1538f42..0d8ea39a0 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; @@ -161,11 +177,11 @@ 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. **/ int linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call){ - LinphoneCallParams params; LinphoneConference *conf=&lc->conf_ctx; if (call->current_params.in_conference){ @@ -173,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)); @@ -214,16 +234,19 @@ 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); + err=_linphone_core_pause_call(lc,call); } return err; @@ -256,10 +279,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){ @@ -319,7 +345,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); @@ -377,10 +403,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/ec-calibrator.c b/coreapi/ec-calibrator.c index 7fb001d3d..fa92b4992 100644 --- a/coreapi/ec-calibrator.c +++ b/coreapi/ec-calibrator.c @@ -29,37 +29,47 @@ 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; 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); + 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); 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); 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); - 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); + 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); @@ -67,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); @@ -97,72 +114,118 @@ 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){ 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); + /* 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.frequencies[0]=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); - tone.frequency=2000; + + /* play the three tones*/ + + tone.frequencies[0]=2000; + tone.duration=100; + ms_filter_call_method(ecc->gen,MS_DTMF_GEN_PLAY_CUSTOM,&tone); + ms_usleep(300000); + + tone.frequencies[0]=2300; + tone.duration=100; + ms_filter_call_method(ecc->gen,MS_DTMF_GEN_PLAY_CUSTOM,&tone); + ms_usleep(300000); + + tone.frequencies[0]=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."); } } @@ -176,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); @@ -197,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/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/linphone_tunnel.cc b/coreapi/linphone_tunnel.cc index c76441f5a..079074aa8 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" @@ -35,67 +33,6 @@ LinphoneTunnel* linphone_core_get_tunnel(LinphoneCore *lc){ return lc->tunnel; } -struct _LinphoneTunnelConfig { - char *host; - int port; - int remote_udp_mirror_port; - int delay; -}; - -LinphoneTunnelConfig *linphone_tunnel_config_new() { - LinphoneTunnelConfig *ltc = ms_new0(LinphoneTunnelConfig,1); - ltc->remote_udp_mirror_port = 12345; - ltc->delay = 1000; - return ltc; -} - -void linphone_tunnel_config_set_host(LinphoneTunnelConfig *tunnel, const char *host) { - if(tunnel->host != NULL) { - ms_free(tunnel->host); - tunnel->host = NULL; - } - if(host != NULL && strlen(host)) { - tunnel->host = ms_strdup(host); - } -} - -const char *linphone_tunnel_config_get_host(LinphoneTunnelConfig *tunnel) { - return tunnel->host; -} - -void linphone_tunnel_config_set_port(LinphoneTunnelConfig *tunnel, int port) { - tunnel->port = port; -} - -int linphone_tunnel_config_get_port(LinphoneTunnelConfig *tunnel) { - return tunnel->port; -} - -void linphone_tunnel_config_set_remote_udp_mirror_port(LinphoneTunnelConfig *tunnel, int remote_udp_mirror_port) { - tunnel->remote_udp_mirror_port = remote_udp_mirror_port; -} - -int linphone_tunnel_config_get_remote_udp_mirror_port(LinphoneTunnelConfig *tunnel) { - return tunnel->remote_udp_mirror_port; -} - -void linphone_tunnel_config_set_delay(LinphoneTunnelConfig *tunnel, int delay) { - tunnel->delay = delay; -} - -int linphone_tunnel_config_get_delay(LinphoneTunnelConfig *tunnel) { - return tunnel->delay; -} - -void linphone_tunnel_config_destroy(LinphoneTunnelConfig *tunnel) { - if(tunnel->host != NULL) { - ms_free(tunnel->host); - } - ms_free(tunnel); -} - -#ifdef TUNNEL_ENABLED - struct _LinphoneTunnel { belledonnecomm::TunnelManager *manager; MSList *config_list; @@ -122,16 +59,16 @@ void linphone_tunnel_destroy(LinphoneTunnel *tunnel){ static char *linphone_tunnel_config_to_string(const LinphoneTunnelConfig *tunnel_config) { char *str = NULL; - if(tunnel_config->remote_udp_mirror_port != -1) { + if(linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config) != -1) { str = ms_strdup_printf("%s:%d:%d:%d", - tunnel_config->host, - tunnel_config->port, - tunnel_config->remote_udp_mirror_port, - tunnel_config->delay); + linphone_tunnel_config_get_host(tunnel_config), + linphone_tunnel_config_get_port(tunnel_config), + linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config), + linphone_tunnel_config_get_delay(tunnel_config)); } else { str = ms_strdup_printf("%s:%d", - tunnel_config->host, - tunnel_config->port); + linphone_tunnel_config_get_host(tunnel_config), + linphone_tunnel_config_get_port(tunnel_config)); } return str; } @@ -209,11 +146,14 @@ static void linphone_tunnel_save_config(LinphoneTunnel *tunnel) { static void linphone_tunnel_add_server_intern(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config) { - if(tunnel_config->remote_udp_mirror_port == -1) { - bcTunnel(tunnel)->addServer(tunnel_config->host, tunnel_config->port); + if(linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config) == -1) { + bcTunnel(tunnel)->addServer(linphone_tunnel_config_get_host(tunnel_config), + linphone_tunnel_config_get_port(tunnel_config)); } else { - bcTunnel(tunnel)->addServer(tunnel_config->host, tunnel_config->port, - tunnel_config->remote_udp_mirror_port, tunnel_config->delay); + bcTunnel(tunnel)->addServer(linphone_tunnel_config_get_host(tunnel_config), + linphone_tunnel_config_get_port(tunnel_config), + linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config), + linphone_tunnel_config_get_delay(tunnel_config)); } tunnel->config_list = ms_list_append(tunnel->config_list, tunnel_config); } @@ -293,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; /* @@ -385,60 +329,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, LinphoneTunnelConfig *tunnel_config){ -} - -void linphone_tunnel_remove_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config){ -} - -const MSList *linphone_tunnel_get_servers(LinphoneTunnel *tunnel){ - return NULL; -} - -void linphone_tunnel_clean_servers(LinphoneTunnel *tunnel){ -} - -void linphone_tunnel_enable(LinphoneTunnel *tunnel, bool_t enabled){ -} - -bool_t linphone_tunnel_enabled(LinphoneTunnel *tunnel){ - return FALSE; -} - - -void linphone_tunnel_enable_logs_with_handler(LinphoneTunnel *tunnel, bool_t enabled, OrtpLogFunc logHandler){ -} - -void linphone_tunnel_set_http_proxy_auth_info(LinphoneTunnel *tunnel, const char* username,const char* passwd){ -} - -void linphone_tunnel_set_http_proxy(LinphoneTunnel*tunnel, const char *host, int port, const char* username,const char* passwd){ -} - -void linphone_tunnel_get_http_proxy(LinphoneTunnel*tunnel,const char **host, int *port, const char **username, const char **passwd){ -} - -void linphone_tunnel_reconnect(LinphoneTunnel *tunnel){ -} - -void linphone_tunnel_auto_detect(LinphoneTunnel *tunnel){ -} - -void linphone_tunnel_configure(LinphoneTunnel *tunnel){ -} - - -#endif - - - - - diff --git a/coreapi/linphone_tunnel.h b/coreapi/linphone_tunnel.h index 03c568e4e..f02baab54 100644 --- a/coreapi/linphone_tunnel.h +++ b/coreapi/linphone_tunnel.h @@ -68,7 +68,7 @@ void linphone_tunnel_config_set_host(LinphoneTunnelConfig *tunnel, const char *h * * @param tunnel configuration object */ -const char *linphone_tunnel_config_get_host(LinphoneTunnelConfig *tunnel); +const char *linphone_tunnel_config_get_host(const LinphoneTunnelConfig *tunnel); /** * Set tls port of server. @@ -83,7 +83,7 @@ void linphone_tunnel_config_set_port(LinphoneTunnelConfig *tunnel, int port); * * @param tunnel configuration object */ -int linphone_tunnel_config_get_port(LinphoneTunnelConfig *tunnel); +int linphone_tunnel_config_get_port(const LinphoneTunnelConfig *tunnel); /** * Set the remote port on the tunnel server side used to test udp reachability. @@ -98,7 +98,7 @@ void linphone_tunnel_config_set_remote_udp_mirror_port(LinphoneTunnelConfig *tun * * @param tunnel configuration object */ -int linphone_tunnel_config_get_remote_udp_mirror_port(LinphoneTunnelConfig *tunnel); +int linphone_tunnel_config_get_remote_udp_mirror_port(const LinphoneTunnelConfig *tunnel); /** * Set the udp packet round trip delay in ms for a tunnel configuration. @@ -113,7 +113,7 @@ void linphone_tunnel_config_set_delay(LinphoneTunnelConfig *tunnel, int delay); * * @param tunnel configuration object */ -int linphone_tunnel_config_get_delay(LinphoneTunnelConfig *tunnel); +int linphone_tunnel_config_get_delay(const LinphoneTunnelConfig *tunnel); /** * Destroy a tunnel configuration @@ -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_config.c b/coreapi/linphone_tunnel_config.c new file mode 100644 index 000000000..f38568016 --- /dev/null +++ b/coreapi/linphone_tunnel_config.c @@ -0,0 +1,83 @@ +/*************************************************************************** + * linphone_tunnel_config.c + * + * Copyright 2012 Belledonne Communications + ****************************************************************************/ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "linphone_tunnel.h" + +struct _LinphoneTunnelConfig { + char *host; + int port; + int remote_udp_mirror_port; + int delay; +}; + +LinphoneTunnelConfig *linphone_tunnel_config_new() { + LinphoneTunnelConfig *ltc = ms_new0(LinphoneTunnelConfig,1); + ltc->remote_udp_mirror_port = 12345; + ltc->delay = 1000; + return ltc; +} + +void linphone_tunnel_config_set_host(LinphoneTunnelConfig *tunnel, const char *host) { + if(tunnel->host != NULL) { + ms_free(tunnel->host); + tunnel->host = NULL; + } + if(host != NULL && strlen(host)) { + tunnel->host = ms_strdup(host); + } +} + +const char *linphone_tunnel_config_get_host(const LinphoneTunnelConfig *tunnel) { + return tunnel->host; +} + +void linphone_tunnel_config_set_port(LinphoneTunnelConfig *tunnel, int port) { + tunnel->port = port; +} + +int linphone_tunnel_config_get_port(const LinphoneTunnelConfig *tunnel) { + return tunnel->port; +} + +void linphone_tunnel_config_set_remote_udp_mirror_port(LinphoneTunnelConfig *tunnel, int remote_udp_mirror_port) { + tunnel->remote_udp_mirror_port = remote_udp_mirror_port; +} + +int linphone_tunnel_config_get_remote_udp_mirror_port(const LinphoneTunnelConfig *tunnel) { + return tunnel->remote_udp_mirror_port; +} + +void linphone_tunnel_config_set_delay(LinphoneTunnelConfig *tunnel, int delay) { + tunnel->delay = delay; +} + +int linphone_tunnel_config_get_delay(const LinphoneTunnelConfig *tunnel) { + return tunnel->delay; +} + +void linphone_tunnel_config_destroy(LinphoneTunnelConfig *tunnel) { + if(tunnel->host != NULL) { + ms_free(tunnel->host); + } + ms_free(tunnel); +} + diff --git a/coreapi/linphone_tunnel_stubs.c b/coreapi/linphone_tunnel_stubs.c new file mode 100644 index 000000000..0865704a0 --- /dev/null +++ b/coreapi/linphone_tunnel_stubs.c @@ -0,0 +1,87 @@ +/*************************************************************************** + * linphone_tunnel.cc + * + * Fri Dec 9, 2011 + * Copyright 2011 Belledonne Communications + * Author: Guillaume Beraudo + * Email: guillaume dot beraudo at linphone dot org + ****************************************************************************/ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "linphone_tunnel.h" +#include "linphonecore.h" +#include "private.h" +#include "lpconfig.h" + + +LinphoneTunnel* linphone_core_get_tunnel(LinphoneCore *lc){ + return lc->tunnel; +} + +/*stubs to avoid to have #ifdef TUNNEL_ENABLED in upper layers*/ + +void linphone_tunnel_destroy(LinphoneTunnel *tunnel){ +} + + +void linphone_tunnel_add_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config){ +} + +void linphone_tunnel_remove_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config){ +} + +const MSList *linphone_tunnel_get_servers(LinphoneTunnel *tunnel){ + return NULL; +} + +void linphone_tunnel_clean_servers(LinphoneTunnel *tunnel){ +} + +void linphone_tunnel_enable(LinphoneTunnel *tunnel, bool_t enabled){ +} + +bool_t linphone_tunnel_enabled(LinphoneTunnel *tunnel){ + return FALSE; +} + +bool_t linphone_tunnel_connected(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){ +} + diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 3bf93f78e..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 } @@ -173,9 +177,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 +191,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 +227,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 +253,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; @@ -283,6 +306,12 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall * linphone_core_update_local_media_description_from_ice(md, call->ice_session); linphone_core_update_ice_state_in_call_stats(call); } +#ifdef BUILD_UPNP + if(call->upnp_session != NULL) { + linphone_core_update_local_media_description_from_upnp(md, call->upnp_session); + linphone_core_update_upnp_state_in_call_stats(call); + } +#endif //BUILD_UPNP linphone_address_destroy(addr); call->localdesc=md; if (old_md) sal_media_description_unref(old_md); @@ -416,6 +445,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 } @@ -439,9 +473,12 @@ 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); - call->params=*params; + _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(); ice_session_set_role(call->ice_session, IR_Controlling); @@ -449,6 +486,13 @@ 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) { + if(!lc->rtp_conf.disable_upnp) { + call->upnp_session = linphone_upnp_session_new(call); + } + } +#endif //BUILD_UPNP call->camera_active=params->has_video; discover_mtu(lc,linphone_address_get_domain (to)); @@ -470,18 +514,25 @@ 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); - 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); @@ -510,6 +561,21 @@ 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 + 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 + break; default: break; } @@ -658,6 +724,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); @@ -682,7 +751,7 @@ static void linphone_call_destroy(LinphoneCall *obj) if (obj->auth_token) { ms_free(obj->auth_token); } - + linphone_call_params_uninit(&obj->params); ms_free(obj); } @@ -717,7 +786,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; } @@ -755,6 +826,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; } } @@ -847,6 +919,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. @@ -898,6 +980,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. **/ @@ -926,10 +1020,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; } @@ -966,10 +1067,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; } @@ -982,6 +1089,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; } @@ -1001,33 +1111,46 @@ 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); +} + +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); +} + +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); } -#endif /** - * + * Copy existing LinphoneCallParams to a new LinphoneCallParams object. **/ 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; } +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){ + linphone_call_params_uninit(p); ms_free(p); } + /** * @} **/ @@ -1268,10 +1391,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){ @@ -1423,6 +1546,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, @@ -1451,23 +1576,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 */ @@ -1506,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, @@ -1580,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); @@ -1591,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; @@ -1667,18 +1792,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,23 +1814,33 @@ 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 } +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) { + 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); @@ -1715,9 +1852,22 @@ void linphone_call_delete_ice_session(LinphoneCall *call){ } } -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); +#ifdef BUILD_UPNP +void linphone_call_delete_upnp_session(LinphoneCall *call){ + if(call->upnp_session!=NULL) { + linphone_upnp_session_destroy(call->upnp_session); + call->upnp_session=NULL; + } +} +#endif //BUILD_UPNP + +static void linphone_call_log_fill_stats(LinphoneCallLog *log, 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) { @@ -1735,7 +1885,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); } @@ -1751,6 +1902,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; } @@ -1867,10 +2019,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; } /** @@ -1885,20 +2047,83 @@ 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; } +/** + * 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; +} /** * @} @@ -1925,7 +2150,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 { @@ -1934,6 +2159,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){ @@ -2025,6 +2251,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 + linphone_upnp_call_process(call); +#endif //BUILD_UPNP + #ifdef VIDEO_ENABLED if (call->videostream!=NULL) { OrtpEvent *ev; @@ -2047,6 +2278,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) { @@ -2055,6 +2287,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) @@ -2088,6 +2321,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) { @@ -2096,6 +2330,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 ee0be33be..34c849595 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -67,7 +67,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*/ @@ -93,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){ @@ -121,7 +115,8 @@ 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*/ + cl->quality=-1; return cl; } @@ -204,8 +199,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; } @@ -271,10 +266,20 @@ 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. +**/ 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; } @@ -307,13 +312,74 @@ 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 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. +**/ +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; +} +/** + * 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){ 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); } @@ -341,10 +407,24 @@ 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); +} + /** * 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. * @@ -359,6 +439,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); @@ -373,6 +454,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); @@ -398,7 +480,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); @@ -487,11 +569,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)); @@ -516,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); } @@ -528,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; @@ -601,6 +677,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++){ @@ -632,10 +711,13 @@ 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); - 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)); @@ -680,6 +762,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){ @@ -742,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}, @@ -921,11 +1005,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); @@ -933,6 +1020,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(). **/ @@ -1005,14 +1094,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); @@ -1022,6 +1115,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); @@ -1031,6 +1125,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); @@ -1110,18 +1206,18 @@ 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); + 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); } -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; @@ -1190,6 +1286,9 @@ 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=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,"useinbandfec=1; usedtx=1"); linphone_core_handle_static_payloads(lc); ms_init(); @@ -1198,10 +1297,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); @@ -1247,13 +1342,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; } @@ -1264,6 +1365,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) { @@ -1277,6 +1379,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) { @@ -1317,6 +1420,14 @@ void linphone_core_get_local_ip(LinphoneCore *lc, const char *dest, char *result strncpy(result,ip,LINPHONE_IPADDR_SIZE); return; } +#ifdef BUILD_UPNP + else if (lc->upnp != NULL && linphone_core_get_firewall_policy(lc)==LinphonePolicyUseUpnp && + linphone_upnp_context_get_state(lc->upnp) == LinphoneUpnpStateOk) { + ip = linphone_upnp_context_get_external_ipaddress(lc->upnp); + strncpy(result,ip,LINPHONE_IPADDR_SIZE); + return; + } +#endif //BUILD_UPNP if (linphone_core_get_local_ip_for(lc->sip_conf.ipv6_enabled ? AF_INET6 : AF_INET,dest,result)==0) return; /*else fallback to SAL routine that will attempt to find the most realistic interface */ @@ -1566,6 +1677,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) { @@ -1584,6 +1696,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) { @@ -1608,7 +1721,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); } /** @@ -1618,7 +1731,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(lc)) { + lp_config_set_int(lc->config, "sip", "use_info", use_info); + } } /** @@ -1628,7 +1743,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); } /** @@ -1638,7 +1753,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(lc)) { + lp_config_set_int(lc->config, "sip", "use_rfc2833", use_rfc2833); + } } /** @@ -1959,9 +2076,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); } @@ -2000,7 +2119,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>=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." @@ -2008,15 +2127,23 @@ 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){ 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); + 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) { @@ -2045,14 +2172,18 @@ 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 (lp_config_needs_commit(lc->config)) { + lp_config_sync(lc->config); + } } } /** * 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 @@ -2261,6 +2392,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) { @@ -2268,13 +2400,22 @@ 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 (linphone_upnp_session_get_state(call->upnp_session) == LinphoneUpnpStateOk) upnp_ready = TRUE; + } else { + 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; @@ -2422,7 +2563,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); @@ -2475,20 +2616,40 @@ 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 //BUILD_UPNP + } 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 (use_ice==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; @@ -2497,6 +2658,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. **/ @@ -2527,6 +2689,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. @@ -2554,7 +2718,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; @@ -2615,7 +2779,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"); @@ -2641,9 +2805,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 //BUILD_UPNP if (call->params.in_conference){ subject="Conference"; }else{ @@ -2652,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); } @@ -2671,25 +2844,60 @@ 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; - 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; + 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); + 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_params_copy(&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"); - 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; + + // 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. */ + 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_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); @@ -2739,6 +2947,12 @@ 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 //BUILD_UPNP + 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); @@ -2768,6 +2982,8 @@ 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; + bool_t keep_sdp_version; #ifdef VIDEO_ENABLED bool_t old_has_video = call->params.has_video; #endif @@ -2776,6 +2992,15 @@ 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); + 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("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; + } if (params==NULL){ call->params.has_video=lc->video_policy.automatically_accept || call->current_params.has_video; }else @@ -2789,11 +3014,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)) { @@ -2805,8 +3030,25 @@ int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const } else return 0; } } -#endif +#endif //VIDEO_ENABLED } + +#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 + if ((call->params.has_video) && (call->params.has_video != old_has_video)) { + linphone_call_init_video_stream(call); + video_stream_prepare_video(call->videostream); + if (linphone_core_update_upnp(lc, call)<0) { + /* uPnP update failed, proceed with the call anyway. */ + linphone_call_delete_upnp_session(call); + } else return 0; + } +#endif //VIDEO_ENABLED + } +#endif //BUILD_UPNP + linphone_core_start_accept_call_update(lc, call); return 0; } @@ -2905,7 +3147,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); @@ -2920,6 +3162,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.")); @@ -2944,6 +3187,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); @@ -2962,6 +3210,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"); @@ -3010,6 +3263,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 @@ -3081,8 +3337,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; } @@ -3092,7 +3347,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; @@ -3101,8 +3363,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 //BUILD_UPNP if (sal_media_description_has_dir(call->resultdesc,SalStreamSendRecv)){ sal_media_description_set_dir(call->localdesc,SalStreamSendOnly); subject="Call on hold"; @@ -3124,11 +3392,13 @@ 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; } /** * Pause all currently running calls. + * @ingroup call_control **/ int linphone_core_pause_all_calls(LinphoneCore *lc){ const MSList *elem; @@ -3136,7 +3406,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; @@ -3151,7 +3421,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; } } @@ -3180,8 +3454,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 //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"; @@ -3205,6 +3485,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); @@ -3268,6 +3550,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) @@ -3678,18 +3980,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); @@ -3697,6 +3999,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); @@ -3704,6 +4008,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); @@ -3894,6 +4199,31 @@ const char * linphone_core_get_stun_server(const LinphoneCore *lc){ return lc->net_conf.stun_server; } +bool_t linphone_core_upnp_available(){ +#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; } @@ -3950,7 +4280,26 @@ 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; +#ifdef 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; + } + } + linphone_core_enable_keep_alive(lc, (lc->sip_conf.keepalive_period > 0)); +#endif //BUILD_UPNP if (lc->sip_conf.contact) update_primary_contact(lc); if (linphone_core_ready(lc)) lp_config_set_int(lc->config,"net","firewall_policy",pol); @@ -4337,9 +4686,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){ @@ -4353,8 +4702,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); } @@ -4387,16 +4736,28 @@ 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); - 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 } +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" }, @@ -4524,7 +4885,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); @@ -4586,23 +4948,44 @@ 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; +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); } - def.duration=300; - def.frequency=500; - def.amplitude=1; - def.interval=2000; - ms_filter_call_method(f, MS_DTMF_GEN_PLAY_CUSTOM,&def); } /** @@ -4627,6 +5010,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; } @@ -4635,6 +5024,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){ @@ -4730,11 +5126,10 @@ 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","use_info",config->use_info); - lp_config_set_int(lc->config,"sip","use_rfc2833",config->use_rfc2833); + lp_config_set_int(lc->config,"sip","delayed_timeout",config->delayed_timeout); 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); @@ -4788,8 +5183,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) @@ -4892,6 +5287,13 @@ static void linphone_core_uninit(LinphoneCore *lc) usleep(50000); #endif } +#ifdef BUILD_UPNP + if(lc->upnp != NULL) { + linphone_upnp_context_destroy(lc->upnp); + lc->upnp = NULL; + } +#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"); @@ -4922,8 +5324,21 @@ 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); + + linphone_core_message_storage_close(lc); ortp_exit(); linphone_core_set_state(lc,LinphoneGlobalOff,"Off"); #ifdef TUNNEL_ENABLED @@ -4947,9 +5362,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) { @@ -5156,7 +5584,13 @@ 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); } else { sal_set_keepalive_period(lc->sal,0); @@ -5223,7 +5657,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; } @@ -5355,8 +5789,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); @@ -5437,3 +5869,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 55198e319..50686a2c9 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -37,26 +37,40 @@ 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; -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; /** * Object that represents a SIP address. @@ -141,24 +155,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; /**ReleaseStringUTFChars(juserConfig, userConfig); if (factoryConfig) env->ReleaseStringUTFChars(jfactoryConfig, factoryConfig); @@ -654,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,10 +996,24 @@ 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); } +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 @@ -1172,33 +1189,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 @@ -1253,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) { @@ -1367,7 +1508,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 +1537,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; @@ -1446,6 +1587,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; @@ -1508,7 +1666,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(value); + 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; } @@ -1560,7 +1728,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 @@ -1661,12 +1828,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_value, value); +} + extern "C" jstring Java_org_linphone_core_LinphoneChatMessageImpl_getExternalBodyUrl(JNIEnv* env ,jobject thiz ,jlong ptr) { @@ -1686,11 +1873,19 @@ 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" 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 @@ -1837,6 +2032,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_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); + 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); } @@ -1863,6 +2081,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)); @@ -1926,6 +2152,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); @@ -1982,9 +2216,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); } @@ -1995,6 +2231,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); } @@ -2212,6 +2464,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); } @@ -2229,6 +2497,36 @@ 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(); +} + +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); + env->ReleaseStringUTFChars(file, cfile); + 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); +} + 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/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/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/coreapi/lpconfig.c b/coreapi/lpconfig.c index 8457cf650..ca65fd1ff 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"); } @@ -210,30 +211,42 @@ 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){ - lpconfig->filename=ortp_strdup(filename); - lpconfig->file=fopen(filename,"rw"); + 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); + 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(config_filename,&fileStat) == 0) && (S_ISREG(fileStat.st_mode))) { + /* make existing configuration files non-group/world-accessible */ + if (chmod(config_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; } } + if (factory_config_filename != NULL) { + lp_config_read_file(lpconfig, factory_config_filename); + } return lpconfig; } 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/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. diff --git a/coreapi/message_storage.c b/coreapi/message_storage.c new file mode 100644 index 000000000..765543f7a --- /dev/null +++ b/coreapi/message_storage.c @@ -0,0 +1,254 @@ +/* +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"}; + + +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])==LinphoneChatMessageIncoming){ + from=linphone_address_new(argv[2]); + } else { + 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; + 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; + } + ret.tm_isdst=-1; + } + 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,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,LinphoneChatRoom *cr){ + char* errmsg=NULL; + int ret; + ret=sqlite3_exec(db,stmt,callback,cr,&errmsg); + if(ret != SQLITE_OK) { + ms_error("Error in creation: %s.\n", errmsg); + sqlite3_free(errmsg); + } +} + +void linphone_sql_request(sqlite3* db,const char *stmt){ + char* errmsg=NULL; + int ret; + ret=sqlite3_exec(db,stmt,0,0,&errmsg); + if(ret != SQLITE_OK) { + ms_error("linphone_sql_request: error sqlite3_exec(): %s.\n", errmsg); + sqlite3_free(errmsg); + } +} + +void linphone_chat_message_store(LinphoneChatMessage *msg){ + LinphoneCore *lc=linphone_chat_room_get_lc(msg->chat_room); + if (lc->db){ + 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);", + 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); + ms_free(peer); + } +} + +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_chat_room_mark_as_read(LinphoneChatRoom *cr){ + LinphoneCore *lc=linphone_chat_room_get_lc(cr); + int read=1; + + 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,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 *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){ + LinphoneCore *lc=linphone_chat_room_get_lc(cr); + 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 ;",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; +} + +void linphone_close_storage(sqlite3* db){ + sqlite3_close(db); +} + +void linphone_create_table(sqlite3* db){ + 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) { + ms_error("Error in creation: %s.\n", errmsg); + sqlite3_free(errmsg); + } +} + +void linphone_core_message_storage_init(LinphoneCore *lc){ + int ret; + const char *errmsg; + sqlite3 *db; + ret=sqlite3_open(lc->chat_db_file,&db); + if(ret != SQLITE_OK) { + errmsg=sqlite3_errmsg(db); + ms_error("Error in the opening: %s.\n", errmsg); + sqlite3_close(db); + } + linphone_create_table(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_chat_message_store(LinphoneChatMessage *cr){ +} + +void linphone_chat_message_store_state(LinphoneChatMessage *cr){ +} + +void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr){ +} + +MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message){ + return NULL; +} + +void linphone_chat_room_delete_history(LinphoneChatRoom *cr){ +} + +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/coreapi/misc.c b/coreapi/misc.c index 53f0d65cf..36fe7ae3f 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) @@ -234,17 +234,26 @@ 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; } 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); } @@ -734,7 +743,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 +847,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 +866,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,10 +882,10 @@ 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) { + 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) { @@ -930,7 +939,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 +957,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; @@ -988,6 +997,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,9 +1005,18 @@ 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; } +bool_t linphone_core_tone_indications_enabled(LinphoneCore*lc){ + return lp_config_get_int(lc->config,"sound","tone_indications",1); +} #ifdef HAVE_GETIFADDRS @@ -1021,14 +1040,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 +1119,34 @@ 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"); -#ifdef HAVE_GETIFADDRS - if (dest==NULL) { - /*we use getifaddrs for lookup of default interface */ - int found_ifs; + int err; + strcpy(result,type==AF_INET ? "127.0.0.1" : "::1"); - 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){ + 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 + + /*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); + return 0; } #ifndef WIN32 diff --git a/coreapi/offeranswer.c b/coreapi/offeranswer.c index 541a1eee3..9823c24a6 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,9 +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); - } - 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; @@ -322,7 +325,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/private.h b/coreapi/private.h index 29d31b7c6..b5312bd60 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" @@ -38,6 +40,13 @@ extern "C" { #include "mediastreamer2/ice.h" #include "mediastreamer2/mediastream.h" #include "mediastreamer2/msconference.h" +#ifdef BUILD_UPNP +#include "upnp.h" +#endif //BUILD_UPNP + +#ifdef MSG_STORAGE_ENABLED +#include "sqlite3.h" +#endif #ifndef LIBLINPHONE_VERSION #define LIBLINPHONE_VERSION LINPHONE_VERSION @@ -75,29 +84,60 @@ struct _LinphoneCallParams{ int up_bw; int down_ptime; int up_ptime; + char *record_file; + SalCustomHeader *custom_headers; 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 */ bool_t pad; bool_t low_bandwidth; }; - + +struct _LinphoneCallLog{ + struct _LinphoneCore *lc; + LinphoneCallDir dir; /**< The direction of the call*/ + LinphoneCallStatus status; /**< The status of the call*/ + LinphoneAddress *from; /**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); @@ -398,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" }, @@ -407,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" }, @@ -421,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" }, - {"Cte 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" }, - {"Runion 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" }, - {"So Tom and Prncipe" ,"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"}; @@ -777,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) @@ -1076,18 +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); } - if (!lc->sip_conf.register_only_when_network_is_up || lc->network_reachable) + 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); + if (cfg->publish && cfg->publish_op==NULL){ + linphone_proxy_config_send_publish(cfg,lc->presence_mode); + } + cfg->commit=FALSE; } - cfg->commit=FALSE; } } diff --git a/coreapi/sal.c b/coreapi/sal.c index 2b09212aa..1411407a8 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; @@ -277,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; } @@ -308,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; @@ -335,12 +338,18 @@ 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); + if (b->custom_headers) + sal_custom_header_free(b->custom_headers); ms_free(op); } @@ -365,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(const 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 9c0ceca76..25d8d20bc 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*/ @@ -178,7 +182,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; @@ -194,6 +199,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 @@ -220,7 +226,9 @@ typedef struct SalOpBase{ SalMediaDescription *local_media; SalMediaDescription *remote_media; void *user_pointer; - const char* call_id; + char* call_id; + char *remote_contact; + SalCustomHeader *custom_headers; } SalOpBase; @@ -288,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); @@ -343,6 +351,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 @@ -383,6 +392,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 */ @@ -440,16 +450,30 @@ 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*/ 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(const 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); 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 93686a75e..284773c9d 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -1,2582 +1,2688 @@ -/* -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; - - switch (tr) { - case SalTransportUDP: - proto=IPPROTO_UDP; - eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &keepalive); - break; - case SalTransportTCP: - case SalTransportTLS: - proto= IPPROTO_TCP; - 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->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]; - } - } - } - } - -} - -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{ - callid=osip_message_get_call_id(invite); - osip_call_id_to_str(callid,(char **)(&h->base.call_id)); - 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_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; - 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)); - - set_network_origin(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); - - 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 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}; - - 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; - 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_set_keepalive_period(Sal *ctx,unsigned int value) { - ctx->keepalive_period=value; - eXosip_set_option (EXOSIP_OPT_UDP_KEEP_ALIVE, &value); -} -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; -} +/* +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; + break; + 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 && strncasecmp(h->hvalue,"refer",strlen("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 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; + 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; + } + 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); + 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_utc(&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); +} + +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); + + 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_message_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_message_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); + tries++; + 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_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(); + 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 89ac93abf..e00dd64d9 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{ @@ -92,7 +94,11 @@ 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*)); +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 078ec24b4..b9f7b5763 100644 --- a/coreapi/sal_eXosip2_presence.c +++ b/coreapi/sal_eXosip2_presence.c @@ -81,6 +81,26 @@ void sal_remove_in_subscribe(Sal *sal, SalOp *op){ sal->in_subscribes=ms_list_remove(sal->in_subscribes,op); } +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; +#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); +} + + int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg){ osip_message_t *sip=NULL; @@ -97,6 +117,8 @@ 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); + 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); @@ -118,6 +140,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); + 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); @@ -125,6 +149,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); } @@ -612,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, NULL, "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; diff --git a/coreapi/sal_eXosip2_sdp.c b/coreapi/sal_eXosip2_sdp.c index 050a53a76..54865aab6 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 @@ -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; @@ -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)); @@ -456,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){ @@ -536,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); @@ -602,6 +613,6 @@ int sdp_to_media_description(sdp_message_t *msg, SalMediaDescription *desc){ } } } - desc->nstreams=i; + desc->n_total_streams=i; return 0; } 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); diff --git a/coreapi/upnp.c b/coreapi/upnp.c new file mode 100644 index 000000000..0922dad59 --- /dev/null +++ b/coreapi/upnp.c @@ -0,0 +1,1347 @@ +/* +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 "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 +#define UPNP_SECTION_NAME "uPnP" +#define UPNP_CORE_READY_CHECK 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) +/* + * uPnP Definitions + */ + +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]; + int external_port; + int retry; + int ref; + bool_t to_remove; + bool_t to_add; + time_t last_update; +} UpnpPortBinding; + +typedef struct _UpnpStream { + UpnpPortBinding *rtp; + UpnpPortBinding *rtcp; + LinphoneUpnpState state; +} UpnpStream; + +struct _UpnpSession { + LinphoneCall *call; + UpnpStream *audio; + UpnpStream *video; + LinphoneUpnpState state; +}; + +struct _UpnpContext { + LinphoneCore *lc; + upnp_igd_context *upnp_igd_ctxt; + UpnpPortBinding *sip_tcp; + UpnpPortBinding *sip_tls; + UpnpPortBinding *sip_udp; + LinphoneUpnpState state; + MSList *removing_configs; + MSList *adding_configs; + MSList *pending_bindings; + + ms_mutex_t mutex; + ms_cond_t empty_cond; + + time_t last_ready_check; + LinphoneUpnpState last_ready_state; +}; + + +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); +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); +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); +void linphone_upnp_update_proxy(UpnpContext *lupnp, bool_t force); + +// Configuration +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); + +// 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); + +static int linphone_upnp_strncmpi(const char *str1, const char *str2, int len) { + int i = 0; + char char1, char2; + while(i < len) { + char1 = toupper(*str1); + char2 = toupper(*str2); + 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) { + 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 + */ + +/* 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_DEBUG; // Too verbose otherwise + break; + case UPNP_IGD_ERROR: + ortp_level = ORTP_DEBUG; // Too verbose otherwise + break; + default: + break; + } + ortp_logv(ortp_level, fmt, list); +} + +void linphone_upnp_igd_callback(void *cookie, upnp_igd_event event, void *arg) { + UpnpContext *lupnp = (UpnpContext *)cookie; + 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; + 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); + 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: + 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) { + ms_message("uPnP IGD: Pending"); + lupnp->state = LinphoneUpnpStatePending; + } else if(strcasecmp(connection_status, "Connected") || !nat_enabled) { + ms_message("uPnP IGD: Not Available"); + lupnp->state = LinphoneUpnpStateNotAvailable; + } else { + ms_message("uPnP IGD: Connected"); + lupnp->state = LinphoneUpnpStateOk; + if(old_state != LinphoneUpnpStateOk) { + linphone_core_upnp_refresh(lupnp); + } + } + + break; + + case UPNP_IGD_PORT_MAPPING_ADD_SUCCESS: + mapping = (upnp_igd_port_mapping *) arg; + port_mapping = (UpnpPortBinding*) mapping->cookie; + port_mapping->external_port = mapping->remote_port; + port_mapping->state = LinphoneUpnpStateOk; + linphone_upnp_port_binding_log(ORTP_MESSAGE, "Added port binding", port_mapping); + linphone_upnp_config_add_port_binding(lupnp, 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(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); + } + + break; + + case UPNP_IGD_PORT_MAPPING_REMOVE_SUCCESS: + mapping = (upnp_igd_port_mapping *) arg; + port_mapping = (UpnpPortBinding*) mapping->cookie; + port_mapping->state = LinphoneUpnpStateIdle; + linphone_upnp_port_binding_log(ORTP_MESSAGE, "Removed port binding", port_mapping); + linphone_upnp_config_remove_port_binding(lupnp, port_mapping); + + break; + + 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, 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); + } + + break; + + default: + break; + } + + 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, FALSE); + } else if(port_mapping->state == LinphoneUpnpStateKo) { + port_mapping->to_remove = FALSE; + } + } + 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, FALSE); + } + } + + 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) { + ms_cond_signal(&lupnp->empty_cond); + } + ms_mutex_unlock(&lupnp->mutex); +} + + +/** + * uPnP Context + */ + +UpnpContext* linphone_upnp_context_new(LinphoneCore *lc) { + UpnpContext *lupnp = (UpnpContext *)ms_new0(UpnpContext,1); + + 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; + lupnp->removing_configs = NULL; + lupnp->state = LinphoneUpnpStateIdle; + ms_message("uPnP IGD: New %p for core %p", lupnp, lc); + + // 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); + + lupnp->upnp_igd_ctxt = NULL; + 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"); + return NULL; + } + + lupnp->state = LinphoneUpnpStatePending; + upnp_igd_start(lupnp->upnp_igd_ctxt); + + return lupnp; +} + +void linphone_upnp_context_destroy(UpnpContext *lupnp) { + linphone_core_remove_iterate_hook(lupnp->lc, linphone_core_upnp_hook, lupnp); + + ms_mutex_lock(&lupnp->mutex); + + 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 */ + 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) { + upnp_igd_destroy(lupnp->upnp_igd_ctxt); + lupnp->upnp_igd_ctxt = NULL; + } + + /* No more multi threading here */ + + /* 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) { + linphone_upnp_port_binding_release(lupnp->sip_udp); + lupnp->sip_udp = NULL; + } + if(lupnp->sip_tcp != NULL) { + linphone_upnp_port_binding_release(lupnp->sip_tcp); + lupnp->sip_tcp = NULL; + } + if(lupnp->sip_tls != NULL) { + linphone_upnp_port_binding_release(lupnp->sip_tls); + lupnp->sip_tcp = NULL; + } + + /* Release lists */ + 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*))linphone_upnp_port_binding_release); + 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_destroy(&lupnp->mutex); + ms_cond_destroy(&lupnp->empty_cond); + + ms_message("uPnP IGD: destroy %p", lupnp); + ms_free(lupnp); +} + +LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *lupnp) { + LinphoneUpnpState state = LinphoneUpnpStateKo; + if(lupnp != NULL) { + ms_mutex_lock(&lupnp->mutex); + state = lupnp->state; + ms_mutex_unlock(&lupnp->mutex); + } + return state; +} + +bool_t _linphone_upnp_context_is_ready_for_register(UpnpContext *lupnp) { + bool_t ready = TRUE; + + // 1 Check global uPnP state + ready = (lupnp->state == LinphoneUpnpStateOk); + + // 2 Check external ip address + if(ready) { + if (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; + } + } + + return ready; +} + +bool_t linphone_upnp_context_is_ready_for_register(UpnpContext *lupnp) { + 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; + 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); + } + 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) { + 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, bool_t retry) { + upnp_igd_port_mapping mapping; + char description[128]; + int ret; + + if(lupnp->state != LinphoneUpnpStateOk) { + 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; + } + } + + // No retry if specified + if(port->retry != 0 && !retry) { + return -1; + } + + 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); + + mapping.local_port = port->local_port; + mapping.local_host = port->local_addr; + if(port->external_port == -1) + 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, + (port->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP": "UDP", + port->local_addr, port->local_port); + mapping.description = description; + mapping.protocol = port->protocol; + + port->retry++; + 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) { + port->state = LinphoneUpnpStateKo; + } + return ret; +} + +int linphone_upnp_context_send_remove_port_binding(UpnpContext *lupnp, UpnpPortBinding *port, bool_t retry) { + upnp_igd_port_mapping mapping; + int ret; + + if(lupnp->state != LinphoneUpnpStateOk) { + 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; + } + } + + // No retry if specified + if(port->retry != 0 && !retry) { + return 1; + } + + 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); + + mapping.remote_port = port->external_port; + mapping.remote_host = ""; + mapping.protocol = port->protocol; + port->retry++; + 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) { + port->state = LinphoneUpnpStateKo; + } + return ret; +} + +/* + * uPnP Core interfaces + */ + +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; + + if(lupnp == NULL) { + return ret; + } + + ms_mutex_lock(&lupnp->mutex); + + // Don't handle when the call + if(lupnp->state == LinphoneUpnpStateOk && call->upnp_session != NULL) { + ret = 0; + + /* + * Audio part + */ + 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 + */ + 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); + + /* + * Update uPnP call state + */ + linphone_upnp_call_process(call); + + 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->n_total_streams; 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); +} + +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; +} + +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; + int ret = -1; + LinphoneUpnpState oldState = 0, newState = 0; + + if(lupnp == NULL) { + return ret; + } + + ms_mutex_lock(&lupnp->mutex); + + // Don't handle when the call + if(lupnp->state == LinphoneUpnpStateOk && call->upnp_session != NULL) { + ret = 0; + + /* + * Update Audio state + */ + linphone_upnp_update_stream_state(call->upnp_session->audio); + + /* + * Update Video state + */ + linphone_upnp_update_stream_state(call->upnp_session->video); + + /* + * Update stat + */ + linphone_core_update_upnp_state_in_call_stats(call); + + /* + * 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; + } + newState = call->upnp_session->state; + } + + 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); + + 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; +} + +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"); + + 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); + } + + list = lupnp->lc->calls; + while(list != NULL) { + call = (LinphoneCall *)list->data; + if(call->upnp_session != NULL) { + 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; + } + + 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); + if(port_mapping2 == NULL) { + linphone_upnp_context_send_remove_port_binding(lupnp, port_mapping, TRUE); + } 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, 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)); + } + } + if(external_addr != NULL) { + strncpy((*port_mapping)->external_addr, external_addr, sizeof((*port_mapping)->external_addr)); + } + + // 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; + } + } +} + +void linphone_upnp_update_config(UpnpContext* lupnp) { + char key[64]; + const MSList *item; + 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-%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); + 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-%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); + 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); +} + +void linphone_upnp_update_proxy(UpnpContext* lupnp, bool_t force) { + LinphoneUpnpState ready_state; + const MSList *item; + 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; + 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; + } + } else { + cfg->commit=TRUE; + } + } + } + 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); + return TRUE; +} + +int linphone_core_update_local_media_description_from_upnp(SalMediaDescription *desc, UpnpSession *session) { + int i; + SalStreamDescription *stream; + UpnpStream *upnpStream; + + for (i = 0; i < desc->n_active_streams; 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 != 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 != NULL && upnpStream->rtcp->state == LinphoneUpnpStateOk) { + strncpy(stream->rtcp_addr, upnpStream->rtcp->external_addr, LINPHONE_IPADDR_SIZE); + stream->rtcp_port = upnpStream->rtcp->external_port; + } + } + } + return 0; +} + + +/* + * uPnP Port Binding + */ + +UpnpPortBinding *linphone_upnp_port_binding_new() { + UpnpPortBinding *port = NULL; + port = ms_new0(UpnpPortBinding,1); + 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'; + port->external_port = -1; + 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; + + // 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); + + // Must be not attached to any struct + if(tmp_binding != NULL && tmp_binding->ref == 1) { + linphone_upnp_port_binding_release(end_binding); + end_binding = linphone_upnp_port_binding_retain(tmp_binding); + } else { + end_binding->external_port = external_port; + } + return end_binding; +} + +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, + (port->protocol == UPNP_IGD_IP_PROTOCOL_TCP)? "TCP":"UDP", + port->external_port, + port->local_addr, + port->local_port, + port->retry - 1); + } else { + 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->retry - 1); + } +} + +// 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 && + (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) { + 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 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); + return; + } + ms_mutex_unlock(&port->mutex); +} + + +/* + * uPnP Stream + */ + +UpnpStream* linphone_upnp_stream_new() { + UpnpStream *stream = ms_new0(UpnpStream,1); + stream->state = LinphoneUpnpStateIdle; + stream->rtp = NULL; + stream->rtcp = NULL; + return stream; +} + +void linphone_upnp_stream_destroy(UpnpStream* stream) { + 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); +} + + +/* + * uPnP Session + */ + +UpnpSession* linphone_upnp_session_new(LinphoneCall* call) { + UpnpSession *session = ms_new0(UpnpSession,1); + session->call = call; + session->state = LinphoneUpnpStateIdle; + session->audio = linphone_upnp_stream_new(); + session->video = linphone_upnp_stream_new(); + return session; +} + +void linphone_upnp_session_destroy(UpnpSession *session) { + LinphoneCore *lc = session->call->core; + + if(lc->upnp != NULL) { + /* Remove bindings */ + 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); + } + } + + 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); +} + +LinphoneUpnpState linphone_upnp_session_get_state(UpnpSession *session) { + return session->state; +} + + +/* + * uPnP Config + */ + +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; + + 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) { + return; + } + if(linphone_upnp_strncmpi(protocol_str, "TCP", 3) == 0) { + protocol = UPNP_IGD_IP_PROTOCOL_TCP; + } 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; + 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); + } +} + +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) { + list_port = (UpnpPortBinding *)list->data; + if(linphone_upnp_port_binding_equal(list_port, port) == TRUE) { + lupnp->removing_configs = ms_list_remove(lupnp->removing_configs, list_port); + linphone_upnp_port_binding_release(list_port); + return; + } + list = ms_list_next(list); + } + + list = lupnp->adding_configs; + while(list != NULL) { + list_port = (UpnpPortBinding *)list->data; + if(linphone_upnp_port_binding_equal(list_port, port) == TRUE) { + return; + } + list = ms_list_next(list); + } + + list_port = linphone_upnp_port_binding_copy(port); + lupnp->adding_configs = ms_list_append(lupnp->adding_configs, list_port); +} + +void linphone_upnp_config_remove_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->adding_configs; + while(list != NULL) { + list_port = (UpnpPortBinding *)list->data; + if(linphone_upnp_port_binding_equal(list_port, port) == TRUE) { + lupnp->adding_configs = ms_list_remove(lupnp->adding_configs, list_port); + linphone_upnp_port_binding_release(list_port); + return; + } + list = ms_list_next(list); + } + + list = lupnp->removing_configs; + while(list != NULL) { + list_port = (UpnpPortBinding *)list->data; + if(linphone_upnp_port_binding_equal(list_port, port) == TRUE) { + return; + } + list = ms_list_next(list); + } + + 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 new file mode 100644 index 000000000..d785954a4 --- /dev/null +++ b/coreapi/upnp.h @@ -0,0 +1,48 @@ +/* +linphone +Copyright (C) 2012 Belledonne Communications SARL + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#ifndef LINPHONE_UPNP_H +#define LINPHONE_UPNP_H + +#include "mediastreamer2/upnp_igd.h" +#include "linphonecore.h" +#include "sal.h" + +typedef struct _UpnpSession UpnpSession; +typedef struct _UpnpContext UpnpContext; + +int linphone_core_update_local_media_description_from_upnp(SalMediaDescription *desc, UpnpSession *session); +int linphone_core_update_upnp_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md); +int linphone_core_update_upnp(LinphoneCore *lc, LinphoneCall *call); + +int linphone_upnp_call_process(LinphoneCall *call); +UpnpSession* linphone_upnp_session_new(LinphoneCall *call); +void linphone_upnp_session_destroy(UpnpSession* session); +LinphoneUpnpState linphone_upnp_session_get_state(UpnpSession *session); + +UpnpContext *linphone_upnp_context_new(LinphoneCore *lc); +void linphone_upnp_context_destroy(UpnpContext *ctx); +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); +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/daemon/commands/firewall-policy.cc b/daemon/commands/firewall-policy.cc index 78cff2da7..e9bde0a9b 100644 --- a/daemon/commands/firewall-policy.cc +++ b/daemon/commands/firewall-policy.cc @@ -27,6 +27,9 @@ FirewallPolicyResponse::FirewallPolicyResponse(LinphoneCore *core) : Response() ost << "ice\n"; ost << "Address: " << linphone_core_get_stun_server(core) << "\n"; break; + case LinphonePolicyUseUpnp: + ost << "upnp\n"; + break; } setBody(ost.str().c_str()); } @@ -34,7 +37,7 @@ FirewallPolicyResponse::FirewallPolicyResponse(LinphoneCore *core) : Response() FirewallPolicyCommand::FirewallPolicyCommand() : DaemonCommand("firewall-policy", "firewall-policy [
]", "Set the firewall policy if type is set, otherwise return the used firewall policy.\n" - " must be one of these values: none, nat, stun, ice.\n" + " must be one of these values: none, nat, stun, ice, upnp.\n" "
must be specified for the 'nat' and 'stun' types. " "It represents the public address of the gateway for the 'nat' type and the STUN server address for the 'stun' and 'ice' types.") { addExample(new DaemonCommandExample("firewall-policy stun stun.linphone.org", @@ -73,6 +76,9 @@ void FirewallPolicyCommand::exec(Daemon *app, const char *args) { } else if (type.compare("ice") == 0) { policy = LinphonePolicyUseIce; get_address = true; + } else if (type.compare("upnp") == 0) { + policy = LinphonePolicyUseUpnp; + get_address = false; } else { app->sendResponse(Response("Incorrect type parameter.", Response::Error)); return; diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 78f5d0de7..ba965b69a 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 \ @@ -53,10 +54,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) $(SQLITE3_LIBS) if BUILD_WIN32 @@ -80,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/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/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/call_statistics.ui b/gtk/call_statistics.ui index 444710472..c6f71deb6 100644 --- a/gtk/call_statistics.ui +++ b/gtk/call_statistics.ui @@ -59,7 +59,7 @@ True False - 6 + 7 2 True @@ -134,7 +134,7 @@ True False - Media connectivity + Audio Media connectivity 4 @@ -143,13 +143,7 @@ - - - - - - - + True False @@ -184,6 +178,52 @@ 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 + + diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 9494dbfa2..466541006 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -19,13 +19,12 @@ 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=gtk_cell_renderer_pixbuf_new (); + GtkCellRenderer *r; + 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 (); @@ -33,51 +32,273 @@ 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=NULL; + + select = gtk_tree_view_get_selection(v); + 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); + } + } +} + +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_friend_list_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)){ + char *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; + } + } + 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_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; + const gchar*text=gtk_label_get_text(GTK_LABEL(linphone_gtk_get_widget(mw,"label3"))); + + 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); + gtk_widget_show_all(box); +} + +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; +} + +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")); - GtkListStore *store; + GtkTreeStore *store; const MSList *logs; + GtkTreeSelection *select; + GtkWidget *notebook=linphone_gtk_get_widget(w,"viewswitch"); + gint nb; - 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,G_TYPE_STRING,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"))); } - gtk_list_store_clear (store); + 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){ LinphoneCallLog *cl=(LinphoneCallLog*)logs->data; - GtkTreeIter iter; - LinphoneAddress *la=cl->dir==LinphoneCallIncoming ? cl->from : cl->to; - char *addr= linphone_address_as_string_uri_only (la); + GtkTreeIter iter, iter2; + 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, *minutes, *seconds; + 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); #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); } +#else + start_date=g_strdup(ctime(&start_date_time)); #endif - - display=linphone_address_get_display_name (la); + 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); + } if (display==NULL){ display=linphone_address_get_username (la); - if (display==NULL) + 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; @@ -91,54 +312,39 @@ 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); - 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); - else logtxt=g_markup_printf_escaped( - _("%s\t%s\t" - "\n%s\t%s"), - display, addr, - start_date ? start_date : cl->start_date, status); + ngettext("%i second", "%i seconds", duration%60), + duration%60); + 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_list_store_set (store,&iter, - 0, cl->dir==LinphoneCallOutgoing ? GTK_STOCK_GO_UP : GTK_STOCK_GO_DOWN, - 1, logtxt,2,la,-1); + gtk_tree_store_append (store,&iter,NULL); + + GdkPixbuf *incoming = create_pixbuf("call_status_incoming.png"); + GdkPixbuf *outgoing = create_pixbuf("call_status_outgoing.png"); + gtk_tree_store_set (store,&iter, + 0, linphone_call_log_get_dir(cl)==LinphoneCallOutgoing ? outgoing : incoming, + 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); } - -} - -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){ @@ -154,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)); } @@ -177,8 +384,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(); @@ -193,5 +398,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/chat.c b/gtk/chat.c index 868937573..13c140615 100644 --- a/gtk/chat.c +++ b/gtk/chat.c @@ -23,21 +23,72 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #endif +#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"); 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")); + 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),idx); - linphone_gtk_update_chat_picture(FALSE); + 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); - 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_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); } +const char* get_display_name(const LinphoneAddress *from){ + const char *display; + 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 +100,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,72 +121,95 @@ 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){ - 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); +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")); + GtkTextBuffer *buffer=gtk_text_view_get_buffer(text); + GtkTextIter iter,begin; 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"); + GHashTable *table=(GHashTable*)g_object_get_data(G_OBJECT(w),"table"); + 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); - //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 ? "left" : "left",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_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_get_iter_at_offset(buffer,&begin,off); + 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_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); - 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); - - /*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); - }*/ - - GtkTextMark *mark=gtk_text_buffer_create_mark(buffer,NULL,&iter,FALSE); - gtk_text_view_scroll_mark_onscreen(text,mark); + gtk_text_buffer_get_end_iter(buffer,&iter); + t=linphone_chat_message_get_time(msg); + switch (linphone_chat_message_get_state (msg)){ + case LinphoneChatMessageStateInProgress: + { + 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),"table",table); + break; + } + case LinphoneChatMessageStateDelivered: + { + tnow=time(NULL); + tm=localtime(&tnow); + tnow_day=tm->tm_yday; + tnow_year=tm->tm_year; + 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 { + 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,"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, + "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); + g_idle_add((GSourceFunc)scroll_to_end,text); + ms_free(from_str); } const LinphoneAddress* linphone_gtk_get_used_identity(){ @@ -151,13 +220,11 @@ 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){ - /* GtkWidget *main_window=linphone_gtk_get_main_window(); - GtkWidget *friendlist=linphone_gtk_get_widget(main_window,"contact_list"); +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"); - 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")); @@ -165,105 +232,158 @@ void update_chat_state_message(LinphoneChatMessageState state){ GtkTextIter iter; GtkTextIter end; GtkTextIter start; - - gtk_text_buffer_get_iter_at_line(b,&iter, - GPOINTER_TO_INT(g_list_nth_data(list,0))); - 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); - }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,&end, - 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; + gint line; + line=GPOINTER_TO_INT(g_hash_table_lookup(table,msg)); + + 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,line, + gtk_text_iter_get_chars_in_line(&iter)-1); + }else{ + gtk_text_buffer_get_iter_at_line_offset(b,&start,line,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,line); + 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 "; + result="Message not sent"; 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); - list=g_list_remove(list,g_list_nth_data(list,0)); - g_object_set_data(G_OBJECT(page),"list",list); - } */ + "right","small","italic","font_grey","bg",NULL); + g_hash_table_remove(table,msg); + g_object_set_data(G_OBJECT(page),"table",table); + } } 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(){ - 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"); entered=gtk_entry_get_text(GTK_ENTRY(entry)); if (strlen(entered)>0) { LinphoneChatMessage *msg; - linphone_gtk_push_text(w, - linphone_gtk_get_used_identity(), - entered,TRUE,cr); 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_chat_message_get_from(msg), + TRUE,cr,msg,FALSE); gtk_entry_set_text(GTK_ENTRY(entry),""); } } +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; + 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)); + 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); + } + 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); + } +} + +void linphone_gtk_chat_add_contact(const LinphoneAddress *addr){ + 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 (); - 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; + MSList *messages; + GHashTable *table; + char *with_str; + color.red = 32512; color.green = 32512; color.blue = 32512; + 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); + 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); - + 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),"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)); - - 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); - } - + 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)), @@ -273,52 +393,61 @@ 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); - - GtkWidget *button = linphone_gtk_get_widget(chat_view,"send"); + gtk_text_buffer_create_tag(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), + "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(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); - - 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); - + g_signal_connect(G_OBJECT(notebook),"switch_page",(GCallback)linphone_gtk_notebook_tab_select,NULL); + ms_free(with_str); return chat_view; } 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; } 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) - { - 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; - 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); - } + LinphoneChatRoom *cr2=(LinphoneChatRoom *)g_object_get_data(G_OBJECT(chat_view),"cr"); + 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; + + 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; + 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(chat_view),"from_chatroom",linphone_address_as_string_uri_only(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(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); + ms_free(uri_only); } void linphone_gtk_chat_destroyed(GtkWidget *w){ @@ -326,40 +455,54 @@ 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, 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; + 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){ - linphone_gtk_load_chatroom(room,from,w); - } else { - w=linphone_gtk_init_chatroom(room,from); - g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)w); - } - - #ifdef HAVE_GTK_OSX - /* 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); - g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(TRUE)); + 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 { - g_object_set_data(G_OBJECT(w),"is_notified",GINT_TO_POINTER(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 ) ); + } + send=FALSE; + } + } 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 ); + } + +#ifdef HAVE_GTK_OSX + /* 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 ) ); + } 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_update_chat_picture(TRUE); - //gtk_window_present(GTK_WINDOW(w)); - /*gtk_window_set_urgency_hint(GTK_WINDOW(w),TRUE);*/ +#endif + if ( send ) { + linphone_gtk_push_text ( w,linphone_chat_message_get_from ( msg ), + FALSE,room,msg,FALSE ); + } + linphone_gtk_show_friends(); + } 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/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 9aabe597a..12da891f4 100644 --- a/gtk/friendlist.c +++ b/gtk/friendlist.c @@ -32,7 +32,6 @@ enum{ FRIEND_ICON, FRIEND_CALL, FRIEND_CHAT, - FRIEND_CHAT_CONVERSATION, FRIEND_LIST_NCOL }; @@ -76,17 +75,18 @@ 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(){ - 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 +110,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,11 +166,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=linphone_gtk_get_main_window(); + GtkTreeSelection *select; + GtkTreeIter iter; + GtkTreeModel *model; + GtkWidget *chat_view; + LinphoneFriend *lf=NULL; + 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); + 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(); } } @@ -171,17 +221,21 @@ static void linphone_gtk_call_selected(GtkTreeView *treeview){ "start_call")); } -void linphone_gtk_update_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_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,create_chat_picture(),-1); + 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_active_chat_picture(),-1); + gtk_list_store_set(GTK_LIST_STORE(model),&iter,FRIEND_CHAT,create_chat_picture(),-1); } }while(gtk_tree_model_iter_next(model,&iter)); } @@ -192,6 +246,81 @@ static gboolean grab_focus(GtkWidget *w){ return FALSE; } +void linphone_gtk_friend_list_set_chat_conversation(const 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_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))); + 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_friend_list_update_chat_picture(); + g_idle_add((GSourceFunc)grab_focus,linphone_gtk_get_widget(chat_view,"text_entry")); + 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; + 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(); + } + } + } +} + void linphone_gtk_chat_selected(GtkWidget *item){ GtkWidget *w=gtk_widget_get_toplevel(item); GtkTreeSelection *select; @@ -209,21 +338,24 @@ 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)); if(page==NULL){ page=linphone_gtk_init_chatroom(cr,uri); g_object_set_data(G_OBJECT(friendlist),"chatview",(gpointer)page); } 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_update_chat_picture(FALSE); + linphone_gtk_friend_list_update_chat_picture(); 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); } } @@ -382,7 +514,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; @@ -421,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; @@ -496,7 +639,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_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)); @@ -506,7 +649,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"), @@ -517,6 +660,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); @@ -541,7 +685,7 @@ static void linphone_gtk_friend_list_init(GtkWidget *friendlist){ 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); @@ -554,7 +698,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);*/ } @@ -623,9 +767,9 @@ void linphone_gtk_show_friends(void){ //const gchar *search=NULL; //gboolean lookup=FALSE; MSList *sorted; + 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); } @@ -647,6 +791,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); @@ -661,11 +808,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_list_store_set(store,&iter,FRIEND_CALL,create_call_picture(),-1); - gtk_list_store_set(store,&iter,FRIEND_CHAT,create_chat_picture(),-1); - + 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); + } escaped=g_markup_escape_text(uri,-1); gtk_list_store_set(store,&iter,FRIEND_SIP_ADDRESS,escaped,-1); g_free(escaped); @@ -712,9 +861,11 @@ 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; + LinphoneAddress* friend_address; if (lf==NULL){ lf=linphone_friend_new(); if (linphone_gtk_get_ui_config_int("use_subscribe_notify",1)==1){ @@ -733,19 +884,23 @@ 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); - 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); } @@ -757,6 +912,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; @@ -779,6 +935,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){ @@ -818,6 +975,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)); @@ -854,52 +1020,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*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; } @@ -922,6 +1077,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/incall_view.c b/gtk/incall_view.c index 192e92fab..da954a45b 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; @@ -74,26 +75,29 @@ static GtkWidget *make_tab_header(int number){ return w; } -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"); - } +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")); + 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){ @@ -101,7 +105,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); } @@ -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); @@ -231,19 +232,61 @@ 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 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); - gtk_label_set_text(GTK_LABEL(linphone_gtk_get_widget(callstats,"media_connectivity")),ice_state_to_string(ice_state)); + 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 (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){ @@ -388,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); } @@ -401,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){ @@ -637,18 +679,16 @@ 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")); - + 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); 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); @@ -661,8 +701,15 @@ 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")); + else gtk_widget_hide(linphone_gtk_get_widget(callview,"record_hbox")); if (call_stats) show_used_codecs(call_stats,call); } @@ -694,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{ @@ -710,15 +758,14 @@ 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")); + 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) @@ -800,7 +847,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) { @@ -816,7 +863,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); @@ -827,3 +874,48 @@ 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)); + 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){ + if (call) + linphone_call_start_recording(call); + else + linphone_core_start_conference_recording(lc,filepath); + }else { + if (call) + linphone_call_stop_recording(call); + else + linphone_core_stop_conference_recording(lc); + + } + gtk_label_set_markup(GTK_LABEL(label),message); + g_free(message); +} + 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 f2b02aace..f987b2abe 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -58,6 +58,7 @@ 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); @@ -66,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, const LinphoneAddress *from, const char *message); void linphone_gtk_call_log_update(GtkWidget *w); void linphone_gtk_create_log_window(void); void linphone_gtk_log_show(void); @@ -83,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); @@ -97,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_update_chat_picture(gboolean active); -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(); @@ -149,3 +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); \ No newline at end of file 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/gtk/main.c b/gtk/main.c index 12e84bc97..1aa2e287c 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -63,12 +63,16 @@ 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); - +#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; @@ -216,7 +220,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); @@ -230,7 +234,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; @@ -247,6 +252,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){ @@ -562,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 @@ -581,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 @@ -744,37 +750,90 @@ 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); + } +} + +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="unknown"; + char filename[256]={0}; + 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); } 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_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); + linphone_address_destroy(addr); + linphone_call_params_destroy(params); + g_free(record_file); }else{ linphone_gtk_call_terminated(NULL,NULL); } 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); - linphone_call_unref(call); + LinphoneCallState state=linphone_call_get_state(call); + if (state==LinphoneCallIncomingReceived || state==LinphoneCallIncomingEarlyMedia){ + accept_incoming_call(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*/ @@ -807,7 +866,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 */ } } @@ -1064,13 +1123,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); @@ -1080,7 +1139,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; @@ -1173,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); @@ -1316,11 +1375,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); } } @@ -1365,10 +1433,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; @@ -1444,7 +1512,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 +1526,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,23 +1565,17 @@ 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; 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"); 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); @@ -1559,16 +1621,10 @@ 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()) { @@ -1577,13 +1633,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){ @@ -1598,7 +1648,6 @@ void linphone_gtk_manage_login(void){ } } - gboolean linphone_gtk_close(GtkWidget *mw){ /*shutdown calls if any*/ LinphoneCore *lc=linphone_gtk_get_core(); @@ -1647,24 +1696,42 @@ 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(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(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); } static void linphone_gtk_init_main_window(){ GtkWidget *main_window; - linphone_gtk_configure_main_window(); linphone_gtk_manage_login(); load_uri_history(); 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(); + linphone_core_reset_missed_calls_count(linphone_gtk_get_core()); 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", @@ -1672,17 +1739,16 @@ 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 linphone_gtk_check_menu_items(); } - void linphone_gtk_log_handler(OrtpLogLevel lev, const char *fmt, va_list args){ if (verbose){ const char *lname="undef"; @@ -1787,6 +1853,8 @@ int main(int argc, char *argv[]){ GtkSettings *settings; GdkPixbuf *pbuf; const char *app_name="Linphone"; + LpConfig *factory; + const char *db_file; #if !GLIB_CHECK_VERSION(2, 31, 0) g_thread_init(NULL); @@ -1862,6 +1930,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."); @@ -1874,7 +1947,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:*/ @@ -1888,7 +1961,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)); diff --git a/gtk/main.ui b/gtk/main.ui index f82875cb6..dde462ec3 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 @@ -70,13 +80,13 @@ 90 - 10 + 30 True False False - False + True 2 @@ -155,7 +165,7 @@ True False - + True False gtk-ok @@ -215,9 +225,6 @@ True False - - - True @@ -242,9 +249,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 + + + @@ -268,6 +319,18 @@ True False + + + True + False + center + + + True + True + 0 + + True @@ -279,19 +342,6 @@ False False - 0 - - - - - True - False - label - center - - - True - True 1 @@ -327,11 +377,11 @@ True False - label True True + 2 2 @@ -419,6 +469,7 @@ False False + 2 3 @@ -463,6 +514,46 @@ 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 + + True @@ -556,7 +647,7 @@ False False 7 - 5 + 6 @@ -620,6 +711,16 @@ False gtk-edit + + True + False + gtk-edit + + + True + False + gtk-edit + True False @@ -640,11 +741,51 @@ False gtk-connect + + True + False + gtk-add + + + True + False + gtk-add + + + True + False + gtk-add + + + True + False + gtk-add + + + True + False + gtk-missing-image + + + True + False + gtk-select-color + + + True + False + gtk-add + True False gtk-refresh + + True + False + gtk-add + True False @@ -683,6 +824,8 @@ False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 660 + 450 True @@ -916,6 +1059,7 @@ True True + 2 0 @@ -930,6 +1074,8 @@ False False + 6 + end 1 @@ -944,9 +1090,25 @@ False True + 6 + end 2 + + + True + True + True + False + + + + False + False + 3 + + False @@ -956,9 +1118,9 @@ - + True - False + True True @@ -1012,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 @@ -1036,9 +1196,8 @@ True True True - Edit False - edit_image + edit_image2 @@ -1053,7 +1212,7 @@ True True False - remove_image + remove_image2 @@ -1071,10 +1230,8 @@ - False - False - 12 - 0 + False + False @@ -1082,453 +1239,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 +1253,154 @@ True False 2 + + + True + True + never + + + 350 + True + True + False + + + + + + + True + True + 0 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 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 + 0 + + + + + True + False + + + Add contact + True + True + False + image20 + + + + False + False + 0 + + + + + False + False + 1 + + + + + False + False + 1 + + True @@ -1570,30 +1432,7 @@ False True - end - 0 - - - - - True - True - never - - - 350 - True - True - False - - - - - - - True - True - 1 + 2 @@ -1612,6 +1451,7 @@ True False + True @@ -1652,10 +1492,8 @@ - True - True - 4 - 1 + True + True @@ -1714,13 +1552,6 @@ False none - - - True - False - gtk-refresh - - True @@ -2065,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 130b7e7c5..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,85 +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 - - - - - 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 41fe854ed..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,23 +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))){ + 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){ @@ -773,6 +795,7 @@ static LangCodes supported_langs[]={ { "zh_TW" , N_("Traditional Chinese") }, { "nb_NO" , N_("Norwegian") }, { "he" , N_("Hebrew") }, + { "sr" , N_("Serbian") }, { NULL , NULL } }; @@ -967,7 +990,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)); } @@ -1010,10 +1034,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"); @@ -1023,21 +1045,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); @@ -1074,7 +1096,14 @@ 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; } + 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); diff --git a/gtk/update.c b/gtk/update.c old mode 100755 new mode 100644 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 6590dafeb..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. @@ -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/LinphoneCall.java b/java/common/org/linphone/core/LinphoneCall.java index ac7b14d8d..893572e2e 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. @@ -283,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/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/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/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/common/org/linphone/core/LinphoneChatMessage.java b/java/common/org/linphone/core/LinphoneChatMessage.java index d403d94bd..b6b6c30ec 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,24 @@ 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); + + /** + * Gets the time at which the message was sent + * @return the time in milliseconds + */ + long getTime(); } diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index 08371f515..d76acad9a 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)}. * @@ -141,6 +144,10 @@ public interface LinphoneCore { * Use ICE. */ static public FirewallPolicy UseIce = new FirewallPolicy(3,"UseIce"); + /** + * Use uPnP. + */ + static public FirewallPolicy UseUpnp = new FirewallPolicy(4,"UseUpnp"); private final int mValue; private final String mStringValue; @@ -168,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() {}; @@ -278,6 +296,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. @@ -335,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; /** @@ -346,6 +414,12 @@ public interface LinphoneCore { * @param aCall to be terminated */ 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); /** * Returns The LinphoneCall the current call if one is in call * @@ -359,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(); /** @@ -424,8 +498,6 @@ public interface LinphoneCore { */ public void deferCallUpdate(LinphoneCall aCall) throws LinphoneCoreException; - public void startRinging(); - /** * @return a list of LinphoneCallLog */ @@ -441,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(); @@ -483,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 */ @@ -502,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; /** @@ -537,13 +629,28 @@ 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(); + + /** + * 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 @@ -574,12 +681,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(); /** @@ -607,6 +738,7 @@ public interface LinphoneCore { */ void setStunServer(String stun_server); /** + * Get STUN server * @return stun server address if previously set. */ String getStunServer(); @@ -620,11 +752,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(); /** @@ -636,7 +792,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(); @@ -648,7 +804,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); /** @@ -662,9 +829,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(); /** @@ -694,6 +872,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 @@ -701,36 +885,159 @@ public interface LinphoneCore { */ void adjustSoftwareVolume(int i); + /** + * 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); void enableEchoLimiter(boolean val); + /** + * Indicates whether the local user is part of the conference. + **/ boolean isInConference(); + /** + * 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(); + /** + * 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(); + /** + * 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); - void addAllToConference(); + /** + * 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); - - void terminateConference(); - int getConferenceSize(); + /** + * 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(); + /** + * 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); + + /** + * 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); /** @@ -782,15 +1089,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); /** @@ -837,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. **/ @@ -847,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 @@ -859,7 +1208,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); /** @@ -882,4 +1234,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/common/org/linphone/core/LinphoneCoreFactory.java b/java/common/org/linphone/core/LinphoneCoreFactory.java index 100794016..5e8637999 100644 --- a/java/common/org/linphone/core/LinphoneCoreFactory.java +++ b/java/common/org/linphone/core/LinphoneCoreFactory.java @@ -48,11 +48,27 @@ 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} + * @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 @@ -67,6 +83,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/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/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 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..5e0a81880 --- /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/linphone-deps.filelist b/linphone-deps.filelist index 1df0777a6..98d759b14 100755 --- a/linphone-deps.filelist +++ b/linphone-deps.filelist @@ -14,3 +14,5 @@ ./bin/libgpg-error-0.dll ./bin/libgnutls-26.dll ./bin/libtasn1-3.dll +./bin/libsqlite3-0.dll +./bin/libzrtpcpp.dll 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 - - - 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 d5811e376..4ccd8ca51 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit d5811e376759433da3c19585b2d8d0329e1c06b2 +Subproject commit 4ccd8ca511eb46375699f5efaf8f41b655e0dbb8 diff --git a/oRTP b/oRTP index 20abeb39e..020d921f8 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit 20abeb39e1edae0f72080f7998410e9b16b9da05 +Subproject commit 020d921f876ed04d434425fb2176642bbe9b3004 diff --git a/pixmaps/Makefile.am b/pixmaps/Makefile.am index 186254c11..2386d68cf 100644 --- a/pixmaps/Makefile.am +++ b/pixmaps/Makefile.am @@ -17,7 +17,9 @@ 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 EXTRA_DIST=$(pixmap_DATA) diff --git a/pixmaps/active_chat.png b/pixmaps/active_chat.png index e428845d5..d82b7c595 100644 Binary files a/pixmaps/active_chat.png and b/pixmaps/active_chat.png differ diff --git a/pixmaps/call_status_incoming.png b/pixmaps/call_status_incoming.png new file mode 100644 index 000000000..72ca1330e Binary files /dev/null and b/pixmaps/call_status_incoming.png differ diff --git a/pixmaps/call_status_outgoing.png b/pixmaps/call_status_outgoing.png new file mode 100644 index 000000000..aa15b3bea Binary files /dev/null and b/pixmaps/call_status_outgoing.png differ diff --git a/pixmaps/contact_unstarred.png b/pixmaps/contact_unstarred.png index ad041095b..38fdbbb77 100644 Binary files a/pixmaps/contact_unstarred.png and b/pixmaps/contact_unstarred.png differ diff --git a/pixmaps/dialer.png b/pixmaps/dialer.png new file mode 100644 index 000000000..5da3ad70d Binary files /dev/null and b/pixmaps/dialer.png differ diff --git a/pixmaps/startcall-small.png b/pixmaps/startcall-small.png index 30b32789a..d5726e12c 100644 Binary files a/pixmaps/startcall-small.png and b/pixmaps/startcall-small.png differ 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 diff --git a/po/README b/po/README new file mode 100644 index 000000000..19a1dbd53 --- /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 translation 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..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-01-08 10:35+0100\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" @@ -27,60 +28,81 @@ 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 -#, fuzzy -msgid "Aborted" -msgstr "přerušen" - -#: ../gtk/calllogs.c:85 -#, fuzzy -msgid "Missed" -msgstr "promeškán" - -#: ../gtk/calllogs.c:88 -#, fuzzy -msgid "Declined" -msgstr "Odmítnout" - -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:922 #, c-format -msgid "%i minute" -msgid_plural "%i minutes" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgid "Call %s" +msgstr "Volat komu: %s" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:923 #, c-format -msgid "%i second" -msgid_plural "%i seconds" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgid "Send text to %s" +msgstr "Poslat text komu: %s" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:223 #, c-format -msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" -msgstr "" +msgid "Recent calls (%i)" +msgstr "Nedávné hovory (%i)" -#: ../gtk/calllogs.c:102 +#: ../gtk/calllogs.c:300 msgid "n/a" msgstr "–" -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:303 +msgid "Aborted" +msgstr "Přerušen" + +#: ../gtk/calllogs.c:306 +msgid "Missed" +msgstr "Zmeškán" + +#: ../gtk/calllogs.c:309 +msgid "Declined" +msgstr "Odmítnut" + +#: ../gtk/calllogs.c:315 +#, c-format +msgid "%i minute" +msgid_plural "%i minutes" +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] "%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 "%s\t%s" + +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" +"%s\tKvalita: %s\n" +"%s\t%s\t" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" +msgstr "" +"%s\t\n" +"%s" + +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "Konference" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "Já" @@ -89,31 +111,35 @@ msgstr "Já" msgid "Couldn't find pixmap file: %s" msgstr "Nelze najít soubor s obrázkem: %s" -#: ../gtk/main.c:89 +#: ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "Soubor, kam zapisovat protokol." -#: ../gtk/main.c:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." -msgstr "" +msgstr "Spustí linphone se zakázaným obrazem." -#: ../gtk/main.c:110 +#: ../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:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "Zavolá právě teď na tuto adresu" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "je-li nastaveno, automaticky zvedne příchozí hovor" -#: ../gtk/main.c:131 +#: ../gtk/main.c:134 msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" "\\Program Files\\Linphone)" @@ -121,12 +147,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:515 #, c-format msgid "Call with %s" msgstr "Hovor s %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -139,7 +165,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:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -148,59 +174,59 @@ msgstr "" "Prosím, zadejte heslo pro uživatele %s\n" "v doméně %s:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "Chyba hovoru" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "Hovor ukončen" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../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:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "Odpovědět" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Odmítnout" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "Hovor odložen" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, c-format -msgid "by %s" -msgstr "kým: %s" +msgid "by %s" +msgstr "kým: %s" -#: ../gtk/main.c:1116 +#: ../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:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Odkaz na webovou stránku" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Lipnhone – internetový videofon" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Výchozí)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../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:1724 +#: ../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,177 +234,170 @@ 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:1911 msgid "A free SIP video-phone" msgstr "Volný SIP videofon" -#: ../gtk/friendlist.c:335 -#, fuzzy +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" -msgstr "Zobrazit adresář" +msgstr "Přidat do adresáře" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Stav" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../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:538 -#, fuzzy +#: ../gtk/friendlist.c:673 msgid "Call" -msgstr "Volat komu: %s" +msgstr "Zavolat" -#: ../gtk/friendlist.c:543 -#, fuzzy +#: ../gtk/friendlist.c:678 msgid "Chat" -msgstr "Diskuzní skupina" +msgstr "Diskuze" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Hledat v adresáři %s" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "Neplatný sipový kontakt!" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "Volat komu: %s" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "Poslat text komu: %s" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Upravit kontakt „%s“" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Odstranit kontakt „%s“" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:926 +#, c-format +msgid "Delete chat history of '%s'" +msgstr "Odstranit historii diskuze u kontaktu „%s“" + +#: ../gtk/friendlist.c:977 #, 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 "" +msgstr "hebrejština" -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:781 +msgid "Serbian" +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." -#: ../gtk/propertybox.c:912 +# Media encryption type: +#: ../gtk/propertybox.c:934 msgid "None" -msgstr "Žádná" +msgstr "Žádné" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "ZRTP" @@ -423,7 +442,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 +450,312 @@ msgstr "" "Vítejte!\n" "Tento průvodce vám pomůže používat sipový účet při vašich hovorech." -#: ../gtk/setupwizard.c:42 -#, fuzzy -msgid "Create an account on linphone.org" -msgstr "Vytvořit účet vybráním uživatelského jména" - #: ../gtk/setupwizard.c:43 -#, 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" +msgid "Create an account on linphone.org" +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 na linphone.org již mám a chci jej použít" + +#: ../gtk/setupwizard.c:45 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:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" -msgstr "" +msgstr "Zadejte uživatelské jméno na linphone.org" -#: ../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 -#, fuzzy -msgid "Username*" -msgstr "Uživatelské jméno" +msgstr "Zadejte údaje o vašem účtu" #: ../gtk/setupwizard.c:121 -#, fuzzy -msgid "Password*" -msgstr "Heslo" +msgid "Username*" +msgstr "Uživatelské jméno*" -#: ../gtk/setupwizard.c:124 -msgid "Domain*" -msgstr "" +#: ../gtk/setupwizard.c:122 +msgid "Password*" +msgstr "Heslo*" #: ../gtk/setupwizard.c:125 -msgid "Proxy" -msgstr "" +msgid "Domain*" +msgstr "Doména*" -#: ../gtk/setupwizard.c:297 -msgid "(*) Required fields" -msgstr "" +#: ../gtk/setupwizard.c:126 +msgid "Proxy" +msgstr "Proxy" #: ../gtk/setupwizard.c:298 -#, fuzzy +msgid "(*) Required fields" +msgstr "(*) Povinné položky" + +#: ../gtk/setupwizard.c:299 msgid "Username: (*)" -msgstr "Uživatelské jméno:" +msgstr "Uživatelské jméno: (*)" -#: ../gtk/setupwizard.c:300 -#, fuzzy +#: ../gtk/setupwizard.c:301 msgid "Password: (*)" -msgstr "Heslo:" +msgstr "Heslo: (*)" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" -msgstr "" +msgstr "E-mail: (*)" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" -msgstr "" +msgstr "Potvrďte heslo: (*)" -#: ../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 "" +"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: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 "" +"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: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 -#, fuzzy +#: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" -msgstr "Nastavit SIP účet" +msgstr "Nastavit účet (krok 1/1)" -#: ../gtk/setupwizard.c:570 +#: ../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:574 +#: ../gtk/setupwizard.c:584 msgid "Enter account information (step 1/2)" -msgstr "" +msgstr "Zadejte údaje o účtu (krok 1/2)" -#: ../gtk/setupwizard.c:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" -msgstr "" +msgstr "Ověření (krok 2/2)" -#: ../gtk/setupwizard.c:588 -#, fuzzy +#: ../gtk/setupwizard.c:598 msgid "Error" -msgstr "Chyba." +msgstr "Chyba" -#: ../gtk/setupwizard.c:592 -#, fuzzy +#: ../gtk/setupwizard.c:602 msgid "Terminating" -msgstr "Ukončit hovor" +msgstr "Ukončuje se" -#: ../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 -#, fuzzy +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" -msgstr "Nenalezeno" +msgstr "Nepoužito" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" -msgstr "" +msgstr "ICE není zapnuto" -#: ../gtk/incall_view.c:221 -#, fuzzy +#: ../gtk/incall_view.c:222 msgid "ICE failed" -msgstr "Filtr ICE" +msgstr "ICE selhalo" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" -msgstr "" +msgstr "Probíhá ICE" -#: ../gtk/incall_view.c:225 +#: ../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:227 -#, fuzzy +#: ../gtk/incall_view.c:228 msgid "Direct" -msgstr "Přesměrováno" +msgstr "Přímé" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" -msgstr "" +msgstr "Skrze relay server" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "UPnP není zapnuto" + +#: ../gtk/incall_view.c:240 +msgid "uPnP in progress" +msgstr "Probíhá UPnP" + +#: ../gtk/incall_view.c:242 +msgid "uPnp not available" +msgstr "UPnP není nedostupné" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "UPnP běží" + +#: ../gtk/incall_view.c:246 +msgid "uPnP failed" +msgstr "UPnP selhalo" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "Přímé nebo skrze server" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" +"příchozí: %f\n" +"odchozí: %f (kb/s)" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "%.3f sekund" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" -msgstr "" +msgstr "Zavěsit" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Volá se…" -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00:00:00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Příchozí hovor" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "dobrá" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "průměrná" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "slabá" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "velmi slabá" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "příliš špatná" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "nedostupná" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" -msgstr "" +msgstr "Zabezpečeno pomocí SRTP" -#: ../gtk/incall_view.c:611 +#: ../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:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" -msgstr "" +msgstr "Nastavit na neověřeno" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" -msgstr "" +msgstr "Nastavit na ověřeno" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "Probíhá konference" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "Probíhá hovor" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Odložený hovor" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i:%02i:%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Hovor skončil." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" -msgstr "" - -#: ../gtk/incall_view.c:734 -#, fuzzy -msgid "Transfer done." -msgstr "Přepojit" - -#: ../gtk/incall_view.c:737 -#, fuzzy -msgid "Transfer failed." -msgstr "Přepojit" +msgstr "Probíhá přepojení" #: ../gtk/incall_view.c:781 +msgid "Transfer done." +msgstr "Přepojení dokončeno." + +#: ../gtk/incall_view.c:784 +msgid "Transfer failed." +msgstr "Přepojení selhalo." + +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Obnovit" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Odložit" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" +"Nahrává se do\n" +"%s %s" + +#: ../gtk/incall_view.c:900 +msgid "(Paused)" +msgstr "(Odloženo)" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -716,22 +770,20 @@ msgid "Send" msgstr "Odeslat" #: ../gtk/main.ui.h:3 -#, fuzzy msgid "End conference" -msgstr "Probíhá konference" +msgstr "Ukončit konferenci" -# XXX: Do not translate, this is GTK identifier -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" +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" @@ -755,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" @@ -778,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:" @@ -790,149 +841,85 @@ msgstr "SIP adresa nebo telefonní číslo:" msgid "Initiate a new call" msgstr "Zahájit nový hovor" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +msgid "Contacts" +msgstr "Kontakty" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Přidat" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 msgid "Add contacts from directory" msgstr "Přidat kontakty z adresáře" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 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:33 msgid "Recent calls" msgstr "Nedávné hovory" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 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:35 ../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:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Heslo" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Připojení k Internetu:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Přihlašovat mě automaticky" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Informace o přihlášení" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Vítejte!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "všech uživatelích" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "připojených uživatelích" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "Fiber Channel" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Výchozí" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" -msgstr "" +msgstr "Smazat" #: ../gtk/about.ui.h:1 msgid "About linphone" @@ -994,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" @@ -1054,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" @@ -1088,6 +1075,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 +1116,187 @@ 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 "" +msgstr "Položky DSCP" + +# Port number +#: ../gtk/parameters.ui.h:20 +msgid "Fixed" +msgstr "Stálý" #: ../gtk/parameters.ui.h:21 -msgid "Fixed" -msgstr "" +msgid "Tunnel" +msgstr "Tunel" #: ../gtk/parameters.ui.h:22 +msgid "Media encryption is mandatory" +msgstr "Šifrování médií je povinné" + +#: ../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 -#, fuzzy -msgid "Behind NAT / Firewall (use ICE)" -msgstr "Za NAT/firewallem (adresu určí STUN)" - #: ../gtk/parameters.ui.h:28 +msgid "Behind NAT / Firewall (use ICE)" +msgstr "Za NAT/firewallem (adresu určí ICE)" + +#: ../gtk/parameters.ui.h:29 +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "Za NAT/firewallem (adresu určí UPnP)" + +#: ../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 "" +msgstr "Průvodce" -#: ../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" +msgstr "Zapnout přizpůsobující se ří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 +1304,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" @@ -1354,95 +1353,154 @@ 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 "Media connectivity" -msgstr "Druh šifrování médií" +msgid "Audio Media connectivity" +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 "Obrazové spojení" + +#: ../gtk/call_statistics.ui.h:8 +msgid "Round trip time" +msgstr "Odezva" + +#: ../gtk/call_statistics.ui.h:9 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é)" -#: ../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 +1515,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:1312 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" +msgstr "Navazuje se spojení" -#: ../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:3357 msgid "Could not pause the call" msgstr "Hovor nebylo možné odložit" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "Současný hovor se odkládá…" @@ -1554,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" @@ -1586,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" @@ -1609,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 @@ -1620,116 +1678,114 @@ 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:1069 #, c-format msgid "Could not login as %s" msgstr "Nelze se přihlásit jako %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Vyzvání na druhé straně." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "Vyzvání na druhé straně…" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Časná média." -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "Hovor s %s je odložen." -#: ../coreapi/callbacks.c:365 +#: ../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:376 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Hovor obnoven." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "Hovor přijat kým: %s." -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." -msgstr "" +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." +msgstr "Není slučitelné. Zkontrolujte nastavení kodeků a zabezpečení…" -#: ../coreapi/callbacks.c:437 -#, fuzzy +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." -msgstr "Byli jsme obnoveni…" +msgstr "Byli jsme obnoveni." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." -msgstr "" +msgstr "Byli jsme odloženi protistranou." -#: ../coreapi/callbacks.c:452 -#, fuzzy +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." -msgstr "Hovor byl aktualizován protistranou…" +msgstr "Hovor byl aktualizován protistranou." -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Hovor ukončen." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Uživatel je zaneprázdněn." -#: ../coreapi/callbacks.c:529 +#: ../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:531 +#: ../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:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Volání odmítnuto." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Žádná odpověď." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Chyba protokolu." -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Přesměrováno" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." -msgstr "" +msgstr "Neslučitelné parametry médií." -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "Volání se nezdařilo." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registrace na %s byla úspěšná." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Odregistrování z %s hotovo." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "odpověď nedorazila včas" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrace na %s selhala: %s" @@ -1739,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:2124 +#: ../coreapi/linphonecall.c:2319 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1747,6 +1803,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 +1845,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 +1908,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 +2492,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 6a0b322f7..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-01-08 10:35+0100\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" @@ -17,57 +17,77 @@ 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:303 msgid "Aborted" msgstr "Abgebrochen" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 msgid "Missed" msgstr "Entgangen" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 msgid "Declined" msgstr "Abgewiesen" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i Minute" msgstr[1] "%i Minuten" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i Sekunde" msgstr[1] "%i Sekunden" -#: ../gtk/calllogs.c:100 +#: ../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:102 -msgid "n/a" -msgstr "nicht verfügbar" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:329 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "Konferenz" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "Eigenes Telefon" @@ -76,33 +96,37 @@ msgstr "Eigenes Telefon" msgid "Couldn't find pixmap file: %s" msgstr "Pixmapdatei %s kann nicht gefunden werden." -#: ../gtk/main.c:89 +#: ../gtk/chat.c:336 ../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:96 +#: ../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:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "Linphone mit ausgeschaltetem Video starten." -#: ../gtk/main.c:110 +#: ../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:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "Im Moment anzurufende Adresse" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "Falls aktiviert, werden eingehende Anrufe automatisch beantwortet" -#: ../gtk/main.c:131 +#: ../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:498 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Im Gespräch mit %s" -#: ../gtk/main.c:871 +#: ../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:948 +#: ../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:1051 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "Anruf fehlgeschlagen" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Anruf beendet" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Eingehender Anruf" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../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:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Abweisen" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "Anruf wird gehalten" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, c-format -msgid "by %s" -msgstr "von %s" +msgid "by %s" +msgstr "von %s" -#: ../gtk/main.c:1116 +#: ../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:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Website-Verknüpfung" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - ein Internet-Video-Telefon" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Vorgabe)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Vermittlung nach %s" -#: ../gtk/main.c:1724 +#: ../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,177 +221,172 @@ 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:1911 msgid "A free SIP video-phone" msgstr "Ein freies SIP-Video-Telefon" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "Zum Adressbuch hinzufügen" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Anwesenheitsstatus" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../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:538 +#: ../gtk/friendlist.c:673 msgid "Call" msgstr "Anrufen" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 #, fuzzy msgid "Chat" msgstr "Chat Raum" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Im %s-Verzeichnis suchen" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "Ungültiger SIP-Kontakt!" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "„%s“ anrufen" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "Text zu „%s“ schicken" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Kontakt „%s“ bearbeiten" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Kontakt „%s“ löschen" -#: ../gtk/friendlist.c:820 +#: ../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" -#: ../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: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:912 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Keinen" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -411,7 +430,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 +439,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 +513,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 +528,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 +635,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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Verbindungsaufbau..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Eingehender Anruf" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "gut" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "durchschnittlich" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "schlecht" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "sehr schlecht" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "zu schlecht" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "nicht verfügbar" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "Gesichert durch SRTP" -#: ../gtk/incall_view.c:611 +#: ../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:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "Auf „Ungeprüft“ setzen" -#: ../gtk/incall_view.c:617 ../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:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "In Konferenz" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "Im Gespräch" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Gehaltener Anruf" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Anruf beendet." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "Vermittlung läuft" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "Vermittlung abgeschlossen." -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 msgid "Transfer failed." msgstr "Vermittlung fehlgeschlagen." -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Fortsetzen" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Halten" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +#, fuzzy +msgid "(Paused)" +msgstr "Halten" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -704,8 +768,8 @@ msgstr "Senden" msgid "End conference" msgstr "In Konferenz" -#: ../gtk/main.ui.h:4 -msgid "label" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" msgstr "" #: ../gtk/main.ui.h:8 @@ -772,147 +836,83 @@ msgstr "SIP-Adresse oder Telefonnummer:" msgid "Initiate a new call" msgstr "Einen neuen Anruf beginnen" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +msgid "Contacts" +msgstr "Kontakte" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Hinzufügen" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 msgid "Add contacts from directory" msgstr "Kontakte aus einem Verzeichnis hinzufügen" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 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:33 msgid "Recent calls" msgstr "Letzte Gespräche" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Aktuelle Identität:" -#: ../gtk/main.ui.h:51 ../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:52 ../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:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Internetverbindung:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Automatisch anmelden" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Anmeldeinformationen" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Willkommen !" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "Alle Teilnehmer" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "Angemeldete Teilnehmer" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "Glasfaserkabel" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Vorgabe" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1073,6 +1073,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 +1114,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 +1305,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 +1390,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 +1399,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 +1432,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:228 msgid "aborted" msgstr "abgebrochen" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "beendet" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "entgangen" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1434,23 +1519,23 @@ msgstr "" "Status: %s\n" "Dauer: %i min %i sec\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Abgehender Anruf" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Bereit" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Telefonnummernziel wird gesucht..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Diese Nummer kann nicht aufgelöst werden." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1458,47 +1543,47 @@ msgstr "" "SIP-Adresse kann nicht eingelesen werden. Eine SIP-Adresse hat folgenden " "Aufbau " -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Verbindungsaufbau" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "Anruf kann nicht getätigt werden." -#: ../coreapi/linphonecore.c:2429 +#: ../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:2573 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "ruft Sie an" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr " und fragt nach automatischer Antwort." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "Die Anrufparameter werden verändert..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Verbunden." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "Anruf abgebrochen" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "Anruf kann nicht gehalten werden" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Aktueller Anruf wird gehalten..." @@ -1599,114 +1684,115 @@ msgstr "" "Sie sollte wie sip:benutzername@proxydomain aussehen, also z.B. sip:" "alice@beispiel.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Anmeldung als %s fehlgeschlagen" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Klingeln bei der Gegenseite." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "Klingeln bei der Gegenseite..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "Anruf mit %s wird gehalten." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "Der von %s entgegengenommene Anruf wird gehalten." -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Anruf fortgesetzt." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "Anruf wird von %s entgegengenommen." -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +#, fuzzy +msgid "Incompatible, check codecs or security settings..." msgstr "Inkompatibel, überprüfen Sie die Codecs..." -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "Anruf wird fortgesetzt." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "Anruf wird von der Gegenseite gehalten." -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "Anruf ist von der Gegenseite aktualisiert worden." -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Anruf beendet." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Teilnehmer ist besetzt." -#: ../coreapi/callbacks.c:529 +#: ../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:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Teilnehmer möchte nicht gestört werden." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Anruf abgewiesen" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Keine Antwort." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Protokollfehler" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Umgeleitet" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "Inkompatible Medienparameter." -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "Anruf fehlgeschlagen." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registrierung auf %s erfolgreich." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Abmeldung von %s ist erfolgt." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "Zeitüberschreitung bei der Antwort" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrierung auf %s fehlgeschlagen: %s" @@ -1716,13 +1802,16 @@ msgstr "Registrierung auf %s fehlgeschlagen: %s" msgid "Authentication token is %s" msgstr "Authentifizierungs-Token ist %s" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2355 #, 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 +1824,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 +2403,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..474f630f4 100644 --- a/po/es.po +++ b/po/es.po @@ -1,116 +1,149 @@ -# 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-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" "Language: \n" "MIME-Version: 1.0\n" "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:303 #, fuzzy msgid "Aborted" -msgstr "Llamada cancelada." +msgstr "abortada" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 +#, fuzzy msgid "Missed" -msgstr "" +msgstr "perdida" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" -msgstr "linea" +msgstr "Rechazar" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%i minuto" +msgstr[1] "%i minutos" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%i segundo" +msgstr[1] "%i segundos" -#: ../gtk/calllogs.c:100 -#, c-format -msgid "" -"%s\t%s\tQuality: %s\n" +#: ../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" -msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 -#, c-format +#: ../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:33 ../gtk/main.ui.h:13 +#: ../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 "" +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/chat.c:336 ../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:96 +#: ../gtk/main.c:99 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:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:113 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:120 msgid "address to call right now" -msgstr "" +msgstr "dirección a la que llamar inmediatamente" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 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:134 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:515 #, c-format msgid "Call with %s" -msgstr "" +msgstr "Llamar con %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -118,587 +151,647 @@ 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:1023 #, 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:1126 #, fuzzy msgid "Call error" -msgstr "Llamada cancelada." +msgstr "Error en la llamada." -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 #, fuzzy msgid "Call ended" -msgstr "Llamada cancelada." +msgstr "Llamada terminada" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" -msgstr "" +msgstr "Llamada entrante" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../gtk/main.ui.h:6 +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" -msgstr "" +msgstr "Contestar" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 #, fuzzy msgid "Decline" -msgstr "linea" +msgstr "Rechazar" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" -msgstr "Llamada cancelada." +msgstr "Llamada en pausa" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "Puertos" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" -msgstr "" +msgstr "Enlace a la Web" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 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:1494 #, c-format msgid "%s (Default)" -msgstr "" +msgstr "%s (Opción predeterminada)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" -msgstr "" +msgstr "Somos transferidos a %s" -#: ../gtk/main.c:1724 +#: ../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 "" +"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:1911 msgid "A free SIP video-phone" -msgstr "" +msgstr "Un video-teléfono SIP gratuito" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 #, fuzzy msgid "Add to addressbook" -msgstr "Agenda" +msgstr "Añadir a la agenda" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 #, 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:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Nombre" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" -msgstr "Llamada cancelada." +msgstr "Llamada" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" -msgstr "" +msgstr "Buscar en el directorio %s" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, fuzzy, c-format msgid "Edit contact '%s'" -msgstr "(Ninguna informacion de contacto !)" +msgstr "Editar contacto '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" -msgstr "" +msgstr "Eliminar contacto '%s'" -#: ../gtk/friendlist.c:820 +#: ../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 "" +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 -msgid "" -"You need to restart linphone for the new language selection to take effect." +#: ../gtk/propertybox.c:781 +msgid "Serbian" msgstr "" -#: ../gtk/propertybox.c:912 +#: ../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:934 #, fuzzy msgid "None" msgstr "Ninguno." -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" -msgstr "" +msgstr "SRTP" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." -msgstr "Contactando " +msgstr " Llamando..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" -msgstr "" +msgstr "00::00::00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" -msgstr "Contactando " +msgstr "Llamada entrante" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" -msgstr "" +msgstr "buena" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" -msgstr "" +msgstr "media" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" -msgstr "" +msgstr "mala" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" -msgstr "" +msgstr "muy mala" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" -msgstr "" +msgstr "demasiado mala" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" -msgstr "" +msgstr "no disponible" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" -msgstr "" +msgstr "Cifrada con SRTP" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, 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:663 msgid "Set unverified" -msgstr "" +msgstr "Set sin verificar" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" -msgstr "" +msgstr "Set verificado" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" -msgstr "" +msgstr "En conferencia" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" -msgstr "Contactando " +msgstr "En llamada " -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" -msgstr "Contactando " - -#: ../gtk/incall_view.c:682 -#, c-format -msgid "%02i::%02i::%02i" -msgstr "" - -#: ../gtk/incall_view.c:699 -#, fuzzy -msgid "Call ended." -msgstr "Llamada cancelada." +msgstr "Llamada en pausa" #: ../gtk/incall_view.c:731 +#, c-format +msgid "%02i::%02i::%02i" +msgstr "%02i::%02i::%02i" + +#: ../gtk/incall_view.c:748 +#, fuzzy +msgid "Call ended." +msgstr "Llamada finalizada." + +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 +#, fuzzy msgid "Transfer done." -msgstr "" +msgstr "Transferir" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." -msgstr "Llamada cancelada." +msgstr "Transferir" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" +msgstr "Reanudar" + +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 +msgid "Pause" +msgstr "Pausar" + +#: ../gtk/incall_view.c:900 +#, 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:900 +#, 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" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" msgstr "" #: ../gtk/main.ui.h:8 @@ -711,25 +804,25 @@ msgstr "" #: ../gtk/main.ui.h:11 msgid "Transfer" -msgstr "" +msgstr "Transferir" #: ../gtk/main.ui.h:14 #, fuzzy msgid "In call" -msgstr "Contactando " +msgstr "En llamada " #: ../gtk/main.ui.h:15 #, fuzzy msgid "Duration" -msgstr "Informacion" +msgstr "Duración" #: ../gtk/main.ui.h:16 msgid "Call quality rating" -msgstr "" +msgstr "Calidad de la llamada" #: ../gtk/main.ui.h:17 msgid "_Options" -msgstr "" +msgstr "_Opciones" #: ../gtk/main.ui.h:18 msgid "Always start video" @@ -738,204 +831,145 @@ msgstr "" #: ../gtk/main.ui.h:19 #, fuzzy msgid "Enable self-view" -msgstr "Activado" +msgstr "Activar vista propia" #: ../gtk/main.ui.h:20 msgid "_Help" -msgstr "" +msgstr "_Ayuda" #: ../gtk/main.ui.h:21 #, fuzzy msgid "Show debug window" -msgstr "Linphone esta terminando..." +msgstr "Mostrar ventana de depuración" #: ../gtk/main.ui.h:22 msgid "_Homepage" -msgstr "" +msgstr "_Pagina_de_Inicio" #: ../gtk/main.ui.h:23 msgid "Check _Updates" -msgstr "" +msgstr "Buscar_Actualizaciones" #: ../gtk/main.ui.h:24 +#, fuzzy msgid "Account assistant" -msgstr "" +msgstr "Asistente de configuración de cuenta" #: ../gtk/main.ui.h:25 #, fuzzy msgid "SIP address or phone number:" -msgstr "La direccion SIP del servidor de registro." +msgstr "Dirección SIP o número de teléfono" #: ../gtk/main.ui.h:26 msgid "Initiate a new call" -msgstr "" +msgstr "Iniciar nueva llamada" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +#, fuzzy +msgid "Contacts" +msgstr "Contactos" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Añadir" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 msgid "Edit" -msgstr "" - -#: ../gtk/main.ui.h:29 -msgid "D" -msgstr "" +msgstr "Editar" #: ../gtk/main.ui.h:30 -msgid "#" -msgstr "#" +msgid "Search" +msgstr "Buscar" #: ../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 #, fuzzy msgid "Add contacts from directory" -msgstr "Informacion de codec" +msgstr "Añadir contactos desde un directorio" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" -msgstr "(Ninguna informacion de contacto !)" +msgstr "Añadir contacto" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" -msgstr "Contactando " +msgstr "Llamadas recientes " -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "My current identity:" -msgstr "Identidad" +msgstr "Mi identidad actual:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 #, fuzzy msgid "Username" -msgstr "Manual de Usuario" +msgstr "Nombre de usuario" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 #, fuzzy msgid "Password" -msgstr "Tu Contraseña:" +msgstr "Contraseña:" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" -msgstr "" +msgstr "Conexión a Internet" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" -msgstr "" +msgstr "Iniciar sesión automáticamente" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Login information" -msgstr "Informacion de codec" +msgstr "Datos de inicio de sesión" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Welcome !" -msgstr "Contactando " +msgstr "¡Bienvenido/a!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" -msgstr "" +msgstr "Todos los usuarios" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" -msgstr "linea" +msgstr "Usuarios conectados" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" -msgstr "" +msgstr "ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" -msgstr "" +msgstr "Canal de Fibra" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" -msgstr "Identidad" +msgstr "Predeterminado" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 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 +985,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 +1027,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 +1458,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 +1478,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 +1512,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:228 msgid "aborted" -msgstr "" +msgstr "abortada" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" -msgstr "" +msgstr "completada" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" -msgstr "" +msgstr "perdida" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1459,79 +1593,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:240 msgid "Outgoing call" -msgstr "" +msgstr "Llamada saliente" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 #, fuzzy msgid "Ready" -msgstr "Preparado." +msgstr "Preparado" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." -msgstr "" +msgstr "Buscando el número de teléfono del destinatario…" -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." -msgstr "" +msgstr "No se ha podido resolver este número." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2252 #, 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:2453 #, fuzzy msgid "Contacting" -msgstr "Contactando " +msgstr "Contactando" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 #, 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:2570 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:2752 #, fuzzy msgid "is contacting you" -msgstr "le esta llamando." +msgstr "le está llamando" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." -msgstr "" +msgstr "y ha solicitado auto respuesta." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." -msgstr "" +msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." -msgstr "" +msgstr "Modificando parámetros de llamada…" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" -msgstr "Llamada cancelada." +msgstr "Llamada abortada" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" -msgstr "" +msgstr "No se pudo pausar la llamada" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." -msgstr "" +msgstr "Pausando la llamada actual..." #: ../coreapi/misc.c:148 msgid "" @@ -1540,8 +1680,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 +1692,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 +1708,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 +1725,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 +1738,374 @@ 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:1069 #, 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:286 #, fuzzy msgid "Remote ringing." -msgstr "Registrando..." +msgstr "El destinatario está sonando..." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." -msgstr "Registrando..." +msgstr "El destinatario está sonando..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." -msgstr "" +msgstr "Medios iniciales." -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." -msgstr "" - -#: ../coreapi/callbacks.c:365 -#, c-format -msgid "Call answered by %s - on hold." -msgstr "" - -#: ../coreapi/callbacks.c:376 -#, fuzzy -msgid "Call resumed." -msgstr "Llamada cancelada." +msgstr "La llamada con %s está puesta en pausa." #: ../coreapi/callbacks.c:381 +#, c-format +msgid "Call answered by %s - on hold." +msgstr "Llamada respondida por %s - en espera." + +#: ../coreapi/callbacks.c:392 +#, fuzzy +msgid "Call resumed." +msgstr "Llamada reanudada." + +#: ../coreapi/callbacks.c:397 #, 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:412 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 +#, fuzzy msgid "We have been resumed." -msgstr "" +msgstr "Nos han reanudado..." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 -msgid "Call is updated by remote." -msgstr "" - -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:475 #, fuzzy -msgid "Call terminated." -msgstr "Llamada cancelada." - -#: ../coreapi/callbacks.c:528 -msgid "User is busy." -msgstr "El usuario esta ocupado." - -#: ../coreapi/callbacks.c:529 -msgid "User is temporarily unavailable." -msgstr "El usuario le dice que volvera enseguida." - -#. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 -msgid "User does not want to be disturbed." -msgstr "El usuario no quiere que lo molesten." - -#: ../coreapi/callbacks.c:532 -msgid "Call declined." -msgstr "Llamada cancelada." +msgid "Call is updated by remote." +msgstr "La llamada ha sido actualizada por el destinatario..." #: ../coreapi/callbacks.c:544 +#, fuzzy +msgid "Call terminated." +msgstr "Llamada finalizada." + +#: ../coreapi/callbacks.c:555 +msgid "User is busy." +msgstr "El usuario está ocupado." + +#: ../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:558 +msgid "User does not want to be disturbed." +msgstr "El usuario no quiere que le molesten." + +#: ../coreapi/callbacks.c:559 +msgid "Call declined." +msgstr "Llamada rechazada." + +#: ../coreapi/callbacks.c:571 msgid "No response." -msgstr "" +msgstr "No hay respuesta." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." -msgstr "" +msgstr "Error de protocolo." -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 msgid "Redirected" -msgstr "" +msgstr "Redigirida" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." -msgstr "Llamada cancelada." +msgstr "La llamada ha fallado." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, 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:738 #, 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:758 msgid "no response timeout" -msgstr "" +msgstr "timeout sin respuesta" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, 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:2355 #, 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 "label" +#~ msgstr "etiqueta" + +#~ 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 +2120,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 +2132,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 +2153,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 +2181,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 +2211,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 +2259,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 +2284,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 +2299,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 +2314,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 +2339,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 +2352,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 +2364,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 +2388,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 +2439,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..02c1f8fca 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,120 +6,150 @@ 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" -"PO-Revision-Date: 2002-12-06 17:33+0100\n" -"Last-Translator: Simon Morlat \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" "Language: \n" "MIME-Version: 1.0\n" "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:303 msgid "Aborted" msgstr "Abandonné" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 msgid "Missed" msgstr "Manqué" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 msgid "Declined" msgstr "Refusé" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../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:102 -msgid "n/a" -msgstr "inconnu" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\tQuality: %s\n" +"%s\t%s\t" +msgstr "" +"%s\tQualité: %s\n" +"%s\t%s\t" + +#: ../gtk/calllogs.c:329 +#, c-format +msgid "" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:33 -#: ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 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/chat.c:336 ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." -msgstr "" +msgstr "chemin vers le fichier de logs." -#: ../gtk/main.c:103 +#: ../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:110 +#: ../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:117 +#: ../gtk/main.c:120 msgid "address to call right now" -msgstr "addresse à appeler maintenant" +msgstr "adresse à appeler maintenant" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 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: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)" -#: ../gtk/main.c:498 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Appel avec %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:946 #, 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:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -128,65 +158,59 @@ msgstr "" "Entrez le mot de passe pour %s\n" " sur le domaine %s:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "Erreur lors de l'appel" -#: ../gtk/main.c:1054 -#: ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Appel terminé." -#: ../gtk/main.c:1057 -#: ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Appel entrant" -#: ../gtk/main.c:1059 -#: ../gtk/incall_view.c:451 -#: ../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:1061 -#: ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Refuser" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "Appel en pause" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, c-format -msgid "by %s" -msgstr "" +msgid "by %s" +msgstr "b>par %s" -#: ../gtk/main.c:1116 +#: ../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:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Lien site web" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - un téléphone video pour l'internet" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (par défaut)" -#: ../gtk/main.c:1714 -#: ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Transfert vers %s" -#: ../gtk/main.c:1724 +#: ../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." @@ -194,177 +218,171 @@ 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:1911 msgid "A free SIP video-phone" msgstr "Un visiophone libre" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "Ajouter au carnet d'adresse" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Info de présence" -#: ../gtk/friendlist.c:526 -#: ../gtk/propertybox.c:362 -#: ../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:538 +#: ../gtk/friendlist.c:673 msgid "Call" msgstr "Appeler" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Rechercher dans l'annuaire de %s" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "Contact sip invalide !" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "Appeler %s" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "Chatter avec %s" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Editer le contact '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Supprimer le contact '%s'" -#: ../gtk/friendlist.c:820 +#: ../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" -#: ../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:781 +msgid "Serbian" +msgstr "Serbe" -#: ../gtk/propertybox.c:912 -msgid "None" +#: ../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:916 +#: ../gtk/propertybox.c:934 +msgid "None" +msgstr "Aucun" + +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -374,10 +392,13 @@ 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" @@ -385,7 +406,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..." @@ -406,280 +427,320 @@ 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 -msgid "Create an account on linphone.org" -msgstr "" +"Bienvenue!\n" +"Cet assistant va vous aider à utiliser un compte SIP pour vos appels." #: ../gtk/setupwizard.c:43 -msgid "I have already a linphone.org account and I just want to use it" -msgstr "" +msgid "Create an account on linphone.org" +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 "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:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" -msgstr "" +msgstr "Entrez votre identifiant linphone.org" -#: ../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 "" +msgstr "Entrez les informations concernant votre compte" -#: ../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 -msgid "Domain*" -msgstr "" - #: ../gtk/setupwizard.c:125 +msgid "Domain*" +msgstr "Domaine*" + +#: ../gtk/setupwizard.c:126 msgid "Proxy" msgstr "" -#: ../gtk/setupwizard.c:297 -msgid "(*) Required fields" -msgstr "" - #: ../gtk/setupwizard.c:298 +msgid "(*) Required fields" +msgstr "(*) Champs requis" + +#: ../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 "" +msgstr "Confirmez votre mot de passe: (*)" -#: ../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 "" +"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:379 +#: ../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: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 "" +"Merci de valider votre compte en cliquant sur le lien que nous avons envoyé " +"par email.\n" +"Puis appuyez sur suivant." -#: ../gtk/setupwizard.c:554 +#: ../gtk/setupwizard.c:564 msgid "Welcome to the account setup assistant" -msgstr "" +msgstr "Bienvenue dans l'assistant de configuration de compte." -#: ../gtk/setupwizard.c:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" -msgstr "" +msgstr "Assistant de configuration de compte." -#: ../gtk/setupwizard.c:565 -#, fuzzy +#: ../gtk/setupwizard.c:575 msgid "Configure your account (step 1/1)" -msgstr "Configuer un compte SIP" +msgstr "Configurez votre compte (étape 1/1)" -#: ../gtk/setupwizard.c:570 +#: ../gtk/setupwizard.c:580 msgid "Enter your sip username (step 1/1)" -msgstr "" +msgstr "Entrez votre identifiant sip (étape 1/1)" -#: ../gtk/setupwizard.c:574 +#: ../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:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" -msgstr "" +msgstr "Validation (étape 2/2)" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" msgstr "Erreur" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" -msgstr "" +msgstr "En cours d’arrêt." -#: ../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 "" +msgstr "ICE non activé" -#: ../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 "" +msgstr "Négociation ICE en cours" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" -msgstr "" +msgstr "Via un ou plusieurs NATs" -#: ../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 "" +msgstr "Via un serveur relais" #: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "uPnP non activé" + +#: ../gtk/incall_view.c:240 +msgid "uPnP in progress" +msgstr "uPnP en cours" + #: ../gtk/incall_view.c:242 +msgid "uPnp not available" +msgstr "uPnP est indisponible" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "uPnP en cours d’exécution" + +#: ../gtk/incall_view.c:246 +msgid "uPnP failed" +msgstr "uPnP a échoué." + +#: ../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 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" -#: ../gtk/incall_view.c:341 -#: ../gtk/main.ui.h:12 -msgid "Hang up" +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 +msgid "Hang up" +msgstr "Raccrocher" + +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Tentative d'appel..." -#: ../gtk/incall_view.c:433 -#: ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Appel entrant" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "bon" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "moyen" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "faible" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "très faible" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "nulle" -#: ../gtk/incall_view.c:490 -#: ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "indisponible" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "Sécurisé par SRTP" -#: ../gtk/incall_view.c:611 +#: ../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:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "Marquer comme non vérifié" -#: ../gtk/incall_view.c:617 -#: ../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:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "En conférence" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "Appel en cours" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Appel en attente" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Appel terminé." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" -msgstr "" +msgstr "Transfert en cours" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "Transfert terminé" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 msgid "Transfer failed." msgstr "Transfert échoué" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Reprendre" -#: ../gtk/incall_view.c:788 -#: ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Pause" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +#, fuzzy +msgid "(Paused)" +msgstr "Pause" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -697,9 +758,9 @@ msgstr "Envoyer" msgid "End conference" msgstr "Fin de conférence" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" +msgstr "Enregistrement de l'appel dans un fichier audio." #: ../gtk/main.ui.h:8 msgid "Video" @@ -707,7 +768,7 @@ msgstr "Vidéo" #: ../gtk/main.ui.h:10 msgid "Mute" -msgstr "" +msgstr "Couper le son" #: ../gtk/main.ui.h:11 msgid "Transfer" @@ -731,7 +792,7 @@ msgstr "" #: ../gtk/main.ui.h:18 msgid "Always start video" -msgstr "" +msgstr "Toujours démarrer la vidéo" #: ../gtk/main.ui.h:19 msgid "Enable self-view" @@ -755,7 +816,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:" @@ -766,153 +827,84 @@ msgid "Initiate a new call" msgstr "Démarrer un nouvel appel" #: ../gtk/main.ui.h:27 -#: ../gtk/parameters.ui.h:48 +msgid "Contacts" +msgstr "Contacts" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Ajouter" -#: ../gtk/main.ui.h:28 -#: ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 msgid "Add contacts from directory" msgstr "Ajouter un contact depuis l'annuaire" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 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:33 msgid "Recent calls" msgstr "Appels récents" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Mon identité sip:" -#: ../gtk/main.ui.h:51 -#: ../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:52 -#: ../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:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" -msgstr "" +msgstr "Connexion internet:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Me connecter automatiquement" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Information de login" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Bienvenue !" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "Tous" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "En ligne" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Par défaut" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" -msgstr "" +msgstr "Supprimer" #: ../gtk/about.ui.h:1 msgid "About linphone" @@ -967,7 +959,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" @@ -1007,7 +999,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:" @@ -1031,7 +1023,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" @@ -1055,7 +1047,11 @@ 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" +msgstr "" #: ../gtk/parameters.ui.h:8 msgid "SIP (UDP)" @@ -1094,209 +1090,222 @@ 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 "" +msgstr "Champs DSCP" -#: ../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 -#, fuzzy -msgid "Behind NAT / Firewall (use ICE)" -msgstr "Derrière un pare-feu (utiliser STUN)" - #: ../gtk/parameters.ui.h:28 +msgid "Behind NAT / Firewall (use ICE)" +msgstr "Derrière un pare-feu (utiliser ICE)" + +#: ../gtk/parameters.ui.h:29 +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "Derrière un pare-feu (utiliser uPnP)" + +#: ../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 -msgid "Video input device:" -msgstr "Périphérique d'entrée video" - -#: ../gtk/parameters.ui.h:39 -msgid "Prefered video resolution:" -msgstr "Résolution video préférée:" - #: ../gtk/parameters.ui.h:40 +msgid "Video input device:" +msgstr "Périphérique d'entrée vidéo" + +#: ../gtk/parameters.ui.h:41 +msgid "Prefered video resolution:" +msgstr "Résolution de vidéo préférée:" + +#: ../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 adresse 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:" +msgstr "Votre adresse 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" @@ -1321,9 +1330,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" @@ -1343,10 +1351,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" @@ -1360,7 +1367,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,8 +1376,16 @@ 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 msgid "Call statistics and information" -msgstr "Information sur le contact" +msgstr "Statistiques de l'appel et informations" #: ../gtk/tunnel_config.ui.h:1 #, fuzzy @@ -1393,19 +1408,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:228 msgid "aborted" msgstr "abandonné" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "terminé" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "manqué" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1420,67 +1495,70 @@ msgstr "" "Etat: %s\n" "Durée: %i mn %i sec\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Appel sortant" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Prêt." -#: ../coreapi/linphonecore.c:2074 +#: ../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:2077 +#: ../coreapi/linphonecore.c:2208 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: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:2312 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Appel de" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "Echec de l'appel" -#: ../coreapi/linphonecore.c:2429 +#: ../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:2573 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "vous appelle" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "et sollicite un décrochage automatique." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "Modifications des paramètres d'appels..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "En ligne." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "Appel abandonné" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "La mise en attente a échoué" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Mise en attente de l'appel..." @@ -1551,7 +1629,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" @@ -1566,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'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 "" @@ -1575,118 +1657,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:1069 #, c-format msgid "Could not login as %s" msgstr "Echec de la connexion en tant que %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Sonnerie distante." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "Sonnerie distante..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." -msgstr "Prise d'appel anticipée" +msgstr "Prise d'appel anticipée." -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "%s est maintenant en attente." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "Appel répondu par %s - en attente" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Appel repris." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "Appel répondu par %s." -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "Reprise..." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 #, fuzzy msgid "Call is updated by remote." msgstr "L'appel a été repris par le correspondant." -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Appel terminé." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Occupé..." -#: ../coreapi/callbacks.c:529 +#: ../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:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "L'usager ne souhaite pas être dérangé" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Appel décliné." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Pas de réponse." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Erreur de protocole" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Redirection" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "L'appel a échoué." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Enregistrement sur %s effectué." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Désenregistrement sur %s effectué." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "Pas de réponse" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Echec de l'enregistrement sur %s: %s" @@ -1696,13 +1779,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:2355 #, 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,15 +1799,12 @@ 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" #~ 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:" @@ -1767,9 +1850,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..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-01-08 10:35+0100\n" -"PO-Revision-Date: 2012-12-27 10:14+0200\n" +"POT-Creation-Date: 2013-04-08 16:59+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" @@ -19,63 +19,78 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.5.4\n" -#: ../gtk/calllogs.c:82 -#, fuzzy +# צור קשר עם +#: ../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 +#, c-format +msgid "Recent calls (%i)" +msgstr "שיחות אחרונות (%i)" + +#: ../gtk/calllogs.c:300 +msgid "n/a" +msgstr "לא זמין (n/a)" + +#: ../gtk/calllogs.c:303 msgid "Aborted" msgstr "ננטשה" -#: ../gtk/calllogs.c:85 -#, fuzzy +#: ../gtk/calllogs.c:306 msgid "Missed" msgstr "הוחמצה" -# דחיה -#: ../gtk/calllogs.c:88 -#, fuzzy +#: ../gtk/calllogs.c:309 msgid "Declined" -msgstr "לדחות" +msgstr "נדחתה" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "דקה %i" msgstr[1] "%i דקות" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "שניה %i" msgstr[1] "%i שניות" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, c-format +msgid "%s\t%s" +msgstr "" + +#: ../gtk/calllogs.c:323 #, 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\tאיכות: %s\n" -"%s\t%s %s\t" +"%s\tאיכות: %s\n" +"%s\t%s\t" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "לא זמין (n/a)" - -#: ../gtk/calllogs.c:105 -#, fuzzy, c-format +#: ../gtk/calllogs.c:329 +#, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" 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:13 msgid "Conference" msgstr "ועידה" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "אני" @@ -84,42 +99,49 @@ 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:89 +#: ../gtk/main.c:92 #, fuzzy msgid "log to stdout some debug information while running." msgstr "רשום אל stdout מידע ניפוי שגיאות מסוים בזמן ביצוע." # cli -#: ../gtk/main.c:96 +#: ../gtk/main.c:99 #, fuzzy msgid "path to a file to write logs into." msgstr "נתיב אל קובץ שברצונך לרשום אליו את הרשומות." -#: ../gtk/main.c:103 +# cli +#: ../gtk/main.c:106 +#, fuzzy msgid "Start linphone with video disabled." -msgstr "" +msgstr "התחל את לינפון עם וידאו מנוטרל." # cli -#: ../gtk/main.c:110 +#: ../gtk/main.c:113 #, fuzzy msgid "Start only in the system tray, do not show the main interface." msgstr "התחל במגש המערכת בלבד, אל תציג את הממשק הראשי." # cli -#: ../gtk/main.c:117 +#: ../gtk/main.c:120 #, fuzzy msgid "address to call right now" msgstr "כתובת להתקשרות ברגע זה" # cli -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 #, fuzzy msgid "if set automatically answer incoming calls" msgstr "באם אפשרות זו נקבעת ענה אוטומטית לקריאות נכנסות" # cli -#: ../gtk/main.c:131 +#: ../gtk/main.c:134 #, fuzzy msgid "" "Specifiy a working directory (should be the base of the installation, eg: c:" @@ -128,14 +150,14 @@ msgstr "" "ציין מדור העבודה (אמור להיות מבוסס על ההתקנה, למשל: c:\\Program Files" "\\Linphone)" -#: ../gtk/main.c:498 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "התקשרות באמצעות %s" # הקשר שלהם # אם התשובה -#: ../gtk/main.c:871 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -148,7 +170,7 @@ msgstr "" "שלך ?\n" "היה ותשובתך תהיה לא, אדם זה יהיה מסומן באופן זמני ברשימה השחורה." -#: ../gtk/main.c:948 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -158,247 +180,243 @@ msgstr "" " בתחום %s:" # שיחה -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "שגיאת קריאה" # Conversation ended -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3189 msgid "Call ended" msgstr "שיחה הסתיימה" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../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:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" msgstr "לענות" # דחיה -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "לדחות" # Conversation paused -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "שיחה הושהתה" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, c-format -msgid "by %s" -msgstr "מאת %s" +msgid "by %s" +msgstr "על ידי %s" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" -msgstr "" +msgstr "‏%s רוצה להתחיל וידאו. האם אתה מסכים ?" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "קישור אתר רשת" # ‫Linphone - וידאופון במרשתת -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "‫Linphone - וידאופון אינטרנטי" -#: ../gtk/main.c:1410 +# משתמטת +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" -msgstr "‫%s (משתמטת)" +msgstr "‫%s (ברירת מחדל)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "אנחנו מועברים אל %s" # קריאות שמע -#: ../gtk/main.c:1724 +#: ../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 "" "לא אותרו כרטיסי קול במחשב זה.\n" -"לא תהיה ביכולתך לשלוח או לקבל שיחות שמע." +"לא תהיה ביכולתך לשלוח או לקבל שיחות אודיו." -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "וידאופון SIP חופשי" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "הוסף אל ספר כתובות" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "מצב נוכחות" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "שם" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:673 msgid "Call" msgstr "קריאה" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 msgid "Chat" -msgstr "" +msgstr "שיחה" # a name or a number -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "חיפוש במדור %s" -# איש־קשר -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "כתובת sip לא תקפה !" - -# צור קשר עם -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "התקשר אל %s" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "שלח טקסט אל %s" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "ערוך איש קשר '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "מחק איש קשר '%s'" -#: ../gtk/friendlist.c:820 +#: ../gtk/friendlist.c:926 +#, 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" # קצב תדר תדירות מהירות -#: ../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 "" +msgstr "עברית" + +#: ../gtk/propertybox.c:781 +msgid "Serbian" +msgstr "српски srpski" # selected הנבחרת -#: ../gtk/propertybox.c:842 +#: ../gtk/propertybox.c:848 msgid "" "You need to restart linphone for the new language selection to take effect." msgstr "עליך לאתחל את לינפון כדי שהשפה החדשה תיכנס לתוקף." -#: ../gtk/propertybox.c:912 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "ללא" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -443,7 +461,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 +469,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." @@ -527,13 +545,12 @@ 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" @@ -544,194 +561,233 @@ 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 -#, fuzzy +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" -msgstr "לא נמצא" +msgstr "לא בשימוש" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" -msgstr "" +msgstr "‏ICE לא מופעלת" -#: ../gtk/incall_view.c:221 -#, fuzzy +#: ../gtk/incall_view.c:222 msgid "ICE failed" -msgstr "קריאה נכשלה." +msgstr "‏ICE נכשלה" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" -msgstr "" +msgstr "‏ICE מצויה כעת בעיצומה" -#: ../gtk/incall_view.c:225 +#: ../gtk/incall_view.c:226 msgid "Going through one or more NATs" -msgstr "" +msgstr "עובר דרך NAT אחד או יותר" -#: ../gtk/incall_view.c:227 -#, fuzzy +#: ../gtk/incall_view.c:228 msgid "Direct" -msgstr "מכוון מחדש" +msgstr "ישיר" -#: ../gtk/incall_view.c:229 +#: ../gtk/incall_view.c:230 msgid "Through a relay server" -msgstr "" +msgstr "דרך שרת ממסר" -#: ../gtk/incall_view.c:238 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "‏uPnP לא מופעלת" + +#: ../gtk/incall_view.c:240 +msgid "uPnP in progress" +msgstr "‏uPnP מצויה כעת בעיצומה" + +#: ../gtk/incall_view.c:242 +msgid "uPnp not available" +msgstr "‏uPnp לא זמינה" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "‏uPnP מורצת כעת" + +#: ../gtk/incall_view.c:246 +msgid "uPnP failed" +msgstr "‏uPnP נכשלה" + +#: ../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 "" +"הורדה: %f\n" +"העלאה: %f (קי״ב/שנ׳)" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "%.3f שניות" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" -msgstr "" +msgstr "נתק" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "מתקשר כעת..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "‭00::00::00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "קריאה נכנסת" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "טובה" # רגילה -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "ממוצעת" # weak חלשה חלושה רפויה רופפת -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "דלה" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "דלה מאוד" # רעה -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "גרועה מדי" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "לא זמינה" # באמצעות -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "מאובטחת על ידי SRTP" -#: ../gtk/incall_view.c:611 +#: ../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:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "הגדר כלא מאומתת" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "הגדר כמאומתת" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "בשיחת ועידה" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "בשיחה כעת" -#: ../gtk/incall_view.c:669 +#: ../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:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "‭%02i::%02i::%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "שיחה הסתיימה." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" -msgstr "" - -#: ../gtk/incall_view.c:734 -#, fuzzy -msgid "Transfer done." -msgstr "העברה" - -#: ../gtk/incall_view.c:737 -#, fuzzy -msgid "Transfer failed." -msgstr "העברה" +msgstr "העברה מצויה כעת בעיצומה" #: ../gtk/incall_view.c:781 -msgid "Resume" -msgstr "חזרה" +msgid "Transfer done." +msgstr "העברה הסתיימה." -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:784 +msgid "Transfer failed." +msgstr "העברה נכשלה." + +#: ../gtk/incall_view.c:828 +msgid "Resume" +msgstr "חזור" + +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" -msgstr "השהיה" +msgstr "השהה" + +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" +"מקליט אל תוך\n" +"%s %s" + +#: ../gtk/incall_view.c:900 +msgid "(Paused)" +msgstr "(מושהה)" #: ../gtk/loginframe.c:93 #, c-format @@ -742,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:4 -msgid "label" -msgstr "תוויות" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" +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" @@ -787,7 +843,7 @@ msgstr "_אפשרויות" #: ../gtk/main.ui.h:18 msgid "Always start video" -msgstr "" +msgstr "התחל תמיד וידאו" #: ../gtk/main.ui.h:19 msgid "Enable self-view" @@ -819,155 +875,91 @@ msgstr "כתובת SIP או מספר טלפון" #: ../gtk/main.ui.h:26 msgid "Initiate a new call" -msgstr "התחלת שיחה חדשה" +msgstr "התחל שיחה חדשה" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +msgid "Contacts" +msgstr "אנשי קשר" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "הוסף" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 msgid "Add contacts from directory" msgstr "הוסף אנשי קשר מן מדור" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 msgid "Add contact" -msgstr "הוספת איש קשר" - -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "לוח מקשים" +msgstr "הוסף איש קשר" # קריאות אחרונות -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:33 msgid "Recent calls" msgstr "שיחות אחרונות" # הזהות הנוכחית שלי -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "זהותי הנוכחית:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "שם משתמש" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "סיסמה" # מרשתת -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "חיבור אינטרנט:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "חבר אותי אוטומטית" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "מידע התחברות" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "ברוך בואך !" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "כל המשתמשים" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "משתמשים מקוונים" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "‫ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "ערוץ סיב" # משתמט -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "ברירת מחדל" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" -msgstr "" +msgstr "מחק" #: ../gtk/about.ui.h:1 msgid "About linphone" @@ -1033,7 +1025,7 @@ msgstr "נא להזין את סיסמת המתחם" #: ../gtk/password.ui.h:3 msgid "UserID" -msgstr "זהות משתמש (‫UID)" +msgstr "מזהה משתמש" # קריאות #: ../gtk/call_logs.ui.h:1 @@ -1111,23 +1103,27 @@ msgstr "" #: ../gtk/parameters.ui.h:5 msgid "Audio codecs" -msgstr "קודקים של שמע" +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 "" +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" @@ -1155,192 +1151,201 @@ 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:" +msgstr "אודיו RTP/UDP:" + +#: ../gtk/parameters.ui.h:19 +msgid "DSCP fields" +msgstr "שדות DSCP" #: ../gtk/parameters.ui.h:20 -msgid "DSCP fields" -msgstr "" +msgid "Fixed" +msgstr "מקובע" #: ../gtk/parameters.ui.h:21 -msgid "Fixed" -msgstr "" +msgid "Tunnel" +msgstr "מינהור" #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" -msgstr "פרוטוקולי רשת עבודה ופורטים" +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 -msgid "Behind NAT / Firewall (specify gateway IP below)" -msgstr "מאחורי NAT \\ חומת־אש (ציון כתובת שער (Gateway IP) למטה)" - #: ../gtk/parameters.ui.h:25 +msgid "Behind NAT / Firewall (specify gateway IP below)" +msgstr "מאחורי NAT / חומת אש (ציון כתובת שער (Gateway IP) למטה)" + +#: ../gtk/parameters.ui.h:26 msgid "Public IP address:" msgstr "כתובת IP פומבית:" -# שימוש ב־STUN -# utilize -#: ../gtk/parameters.ui.h:26 -msgid "Behind NAT / Firewall (use STUN to resolve)" -msgstr "מאחורי NAT \\ חומת־אש (ניצול STUN)" - +# ניצול STUN # שימוש ב־STUN # utilize #: ../gtk/parameters.ui.h:27 -#, fuzzy -msgid "Behind NAT / Firewall (use ICE)" -msgstr "מאחורי NAT \\ חומת־אש (ניצול STUN)" +msgid "Behind NAT / Firewall (use STUN to resolve)" +msgstr "מאחורי NAT / חומת אש (בעזרת STUN לפתירה)" +# שימוש ב־STUN +# utilize #: ../gtk/parameters.ui.h:28 +msgid "Behind NAT / Firewall (use ICE)" +msgstr "מאחורי NAT / חומת אש (בעזרת ICE)" + +# שימוש ב־STUN +# utilize +#: ../gtk/parameters.ui.h:29 +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "מאחורי NAT / חומת אש (בעזרת uPnP)" + +#: ../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 "הגדרות רשת עבודה" +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 "שמע" +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 +# 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: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 +1355,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 "סיום" @@ -1400,95 +1405,155 @@ 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 "Media connectivity" -msgstr "סוג הצפנת מדיה" +msgid "Audio Media connectivity" +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 "קישוריות מדיום וידאו" + +#: ../gtk/call_statistics.ui.h:8 +msgid "Round trip time" +msgstr "זמן הלוך ושוב" + +#: ../gtk/call_statistics.ui.h:9 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 "הגדר http proxy (רשות)" + +#: ../gtk/keypad.ui.h:1 +msgid "D" msgstr "" -#: ../coreapi/linphonecore.c:232 +#: ../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 +1568,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:1312 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 +1593,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:3357 msgid "Could not pause the call" msgstr "לא ניתן להשהות את השיחה" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3362 msgid "Pausing the current call..." msgstr "משהה כעת שיחה נוכחית..." @@ -1605,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" @@ -1658,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 @@ -1677,40 +1742,40 @@ msgstr "" "זו צריכה להיראות כמו sip:username@proxydomain, למשל sip:alice@example.net" # בשם כ־ -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "לא ניתן להתחבר בזהות %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "צלצול מרוחק." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "צלצול מרוחק..." # A SIP state -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "מדיה מוקדמת." -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "שיחה עם %s מושהית." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "קריאה נענתה על ידי %s - בהמתנה." # renewed -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "קריאה חודשה." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "קריאה נענתה על ידי %s." @@ -1718,88 +1783,85 @@ msgstr "קריאה נענתה על ידי %s." # לא תואם # אי תאימות # אי התאמה -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." -msgstr "חוסר תאימות, נא לבדוק קודקים..." +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." +msgstr "חוסר תאימות, בדוק קודקים או הגדרות אבטחה..." -#: ../coreapi/callbacks.c:437 -#, fuzzy +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." -msgstr "חזרנו..." +msgstr "חזרנו." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." -msgstr "" +msgstr "אנו מושהים על ידי צד אחר." # באופן מרוחק -#: ../coreapi/callbacks.c:452 -#, fuzzy +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." -msgstr "שיחה עודכנה מרחוק..." +msgstr "שיחה עודכנה מרחוק." -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "קריאה הסתיימה." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "משתמש עסוק כעת." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "משתמש לא זמין זמנית." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "משתמש לא מעוניין שיפריעו לו." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "קריאה סורבה." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "אין תגובה." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "שגיאת פרוטוקול." -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "מכוון מחדש" # לא תואם # אי תאימות # אי התאמה -#: ../coreapi/callbacks.c:600 -#, fuzzy +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." -msgstr "חוסר תאימות, נא לבדוק קודקים..." +msgstr "פרמטריי מדיה חסרי תואמים." -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "קריאה נכשלה." # הרשמה אצל %s הושלמה בהצלחה. -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "רישום אצל %s הושלם בהצלחה." -#: ../coreapi/callbacks.c:702 +#: ../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:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "אין היענות תוך זמן מוגדר" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "רישום אצל %s נכשל: %s" @@ -1810,20 +1872,26 @@ msgid "Authentication token is %s" msgstr "אות האימות הינה %s" # האם כדאי לחקות את הטלפונים הניידים? שיחות של נענו -#: ../coreapi/linphonecall.c:2124 +#: ../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" + +#~ msgid "Keypad" +#~ msgstr "לוח מקשים" + # שוחחו #~ msgid "Chat with %s" #~ msgstr "שיחה עם %s" -#~ msgid "Contacts" -#~ msgstr "אנשי קשר" - #~ msgid "Enable video" #~ msgstr "הפעל וידאו" @@ -1924,9 +1992,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..65bbb3e7b 100644 --- a/po/hu.po +++ b/po/hu.po @@ -1,117 +1,145 @@ -# 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-01-08 10:35+0100\n" -"PO-Revision-Date: 2007-12-14 11:12+0100\n" -"Last-Translator: \n" -"Language-Team: LANGUAGE \n" -"Language: \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" +"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 -#, fuzzy +#: ../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:303 msgid "Aborted" -msgstr "megszakítva" +msgstr "Megszakítva" -#: ../gtk/calllogs.c:85 -#, fuzzy +#: ../gtk/calllogs.c:306 msgid "Missed" -msgstr "elhibázva" +msgstr "Nem fogadott" -#: ../gtk/calllogs.c:88 -#, fuzzy +#: ../gtk/calllogs.c:309 msgid "Declined" -msgstr "line" +msgstr "Elutasítva" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%i perc" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%i másodperc" -#: ../gtk/calllogs.c:100 -#, 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 "" - -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 -#, c-format -msgid "" -"%s\t%s\t\n" +"%s\t%s\t\n" "%s\t%s" -msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../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 "" +msgstr "Konferencia" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" -msgstr "" +msgstr "én" #: ../gtk/support.c:49 ../gtk/support.c:73 ../gtk/support.c:102 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Nemtalálható a pixmap fájl: %s" -#: ../gtk/main.c:89 +#: ../gtk/chat.c:336 ../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 "" +msgstr "Futás közben némi hibakeresési információ az stdout-ra naplózása." -#: ../gtk/main.c:96 +#: ../gtk/main.c:99 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:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." -msgstr "" +msgstr "Linphone indítása, videó kikpacsolva. " -#: ../gtk/main.c:110 +#: ../gtk/main.c:113 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:117 +#: ../gtk/main.c:120 msgid "address to call right now" -msgstr "" +msgstr "Cím azonnali híváshoz" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" -msgstr "" +msgstr "Bekapcsolva automatikusan válaszol a bejövő hívásokra" -#: ../gtk/main.c:131 +#: ../gtk/main.c:134 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:498 -#, fuzzy, c-format +#: ../gtk/main.c:515 +#, c-format msgid "Call with %s" -msgstr "Chat-elés %s -el" +msgstr "Hívás %s -el" -#: ../gtk/main.c:871 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -119,248 +147,247 @@ 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:948 +#: ../gtk/main.c:1023 #, c-format 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:1051 -#, fuzzy +#: ../gtk/main.c:1126 msgid "Call error" -msgstr "Linphone - Híváselőzmények" +msgstr "Hiba a hívás közben" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Hívás vége" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 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:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 msgid "Answer" -msgstr "" +msgstr "Hívás fogadása" -#: ../gtk/main.c:1061 ../gtk/main.ui.h:7 -#, fuzzy +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" -msgstr "line" +msgstr "Elutasítás" -#: ../gtk/main.c:1067 -#, fuzzy +#: ../gtk/main.c:1142 msgid "Call paused" -msgstr "megszakítva" +msgstr "Hívás várakoztatva" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, c-format -msgid "by %s" -msgstr "" +msgid "by %s" +msgstr "a következő által: %s" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" -msgstr "" +msgstr "%s szerené elidítani a videót. Elfogadja?" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" -msgstr "" +msgstr "Internetes oldal" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" -msgstr "" +msgstr "Linphone - internetes videó telefon" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" -msgstr "" +msgstr "%s (Alapértelmezett)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" -msgstr "" +msgstr "Át vagyunk irányítva ide: %s" -#: ../gtk/main.c:1724 +#: ../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 "" +"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:1833 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "Egy ingyenes SIP video-telefon" -#: ../gtk/friendlist.c:335 -#, fuzzy +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" -msgstr "Címjegyzék" +msgstr "Hozzáadás címjegyzékhez" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Jelenlét státusz" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../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:538 -#, fuzzy +#: ../gtk/friendlist.c:673 msgid "Call" -msgstr "Hivás előzmények" +msgstr "Hivás" -#: ../gtk/friendlist.c:543 -#, fuzzy +#: ../gtk/friendlist.c:678 msgid "Chat" -msgstr "Chat szoba" +msgstr "Csevegés" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" -msgstr "" +msgstr "Keresés ebben a könyvtárban: %s" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "" - -#: ../gtk/friendlist.c:775 -#, fuzzy, c-format -msgid "Call %s" -msgstr "Hivás előzmények" - -#: ../gtk/friendlist.c:776 +#: ../gtk/friendlist.c:924 #, c-format -msgid "Send text to %s" -msgstr "" - -#: ../gtk/friendlist.c:777 -#, fuzzy, c-format msgid "Edit contact '%s'" -msgstr "Kapcsolatinformációk szerkesztése" +msgstr "Kapcsolatinformációk szerkesztése: '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" -msgstr "" +msgstr "'%s' partner törlése" -#: ../gtk/friendlist.c:820 +#: ../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 "" +msgstr "Új partner hozzáadása ebből a könyvtárból: %s" -#: ../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 -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 "" - #: ../gtk/propertybox.c:764 -msgid "Brazilian Portugese" -msgstr "" +msgid "English" +msgstr "angol" #: ../gtk/propertybox.c:765 -msgid "Polish" -msgstr "" +msgid "French" +msgstr "francia" #: ../gtk/propertybox.c:766 -msgid "German" -msgstr "" +msgid "Swedish" +msgstr "svéd" #: ../gtk/propertybox.c:767 -msgid "Russian" -msgstr "" +msgid "Italian" +msgstr "olasz" #: ../gtk/propertybox.c:768 -msgid "Japanese" -msgstr "" +msgid "Spanish" +msgstr "spanyol" #: ../gtk/propertybox.c:769 -msgid "Dutch" -msgstr "" +msgid "Brazilian Portugese" +msgstr "brazil-portugál" #: ../gtk/propertybox.c:770 -msgid "Hungarian" -msgstr "" +msgid "Polish" +msgstr "lengyel" #: ../gtk/propertybox.c:771 -msgid "Czech" -msgstr "" +msgid "German" +msgstr "német" #: ../gtk/propertybox.c:772 -msgid "Chinese" -msgstr "" +msgid "Russian" +msgstr "orosz" #: ../gtk/propertybox.c:773 -msgid "Traditional Chinese" -msgstr "" +msgid "Japanese" +msgstr "japán" #: ../gtk/propertybox.c:774 -msgid "Norwegian" -msgstr "" +msgid "Dutch" +msgstr "holland" #: ../gtk/propertybox.c:775 +msgid "Hungarian" +msgstr "magyar" + +#: ../gtk/propertybox.c:776 +msgid "Czech" +msgstr "cseh" + +#: ../gtk/propertybox.c:777 +msgid "Chinese" +msgstr "egyszerúsített kínai" + +#: ../gtk/propertybox.c:778 +msgid "Traditional Chinese" +msgstr "tradícionális kínai" + +#: ../gtk/propertybox.c:779 +msgid "Norwegian" +msgstr "norvég" + +#: ../gtk/propertybox.c:780 msgid "Hebrew" +msgstr "héber" + +#: ../gtk/propertybox.c:781 +msgid "Serbian" msgstr "" -#: ../gtk/propertybox.c:842 +#: ../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:912 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Nincs" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" -msgstr "" +msgstr "SRTP" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" -msgstr "" +msgstr "ZRTP" #: ../gtk/update.c:80 #, c-format @@ -368,575 +395,531 @@ 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: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 "" +"Ü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 "I have already a linphone.org account and I just want to use it" -msgstr "" +msgid "Create an account on linphone.org" +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 "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:84 +#: ../gtk/setupwizard.c:85 msgid "Enter your linphone.org username" -msgstr "" +msgstr "Adja meg linphone.org felhasználónevét" -#: ../gtk/setupwizard.c:91 -#, fuzzy +#: ../gtk/setupwizard.c:92 msgid "Username:" -msgstr "felhasználónév:" +msgstr "Felhasználónév:" -#: ../gtk/setupwizard.c:93 ../gtk/password.ui.h:4 -#, fuzzy +#: ../gtk/setupwizard.c:94 ../gtk/password.ui.h:4 msgid "Password:" -msgstr "jelszó:" +msgstr "Jelszó:" -#: ../gtk/setupwizard.c:113 +#: ../gtk/setupwizard.c:114 msgid "Enter your account informations" -msgstr "" - -#: ../gtk/setupwizard.c:120 -#, fuzzy -msgid "Username*" -msgstr "felhasználónév:" +msgstr "Írja be fiókinformációit" #: ../gtk/setupwizard.c:121 -#, fuzzy -msgid "Password*" -msgstr "jelszó:" +msgid "Username*" +msgstr "Felhasználónév*" -#: ../gtk/setupwizard.c:124 -msgid "Domain*" -msgstr "" +#: ../gtk/setupwizard.c:122 +msgid "Password*" +msgstr "Jelszó*" #: ../gtk/setupwizard.c:125 -msgid "Proxy" -msgstr "" +msgid "Domain*" +msgstr "Tartomány" -#: ../gtk/setupwizard.c:297 -msgid "(*) Required fields" -msgstr "" +#: ../gtk/setupwizard.c:126 +msgid "Proxy" +msgstr "Proxy" #: ../gtk/setupwizard.c:298 -#, fuzzy +msgid "(*) Required fields" +msgstr "(*) Mező kitöltése szükséges" + +#: ../gtk/setupwizard.c:299 msgid "Username: (*)" -msgstr "felhasználónév:" +msgstr "Felhasználónév: (*)" -#: ../gtk/setupwizard.c:300 -#, fuzzy +#: ../gtk/setupwizard.c:301 msgid "Password: (*)" -msgstr "jelszó:" +msgstr "Jelszó: (*)" -#: ../gtk/setupwizard.c:302 +#: ../gtk/setupwizard.c:303 msgid "Email: (*)" -msgstr "" +msgstr "E-mail: (*)" -#: ../gtk/setupwizard.c:304 +#: ../gtk/setupwizard.c:305 msgid "Confirm your password: (*)" -msgstr "" +msgstr "Jelszó megerősítése: (*)" -#: ../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 "" +"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:379 +#: ../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: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 "" +"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:554 +#: ../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:559 +#: ../gtk/setupwizard.c:569 msgid "Account setup assistant" -msgstr "" +msgstr "Fiók beállítása varázsló" -#: ../gtk/setupwizard.c:565 +#: ../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:570 +#: ../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:574 +#: ../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:583 +#: ../gtk/setupwizard.c:593 msgid "Validation (step 2/2)" -msgstr "" +msgstr "Érvényesítés (2/2 lépés)" -#: ../gtk/setupwizard.c:588 +#: ../gtk/setupwizard.c:598 msgid "Error" -msgstr "" +msgstr "Hiba" -#: ../gtk/setupwizard.c:592 +#: ../gtk/setupwizard.c:602 msgid "Terminating" -msgstr "" +msgstr "Befejezés" -#: ../gtk/incall_view.c:69 ../gtk/incall_view.c:90 -#, fuzzy, c-format +#: ../gtk/incall_view.c:70 ../gtk/incall_view.c:94 +#, c-format msgid "Call #%i" -msgstr "Hivás előzmények" +msgstr "Hívás #%i" -#: ../gtk/incall_view.c:150 +#: ../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:209 ../gtk/incall_view.c:212 +#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213 msgid "Not used" -msgstr "" +msgstr "Nem használt" -#: ../gtk/incall_view.c:219 +#: ../gtk/incall_view.c:220 msgid "ICE not activated" -msgstr "" +msgstr "ICE nincs aktiválva" -#: ../gtk/incall_view.c:221 -#, fuzzy +#: ../gtk/incall_view.c:222 msgid "ICE failed" -msgstr "Hívás elutasítva" +msgstr "ICE nem sikerült" -#: ../gtk/incall_view.c:223 +#: ../gtk/incall_view.c:224 msgid "ICE in progress" -msgstr "" +msgstr "ICE folyamatban" -#: ../gtk/incall_view.c:225 +#: ../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:227 -#, fuzzy +#: ../gtk/incall_view.c:228 msgid "Direct" -msgstr "Átirányítva idw %s..." +msgstr "Közvetlen" -#: ../gtk/incall_view.c:229 +#: ../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 ../gtk/incall_view.c:242 +#: ../gtk/incall_view.c:238 +msgid "uPnP not activated" +msgstr "uPnP nincs aktiválva" + +#: ../gtk/incall_view.c:240 +msgid "uPnP in progress" +msgstr "uPnP folyamatban" + +#: ../gtk/incall_view.c:242 +msgid "uPnp not available" +msgstr "uPnP nem elérhető" + +#: ../gtk/incall_view.c:244 +msgid "uPnP is running" +msgstr "uPnP fut" + +#: ../gtk/incall_view.c:246 +msgid "uPnP failed" +msgstr "uPnP nem sikerült" + +#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257 +msgid "Direct or through server" +msgstr "közvetlen vagy kiszolgálón keresztül" + +#: ../gtk/incall_view.c:259 ../gtk/incall_view.c:265 #, c-format msgid "" "download: %f\n" "upload: %f (kbit/s)" msgstr "" +"letöltés: %f\n" +"feltöltés: %f (kbit/mp)" -#: ../gtk/incall_view.c:341 ../gtk/main.ui.h:12 +#: ../gtk/incall_view.c:286 +#, c-format +msgid "%.3f seconds" +msgstr "%.3f másodperc" + +#: ../gtk/incall_view.c:384 ../gtk/main.ui.h:12 msgid "Hang up" -msgstr "" +msgstr "Befejezés" -#: ../gtk/incall_view.c:430 -#, fuzzy +#: ../gtk/incall_view.c:476 msgid "Calling..." -msgstr "Kapcsolatilista" +msgstr "Hívás folyamatban..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" -msgstr "" +msgstr "00::00::00" -#: ../gtk/incall_view.c:444 -#, fuzzy +#: ../gtk/incall_view.c:490 msgid "Incoming call" -msgstr "Beérkező hívás" +msgstr "Beérkező hívás" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" -msgstr "" +msgstr "jó" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" -msgstr "" +msgstr "közepes" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" -msgstr "" +msgstr "gyenge" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" -msgstr "" +msgstr "nagyon gyenge" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" -msgstr "" +msgstr "rossz" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" -msgstr "" +msgstr "nem elérhető" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" -msgstr "" +msgstr "SRTP-vel titkosítva" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" -msgstr "" +msgstr "ZRTP-vel titkosítva - [hitelesítési jel: %s]" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" -msgstr "" +msgstr "Beállítás ellenőrizetlenként" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" -msgstr "" +msgstr "Beállítás ellenőrzöttként" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" -msgstr "" +msgstr "Konferencián" -#: ../gtk/incall_view.c:641 -#, fuzzy +#: ../gtk/incall_view.c:684 msgid "In call" -msgstr "Kapcsolatilista" +msgstr "vonalban" -#: ../gtk/incall_view.c:669 -#, fuzzy +#: ../gtk/incall_view.c:718 msgid "Paused call" -msgstr "Kapcsolatilista" - -#: ../gtk/incall_view.c:682 -#, c-format -msgid "%02i::%02i::%02i" -msgstr "" - -#: ../gtk/incall_view.c:699 -#, fuzzy -msgid "Call ended." -msgstr "Hívás vége" +msgstr "Várakoztatott hívás" #: ../gtk/incall_view.c:731 +#, c-format +msgid "%02i::%02i::%02i" +msgstr "%02i::%02i::%02i" + +#: ../gtk/incall_view.c:748 +msgid "Call ended." +msgstr "Hívás vége." + +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" -msgstr "" - -#: ../gtk/incall_view.c:734 -msgid "Transfer done." -msgstr "" - -#: ../gtk/incall_view.c:737 -#, fuzzy -msgid "Transfer failed." -msgstr "Hívás elutasítva" +msgstr "Átvitel folyamatban" #: ../gtk/incall_view.c:781 -msgid "Resume" -msgstr "" +msgid "Transfer done." +msgstr "Átvitel befejezve." -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:784 +msgid "Transfer failed." +msgstr "Az átvitel sikertelen." + +#: ../gtk/incall_view.c:828 +msgid "Resume" +msgstr "Visszatérés" + +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" +msgstr "Várakoztatás" + +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" msgstr "" +"Felvétel a következőbe\n" +"%s %s" + +#: ../gtk/incall_view.c:900 +msgid "(Paused)" +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 "" +#: ../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:8 msgid "Video" -msgstr "" +msgstr "Videó" #: ../gtk/main.ui.h:10 msgid "Mute" -msgstr "" +msgstr "Elnémítás" #: ../gtk/main.ui.h:11 msgid "Transfer" -msgstr "" +msgstr "Átvitel" #: ../gtk/main.ui.h:14 -#, fuzzy msgid "In call" -msgstr "Beérkező hívás" +msgstr "vonalban" #: ../gtk/main.ui.h:15 -#, fuzzy msgid "Duration" -msgstr "Információk" +msgstr "Időtartam" #: ../gtk/main.ui.h:16 msgid "Call quality rating" -msgstr "" +msgstr "Hívásminőség" #: ../gtk/main.ui.h:17 msgid "_Options" -msgstr "" +msgstr "_Beállítások" #: ../gtk/main.ui.h:18 msgid "Always start video" -msgstr "" +msgstr "Videó indítása mindig" #: ../gtk/main.ui.h:19 -#, fuzzy msgid "Enable self-view" -msgstr "Video engedélyezés" +msgstr "Saját nézet" #: ../gtk/main.ui.h:20 -#, fuzzy msgid "_Help" -msgstr "Help" +msgstr "_Segítség" #: ../gtk/main.ui.h:21 msgid "Show debug window" -msgstr "" +msgstr "Hibakeresési ablak mutatása" #: ../gtk/main.ui.h:22 msgid "_Homepage" -msgstr "" +msgstr "_Honlap" #: ../gtk/main.ui.h:23 msgid "Check _Updates" -msgstr "" +msgstr "Frissítések keresése" #: ../gtk/main.ui.h:24 msgid "Account assistant" -msgstr "" +msgstr "Fiók varázsló" #: ../gtk/main.ui.h:25 -#, 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:26 msgid "Initiate a new call" -msgstr "" +msgstr "Új hívás kezdeményezése" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +msgid "Contacts" +msgstr "Partnerek" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" -msgstr "" +msgstr "Hozzáadás" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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 "#" +msgid "Search" +msgstr "Keresés" #: ../gtk/main.ui.h:31 -msgid "0" -msgstr "0" +msgid "Add contacts from directory" +msgstr "Partnerek hozzáadása könyvtárból" #: ../gtk/main.ui.h:32 -msgid "*" -msgstr "*" +msgid "Add contact" +msgstr "Partner hozzáadása" -#: ../gtk/main.ui.h:33 ../gtk/parameters.ui.h:7 -msgid "C" -msgstr "" +#: ../gtk/main.ui.h:33 +msgid "Recent calls" +msgstr "Legutóbbi hívások" #: ../gtk/main.ui.h:34 -msgid "9" -msgstr "" +msgid "My current identity:" +msgstr "Jelenlegi identitásom:" -#: ../gtk/main.ui.h:35 -msgid "8" -msgstr "" +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 +msgid "Username" +msgstr "Felhasználónév" -#: ../gtk/main.ui.h:36 -msgid "7" -msgstr "" +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 +msgid "Password" +msgstr "Jelszó" #: ../gtk/main.ui.h:37 -msgid "B" -msgstr "" +msgid "Internet connection:" +msgstr "Internet kapcsolat:" #: ../gtk/main.ui.h:38 -msgid "6" -msgstr "" +msgid "Automatically log me in" +msgstr "Jelentkeztessen be automatikusan" #: ../gtk/main.ui.h:39 -msgid "5" -msgstr "5" +msgid "Login information" +msgstr "Bejelentkezési információ" #: ../gtk/main.ui.h:40 -msgid "4" -msgstr "" +msgid "Welcome !" +msgstr "Üdvözöljük !" #: ../gtk/main.ui.h:41 -msgid "A" -msgstr "" +msgid "All users" +msgstr "Minden felhasználó" #: ../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 -#, fuzzy -msgid "Add contacts from directory" -msgstr "Kapcsolatiinformáció" - -#: ../gtk/main.ui.h:47 -#, fuzzy -msgid "Add contact" -msgstr "Kapcsolatinformációk szerkesztése" - -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 -#, fuzzy -msgid "Recent calls" -msgstr "Beérkező hívás" - -#: ../gtk/main.ui.h:50 -#, fuzzy -msgid "My current identity:" -msgstr "SIP azonosító:" - -#: ../gtk/main.ui.h:51 ../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 -#, fuzzy -msgid "Password" -msgstr "jelszó:" - -#: ../gtk/main.ui.h:53 -msgid "Internet connection:" -msgstr "" - -#: ../gtk/main.ui.h:54 -#, fuzzy -msgid "Automatically log me in" -msgstr "Automatikus valós hostnév megállapítása" - -#: ../gtk/main.ui.h:55 -#, fuzzy -msgid "Login information" -msgstr "Kapcsolatiinformáció" - -#: ../gtk/main.ui.h:56 -#, fuzzy -msgid "Welcome !" -msgstr "Kapcsolatilista" - -#: ../gtk/main.ui.h:57 -msgid "All users" -msgstr "" - -#: ../gtk/main.ui.h:58 -#, fuzzy msgid "Online users" msgstr "Elérhető" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" -msgstr "" +msgstr "ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" -msgstr "" +msgstr "Fiber csatorna" -#: ../gtk/main.ui.h:61 -#, fuzzy +#: ../gtk/main.ui.h:45 msgid "Default" -msgstr "SIP azonosító:" +msgstr "Alapértelmezett" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 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 "" @@ -952,414 +935,401 @@ 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 "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 "Tunnel" -msgstr "" +msgid "Video RTP/UDP:" +msgstr "Videó RTP/UDP:" #: ../gtk/parameters.ui.h:18 -msgid "Video RTP/UDP:" -msgstr "" +msgid "Audio RTP/UDP:" +msgstr "Audió RTP/UDP:" #: ../gtk/parameters.ui.h:19 -msgid "Audio RTP/UDP:" -msgstr "" +msgid "DSCP fields" +msgstr "DSCP mezők" #: ../gtk/parameters.ui.h:20 -msgid "DSCP fields" -msgstr "" +msgid "Fixed" +msgstr "Javítva" #: ../gtk/parameters.ui.h:21 -msgid "Fixed" -msgstr "" +msgid "Tunnel" +msgstr "Alagút" #: ../gtk/parameters.ui.h:22 -msgid "Network protocol and ports" -msgstr "" +msgid "Media encryption is mandatory" +msgstr "Média titkosítás kötelező" #: ../gtk/parameters.ui.h:23 -msgid "Direct connection to the Internet" -msgstr "" +msgid "Network protocol and ports" +msgstr "Hálózati protokoll és port" #: ../gtk/parameters.ui.h:24 -msgid "Behind NAT / Firewall (specify gateway IP below)" -msgstr "" +msgid "Direct connection to the Internet" +msgstr "Közvetlen Internet kapcsolat" #: ../gtk/parameters.ui.h:25 -#, fuzzy -msgid "Public IP address:" -msgstr "Sip cím:" +msgid "Behind NAT / Firewall (specify gateway IP below)" +msgstr "NAT / tűzfal mögött (adja meg az átjáró IP címét)" #: ../gtk/parameters.ui.h:26 -msgid "Behind NAT / Firewall (use STUN to resolve)" -msgstr "" +msgid "Public IP address:" +msgstr "Publikus IP cím:" #: ../gtk/parameters.ui.h:27 -msgid "Behind NAT / Firewall (use ICE)" -msgstr "" +msgid "Behind NAT / Firewall (use STUN to resolve)" +msgstr "NAT / tűzfal mögött (STUN használata a feloldáshoz)" #: ../gtk/parameters.ui.h:28 -#, fuzzy -msgid "Stun server:" -msgstr "Hang eszköz" +msgid "Behind NAT / Firewall (use ICE)" +msgstr "NAT / tűzfal mögött (ICE használata)" #: ../gtk/parameters.ui.h:29 -#, fuzzy -msgid "NAT and Firewall" -msgstr "Kapcsolatilista" +msgid "Behind NAT / Firewall (use uPnP)" +msgstr "NAT / tűzfal mögött (uPnP használata)" #: ../gtk/parameters.ui.h:30 -#, fuzzy -msgid "Network settings" -msgstr "Hálózat" +msgid "Stun server:" +msgstr "STUN kiszolgáló:" #: ../gtk/parameters.ui.h:31 -#, fuzzy +msgid "NAT and Firewall" +msgstr "NAT és tűzfal" + +#: ../gtk/parameters.ui.h:32 +msgid "Network settings" +msgstr "Hálózati beállítások" + +#: ../gtk/parameters.ui.h:33 msgid "Ring sound:" msgstr "Csengőhang:" -#: ../gtk/parameters.ui.h:32 +#: ../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:33 -#, fuzzy +#: ../gtk/parameters.ui.h:35 msgid "Capture device:" msgstr "Felvevő hang eszköz:" -#: ../gtk/parameters.ui.h:34 -#, fuzzy +#: ../gtk/parameters.ui.h:36 msgid "Ring device:" -msgstr "Csengőhang forrás:" +msgstr "Csengőhang eszköz:" -#: ../gtk/parameters.ui.h:35 -#, fuzzy +#: ../gtk/parameters.ui.h:37 msgid "Playback device:" msgstr "Lejátszó hang eszköz:" -#: ../gtk/parameters.ui.h:36 -msgid "Enable echo cancellation" -msgstr "" - -#: ../gtk/parameters.ui.h:37 -#, fuzzy -msgid "Audio" -msgstr "Kapcsolatilista" - #: ../gtk/parameters.ui.h:38 -#, fuzzy -msgid "Video input device:" -msgstr "Hang eszköz" +msgid "Enable echo cancellation" +msgstr "Visszhang-elnyomás engedélyezése" #: ../gtk/parameters.ui.h:39 -msgid "Prefered video resolution:" -msgstr "" +msgid "Audio" +msgstr "Audió" #: ../gtk/parameters.ui.h:40 -#, fuzzy -msgid "Video" -msgstr "Kapcsolatilista" +msgid "Video input device:" +msgstr "Videó bemeneti eszköz:" #: ../gtk/parameters.ui.h:41 -msgid "Multimedia settings" -msgstr "" +msgid "Prefered video resolution:" +msgstr "Kívánt videó felbontás:" #: ../gtk/parameters.ui.h:42 -msgid "This section defines your SIP address when not using a SIP account" -msgstr "" +msgid "Video" +msgstr "Videó" #: ../gtk/parameters.ui.h:43 -msgid "Your display name (eg: John Doe):" -msgstr "" +msgid "Multimedia settings" +msgstr "Multimédia beállítások" #: ../gtk/parameters.ui.h:44 -#, fuzzy -msgid "Your username:" -msgstr "felhasználónév:" +msgid "This section defines your SIP address when not using a SIP account" +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 -#, fuzzy -msgid "Your resulting SIP address:" -msgstr "Saját sip cím:" +msgid "Your display name (eg: John Doe):" +msgstr "Az Ön megjelenített neve (pl. Kis József):" #: ../gtk/parameters.ui.h:46 -#, fuzzy -msgid "Default identity" -msgstr "SIP azonosító:" +msgid "Your username:" +msgstr "Az Ön felhasználóneve:" #: ../gtk/parameters.ui.h:47 -msgid "Wizard" -msgstr "" +msgid "Your resulting SIP address:" +msgstr "Az Ön így keletkezett SIP címe:" -#: ../gtk/parameters.ui.h:50 +#: ../gtk/parameters.ui.h:48 +msgid "Default identity" +msgstr "Alapértelmezett identitás" + +#: ../gtk/parameters.ui.h:49 +msgid "Wizard" +msgstr "Varázsló" + +#: ../gtk/parameters.ui.h:52 msgid "Remove" msgstr "Eltávolítás" -#: ../gtk/parameters.ui.h:51 -#, fuzzy -msgid "Proxy accounts" -msgstr "Kapcsolatilista" - -#: ../gtk/parameters.ui.h:52 -msgid "Erase all passwords" -msgstr "" - #: ../gtk/parameters.ui.h:53 -#, fuzzy -msgid "Privacy" -msgstr "Kapcsolatilista" +msgid "Proxy accounts" +msgstr "Proxy fiókok" #: ../gtk/parameters.ui.h:54 -msgid "Manage SIP Accounts" -msgstr "" +msgid "Erase all passwords" +msgstr "Minden kulcsszó törlése" -#: ../gtk/parameters.ui.h:55 ../gtk/tunnel_config.ui.h:4 +#: ../gtk/parameters.ui.h:55 +msgid "Privacy" +msgstr "Titoktartás" + +#: ../gtk/parameters.ui.h:56 +msgid "Manage SIP Accounts" +msgstr "SIP fiókok beállítása" + +#: ../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 -#, fuzzy -msgid "Codecs" -msgstr "Kapcsolatilista" - -#: ../gtk/parameters.ui.h:58 -msgid "0 stands for \"unlimited\"" -msgstr "" - #: ../gtk/parameters.ui.h:59 -#, fuzzy -msgid "Upload speed limit in Kbit/sec:" -msgstr "Feltöltési sávszélesség (kbit/sec):" +msgid "Codecs" +msgstr "Kódekek" #: ../gtk/parameters.ui.h:60 -#, fuzzy -msgid "Download speed limit in Kbit/sec:" -msgstr "Letöltési sávszélesség (kbit/sec):" +msgid "0 stands for \"unlimited\"" +msgstr "A 0 jelentése \"végtelen\"" #: ../gtk/parameters.ui.h:61 -msgid "Enable adaptive rate control" -msgstr "" +msgid "Upload speed limit in Kbit/sec:" +msgstr "Feltöltési sebesség korlát (kbit/mp):" #: ../gtk/parameters.ui.h:62 +msgid "Download speed limit in Kbit/sec:" +msgstr "Letöltési sebesség korlát (kbit/mp):" + +#: ../gtk/parameters.ui.h:63 +msgid "Enable adaptive rate control" +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 "" - -#: ../gtk/parameters.ui.h:63 -msgid "Bandwidth control" -msgstr "" - -#: ../gtk/parameters.ui.h:64 -#, fuzzy -msgid "Codecs" -msgstr "Kodekek" +"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 -#, fuzzy -msgid "Language" -msgstr "Kapcsolatilista" +msgid "Bandwidth control" +msgstr "Sávszélesség szabályozása" #: ../gtk/parameters.ui.h:66 -msgid "Show advanced settings" -msgstr "" +msgid "Codecs" +msgstr "Kódekek" #: ../gtk/parameters.ui.h:67 -#, fuzzy -msgid "Level" -msgstr "Kapcsolatilista" +msgid "Language" +msgstr "Nyelv" #: ../gtk/parameters.ui.h:68 -#, fuzzy -msgid "User interface" -msgstr "felhasználónév:" +msgid "Show advanced settings" +msgstr "Haladó beállítások megjelenítése" #: ../gtk/parameters.ui.h:69 -#, fuzzy +msgid "Level" +msgstr "Szint" + +#: ../gtk/parameters.ui.h:70 +msgid "User interface" +msgstr "Felhasználói környezet" + +#: ../gtk/parameters.ui.h:71 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" @@ -1367,12 +1337,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" @@ -1380,81 +1349,145 @@ 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 "Media connectivity" -msgstr "" +msgid "Audio Media connectivity" +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 -#, fuzzy +msgid "Video Media connectivity" +msgstr "Videó média kapcsolat" + +#: ../gtk/call_statistics.ui.h:8 +msgid "Round trip time" +msgstr "Körbeérés ideje" + +#: ../gtk/call_statistics.ui.h:9 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ő)" -#: ../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:228 msgid "aborted" msgstr "megszakítva" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "befejezve" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "elhibázva" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1469,77 +1502,72 @@ msgstr "" "Állapot: %s\n" "Időtartam: %i perc %i másodperc\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Kimenő hívás" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Kész" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Telefonszám-cél keresése..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Nem sikkerült értelmezni a számot." -#: ../coreapi/linphonecore.c:2121 +#: ../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:2312 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Kapcsolódás" -#: ../coreapi/linphonecore.c:2319 -#, fuzzy +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" -msgstr "nem sikerült hívni" +msgstr "Nem sikerült hívni" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2570 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:2573 -#, fuzzy +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" -msgstr "kapcsolatba lép veled." +msgstr "kapcsolatba lépett veled." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." -msgstr "" +msgstr "és automatikus választ kért." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." -msgstr "" +msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." -msgstr "" +msgstr "A hívási jellemzők módosítása..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Kapcsolódva." -#: ../coreapi/linphonecore.c:2931 -#, fuzzy +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" -msgstr "megszakítva" +msgstr "Hívás megszakítva" -#: ../coreapi/linphonecore.c:3102 -#, fuzzy +#: ../coreapi/linphonecore.c:3378 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:3107 -#, fuzzy +#: ../coreapi/linphonecore.c:3383 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 "" @@ -1571,7 +1599,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" @@ -1582,21 +1610,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" @@ -1605,170 +1630,168 @@ 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:1053 -#, fuzzy, c-format +#: ../coreapi/proxy.c:1069 +#, 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:276 -#, fuzzy +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." -msgstr "Távoli szolgáltatások" +msgstr "Távoli csengés." -#: ../coreapi/callbacks.c:296 -#, fuzzy +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." -msgstr "Távoli szolgáltatások" +msgstr "Távoli csengés..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Korai médiák." -#: ../coreapi/callbacks.c:352 -#, fuzzy, c-format -msgid "Call with %s is paused." -msgstr "Chat-elés %s -el" - -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:368 #, c-format -msgid "Call answered by %s - on hold." -msgstr "" - -#: ../coreapi/callbacks.c:376 -#, fuzzy -msgid "Call resumed." -msgstr "Hívás vége" +msgid "Call with %s is paused." +msgstr "A hívás a következővel: %s várakoztatva" #: ../coreapi/callbacks.c:381 -#, fuzzy, c-format +#, c-format +msgid "Call answered by %s - on hold." +msgstr "%s fogadta a hívást - várakoztatva." + +#: ../coreapi/callbacks.c:392 +msgid "Call resumed." +msgstr "Hívás visszatért" + +#: ../coreapi/callbacks.c:397 +#, 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:396 -msgid "Incompatible, check codecs..." +#: ../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:437 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." -msgstr "" +msgstr "Visszatértünk." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." -msgstr "" +msgstr "Megállítva a másik fél által." -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." -msgstr "" +msgstr "A hívás távolról frissítve." -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "A hívás befejezve." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "A felhasználó foglalt." -#: ../coreapi/callbacks.c:529 +#: ../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:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "A felhasználó nem akarja, hogy zavarják." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Hívás elutasítva" -#: ../coreapi/callbacks.c:544 -#, fuzzy +#: ../coreapi/callbacks.c:571 msgid "No response." -msgstr "időtúllépés után nincs válasz" +msgstr "Nincs válasz." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." -msgstr "" +msgstr "Protokol hiba." -#: ../coreapi/callbacks.c:564 -#, fuzzy +#: ../coreapi/callbacks.c:591 msgid "Redirected" -msgstr "Átirányítva idw %s..." +msgstr "Átirányítva" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." -msgstr "" +msgstr "Nem kompatibilis médiajellemzők." -#: ../coreapi/callbacks.c:606 -#, fuzzy +#: ../coreapi/callbacks.c:633 msgid "Call failed." -msgstr "Hívás elutasítva" +msgstr "Nem sikerült a hívás." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "A regisztáció a %s -n sikerült." -#: ../coreapi/callbacks.c:702 -#, fuzzy, c-format +#: ../coreapi/callbacks.c:738 +#, 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:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "időtúllépés után nincs válasz" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, c-format 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:2124 -#, fuzzy, c-format +#: ../coreapi/linphonecall.c:2355 +#, 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 "label" +#~ msgstr "címke" #~ msgid "Chat with %s" #~ msgstr "Chat-elés %s -el" @@ -1781,10 +1804,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 +1852,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 +2179,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 +2212,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..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-01-08 10:35+0100\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" @@ -15,58 +15,78 @@ 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:303 #, fuzzy msgid "Aborted" msgstr "annullato" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "mancante" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "Rifiuta" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, c-format +msgid "%s\t%s" +msgstr "" + +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:329 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 #, fuzzy msgid "Me" msgstr "" @@ -78,42 +98,46 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "" -#: ../gtk/main.c:89 +#: ../gtk/chat.c:336 ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:131 +#: ../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:498 +#: ../gtk/main.c:515 #, fuzzy, c-format msgid "Call with %s" msgstr "Chat con %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -125,242 +149,237 @@ 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: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:1051 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Cronologia" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Chiamata terminata" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Chimata in entrata" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../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:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Rifiuta" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "annullato" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "Porte" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../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:1833 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Presenza" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../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:538 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Chiamata %s" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Cerca contatti nella directory %s" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "Contatto SIP non valido" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "Chiamata %s" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "Invia testo a %s" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Modifica contatto %s" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Elimina contatto %s" -#: ../gtk/friendlist.c:820 +#: ../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" -#: ../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: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:912 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -404,7 +423,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 +431,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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." msgstr "Linguaggio" -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "Chimata in entrata" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "In chiamata con" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "Termina chiamata" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Chiamata terminata." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Chiamata rifiutata" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -702,9 +763,9 @@ msgstr "Invia" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "etichetta" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" +msgstr "" #: ../gtk/main.ui.h:8 msgid "Video" @@ -772,156 +833,93 @@ msgstr "Indirizzo sip o numero." msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +#, fuzzy +msgid "Contacts" +msgstr "In connessione" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Aggiungi" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 #, fuzzy msgid "Add contacts from directory" msgstr "Aggiungi nuovo contatto dalla directory %s" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 #, 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:33 #, fuzzy msgid "Recent calls" msgstr "In chiamata" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Identità corrente" -#: ../gtk/main.ui.h:51 ../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:52 ../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:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Connessione Internet:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Login Automatico" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Credenziali di accesso" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Benvenuto !" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "" "Tutti gli utenti\n" "Utenti Online" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 #, fuzzy msgid "Fiber Channel" msgstr "" "ADSL\n" "Fibra Ottica" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Default" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1078,6 +1076,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 +1120,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 +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 @@ -1401,6 +1412,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 +1445,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:228 msgid "aborted" msgstr "annullato" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "comletato" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "mancante" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1453,23 +1532,23 @@ msgstr "" "Stato: %s\n" "Durata: %i mn %i sec\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Chiamata in uscita" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Pronto" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Ricerca numero destinazione..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Impossibile risolvere il numero." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1477,51 +1556,51 @@ msgstr "" "Errore nel formato del contatto sip. Usualmente un indirizzo appare sip:" "user@domain" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "In connessione" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "chiamata fallita" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "ti sta conttatando." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Connessione" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "annullato" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 #, fuzzy msgid "Could not pause the call" msgstr "chiamata fallita" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 #, fuzzy msgid "Pausing the current call..." msgstr "Mostra chiamata corrente" @@ -1622,118 +1701,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:1069 #, c-format msgid "Could not login as %s" msgstr "impossibile login come %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Chat con %s" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "Chiamata terminata" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Chiamata terminata." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Utente occupato" -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Utente non disponibile" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "L'utente non vuole essere disturbato" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Chiamata rifiutata" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 #, fuzzy msgid "No response." msgstr "timeout no risposta" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 #, fuzzy msgid "Redirected" msgstr "Rediretto verso %s..." -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "Chiamata rifiutata" -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registrazione su %s attiva" -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Unregistrazione su %s" -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "timeout no risposta" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrazione su %s fallita: %s" @@ -1743,13 +1822,16 @@ msgstr "Registrazione su %s fallita: %s" msgid "Authentication token is %s" msgstr "Linphone - Autenticazione richiesta" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2355 #, 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" @@ -1786,10 +1868,6 @@ msgstr[1] "" #~ msgid "Now ready !" #~ msgstr "Pronto !" -#, fuzzy -#~ msgid "Contacts" -#~ msgstr "In connessione" - #, fuzzy #~ msgid "Enable video" #~ msgstr "Attivato" @@ -1839,9 +1917,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..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-01-08 10:35+0100\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" @@ -17,57 +17,77 @@ 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:303 #, fuzzy msgid "Aborted" msgstr "通話はキャンセルされました。" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 msgid "Missed" msgstr "" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "ライン入力" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, c-format +msgid "%s\t%s" +msgstr "" + +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:329 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "" @@ -76,42 +96,46 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "pixmapファイルが見つかりません %s" -#: ../gtk/main.c:89 +#: ../gtk/chat.c:336 ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:131 +#: ../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:498 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "" -#: ../gtk/main.c:871 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -120,247 +144,242 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:948 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "通話はキャンセルされました。" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 #, fuzzy msgid "Call ended" msgstr "通話は拒否されました。" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../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:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 #, fuzzy msgid "Decline" msgstr "ライン入力" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "通話はキャンセルされました。" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "接続中" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../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:1833 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 #, fuzzy msgid "Add to addressbook" msgstr "電話帳" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 #, fuzzy msgid "Presence status" msgstr "状態" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名前" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "通話はキャンセルされました。" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "(接続するための情報がありません!)" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:820 +#: ../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 "" -#: ../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: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:912 +#: ../gtk/propertybox.c:934 #, fuzzy msgid "None" msgstr "ありません。" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -404,281 +423,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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." msgstr "接続中" -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "接続中" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "接続中" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "接続中" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 #, fuzzy msgid "Call ended." msgstr "通話は拒否されました。" -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "通話はキャンセルされました。" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -698,8 +759,8 @@ msgstr "サウンド" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" msgstr "" #: ../gtk/main.ui.h:8 @@ -770,157 +831,94 @@ msgstr "レジストラサーバーのSIPアドレス" msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +#, fuzzy +msgid "Contacts" +msgstr "接続中" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "追加する" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 #, fuzzy msgid "Add contacts from directory" msgstr "コーデックの情報" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" msgstr "(接続するための情報がありません!)" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "接続中" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "My current identity:" msgstr "個人情報" -#: ../gtk/main.ui.h:51 ../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:52 ../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:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Login information" msgstr "コーデックの情報" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Welcome !" msgstr "接続中" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "ライン入力" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" msgstr "個人情報" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1077,6 +1075,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 +1117,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 +1415,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 +1423,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 +1456,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:228 msgid "aborted" msgstr "" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1459,24 +1538,24 @@ msgid "" "Duration: %i mn %i sec\n" msgstr "" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 #, fuzzy msgid "Ready" msgstr "準備完了。" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "" -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2252 #, fuzzy msgid "" "Could not parse given sip address. A sip url usually looks like sip:" @@ -1485,51 +1564,51 @@ msgstr "" "SIPアドレスの形式エラーです。SIPアドレスは、のような" "形式です。" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2453 #, fuzzy msgid "Contacting" msgstr "接続中" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "pixmapファイルが見つかりません %s" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "から電話です。" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "接続しました。" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "通話はキャンセルされました。" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "" @@ -1629,121 +1708,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1069 #, fuzzy, c-format msgid "Could not login as %s" msgstr "pixmapファイルが見つかりません %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 #, fuzzy msgid "Remote ringing." msgstr "登録中……" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "登録中……" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "通話は拒否されました。" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "電話をかける\n" "電話に出る" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 #, fuzzy msgid "Call terminated." msgstr "通話は拒否されました。" -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "ユーザーはビジーです" -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "ユーザーは、今出られません。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "ユーザーは手が離せないようです。" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "通話は拒否されました。" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "通話はキャンセルされました。" -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, fuzzy, c-format msgid "Registration on %s successful." msgstr "登録しました。" -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "登録しました。" -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "登録しました。" @@ -1753,7 +1832,7 @@ msgstr "登録しました。" msgid "Authentication token is %s" msgstr "コーデックの情報" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1764,10 +1843,6 @@ msgstr[1] "" #~ msgid "Confirmation" #~ msgstr "情報" -#, fuzzy -#~ msgid "Contacts" -#~ msgstr "接続中" - #, fuzzy #~ msgid "Enable video" #~ msgstr "使用する" @@ -1808,10 +1883,6 @@ msgstr[1] "" #~ msgid "gtk-close" #~ msgstr "接続しました。" -#, fuzzy -#~ msgid "Ports" -#~ msgstr "接続中" - #, fuzzy #~ msgid "_Modes" #~ msgstr "コーデック" @@ -1941,9 +2012,6 @@ msgstr[1] "" #~ msgid "Recording source:" #~ msgstr "録音する音源" -#~ msgid "Sound properties" -#~ msgstr "サウンドのプロパティー" - #~ msgid "Run sip user agent on port:" #~ msgstr "SIPユーザーエージェントが起動するポート" @@ -1975,10 +2043,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..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-01-08 10:35+0100\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" @@ -17,58 +17,78 @@ 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:303 #, fuzzy msgid "Aborted" msgstr "avbrutt" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "ubesvart" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "Avvis" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, c-format +msgid "%s\t%s" +msgstr "" + +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:329 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 #, fuzzy msgid "Me" msgstr "Skru mikrofonen av" @@ -78,31 +98,35 @@ msgstr "Skru mikrofonen av" msgid "Couldn't find pixmap file: %s" msgstr "Fant ikke pixmap fli: %s" -#: ../gtk/main.c:89 +#: ../gtk/chat.c:336 ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../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:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "address som skal ringes nå" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "besvarer innkommende samtaler automatisk om valgt" -#: ../gtk/main.c:131 +#: ../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:498 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Ring med %s" -#: ../gtk/main.c:871 +#: ../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:948 +#: ../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:1051 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Samtalehistorikk" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Samtale avsluttet" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Innkommende samtale" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../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:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Avvis" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "Samtale avbrutt" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "Porter" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Peker til nettsted" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - en video Internet telefon" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Standard)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../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:1724 +#: ../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,175 +223,170 @@ 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:1911 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Tilstedestatus" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../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:538 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Ring %s" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Søk i %s katalogen" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "Ugyldig SIP kontakt !" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "Ring %s" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "Send tekst til %s" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Rediger kontakt '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Slett kontakt '%s'" -#: ../gtk/friendlist.c:820 +#: ../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" -#: ../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: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:912 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -411,7 +430,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 +438,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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Ringer..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00:00:00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Innkommende samtale" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "I samtale med" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Pauset samtale" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i:%02i:%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Samtale avsluttet." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 #, fuzzy msgid "Transfer done." msgstr "Overfører" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Overfører" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Fortsett" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Pause" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +#, fuzzy +msgid "(Paused)" +msgstr "Pause" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -707,9 +769,9 @@ msgstr "Send" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "etikett" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" +msgstr "" #: ../gtk/main.ui.h:8 msgid "Video" @@ -776,148 +838,84 @@ msgstr "Sip adresse eller telefonnummer:" msgid "Initiate a new call" msgstr "Start en ny samtale" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +msgid "Contacts" +msgstr "Kontakter" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Legg til" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 msgid "Add contacts from directory" msgstr "Legg til kontakter fra katalogen" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 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:33 #, fuzzy msgid "Recent calls" msgstr "I samtale" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 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:35 ../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:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Passord" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Internet forbindelse:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Logg meg på automatisk" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Innlogginsinformasjon" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Velkommen!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "Alle brukere" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "Tilkoblede brukere" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "Fiber Kanal" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "Standard" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1077,6 +1075,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 +1119,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 +1397,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 +1405,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 +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:228 msgid "aborted" msgstr "avbrutt" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "Fullført" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "ubesvart" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1446,23 +1525,23 @@ msgstr "" "Status: %s\n" "Lengde: %i min %i sek\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Utgående samtale" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Klar" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Ser etter telefonnummer for destinasjonen..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Kan ikke tilkoble dette nummeret." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1470,47 +1549,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:2453 msgid "Contacting" msgstr "Tilknytter" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "Kunne ikke ringe" -#: ../coreapi/linphonecore.c:2429 +#: ../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:2573 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "Kontakter deg." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr " og ba om autosvar." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "Endrer ringeparametre..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Tilkoblet" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "Samtale avbrutt" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "Kunne ikke pause samtalen" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Pauser nåværende samtale" @@ -1612,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:1053 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Ikke ikke logge inn som %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Tidlig media" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "Samtalen med %s er pauset." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "Samtale besvart av %s - på vent." -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Samtale gjenopptatt." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "Samtale besvart av %s." -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "Vi har blitt gjenopptatt..." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Samtale avsluttet." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Brukeren er opptatt." -#: ../coreapi/callbacks.c:529 +#: ../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:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Brukeren vil ikke bli forstyrret." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Samtale avvist." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Ikke noe svar." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Protokollfeil." -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Omdirigert" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "Samtale feilet." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registrering hos %s lykkes." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Avregistrering hos %s lykkes." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "ingen svar innen angitt tid" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrering hos %s mislykkes: %s" @@ -1731,13 +1810,19 @@ msgstr "Registrering hos %s mislykkes: %s" msgid "Authentication token is %s" msgstr "Autorisering kreves" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2355 #, 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" + #~ msgid "Chat with %s" #~ msgstr "Chat med %s" @@ -1774,9 +1859,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 +1932,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..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-01-08 10:35+0100\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" @@ -19,58 +19,78 @@ 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:303 #, fuzzy msgid "Aborted" msgstr "afgebroken" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "gemist" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "lijn" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, c-format +msgid "%s\t%s" +msgstr "" + +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:329 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "" @@ -79,42 +99,46 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Kon pixmap bestand %s niet vinden" -#: ../gtk/main.c:89 +#: ../gtk/chat.c:336 ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:131 +#: ../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:498 +#: ../gtk/main.c:515 #, fuzzy, c-format msgid "Call with %s" msgstr "Chat met %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -123,245 +147,240 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:948 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Linphone - Oproepgeschiedenis" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Oproep beeindigd" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Inkomende oproep" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../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:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 #, fuzzy msgid "Decline" msgstr "lijn" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "afgebroken" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "Contactlijst" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../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:1833 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "Een Vrije SIP video-telefoon" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 #, fuzzy msgid "Add to addressbook" msgstr "Adresboek" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Aanwezigheidsstatus" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../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:538 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Oproepgeschiedenis" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 #, fuzzy msgid "Chat" msgstr "Chat box" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "" - -#: ../gtk/friendlist.c:775 -#, fuzzy, c-format -msgid "Call %s" -msgstr "Oproepgeschiedenis" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "Bewerk contactgegevens" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:820 +#: ../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 "" -#: ../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: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:912 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Geen" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -405,282 +424,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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." msgstr "Contactlijst" -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "Inkomende oproep" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "Contactlijst" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "Contactlijst" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 #, fuzzy msgid "Call ended." msgstr "Oproep beeindigd" -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Oproep geannuleerd." -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -700,8 +762,8 @@ msgstr "Geluid" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" msgstr "" #: ../gtk/main.ui.h:8 @@ -773,159 +835,96 @@ msgstr "Geef het SIP adres of telefoonnummer in" msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +#, fuzzy +msgid "Contacts" +msgstr "Verbinden" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 #, fuzzy msgid "Add" msgstr "Adres" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 #, fuzzy msgid "Add contacts from directory" msgstr "Contact informatie" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" msgstr "Bewerk contactgegevens" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "Inkomende oproep" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "My current identity:" msgstr "SIP-identiteit:" -#: ../gtk/main.ui.h:51 ../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:52 ../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:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 #, fuzzy msgid "Automatically log me in" msgstr "Automatisch een geldige hostnaam raden" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Login information" msgstr "Contact informatie" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Welcome !" msgstr "Contactlijst" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "Aanwezig" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" msgstr "SIP-identiteit:" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1084,6 +1083,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 +1125,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 +1426,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 +1434,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 +1467,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:228 msgid "aborted" msgstr "afgebroken" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "voltooid" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "gemist" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1474,23 +1554,23 @@ msgstr "" "Status: %s\n" "Tijdsduur: %i mins %i secs\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Uitgaande oproep" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Gereed." -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Zoekt de lokatie van het telefoonnummer..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Kon dit nummer niet vinden." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1498,51 +1578,51 @@ msgstr "" "Slecht geformuleerd SIP-adres. Een SIP-adres ziet er uit als sip:" "gebruikersnaam@domeinnaam" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Verbinden" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "Kon niet oproepen" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "belt u." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Verbonden." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "afgebroken" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 #, fuzzy msgid "Could not pause the call" msgstr "Kon niet oproepen" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 #, fuzzy msgid "Pausing the current call..." msgstr "Kon niet oproepen" @@ -1644,121 +1724,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1069 #, fuzzy, c-format msgid "Could not login as %s" msgstr "Kon pixmap bestand %s niet vinden" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 #, fuzzy msgid "Remote ringing." msgstr "Externe diensten" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "Externe diensten" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Chat met %s" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "Oproep beeindigd" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "Oproepen of\n" "beantwoorden" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Oproep beeindigd." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Gebruiker is bezet." -#: ../coreapi/callbacks.c:529 +#: ../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:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "De gebruiker wenst niet gestoord te worden." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Oproep geweigerd." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 #, fuzzy msgid "Redirected" msgstr "Doorgeschakeld naar %s..." -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "Oproep geannuleerd." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registratie op %s gelukt." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "Registratie op %s gelukt." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "Registratie op %s mislukt (time-out)." @@ -1768,7 +1848,7 @@ msgstr "Registratie op %s mislukt (time-out)." msgid "Authentication token is %s" msgstr "Authorisatie gegevens" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2355 #, fuzzy, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1786,10 +1866,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 +1914,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 +2244,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 +2277,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..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-01-08 10:35+0100\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" @@ -15,57 +15,77 @@ 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:303 #, fuzzy msgid "Aborted" msgstr "Połączenie odwołane." -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 msgid "Missed" msgstr "" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "linia" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, c-format +msgid "%s\t%s" +msgstr "" + +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:329 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "" @@ -74,42 +94,46 @@ msgstr "" msgid "Couldn't find pixmap file: %s" msgstr "Nie można znaleźć pixmapy: %s" -#: ../gtk/main.c:89 +#: ../gtk/chat.c:336 ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:131 +#: ../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:498 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "" -#: ../gtk/main.c:871 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -118,247 +142,242 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:948 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Połączenie odwołane." -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 #, fuzzy msgid "Call ended" msgstr "Rozmowa odrzucona." -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../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:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 #, fuzzy msgid "Decline" msgstr "linia" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "Połączenie odwołane." -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "Dzwonie do " -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../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:1833 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 #, fuzzy msgid "Add to addressbook" msgstr "Książka adresowa" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 #, fuzzy msgid "Presence status" msgstr "Obecność" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../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:538 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Połączenie odwołane." -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "(Brak informacji kontaktowych !)" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:820 +#: ../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 "" -#: ../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: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:912 +#: ../gtk/propertybox.c:934 #, fuzzy msgid "None" msgstr "Brak." -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -402,281 +421,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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." msgstr "Dzwonie do " -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "Dzwonie do " -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "Dzwonie do " -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "Dzwonie do " -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 #, fuzzy msgid "Call ended." msgstr "Rozmowa odrzucona." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Połączenie odwołane." -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -696,8 +757,8 @@ msgstr "Dźwięk" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" msgstr "" #: ../gtk/main.ui.h:8 @@ -768,158 +829,95 @@ msgstr "Adres serwera rejestracji sip" msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +#, fuzzy +msgid "Contacts" +msgstr "Dzwonie do " + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 #, fuzzy msgid "Add" msgstr "Adres" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 #, fuzzy msgid "Add contacts from directory" msgstr "Informacje o kodeku" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 #, 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:33 #, fuzzy msgid "Recent calls" msgstr "Dzwonie do " -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "My current identity:" msgstr "Tożsamość" -#: ../gtk/main.ui.h:51 ../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:52 ../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:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Login information" msgstr "Informacje o kodeku" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Welcome !" msgstr "Dzwonie do " -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "linia" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" msgstr "Tożsamość" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1076,6 +1074,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 +1116,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 +1414,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 +1422,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 +1455,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:228 msgid "aborted" msgstr "" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1458,75 +1537,75 @@ msgid "" "Duration: %i mn %i sec\n" msgstr "" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 #, fuzzy msgid "Ready" msgstr "Gotowy." -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "" -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "" -#: ../coreapi/linphonecore.c:2121 +#: ../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:2312 +#: ../coreapi/linphonecore.c:2453 #, fuzzy msgid "Contacting" msgstr "Dzwonie do " -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "Nie można znaleźć pixmapy: %s" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "dzwoni do Ciebie." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Połączony" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "Połączenie odwołane." -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "" @@ -1626,121 +1705,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1069 #, fuzzy, c-format msgid "Could not login as %s" msgstr "Nie można znaleźć pixmapy: %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 #, fuzzy msgid "Remote ringing." msgstr "Rejestruje..." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "Rejestruje..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "Rozmowa odrzucona." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "Zadzwoń lub\n" "Odpowiedz" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 #, fuzzy msgid "Call terminated." msgstr "Rozmowa odrzucona." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Osoba jest zajęta." -#: ../coreapi/callbacks.c:529 +#: ../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:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Osoba nie chce, aby jej przeszkadzać." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Rozmowa odrzucona." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "Połączenie odwołane." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, fuzzy, c-format msgid "Registration on %s successful." msgstr "Rejestracja powiodła się." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "Rejestracja powiodła się." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "Rejestracja powiodła się." @@ -1750,7 +1829,7 @@ msgstr "Rejestracja powiodła się." msgid "Authentication token is %s" msgstr "Informacje o kodeku" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1761,10 +1840,6 @@ msgstr[1] "" #~ msgid "Confirmation" #~ msgstr "Informacja" -#, fuzzy -#~ msgid "Contacts" -#~ msgstr "Dzwonie do " - #, fuzzy #~ msgid "Enable video" #~ msgstr "Włączone" @@ -1801,10 +1876,6 @@ msgstr[1] "" #~ msgid "gtk-close" #~ msgstr "Połączony" -#, fuzzy -#~ msgid "Ports" -#~ msgstr "Dzwonie do " - #, fuzzy #~ msgid "_Modes" #~ msgstr "Kodeki" @@ -1944,9 +2015,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 +2047,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..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-01-08 10:35+0100\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" @@ -17,58 +17,78 @@ 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:303 #, fuzzy msgid "Aborted" msgstr "Abortado" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "Perdido" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "linha" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, c-format +msgid "%s\t%s" +msgstr "" + +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:329 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" 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:89 +#: ../gtk/chat.c:336 ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "" -#: ../gtk/main.c:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "" -#: ../gtk/main.c:131 +#: ../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:498 +#: ../gtk/main.c:515 #, fuzzy, c-format msgid "Call with %s" msgstr "Bate-papo com %s" -#: ../gtk/main.c:871 +#: ../gtk/main.c:946 #, c-format msgid "" "%s would like to add you to his contact list.\n" @@ -121,247 +145,242 @@ msgid "" "If you answer no, this person will be temporarily blacklisted." msgstr "" -#: ../gtk/main.c:948 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Linphone - Histórico de chamadas" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 #, fuzzy msgid "Call ended" msgstr "Chamada cancelada." -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Camadas recebidas" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../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:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 #, fuzzy msgid "Decline" msgstr "linha" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "Abortado" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "Contatando " -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../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:1833 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 #, fuzzy msgid "Add to addressbook" msgstr "Catálogo de endereços" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Status de presença" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../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:538 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Histórico de chamadas" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 #, fuzzy msgid "Chat" msgstr "Sala de bate-papo" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "" - -#: ../gtk/friendlist.c:775 -#, fuzzy, c-format -msgid "Call %s" -msgstr "Histórico de chamadas" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, fuzzy, c-format msgid "Edit contact '%s'" msgstr "Edicar informação de contato" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "" -#: ../gtk/friendlist.c:820 +#: ../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 "" -#: ../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: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:912 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Nenhum" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -405,282 +424,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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 #, fuzzy msgid "Calling..." msgstr "Contatando " -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "Camadas recebidas" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "Contatando " -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "Contatando " -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 #, fuzzy msgid "Call ended." msgstr "Chamada cancelada." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Histórico de chamadas" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -700,8 +761,8 @@ msgstr "Som" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" msgstr "" #: ../gtk/main.ui.h:8 @@ -771,159 +832,96 @@ msgstr "" msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +#, fuzzy +msgid "Contacts" +msgstr "Contatando " + +#: ../gtk/main.ui.h:28 ../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:29 ../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:31 #, fuzzy msgid "Add contacts from directory" msgstr "Informação de contato" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 #, 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:33 #, fuzzy msgid "Recent calls" msgstr "Camadas recebidas" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 #, fuzzy msgid "My current identity:" msgstr "Identificação SIP:" -#: ../gtk/main.ui.h:51 ../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:52 ../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:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 #, fuzzy msgid "Automatically log me in" msgstr "Adquirir automaticamente um nome de servidor válido." -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 #, fuzzy msgid "Login information" msgstr "Informação de contato" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 #, fuzzy msgid "Welcome !" msgstr "Contatando " -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "linha" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" msgstr "Identificação SIP:" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1081,6 +1079,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 +1121,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 +1419,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 +1427,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 +1460,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:228 msgid "aborted" msgstr "Abortado" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "Competado" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "Perdido" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, fuzzy, c-format msgid "" "%s at %s\n" @@ -1467,74 +1546,74 @@ msgstr "" "Status: %s\n" "Duração: %i min %i seg\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Chamadas efetuadas" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 #, fuzzy msgid "Ready" msgstr "Pronto." -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Procurando por telefone de destino..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Não foi possível encontrar este número." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" msgstr "" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2453 #, fuzzy msgid "Contacting" msgstr "Contatando " -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "Não é possível achar arquivo pixmap: %s" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "está chamado você." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Conectado." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "Abortado" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "" @@ -1624,121 +1703,121 @@ msgid "" "It should look like sip:username@proxydomain, such as sip:alice@example.net" msgstr "" -#: ../coreapi/proxy.c:1053 +#: ../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:276 +#: ../coreapi/callbacks.c:286 #, fuzzy msgid "Remote ringing." msgstr "Serviços remotos" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "Serviços remotos" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Bate-papo com %s" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "Chamada cancelada." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, fuzzy, c-format msgid "Call answered by %s." msgstr "" "Ligar ou\n" "atender" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "" -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Usuário está ocupado." -#: ../coreapi/callbacks.c:529 +#: ../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:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 #, fuzzy msgid "Redirected" msgstr "Redirecionado para %s..." -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "Histórico de chamadas" -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, fuzzy, c-format msgid "Registration on %s successful." msgstr "Registro em %s efetuado." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, fuzzy, c-format msgid "Unregistration on %s done." msgstr "Registro em %s efetuado." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, fuzzy, c-format msgid "Registration on %s failed: %s" msgstr "Registro falhou (tempo esgotado)." @@ -1748,7 +1827,7 @@ msgstr "Registro falhou (tempo esgotado)." msgid "Authentication token is %s" msgstr "Informações de autenticação" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2355 #, fuzzy, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1766,10 +1845,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 +1885,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 +2058,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 +2080,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..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-01-08 10:35+0100\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" @@ -17,22 +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:303 #, fuzzy msgid "Aborted" msgstr "отмененный" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "пропущенный" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "Отклонить" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" @@ -40,7 +59,7 @@ msgstr[0] "%i минута" msgstr[1] "%i минуты" msgstr[2] "%i минут" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" @@ -48,33 +67,36 @@ msgstr[0] "%i секунда" msgstr[1] "%i секунды" msgstr[2] "%i секунд" -#: ../gtk/calllogs.c:100 -#, 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:102 -msgid "n/a" -msgstr "н/д" - -#: ../gtk/calllogs.c:105 +#: ../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:33 ../gtk/main.ui.h:13 +#: ../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 "Конференция" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 msgid "Me" msgstr "Я" @@ -83,33 +105,37 @@ msgstr "Я" msgid "Couldn't find pixmap file: %s" msgstr "Невозможно найти графический файл: %s" -#: ../gtk/main.c:89 +#: ../gtk/chat.c:336 ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "путь к файлу для записи журнала работы." -#: ../gtk/main.c:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "Запускать только в системном лотке, не показывая главное окно" -#: ../gtk/main.c:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "адрес для звонка" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "автоматически принимать входящие вызовы, если включено" -#: ../gtk/main.c:131 +#: ../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:498 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Чат с %s" -#: ../gtk/main.c:871 +#: ../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:948 +#: ../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:1051 +#: ../gtk/main.c:1126 msgid "Call error" msgstr "Ошибка вызова" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Разговор окончен" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Входящий вызов" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../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:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Отклонить" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 msgid "Call paused" msgstr "Вызов приостановлен" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "со стороны: %s" +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "Порты" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Ссылка на сайт" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - видео-телефон для интернета" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (По умолчанию)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "Мы переведены на %s" -#: ../gtk/main.c:1724 +#: ../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,177 +230,172 @@ msgstr "" "На этом компьютере не обнаружено ни одной звуковой карты.\n" "Вы не сможете совершать или принимать аудио-вызовы." -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "Свободный SIP видео-телефон" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "Добавить в адресную книгу" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Статус присутствия" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "Имя" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:673 msgid "Call" msgstr "Вызов" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 #, fuzzy msgid "Chat" msgstr "Комната чата" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Поиск в директории %s" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "Неверный sip-контакт!" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "Набрать %s" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "Послать текст к %s" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Редактировать контакт '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Удалить контакт '%s'" -#: ../gtk/friendlist.c:820 +#: ../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'" -#: ../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: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:912 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "Нет" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "SRTP" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "ZRTP" @@ -419,7 +440,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 +448,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 +522,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 +536,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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Вызов..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "Входящий вызов" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "хорошее" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "среднее" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "плохое" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "очень плохое" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "слишком плохое" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "недоступно" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "Защищено SRTP" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "Защищено ZRTP - [токен: %s]" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "Не проверен" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "Проверен" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "В конференции" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "Соединен с" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "Приостановленный вызов" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Звонок закончен." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 #, fuzzy msgid "Transfer done." msgstr "Перевести" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Перевести" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "Продолжить" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "Пауза" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +#, fuzzy +msgid "(Paused)" +msgstr "Пауза" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -713,9 +778,9 @@ msgstr "Отправить" msgid "End conference" msgstr "В конференции" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "метка" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" +msgstr "" #: ../gtk/main.ui.h:8 msgid "Video" @@ -781,147 +846,83 @@ msgstr "SIP-адрес или номер телефона:" msgid "Initiate a new call" msgstr "Совершить новый вызов" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +msgid "Contacts" +msgstr "Контакты" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "Добавить" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 msgid "Add contacts from directory" msgstr "Добавить контакты из директории" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 msgid "Add contact" msgstr "Добавить контакт" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "Номеронабиратель" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:33 msgid "Recent calls" msgstr "Недавние вызовы" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Мой текущий идентификатор:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "Имя пользователя" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "Пароль" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Интернет-соединение:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Входить автоматически" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Информация для входа" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Добро пожаловать!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "Все пользователи" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "Пользователи в сети" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "Оптоволокно" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "По умолчанию" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1080,6 +1081,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 +1122,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 +1313,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 +1405,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 +1414,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 +1448,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:228 msgid "aborted" msgstr "отмененный" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "завершённый" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "пропущенный" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1450,23 +1535,23 @@ msgstr "" "Статус: %s\n" "Длительность: %i мин %i сек\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Исходящий звонок" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Готов" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Поиск адреса для телефонного номера..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Не могу найти этот номер." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1474,47 +1559,47 @@ msgstr "" "Не могу опознать sip адрес. SIP-URL обычно выглядит как sip:" "username@domainname" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Соединение" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "Не удалось позвонить" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "Извините, мы превысили максимальное количество одновременных вызовов" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "пытается связаться с вами" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr " и ответил автоответчик." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "Изменение параметров вызова..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Соединён." -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "Вызов отменён" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "Не удалось приостановить вызов" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "Приостановление текущего вызова..." @@ -1617,117 +1702,118 @@ msgstr "" "Они должны выглядеть как sip:username@proxydomain, например such as sip:" "alice@example.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Невозможно зайти как %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Абонент вызывается." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "Абонент вызывается..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Гудки." -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "Вызов %s приостановлен." -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "Вызов отвечен %s - в ожидании." -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "Разговор продолжен." -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "Вызов отвечен %s." -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +#, fuzzy +msgid "Incompatible, check codecs or security settings..." msgstr "Несовместимо, проверьте кодеки..." -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "Наш вызов продолжен..." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 #, fuzzy msgid "Call is updated by remote." msgstr "Вызов обновлён вызываемым абонентом..." -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Звонок прерван." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Пользователь занят." -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "Пользователь временно недоступен." #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Абонент не хочет отвечать." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Звонок отклонён." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "Нет ответа." -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "Ошибка протокола." -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "Переадресован" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 #, fuzzy msgid "Incompatible media parameters." msgstr "Несовместимо, проверьте кодеки..." -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "Не удалось совершить вызов." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Регистрация на %s прошла успешно." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Отмена регистрации на %s завершена." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "время ожидания истекло" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Регистрация на %s не удалась: %s" @@ -1737,7 +1823,7 @@ msgstr "Регистрация на %s не удалась: %s" msgid "Authentication token is %s" msgstr "Аутентификационный токен: %s" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." @@ -1745,6 +1831,15 @@ msgstr[0] "У вас пропущен %i звонок." msgstr[1] "У вас пропущено %i звонка." msgstr[2] "У вас пропущено %i звонков." +#~ msgid "label" +#~ msgstr "метка" + +#~ msgid "by %s" +#~ msgstr "со стороны: %s" + +#~ msgid "Keypad" +#~ msgstr "Номеронабиратель" + #~ msgid "Chat with %s" #~ msgstr "Чат с %s" @@ -1760,9 +1855,6 @@ msgstr[2] "У вас пропущено %i звонков." #~ msgid "in" #~ msgstr "в" -#~ msgid "Contacts" -#~ msgstr "Контакты" - #~ msgid "edit" #~ msgstr "редактировать" @@ -1851,9 +1943,6 @@ msgstr[2] "У вас пропущено %i звонков." #~ msgid "gtk-close" #~ msgstr "Закрыть" -#~ msgid "Ports" -#~ msgstr "Порты" - #~ msgid "ITU-G.711 alaw encoder" #~ msgstr "ITU-G.711 alaw кодировщик" @@ -2318,9 +2407,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..d0b470f95 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,1897 @@ +# 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-04-24 14:04+0200\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: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:303 +#, fuzzy +msgid "Aborted" +msgstr "прекинути" + +#: ../gtk/calllogs.c:306 +#, fuzzy +msgid "Missed" +msgstr "пропуштени" + +#: ../gtk/calllogs.c:309 +#, fuzzy +msgid "Declined" +msgstr "Одбиј" + +#: ../gtk/calllogs.c:315 +#, c-format +msgid "%i minute" +msgid_plural "%i minutes" +msgstr[0] "%i минут" +msgstr[1] "%i минута" +msgstr[2] "%i минута" +msgstr[3] "Један минут" + +#: ../gtk/calllogs.c:318 +#, c-format +msgid "%i second" +msgid_plural "%i seconds" +msgstr[0] "%i секунда" +msgstr[1] "%i секунде" +msgstr[2] "%i секунде" +msgstr[3] "Једна секунда" + +#: ../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:323 +#, fuzzy, c-format +msgid "" +"%s\tQuality: %s\n" +"%s\t%s\t" +msgstr "" +"%s\t%s\tКвалитет: %s\n" +"%s\t%s %s\t" + +#: ../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 "Конференција" + +#: ../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/chat.c:336 ../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:99 +msgid "path to a file to write logs into." +msgstr "путања до датотеке за уписивање бележака." + +#: ../gtk/main.c:106 +msgid "Start linphone with video disabled." +msgstr "" + +#: ../gtk/main.c:113 +msgid "Start only in the system tray, do not show the main interface." +msgstr "Покреће се само у системској фиоци, не приказује главно сучеље." + +#: ../gtk/main.c:120 +msgid "address to call right now" +msgstr "адреса за позивање управо сада" + +#: ../gtk/main.c:127 +msgid "if set automatically answer incoming calls" +msgstr "ако је подешено сам ће се јављати на долазне позиве" + +#: ../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:515 +#, c-format +msgid "Call with %s" +msgstr "Позив са корисником %s" + +#: ../gtk/main.c:946 +#, 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:1023 +#, c-format +msgid "" +"Please enter your password for username %s\n" +" at domain %s:" +msgstr "" +"Унесите вашу лозинку за корисничко име %s\n" +" на домену %s:" + +#: ../gtk/main.c:1126 +msgid "Call error" +msgstr "Грешка позива" + +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 +msgid "Call ended" +msgstr "Позив је завршен" + +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 +msgid "Incoming call" +msgstr "Долазни позив" + +#: ../gtk/main.c:1134 ../gtk/incall_view.c:497 ../gtk/main.ui.h:5 +msgid "Answer" +msgstr "Јави се" + +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 +msgid "Decline" +msgstr "Одбиј" + +#: ../gtk/main.c:1142 +msgid "Call paused" +msgstr "Позив је заустављен" + +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "Кодеци" + +#: ../gtk/main.c:1191 +#, c-format +msgid "%s proposed to start video. Do you accept ?" +msgstr "" + +#: ../gtk/main.c:1353 +msgid "Website link" +msgstr "Веза веб сајта" + +#: ../gtk/main.c:1402 +msgid "Linphone - a video internet phone" +msgstr "Линфон — интернет телефон са снимком" + +#: ../gtk/main.c:1494 +#, c-format +msgid "%s (Default)" +msgstr "%s (основно)" + +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 +#, c-format +msgid "We are transferred to %s" +msgstr "Преселили смо се на %s" + +#: ../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 "" +"Ниједна звучна картица није откривен ана овом рачунару.\n" +"Нећете бити у могућности да шаљете или да примате звучне позиве." + +#: ../gtk/main.c:1911 +msgid "A free SIP video-phone" +msgstr "Слободан СИП телефон са снимком" + +#: ../gtk/friendlist.c:469 +msgid "Add to addressbook" +msgstr "Додајте у адресар" + +#: ../gtk/friendlist.c:643 +msgid "Presence status" +msgstr "Стање присуства" + +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 +msgid "Name" +msgstr "Име" + +#: ../gtk/friendlist.c:673 +msgid "Call" +msgstr "Позови" + +#: ../gtk/friendlist.c:678 +msgid "Chat" +msgstr "" + +#: ../gtk/friendlist.c:708 +#, c-format +msgid "Search in %s directory" +msgstr "Тражи у директоријуму „%s“" + +#: ../gtk/friendlist.c:924 +#, c-format +msgid "Edit contact '%s'" +msgstr "Уредите контакт „%s“" + +#: ../gtk/friendlist.c:925 +#, c-format +msgid "Delete contact '%s'" +msgstr "Обришите контакт „%s“" + +#: ../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“" + +#: ../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: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:934 +msgid "None" +msgstr "Ништа" + +#: ../gtk/propertybox.c:938 +msgid "SRTP" +msgstr "СРТП" + +#: ../gtk/propertybox.c:944 +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:12 +msgid "Hang up" +msgstr "" + +#: ../gtk/incall_view.c:476 +msgid "Calling..." +msgstr "Позивам..." + +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 +msgid "00::00::00" +msgstr "00::00::00" + +#: ../gtk/incall_view.c:490 +msgid "Incoming call" +msgstr "Долазни позив" + +#: ../gtk/incall_view.c:527 +msgid "good" +msgstr "добро" + +#: ../gtk/incall_view.c:529 +msgid "average" +msgstr "просечно" + +#: ../gtk/incall_view.c:531 +msgid "poor" +msgstr "оскудно" + +#: ../gtk/incall_view.c:533 +msgid "very poor" +msgstr "јадно" + +#: ../gtk/incall_view.c:535 +msgid "too bad" +msgstr "много лоше" + +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 +msgid "unavailable" +msgstr "недоступно" + +#: ../gtk/incall_view.c:651 +msgid "Secured by SRTP" +msgstr "Осигурано СРТП-ом" + +#: ../gtk/incall_view.c:657 +#, c-format +msgid "Secured by ZRTP - [auth token: %s]" +msgstr "Осигурано ЗРТП-ом [потврђивање идентитета: %s]" + +#: ../gtk/incall_view.c:663 +msgid "Set unverified" +msgstr "Непроверено подешавање" + +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 +msgid "Set verified" +msgstr "Проверено подешавање" + +#: ../gtk/incall_view.c:684 +msgid "In conference" +msgstr "На конференцији" + +#: ../gtk/incall_view.c:684 +msgid "In call" +msgstr "У позиву" + +#: ../gtk/incall_view.c:718 +msgid "Paused call" +msgstr "Заустављен позив" + +#: ../gtk/incall_view.c:731 +#, c-format +msgid "%02i::%02i::%02i" +msgstr "%02i::%02i::%02i" + +#: ../gtk/incall_view.c:748 +msgid "Call ended." +msgstr "Позив је завршен." + +#: ../gtk/incall_view.c:778 +msgid "Transfer in progress" +msgstr "" + +#: ../gtk/incall_view.c:781 +#, fuzzy +msgid "Transfer done." +msgstr "Пребаци" + +#: ../gtk/incall_view.c:784 +#, fuzzy +msgid "Transfer failed." +msgstr "Пребаци" + +#: ../gtk/incall_view.c:828 +msgid "Resume" +msgstr "Настави" + +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 +msgid "Pause" +msgstr "Застани" + +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +#, 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:7 +msgid "Record this call to an audio file" +msgstr "" + +#: ../gtk/main.ui.h:8 +msgid "Video" +msgstr "" + +#: ../gtk/main.ui.h:10 +msgid "Mute" +msgstr "" + +#: ../gtk/main.ui.h:11 +msgid "Transfer" +msgstr "Пребаци" + +#: ../gtk/main.ui.h:14 +msgid "In call" +msgstr "Долазни позив" + +#: ../gtk/main.ui.h:15 +msgid "Duration" +msgstr "Трајање" + +#: ../gtk/main.ui.h:16 +msgid "Call quality rating" +msgstr "Оцена квалитета позива" + +#: ../gtk/main.ui.h:17 +msgid "_Options" +msgstr "_Могућности" + +#: ../gtk/main.ui.h:18 +msgid "Always start video" +msgstr "" + +#: ../gtk/main.ui.h:19 +msgid "Enable self-view" +msgstr "Укључи самовиђење" + +#: ../gtk/main.ui.h:20 +msgid "_Help" +msgstr "По_моћ" + +#: ../gtk/main.ui.h:21 +msgid "Show debug window" +msgstr "Прикажи прозорче прочишћавања" + +#: ../gtk/main.ui.h:22 +msgid "_Homepage" +msgstr "_Матична страница" + +#: ../gtk/main.ui.h:23 +msgid "Check _Updates" +msgstr "Провери _ажурирања" + +#: ../gtk/main.ui.h:24 +#, fuzzy +msgid "Account assistant" +msgstr "Помоћник подешавања налога" + +#: ../gtk/main.ui.h:25 +msgid "SIP address or phone number:" +msgstr "СИП адреса или број телефона:" + +#: ../gtk/main.ui.h:26 +msgid "Initiate a new call" +msgstr "Започните нови позив" + +#: ../gtk/main.ui.h:27 +msgid "Contacts" +msgstr "Пријатељи" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 +msgid "Add" +msgstr "Додај" + +#: ../gtk/main.ui.h:29 ../gtk/parameters.ui.h:51 +msgid "Edit" +msgstr "Уреди" + +#: ../gtk/main.ui.h:30 +msgid "Search" +msgstr "Тражи" + +#: ../gtk/main.ui.h:31 +msgid "Add contacts from directory" +msgstr "Додај пријатеље из директоријума" + +#: ../gtk/main.ui.h:32 +msgid "Add contact" +msgstr "Додај пријатеља" + +#: ../gtk/main.ui.h:33 +msgid "Recent calls" +msgstr "Скорашњи позиви" + +#: ../gtk/main.ui.h:34 +msgid "My current identity:" +msgstr "Мој тренутни идентитет:" + +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 +msgid "Username" +msgstr "Корисничко име" + +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 +msgid "Password" +msgstr "Лозинка" + +#: ../gtk/main.ui.h:37 +msgid "Internet connection:" +msgstr "Интернет веза:" + +#: ../gtk/main.ui.h:38 +msgid "Automatically log me in" +msgstr "Сам ме пријави" + +#: ../gtk/main.ui.h:39 +msgid "Login information" +msgstr "Подаци пријављивања" + +#: ../gtk/main.ui.h:40 +msgid "Welcome !" +msgstr "Добродошли !" + +#: ../gtk/main.ui.h:41 +msgid "All users" +msgstr "Сви корисници" + +#: ../gtk/main.ui.h:42 +msgid "Online users" +msgstr "Корисницима на мрежи" + +#: ../gtk/main.ui.h:43 +msgid "ADSL" +msgstr "АДСЛ" + +#: ../gtk/main.ui.h:44 +msgid "Fiber Channel" +msgstr "Оптички канал" + +#: ../gtk/main.ui.h:45 +msgid "Default" +msgstr "Основно" + +#: ../gtk/main.ui.h:46 +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:228 +msgid "aborted" +msgstr "прекинути" + +#: ../coreapi/linphonecore.c:231 +msgid "completed" +msgstr "завршени" + +#: ../coreapi/linphonecore.c:234 +msgid "missed" +msgstr "пропуштени" + +#: ../coreapi/linphonecore.c:239 +#, 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:240 +msgid "Outgoing call" +msgstr "Одлазни позив" + +#: ../coreapi/linphonecore.c:1321 +msgid "Ready" +msgstr "Спреман" + +#: ../coreapi/linphonecore.c:2205 +msgid "Looking for telephone number destination..." +msgstr "Тражим одредиште телефонског броја..." + +#: ../coreapi/linphonecore.c:2208 +msgid "Could not resolve this number." +msgstr "Не могу да решим овај број." + +#: ../coreapi/linphonecore.c:2252 +msgid "" +"Could not parse given sip address. A sip url usually looks like sip:" +"user@domain" +msgstr "" +"Не могу да обрадим дату сип адресу. Сип адреса обично изгледа као „sip:" +"корисник@домен“" + +#: ../coreapi/linphonecore.c:2453 +msgid "Contacting" +msgstr "Ступам у везу" + +#: ../coreapi/linphonecore.c:2460 +msgid "Could not call" +msgstr "Не могу да позовем" + +#: ../coreapi/linphonecore.c:2570 +msgid "Sorry, we have reached the maximum number of simultaneous calls" +msgstr "Извините, достигли смо највећи број истовремених позива" + +#: ../coreapi/linphonecore.c:2752 +msgid "is contacting you" +msgstr "вам се обраћа" + +#: ../coreapi/linphonecore.c:2753 +msgid " and asked autoanswer." +msgstr " и затражени само-одговор." + +#: ../coreapi/linphonecore.c:2753 +msgid "." +msgstr "." + +#: ../coreapi/linphonecore.c:2820 +msgid "Modifying call parameters..." +msgstr "Мењам параметре позива..." + +#: ../coreapi/linphonecore.c:3159 +msgid "Connected." +msgstr "Повезан сам." + +#: ../coreapi/linphonecore.c:3187 +msgid "Call aborted" +msgstr "Позив је прекинут" + +#: ../coreapi/linphonecore.c:3378 +msgid "Could not pause the call" +msgstr "Не могу да зауставим позив" + +#: ../coreapi/linphonecore.c:3383 +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:1069 +#, c-format +msgid "Could not login as %s" +msgstr "Не могу да се пријавим као %s" + +#: ../coreapi/callbacks.c:286 +msgid "Remote ringing." +msgstr "Удаљено звоњење." + +#: ../coreapi/callbacks.c:306 +msgid "Remote ringing..." +msgstr "Удаљено звоњење..." + +#: ../coreapi/callbacks.c:317 +msgid "Early media." +msgstr "Ранији медиј." + +#: ../coreapi/callbacks.c:368 +#, c-format +msgid "Call with %s is paused." +msgstr "Позив са „%s“ је заустављен." + +#: ../coreapi/callbacks.c:381 +#, c-format +msgid "Call answered by %s - on hold." +msgstr "Позив на који је одговорио „%s“ — на чекању." + +#: ../coreapi/callbacks.c:392 +msgid "Call resumed." +msgstr "Позив је настављен." + +#: ../coreapi/callbacks.c:397 +#, c-format +msgid "Call answered by %s." +msgstr "На позив је одговорио „%s“." + +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." +msgstr "" + +#: ../coreapi/callbacks.c:460 +#, fuzzy +msgid "We have been resumed." +msgstr "Позив нам је настављен..." + +#: ../coreapi/callbacks.c:469 +msgid "We are paused by other party." +msgstr "" + +#: ../coreapi/callbacks.c:475 +#, fuzzy +msgid "Call is updated by remote." +msgstr "Позив је ажуриран удаљеним..." + +#: ../coreapi/callbacks.c:544 +msgid "Call terminated." +msgstr "Позив је завршен." + +#: ../coreapi/callbacks.c:555 +msgid "User is busy." +msgstr "Корисник је заузет." + +#: ../coreapi/callbacks.c:556 +msgid "User is temporarily unavailable." +msgstr "Корисник је привремено недоступан." + +#. char *retrymsg=_("%s. Retry after %i minute(s)."); +#: ../coreapi/callbacks.c:558 +msgid "User does not want to be disturbed." +msgstr "Корисник не жели да буде узнемираван." + +#: ../coreapi/callbacks.c:559 +msgid "Call declined." +msgstr "Позив је одбијен." + +#: ../coreapi/callbacks.c:571 +msgid "No response." +msgstr "Нема одговора." + +#: ../coreapi/callbacks.c:575 +msgid "Protocol error." +msgstr "Грешка у протоколу." + +#: ../coreapi/callbacks.c:591 +msgid "Redirected" +msgstr "Преусмерен" + +#: ../coreapi/callbacks.c:627 +msgid "Incompatible media parameters." +msgstr "" + +#: ../coreapi/callbacks.c:633 +msgid "Call failed." +msgstr "Позив није успео." + +#: ../coreapi/callbacks.c:737 +#, c-format +msgid "Registration on %s successful." +msgstr "Уписивање на „%s“ је успело." + +#: ../coreapi/callbacks.c:738 +#, c-format +msgid "Unregistration on %s done." +msgstr "Исписивање са „%s“ је обављено." + +#: ../coreapi/callbacks.c:758 +msgid "no response timeout" +msgstr "нема ограничења одговора" + +#: ../coreapi/callbacks.c:761 +#, 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:2355 +#, 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 "label" +#~ msgstr "натпис" + +#~ 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..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-01-08 10:35+0100\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" @@ -16,58 +16,78 @@ 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:303 #, fuzzy msgid "Aborted" msgstr "avbrytade" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "missade" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "Avböj" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, c-format +msgid "%s\t%s" +msgstr "" + +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:329 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 #, fuzzy msgid "Me" msgstr "Mikrofon av" @@ -77,31 +97,35 @@ msgstr "Mikrofon av" msgid "Couldn't find pixmap file: %s" msgstr "Kunde inte hitta pixmap filen: %s" -#: ../gtk/main.c:89 +#: ../gtk/chat.c:336 ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../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:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "Samtalsmottagare" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "Om på, besvara automatisk alla inkommande samtal" -#: ../gtk/main.c:131 +#: ../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:498 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "Samtal med %s" -#: ../gtk/main.c:871 +#: ../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:948 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" @@ -136,235 +160,230 @@ msgstr "" "Mata in ditt lösenord för användaren %s\n" "vid domänen %s:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "Samtalshistorik" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "Samtalet slut" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "Inkommande samtal" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../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:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "Avböj" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "avbrytade" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "Portar" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "Webbsajt" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - en video Internet telefon" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (Default)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../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:1833 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "En gratis SIP video-telefon" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "Närvarostatus" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../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:538 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "Ringer %s" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "Sök i %s katalogen" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "ogiltig SIP kontakt!" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "Ringer %s" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "Skicka text till %s" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "Ändra kontakt '%s'" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "Ta bort kontakt '%s'" -#: ../gtk/friendlist.c:820 +#: ../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" -#: ../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: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:912 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -408,7 +427,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 +435,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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "Ringer..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00:00:00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "Inkommande samtal" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "I samtal med" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "Lägg på" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i:%02i:%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "Samtalet slut." -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "Samtalet avböjdes." -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -705,9 +766,9 @@ msgstr "Skicka" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "etikett" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" +msgstr "" #: ../gtk/main.ui.h:8 msgid "Video" @@ -777,156 +838,93 @@ msgstr "Användarnamn" msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +#, fuzzy +msgid "Contacts" +msgstr "Kontaktar" + +#: ../gtk/main.ui.h:28 ../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:29 ../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:31 msgid "Add contacts from directory" msgstr "Lägg till kontakt ifrån katalogen" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 #, 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:33 #, fuzzy msgid "Recent calls" msgstr "I samtal" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "Min nuvarande identitet" -#: ../gtk/main.ui.h:51 ../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:52 ../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:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "Internet förbindelse:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "Logga mig automatiskt" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "Login information" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "Välkommen!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "" "Alla användare\n" "Online användare" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 #, fuzzy msgid "Fiber Channel" msgstr "" "ADSL\n" "Fiber" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 #, fuzzy msgid "Default" msgstr "%s (Default)" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1082,6 +1080,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 +1121,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 +1402,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 +1410,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 +1443,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:228 msgid "aborted" msgstr "avbrytade" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "avslutade" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "missade" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1451,23 +1530,23 @@ msgstr "" "Status: %s\n" "Längd: %i min %i sek\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "Utgående samtal" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "Redo" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "Leta efter telefonnummer för destinationen..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "Kan inte nå dett nummer." -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1475,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:2312 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "Kontaktar" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "Kunde inte ringa" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2752 #, fuzzy msgid "is contacting you" msgstr "kontaktar dig." -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "" -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "Kopplad" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "avbrytade" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 #, fuzzy msgid "Could not pause the call" msgstr "Kunde inte ringa" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 #, fuzzy msgid "Pausing the current call..." msgstr "Nuvarande samtal" @@ -1620,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:1053 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "Kunde inte logga in som %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "Ringer hos motparten." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "Tidig media" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "Samtal med %s" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "Samtalet slut" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "Samtalet slut." -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "Användare upptagen." -#: ../coreapi/callbacks.c:529 +#: ../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:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "Användaren vill inte bli störd." -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "Samtalet avböjdes." -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 #, fuzzy msgid "No response." msgstr "Inget svar inom angiven tid" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 #, fuzzy msgid "Redirected" msgstr "Omdirigerat till %s..." -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 #, fuzzy msgid "Call failed." msgstr "Samtalet avböjdes." -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "Registrering hos %s lyckades." -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "Avregistrering hos %s lyckades." -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "Inget svar inom angiven tid" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "Registrering hos %s mislyckades: %s" @@ -1742,13 +1821,16 @@ msgstr "Registrering hos %s mislyckades: %s" msgid "Authentication token is %s" msgstr "Linphone - Autentisering krävs" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2355 #, 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" @@ -1785,10 +1867,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 +1925,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..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-01-08 10:35+0100\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" @@ -18,56 +18,76 @@ 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:303 #, fuzzy msgid "Aborted" msgstr "中断" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "丢失" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "拒绝" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, c-format +msgid "%s\t%s" +msgstr "" + +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:329 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 #, fuzzy msgid "Me" msgstr "静音" @@ -77,42 +97,46 @@ msgstr "静音" msgid "Couldn't find pixmap file: %s" msgstr "无法打开位图文件:%s" -#: ../gtk/main.c:89 +#: ../gtk/chat.c:336 ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "启动到系统托盘,不显示主界面。" -#: ../gtk/main.c:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "现在呼叫的地址" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "是否设置呼叫自动应答" -#: ../gtk/main.c:131 +#: ../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:498 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "与 %s 通话" -#: ../gtk/main.c:871 +#: ../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:948 +#: ../gtk/main.c:1023 #, c-format msgid "" "Please enter your password for username %s\n" " at domain %s:" msgstr "请输入 %s@%s 的密码:" -#: ../gtk/main.c:1051 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "呼叫历史" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "呼叫结束" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "呼入" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../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:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒绝" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "中断" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "端口" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "网站" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - 互联网视频电话" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (默认)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "" -#: ../gtk/main.c:1724 +#: ../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,175 +217,170 @@ msgstr "" "未在此计算机上检测到声卡。\n" "您无法发送或接收音频呼叫。" -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "免费的 SIP 视频电话" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "在线状态" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名称" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "呼叫 %s" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "在 %s 目录中查找 " -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "无效的 SIP 联系人!" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "呼叫 %s" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "发送消息给 %s" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "编辑联系人 %s" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "删除联系人 %s" -#: ../gtk/friendlist.c:820 +#: ../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 目录增加联系人 " -#: ../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: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:912 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -404,7 +423,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 +431,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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "正在呼叫..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 #, fuzzy msgid "Incoming call" msgstr "呼入" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 #, fuzzy msgid "In call" msgstr "正在呼叫" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 #, fuzzy msgid "Paused call" msgstr "正在呼叫" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "通话结束。" -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 msgid "Transfer done." msgstr "" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "呼叫失败。" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +msgid "(Paused)" +msgstr "" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -702,9 +763,9 @@ msgstr "发送" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "标签" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" +msgstr "" #: ../gtk/main.ui.h:8 msgid "Video" @@ -774,155 +835,91 @@ msgstr "SIP 地址或电话号码:" msgid "Initiate a new call" msgstr "" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +msgid "Contacts" +msgstr "联系人" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "添加" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 msgid "Add contacts from directory" msgstr "从目录增加联系人" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 #, fuzzy msgid "Add contact" msgstr "找到 %i 联系方式" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "数字键盘" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "呼入" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "当前地址:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "用户名" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "密码" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "网络连接:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "自动登录" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "登录信息" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "欢迎!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 #, fuzzy msgid "Online users" msgstr "" "全部用户\n" "在线用户" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 #, fuzzy msgid "Fiber Channel" msgstr "" "ADSL\n" "光纤" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "默认" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1090,6 +1087,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 +1131,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 +1413,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 +1421,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 +1454,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:228 msgid "aborted" msgstr "中断" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "完成" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "丢失" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1463,23 +1541,23 @@ msgstr "" "状态:%s\n" "状态:%i 分 %i 秒\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "呼出" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "就绪" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "查询电话号码目的地..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "该号码无法解析。" -#: ../coreapi/linphonecore.c:2121 +#: ../coreapi/linphonecore.c:2252 msgid "" "Could not parse given sip address. A sip url usually looks like sip:" "user@domain" @@ -1487,50 +1565,50 @@ msgstr "" "无法解析给定的 SIP 地址,SIP 地址应有如下格式:\n" "sip:用户名@域名" -#: ../coreapi/linphonecore.c:2312 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "联系中" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 #, fuzzy msgid "Could not call" msgstr "无法呼叫" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "正在联系您" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr " 并询问了自动回答。" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "" -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "已连接。" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 #, fuzzy msgid "Call aborted" msgstr "中断" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 #, fuzzy msgid "Could not pause the call" msgstr "无法呼叫" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "" @@ -1626,116 +1704,116 @@ msgstr "" "您输入的地址无效。\n" "它应具有“sip:用户名@代理域”的形式,例如 sip:alice@example.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "无法登录为 %s" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "响铃。" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 #, fuzzy msgid "Remote ringing..." msgstr "响铃。" -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, fuzzy, c-format msgid "Call with %s is paused." msgstr "与 %s 通话" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 #, fuzzy msgid "Call resumed." msgstr "呼叫结束" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 msgid "We have been resumed." msgstr "" -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "通话结束。" -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "被叫正忙。" -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "您呼叫的用户暂时无法接通。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "用户已开启免打扰功能。" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "呼叫被拒绝。" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "没有响应。" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "协议错误。" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "已重定向" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "呼叫失败。" -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "成功注册到 %s" -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "已在 %s 解除注册。" -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "没有响应,超时" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "注册到 %s 失败: %s" @@ -1745,12 +1823,18 @@ msgstr "注册到 %s 失败: %s" msgid "Authentication token is %s" msgstr "Linphone - 需要认证" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "您错过了 %i 个呼叫。" +#~ msgid "label" +#~ msgstr "标签" + +#~ msgid "Keypad" +#~ msgstr "数字键盘" + #~ msgid "Chat with %s" #~ msgstr "与 %s 通话" @@ -1787,9 +1871,6 @@ msgstr[0] "您错过了 %i 个呼叫。" #~ msgid "Now ready !" #~ msgstr "就绪!" -#~ msgid "Contacts" -#~ msgstr "联系人" - #, fuzzy #~ msgid "Enable video" #~ msgstr "启用" @@ -1843,9 +1924,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..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-01-08 10:35+0100\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" @@ -17,56 +17,76 @@ 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:303 #, fuzzy msgid "Aborted" msgstr "已放棄" -#: ../gtk/calllogs.c:85 +#: ../gtk/calllogs.c:306 #, fuzzy msgid "Missed" msgstr "未接" -#: ../gtk/calllogs.c:88 +#: ../gtk/calllogs.c:309 #, fuzzy msgid "Declined" msgstr "拒接" -#: ../gtk/calllogs.c:94 +#: ../gtk/calllogs.c:315 #, c-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" -#: ../gtk/calllogs.c:97 +#: ../gtk/calllogs.c:318 #, c-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" -#: ../gtk/calllogs.c:100 +#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327 +#, c-format +msgid "%s\t%s" +msgstr "" + +#: ../gtk/calllogs.c:323 #, c-format msgid "" -"%s\t%s\tQuality: %s\n" -"%s\t%s %s\t" +"%s\tQuality: %s\n" +"%s\t%s\t" msgstr "" -#: ../gtk/calllogs.c:102 -msgid "n/a" -msgstr "" - -#: ../gtk/calllogs.c:105 +#: ../gtk/calllogs.c:329 #, c-format msgid "" -"%s\t%s\t\n" -"%s\t%s" +"%s\t\n" +"%s" msgstr "" -#: ../gtk/conference.c:33 ../gtk/main.ui.h:13 +#: ../gtk/conference.c:38 ../gtk/main.ui.h:13 msgid "Conference" msgstr "" -#: ../gtk/conference.c:41 +#: ../gtk/conference.c:46 #, fuzzy msgid "Me" msgstr "靜音" @@ -76,43 +96,47 @@ msgstr "靜音" msgid "Couldn't find pixmap file: %s" msgstr "找不到 pixmap 檔:%s" -#: ../gtk/main.c:89 +#: ../gtk/chat.c:336 ../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:96 +#: ../gtk/main.c:99 msgid "path to a file to write logs into." msgstr "" -#: ../gtk/main.c:103 +#: ../gtk/main.c:106 msgid "Start linphone with video disabled." msgstr "" -#: ../gtk/main.c:110 +#: ../gtk/main.c:113 msgid "Start only in the system tray, do not show the main interface." msgstr "只在系統匣啟動,不要顯示主要介面。" -#: ../gtk/main.c:117 +#: ../gtk/main.c:120 msgid "address to call right now" msgstr "現在要打電話的位址" -#: ../gtk/main.c:124 +#: ../gtk/main.c:127 msgid "if set automatically answer incoming calls" msgstr "如啟用此項,將會自動接聽來電" -#: ../gtk/main.c:131 +#: ../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:498 +#: ../gtk/main.c:515 #, c-format msgid "Call with %s" msgstr "和 %s 通話" -#: ../gtk/main.c:871 +#: ../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:948 +#: ../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:1051 +#: ../gtk/main.c:1126 #, fuzzy msgid "Call error" msgstr "通話紀錄" -#: ../gtk/main.c:1054 ../coreapi/linphonecore.c:2949 +#: ../gtk/main.c:1129 ../coreapi/linphonecore.c:3210 msgid "Call ended" msgstr "通話已結束" -#: ../gtk/main.c:1057 ../coreapi/linphonecore.c:244 +#: ../gtk/main.c:1132 ../coreapi/linphonecore.c:240 msgid "Incoming call" msgstr "來電" -#: ../gtk/main.c:1059 ../gtk/incall_view.c:451 ../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:1061 ../gtk/main.ui.h:7 +#: ../gtk/main.c:1136 ../gtk/main.ui.h:6 msgid "Decline" msgstr "拒接" -#: ../gtk/main.c:1067 +#: ../gtk/main.c:1142 #, fuzzy msgid "Call paused" msgstr "通話已放棄" -#: ../gtk/main.c:1067 -#, c-format -msgid "by %s" -msgstr "" +#: ../gtk/main.c:1142 +#, fuzzy, c-format +msgid "by %s" +msgstr "連接埠" -#: ../gtk/main.c:1116 +#: ../gtk/main.c:1191 #, c-format msgid "%s proposed to start video. Do you accept ?" msgstr "" -#: ../gtk/main.c:1278 +#: ../gtk/main.c:1353 msgid "Website link" msgstr "網站連結" -#: ../gtk/main.c:1318 +#: ../gtk/main.c:1402 msgid "Linphone - a video internet phone" msgstr "Linphone - 網路視訊電話" -#: ../gtk/main.c:1410 +#: ../gtk/main.c:1494 #, c-format msgid "%s (Default)" msgstr "%s (預設值)" -#: ../gtk/main.c:1714 ../coreapi/callbacks.c:774 +#: ../gtk/main.c:1796 ../coreapi/callbacks.c:810 #, c-format msgid "We are transferred to %s" msgstr "我們被轉接到 %s" -#: ../gtk/main.c:1724 +#: ../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,175 +219,170 @@ msgstr "" "在這臺電腦中偵測不到音效卡。\n" "您將無法傳送或接收語音電話。" -#: ../gtk/main.c:1833 +#: ../gtk/main.c:1911 msgid "A free SIP video-phone" msgstr "自由的 SIP 視訊電話" -#: ../gtk/friendlist.c:335 +#: ../gtk/friendlist.c:469 msgid "Add to addressbook" msgstr "" -#: ../gtk/friendlist.c:509 +#: ../gtk/friendlist.c:643 msgid "Presence status" msgstr "上線狀態" -#: ../gtk/friendlist.c:526 ../gtk/propertybox.c:362 ../gtk/contact.ui.h:1 +#: ../gtk/friendlist.c:661 ../gtk/propertybox.c:367 ../gtk/contact.ui.h:1 msgid "Name" msgstr "名稱" -#: ../gtk/friendlist.c:538 +#: ../gtk/friendlist.c:673 #, fuzzy msgid "Call" msgstr "播打給 %s" -#: ../gtk/friendlist.c:543 +#: ../gtk/friendlist.c:678 msgid "Chat" msgstr "" -#: ../gtk/friendlist.c:573 +#: ../gtk/friendlist.c:708 #, c-format msgid "Search in %s directory" msgstr "在 %s 目錄中搜尋" -#: ../gtk/friendlist.c:730 -msgid "Invalid sip contact !" -msgstr "無效的 sip 連絡人!" - -#: ../gtk/friendlist.c:775 -#, c-format -msgid "Call %s" -msgstr "播打給 %s" - -#: ../gtk/friendlist.c:776 -#, c-format -msgid "Send text to %s" -msgstr "傳送文字給 %s" - -#: ../gtk/friendlist.c:777 +#: ../gtk/friendlist.c:924 #, c-format msgid "Edit contact '%s'" msgstr "編輯連絡人「%s」" -#: ../gtk/friendlist.c:778 +#: ../gtk/friendlist.c:925 #, c-format msgid "Delete contact '%s'" msgstr "刪除連絡人「%s」" -#: ../gtk/friendlist.c:820 +#: ../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 目錄加入新的連絡人" -#: ../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: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:912 +#: ../gtk/propertybox.c:934 msgid "None" msgstr "" -#: ../gtk/propertybox.c:916 +#: ../gtk/propertybox.c:938 msgid "SRTP" msgstr "" -#: ../gtk/propertybox.c:922 +#: ../gtk/propertybox.c:944 msgid "ZRTP" msgstr "" @@ -406,7 +425,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 +433,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:12 msgid "Hang up" msgstr "" -#: ../gtk/incall_view.c:430 +#: ../gtk/incall_view.c:476 msgid "Calling..." msgstr "播打..." -#: ../gtk/incall_view.c:433 ../gtk/incall_view.c:646 +#: ../gtk/incall_view.c:479 ../gtk/incall_view.c:689 msgid "00::00::00" msgstr "00::00::00" -#: ../gtk/incall_view.c:444 +#: ../gtk/incall_view.c:490 msgid "Incoming call" msgstr "來電" -#: ../gtk/incall_view.c:481 +#: ../gtk/incall_view.c:527 msgid "good" msgstr "" -#: ../gtk/incall_view.c:483 +#: ../gtk/incall_view.c:529 msgid "average" msgstr "" -#: ../gtk/incall_view.c:485 +#: ../gtk/incall_view.c:531 msgid "poor" msgstr "" -#: ../gtk/incall_view.c:487 +#: ../gtk/incall_view.c:533 msgid "very poor" msgstr "" -#: ../gtk/incall_view.c:489 +#: ../gtk/incall_view.c:535 msgid "too bad" msgstr "" -#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:506 +#: ../gtk/incall_view.c:536 ../gtk/incall_view.c:552 msgid "unavailable" msgstr "" -#: ../gtk/incall_view.c:605 +#: ../gtk/incall_view.c:651 msgid "Secured by SRTP" msgstr "" -#: ../gtk/incall_view.c:611 +#: ../gtk/incall_view.c:657 #, c-format msgid "Secured by ZRTP - [auth token: %s]" msgstr "" -#: ../gtk/incall_view.c:617 +#: ../gtk/incall_view.c:663 msgid "Set unverified" msgstr "" -#: ../gtk/incall_view.c:617 ../gtk/main.ui.h:5 +#: ../gtk/incall_view.c:663 ../gtk/main.ui.h:4 msgid "Set verified" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In conference" msgstr "" -#: ../gtk/incall_view.c:641 +#: ../gtk/incall_view.c:684 msgid "In call" msgstr "通話中" -#: ../gtk/incall_view.c:669 +#: ../gtk/incall_view.c:718 msgid "Paused call" msgstr "暫停通話" -#: ../gtk/incall_view.c:682 +#: ../gtk/incall_view.c:731 #, c-format msgid "%02i::%02i::%02i" msgstr "%02i::%02i::%02i" -#: ../gtk/incall_view.c:699 +#: ../gtk/incall_view.c:748 msgid "Call ended." msgstr "通話結束。" -#: ../gtk/incall_view.c:731 +#: ../gtk/incall_view.c:778 msgid "Transfer in progress" msgstr "" -#: ../gtk/incall_view.c:734 +#: ../gtk/incall_view.c:781 #, fuzzy msgid "Transfer done." msgstr "轉接" -#: ../gtk/incall_view.c:737 +#: ../gtk/incall_view.c:784 #, fuzzy msgid "Transfer failed." msgstr "轉接" -#: ../gtk/incall_view.c:781 +#: ../gtk/incall_view.c:828 msgid "Resume" msgstr "繼續" -#: ../gtk/incall_view.c:788 ../gtk/main.ui.h:9 +#: ../gtk/incall_view.c:835 ../gtk/main.ui.h:9 msgid "Pause" msgstr "暫停" +#: ../gtk/incall_view.c:900 +#, c-format +msgid "" +"Recording into\n" +"%s %s" +msgstr "" + +#: ../gtk/incall_view.c:900 +#, fuzzy +msgid "(Paused)" +msgstr "暫停" + #: ../gtk/loginframe.c:93 #, c-format msgid "Please enter login information for %s" @@ -701,9 +763,9 @@ msgstr "傳送" msgid "End conference" msgstr "" -#: ../gtk/main.ui.h:4 -msgid "label" -msgstr "標籤" +#: ../gtk/main.ui.h:7 +msgid "Record this call to an audio file" +msgstr "" #: ../gtk/main.ui.h:8 msgid "Video" @@ -770,148 +832,84 @@ msgstr "SIP 位址或電話號碼:" msgid "Initiate a new call" msgstr "打出新電話" -#: ../gtk/main.ui.h:27 ../gtk/parameters.ui.h:48 +#: ../gtk/main.ui.h:27 +msgid "Contacts" +msgstr "連絡人" + +#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:50 msgid "Add" msgstr "加入" -#: ../gtk/main.ui.h:28 ../gtk/parameters.ui.h:49 +#: ../gtk/main.ui.h:29 ../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:31 msgid "Add contacts from directory" msgstr "從目錄加入連絡人" -#: ../gtk/main.ui.h:47 +#: ../gtk/main.ui.h:32 msgid "Add contact" msgstr "加入聯絡人" -#: ../gtk/main.ui.h:48 -msgid "Keypad" -msgstr "撥號盤" - -#: ../gtk/main.ui.h:49 +#: ../gtk/main.ui.h:33 #, fuzzy msgid "Recent calls" msgstr "通話中" -#: ../gtk/main.ui.h:50 +#: ../gtk/main.ui.h:34 msgid "My current identity:" msgstr "我目前的使用者識別:" -#: ../gtk/main.ui.h:51 ../gtk/tunnel_config.ui.h:7 +#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:7 msgid "Username" msgstr "使用者名稱" -#: ../gtk/main.ui.h:52 ../gtk/tunnel_config.ui.h:8 +#: ../gtk/main.ui.h:36 ../gtk/tunnel_config.ui.h:8 msgid "Password" msgstr "密碼" -#: ../gtk/main.ui.h:53 +#: ../gtk/main.ui.h:37 msgid "Internet connection:" msgstr "網路連線:" -#: ../gtk/main.ui.h:54 +#: ../gtk/main.ui.h:38 msgid "Automatically log me in" msgstr "將我自動登入" -#: ../gtk/main.ui.h:55 +#: ../gtk/main.ui.h:39 msgid "Login information" msgstr "登入資訊" -#: ../gtk/main.ui.h:56 +#: ../gtk/main.ui.h:40 msgid "Welcome !" msgstr "歡迎使用!" -#: ../gtk/main.ui.h:57 +#: ../gtk/main.ui.h:41 msgid "All users" msgstr "所有使用者" -#: ../gtk/main.ui.h:58 +#: ../gtk/main.ui.h:42 msgid "Online users" msgstr "線上使用者" -#: ../gtk/main.ui.h:59 +#: ../gtk/main.ui.h:43 msgid "ADSL" msgstr "ADSL" -#: ../gtk/main.ui.h:60 +#: ../gtk/main.ui.h:44 msgid "Fiber Channel" msgstr "光纖通道" -#: ../gtk/main.ui.h:61 +#: ../gtk/main.ui.h:45 msgid "Default" msgstr "預設值" -#: ../gtk/main.ui.h:62 +#: ../gtk/main.ui.h:46 msgid "Delete" msgstr "" @@ -1069,6 +1067,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 +1111,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 +1388,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 +1396,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 +1429,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:228 msgid "aborted" msgstr "已放棄" -#: ../coreapi/linphonecore.c:235 +#: ../coreapi/linphonecore.c:231 msgid "completed" msgstr "已完成" -#: ../coreapi/linphonecore.c:238 +#: ../coreapi/linphonecore.c:234 msgid "missed" msgstr "未接" -#: ../coreapi/linphonecore.c:243 +#: ../coreapi/linphonecore.c:239 #, c-format msgid "" "%s at %s\n" @@ -1437,69 +1516,69 @@ msgstr "" "狀態:%s\n" "持續時間:%i 分 %i 秒\n" -#: ../coreapi/linphonecore.c:244 +#: ../coreapi/linphonecore.c:240 msgid "Outgoing call" msgstr "去電" -#: ../coreapi/linphonecore.c:1226 +#: ../coreapi/linphonecore.c:1321 msgid "Ready" msgstr "準備就緒" -#: ../coreapi/linphonecore.c:2074 +#: ../coreapi/linphonecore.c:2205 msgid "Looking for telephone number destination..." msgstr "尋找電話號碼目的端..." -#: ../coreapi/linphonecore.c:2077 +#: ../coreapi/linphonecore.c:2208 msgid "Could not resolve this number." msgstr "無法解析這個號碼。" -#: ../coreapi/linphonecore.c:2121 +#: ../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:2312 +#: ../coreapi/linphonecore.c:2453 msgid "Contacting" msgstr "正在連絡" -#: ../coreapi/linphonecore.c:2319 +#: ../coreapi/linphonecore.c:2460 msgid "Could not call" msgstr "無法通話" -#: ../coreapi/linphonecore.c:2429 +#: ../coreapi/linphonecore.c:2570 msgid "Sorry, we have reached the maximum number of simultaneous calls" msgstr "抱歉,我們已達瀏同步通話的最大數目" -#: ../coreapi/linphonecore.c:2573 +#: ../coreapi/linphonecore.c:2752 msgid "is contacting you" msgstr "正在連絡您" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid " and asked autoanswer." msgstr "並要求自動接聽。" -#: ../coreapi/linphonecore.c:2574 +#: ../coreapi/linphonecore.c:2753 msgid "." msgstr "." -#: ../coreapi/linphonecore.c:2636 +#: ../coreapi/linphonecore.c:2820 msgid "Modifying call parameters..." msgstr "修改通話參數..." -#: ../coreapi/linphonecore.c:2908 +#: ../coreapi/linphonecore.c:3159 msgid "Connected." msgstr "已連線。" -#: ../coreapi/linphonecore.c:2931 +#: ../coreapi/linphonecore.c:3187 msgid "Call aborted" msgstr "通話已放棄" -#: ../coreapi/linphonecore.c:3102 +#: ../coreapi/linphonecore.c:3378 msgid "Could not pause the call" msgstr "無法暫停通話" -#: ../coreapi/linphonecore.c:3107 +#: ../coreapi/linphonecore.c:3383 msgid "Pausing the current call..." msgstr "暫停目前的通話..." @@ -1598,115 +1677,115 @@ msgstr "" "您輸入的 sip 身分是無效的。\n" "它應該看起來像 sip:使用者名稱@代理網域,像是 sip:alice@example.net" -#: ../coreapi/proxy.c:1053 +#: ../coreapi/proxy.c:1069 #, c-format msgid "Could not login as %s" msgstr "無法以 %s 登入" -#: ../coreapi/callbacks.c:276 +#: ../coreapi/callbacks.c:286 msgid "Remote ringing." msgstr "遠端響鈴。" -#: ../coreapi/callbacks.c:296 +#: ../coreapi/callbacks.c:306 msgid "Remote ringing..." msgstr "遠端響鈴..." -#: ../coreapi/callbacks.c:307 +#: ../coreapi/callbacks.c:317 msgid "Early media." msgstr "早期媒體。" -#: ../coreapi/callbacks.c:352 +#: ../coreapi/callbacks.c:368 #, c-format msgid "Call with %s is paused." msgstr "和 %s 的通話已暫停。" -#: ../coreapi/callbacks.c:365 +#: ../coreapi/callbacks.c:381 #, c-format msgid "Call answered by %s - on hold." msgstr "通話由 %s 接聽 - 保留中。" -#: ../coreapi/callbacks.c:376 +#: ../coreapi/callbacks.c:392 msgid "Call resumed." msgstr "通話已繼續。" -#: ../coreapi/callbacks.c:381 +#: ../coreapi/callbacks.c:397 #, c-format msgid "Call answered by %s." msgstr "通話由 %s 接聽。" -#: ../coreapi/callbacks.c:396 -msgid "Incompatible, check codecs..." +#: ../coreapi/callbacks.c:412 +msgid "Incompatible, check codecs or security settings..." msgstr "" -#: ../coreapi/callbacks.c:437 +#: ../coreapi/callbacks.c:460 #, fuzzy msgid "We have been resumed." msgstr "我們要繼續了..." -#: ../coreapi/callbacks.c:446 +#: ../coreapi/callbacks.c:469 msgid "We are paused by other party." msgstr "" -#: ../coreapi/callbacks.c:452 +#: ../coreapi/callbacks.c:475 msgid "Call is updated by remote." msgstr "" -#: ../coreapi/callbacks.c:521 +#: ../coreapi/callbacks.c:544 msgid "Call terminated." msgstr "通話已終止。" -#: ../coreapi/callbacks.c:528 +#: ../coreapi/callbacks.c:555 msgid "User is busy." msgstr "使用者現正忙碌。" -#: ../coreapi/callbacks.c:529 +#: ../coreapi/callbacks.c:556 msgid "User is temporarily unavailable." msgstr "使用者暫時無法聯繫。" #. char *retrymsg=_("%s. Retry after %i minute(s)."); -#: ../coreapi/callbacks.c:531 +#: ../coreapi/callbacks.c:558 msgid "User does not want to be disturbed." msgstr "使用者不想要被打擾。" -#: ../coreapi/callbacks.c:532 +#: ../coreapi/callbacks.c:559 msgid "Call declined." msgstr "通話被拒接。" -#: ../coreapi/callbacks.c:544 +#: ../coreapi/callbacks.c:571 msgid "No response." msgstr "沒有回應。" -#: ../coreapi/callbacks.c:548 +#: ../coreapi/callbacks.c:575 msgid "Protocol error." msgstr "通訊協定錯誤。" -#: ../coreapi/callbacks.c:564 +#: ../coreapi/callbacks.c:591 msgid "Redirected" msgstr "已重新導向" -#: ../coreapi/callbacks.c:600 +#: ../coreapi/callbacks.c:627 msgid "Incompatible media parameters." msgstr "" -#: ../coreapi/callbacks.c:606 +#: ../coreapi/callbacks.c:633 msgid "Call failed." msgstr "通話失敗。" -#: ../coreapi/callbacks.c:701 +#: ../coreapi/callbacks.c:737 #, c-format msgid "Registration on %s successful." msgstr "在 %s 註冊成功。" -#: ../coreapi/callbacks.c:702 +#: ../coreapi/callbacks.c:738 #, c-format msgid "Unregistration on %s done." msgstr "在 %s 取消註冊完成。" -#: ../coreapi/callbacks.c:722 +#: ../coreapi/callbacks.c:758 msgid "no response timeout" msgstr "沒有回應逾時" -#: ../coreapi/callbacks.c:725 +#: ../coreapi/callbacks.c:761 #, c-format msgid "Registration on %s failed: %s" msgstr "在 %s 註冊失敗:%s" @@ -1716,12 +1795,18 @@ msgstr "在 %s 註冊失敗:%s" msgid "Authentication token is %s" msgstr "驗證失敗" -#: ../coreapi/linphonecall.c:2124 +#: ../coreapi/linphonecall.c:2355 #, c-format msgid "You have missed %i call." msgid_plural "You have missed %i calls." msgstr[0] "您有 %i 通未接來電。" +#~ msgid "label" +#~ msgstr "標籤" + +#~ msgid "Keypad" +#~ msgstr "撥號盤" + #~ msgid "Chat with %s" #~ msgstr "和 %s 聊天" @@ -1758,9 +1843,6 @@ msgstr[0] "您有 %i 通未接來電。" #~ msgid "Now ready !" #~ msgstr "現在已就緒!" -#~ msgid "Contacts" -#~ msgstr "連絡人" - #, fuzzy #~ msgid "Enable video" #~ msgstr "已啟用" @@ -1833,9 +1915,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 "抱歉,您必須先暫停或停止目前的通話!" 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----- 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 12af75322..39fd62b0e 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 @@ -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,12 +72,34 @@ 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) { 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; } @@ -103,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); } } @@ -195,38 +218,75 @@ 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, unsigned char **content) { - int ret = 0; +int lpc2xml_convert_string(lpc2xml_context* context, char **content) { + 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) { - *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_ 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.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); } 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; +}