Merge remote-tracking branch 'linphone/master' into daemon

This commit is contained in:
François Grisez 2015-04-03 14:20:35 +02:00
commit ff3bf34a86
83 changed files with 8187 additions and 5469 deletions

1
.gitignore vendored
View file

@ -86,3 +86,4 @@ tester/linphone_log.txt
po/linphone.pot
.tx/linphone-gtk.audio-assistantdesktopin/
tester/linphone_log.gz.txt
tools/auto_answer

View file

@ -26,7 +26,7 @@ project(LINPHONE C CXX)
set(LINPHONE_MAJOR_VERSION "3")
set(LINPHONE_MINOR_VERSION "8")
set(LINPHONE_MICRO_VERSION "0")
set(LINPHONE_MICRO_VERSION "1")
set(LINPHONE_VERSION "${LINPHONE_MAJOR_VERSION}.${LINPHONE_MINOR_VERSION}.${LINPHONE_MICRO_VERSION}")
set(LINPHONE_SO_VERSION "6")
@ -94,6 +94,7 @@ endif()
find_package(BelleSIP REQUIRED)
find_package(Mediastreamer2 REQUIRED)
find_package(XML2 REQUIRED)
find_package(Zlib)
if(ENABLE_UNIT_TESTS)
find_package(CUnit)
if(CUNIT_FOUND)
@ -148,6 +149,10 @@ include_directories(
${MEDIASTREAMER2_INCLUDE_DIRS}
${XML2_INCLUDE_DIRS}
)
if(ZLIB_FOUND)
include_directories(${ZLIB_INCLUDE_DIRS})
set(HAVE_ZLIB 1)
endif()
if(SQLITE3_FOUND)
include_directories(${SQLITE3_INCLUDE_DIRS})
add_definitions("-DMSG_STORAGE_ENABLED")

View file

@ -167,10 +167,10 @@ filelist: zip
pull-transifex:
tx pull -af
$(MAKE) -C po update-po
push-transifex:
tx push -s -t -f --no-interactive
$(MAKE) -C po update-po
tx push -s -f --no-interactive
### WINDOWS
@ -214,7 +214,7 @@ BUNDLEDIR=$(BUNDLEPREFIX)$(MACAPPNAME)
#a path prefix where additional libs can be cherry-picked by the bundler.
LINPHONE_ADDITIONAL_DEPENDENCIES_PREFIX=/usr/local
bundle:
Linphone.app:
rm -rf $(INSTALLDIR)
$(MKDIR_P) $(INSTALLDIR)
make install DESTDIR=$(INSTALLDIR)
@ -228,9 +228,17 @@ bundle:
> $(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.*/::g' $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules.orig > $(BUNDLEDIR)/Contents/Resources/etc/pango/pango.modules
patch -R ${BUNDLEDIR}/Contents/Resources/share/themes/Quartz/gtk-2.0/gtkrc ${srcdir}/build/macos/quartz-theme-gtkrc.patch
bundle: Linphone.app
cd $(BUNDLEDIR)/.. && rm -f $(MACAPPZIP) && zip -r $(MACAPPZIP) $(MACAPPNAME) && cd -
cd $(BUNDLEDIR)/.. && rm -f $(MAXAPPDMG) && hdiutil create $(MACAPPDMG) -srcfolder $(MACAPPNAME) -ov && cd -
signed-bundle: Linphone.app
codesign --deep -s $(BUNDLE_SIGNING_ID) $(BUNDLEDIR)
cd $(BUNDLEDIR)/.. && rm -f $(MAXAPPDMG) && hdiutil create $(MACAPPDMG) -srcfolder $(MACAPPNAME) -ov && cd -
###
### CLEAN

6
NEWS
View file

@ -1,3 +1,9 @@
linphone-3.8.1 -- March 31th, 2015
Application level improvements:
* Auto-answer ability
* Improvement of UI appearance on Mac OSX
* Bug fixes
linphone-3.8.0 -- March 11th, 2015
Application level improvements:
* The video window has now controls in order to switch fullscreen mode and terminate call.

View file

@ -13,29 +13,26 @@
##### Multiple MacOS version support
In order to enable generation of bundle for multiple MacOS version and 32 bit processors, it is recommended to:
In order to enable generation of bundle for older MacOS version, it is recommended to:
1. Edit `/opt/local/etc/macports/macports.conf` to add the following line:
Edit `/opt/local/etc/macports/macports.conf` to add the following line:
> macosx_deployment_target 10.6
2. Edit `/opt/local/etc/macports/variants.conf` to add the following line:
> +universal
> macosx_deployment_target 10.7
> buildfromsource always
##### Linphone library (liblinphone)
sudo port install automake autoconf libtool pkgconfig intltool wget cunit \
antlr3 speex libvpx readline sqlite3 libsoup openldap libupnp \
antlr3 speex libvpx readline sqlite3 openldap libupnp \
ffmpeg-devel -gpl2
##### Linphone UI (GTK version)
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 gtk2 +quartz +no_x11 libsoup
sudo port install gtk-osx-application +no_python
sudo port install hicolor-icon-theme
#### Using HomeBrew
@ -62,8 +59,8 @@ The next pieces need to be compiled manually.
* To ensure compatibility with multiple MacOS versions it is recommended to do:
export MACOSX_DEPLOYMENT_TARGET=10.6
export LDFLAGS="-Wl,-headerpad_max_install_names -Wl,-read_only_relocs -Wl,suppress"
export MACOSX_DEPLOYMENT_TARGET=10.7
export LDFLAGS="-Wl,-headerpad_max_install_names"
* (MacPorts only) Install libantlr3c (library used by belle-sip for parsing)
@ -132,10 +129,15 @@ The libvpx build isn't able to produce dual architecture files. To workaround th
If you want to generate a portable bundle, then install `gtk-mac-bundler`:
git clone https://github.com/jralls/gtk-mac-bundler.git
cd gtk-mac-bundler && make install
cd gtk-mac-bundler
git checkout 6e2ed855aaeae43c29436c342ae83568573b5636
make install
export PATH=$PATH:~/.local/bin
# make this dummy charset.alias file for the bundler to be happy:
sudo touch /opt/local/lib/charset.alias
# set writing right for owner on the libssl and libcrypto libraries in order gtk-mac-bundler
# be able to rewrite their rpath
sudo chmod u+w /opt/local/lib/libssl.1.0.0.dylib /opt/local/lib/libcrypto.1.0.0.dylib
The bundler file in `build/MacOS/linphone.bundle` expects some plugins to be installed in `/opt/local/lib/mediastreamer/plugins`.
If you don't need plugins, remove or comment out this line from the bundler file:
@ -160,28 +162,15 @@ Then run, inside Linphone source tree configure as told before but with `--enabl
The resulting bundle is located in Linphone build directory, together with a zipped version.
* For a better appearance, you can install `gtk-quartz-engine` (a GTK theme) that makes GTK application more similar to other Mac applications (but not perfect).
sudo port install gnome-common
git clone https://github.com/jralls/gtk-quartz-engine.git
cd gtk-quartz-engine
autoreconf -i
./autogen.sh
./configure --prefix=/opt/local CFLAGS="$CFLAGS -Wno-error" && make
sudo make install
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`.

View file

@ -3,5 +3,24 @@ export LINPHONE_WORKDIR="$bundle_res"
export GIO_EXTRA_MODULES="$bundle_lib/gio/modules"
export PANGO_LIBDIR="$bundle_lib"
export PANGO_SYSCONFDIR="$bundle_etc"
#this is very important not to force a shared library path so that native frameworks can find their dependencies by themselves,
#and not be forced to use the few libraries we have in the bundle that have the same name as native libs (ex: libiconv)
export DYLD_LIBRARY_PATH=
#the fucking script of the gtk-mac-bundler resets LANG due to obscure bugs. Set it back.
LANG=`defaults read .GlobalPreferences AppleLocale`
case "$LANG" in
*.UTF-8)
;;
*)
if test -d /usr/share/locale/${LANG}.UTF-8 ; then
LANG=${LANG}.UTF-8
fi
;;
esac
export LANG
echo "LANG is $LANG"

View file

@ -104,13 +104,13 @@
want to copy in to the bundle. The "dest" attribute is
optional, as usual. Bundler will find all translations of that
library/program under the indicated directory and copy them.-->
<translations name="linphone">
<data name="linphone">
${prefix:linphone}/share/locale
</data>
<translations name="gdk-pixbuf">
${prefix}/share/locale
</translations>
<translations name="gdk-pixbuf">
${prefix}/share/locale
</translations>
<translations name="glib20">
<translations name="glib20">
${prefix}/share/locale
</translations>
<translations name="gtk20">

View file

@ -0,0 +1,4 @@
85c85
< buttontype = "textured"
---
> buttontype = "aqua"

View file

@ -122,6 +122,7 @@
<ClCompile Include="..\..\coreapi\event.c" />
<ClCompile Include="..\..\coreapi\friend.c" />
<ClCompile Include="..\..\coreapi\info.c" />
<ClCompile Include="..\..\coreapi\lime.c" />
<ClCompile Include="..\..\coreapi\linphonecall.c" />
<ClCompile Include="..\..\coreapi\linphonecore.c" />
<ClCompile Include="..\..\coreapi\linphone_tunnel.cc" />
@ -141,6 +142,7 @@
<ClCompile Include="..\..\coreapi\siplogin.c" />
<ClCompile Include="..\..\coreapi\sipsetup.c" />
<ClCompile Include="..\..\coreapi\TunnelManager.cc" />
<ClCompile Include="..\..\coreapi\vtables.c" />
<ClCompile Include="..\..\coreapi\xml.c" />
<ClCompile Include="..\..\coreapi\xml2lpc.c" />
</ItemGroup>

View file

@ -125,6 +125,7 @@
<ClCompile Include="..\..\coreapi\event.c" />
<ClCompile Include="..\..\coreapi\friend.c" />
<ClCompile Include="..\..\coreapi\info.c" />
<ClCompile Include="..\..\coreapi\lime.c" />
<ClCompile Include="..\..\coreapi\linphonecall.c" />
<ClCompile Include="..\..\coreapi\linphonecore.c" />
<ClCompile Include="..\..\coreapi\linphone_tunnel_config.c" />
@ -143,6 +144,7 @@
<ClCompile Include="..\..\coreapi\sal.c" />
<ClCompile Include="..\..\coreapi\siplogin.c" />
<ClCompile Include="..\..\coreapi\sipsetup.c" />
<ClCompile Include="..\..\coreapi\vtables.c" />
<ClCompile Include="..\..\coreapi\xml.c" />
<ClCompile Include="..\..\coreapi\xml2lpc.c" />
</ItemGroup>

55
cmake/FindZlib.cmake Normal file
View file

@ -0,0 +1,55 @@
############################################################################
# FindZlib.txt
# Copyright (C) 2015 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.
#
############################################################################
#
# - Find the zlib include file and library
#
# ZLIB_FOUND - system has zlib
# ZLIB_INCLUDE_DIRS - the zlib include directory
# ZLIB_LIBRARIES - The libraries needed to use zlib
set(_ZLIB_ROOT_PATHS
${CMAKE_INSTALL_PREFIX}
)
find_path(ZLIB_INCLUDE_DIRS
NAMES zlib.h
HINTS _ZLIB_ROOT_PATHS
PATH_SUFFIXES include
)
if(ZLIB_INCLUDE_DIRS)
set(HAVE_ZLIB_H 1)
endif()
find_library(ZLIB_LIBRARIES
NAMES z zlib zlibd
HINTS ${_ZLIB_ROOT_PATHS}
PATH_SUFFIXES bin lib
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Zlib
DEFAULT_MSG
ZLIB_INCLUDE_DIRS ZLIB_LIBRARIES HAVE_ZLIB_H
)
mark_as_advanced(ZLIB_INCLUDE_DIRS ZLIB_LIBRARIES HAVE_ZLIB_H)

View file

@ -39,5 +39,6 @@
#cmakedefine BUILD_WIZARD
#cmakedefine HAVE_NOTIFY4
#cmakedefine HAVE_ZLIB 1
#cmakedefine HAVE_CU_GET_SUITE 1
#cmakedefine HAVE_CU_CURSES 1
#cmakedefine HAVE_CU_CURSES 1

View file

@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT([linphone],[3.8.0-linphone-daemon],[linphone-developers@nongnu.org])
AC_INIT([linphone],[3.8.1],[linphone-developers@nongnu.org])
AC_CANONICAL_SYSTEM
AC_CONFIG_SRCDIR([coreapi/linphonecore.c])
@ -337,7 +337,14 @@ AC_ARG_ENABLE(gtk_ui,
if test "$gtk_ui" = "true" ; then
PKG_CHECK_MODULES(LIBGTK, gtk+-2.0 >= 2.18.0 gthread-2.0)
if test "$enable_x11" = "false" ; then
PKG_CHECK_MODULES(LIBGTKMAC,[gtk-mac-integration >= 2.0.1])
PKG_CHECK_MODULES(LIBGTKMAC,[gtk-mac-integration >= 2.0.1], [found_gtkmac=true], [found_gtkmac=false])
if test "$found_gtkmac" != "true" ; then
dnl for newest macports, the name changed.
PKG_CHECK_MODULES(LIBGTKMAC,[gtk-mac-integration-gtk2 >= 2.0.1], [found_gtkmac=true], [found_gtkmac=false])
fi
if test "$found_gtkmac" != "true" ; then
AC_MSG_ERROR([gtk-mac-integration not found. Please install gtk-osx-application package.])
fi
AC_DEFINE([HAVE_GTK_OSX],[1],[Defined when gtk osx is used])
fi
else
@ -1008,7 +1015,20 @@ dnl ##################################################
dnl # Check for doxygen
dnl ##################################################
AC_CHECK_PROG(DOXYGEN,doxygen,doxygen,false)
AC_ARG_ENABLE(doxygen,
[AS_HELP_STRING([--disable-documentation], [Disable documentation generation using doxygen (default=no)])],
[case "${enableval}" in
yes) documentation_enabled=yes;;
no) documentation_enabled=no;;
*) AC_MSG_ERROR("Bad value for --disable-documentation");;
esac],
[documentation_enabled=yes]
)
if test "$documentation_enabled" = "yes" ; then
AC_CHECK_PROG(DOXYGEN,doxygen,doxygen,false)
else
DOXYGEN=false
fi
AM_CONDITIONAL(HAVE_DOXYGEN, test "$DOXYGEN" != "false")

View file

@ -1330,11 +1330,7 @@ handle_configfile_migration()
char *old_cfg_gui;
char *old_cfg_cli;
char *new_cfg;
#if !defined(_WIN32_WCE)
const char *home = getenv("HOME");
#else
const char *home = ".";
#endif /*_WIN32_WCE*/
new_cfg = ms_strdup_printf("%s/.linphonerc", home);
/*

View file

@ -127,6 +127,9 @@ set(LIBS
${MEDIASTREAMER2_LIBRARIES}
${XML2_LIBRARIES}
)
if(ZLIB_FOUND)
list(APPEND LIBS ${ZLIB_LIBRARIES})
endif()
if(SQLITE3_FOUND)
list(APPEND LIBS ${SQLITE3_LIBRARIES})
endif()
@ -139,7 +142,7 @@ endif()
if(ENABLE_ASSISTANT)
list(APPEND LIBS ${SOUP_LIBRARIES})
endif()
if(WIN32)
if(WIN32 AND NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsPhone")
list(APPEND LIBS shlwapi)
endif()
@ -159,6 +162,9 @@ else()
endif()
endif()
endif()
if(WIN32 AND "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsPhone")
set_target_properties(linphone PROPERTIES PREFIX "lib")
endif()
if(ICONV_FOUND)
target_include_directories(linphone PUBLIC ${ICONV_INCLUDE_DIRS})
endif()

View file

@ -164,7 +164,7 @@ endif
AM_CPPFLAGS=\
-I$(top_srcdir) -I$(top_srcdir)/include -I$(builddir) \
$(ORTP_CFLAGS) \
$(MEDIASTREAMER_CFLAGS)
$(MEDIASTREAMER_CFLAGS)
COMMON_CFLAGS=\
$(STRICT_OPTIONS) \
@ -200,14 +200,14 @@ make_gitversion_h:
if test -n "$(GITLOG)" ; then \
if test "$(GITDESCRIBE)" != "" ; then \
if test "$(GIT_TAG)" != "$(PACKAGE_VERSION)" ; then \
echo "*** PACKAGE_VERSION and git tag differ. Please put them identical."; \
$(ECHO) "*** PACKAGE_VERSION and git tag differ. Please put them identical."; \
exit 1; \
fi ; \
$(ECHO) -n "#define LIBLINPHONE_GIT_VERSION \"$(GITDESCRIBE)\"" > $(builddir)/$(GITVERSION_FILE_TMP) ; \
printf "#define LIBLINPHONE_GIT_VERSION \"$(GITDESCRIBE)\"\n" > $(builddir)/$(GITVERSION_FILE_TMP) ; \
elif test "$(GITREVISION)" != "" ; then \
$(ECHO) -n "#define LIBLINPHONE_GIT_VERSION \"$(LINPHONE_VERSION)_$(GITREVISION)\"" > $(builddir)/$(GITVERSION_FILE_TMP) ; \
printf "#define LIBLINPHONE_GIT_VERSION \"$(LINPHONE_VERSION)_$(GITREVISION)\"\n" > $(builddir)/$(GITVERSION_FILE_TMP) ; \
else \
$(ECHO) -n "" > $(builddir)/$(GITVERSION_FILE_TMP) ; \
printf "" > $(builddir)/$(GITVERSION_FILE_TMP) ; \
fi ; \
if ! test -f $(builddir)/$(GITVERSION_FILE) ; then \
cp -f $(builddir)/$(GITVERSION_FILE_TMP) $(builddir)/$(GITVERSION_FILE) ; \

View file

@ -107,6 +107,7 @@ struct SalOp{
bool_t has_auth_pending;
SalOpSDPHandling sdp_handling;
int auth_requests; /*number of auth requested for this op*/
bool_t cnx_ip_to_0000_if_sendonly_enabled; /*for */
};

View file

@ -36,7 +36,14 @@ static void call_set_error(SalOp* op,belle_sip_response_t* response){
sal_op_set_error_info_from_response(op,response);
op->base.root->callbacks.call_failure(op);
}
static void set_addr_to_0000(char value[]) {
if (ms_is_ipv6(value)) {
strcpy(value,"::0");
} else {
strcpy(value,"0.0.0.0");
}
return;
}
static void sdp_process(SalOp *h){
ms_message("Doing SDP offer/answer process of type %s",h->sdp_offering ? "outgoing" : "incoming");
if (h->result){
@ -56,6 +63,15 @@ static void sdp_process(SalOp *h){
belle_sip_object_unref(h->sdp_answer);
}
offer_answer_initiate_incoming(h->base.local_media,h->base.remote_media,h->result,h->base.root->one_matching_codec);
/*for backward compatibility purpose*/
if(h->cnx_ip_to_0000_if_sendonly_enabled && sal_media_description_has_dir(h->result,SalStreamSendOnly)) {
set_addr_to_0000(h->result->addr);
for(i=0;i<h->result->nb_streams;++i){
if (h->result->streams[i].dir == SalStreamSendOnly)
set_addr_to_0000(h->result->streams[i].rtp_addr);
set_addr_to_0000(h->result->streams[i].rtcp_addr);
}
}
h->sdp_answer=(belle_sdp_session_description_t *)belle_sip_object_ref(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*/

View file

@ -803,3 +803,9 @@ void sal_call_set_sdp_handling(SalOp *h, SalOpSDPHandling handling) {
if (handling != SalOpSDPNormal) ms_message("Enabling special SDP handling for SalOp[%p]!", h);
h->sdp_handling = handling;
}
void sal_op_cnx_ip_to_0000_if_sendonly_enable(SalOp *op,bool_t yesno) {
op->cnx_ip_to_0000_if_sendonly_enabled = yesno;
}
bool_t sal_op_cnx_ip_to_0000_if_sendonly_enabled(SalOp *op) {
return op->cnx_ip_to_0000_if_sendonly_enabled;
}

View file

@ -366,8 +366,8 @@ belle_sdp_session_description_t * media_description_to_sdp ( const SalMediaDescr
belle_sdp_session_description_set_session_name ( session_desc,
belle_sdp_session_name_create ( desc->name[0]!='\0' ? desc->name : "Talk" ) );
if ( (!sal_media_description_has_dir ( desc,SalStreamSendOnly ) && !sal_media_description_has_dir ( desc,SalStreamInactive ))
|| desc->ice_ufrag[0] != '\0' ) {
if ( !sal_media_description_has_dir ( desc,SalStreamInactive ) || desc->ice_ufrag[0] != '\0' ) {
/*in case of sendonly, setting of the IP on cnx we give a chance to receive stun packets*/
belle_sdp_session_description_set_connection ( session_desc
,belle_sdp_connection_create ( "IN",inet6 ? "IP6" :"IP4",desc->addr ) );

View file

@ -161,7 +161,7 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia
linphone_core_enable_mic(lc, linphone_core_mic_enabled(lc));
#ifdef VIDEO_ENABLED
if (call->videostream && call->camera_enabled)
video_stream_change_camera(call->videostream,lc->video_conf.device );
video_stream_change_camera(call->videostream,linphone_call_get_video_device(call));
#endif
}
/*FIXME ZRTP, might be restarted in any cases ? */
@ -197,6 +197,15 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia
if (call->params->real_early_media && call->state==LinphoneCallOutgoingEarlyMedia){
prepare_early_media_forking(call);
}
#ifdef VIDEO_ENABLED
if (call->state==LinphoneCallPausing) {
/*change cam to noweb cam*/
call->cam = get_nowebcam_device();
} else if (call->state != LinphoneCallPaused) {
/*restaure web cam*/
call->cam = lc->video_conf.device;
}
#endif /*VIDEO*/
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);
@ -491,8 +500,6 @@ static void call_accepted(SalOp *op){
#endif //BUILD_UPNP
md=sal_call_get_final_media_description(op);
if (md) /*make sure re-invite will not propose video again*/
call->params->has_video &= linphone_core_media_description_contains_video_stream(md);
switch (call->state){
case LinphoneCallOutgoingProgress:

View file

@ -43,7 +43,7 @@ static const char EC_STATE_STORE[] = ".linphone.ecstate";
static void linphone_call_stats_uninit(LinphoneCallStats *stats);
#ifdef VIDEO_ENABLED
static MSWebCam *get_nowebcam_device(){
MSWebCam *get_nowebcam_device(){
return ms_web_cam_manager_get_cam(ms_web_cam_manager_get(),"StaticImage: Static picture");
}
#endif
@ -555,7 +555,7 @@ static void transfer_already_assigned_payload_types(SalMediaDescription *old, Sa
}
static const char *linphone_call_get_bind_ip_for_stream(LinphoneCall *call, int stream_index){
const char *bind_ip=call->af==AF_INET6 ? "::0" : "0.0.0.0";
const char *bind_ip = lp_config_get_string(call->core->config,"rtp","bind_address",call->af==AF_INET6 ? "::0" : "0.0.0.0"); ;
if (stream_index<2 && call->media_ports[stream_index].multicast_ip[0]!='\0'){
if (call->dir==LinphoneCallOutgoing){
@ -611,7 +611,8 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *
md->nb_streams=(call->biggestdesc ? call->biggestdesc->nb_streams : 1);
strncpy(md->addr,call->localip,sizeof(md->addr));
strncpy(md->username,linphone_address_get_username(addr),sizeof(md->username));
if (linphone_address_get_username(addr)) /*might be null in case of identity without userinfo*/
strncpy(md->username,linphone_address_get_username(addr),sizeof(md->username));
if (subject) strncpy(md->name,subject,sizeof(md->name));
if (call->params->down_bw)
@ -647,7 +648,7 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *
ms_warning("Cannot get audio local ssrc for call [%p]",call);
nb_active_streams++;
if (call->params->has_video){
if (call->params->has_video && (!call->params->internal_call_update || !call->current_params->video_declined)){
strncpy(md->streams[1].rtp_addr,linphone_call_get_public_ip_for_stream(call,1),sizeof(md->streams[1].rtp_addr));
strncpy(md->streams[1].rtcp_addr,linphone_call_get_public_ip_for_stream(call,1),sizeof(md->streams[1].rtcp_addr));
strncpy(md->streams[1].name,"Video",sizeof(md->streams[1].name)-1);
@ -670,6 +671,8 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *
else
ms_warning("Cannot get video local ssrc for call [%p]",call);
nb_active_streams++;
} else {
ms_message("Don't put video stream on local offer for call [%p]",call);
}
if (md->nb_streams < nb_active_streams)
@ -817,7 +820,9 @@ static void linphone_call_init_common(LinphoneCall *call, LinphoneAddress *from,
linphone_call_init_stats(&call->stats[LINPHONE_CALL_STATS_AUDIO], LINPHONE_CALL_STATS_AUDIO);
linphone_call_init_stats(&call->stats[LINPHONE_CALL_STATS_VIDEO], LINPHONE_CALL_STATS_VIDEO);
#ifdef VIDEO_ENABLED
call->cam = call->core->video_conf.device;
#endif
}
void linphone_call_init_stats(LinphoneCallStats *stats, int type) {
@ -973,7 +978,6 @@ static void linphone_call_incoming_select_ip_version(LinphoneCall *call){
*/
void linphone_call_set_compatible_incoming_call_parameters(LinphoneCall *call, const SalMediaDescription *md) {
int i;
call->params->has_video &= linphone_core_media_description_contains_video_stream(md);
/* Handle AVPF, SRTP and DTLS. */
call->params->avpf_enabled = sal_media_description_has_avpf(md);
@ -1013,6 +1017,8 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro
call->core=lc;
linphone_call_incoming_select_ip_version(call);
sal_op_cnx_ip_to_0000_if_sendonly_enable(op,lp_config_get_default_int(lc->config,"sip","cnx_ip_to_0000_if_sendonly_enabled",0));
if (lc->sip_conf.ping_with_options){
#ifdef BUILD_UPNP
if (lc->upnp != NULL && linphone_core_get_firewall_policy(lc)==LinphonePolicyUseUpnp &&
@ -1171,8 +1177,11 @@ static void linphone_call_set_terminated(LinphoneCall *call){
}
void linphone_call_fix_call_parameters(LinphoneCall *call){
call->params->has_video=call->current_params->has_video;
if (sal_call_is_offerer(call->op)) {
/*get remote params*/
const LinphoneCallParams* lcp = linphone_call_get_remote_params(call);
call->current_params->video_declined = call->params->has_video && !lcp->has_video;
}
switch(call->params->media_encryption) {
case LinphoneMediaEncryptionZRTP:
case LinphoneMediaEncryptionDTLS:
@ -1292,6 +1301,11 @@ void linphone_call_set_state(LinphoneCall *call, LinphoneCallState cstate, const
linphone_core_multicast_lock_release(call->core);
#endif
break;
case LinphoneCallStreamsRunning:
if (call->prevstate == LinphoneCallUpdating || call->prevstate == LinphoneCallUpdatedByRemote) {
linphone_core_notify_display_status(lc,_("Call parameters were successfully modified."));
}
break;
default:
break;
}
@ -1651,16 +1665,17 @@ LinphoneCall *linphone_call_get_replaced_call(LinphoneCall *call){
**/
void linphone_call_enable_camera (LinphoneCall *call, bool_t enable){
#ifdef VIDEO_ENABLED
call->camera_enabled=enable;
if ((call->state==LinphoneCallStreamsRunning || call->state==LinphoneCallOutgoingEarlyMedia || call->state==LinphoneCallIncomingEarlyMedia)
&& call->videostream!=NULL ){
LinphoneCore *lc=call->core;
MSWebCam *nowebcam=get_nowebcam_device();
if (call->camera_enabled!=enable && lc->video_conf.device!=nowebcam){
video_stream_change_camera(call->videostream,
enable ? lc->video_conf.device : nowebcam);
&& call->videostream!=NULL && video_stream_started(call->videostream) ){
if (video_stream_get_camera(call->videostream) != linphone_call_get_video_device(call)) {
const char *cur_cam, *new_cam;
cur_cam = video_stream_get_camera(call->videostream) ? ms_web_cam_get_name(video_stream_get_camera(call->videostream)) : "NULL";
new_cam = linphone_call_get_video_device(call) ? ms_web_cam_get_name(linphone_call_get_video_device(call)) : "NULL";
ms_message("Switching video cam from [%s] to [%s] on call [%p]" , cur_cam, new_cam, call);
video_stream_change_camera(call->videostream, linphone_call_get_video_device(call));
}
}
call->camera_enabled=enable;
#endif
}
@ -1669,7 +1684,11 @@ void linphone_call_enable_camera (LinphoneCall *call, bool_t enable){
**/
void linphone_call_send_vfu_request(LinphoneCall *call) {
#ifdef VIDEO_ENABLED
if (call->core->sip_conf.vfu_with_info) {
const LinphoneCallParams *current_params = linphone_call_get_current_params(call);
if (current_params->avpf_enabled && call->videostream && media_stream_get_state((const MediaStream *)call->videostream) == MSStreamStarted) {
ms_message("Request Full Intra Request on call [%p]", call);
video_stream_send_fir(call->videostream);
} else if (call->core->sip_conf.vfu_with_info) {
if (LinphoneCallStreamsRunning == linphone_call_get_state(call))
sal_call_send_vfu_request(call->op);
} else {
@ -2349,7 +2368,7 @@ void static start_dtls_on_all_streams(LinphoneCall *call) {
SalMediaDescription *remote_desc = sal_call_get_remote_media_description(call->op);
SalMediaDescription *result_desc = sal_call_get_final_media_description(call->op);
if( remote_desc == NULL || result_desc == NULL ){
ms_warning("Invalid remote or result media description, disabling DTLS");
/* this can happen in some tricky cases (early-media without SDP in the 200). In that case, simply skip DTLS code */
return;
}
@ -2384,7 +2403,7 @@ void static set_dtls_fingerprint_on_all_streams(LinphoneCall *call) {
SalMediaDescription *result_desc = sal_call_get_final_media_description(call->op);
if( remote_desc == NULL || result_desc == NULL ){
ms_warning("Invalid remote or final media desc, aborting DTLS fingerprinting");
/* this can happen in some tricky cases (early-media without SDP in the 200). In that case, simply skip DTLS code */
return;
}
@ -2566,9 +2585,8 @@ static void linphone_call_start_video_stream(LinphoneCall *call, bool_t all_inpu
if (used_pt!=-1){
VideoStreamDir dir=VideoStreamSendRecv;
MSWebCam *cam=lc->video_conf.device;
bool_t is_inactive=FALSE;
MSWebCam *cam;
call->current_params->video_codec = rtp_profile_get_payload(call->video_profile, used_pt);
call->current_params->has_video=TRUE;
@ -2596,10 +2614,6 @@ static void linphone_call_start_video_stream(LinphoneCall *call, bool_t all_inpu
else
dir=VideoStreamSendOnly;
} else if (vstream->dir==SalStreamSendOnly && lc->video_conf.capture ){
if (local_st_desc->dir==SalStreamSendOnly){
/* localdesc stream dir to SendOnly is when we want to put on hold, so use nowebcam in this case*/
cam=get_nowebcam_device();
}
dir=VideoStreamSendOnly;
}else if (vstream->dir==SalStreamRecvOnly && lc->video_conf.display ){
dir=VideoStreamRecvOnly;
@ -2615,8 +2629,10 @@ static void linphone_call_start_video_stream(LinphoneCall *call, bool_t all_inpu
/*either inactive or incompatible with local capabilities*/
is_inactive=TRUE;
}
if (call->camera_enabled==FALSE || all_inputs_muted){
if (all_inputs_muted){
cam=get_nowebcam_device();
} else {
cam = linphone_call_get_video_device(call);
}
if (!is_inactive){
if (sal_stream_description_has_srtp(vstream) == TRUE) {
@ -2669,6 +2685,7 @@ static void setZrtpCryptoTypesParameters(MSZrtpParams *params, LinphoneCore *lc)
{
int i;
const MSCryptoSuite *srtp_suites;
MsZrtpCryptoTypesCount ciphersCount, authTagsCount;
if (params == NULL) return;
if (lc == NULL) return;
@ -2705,7 +2722,18 @@ static void setZrtpCryptoTypesParameters(MSZrtpParams *params, LinphoneCore *lc)
}
}
params->keyAgreementsCount = linphone_core_get_zrtp_key_agreements(lc, params->keyAgreements);
/* linphone_core_get_srtp_crypto_suites is used to determine sensible defaults; here each can be overridden */
ciphersCount = linphone_core_get_zrtp_cipher_suites(lc, params->ciphers); /* if not present in config file, params->ciphers is not modified */
if (ciphersCount!=0) { /* use zrtp_cipher_suites config only when present, keep config from srtp_crypto_suite otherwise */
params->ciphersCount = ciphersCount;
}
params->hashesCount = linphone_core_get_zrtp_hash_suites(lc, params->hashes);
authTagsCount = linphone_core_get_zrtp_auth_suites(lc, params->authTags); /* if not present in config file, params->authTags is not modified */
if (authTagsCount!=0) {
params->authTagsCount = authTagsCount; /* use zrtp_auth_suites config only when present, keep config from srtp_crypto_suite otherwise */
}
params->sasTypesCount = linphone_core_get_zrtp_sas_suites(lc, params->sasTypes);
params->keyAgreementsCount = linphone_core_get_zrtp_key_agreement_suites(lc, params->keyAgreements);
}
void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_muted, bool_t send_ringbacktone){
@ -3313,6 +3341,17 @@ static void report_bandwidth(LinphoneCall *call, MediaStream *as, MediaStream *v
call->stats[LINPHONE_CALL_STATS_AUDIO].rtcp_upload_bandwidth=(as_active) ? (media_stream_get_rtcp_up_bw(as)*1e-3) : 0;
call->stats[LINPHONE_CALL_STATS_VIDEO].rtcp_download_bandwidth=(vs_active) ? (media_stream_get_rtcp_down_bw(vs)*1e-3) : 0;
call->stats[LINPHONE_CALL_STATS_VIDEO].rtcp_upload_bandwidth=(vs_active) ? (media_stream_get_rtcp_up_bw(vs)*1e-3) : 0;
if (as_active) {
call->stats[LINPHONE_CALL_STATS_AUDIO].updated|=LINPHONE_CALL_STATS_PERIODICAL_UPDATE;
linphone_core_notify_call_stats_updated(call->core, call, &call->stats[LINPHONE_CALL_STATS_AUDIO]);
call->stats[LINPHONE_CALL_STATS_AUDIO].updated=0;
}
if (vs_active) {
call->stats[LINPHONE_CALL_STATS_VIDEO].updated|=LINPHONE_CALL_STATS_PERIODICAL_UPDATE;
linphone_core_notify_call_stats_updated(call->core, call, &call->stats[LINPHONE_CALL_STATS_VIDEO]);
call->stats[LINPHONE_CALL_STATS_VIDEO].updated=0;
}
ms_message( "Bandwidth usage for call [%p]:\n"
"\tRTP audio=[d=%5.1f,u=%5.1f], video=[d=%5.1f,u=%5.1f] kbits/sec\n"
@ -3327,6 +3366,7 @@ static void report_bandwidth(LinphoneCall *call, MediaStream *as, MediaStream *v
call->stats[LINPHONE_CALL_STATS_VIDEO].rtcp_download_bandwidth,
call->stats[LINPHONE_CALL_STATS_VIDEO].rtcp_upload_bandwidth
);
}
static void linphone_core_disconnected(LinphoneCore *lc, LinphoneCall *call){
@ -3394,6 +3434,7 @@ static void handle_ice_events(LinphoneCall *call, OrtpEvent *ev){
ice_session_select_candidates(call->ice_session);
if (ice_session_role(call->ice_session) == IR_Controlling
&& lp_config_get_int(call->core->config, "sip", "update_call_when_ice_completed", TRUE)) {
params->internal_call_update = TRUE;
linphone_core_update_call(call->core, call, params);
}
change_ice_media_destinations(call);
@ -3404,6 +3445,7 @@ static void handle_ice_events(LinphoneCall *call, OrtpEvent *ev){
ice_session_select_candidates(call->ice_session);
if (ice_session_role(call->ice_session) == IR_Controlling) {
/* At least one ICE session has succeeded, so perform a call update. */
params->internal_call_update = TRUE;
linphone_core_update_call(call->core, call, params);
}
}
@ -3499,7 +3541,13 @@ void linphone_call_notify_stats_updated(LinphoneCall *call, int stream_index){
LinphoneCallStats *stats=&call->stats[stream_index];
LinphoneCore *lc=call->core;
if (stats->updated){
linphone_reporting_on_rtcp_update(call, stream_index);
switch(stats->updated) {
case LINPHONE_CALL_STATS_RECEIVED_RTCP_UPDATE:
case LINPHONE_CALL_STATS_SENT_RTCP_UPDATE:
linphone_reporting_on_rtcp_update(call, stream_index);
break;
default:break;
}
linphone_core_notify_call_stats_updated(lc, call, stats);
stats->updated = 0;
}
@ -3563,18 +3611,29 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse
int disconnect_timeout = linphone_core_get_nortp_timeout(call->core);
bool_t disconnected=FALSE;
if ((call->state==LinphoneCallStreamsRunning || call->state==LinphoneCallOutgoingEarlyMedia || call->state==LinphoneCallIncomingEarlyMedia) && one_second_elapsed){
float audio_load=0, video_load=0;
if (call->audiostream!=NULL){
if (call->audiostream->ms.sessions.ticker)
audio_load=ms_ticker_get_average_load(call->audiostream->ms.sessions.ticker);
switch (call->state) {
case LinphoneCallStreamsRunning:
case LinphoneCallOutgoingEarlyMedia:
case LinphoneCallIncomingEarlyMedia:
case LinphoneCallPausedByRemote:
case LinphoneCallPaused:
if (one_second_elapsed){
float audio_load=0, video_load=0;
if (call->audiostream!=NULL){
if (call->audiostream->ms.sessions.ticker)
audio_load=ms_ticker_get_average_load(call->audiostream->ms.sessions.ticker);
}
if (call->videostream!=NULL){
if (call->videostream->ms.sessions.ticker)
video_load=ms_ticker_get_average_load(call->videostream->ms.sessions.ticker);
}
report_bandwidth(call,(MediaStream*)call->audiostream,(MediaStream*)call->videostream);
ms_message("Thread processing load: audio=%f\tvideo=%f",audio_load,video_load);
}
if (call->videostream!=NULL){
if (call->videostream->ms.sessions.ticker)
video_load=ms_ticker_get_average_load(call->videostream->ms.sessions.ticker);
}
report_bandwidth(call,(MediaStream*)call->audiostream,(MediaStream*)call->videostream);
ms_message("Thread processing load: audio=%f\tvideo=%f",audio_load,video_load);
break;
default:
/*no stats for other states*/
break;
}
#ifdef BUILD_UPNP
@ -3838,3 +3897,11 @@ void linphone_call_set_native_video_window_id(LinphoneCall *call, unsigned long
}
#endif
}
#ifdef VIDEO_ENABLED
MSWebCam *linphone_call_get_video_device(const LinphoneCall *call) {
if (call->camera_enabled==FALSE)
return get_nowebcam_device();
else
return call->cam;
}
#endif

View file

@ -171,6 +171,10 @@ void linphone_core_set_log_file(FILE *file) {
}
void linphone_core_set_log_level(OrtpLogLevel loglevel) {
linphone_core_set_log_level_mask(loglevel);
}
void linphone_core_set_log_level_mask(OrtpLogLevel loglevel) {
ortp_set_log_level_mask(loglevel);
if (loglevel == 0) {
sal_disable_logs();
@ -1095,7 +1099,7 @@ static bool_t get_codec(LinphoneCore *lc, SalStreamType type, int index, Payload
MSList **default_list=(type==SalAudio) ? &lc->default_audio_codecs : &lc->default_video_codecs;
if (type==SalAudio)
ms_warning("Codec %s/%i/%i read from conf is not in the default list.",mime,rate,channels);
else
else
ms_warning("Codec %s/%i read from conf is not in the default list.",mime,rate);
pt=payload_type_new();
pt->type=(type==SalAudio) ? PAYLOAD_AUDIO_PACKETIZED : PAYLOAD_VIDEO;
@ -1165,14 +1169,18 @@ static void codecs_config_read(LinphoneCore *lc)
audio_codecs=codec_append_if_new(audio_codecs, pt);
}
}
audio_codecs=add_missing_codecs(lc->default_audio_codecs,audio_codecs);
if( lp_config_get_int(lc->config, "misc", "add_missing_audio_codecs", 1) == 1 ){
audio_codecs=add_missing_codecs(lc->default_audio_codecs,audio_codecs);
}
for (i=0;get_codec(lc,SalVideo,i,&pt);i++){
if (pt){
video_codecs=codec_append_if_new(video_codecs, pt);
}
}
video_codecs=add_missing_codecs(lc->default_video_codecs,video_codecs);
if( lp_config_get_int(lc->config, "misc", "add_missing_video_codecs", 1) == 1 ){
video_codecs=add_missing_codecs(lc->default_video_codecs,video_codecs);
}
linphone_core_set_audio_codecs(lc,audio_codecs);
linphone_core_set_video_codecs(lc,video_codecs);
linphone_core_update_allocated_audio_bandwidth(lc);
@ -1314,7 +1322,7 @@ void linphone_core_set_adaptive_rate_algorithm(LinphoneCore *lc, const char* alg
* See linphone_core_set_adaptive_rate_algorithm().
**/
const char * linphone_core_get_adaptive_rate_algorithm(const LinphoneCore *lc){
return lp_config_get_string(lc->config, "net", "adaptive_rate_algorithm", "Stateful");
return lp_config_get_string(lc->config, "net", "adaptive_rate_algorithm", "Simple");
}
bool_t linphone_core_rtcp_enabled(const LinphoneCore *lc){
@ -1565,7 +1573,7 @@ static void linphone_core_register_default_codecs(LinphoneCore *lc){
const char *aac_fmtp162248, *aac_fmtp3244;
bool_t opus_enabled=TRUE;
/*default enabled audio codecs, in order of preference*/
#ifdef __arm__
#if defined(__arm__) || defined(_M_ARM)
/*hack for opus, that needs to be disabed by default on ARM single processor, otherwise there is no cpu left for video processing*/
if (ms_get_cpu_count()==1) opus_enabled=FALSE;
#endif
@ -1646,10 +1654,9 @@ static void linphone_core_init(LinphoneCore * lc, const LinphoneCoreVTable *vtab
ms_init();
linphone_core_register_default_codecs(lc);
/* create a mediastreamer2 event queue and set it as global */
/* Get the mediastreamer2 event queue */
/* This allows to run event's callback in linphone_core_iterate() */
lc->msevq=ms_event_queue_new();
ms_set_global_event_queue(lc->msevq);
lc->msevq=ms_factory_get_event_queue(ms_factory_get_fallback());
lc->sal=sal_init();
@ -1754,12 +1761,21 @@ int linphone_core_set_primary_contact(LinphoneCore *lc, const char *contact)
{
LinphoneAddress *ctt;
if( lc->sip_conf.contact != NULL && strcmp(lc->sip_conf.contact, contact) == 0){
/* changing for the same contact: no need to do anything */
return 0;
}
if ((ctt=linphone_address_new(contact))==0) {
ms_error("Bad contact url: %s",contact);
return -1;
}
if (lc->sip_conf.contact!=NULL) ms_free(lc->sip_conf.contact);
lc->sip_conf.contact=ms_strdup(contact);
lp_config_set_string(lc->config, "sip", "contact", lc->sip_conf.contact);
/* clean the guessed contact, we have to regenerate it */
if (lc->sip_conf.guessed_contact!=NULL){
ms_free(lc->sip_conf.guessed_contact);
lc->sip_conf.guessed_contact=NULL;
@ -2223,7 +2239,7 @@ int _linphone_core_apply_transports(LinphoneCore *lc){
Sal *sal=lc->sal;
const char *anyaddr;
LCSipTransports *tr=&lc->sip_conf.transports;
const char* listening_address;
/*first of all invalidate all current registrations so that we can register again with new transports*/
__linphone_core_invalidate_registers(lc);
@ -2233,24 +2249,27 @@ int _linphone_core_apply_transports(LinphoneCore *lc){
anyaddr="0.0.0.0";
sal_unlisten_ports(sal);
listening_address = lp_config_get_string(lc->config,"sip","bind_address",anyaddr);
if (lc->tunnel && linphone_tunnel_sip_enabled(lc->tunnel) && linphone_tunnel_get_activated(lc->tunnel)){
if (sal_listen_port(sal,anyaddr,tr->udp_port,SalTransportUDP,TRUE)!=0){
transport_error(lc,"udp+tunnel",tr->udp_port);
}
}else{
if (tr->udp_port!=0){
if (sal_listen_port(sal,anyaddr,tr->udp_port,SalTransportUDP,FALSE)!=0){
if (sal_listen_port(sal,listening_address,tr->udp_port,SalTransportUDP,FALSE)!=0){
transport_error(lc,"udp",tr->udp_port);
}
}
if (tr->tcp_port!=0){
if (sal_listen_port (sal,anyaddr,tr->tcp_port,SalTransportTCP,FALSE)!=0){
if (sal_listen_port (sal,listening_address,tr->tcp_port,SalTransportTCP,FALSE)!=0){
transport_error(lc,"tcp",tr->tcp_port);
}
}
if (linphone_core_sip_transport_supported(lc,LinphoneTransportTls)){
if (tr->tls_port!=0){
if (sal_listen_port (sal,anyaddr,tr->tls_port,SalTransportTLS,FALSE)!=0){
if (sal_listen_port (sal,listening_address,tr->tls_port,SalTransportTLS,FALSE)!=0){
transport_error(lc,"tls",tr->tls_port);
}
}
@ -2311,7 +2330,7 @@ int linphone_core_set_sip_transports(LinphoneCore *lc, const LCSipTransports * t
/**
* Retrieves the port configuration used for each transport (udp, tcp, tls).
* A zero value port for a given transport means the transport
* is not used. A value of LC_SIP_TRANSPORT_RANDOM (-1) means the port is to be choosen randomly by the system.
* is not used. A value of LC_SIP_TRANSPORT_RANDOM (-1) means the port is to be chosen randomly by the system.
* @ingroup network_parameters
**/
int linphone_core_get_sip_transports(LinphoneCore *lc, LCSipTransports *tr){
@ -3115,6 +3134,7 @@ void linphone_configure_op(LinphoneCore *lc, SalOp *op, const LinphoneAddress *d
sal_address_destroy(new_contact);
}
}
sal_op_cnx_ip_to_0000_if_sendonly_enable(op,lp_config_get_default_int(lc->config,"sip","cnx_ip_to_0000_if_sendonly_enabled",0)); /*also set in linphone_call_new_incoming*/
}
/**
@ -3639,7 +3659,6 @@ int _linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, cons
ms_warning("Video isn't supported in conference");
call->params->has_video = FALSE;
}
call->params->has_video &= linphone_core_media_description_contains_video_stream(remote_desc);
linphone_call_init_media_streams(call); /*so that video stream is initialized if necessary*/
if (call->ice_session != NULL) {
if (linphone_call_prepare_ice(call,TRUE)==1)
@ -4158,6 +4177,9 @@ int linphone_core_get_inc_timeout(LinphoneCore *lc){
**/
void linphone_core_set_in_call_timeout(LinphoneCore *lc, int seconds){
lc->sip_conf.in_call_timeout=seconds;
if( linphone_core_ready(lc)){
lp_config_set_int(lc->config, "sip", "in_call_timeout", seconds);
}
}
/**
@ -4809,7 +4831,7 @@ static void linphone_core_mute_audio_stream(LinphoneCore *lc, AudioStream *st, b
} else {
audio_stream_set_mic_gain_db(st, lc->sound_conf.soft_mic_lev);
}
if ( linphone_core_get_rtp_no_xmit_on_audio_mute(lc) ){
audio_stream_mute_rtp(st,val);
}
@ -6323,7 +6345,6 @@ static void linphone_core_uninit(LinphoneCore *lc)
}
#endif
ms_event_queue_destroy(lc->msevq);
lc->msevq=NULL;
/* save all config */
ui_config_uninit(lc);
@ -6886,9 +6907,7 @@ const char *linphone_media_encryption_to_string(LinphoneMediaEncryption menc){
return "INVALID";
}
/**
* Returns whether a media encryption scheme is supported by the LinphoneCore engine
**/
bool_t linphone_core_media_encryption_supported(const LinphoneCore *lc, LinphoneMediaEncryption menc){
switch(menc){
case LinphoneMediaEncryptionSRTP:

View file

@ -513,6 +513,7 @@ typedef enum _LinphoneUpnpState LinphoneUpnpState;
#define LINPHONE_CALL_STATS_RECEIVED_RTCP_UPDATE (1 << 0) /**< received_rtcp field of LinphoneCallStats object has been updated */
#define LINPHONE_CALL_STATS_SENT_RTCP_UPDATE (1 << 1) /**< sent_rtcp field of LinphoneCallStats object has been updated */
#define LINPHONE_CALL_STATS_PERIODICAL_UPDATE (1 << 2) /**< Every seconds LinphoneCallStats object has been updated */
/**
@ -529,7 +530,7 @@ typedef struct _LinphoneCallStats LinphoneCallStats;
* The LinphoneCallStats objects carries various statistic informations regarding quality of audio or video streams.
*
* To receive these informations periodically and as soon as they are computed, the application is invited to place a #LinphoneCoreCallStatsUpdatedCb callback in the LinphoneCoreVTable structure
* it passes for instanciating the LinphoneCore object (see linphone_core_new() ).
* it passes for instantiating the LinphoneCore object (see linphone_core_new() ).
*
* At any time, the application can access last computed statistics using linphone_call_get_audio_stats() or linphone_call_get_video_stats().
**/
@ -1166,7 +1167,7 @@ LINPHONE_PUBLIC const char *linphone_proxy_config_get_custom_header(LinphoneProx
/**
* Set the value of a custom header sent to the server in REGISTERs request.
* @param cfg the proxy config object
* @param header_name the header name
* @param header_name the header name
* @param header_value the header's value
**/
LINPHONE_PUBLIC void linphone_proxy_config_set_custom_header(LinphoneProxyConfig *cfg, const char *header_name, const char *header_value);
@ -2072,6 +2073,12 @@ LINPHONE_PUBLIC void linphone_core_set_log_handler(OrtpLogFunc logfunc);
* @param file A pointer to the FILE structure of the file to write to.
*/
LINPHONE_PUBLIC void linphone_core_set_log_file(FILE *file);
/**
* @deprecated Use #linphone_core_set_log_level_mask instead, which is exactly the
* same function..
**/
LINPHONE_PUBLIC void linphone_core_set_log_level(OrtpLogLevel loglevel);
/**
* Define the log level.
*
@ -2082,7 +2089,7 @@ LINPHONE_PUBLIC void linphone_core_set_log_file(FILE *file);
*
* @param loglevel A bitmask of the log levels to set.
*/
LINPHONE_PUBLIC void linphone_core_set_log_level(OrtpLogLevel loglevel);
LINPHONE_PUBLIC void linphone_core_set_log_level_mask(OrtpLogLevel loglevel);
LINPHONE_PUBLIC void linphone_core_enable_logs(FILE *file);
LINPHONE_PUBLIC void linphone_core_enable_logs_with_cb(OrtpLogFunc logfunc);
LINPHONE_PUBLIC void linphone_core_disable_logs(void);

View file

@ -2892,6 +2892,21 @@ extern "C" jobject Java_org_linphone_core_LinphoneFriendImpl_getCore(JNIEnv* en
}
return NULL;
}
extern "C" void Java_org_linphone_core_LinphoneFriendImpl_setRefKey(JNIEnv* env
,jobject thiz
,jlong ptr
,jstring jkey) {
const char* key = env->GetStringUTFChars(jkey, NULL);
linphone_friend_set_ref_key((LinphoneFriend*)ptr,key);
env->ReleaseStringUTFChars(jkey, key);
}
extern "C" jstring Java_org_linphone_core_LinphoneFriendImpl_getRefKey(JNIEnv* env
,jobject thiz
,jlong ptr) {
const char * key = linphone_friend_get_ref_key((LinphoneFriend *)ptr);
return key ? env->NewStringUTF(key) : NULL;
}
/*
* Class: org_linphone_core_LinphoneFriendImpl

View file

@ -94,7 +94,16 @@ LpItem * lp_item_new(const char *key, const char *value){
LpItem * lp_comment_new(const char *comment){
LpItem *item=lp_new0(LpItem,1);
char* pos = NULL;
item->value=ortp_strdup(comment);
pos=strchr(item->value,'\r');
if (pos==NULL)
pos=strchr(item->value,'\n');
if(pos) {
*pos='\0'; /*replace the '\n' */
}
item->is_comment=TRUE;
return item;
}
@ -567,7 +576,7 @@ void lp_config_set_float(LpConfig *lpconfig,const char *section, const char *key
void lp_item_write(LpItem *item, FILE *file){
if (item->is_comment)
fprintf(file,"%s",item->value);
fprintf(file,"%s\n",item->value);
else if (item->value && item->value[0] != '\0' )
fprintf(file,"%s=%s\n",item->key,item->value);
else {
@ -696,18 +705,12 @@ const char* lp_config_get_default_string(const LpConfig *lpconfig, const char *s
static char *_lp_config_dirname(char *path) {
#ifdef _MSC_VER
#ifdef WINAPI_FAMILY_PHONE_APP
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_splitpath(path, drive, dir, fname, ext);
return ms_strdup_printf("%s%s", drive, dir);
#else
char *dir = ms_strdup(path);
PathRemoveFileSpec(dir);
return dir;
#endif
#else
char *tmp = ms_strdup(path);
char *dir = ms_strdup(dirname(tmp));
@ -735,9 +738,14 @@ void lp_config_write_relative_file(const LpConfig *lpconfig, const char *filenam
}
int lp_config_read_relative_file(const LpConfig *lpconfig, const char *filename, char *data, size_t max_length) {
char *dir = _lp_config_dirname(lpconfig->filename);
char *filepath = ms_strdup_printf("%s/%s", dir, filename);
FILE *file = fopen(filepath, "r");
char *dir;
char *filepath;
FILE *file;
if (lpconfig->filename == NULL) return -1;
dir = _lp_config_dirname(lpconfig->filename);
filepath = ms_strdup_printf("%s/%s", dir, filename);
file = fopen(filepath, "r");
if(file != NULL) {
if(fread(data, 1, max_length, file)<=0) {
ms_error("%s could not be loaded. %s", filepath, strerror(errno));

View file

@ -537,7 +537,7 @@ void linphone_core_adapt_to_network(LinphoneCore *lc, int ping_time_ms, Linphone
static void stun_server_resolved(LinphoneCore *lc, const char *name, struct addrinfo *addrinfo){
if (lc->net_conf.stun_addrinfo){
freeaddrinfo(lc->net_conf.stun_addrinfo);
belle_sip_freeaddrinfo(lc->net_conf.stun_addrinfo);
lc->net_conf.stun_addrinfo=NULL;
}
if (addrinfo){
@ -555,7 +555,7 @@ void linphone_core_resolve_stun_server(LinphoneCore *lc){
* TODO: use IPv6 resolution if linphone_core_ipv6_enabled()==TRUE and use V4Mapped addresses for ICE gathering.
*/
const char *server=lc->net_conf.stun_server;
if (lc->sal && server){
if (lc->sal && server && !lc->net_conf.stun_res){
char host[NI_MAXHOST];
int port=3478;
linphone_parse_host_port(server,host,sizeof(host),&port);
@ -1599,14 +1599,17 @@ static char * seperate_string_list(char **str) {
}
}
MsZrtpCryptoTypesCount linphone_core_get_zrtp_key_agreements(LinphoneCore *lc, MSZrtpKeyAgreement keyAgreements[MS_MAX_ZRTP_CRYPTO_TYPES]){
char *config=strdup(lp_config_get_string(lc->config, "sip", "zrtp_key_agreements_suites", "MS_ZRTP_KEY_AGREEMENT_DH3K, MS_ZRTP_KEY_AGREEMENT_DH2K"));
char *entry;
MsZrtpCryptoTypesCount linphone_core_get_zrtp_key_agreement_suites(LinphoneCore *lc, MSZrtpKeyAgreement keyAgreements[MS_MAX_ZRTP_CRYPTO_TYPES]){
char * zrtpConfig = (char*)lp_config_get_string(lc->config, "sip", "zrtp_key_agreements_suites", NULL);
MsZrtpCryptoTypesCount key_agreements_count = 0;
if (config == NULL) return 0;
while ((entry = seperate_string_list(&config))) {
char * entry, * origPtr;
if (zrtpConfig == NULL) {
return 0;
}
origPtr = strdup(zrtpConfig);
zrtpConfig = origPtr;
while ((entry = seperate_string_list(&zrtpConfig))) {
const MSZrtpKeyAgreement agreement = ms_zrtp_key_agreement_from_string(entry);
if (agreement != MS_ZRTP_KEY_AGREEMENT_INVALID) {
ms_message("Configured zrtp key agreement: '%s'", ms_zrtp_key_agreement_to_string(agreement));
@ -1614,9 +1617,97 @@ MsZrtpCryptoTypesCount linphone_core_get_zrtp_key_agreements(LinphoneCore *lc, M
}
}
free(origPtr);
return key_agreements_count;
}
MsZrtpCryptoTypesCount linphone_core_get_zrtp_cipher_suites(LinphoneCore *lc, MSZrtpCipher ciphers[MS_MAX_ZRTP_CRYPTO_TYPES]){
char * zrtpConfig = (char*)lp_config_get_string(lc->config, "sip", "zrtp_cipher_suites", NULL);
MsZrtpCryptoTypesCount cipher_count = 0;
char * entry, * origPtr;
if (zrtpConfig == NULL) {
return 0;
}
origPtr = strdup(zrtpConfig);
zrtpConfig = origPtr;
while ((entry = seperate_string_list(&zrtpConfig))) {
const MSZrtpCipher cipher = ms_zrtp_cipher_from_string(entry);
if (cipher != MS_ZRTP_CIPHER_INVALID) {
ms_message("Configured zrtp cipher: '%s'", ms_zrtp_cipher_to_string(cipher));
ciphers[cipher_count++] = cipher;
}
}
free(origPtr);
return cipher_count;
}
MsZrtpCryptoTypesCount linphone_core_get_zrtp_hash_suites(LinphoneCore *lc, MSZrtpHash hashes[MS_MAX_ZRTP_CRYPTO_TYPES]){
char * zrtpConfig = (char*)lp_config_get_string(lc->config, "sip", "zrtp_hash_suites", NULL);
MsZrtpCryptoTypesCount hash_count = 0;
char * entry, * origPtr;
if (zrtpConfig == NULL) {
return 0;
}
origPtr = strdup(zrtpConfig);
zrtpConfig = origPtr;
while ((entry = seperate_string_list(&zrtpConfig))) {
const MSZrtpHash hash = ms_zrtp_hash_from_string(entry);
if (hash != MS_ZRTP_HASH_INVALID) {
ms_message("Configured zrtp hash: '%s'", ms_zrtp_hash_to_string(hash));
hashes[hash_count++] = hash;
}
}
free(origPtr);
return hash_count;
}
MsZrtpCryptoTypesCount linphone_core_get_zrtp_auth_suites(LinphoneCore *lc, MSZrtpAuthTag authTags[MS_MAX_ZRTP_CRYPTO_TYPES]){
char * zrtpConfig = (char*)lp_config_get_string(lc->config, "sip", "zrtp_auth_suites", NULL);
MsZrtpCryptoTypesCount auth_tag_count = 0;
char * entry, * origPtr;
if (zrtpConfig == NULL) {
return 0;
}
origPtr = strdup(zrtpConfig);
zrtpConfig = origPtr;
while ((entry = seperate_string_list(&zrtpConfig))) {
const MSZrtpAuthTag authTag = ms_zrtp_auth_tag_from_string(entry);
if (authTag != MS_ZRTP_AUTHTAG_INVALID) {
ms_message("Configured zrtp auth tag: '%s'", ms_zrtp_auth_tag_to_string(authTag));
authTags[auth_tag_count++] = authTag;
}
}
free(origPtr);
return auth_tag_count;
}
MsZrtpCryptoTypesCount linphone_core_get_zrtp_sas_suites(LinphoneCore *lc, MSZrtpSasType sasTypes[MS_MAX_ZRTP_CRYPTO_TYPES]){
char * zrtpConfig = (char*)lp_config_get_string(lc->config, "sip", "zrtp_sas_suites", NULL);
MsZrtpCryptoTypesCount sas_count = 0;
char * entry, * origPtr;
if (zrtpConfig == NULL) {
return 0;
}
origPtr = strdup(zrtpConfig);
zrtpConfig = origPtr;
while ((entry = seperate_string_list(&zrtpConfig))) {
const MSZrtpSasType type = ms_zrtp_sas_type_from_string(entry);
if (type != MS_ZRTP_SAS_INVALID) {
ms_message("Configured zrtp SAS type: '%s'", ms_zrtp_sas_type_to_string(type));
sasTypes[sas_count++] = type;
}
}
free(origPtr);
return sas_count;
}
const char ** linphone_core_get_supported_file_formats(LinphoneCore *core){
static const char *mkv="mkv";

View file

@ -110,6 +110,8 @@ struct _LinphoneCallParams{
LinphonePrivacyMask privacy;
LinphoneMediaDirection audio_dir;
LinphoneMediaDirection video_dir;
bool_t video_declined; /*use to keep traces of declined video to avoid to re-offer video in case of automatic RE-INVITE*/
bool_t internal_call_update; /*use mark that call update was requested internally (might be by ice)*/
};
@ -281,6 +283,8 @@ struct _LinphoneCall{
bool_t record_active;
bool_t paused_by_app;
MSWebCam *cam; /*webcam use for this call*/
};
BELLE_SIP_DECLARE_VPTR(LinphoneCall);
@ -438,6 +442,9 @@ void linphone_core_stop_waiting(LinphoneCore *lc);
int linphone_core_proceed_with_invite_if_ready(LinphoneCore *lc, LinphoneCall *call, LinphoneProxyConfig *dest_proxy);
int linphone_core_start_invite(LinphoneCore *lc, LinphoneCall *call, const LinphoneAddress* destination/* = NULL if to be taken from the call log */);
int linphone_core_restart_invite(LinphoneCore *lc, LinphoneCall *call);
/*
* param automatic_offering aims is to take into account previous answer for video in case of automatic re-invite.
* Purpose is to avoid to re-ask video previously declined */
int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call);
int linphone_core_start_accept_call_update(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState next_state, const char *state_info);
void linphone_core_notify_incoming_call(LinphoneCore *lc, LinphoneCall *call);
@ -1050,7 +1057,11 @@ static MS2_INLINE bool_t payload_type_enabled(const PayloadType *pt) {
bool_t is_payload_type_number_available(const MSList *l, int number, const PayloadType *ignore);
const MSCryptoSuite * linphone_core_get_srtp_crypto_suites(LinphoneCore *lc);
MsZrtpCryptoTypesCount linphone_core_get_zrtp_key_agreements(LinphoneCore *lc, MSZrtpKeyAgreement keyAgreements[MS_MAX_ZRTP_CRYPTO_TYPES]);
MsZrtpCryptoTypesCount linphone_core_get_zrtp_key_agreement_suites(LinphoneCore *lc, MSZrtpKeyAgreement keyAgreements[MS_MAX_ZRTP_CRYPTO_TYPES]);
MsZrtpCryptoTypesCount linphone_core_get_zrtp_cipher_suites(LinphoneCore *lc, MSZrtpCipher ciphers[MS_MAX_ZRTP_CRYPTO_TYPES]);
MsZrtpCryptoTypesCount linphone_core_get_zrtp_hash_suites(LinphoneCore *lc, MSZrtpHash hashes[MS_MAX_ZRTP_CRYPTO_TYPES]);
MsZrtpCryptoTypesCount linphone_core_get_zrtp_auth_suites(LinphoneCore *lc, MSZrtpAuthTag authTags[MS_MAX_ZRTP_CRYPTO_TYPES]);
MsZrtpCryptoTypesCount linphone_core_get_zrtp_sas_suites(LinphoneCore *lc, MSZrtpSasType sasTypes[MS_MAX_ZRTP_CRYPTO_TYPES]);
/** Belle Sip-based objects need unique ids
*/
@ -1165,7 +1176,10 @@ typedef struct _VTableReference VTableReference;
void v_table_reference_destroy(VTableReference *ref);
void _linphone_core_add_listener(LinphoneCore *lc, LinphoneCoreVTable *vtable, bool_t autorelease);
#ifdef VIDEO_ENABLED
MSWebCam *linphone_call_get_video_device(const LinphoneCall *call);
MSWebCam *get_nowebcam_device();
#endif
#ifdef __cplusplus
}
#endif

View file

@ -450,7 +450,7 @@ LinphoneAddress *guess_contact_for_register(LinphoneProxyConfig *obj){
* unregister without moving the register_enable flag
*/
void _linphone_proxy_config_unregister(LinphoneProxyConfig *obj) {
if (obj->state == LinphoneRegistrationOk) {
if (obj->op && obj->state == LinphoneRegistrationOk) {
sal_unregister(obj->op);
}
}

View file

@ -357,26 +357,19 @@ void display_history_message(GtkWidget *chat_view,MSList *messages,const Linphon
}
}
void linphone_gtk_chat_add_contact(const LinphoneAddress *addr){
static void linphone_gtk_chat_add_contact(const LinphoneAddress *addr){
LinphoneFriend *lf=NULL;
LinphoneAddress *fixed_uri=NULL;
gboolean show_presence=FALSE;
char *uri=linphone_address_as_string(addr);
lf=linphone_friend_new_with_address(uri);
ms_free(uri);
linphone_friend_set_inc_subscribe_policy(lf,LinphoneSPDeny);
linphone_friend_set_inc_subscribe_policy(lf,LinphoneSPWait);
linphone_friend_send_subscribe(lf,show_presence);
fixed_uri = linphone_core_interpret_url(linphone_gtk_get_core(),uri);
if (fixed_uri==NULL){
linphone_gtk_display_something(GTK_MESSAGE_WARNING,_("Invalid sip contact !"));
return ;
}
linphone_friend_set_address(lf,addr);
linphone_core_add_friend(linphone_gtk_get_core(),lf);
linphone_address_destroy(fixed_uri);
linphone_gtk_show_friends();
}

View file

@ -92,7 +92,6 @@ static gint main_window_y=0;
#endif
static gboolean verbose=0;
static gboolean quit_done=FALSE;
static gboolean auto_answer = 0;
static gchar * addr_to_call = NULL;
static int start_option = START_LINPHONE;
static gboolean no_video=FALSE;
@ -139,7 +138,6 @@ static GOptionEntry linphone_options[]={
LINPHONE_OPTION("no-video", '\0', G_OPTION_ARG_NONE, (gpointer)&no_video, N_("Start linphone with video disabled.")),
LINPHONE_OPTION("iconified", '\0', G_OPTION_ARG_NONE, (gpointer)&iconified, N_("Start only in the system tray, do not show the main interface.")),
LINPHONE_OPTION("call", 'c', G_OPTION_ARG_STRING, &addr_to_call, N_("address to call right now")),
LINPHONE_OPTION("auto-answer", 'a', G_OPTION_ARG_NONE, (gpointer) & auto_answer, N_("if set automatically answer incoming calls")),
LINPHONE_OPTION("workdir", '\0', G_OPTION_ARG_STRING, (gpointer) & workingdir, N_("Specifiy a working directory (should be the base of the installation, eg: c:\\Program Files\\Linphone)")),
LINPHONE_OPTION("config", '\0', G_OPTION_ARG_FILENAME, (gpointer) &custom_config_file, N_("Configuration file")),
LINPHONE_OPTION("run-audio-assistant", '\0', G_OPTION_ARG_NONE, (gpointer) &run_audio_assistant, N_("Run the audio assistant")),
@ -345,8 +343,18 @@ static void linphone_gtk_configure_window(GtkWidget *w, const char *window_name)
if (icon_path) {
GdkPixbuf *pbuf=create_pixbuf(icon_path);
if(pbuf != NULL) {
gtk_window_set_icon(GTK_WINDOW(w),pbuf);
GList *pbuf_list = NULL;
GdkPixbuf *pbuf_16=gdk_pixbuf_scale_simple(pbuf, 16, 16, GDK_INTERP_BILINEAR);
GdkPixbuf *pbuf_32=gdk_pixbuf_scale_simple(pbuf, 32, 32, GDK_INTERP_BILINEAR);
pbuf_list = g_list_append(pbuf_list, pbuf);
pbuf_list = g_list_append(pbuf_list, pbuf_16);
pbuf_list = g_list_append(pbuf_list, pbuf_32);
gtk_window_set_icon_list(GTK_WINDOW(w), pbuf_list);
gtk_window_set_default_icon_list(pbuf_list);
g_object_unref(G_OBJECT(pbuf_16));
g_object_unref(G_OBJECT(pbuf_32));
g_object_unref(G_OBJECT(pbuf));
g_list_free(pbuf_list);
}
}
}
@ -1375,9 +1383,10 @@ static void linphone_gtk_call_state_changed(LinphoneCore *lc, LinphoneCall *call
linphone_gtk_create_in_call_view(call);
linphone_gtk_in_call_view_set_incoming(call);
linphone_gtk_status_icon_set_blinking(TRUE);
if (auto_answer) {
if (linphone_gtk_get_ui_config_int("auto_answer", 0)) {
int delay = linphone_gtk_get_ui_config_int("auto_answer_delay", 2000);
linphone_call_ref(call);
g_timeout_add(2000,(GSourceFunc)linphone_gtk_auto_answer ,call);
g_timeout_add(delay, (GSourceFunc)linphone_gtk_auto_answer, call);
}
break;
case LinphoneCallResuming:
@ -2101,8 +2110,11 @@ int main(int argc, char *argv[]){
/*for pulseaudio:*/
g_setenv("PULSE_PROP_media.role", "phone", TRUE);
#endif
if ((lang=linphone_gtk_get_lang(config_file))!=NULL && lang[0]!='\0'){
lang=linphone_gtk_get_lang(config_file);
if (lang == NULL || lang[0]=='\0'){
lang = getenv("LANG");
}
if (lang && lang[0]!='\0'){
#ifdef WIN32
char tmp[128];
snprintf(tmp,sizeof(tmp),"LANG=%s",lang);
@ -2235,6 +2247,10 @@ core_start:
if (icon) gtk_status_icon_set_visible(icon,FALSE);
#endif
free(progpath);
/*output a translated "hello" string to the terminal, which allows the builder to check that translations are working.*/
if (selftest){
printf(_("Hello\n"));
}
return 0;
}

View file

@ -7,15 +7,10 @@
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="add_image1">
<object class="GtkImage" id="connect_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="add_image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
<property name="stock">gtk-connect</property>
</object>
<object class="GtkWindow" id="dummy_callee_frame">
<property name="can_focus">False</property>
@ -47,7 +42,6 @@
<object class="GtkButton" id="conference_control">
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
</object>
<packing>
<property name="expand">False</property>
@ -159,7 +153,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<child>
<object class="GtkHBox" id="hbox11">
<property name="visible">True</property>
@ -235,7 +228,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
</object>
<packing>
<property name="expand">False</property>
@ -262,7 +254,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="toggled" handler="linphone_gtk_record_call_toggled" swapped="no"/>
</object>
@ -349,7 +340,7 @@
<object class="GtkHBox" id="encryption_box">
<property name="can_focus">False</property>
<child>
<object class="GtkImage" id="image121">
<object class="GtkImage" id="dialog_authenticator_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-dialog-authentication</property>
@ -391,7 +382,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="linphone_gtk_auth_token_verified_clicked" swapped="no"/>
</object>
<packing>
@ -483,7 +473,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="linphone_gtk_answer_clicked" swapped="no"/>
</object>
<packing>
@ -498,7 +487,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="linphone_gtk_decline_clicked" swapped="no"/>
</object>
<packing>
@ -524,7 +512,6 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Record this call to an audio file</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="toggled" handler="linphone_gtk_record_call_toggled" swapped="no"/>
</object>
@ -567,7 +554,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
</object>
</child>
<child>
@ -576,7 +562,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="linphone_gtk_hold_clicked" swapped="no"/>
</object>
<packing>
@ -590,7 +575,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="linphone_gtk_mute_clicked" swapped="no"/>
</object>
<packing>
@ -604,7 +588,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
</object>
<packing>
<property name="top_attach">1</property>
@ -617,7 +600,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="linphone_gtk_terminate_call" swapped="no"/>
</object>
<packing>
@ -633,7 +615,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
</object>
<packing>
<property name="left_attach">2</property>
@ -711,121 +692,20 @@
<property name="can_focus">False</property>
<property name="stock">gtk-edit</property>
</object>
<object class="GtkImage" id="edit_image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-edit</property>
</object>
<object class="GtkImage" id="edit_image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-edit</property>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-info</property>
</object>
<object class="GtkImage" id="image10">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="image11">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-clear</property>
</object>
<object class="GtkImage" id="image12">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-connect</property>
</object>
<object class="GtkImage" id="image13">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="image14">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="image15">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="image16">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="image17">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<object class="GtkImage" id="image18">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-select-color</property>
</object>
<object class="GtkImage" id="image19">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-refresh</property>
</object>
<object class="GtkImage" id="image20">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="image21">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yalign">0.49000000953674316</property>
<property name="stock">gtk-properties</property>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-properties</property>
</object>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-home</property>
</object>
<object class="GtkImage" id="image5">
<object class="GtkImage" id="execute_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-execute</property>
</object>
<object class="GtkImage" id="image6">
<object class="GtkImage" id="home_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
<property name="stock">gtk-home</property>
</object>
<object class="GtkImage" id="image7">
<object class="GtkImage" id="info_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="image8">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
</object>
<object class="GtkImage" id="image9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-add</property>
<property name="stock">gtk-info</property>
</object>
<object class="GtkListStore" id="model1">
<columns>
@ -880,6 +760,18 @@
</row>
</data>
</object>
<object class="GtkImage" id="properties_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="yalign">0.49000000953674316</property>
<property name="stock">gtk-properties</property>
</object>
<object class="GtkImage" id="remove_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Delete</property>
<property name="stock">gtk-remove</property>
</object>
<object class="GtkWindow" id="main">
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
@ -898,7 +790,6 @@
<object class="GtkMenuItem" id="options_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="label" translatable="yes">_Options</property>
<property name="use_underline">True</property>
<signal name="activate" handler="linphone_gtk_options_activate" swapped="no"/>
@ -911,7 +802,6 @@
<property name="label">gtk-preferences</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="linphone_gtk_show_parameters" swapped="no"/>
@ -921,7 +811,6 @@
<object class="GtkMenuItem" id="provisionning_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="label" translatable="yes">Set configuration URI</property>
<property name="use_underline">True</property>
<signal name="activate" handler="linphone_gtk_set_configuration_uri" swapped="no"/>
@ -931,7 +820,6 @@
<object class="GtkImageMenuItem" id="disconnect_item">
<property name="label">gtk-disconnect</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="linphone_gtk_logout_clicked" swapped="no"/>
@ -947,7 +835,6 @@
<object class="GtkCheckMenuItem" id="enable_video_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="label" translatable="yes">Always start video</property>
<property name="use_underline">True</property>
<signal name="toggled" handler="linphone_gtk_enable_video" swapped="no"/>
@ -957,7 +844,6 @@
<object class="GtkCheckMenuItem" id="selfview_item">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="label" translatable="yes">Enable self-view</property>
<property name="use_underline">True</property>
<property name="active">True</property>
@ -974,7 +860,6 @@
<object class="GtkImageMenuItem" id="quit_item">
<property name="label">gtk-quit</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="gtk_main_quit" swapped="no"/>
@ -988,7 +873,6 @@
<object class="GtkMenuItem" id="menuitem4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="label" translatable="yes">_Help</property>
<property name="use_underline">True</property>
<child type="submenu">
@ -1000,7 +884,6 @@
<property name="label">gtk-about</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="linphone_gtk_show_about" swapped="no"/>
@ -1011,8 +894,7 @@
<property name="label" translatable="yes">Show debug window</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="image">image1</property>
<property name="image">info_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="linphone_gtk_log_show" swapped="no"/>
</object>
@ -1022,9 +904,8 @@
<property name="label" translatable="yes">_Homepage</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="image">image4</property>
<property name="image">home_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="linphone_gtk_link_to_website" swapped="no"/>
</object>
@ -1033,9 +914,8 @@
<object class="GtkImageMenuItem" id="versioncheck_item">
<property name="label" translatable="yes">Check _Updates</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="use_underline">True</property>
<property name="image">image5</property>
<property name="image">execute_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="linphone_gtk_check_for_new_version" swapped="no"/>
</object>
@ -1044,8 +924,7 @@
<object class="GtkImageMenuItem" id="assistant_item">
<property name="label" translatable="yes">Account assistant</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="image">image12</property>
<property name="image">connect_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="linphone_gtk_show_assistant" swapped="no"/>
</object>
@ -1055,8 +934,7 @@
<property name="label" translatable="yes">Audio assistant</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="image">image21</property>
<property name="image">properties_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="linphone_gtk_show_audio_assistant" swapped="no"/>
</object>
@ -1148,7 +1026,6 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Initiate a new call</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="linphone_gtk_start_call" swapped="no"/>
</object>
<packing>
@ -1164,7 +1041,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="linphone_gtk_start_call" swapped="no"/>
</object>
<packing>
@ -1180,7 +1056,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="linphone_gtk_create_keypad" swapped="no"/>
</object>
<packing>
@ -1266,8 +1141,7 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="resize_mode">immediate</property>
<property name="use_action_appearance">False</property>
<property name="image">add_image2</property>
<property name="image">add_image</property>
<property name="xalign">1</property>
<signal name="clicked" handler="linphone_gtk_add_button_clicked" swapped="no"/>
</object>
@ -1282,8 +1156,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="image">edit_image2</property>
<property name="image">edit_image</property>
<signal name="clicked" handler="linphone_gtk_edit_button_clicked" swapped="no"/>
</object>
<packing>
@ -1297,8 +1170,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="image">remove_image2</property>
<property name="image">remove_image</property>
<signal name="clicked" handler="linphone_gtk_remove_button_clicked" swapped="no"/>
</object>
<packing>
@ -1396,7 +1268,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="relief">none</property>
<signal name="clicked" handler="linphone_gtk_directory_search_button_clicked" swapped="no"/>
<child>
@ -1463,8 +1334,6 @@
<property name="label" translatable="yes">Add contact</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="image">image20</property>
<signal name="clicked" handler="linphone_gtk_add_contact" swapped="no"/>
</object>
<packing>
@ -1498,7 +1367,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="linphone_gtk_clear_call_logs" swapped="no"/>
</object>
@ -1597,18 +1465,44 @@
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkComboBox" id="identities">
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="model">model3</property>
<property name="active">0</property>
<signal name="changed" handler="linphone_gtk_used_identity_changed" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="renderer3"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
<object class="GtkComboBox" id="identities">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="model">model3</property>
<property name="active">0</property>
<signal name="changed" handler="linphone_gtk_used_identity_changed" swapped="no"/>
<child>
<object class="GtkCellRendererText" id="renderer3"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="presence_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="relief">none</property>
<signal name="clicked" handler="linphone_gtk_my_presence_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
@ -1636,7 +1530,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="relief">none</property>
<signal name="clicked" handler="on_proxy_refresh_button_clicked" swapped="no"/>
</object>
@ -1706,6 +1599,9 @@
<property name="can_focus">False</property>
<property name="n_rows">5</property>
<property name="n_columns">2</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkLabel" id="label8">
<property name="visible">True</property>
@ -1772,7 +1668,6 @@
<property name="can_focus">False</property>
<property name="model">model4</property>
<property name="active">0</property>
<!-- <signal name="changed" handler="linphone_gtk_internet_kind_changed" swapped="no"/> -->
<child>
<object class="GtkCellRendererText" id="renderer4"/>
<attributes>
@ -1793,7 +1688,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_action_appearance">False</property>
<property name="draw_indicator">True</property>
</object>
<packing>
@ -1829,9 +1723,6 @@
<property name="bottom_attach">3</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
@ -1862,7 +1753,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="linphone_gtk_login_frame_connect_clicked" swapped="no"/>
</object>
@ -1909,64 +1799,18 @@
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox4">
<object class="GtkStatusbar" id="status_bar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkStatusbar" id="status_bar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="spacing">2</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="presence_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="relief">none</property>
<signal name="clicked" handler="linphone_gtk_my_presence_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkImage" id="remove_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Delete</property>
<property name="stock">gtk-remove</property>
</object>
<object class="GtkImage" id="remove_image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Delete</property>
<property name="stock">gtk-remove</property>
</object>
<object class="GtkImage" id="remove_image2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Delete</property>
<property name="stock">gtk-remove</property>
</object>
</interface>

File diff suppressed because it is too large Load diff

View file

@ -1582,6 +1582,9 @@ void linphone_gtk_show_parameters(void){
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"adaptive_rate_control")),
linphone_core_adaptive_rate_control_enabled(lc));
/* CALL PARAMS CONFIG */
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb, "auto_answer_checkbox")), linphone_gtk_get_ui_config_int("auto_answer", 0));
gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "auto_answer_delay_spinbutton")), linphone_gtk_get_ui_config_int("auto_answer_delay", 2000));
/* UI CONFIG */
linphone_gtk_fill_langs(pb);
@ -1770,3 +1773,13 @@ void linphone_gtk_dscp_edit_response(GtkWidget *dialog, guint response_id){
}
gtk_widget_destroy(dialog);
}
void linphone_gtk_enable_auto_answer(GtkToggleButton *checkbox, gpointer user_data) {
gboolean auto_answer_enabled = gtk_toggle_button_get_active(checkbox);
linphone_gtk_set_ui_config_int("auto_answer", auto_answer_enabled ? 1 : 0);
}
void linphone_gtk_auto_answer_delay_changed(GtkSpinButton *spinbutton, gpointer user_data) {
int delay = gtk_spin_button_get_value(spinbutton);
linphone_gtk_set_ui_config_int("auto_answer_delay", delay);
}

View file

@ -257,8 +257,6 @@ static GtkWidget *create_video_window(LinphoneCall *call){
char *remote,*title;
GtkWidget *video_window;
const LinphoneAddress *addr;
const char *icon_path=linphone_gtk_get_ui_config("icon",LINPHONE_ICON);
GdkPixbuf *pbuf=create_pixbuf(icon_path);
guint timeout;
MSVideoSize vsize={MS_VIDEO_SIZE_CIF_W,MS_VIDEO_SIZE_CIF_H};
GdkColor color;
@ -270,9 +268,6 @@ static GtkWidget *create_video_window(LinphoneCall *call){
ms_free(remote);
gtk_window_set_title(GTK_WINDOW(video_window),title);
g_free(title);
if (pbuf){
gtk_window_set_icon(GTK_WINDOW(video_window),pbuf);
}
gtk_window_resize(GTK_WINDOW(video_window),vsize.width,vsize.height);
gdk_color_parse("black",&color);
gtk_widget_modify_bg(video_window,GTK_STATE_NORMAL,&color);

View file

@ -827,6 +827,10 @@ char* sal_op_get_public_uri(SalOp *sal);
unsigned long sal_begin_background_task(const char *name, void (*max_time_reached)(void *), void *data);
void sal_end_background_task(unsigned long id);
/*Some old equipment may not only rely on attribute sendonly/recvonly/sendrecv/inative*/
void sal_op_cnx_ip_to_0000_if_sendonly_enable(SalOp *sal,bool_t yesno);
bool_t sal_op_cnx_ip_to_0000_if_sendonly_enabled(SalOp *sal);
#endif

View file

@ -133,4 +133,16 @@ public interface LinphoneFriend {
* Return the native pointer for this object
*/
long getNativePtr();
/**
* Set the reference key of a friend.
* @param key The reference key to use for the friend.
**/
void setRefKey(String key);
/**
* Get the reference key of a friend.
* @return The reference key of the friend.
**/
String getRefKey();
}

View file

@ -36,6 +36,8 @@ class LinphoneFriendImpl implements LinphoneFriend, Serializable {
private native void done(long nativePtr);
private native void delete(long ptr);
private native Object getCore(long ptr);
private native void setRefKey(long nativePtr, String key);
private native String getRefKey(long nativePtr);
boolean ownPtr = false;
protected LinphoneFriendImpl() {
@ -103,4 +105,14 @@ class LinphoneFriendImpl implements LinphoneFriend, Serializable {
if (core!=null) return core;
else return this;
}
public void setRefKey(String key){
synchronized(getSyncObject()){
setRefKey(nativePtr,key);
}
}
public String getRefKey(){
return getRefKey(nativePtr);
}
}

View file

@ -38,7 +38,7 @@ over the internet. It has a gtk+ and console interface.
Summary: Development libraries for linphone
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
Requires: ortp-devel = @ORTP_VERSION@
Requires: ortp-devel = 1:@ORTP_VERSION@
Requires: mediastreamer-devel = @MS2_VERSION@
Requires: glib2-devel
@ -60,7 +60,6 @@ Libraries and headers required to develop software with linphone.
%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT
install -p -m 0644 pixmaps/linphone.png $RPM_BUILD_ROOT%{_datadir}/pixmaps
%find_lang %{name}
desktop-file-install \
--delete-original \
@ -88,7 +87,7 @@ rm -rf $RPM_BUILD_ROOT
%{_datadir}/applications/audio-assistant.desktop
%{_datadir}/pixmaps/linphone
%{_datadir}/linphone
%{_datadir}/pixmaps/linphone.png
%{_datadir}/icons/*
%{_datadir}/sounds/linphone
%{_datadir}/appdata/linphone.appdata.xml

View file

@ -42,7 +42,6 @@ set(PIXMAPS
hold_on.png
linphone-banner.png
linphone.icns
linphone.png
mic_active.png
mic_muted.png
notok.png
@ -62,3 +61,8 @@ install(FILES ${PIXMAPS}
DESTINATION ${PACKAGE_DATA_DIR}/pixmaps/linphone
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)
install(FILES linphone.png
DESTINATION ${PACKAGE_DATA_DIR}/icons/hicolor/48x48/apps
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)

View file

@ -1,25 +1,29 @@
pixmapdir=$(datadir)/pixmaps/linphone
pixmap_DATA= \
hold_on.png hold_off.png \
mic_muted.png mic_active.png \
linphone.png linphone-banner.png \
status-green.png \
status-orange.png \
status-red.png \
status-offline.png \
call.png \
chat.png active_chat.png composing_chat.png composing_active_chat.png\
chat_message_inprogress.png chat_message_delivered.png chat_message_not_delivered.png\
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
hold_on.png hold_off.png \
mic_muted.png mic_active.png \
linphone.png linphone-banner.png \
status-green.png \
status-orange.png \
status-red.png \
status-offline.png \
call.png \
chat.png active_chat.png composing_chat.png composing_active_chat.png\
chat_message_inprogress.png chat_message_delivered.png chat_message_not_delivered.png\
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)
iconsdir=$(datadir)/icons/hicolor/48x48/apps
icons_DATA= linphone.png
EXTRA_DIST=$(pixmap_DATA) $(icons_DATA)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

506
po/ar.po

File diff suppressed because it is too large Load diff

468
po/cs.po

File diff suppressed because it is too large Load diff

530
po/de.po

File diff suppressed because it is too large Load diff

452
po/es.po

File diff suppressed because it is too large Load diff

531
po/fr.po

File diff suppressed because it is too large Load diff

466
po/he.po

File diff suppressed because it is too large Load diff

478
po/hu.po

File diff suppressed because it is too large Load diff

438
po/it.po

File diff suppressed because it is too large Load diff

470
po/ja.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

707
po/nl.po

File diff suppressed because it is too large Load diff

419
po/pl.po
View file

@ -1,24 +1,21 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: linphone-gtk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-03-11 16:26+0100\n"
"PO-Revision-Date: 2015-02-17 11:28+0000\n"
"Last-Translator: Belledonne Communications <support@belledonne-"
"communications.com>\n"
"Language-Team: Polish (http://www.transifex.com/projects/p/linphone-gtk/"
"language/pl/)\n"
"Language: pl\n"
"POT-Creation-Date: 2015-03-27 14:40+0100\n"
"PO-Revision-Date: 2015-03-27 13:40+0000\n"
"Last-Translator: Belledonne Communications <support@belledonne-communications.com>\n"
"Language-Team: Polish (http://www.transifex.com/projects/p/linphone-gtk/language/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
"Language: pl\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:974
#, c-format
@ -92,130 +89,126 @@ msgstr ""
msgid "Couldn't find pixmap file: %s"
msgstr "Nie można znaleźć pixmapy: %s"
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
msgid "Invalid sip contact !"
msgstr ""
#: ../gtk/main.c:137
#: ../gtk/main.c:136
msgid "log to stdout some debug information while running."
msgstr ""
#: ../gtk/main.c:138
#: ../gtk/main.c:137
msgid "path to a file to write logs into."
msgstr ""
#: ../gtk/main.c:139
#: ../gtk/main.c:138
msgid "Start linphone with video disabled."
msgstr ""
#: ../gtk/main.c:140
#: ../gtk/main.c:139
msgid "Start only in the system tray, do not show the main interface."
msgstr ""
#: ../gtk/main.c:141
#: ../gtk/main.c:140
msgid "address to call right now"
msgstr ""
#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr ""
#: ../gtk/main.c:143
#: ../gtk/main.c:141
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
"Specifiy a working directory (should be the base of the installation, eg: "
"c:\\Program Files\\Linphone)"
msgstr ""
#: ../gtk/main.c:144
#: ../gtk/main.c:142
msgid "Configuration file"
msgstr ""
#: ../gtk/main.c:145
#: ../gtk/main.c:143
msgid "Run the audio assistant"
msgstr ""
#: ../gtk/main.c:146
#: ../gtk/main.c:144
msgid "Run self test and exit 0 if succeed"
msgstr ""
#: ../gtk/main.c:1061
#: ../gtk/main.c:1059
#, 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 ""
#: ../gtk/main.c:1138
#: ../gtk/main.c:1136
#, c-format
msgid ""
"Please enter your password for username <i>%s</i>\n"
" at realm <i>%s</i>:"
msgstr ""
#: ../gtk/main.c:1259
#: ../gtk/main.c:1257
msgid "Call error"
msgstr ""
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826
msgid "Call ended"
msgstr ""
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
#: ../gtk/main.c:1263 ../coreapi/call_log.c:221
msgid "Incoming call"
msgstr ""
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
msgid "Answer"
msgstr ""
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
#: ../gtk/main.c:1267 ../gtk/main.ui.h:6
msgid "Decline"
msgstr ""
#: ../gtk/main.c:1275
#: ../gtk/main.c:1273
msgid "Call paused"
msgstr ""
#: ../gtk/main.c:1275
#: ../gtk/main.c:1273
#, c-format
msgid "<b>by %s</b>"
msgstr ""
#: ../gtk/main.c:1345
#: ../gtk/main.c:1343
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
#: ../gtk/main.c:1507
#: ../gtk/main.c:1505
msgid "Website link"
msgstr ""
#: ../gtk/main.c:1556
#: ../gtk/main.c:1554
msgid "Linphone - a video internet phone"
msgstr ""
#: ../gtk/main.c:1648
#: ../gtk/main.c:1646
#, c-format
msgid "%s (Default)"
msgstr ""
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057
#, c-format
msgid "We are transferred to %s"
msgstr ""
#: ../gtk/main.c:1990
#: ../gtk/main.c:1988
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:2135
#: ../gtk/main.c:2136
msgid "A free SIP video-phone"
msgstr ""
#: ../gtk/main.c:2241
#, c-format
msgid "Hello\n"
msgstr ""
#: ../gtk/friendlist.c:505
msgid "Add to addressbook"
msgstr ""
@ -241,6 +234,10 @@ msgstr ""
msgid "Search in %s directory"
msgstr ""
#: ../gtk/friendlist.c:924
msgid "Invalid sip contact !"
msgstr ""
#: ../gtk/friendlist.c:976
#, c-format
msgid "Edit contact '%s'"
@ -281,7 +278,7 @@ msgstr "Parametr"
msgid "Enabled"
msgstr "Włączone"
#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20
#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17
msgid "Disabled"
msgstr "Wyłączone"
@ -447,7 +444,7 @@ msgstr ""
msgid "Enter your linphone.org username"
msgstr ""
#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:82 ../gtk/ldap.ui.h:4
#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4
msgid "Username:"
msgstr ""
@ -511,8 +508,7 @@ msgstr ""
#: ../gtk/setupwizard.c:413
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 ""
@ -836,7 +832,7 @@ msgstr ""
msgid "Audio Assistant"
msgstr ""
#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31
#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:32
msgid "Audio assistant"
msgstr ""
@ -913,103 +909,103 @@ msgid "Default"
msgstr ""
#: ../gtk/main.ui.h:22
msgid "_Options"
msgid "Delete"
msgstr ""
#: ../gtk/main.ui.h:23
msgid "Set configuration URI"
msgid "_Options"
msgstr ""
#: ../gtk/main.ui.h:24
msgid "Always start video"
msgid "Set configuration URI"
msgstr ""
#: ../gtk/main.ui.h:25
msgid "Enable self-view"
msgid "Always start video"
msgstr ""
#: ../gtk/main.ui.h:26
msgid "_Help"
msgid "Enable self-view"
msgstr ""
#: ../gtk/main.ui.h:27
msgid "Show debug window"
msgid "_Help"
msgstr ""
#: ../gtk/main.ui.h:28
msgid "_Homepage"
msgid "Show debug window"
msgstr ""
#: ../gtk/main.ui.h:29
msgid "Check _Updates"
msgid "_Homepage"
msgstr ""
#: ../gtk/main.ui.h:30
msgid "Check _Updates"
msgstr ""
#: ../gtk/main.ui.h:31
msgid "Account assistant"
msgstr ""
#: ../gtk/main.ui.h:32
#: ../gtk/main.ui.h:33
msgid "SIP address or phone number:"
msgstr ""
#: ../gtk/main.ui.h:33
#: ../gtk/main.ui.h:34
msgid "Initiate a new call"
msgstr ""
#: ../gtk/main.ui.h:34
#: ../gtk/main.ui.h:35
msgid "Contacts"
msgstr ""
#: ../gtk/main.ui.h:35
#: ../gtk/main.ui.h:36
msgid "Search"
msgstr ""
#: ../gtk/main.ui.h:36
#: ../gtk/main.ui.h:37
msgid "<b>Add contacts from directory</b>"
msgstr ""
#: ../gtk/main.ui.h:37
#: ../gtk/main.ui.h:38
msgid "Add contact"
msgstr ""
#: ../gtk/main.ui.h:38
#: ../gtk/main.ui.h:39
msgid "Recent calls"
msgstr ""
#: ../gtk/main.ui.h:39
#: ../gtk/main.ui.h:40
msgid "My current identity:"
msgstr ""
#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:7
msgid "Username"
msgstr ""
#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
#: ../gtk/main.ui.h:42 ../gtk/tunnel_config.ui.h:8
msgid "Password"
msgstr ""
#: ../gtk/main.ui.h:42
#: ../gtk/main.ui.h:43
msgid "Internet connection:"
msgstr ""
#: ../gtk/main.ui.h:43
#: ../gtk/main.ui.h:44
msgid "Automatically log me in"
msgstr ""
#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
#: ../gtk/main.ui.h:45 ../gtk/password.ui.h:3
msgid "UserID"
msgstr ""
#: ../gtk/main.ui.h:45
#: ../gtk/main.ui.h:46
msgid "Login information"
msgstr ""
#: ../gtk/main.ui.h:46
msgid "<b>Welcome!</b>"
msgstr ""
#: ../gtk/main.ui.h:47
msgid "Delete"
msgid "<b>Welcome!</b>"
msgstr ""
#: ../gtk/about.ui.h:1
@ -1185,299 +1181,307 @@ msgid "C"
msgstr ""
#: ../gtk/parameters.ui.h:11
msgid "SIP (UDP)"
msgstr ""
#: ../gtk/parameters.ui.h:12
msgid "SIP (TCP)"
msgstr ""
#: ../gtk/parameters.ui.h:13
msgid "SIP (TLS)"
msgstr ""
#: ../gtk/parameters.ui.h:14
msgid "Settings"
msgstr ""
#: ../gtk/parameters.ui.h:15
#: ../gtk/parameters.ui.h:12
msgid "Set Maximum Transmission Unit:"
msgstr ""
#: ../gtk/parameters.ui.h:16
#: ../gtk/parameters.ui.h:13
msgid "Send DTMFs as SIP info"
msgstr ""
#: ../gtk/parameters.ui.h:17
msgid "Use IPv6 instead of IPv4"
#: ../gtk/parameters.ui.h:14
msgid "Allow IPv6"
msgstr ""
#: ../gtk/parameters.ui.h:18
#: ../gtk/parameters.ui.h:15
msgid "<b>Transport</b>"
msgstr ""
#: ../gtk/parameters.ui.h:19
#: ../gtk/parameters.ui.h:16
msgid "SIP/UDP port"
msgstr ""
#: ../gtk/parameters.ui.h:21
#: ../gtk/parameters.ui.h:18
msgid "Random"
msgstr ""
#: ../gtk/parameters.ui.h:22
#: ../gtk/parameters.ui.h:19
msgid "SIP/TCP port"
msgstr ""
#: ../gtk/parameters.ui.h:23
#: ../gtk/parameters.ui.h:20
msgid "Audio RTP/UDP:"
msgstr ""
#: ../gtk/parameters.ui.h:24
#: ../gtk/parameters.ui.h:21
msgid "Fixed"
msgstr ""
#: ../gtk/parameters.ui.h:25
#: ../gtk/parameters.ui.h:22
msgid "Video RTP/UDP:"
msgstr ""
#: ../gtk/parameters.ui.h:26
#: ../gtk/parameters.ui.h:23
msgid "Media encryption type"
msgstr ""
#: ../gtk/parameters.ui.h:27
#: ../gtk/parameters.ui.h:24
msgid "Media encryption is mandatory"
msgstr ""
#: ../gtk/parameters.ui.h:28
#: ../gtk/parameters.ui.h:25
msgid "Tunnel"
msgstr ""
#: ../gtk/parameters.ui.h:29
#: ../gtk/parameters.ui.h:26
msgid "DSCP fields"
msgstr ""
#: ../gtk/parameters.ui.h:30
#: ../gtk/parameters.ui.h:27
msgid "<b>Network protocol and ports</b>"
msgstr ""
#: ../gtk/parameters.ui.h:31
#: ../gtk/parameters.ui.h:28
msgid "Direct connection to the Internet"
msgstr ""
#: ../gtk/parameters.ui.h:32
#: ../gtk/parameters.ui.h:29
msgid "Behind NAT / Firewall (specify gateway IP )"
msgstr ""
#: ../gtk/parameters.ui.h:33
#: ../gtk/parameters.ui.h:30
msgid "Behind NAT / Firewall (use STUN to resolve)"
msgstr ""
#: ../gtk/parameters.ui.h:34
#: ../gtk/parameters.ui.h:31
msgid "Behind NAT / Firewall (use ICE)"
msgstr ""
#: ../gtk/parameters.ui.h:35
#: ../gtk/parameters.ui.h:32
msgid "Behind NAT / Firewall (use uPnP)"
msgstr ""
#: ../gtk/parameters.ui.h:36
#: ../gtk/parameters.ui.h:33
msgid "Public IP address:"
msgstr ""
#: ../gtk/parameters.ui.h:37
#: ../gtk/parameters.ui.h:34
msgid "Stun server:"
msgstr ""
#: ../gtk/parameters.ui.h:38
#: ../gtk/parameters.ui.h:35
msgid "<b>NAT and Firewall</b>"
msgstr ""
#: ../gtk/parameters.ui.h:39
#: ../gtk/parameters.ui.h:36
msgid "Network settings"
msgstr ""
#: ../gtk/parameters.ui.h:40
#: ../gtk/parameters.ui.h:37
msgid "Ring sound:"
msgstr ""
#: ../gtk/parameters.ui.h:41
#: ../gtk/parameters.ui.h:38
msgid "ALSA special device (optional):"
msgstr ""
#: ../gtk/parameters.ui.h:42
#: ../gtk/parameters.ui.h:39
msgid "Capture device:"
msgstr ""
#: ../gtk/parameters.ui.h:43
#: ../gtk/parameters.ui.h:40
msgid "Ring device:"
msgstr ""
#: ../gtk/parameters.ui.h:44
#: ../gtk/parameters.ui.h:41
msgid "Playback device:"
msgstr ""
#: ../gtk/parameters.ui.h:45
#: ../gtk/parameters.ui.h:42
msgid "Enable echo cancellation"
msgstr ""
#: ../gtk/parameters.ui.h:46
#: ../gtk/parameters.ui.h:43
msgid "<b>Audio</b>"
msgstr ""
#: ../gtk/parameters.ui.h:47
#: ../gtk/parameters.ui.h:44
msgid "Video input device:"
msgstr ""
#: ../gtk/parameters.ui.h:48
#: ../gtk/parameters.ui.h:45
msgid "Prefered video resolution:"
msgstr ""
#: ../gtk/parameters.ui.h:49
#: ../gtk/parameters.ui.h:46
msgid "Video output method:"
msgstr ""
#: ../gtk/parameters.ui.h:50
#: ../gtk/parameters.ui.h:47
msgid "Show camera preview"
msgstr ""
#: ../gtk/parameters.ui.h:51
#: ../gtk/parameters.ui.h:48
msgid "<b>Video</b>"
msgstr ""
#: ../gtk/parameters.ui.h:52
#: ../gtk/parameters.ui.h:49
msgid "Multimedia settings"
msgstr ""
#: ../gtk/parameters.ui.h:53
#: ../gtk/parameters.ui.h:50
msgid "This section defines your SIP address when not using a SIP account"
msgstr ""
#: ../gtk/parameters.ui.h:54
#: ../gtk/parameters.ui.h:51
msgid "Your display name (eg: John Doe):"
msgstr ""
#: ../gtk/parameters.ui.h:55
#: ../gtk/parameters.ui.h:52
msgid "Your username:"
msgstr ""
#: ../gtk/parameters.ui.h:56
#: ../gtk/parameters.ui.h:53
msgid "Your resulting SIP address:"
msgstr ""
#: ../gtk/parameters.ui.h:57
#: ../gtk/parameters.ui.h:54
msgid "<b>Default identity</b>"
msgstr ""
#: ../gtk/parameters.ui.h:58
#: ../gtk/parameters.ui.h:55
msgid "Wizard"
msgstr ""
#: ../gtk/parameters.ui.h:59
#: ../gtk/parameters.ui.h:56
msgid "Add"
msgstr ""
#: ../gtk/parameters.ui.h:60
#: ../gtk/parameters.ui.h:57
msgid "Edit"
msgstr ""
#: ../gtk/parameters.ui.h:61
#: ../gtk/parameters.ui.h:58
msgid "Remove"
msgstr ""
#: ../gtk/parameters.ui.h:62
#: ../gtk/parameters.ui.h:59
msgid "<b>Proxy accounts</b>"
msgstr ""
#: ../gtk/parameters.ui.h:63
#: ../gtk/parameters.ui.h:60
msgid "Erase all passwords"
msgstr ""
#: ../gtk/parameters.ui.h:64
#: ../gtk/parameters.ui.h:61
msgid "<b>Privacy</b>"
msgstr ""
#: ../gtk/parameters.ui.h:65
#: ../gtk/parameters.ui.h:62
msgid "Automatically answer when a call is received"
msgstr ""
#: ../gtk/parameters.ui.h:63
msgid "<b>Auto-answer</b>"
msgstr ""
#: ../gtk/parameters.ui.h:64
msgid "Manage SIP Accounts"
msgstr ""
#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:4
#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4
msgid "Enable"
msgstr "Włączony"
#: ../gtk/parameters.ui.h:67 ../gtk/tunnel_config.ui.h:5
#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5
msgid "Disable"
msgstr "Wyłącz"
#: ../gtk/parameters.ui.h:68
#: ../gtk/parameters.ui.h:67
msgid "<b>Codecs</b>"
msgstr ""
#: ../gtk/parameters.ui.h:69
#: ../gtk/parameters.ui.h:68
msgid "0 stands for \"unlimited\""
msgstr ""
#: ../gtk/parameters.ui.h:70
#: ../gtk/parameters.ui.h:69
msgid "Upload speed limit in Kbit/sec:"
msgstr ""
#: ../gtk/parameters.ui.h:71
#: ../gtk/parameters.ui.h:70
msgid "Download speed limit in Kbit/sec:"
msgstr ""
#: ../gtk/parameters.ui.h:72
#: ../gtk/parameters.ui.h:71
msgid "Enable adaptive rate control"
msgstr ""
#: ../gtk/parameters.ui.h:73
#: ../gtk/parameters.ui.h:72
msgid ""
"<i>Adaptive rate control is a technique to dynamically guess the available "
"bandwidth during a call.</i>"
msgstr ""
#: ../gtk/parameters.ui.h:74
#: ../gtk/parameters.ui.h:73
msgid "<b>Bandwidth control</b>"
msgstr ""
#: ../gtk/parameters.ui.h:75
#: ../gtk/parameters.ui.h:74
msgid "Codecs"
msgstr ""
#: ../gtk/parameters.ui.h:76
#: ../gtk/parameters.ui.h:75
msgid "<b>Language</b>"
msgstr ""
#: ../gtk/parameters.ui.h:77
#: ../gtk/parameters.ui.h:76
msgid "Show advanced settings"
msgstr ""
#: ../gtk/parameters.ui.h:78
#: ../gtk/parameters.ui.h:77
msgid "<b>Level</b>"
msgstr ""
#: ../gtk/parameters.ui.h:79
#: ../gtk/parameters.ui.h:78
msgid "User interface"
msgstr ""
#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:2
#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2
msgid "Server address:"
msgstr ""
#: ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:3
#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3
msgid "Authentication method:"
msgstr ""
#: ../gtk/parameters.ui.h:83
#: ../gtk/parameters.ui.h:82
msgid "<b>LDAP Account setup</b>"
msgstr ""
#: ../gtk/parameters.ui.h:84
#: ../gtk/parameters.ui.h:83
msgid "LDAP"
msgstr ""
#: ../gtk/parameters.ui.h:85
#: ../gtk/parameters.ui.h:84
msgid "Done"
msgstr ""
#: ../gtk/parameters.ui.h:85
msgid "SIP (UDP)"
msgstr ""
#: ../gtk/parameters.ui.h:86
msgid "SIP (TCP)"
msgstr ""
#: ../gtk/parameters.ui.h:87
msgid "SIP (TLS)"
msgstr ""
#: ../gtk/buddylookup.ui.h:1
msgid "Search contacts in directory"
msgstr ""
@ -1681,11 +1685,8 @@ msgstr ""
#: ../gtk/config-uri.ui.h:2
msgid ""
"This dialog allows to set an http or https address when configuration is to "
"be fetched at startup.\n"
"Please enter or modify the configuration URI below. After clicking OK, "
"Linphone will restart automatically in order to fetch and take into account "
"the new configuration. "
"This dialog allows to set an http or https address when configuration is to be fetched at startup.\n"
"Please enter or modify the configuration URI below. After clicking OK, Linphone will restart automatically in order to fetch and take into account the new configuration. "
msgstr ""
#: ../gtk/provisioning-fetch.ui.h:1
@ -1696,60 +1697,60 @@ msgstr ""
msgid "Please wait while fetching configuration from server..."
msgstr ""
#: ../coreapi/linphonecore.c:1512
#: ../coreapi/linphonecore.c:1534
msgid "Ready"
msgstr ""
#: ../coreapi/linphonecore.c:2499
#: ../coreapi/linphonecore.c:2534
msgid "Configuring"
msgstr ""
#: ../coreapi/linphonecore.c:2673
#: ../coreapi/linphonecore.c:2708
msgid "Looking for telephone number destination..."
msgstr ""
#: ../coreapi/linphonecore.c:2675
#: ../coreapi/linphonecore.c:2710
msgid "Could not resolve this number."
msgstr ""
#. must be known at that time
#: ../coreapi/linphonecore.c:2961
#: ../coreapi/linphonecore.c:2996
msgid "Contacting"
msgstr ""
#: ../coreapi/linphonecore.c:2966
#: ../coreapi/linphonecore.c:3001
msgid "Could not call"
msgstr ""
#: ../coreapi/linphonecore.c:3116
#: ../coreapi/linphonecore.c:3152
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr ""
#: ../coreapi/linphonecore.c:3274
#: ../coreapi/linphonecore.c:3310
msgid "is contacting you"
msgstr ""
#: ../coreapi/linphonecore.c:3275
#: ../coreapi/linphonecore.c:3311
msgid " and asked autoanswer."
msgstr ""
#: ../coreapi/linphonecore.c:3399
#: ../coreapi/linphonecore.c:3435
msgid "Modifying call parameters..."
msgstr ""
#: ../coreapi/linphonecore.c:3747
#: ../coreapi/linphonecore.c:3782
msgid "Connected."
msgstr "Połączony"
#: ../coreapi/linphonecore.c:3772
#: ../coreapi/linphonecore.c:3807
msgid "Call aborted"
msgstr ""
#: ../coreapi/linphonecore.c:3962
#: ../coreapi/linphonecore.c:3997
msgid "Could not pause the call"
msgstr ""
#: ../coreapi/linphonecore.c:3965
#: ../coreapi/linphonecore.c:4000
msgid "Pausing the current call..."
msgstr ""
@ -1825,117 +1826,117 @@ msgid ""
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
msgstr ""
#: ../coreapi/proxy.c:1403
#: ../coreapi/proxy.c:1416
#, c-format
msgid "Could not login as %s"
msgstr ""
#: ../coreapi/callbacks.c:419
#: ../coreapi/callbacks.c:428
msgid "Remote ringing."
msgstr ""
#: ../coreapi/callbacks.c:431
#: ../coreapi/callbacks.c:440
msgid "Remote ringing..."
msgstr ""
#: ../coreapi/callbacks.c:448
#: ../coreapi/callbacks.c:461
msgid "Early media."
msgstr ""
#: ../coreapi/callbacks.c:521
#: ../coreapi/callbacks.c:533
#, c-format
msgid "Call with %s is paused."
msgstr ""
#: ../coreapi/callbacks.c:534
#: ../coreapi/callbacks.c:546
#, c-format
msgid "Call answered by %s - on hold."
msgstr ""
#: ../coreapi/callbacks.c:544
#: ../coreapi/callbacks.c:556
msgid "Call resumed."
msgstr ""
#: ../coreapi/callbacks.c:548
#: ../coreapi/callbacks.c:560
#, c-format
msgid "Call answered by %s."
msgstr ""
#: ../coreapi/callbacks.c:571
#: ../coreapi/callbacks.c:583
msgid "Incompatible, check codecs or security settings..."
msgstr ""
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900
msgid "Incompatible media parameters."
msgstr ""
#: ../coreapi/callbacks.c:606
#: ../coreapi/callbacks.c:618
msgid "We have been resumed."
msgstr ""
#. we are being paused
#: ../coreapi/callbacks.c:614
#: ../coreapi/callbacks.c:626
msgid "We are paused by other party."
msgstr ""
#. reINVITE and in-dialogs UPDATE go here
#: ../coreapi/callbacks.c:648
#: ../coreapi/callbacks.c:660
msgid "Call is updated by remote."
msgstr ""
#: ../coreapi/callbacks.c:764
#: ../coreapi/callbacks.c:776
msgid "Call terminated."
msgstr ""
#: ../coreapi/callbacks.c:792
#: ../coreapi/callbacks.c:804
msgid "User is busy."
msgstr "Osoba jest zajęta."
#: ../coreapi/callbacks.c:793
#: ../coreapi/callbacks.c:805
msgid "User is temporarily unavailable."
msgstr "Osoba jest tymczasowo niedostępna."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
#: ../coreapi/callbacks.c:795
#: ../coreapi/callbacks.c:807
msgid "User does not want to be disturbed."
msgstr "Osoba nie chce, aby jej przeszkadzać."
#: ../coreapi/callbacks.c:796
#: ../coreapi/callbacks.c:808
msgid "Call declined."
msgstr "Rozmowa odrzucona."
#: ../coreapi/callbacks.c:811
#: ../coreapi/callbacks.c:823
msgid "Request timeout."
msgstr ""
#: ../coreapi/callbacks.c:842
#: ../coreapi/callbacks.c:854
msgid "Redirected"
msgstr ""
#: ../coreapi/callbacks.c:897
#: ../coreapi/callbacks.c:909
msgid "Call failed."
msgstr ""
#: ../coreapi/callbacks.c:975
#: ../coreapi/callbacks.c:987
#, c-format
msgid "Registration on %s successful."
msgstr ""
#: ../coreapi/callbacks.c:976
#: ../coreapi/callbacks.c:988
#, c-format
msgid "Unregistration on %s done."
msgstr ""
#: ../coreapi/callbacks.c:994
#: ../coreapi/callbacks.c:1006
msgid "no response timeout"
msgstr ""
#: ../coreapi/callbacks.c:997
#: ../coreapi/callbacks.c:1009
#, c-format
msgid "Registration on %s failed: %s"
msgstr ""
#: ../coreapi/callbacks.c:1004
#: ../coreapi/callbacks.c:1016
msgid "Service unavailable, retrying"
msgstr ""
@ -1945,7 +1946,11 @@ msgstr ""
msgid "Authentication token is %s"
msgstr ""
#: ../coreapi/linphonecall.c:3600
#: ../coreapi/linphonecall.c:1305
msgid "Call parameters were successfully modified."
msgstr ""
#: ../coreapi/linphonecall.c:3659
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."

View file

@ -1,22 +1,20 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: linphone-gtk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-03-11 16:26+0100\n"
"PO-Revision-Date: 2015-02-17 11:28+0000\n"
"Last-Translator: Belledonne Communications <support@belledonne-"
"communications.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/"
"linphone-gtk/language/pt_BR/)\n"
"Language: pt_BR\n"
"POT-Creation-Date: 2015-03-27 14:40+0100\n"
"PO-Revision-Date: 2015-03-27 13:40+0000\n"
"Last-Translator: Belledonne Communications <support@belledonne-communications.com>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/linphone-gtk/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:974
@ -89,130 +87,126 @@ msgstr ""
msgid "Couldn't find pixmap file: %s"
msgstr "Não é possível achar arquivo pixmap: %s"
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
msgid "Invalid sip contact !"
msgstr ""
#: ../gtk/main.c:137
#: ../gtk/main.c:136
msgid "log to stdout some debug information while running."
msgstr ""
#: ../gtk/main.c:138
#: ../gtk/main.c:137
msgid "path to a file to write logs into."
msgstr ""
#: ../gtk/main.c:139
#: ../gtk/main.c:138
msgid "Start linphone with video disabled."
msgstr ""
#: ../gtk/main.c:140
#: ../gtk/main.c:139
msgid "Start only in the system tray, do not show the main interface."
msgstr ""
#: ../gtk/main.c:141
#: ../gtk/main.c:140
msgid "address to call right now"
msgstr ""
#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr ""
#: ../gtk/main.c:143
#: ../gtk/main.c:141
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
"Specifiy a working directory (should be the base of the installation, eg: "
"c:\\Program Files\\Linphone)"
msgstr ""
#: ../gtk/main.c:144
#: ../gtk/main.c:142
msgid "Configuration file"
msgstr ""
#: ../gtk/main.c:145
#: ../gtk/main.c:143
msgid "Run the audio assistant"
msgstr ""
#: ../gtk/main.c:146
#: ../gtk/main.c:144
msgid "Run self test and exit 0 if succeed"
msgstr ""
#: ../gtk/main.c:1061
#: ../gtk/main.c:1059
#, 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 ""
#: ../gtk/main.c:1138
#: ../gtk/main.c:1136
#, c-format
msgid ""
"Please enter your password for username <i>%s</i>\n"
" at realm <i>%s</i>:"
msgstr ""
#: ../gtk/main.c:1259
#: ../gtk/main.c:1257
msgid "Call error"
msgstr ""
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
#: ../gtk/main.c:1260 ../coreapi/linphonecore.c:3826
msgid "Call ended"
msgstr ""
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
#: ../gtk/main.c:1263 ../coreapi/call_log.c:221
msgid "Incoming call"
msgstr "Camadas recebidas"
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
#: ../gtk/main.c:1265 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
msgid "Answer"
msgstr ""
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
#: ../gtk/main.c:1267 ../gtk/main.ui.h:6
msgid "Decline"
msgstr ""
#: ../gtk/main.c:1275
#: ../gtk/main.c:1273
msgid "Call paused"
msgstr ""
#: ../gtk/main.c:1275
#: ../gtk/main.c:1273
#, c-format
msgid "<b>by %s</b>"
msgstr ""
#: ../gtk/main.c:1345
#: ../gtk/main.c:1343
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
#: ../gtk/main.c:1507
#: ../gtk/main.c:1505
msgid "Website link"
msgstr ""
#: ../gtk/main.c:1556
#: ../gtk/main.c:1554
msgid "Linphone - a video internet phone"
msgstr ""
#: ../gtk/main.c:1648
#: ../gtk/main.c:1646
#, c-format
msgid "%s (Default)"
msgstr ""
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
#: ../gtk/main.c:1978 ../coreapi/callbacks.c:1057
#, c-format
msgid "We are transferred to %s"
msgstr ""
#: ../gtk/main.c:1990
#: ../gtk/main.c:1988
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:2135
#: ../gtk/main.c:2136
msgid "A free SIP video-phone"
msgstr ""
#: ../gtk/main.c:2241
#, c-format
msgid "Hello\n"
msgstr ""
#: ../gtk/friendlist.c:505
msgid "Add to addressbook"
msgstr ""
@ -238,6 +232,10 @@ msgstr ""
msgid "Search in %s directory"
msgstr ""
#: ../gtk/friendlist.c:924
msgid "Invalid sip contact !"
msgstr ""
#: ../gtk/friendlist.c:976
#, c-format
msgid "Edit contact '%s'"
@ -278,7 +276,7 @@ msgstr "Parâmetros"
msgid "Enabled"
msgstr "Ativado"
#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:20
#: ../gtk/propertybox.c:622 ../gtk/propertybox.c:763 ../gtk/parameters.ui.h:17
msgid "Disabled"
msgstr "Desativado"
@ -443,7 +441,7 @@ msgstr ""
msgid "Enter your linphone.org username"
msgstr ""
#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:82 ../gtk/ldap.ui.h:4
#: ../gtk/setupwizard.c:102 ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:4
msgid "Username:"
msgstr ""
@ -507,8 +505,7 @@ msgstr ""
#: ../gtk/setupwizard.c:413
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 ""
@ -832,7 +829,7 @@ msgstr ""
msgid "Audio Assistant"
msgstr ""
#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:31
#: ../gtk/audio_assistant.c:513 ../gtk/main.ui.h:32
msgid "Audio assistant"
msgstr ""
@ -909,103 +906,103 @@ msgid "Default"
msgstr ""
#: ../gtk/main.ui.h:22
msgid "_Options"
msgid "Delete"
msgstr ""
#: ../gtk/main.ui.h:23
msgid "Set configuration URI"
msgid "_Options"
msgstr ""
#: ../gtk/main.ui.h:24
msgid "Always start video"
msgid "Set configuration URI"
msgstr ""
#: ../gtk/main.ui.h:25
msgid "Enable self-view"
msgid "Always start video"
msgstr ""
#: ../gtk/main.ui.h:26
msgid "_Help"
msgid "Enable self-view"
msgstr ""
#: ../gtk/main.ui.h:27
msgid "Show debug window"
msgid "_Help"
msgstr ""
#: ../gtk/main.ui.h:28
msgid "_Homepage"
msgid "Show debug window"
msgstr ""
#: ../gtk/main.ui.h:29
msgid "Check _Updates"
msgid "_Homepage"
msgstr ""
#: ../gtk/main.ui.h:30
msgid "Check _Updates"
msgstr ""
#: ../gtk/main.ui.h:31
msgid "Account assistant"
msgstr ""
#: ../gtk/main.ui.h:32
#: ../gtk/main.ui.h:33
msgid "SIP address or phone number:"
msgstr ""
#: ../gtk/main.ui.h:33
#: ../gtk/main.ui.h:34
msgid "Initiate a new call"
msgstr ""
#: ../gtk/main.ui.h:34
#: ../gtk/main.ui.h:35
msgid "Contacts"
msgstr ""
#: ../gtk/main.ui.h:35
#: ../gtk/main.ui.h:36
msgid "Search"
msgstr ""
#: ../gtk/main.ui.h:36
#: ../gtk/main.ui.h:37
msgid "<b>Add contacts from directory</b>"
msgstr ""
#: ../gtk/main.ui.h:37
#: ../gtk/main.ui.h:38
msgid "Add contact"
msgstr ""
#: ../gtk/main.ui.h:38
#: ../gtk/main.ui.h:39
msgid "Recent calls"
msgstr ""
#: ../gtk/main.ui.h:39
#: ../gtk/main.ui.h:40
msgid "My current identity:"
msgstr ""
#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:7
msgid "Username"
msgstr ""
#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
#: ../gtk/main.ui.h:42 ../gtk/tunnel_config.ui.h:8
msgid "Password"
msgstr ""
#: ../gtk/main.ui.h:42
#: ../gtk/main.ui.h:43
msgid "Internet connection:"
msgstr ""
#: ../gtk/main.ui.h:43
#: ../gtk/main.ui.h:44
msgid "Automatically log me in"
msgstr ""
#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
#: ../gtk/main.ui.h:45 ../gtk/password.ui.h:3
msgid "UserID"
msgstr ""
#: ../gtk/main.ui.h:45
#: ../gtk/main.ui.h:46
msgid "Login information"
msgstr ""
#: ../gtk/main.ui.h:46
msgid "<b>Welcome!</b>"
msgstr ""
#: ../gtk/main.ui.h:47
msgid "Delete"
msgid "<b>Welcome!</b>"
msgstr ""
#: ../gtk/about.ui.h:1
@ -1181,299 +1178,307 @@ msgid "C"
msgstr ""
#: ../gtk/parameters.ui.h:11
msgid "SIP (UDP)"
msgstr ""
#: ../gtk/parameters.ui.h:12
msgid "SIP (TCP)"
msgstr ""
#: ../gtk/parameters.ui.h:13
msgid "SIP (TLS)"
msgstr ""
#: ../gtk/parameters.ui.h:14
msgid "Settings"
msgstr ""
#: ../gtk/parameters.ui.h:15
#: ../gtk/parameters.ui.h:12
msgid "Set Maximum Transmission Unit:"
msgstr ""
#: ../gtk/parameters.ui.h:16
#: ../gtk/parameters.ui.h:13
msgid "Send DTMFs as SIP info"
msgstr ""
#: ../gtk/parameters.ui.h:17
msgid "Use IPv6 instead of IPv4"
#: ../gtk/parameters.ui.h:14
msgid "Allow IPv6"
msgstr ""
#: ../gtk/parameters.ui.h:18
#: ../gtk/parameters.ui.h:15
msgid "<b>Transport</b>"
msgstr ""
#: ../gtk/parameters.ui.h:19
#: ../gtk/parameters.ui.h:16
msgid "SIP/UDP port"
msgstr ""
#: ../gtk/parameters.ui.h:21
#: ../gtk/parameters.ui.h:18
msgid "Random"
msgstr ""
#: ../gtk/parameters.ui.h:22
#: ../gtk/parameters.ui.h:19
msgid "SIP/TCP port"
msgstr ""
#: ../gtk/parameters.ui.h:23
#: ../gtk/parameters.ui.h:20
msgid "Audio RTP/UDP:"
msgstr ""
#: ../gtk/parameters.ui.h:24
#: ../gtk/parameters.ui.h:21
msgid "Fixed"
msgstr ""
#: ../gtk/parameters.ui.h:25
#: ../gtk/parameters.ui.h:22
msgid "Video RTP/UDP:"
msgstr ""
#: ../gtk/parameters.ui.h:26
#: ../gtk/parameters.ui.h:23
msgid "Media encryption type"
msgstr ""
#: ../gtk/parameters.ui.h:27
#: ../gtk/parameters.ui.h:24
msgid "Media encryption is mandatory"
msgstr ""
#: ../gtk/parameters.ui.h:28
#: ../gtk/parameters.ui.h:25
msgid "Tunnel"
msgstr ""
#: ../gtk/parameters.ui.h:29
#: ../gtk/parameters.ui.h:26
msgid "DSCP fields"
msgstr ""
#: ../gtk/parameters.ui.h:30
#: ../gtk/parameters.ui.h:27
msgid "<b>Network protocol and ports</b>"
msgstr ""
#: ../gtk/parameters.ui.h:31
#: ../gtk/parameters.ui.h:28
msgid "Direct connection to the Internet"
msgstr ""
#: ../gtk/parameters.ui.h:32
#: ../gtk/parameters.ui.h:29
msgid "Behind NAT / Firewall (specify gateway IP )"
msgstr ""
#: ../gtk/parameters.ui.h:33
#: ../gtk/parameters.ui.h:30
msgid "Behind NAT / Firewall (use STUN to resolve)"
msgstr ""
#: ../gtk/parameters.ui.h:34
#: ../gtk/parameters.ui.h:31
msgid "Behind NAT / Firewall (use ICE)"
msgstr ""
#: ../gtk/parameters.ui.h:35
#: ../gtk/parameters.ui.h:32
msgid "Behind NAT / Firewall (use uPnP)"
msgstr ""
#: ../gtk/parameters.ui.h:36
#: ../gtk/parameters.ui.h:33
msgid "Public IP address:"
msgstr ""
#: ../gtk/parameters.ui.h:37
#: ../gtk/parameters.ui.h:34
msgid "Stun server:"
msgstr ""
#: ../gtk/parameters.ui.h:38
#: ../gtk/parameters.ui.h:35
msgid "<b>NAT and Firewall</b>"
msgstr ""
#: ../gtk/parameters.ui.h:39
#: ../gtk/parameters.ui.h:36
msgid "Network settings"
msgstr ""
#: ../gtk/parameters.ui.h:40
#: ../gtk/parameters.ui.h:37
msgid "Ring sound:"
msgstr ""
#: ../gtk/parameters.ui.h:41
#: ../gtk/parameters.ui.h:38
msgid "ALSA special device (optional):"
msgstr ""
#: ../gtk/parameters.ui.h:42
#: ../gtk/parameters.ui.h:39
msgid "Capture device:"
msgstr ""
#: ../gtk/parameters.ui.h:43
#: ../gtk/parameters.ui.h:40
msgid "Ring device:"
msgstr ""
#: ../gtk/parameters.ui.h:44
#: ../gtk/parameters.ui.h:41
msgid "Playback device:"
msgstr ""
#: ../gtk/parameters.ui.h:45
#: ../gtk/parameters.ui.h:42
msgid "Enable echo cancellation"
msgstr ""
#: ../gtk/parameters.ui.h:46
#: ../gtk/parameters.ui.h:43
msgid "<b>Audio</b>"
msgstr ""
#: ../gtk/parameters.ui.h:47
#: ../gtk/parameters.ui.h:44
msgid "Video input device:"
msgstr ""
#: ../gtk/parameters.ui.h:48
#: ../gtk/parameters.ui.h:45
msgid "Prefered video resolution:"
msgstr ""
#: ../gtk/parameters.ui.h:49
#: ../gtk/parameters.ui.h:46
msgid "Video output method:"
msgstr ""
#: ../gtk/parameters.ui.h:50
#: ../gtk/parameters.ui.h:47
msgid "Show camera preview"
msgstr ""
#: ../gtk/parameters.ui.h:51
#: ../gtk/parameters.ui.h:48
msgid "<b>Video</b>"
msgstr ""
#: ../gtk/parameters.ui.h:52
#: ../gtk/parameters.ui.h:49
msgid "Multimedia settings"
msgstr ""
#: ../gtk/parameters.ui.h:53
#: ../gtk/parameters.ui.h:50
msgid "This section defines your SIP address when not using a SIP account"
msgstr ""
#: ../gtk/parameters.ui.h:54
#: ../gtk/parameters.ui.h:51
msgid "Your display name (eg: John Doe):"
msgstr ""
#: ../gtk/parameters.ui.h:55
#: ../gtk/parameters.ui.h:52
msgid "Your username:"
msgstr ""
#: ../gtk/parameters.ui.h:56
#: ../gtk/parameters.ui.h:53
msgid "Your resulting SIP address:"
msgstr ""
#: ../gtk/parameters.ui.h:57
#: ../gtk/parameters.ui.h:54
msgid "<b>Default identity</b>"
msgstr ""
#: ../gtk/parameters.ui.h:58
#: ../gtk/parameters.ui.h:55
msgid "Wizard"
msgstr ""
#: ../gtk/parameters.ui.h:59
#: ../gtk/parameters.ui.h:56
msgid "Add"
msgstr ""
#: ../gtk/parameters.ui.h:60
#: ../gtk/parameters.ui.h:57
msgid "Edit"
msgstr "Editar"
#: ../gtk/parameters.ui.h:61
#: ../gtk/parameters.ui.h:58
msgid "Remove"
msgstr "Remover"
#: ../gtk/parameters.ui.h:62
#: ../gtk/parameters.ui.h:59
msgid "<b>Proxy accounts</b>"
msgstr ""
#: ../gtk/parameters.ui.h:63
#: ../gtk/parameters.ui.h:60
msgid "Erase all passwords"
msgstr ""
#: ../gtk/parameters.ui.h:64
#: ../gtk/parameters.ui.h:61
msgid "<b>Privacy</b>"
msgstr ""
#: ../gtk/parameters.ui.h:65
#: ../gtk/parameters.ui.h:62
msgid "Automatically answer when a call is received"
msgstr ""
#: ../gtk/parameters.ui.h:63
msgid "<b>Auto-answer</b>"
msgstr ""
#: ../gtk/parameters.ui.h:64
msgid "Manage SIP Accounts"
msgstr ""
#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:4
#: ../gtk/parameters.ui.h:65 ../gtk/tunnel_config.ui.h:4
msgid "Enable"
msgstr "Ativado"
#: ../gtk/parameters.ui.h:67 ../gtk/tunnel_config.ui.h:5
#: ../gtk/parameters.ui.h:66 ../gtk/tunnel_config.ui.h:5
msgid "Disable"
msgstr "Desativar"
#: ../gtk/parameters.ui.h:68
#: ../gtk/parameters.ui.h:67
msgid "<b>Codecs</b>"
msgstr ""
#: ../gtk/parameters.ui.h:69
#: ../gtk/parameters.ui.h:68
msgid "0 stands for \"unlimited\""
msgstr ""
#: ../gtk/parameters.ui.h:70
#: ../gtk/parameters.ui.h:69
msgid "Upload speed limit in Kbit/sec:"
msgstr ""
#: ../gtk/parameters.ui.h:71
#: ../gtk/parameters.ui.h:70
msgid "Download speed limit in Kbit/sec:"
msgstr ""
#: ../gtk/parameters.ui.h:72
#: ../gtk/parameters.ui.h:71
msgid "Enable adaptive rate control"
msgstr ""
#: ../gtk/parameters.ui.h:73
#: ../gtk/parameters.ui.h:72
msgid ""
"<i>Adaptive rate control is a technique to dynamically guess the available "
"bandwidth during a call.</i>"
msgstr ""
#: ../gtk/parameters.ui.h:74
#: ../gtk/parameters.ui.h:73
msgid "<b>Bandwidth control</b>"
msgstr ""
#: ../gtk/parameters.ui.h:75
#: ../gtk/parameters.ui.h:74
msgid "Codecs"
msgstr ""
#: ../gtk/parameters.ui.h:76
#: ../gtk/parameters.ui.h:75
msgid "<b>Language</b>"
msgstr ""
#: ../gtk/parameters.ui.h:77
#: ../gtk/parameters.ui.h:76
msgid "Show advanced settings"
msgstr ""
#: ../gtk/parameters.ui.h:78
#: ../gtk/parameters.ui.h:77
msgid "<b>Level</b>"
msgstr ""
#: ../gtk/parameters.ui.h:79
#: ../gtk/parameters.ui.h:78
msgid "User interface"
msgstr ""
#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:2
#: ../gtk/parameters.ui.h:79 ../gtk/ldap.ui.h:2
msgid "Server address:"
msgstr ""
#: ../gtk/parameters.ui.h:81 ../gtk/ldap.ui.h:3
#: ../gtk/parameters.ui.h:80 ../gtk/ldap.ui.h:3
msgid "Authentication method:"
msgstr ""
#: ../gtk/parameters.ui.h:83
#: ../gtk/parameters.ui.h:82
msgid "<b>LDAP Account setup</b>"
msgstr ""
#: ../gtk/parameters.ui.h:84
#: ../gtk/parameters.ui.h:83
msgid "LDAP"
msgstr ""
#: ../gtk/parameters.ui.h:85
#: ../gtk/parameters.ui.h:84
msgid "Done"
msgstr ""
#: ../gtk/parameters.ui.h:85
msgid "SIP (UDP)"
msgstr ""
#: ../gtk/parameters.ui.h:86
msgid "SIP (TCP)"
msgstr ""
#: ../gtk/parameters.ui.h:87
msgid "SIP (TLS)"
msgstr ""
#: ../gtk/buddylookup.ui.h:1
msgid "Search contacts in directory"
msgstr ""
@ -1677,11 +1682,8 @@ msgstr ""
#: ../gtk/config-uri.ui.h:2
msgid ""
"This dialog allows to set an http or https address when configuration is to "
"be fetched at startup.\n"
"Please enter or modify the configuration URI below. After clicking OK, "
"Linphone will restart automatically in order to fetch and take into account "
"the new configuration. "
"This dialog allows to set an http or https address when configuration is to be fetched at startup.\n"
"Please enter or modify the configuration URI below. After clicking OK, Linphone will restart automatically in order to fetch and take into account the new configuration. "
msgstr ""
#: ../gtk/provisioning-fetch.ui.h:1
@ -1692,60 +1694,60 @@ msgstr ""
msgid "Please wait while fetching configuration from server..."
msgstr ""
#: ../coreapi/linphonecore.c:1512
#: ../coreapi/linphonecore.c:1534
msgid "Ready"
msgstr ""
#: ../coreapi/linphonecore.c:2499
#: ../coreapi/linphonecore.c:2534
msgid "Configuring"
msgstr ""
#: ../coreapi/linphonecore.c:2673
#: ../coreapi/linphonecore.c:2708
msgid "Looking for telephone number destination..."
msgstr "Procurando por telefone de destino..."
#: ../coreapi/linphonecore.c:2675
#: ../coreapi/linphonecore.c:2710
msgid "Could not resolve this number."
msgstr "Não foi possível encontrar este número."
#. must be known at that time
#: ../coreapi/linphonecore.c:2961
#: ../coreapi/linphonecore.c:2996
msgid "Contacting"
msgstr ""
#: ../coreapi/linphonecore.c:2966
#: ../coreapi/linphonecore.c:3001
msgid "Could not call"
msgstr ""
#: ../coreapi/linphonecore.c:3116
#: ../coreapi/linphonecore.c:3152
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr ""
#: ../coreapi/linphonecore.c:3274
#: ../coreapi/linphonecore.c:3310
msgid "is contacting you"
msgstr ""
#: ../coreapi/linphonecore.c:3275
#: ../coreapi/linphonecore.c:3311
msgid " and asked autoanswer."
msgstr ""
#: ../coreapi/linphonecore.c:3399
#: ../coreapi/linphonecore.c:3435
msgid "Modifying call parameters..."
msgstr ""
#: ../coreapi/linphonecore.c:3747
#: ../coreapi/linphonecore.c:3782
msgid "Connected."
msgstr "Conectado."
#: ../coreapi/linphonecore.c:3772
#: ../coreapi/linphonecore.c:3807
msgid "Call aborted"
msgstr ""
#: ../coreapi/linphonecore.c:3962
#: ../coreapi/linphonecore.c:3997
msgid "Could not pause the call"
msgstr ""
#: ../coreapi/linphonecore.c:3965
#: ../coreapi/linphonecore.c:4000
msgid "Pausing the current call..."
msgstr ""
@ -1821,117 +1823,117 @@ msgid ""
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
msgstr ""
#: ../coreapi/proxy.c:1403
#: ../coreapi/proxy.c:1416
#, c-format
msgid "Could not login as %s"
msgstr ""
#: ../coreapi/callbacks.c:419
#: ../coreapi/callbacks.c:428
msgid "Remote ringing."
msgstr ""
#: ../coreapi/callbacks.c:431
#: ../coreapi/callbacks.c:440
msgid "Remote ringing..."
msgstr ""
#: ../coreapi/callbacks.c:448
#: ../coreapi/callbacks.c:461
msgid "Early media."
msgstr ""
#: ../coreapi/callbacks.c:521
#: ../coreapi/callbacks.c:533
#, c-format
msgid "Call with %s is paused."
msgstr ""
#: ../coreapi/callbacks.c:534
#: ../coreapi/callbacks.c:546
#, c-format
msgid "Call answered by %s - on hold."
msgstr ""
#: ../coreapi/callbacks.c:544
#: ../coreapi/callbacks.c:556
msgid "Call resumed."
msgstr ""
#: ../coreapi/callbacks.c:548
#: ../coreapi/callbacks.c:560
#, c-format
msgid "Call answered by %s."
msgstr ""
#: ../coreapi/callbacks.c:571
#: ../coreapi/callbacks.c:583
msgid "Incompatible, check codecs or security settings..."
msgstr ""
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
#: ../coreapi/callbacks.c:588 ../coreapi/callbacks.c:900
msgid "Incompatible media parameters."
msgstr ""
#: ../coreapi/callbacks.c:606
#: ../coreapi/callbacks.c:618
msgid "We have been resumed."
msgstr ""
#. we are being paused
#: ../coreapi/callbacks.c:614
#: ../coreapi/callbacks.c:626
msgid "We are paused by other party."
msgstr ""
#. reINVITE and in-dialogs UPDATE go here
#: ../coreapi/callbacks.c:648
#: ../coreapi/callbacks.c:660
msgid "Call is updated by remote."
msgstr ""
#: ../coreapi/callbacks.c:764
#: ../coreapi/callbacks.c:776
msgid "Call terminated."
msgstr ""
#: ../coreapi/callbacks.c:792
#: ../coreapi/callbacks.c:804
msgid "User is busy."
msgstr "Usuário está ocupado."
#: ../coreapi/callbacks.c:793
#: ../coreapi/callbacks.c:805
msgid "User is temporarily unavailable."
msgstr "Usuário está temporáriamente indisponível."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
#: ../coreapi/callbacks.c:795
#: ../coreapi/callbacks.c:807
msgid "User does not want to be disturbed."
msgstr ""
#: ../coreapi/callbacks.c:796
#: ../coreapi/callbacks.c:808
msgid "Call declined."
msgstr ""
#: ../coreapi/callbacks.c:811
#: ../coreapi/callbacks.c:823
msgid "Request timeout."
msgstr ""
#: ../coreapi/callbacks.c:842
#: ../coreapi/callbacks.c:854
msgid "Redirected"
msgstr ""
#: ../coreapi/callbacks.c:897
#: ../coreapi/callbacks.c:909
msgid "Call failed."
msgstr ""
#: ../coreapi/callbacks.c:975
#: ../coreapi/callbacks.c:987
#, c-format
msgid "Registration on %s successful."
msgstr ""
#: ../coreapi/callbacks.c:976
#: ../coreapi/callbacks.c:988
#, c-format
msgid "Unregistration on %s done."
msgstr ""
#: ../coreapi/callbacks.c:994
#: ../coreapi/callbacks.c:1006
msgid "no response timeout"
msgstr ""
#: ../coreapi/callbacks.c:997
#: ../coreapi/callbacks.c:1009
#, c-format
msgid "Registration on %s failed: %s"
msgstr ""
#: ../coreapi/callbacks.c:1004
#: ../coreapi/callbacks.c:1016
msgid "Service unavailable, retrying"
msgstr ""
@ -1941,7 +1943,11 @@ msgstr ""
msgid "Authentication token is %s"
msgstr ""
#: ../coreapi/linphonecall.c:3600
#: ../coreapi/linphonecall.c:1305
msgid "Call parameters were successfully modified."
msgstr ""
#: ../coreapi/linphonecall.c:3659
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."

530
po/ru.po

File diff suppressed because it is too large Load diff

522
po/sr.po

File diff suppressed because it is too large Load diff

443
po/sv.po

File diff suppressed because it is too large Load diff

1991
po/tr.po Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -7,6 +7,6 @@ Comment[fr]=Assistant audio de Linphone.
Comment[ru]=Помощник аудио Linphone
Type=Application
Exec=linphone --run-audio-assistant
Icon=@prefix@/share/pixmaps/linphone/linphone.png
Icon=linphone
Terminal=false
Categories=Network;Telephony;

View file

@ -4,7 +4,7 @@ GenericName=Web-phone
Comment=Linphone is a web-phone
Type=Application
Exec=linphone
Icon=@prefix@/share/pixmaps/linphone/linphone.png
Icon=linphone
Terminal=false
Categories=Network;Telephony;

View file

@ -84,11 +84,17 @@ void call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState
void call_stats_updated(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallStats *lstats) {
stats* counters = get_stats(lc);
counters->number_of_LinphoneCallStatsUpdated++;
if (lstats->updated == LINPHONE_CALL_STATS_RECEIVED_RTCP_UPDATE) {
counters->number_of_rtcp_received++;
} else if (lstats->updated == LINPHONE_CALL_STATS_SENT_RTCP_UPDATE) {
counters->number_of_rtcp_sent++;
}
counters->audio_download_bandwidth = linphone_call_get_audio_stats(call)->download_bandwidth;
counters->audio_upload_bandwidth = linphone_call_get_audio_stats(call)->upload_bandwidth;
counters->video_download_bandwidth = linphone_call_get_video_stats(call)->download_bandwidth;
counters->video_upload_bandwidth = linphone_call_get_video_stats(call)->upload_bandwidth;
}
void linphone_call_encryption_changed(LinphoneCore *lc, LinphoneCall *call, bool_t on, const char *authentication_token) {
@ -260,7 +266,7 @@ bool_t call_with_params2(LinphoneCoreManager* caller_mgr
linphone_core_accept_call_with_params(callee_mgr->lc,linphone_core_get_current_call(callee_mgr->lc),callee_params);
}else if (build_callee_params){
LinphoneCallParams *default_params=linphone_core_create_call_params(callee_mgr->lc,linphone_core_get_current_call(callee_mgr->lc));
ms_error("Created default call params with video=%i", linphone_call_params_video_enabled(default_params));
ms_message("Created default call params with video=%i", linphone_call_params_video_enabled(default_params));
linphone_core_accept_call_with_params(callee_mgr->lc,linphone_core_get_current_call(callee_mgr->lc),default_params);
linphone_call_params_destroy(default_params);
}else{
@ -1295,7 +1301,51 @@ bool_t pause_call_1(LinphoneCoreManager* mgr_1,LinphoneCall* call_1,LinphoneCore
CU_ASSERT_EQUAL(linphone_call_get_state(call_2),LinphoneCallPausedByRemote);
return linphone_call_get_state(call_1) == LinphoneCallPaused && linphone_call_get_state(call_2)==LinphoneCallPausedByRemote;
}
#if 0
void concurrent_paused_resumed_base() {
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
LinphoneCall* call_pauline,call_marie;
const rtp_stats_t * stats;
CU_ASSERT_TRUE(call(pauline,marie));
call_pauline = linphone_core_get_current_call(pauline->lc);
call_marie = linphone_core_get_current_call(marie->lc);
linphone_core_pause_call(pauline->lc,call_pauline);
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPausing,1));
linphone_core_pause_call(marie->lc,call_marie);
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallPausedByRemote,1));
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallPaused,1));
/*stay in pause a little while in order to generate traffic*/
wait_for_until(pauline->lc, marie->lc, NULL, 5, 2000);
linphone_core_resume_call(pauline->lc,call_pauline);
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2));
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2));
/*same here: wait a while for a bit of a traffic, we need to receive a RTCP packet*/
wait_for_until(pauline->lc, marie->lc, NULL, 5, 5000);
/*since RTCP streams are reset when call is paused/resumed, there should be no loss at all*/
stats = rtp_session_get_stats(call_pauline->sessions->rtp_session);
CU_ASSERT_EQUAL(stats->cum_packet_loss, 0);
/*just to sleep*/
linphone_core_terminate_all_calls(pauline->lc);
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1));
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1));
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
}
#endif
static void call_paused_resumed_from_callee(void) {
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
@ -1614,7 +1664,7 @@ static void call_with_declined_video_using_policy(void) {
call_with_declined_video_base(TRUE);
}
static void video_call_base(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t using_policy,LinphoneMediaEncryption mode, bool_t callee_video_enabled, bool_t caller_video_enabled) {
static void video_call_base_2(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t using_policy,LinphoneMediaEncryption mode, bool_t callee_video_enabled, bool_t caller_video_enabled) {
LinphoneCallTestParams caller_test_params = {0}, callee_test_params = {0};
LinphoneCall* marie_call;
LinphoneCall* pauline_call;
@ -1689,12 +1739,15 @@ static void video_call_base(LinphoneCoreManager* pauline,LinphoneCoreManager* ma
liblinphone_tester_check_rtcp(marie,pauline);
linphone_core_terminate_all_calls(pauline->lc);
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1));
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1));
}
}
static void video_call_base(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t using_policy,LinphoneMediaEncryption mode, bool_t callee_video_enabled, bool_t caller_video_enabled) {
video_call_base_2(pauline,marie,using_policy,mode,callee_video_enabled,caller_video_enabled);
linphone_core_terminate_all_calls(pauline->lc);
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallEnd,1));
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallEnd,1));
}
static void video_call(void) {
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
@ -2033,6 +2086,18 @@ static void srtp_call() {
static void zrtp_call() {
call_base(LinphoneMediaEncryptionZRTP,FALSE,FALSE,LinphonePolicyNoFirewall,FALSE);
}
static void zrtp_sas_call() {
call_base_with_configfile(LinphoneMediaEncryptionZRTP,FALSE,FALSE,LinphonePolicyNoFirewall,FALSE, "marie_zrtp_b256_rc", "pauline_zrtp_b256_rc");
call_base_with_configfile(LinphoneMediaEncryptionZRTP,FALSE,FALSE,LinphonePolicyNoFirewall,FALSE, "marie_zrtp_b256_rc", "pauline_rc");
}
static void zrtp_cipher_call() {
call_base_with_configfile(LinphoneMediaEncryptionZRTP,FALSE,FALSE,LinphonePolicyNoFirewall,FALSE, "marie_zrtp_srtpsuite_aes256_rc", "pauline_zrtp_srtpsuite_aes256_rc");
call_base_with_configfile(LinphoneMediaEncryptionZRTP,FALSE,FALSE,LinphonePolicyNoFirewall,FALSE, "marie_zrtp_aes256_rc", "pauline_zrtp_aes256_rc");
call_base_with_configfile(LinphoneMediaEncryptionZRTP,FALSE,FALSE,LinphonePolicyNoFirewall,FALSE, "marie_zrtp_aes256_rc", "pauline_rc");
}
static void zrtp_video_call() {
call_base(LinphoneMediaEncryptionZRTP,TRUE,FALSE,LinphonePolicyNoFirewall,FALSE);
}
@ -2221,9 +2286,9 @@ end:
}
void call_base(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_relay,LinphoneFirewallPolicy policy,bool_t enable_tunnel) {
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_relay,LinphoneFirewallPolicy policy,bool_t enable_tunnel, const char *marie_rc, const char *pauline_rc) {
LinphoneCoreManager* marie = linphone_core_manager_new(marie_rc);
LinphoneCoreManager* pauline = linphone_core_manager_new(pauline_rc);
if (enable_relay) {
linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL);
linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL);
@ -2270,10 +2335,10 @@ void call_base(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_r
&&
linphone_call_get_authentication_token(linphone_core_get_current_call(marie->lc))) {
/*check SAS*/
CU_ASSERT_STRING_EQUAL(linphone_call_get_authentication_token(linphone_core_get_current_call(pauline->lc))
,linphone_call_get_authentication_token(linphone_core_get_current_call(marie->lc)));
liblinphone_tester_check_rtcp(pauline,marie);
break;
CU_ASSERT_STRING_EQUAL(linphone_call_get_authentication_token(linphone_core_get_current_call(pauline->lc))
,linphone_call_get_authentication_token(linphone_core_get_current_call(marie->lc)));
liblinphone_tester_check_rtcp(pauline,marie);
break;
}
linphone_core_iterate(marie->lc);
linphone_core_iterate(pauline->lc);
@ -2318,6 +2383,11 @@ void call_base(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_r
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
}
void call_base(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_relay,LinphoneFirewallPolicy policy,bool_t enable_tunnel) {
call_base_with_configfile(mode, enable_video, enable_relay, policy, enable_tunnel, "marie_rc", "pauline_rc");
}
#ifdef VIDEO_ENABLED
static void srtp_video_ice_call(void) {
call_base(LinphoneMediaEncryptionSRTP,TRUE,FALSE,LinphonePolicyUseIce,FALSE);
@ -2838,6 +2908,186 @@ static void multiple_early_media(void) {
linphone_core_manager_destroy(marie2);
linphone_core_manager_destroy(pauline);
}
static void check_media_direction(LinphoneCoreManager* mgr, LinphoneCall *call, MSList* lcs,LinphoneMediaDirection audio_dir, LinphoneMediaDirection video_dir) {
CU_ASSERT_PTR_NOT_NULL(call);
if (call) {
int current_recv_iframe = mgr->stat.number_of_IframeDecoded;
int expected_recv_iframe=0;
int dummy = 0;
const LinphoneCallParams *params = linphone_call_get_current_params(call);
CU_ASSERT_EQUAL(audio_dir,linphone_call_params_get_audio_direction(params));
CU_ASSERT_EQUAL(video_dir,linphone_call_params_get_video_direction(params));
linphone_call_set_next_video_frame_decoded_callback(call,linphone_call_cb,mgr->lc);
linphone_call_send_vfu_request(call);
wait_for_list(lcs,&dummy,1,2000); /*on some device, it may take 3 to 4s to get audio from mic*/
switch (video_dir) {
case LinphoneMediaDirectionInactive:
CU_ASSERT_TRUE(linphone_call_get_video_stats(call)->upload_bandwidth<5);
case LinphoneMediaDirectionSendOnly:
expected_recv_iframe = 0;
CU_ASSERT_TRUE(linphone_call_get_video_stats(call)->download_bandwidth<5);
break;
case LinphoneMediaDirectionRecvOnly:
CU_ASSERT_TRUE(linphone_call_get_video_stats(call)->upload_bandwidth<5);
case LinphoneMediaDirectionSendRecv:
expected_recv_iframe = 1;
break;
}
CU_ASSERT_TRUE(wait_for_list(lcs, &mgr->stat.number_of_IframeDecoded,current_recv_iframe + expected_recv_iframe,3000));
switch (audio_dir) {
case LinphoneMediaDirectionInactive:
CU_ASSERT_TRUE(linphone_call_get_audio_stats(call)->upload_bandwidth<5);
case LinphoneMediaDirectionSendOnly:
CU_ASSERT_TRUE(linphone_call_get_video_stats(call)->download_bandwidth<5);
if (audio_dir == LinphoneMediaDirectionSendOnly) CU_ASSERT_TRUE(wait_for_list(lcs,&mgr->stat.audio_upload_bandwidth,70,4000));
break;
case LinphoneMediaDirectionRecvOnly:
CU_ASSERT_TRUE(linphone_call_get_audio_stats(call)->upload_bandwidth<5);
case LinphoneMediaDirectionSendRecv:
CU_ASSERT_TRUE(wait_for_list(lcs,&mgr->stat.audio_download_bandwidth,70,4000));
if (audio_dir == LinphoneMediaDirectionSendRecv) CU_ASSERT_TRUE(wait_for_list(lcs,&mgr->stat.audio_upload_bandwidth,70,4000));
break;
}
}
}
static void accept_call_in_send_only_base(LinphoneCoreManager* pauline, LinphoneCoreManager *marie, MSList *lcs) {
#define DEFAULT_WAIT_FOR 10000
LinphoneCallParams *params;
LinphoneVideoPolicy pol;
LinphoneCall *call;
pol.automatically_accept=1;
pol.automatically_initiate=1;
linphone_core_enable_video(pauline->lc,TRUE,TRUE);
linphone_core_set_video_policy(pauline->lc,&pol);
linphone_core_set_video_device(pauline->lc,"Mire: Mire (synthetic moving picture)");
linphone_core_enable_video(marie->lc,TRUE,TRUE);
linphone_core_set_video_policy(marie->lc,&pol);
linphone_core_set_video_device(marie->lc,"Mire: Mire (synthetic moving picture)");
linphone_call_set_next_video_frame_decoded_callback(linphone_core_invite_address(pauline->lc,marie->identity)
,linphone_call_cb
,pauline->lc);
CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallIncomingReceived,1,DEFAULT_WAIT_FOR));
{
char* remote_uri = linphone_address_as_string_uri_only(pauline->identity);
call = linphone_core_find_call_from_uri(marie->lc,remote_uri);
ms_free(remote_uri);
}
if (call) {
params=linphone_core_create_default_call_parameters(marie->lc);
linphone_call_params_set_audio_direction(params,LinphoneMediaDirectionSendOnly);
linphone_call_params_set_video_direction(params,LinphoneMediaDirectionSendOnly);
linphone_core_accept_call_with_params(marie->lc,call,params);
linphone_call_params_destroy(params);
CU_ASSERT_TRUE(wait_for_list(lcs, &marie->stat.number_of_LinphoneCallStreamsRunning,1,DEFAULT_WAIT_FOR));
CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallPausedByRemote,1,DEFAULT_WAIT_FOR));
check_media_direction(marie,call,lcs,LinphoneMediaDirectionSendOnly,LinphoneMediaDirectionSendOnly);
}
call=linphone_core_get_current_call(pauline->lc);
if (call) {
check_media_direction(pauline,call,lcs,LinphoneMediaDirectionRecvOnly,LinphoneMediaDirectionRecvOnly);
}
}
static void accept_call_in_send_base(bool_t caller_has_ice) {
int begin;
int leaked_objects;
LinphoneCoreManager *pauline, *marie;
MSList *lcs=NULL;;
belle_sip_object_enable_leak_detector(TRUE);
begin=belle_sip_object_get_object_count();
pauline = linphone_core_manager_new("pauline_rc");
if (caller_has_ice) {
linphone_core_set_stun_server(pauline->lc,"stun.linphone.org");
linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce);
}
marie = linphone_core_manager_new("marie_rc");
lcs=ms_list_append(lcs,pauline->lc);
lcs=ms_list_append(lcs,marie->lc);
accept_call_in_send_only_base(pauline,marie,lcs);
end_call(marie,pauline);
ms_free(lcs);
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
leaked_objects=belle_sip_object_get_object_count()-begin;
CU_ASSERT_TRUE(leaked_objects==0);
if (leaked_objects>0){
belle_sip_object_dump_active_objects();
}
}
static void accept_call_in_send_only(void) {
accept_call_in_send_base(FALSE);
}
static void accept_call_in_send_only_with_ice(void) {
accept_call_in_send_base(TRUE);
}
void two_accepted_call_in_send_only() {
int begin;
int leaked_objects;
LinphoneCoreManager *pauline, *marie, *laure;
MSList *lcs=NULL;
belle_sip_object_enable_leak_detector(TRUE);
begin=belle_sip_object_get_object_count();
pauline = linphone_core_manager_new("pauline_rc");
marie = linphone_core_manager_new("marie_rc");
laure = linphone_core_manager_new("laure_rc");
lcs=ms_list_append(lcs,pauline->lc);
lcs=ms_list_append(lcs,marie->lc);
lcs=ms_list_append(lcs,laure->lc);
accept_call_in_send_only_base(pauline,marie,lcs);
reset_counters(&marie->stat);
accept_call_in_send_only_base(laure,marie,lcs);
end_call(marie,pauline);
end_call(laure,marie);
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
linphone_core_manager_destroy(laure);
leaked_objects=belle_sip_object_get_object_count()-begin;
CU_ASSERT_TRUE(leaked_objects==0);
if (leaked_objects>0){
belle_sip_object_dump_active_objects();
}
}
#endif
static char *create_filepath(const char *dir, const char *filename, const char *ext) {
@ -3501,6 +3751,87 @@ static void call_with_transport_change_after_released(void) {
static void unsucessfull_call_with_transport_change_after_released(void) {
call_with_transport_change_base(FALSE);
}
#ifdef VIDEO_ENABLED
static void video_call_with_re_invite_inactive_followed_by_re_invite_base(bool_t no_sdp) {
int begin;
int leaked_objects;
LinphoneCoreManager* marie;
LinphoneCoreManager* pauline;
LinphoneCallParams *params;
MSList *lcs=NULL;
belle_sip_object_enable_leak_detector(TRUE);
begin=belle_sip_object_get_object_count();
marie = linphone_core_manager_new( "marie_rc");
pauline = linphone_core_manager_new( "pauline_rc");
linphone_core_set_avpf_mode(pauline->lc,TRUE);
linphone_core_set_video_device(pauline->lc,"Mire: Mire (synthetic moving picture)");
linphone_core_set_video_device(marie->lc,"Mire: Mire (synthetic moving picture)");
linphone_core_set_avpf_mode(marie->lc,TRUE);
lcs=ms_list_append(lcs,pauline->lc);
lcs=ms_list_append(lcs,marie->lc);
video_call_base_2(marie,pauline,TRUE,LinphoneMediaEncryptionNone,TRUE,TRUE);
if (linphone_core_get_current_call(marie->lc)) {
params=linphone_core_create_call_params(marie->lc,linphone_core_get_current_call(marie->lc));
linphone_call_params_set_audio_direction(params,LinphoneMediaDirectionInactive);
linphone_call_params_set_video_direction(params,LinphoneMediaDirectionInactive);
linphone_core_update_call(marie->lc, linphone_core_get_current_call(marie->lc),params);
linphone_call_params_destroy(params);
CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallUpdating,1));
CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallPaused,1));
CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallPausedByRemote,1));
check_media_direction(marie,linphone_core_get_current_call(marie->lc),lcs,LinphoneMediaDirectionInactive,LinphoneMediaDirectionInactive);
check_media_direction(pauline,linphone_core_get_current_call(pauline->lc), lcs, LinphoneMediaDirectionInactive, LinphoneMediaDirectionInactive);
if (no_sdp) {
linphone_core_enable_sdp_200_ack(marie->lc,TRUE);
}
/*
currently update call cannot be used in paused state, might not be good.
params=linphone_core_create_call_params(marie->lc,linphone_core_get_current_call(marie->lc));
linphone_call_params_set_audio_direction(params,LinphoneMediaDirectionSendRecv);
linphone_call_params_set_video_direction(params,LinphoneMediaDirectionSendRecv);
linphone_core_update_call(marie->lc,linphone_core_get_current_call(marie->lc),params);
linphone_call_params_destroy(params);
*/
linphone_core_resume_call(marie->lc,linphone_core_get_current_call(marie->lc));
CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallResuming,1));
CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2));
CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2));
check_media_direction(marie,linphone_core_get_current_call(marie->lc),lcs,LinphoneMediaDirectionSendRecv,LinphoneMediaDirectionSendRecv);
check_media_direction(pauline,linphone_core_get_current_call(pauline->lc),lcs,LinphoneMediaDirectionSendRecv,LinphoneMediaDirectionSendRecv);
}
end_call(marie,pauline);
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
leaked_objects=belle_sip_object_get_object_count()-begin;
CU_ASSERT_TRUE(leaked_objects==0);
if (leaked_objects>0){
belle_sip_object_dump_active_objects();
}
}
static void video_call_with_re_invite_inactive_followed_by_re_invite() {
video_call_with_re_invite_inactive_followed_by_re_invite_base(FALSE);
}
static void video_call_with_re_invite_inactive_followed_by_re_invite_no_sdp() {
video_call_with_re_invite_inactive_followed_by_re_invite_base(TRUE);
}
#endif
test_t call_tests[] = {
{ "Phone number normalization", phone_number_normalization },
@ -3534,6 +3865,8 @@ test_t call_tests[] = {
{ "Call paused resumed from callee", call_paused_resumed_from_callee },
{ "SRTP call", srtp_call },
{ "ZRTP call",zrtp_call},
{ "ZRTP SAS call",zrtp_sas_call},
{ "ZRTP Cipher call",zrtp_cipher_call},
{ "DTLS SRTP call",dtls_srtp_call},
{ "DTLS SRTP call with media relay", dtls_srtp_call_with_media_realy},
{ "ZRTP video call",zrtp_video_call},
@ -3567,6 +3900,11 @@ test_t call_tests[] = {
{ "DTLS SRTP ice video call",dtls_srtp_ice_video_call},
{ "DTLS SRTP ice video call with relay",dtls_srtp_ice_video_call_with_relay},
{ "Video call with limited bandwidth", video_call_limited_bandwidth},
{ "Video call accepted in send only", accept_call_in_send_only},
{ "Video call accepted in send only with ice", accept_call_in_send_only_with_ice},
{ "2 Video call accepted in send only", two_accepted_call_in_send_only},
{ "Video call with re-invite(inactive) followed by re-invite", video_call_with_re_invite_inactive_followed_by_re_invite},
{ "Video call with re-invite(inactive) followed by re-invite(no sdp)", video_call_with_re_invite_inactive_followed_by_re_invite_no_sdp},
#endif
{ "SRTP ice call", srtp_ice_call },
{ "ZRTP ice call", zrtp_ice_call },
@ -3606,6 +3944,7 @@ test_t call_tests[] = {
{ "Call with generic CN", call_with_generic_cn },
{ "Call with transport change after released", call_with_transport_change_after_released },
{ "Unsuccessful call with transport change after released",unsucessfull_call_with_transport_change_after_released}
};
test_suite_t call_test_suite = {

View file

@ -115,7 +115,7 @@ int bc_tester_nb_tests(const char *suite_name) {
void bc_tester_list_suites() {
int j;
for(j=0;j<nb_test_suites;j++) {
fprintf(stdout, "%s\n", bc_tester_suite_name(j));
tester_printf(verbosity_info, "%s", bc_tester_suite_name(j));
}
}
@ -123,7 +123,7 @@ void bc_tester_list_tests(const char *suite_name) {
int j;
for( j = 0; j < bc_tester_nb_tests(suite_name); j++) {
const char *test_name = bc_tester_test_name(suite_name, j);
fprintf(stdout, "%s\n", test_name);
tester_printf(verbosity_info, "%s", test_name);
}
}
@ -136,19 +136,19 @@ static void all_complete_message_handler(const CU_pFailureRecord pFailure) {
}
static void suite_init_failure_message_handler(const CU_pSuite pSuite) {
tester_printf(verbosity_error,"Suite initialization failed for [%s].", pSuite->pName);
tester_printf(verbosity_error,"Suite initialization failed for [%s]", pSuite->pName);
}
static void suite_cleanup_failure_message_handler(const CU_pSuite pSuite) {
tester_printf(verbosity_error,"Suite cleanup failed for [%s].", pSuite->pName);
tester_printf(verbosity_error,"Suite cleanup failed for [%s]", pSuite->pName);
}
#ifdef HAVE_CU_GET_SUITE
static void suite_start_message_handler(const CU_pSuite pSuite) {
tester_printf(verbosity_info,"Suite [%s] started\n", pSuite->pName);
tester_printf(verbosity_info,"Suite [%s] started", pSuite->pName);
}
static void suite_complete_message_handler(const CU_pSuite pSuite, const CU_pFailureRecord pFailure) {
tester_printf(verbosity_info,"Suite [%s] ended\n", pSuite->pName);
tester_printf(verbosity_info,"Suite [%s] ended", pSuite->pName);
}
static void test_start_message_handler(const CU_pTest pTest, const CU_pSuite pSuite) {
@ -160,22 +160,23 @@ static void test_complete_message_handler(const CU_pTest pTest,
const CU_pSuite pSuite,
const CU_pFailureRecord pFailureList) {
int i;
char * result = malloc(sizeof(char)*2048);//not very pretty but...
char result[2048];
char buffer[2048];
CU_pFailureRecord pFailure = pFailureList;
sprintf(result, "Suite [%s] Test [%s]", pSuite->pName, pTest->pName);
snprintf(result, sizeof(result), "Suite [%s] Test [%s]", pSuite->pName, pTest->pName);
if (pFailure) {
strncat(result, " failed:", strlen(" failed:"));
for (i = 1 ; (NULL != pFailure) ; pFailure = pFailure->pNext, i++) {
sprintf(result, "%s\n %d. %s:%u - %s", result, i,
snprintf(buffer, sizeof(buffer), "\n %d. %s:%u - %s", i,
(NULL != pFailure->strFileName) ? pFailure->strFileName : "",
pFailure->uiLineNumber,
(NULL != pFailure->strCondition) ? pFailure->strCondition : "");
strncat(result, buffer, strlen(buffer));
}
} else {
strncat(result, " passed", strlen(" passed"));
}
tester_printf(verbosity_info,"%s\n", result);
free(result);
}
#endif
@ -252,7 +253,7 @@ int bc_tester_run_tests(const char *suite_name, const char *test_name) {
void bc_tester_helper(const char *name, const char* additionnal_helper) {
fprintf(stdout,"%s --help\n"
tester_printf(verbosity_info,"%s --help\n"
"\t\t\t--list-suites\n"
"\t\t\t--list-tests <suite>\n"
"\t\t\t--suite <suite name>\n"
@ -277,7 +278,6 @@ void bc_tester_init(void (*ftester_printf)(int level, const char *fmt, va_list a
int bc_tester_parse_args(int argc, char **argv, int argid)
{
int i = argid;
if (strcmp(argv[i],"--help")==0){
return -1;
} else if (strcmp(argv[i],"--test")==0){
@ -301,12 +301,12 @@ int bc_tester_parse_args(int argc, char **argv, int argid)
} else if (strcmp(argv[i], "--xml") == 0){
xml_enabled = 1;
}else {
fprintf(stderr, "Unknown option \"%s\"\n", argv[i]);
tester_printf(verbosity_error, "Unknown option \"%s\"\n", argv[i]);
return -1;
}
if( xml_enabled && (suite_name || test_name) ){
fprintf(stderr, "Cannot use both XML and specific test suite\n");
tester_printf(verbosity_error, "Cannot use both XML and specific test suite\n");
return -1;
}
@ -317,8 +317,9 @@ int bc_tester_parse_args(int argc, char **argv, int argid)
int bc_tester_start() {
int ret;
if( xml_enabled ){
char * xml_tmp_file = malloc(sizeof(char) * (strlen(xml_file) + strlen(".tmp") + 1));
sprintf(xml_tmp_file, "%s.tmp", xml_file);
size_t size = strlen(xml_file) + strlen(".tmp") + 1;
char * xml_tmp_file = malloc(sizeof(char) * size);
snprintf(xml_tmp_file, size, "%s.tmp", xml_file);
CU_set_output_filename(xml_tmp_file);
free(xml_tmp_file);
}
@ -342,14 +343,16 @@ void bc_tester_uninit() {
/* Redisplay list of failed tests on end */
if (CU_get_number_of_failure_records()){
CU_basic_show_failures(CU_get_failure_list());
tester_printf(verbosity_info,""); /*add missing final newline*/
}
CU_cleanup_registry();
/*add missing final newline*/
tester_printf(verbosity_info,"");
if( xml_enabled ){
/*create real xml file only if tester did not crash*/
char * xml_tmp_file = malloc(sizeof(char) * (strlen(xml_file) + strlen(".tmp-Results.xml") + 1));
sprintf(xml_tmp_file, "%s.tmp-Results.xml", xml_file);
size_t size = strlen(xml_file) + strlen(".tmp-Results.xml") + 1;
char * xml_tmp_file = malloc(sizeof(char) * size);
snprintf(xml_tmp_file, size, "%s.tmp-Results.xml", xml_file);
rename(xml_tmp_file, xml_file);
free(xml_tmp_file);
}

View file

@ -30,7 +30,6 @@
static FILE * log_file = NULL;
static OrtpLogFunc ortp_log_handler;
#ifdef ANDROID
@ -132,23 +131,35 @@ static void liblinphone_tester_qnx_log_handler(OrtpLogLevel lev, const char *fmt
#endif /* __QNX__ */
static void log_handler(int lev, const char *fmt, va_list args) {
ortp_set_log_file(stderr);
ortp_log_handler(lev, fmt, args);
#ifdef WIN32
vfprintf(lev == ORTP_ERROR ? stderr : stdout, fmt, args);
fprintf(lev == ORTP_ERROR ? stderr : stdout, "\n");
#else
va_list cap;
va_copy(cap,args);
#ifdef ANDROID
/* IMPORTANT: needed by liblinphone tester to retrieve suite list...*/
cunit_android_trace_handler(lev == ORTP_ERROR, fmt, cap);
#else
/* Otherwise, we must use stdio to avoid log formatting (for autocompletion etc.) */
vfprintf(lev == ORTP_ERROR ? stderr : stdout, fmt, cap);
fprintf(lev == ORTP_ERROR ? stderr : stdout, "\n");
#endif
va_end(cap);
#endif
if (log_file){
ortp_set_log_file(log_file);
ortp_log_handler(lev, fmt, args);
ortp_logv_out(lev, fmt, args);
}
}
void liblinphone_tester_init(void) {
ortp_log_handler = ortp_get_log_handler();
if (! log_file) {
#if defined(ANDROID)
linphone_core_set_log_handler(liblinphone_android_ortp_log_handler);
linphone_core_set_log_handler(liblinphone_android_ortp_log_handler);
#elif defined(__QNX__)
linphone_core_set_log_handler(liblinphone_tester_qnx_log_handler);
#else
linphone_core_set_log_handler(ortp_logv_out);
linphone_core_set_log_handler(liblinphone_tester_qnx_log_handler);
#endif
}
bc_tester_init(log_handler, ORTP_MESSAGE, ORTP_ERROR);
liblinphone_tester_add_suites();
@ -186,9 +197,9 @@ int main (int argc, char *argv[])
for(i = 1; i < argc; ++i) {
if (strcmp(argv[i], "--verbose") == 0) {
linphone_core_set_log_level(ORTP_MESSAGE);
linphone_core_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL);
} else if (strcmp(argv[i], "--silent") == 0) {
linphone_core_set_log_level(ORTP_FATAL);
linphone_core_set_log_level_mask(ORTP_FATAL);
} else if (strcmp(argv[i],"--log-file")==0){
CHECK_ARG("--log-file", ++i, argc);
log_file=fopen(argv[i],"w");
@ -197,6 +208,7 @@ int main (int argc, char *argv[])
return -2;
} else {
ms_message("Redirecting traces to file [%s]",argv[i]);
ortp_set_log_file(log_file);
}
} else if (strcmp(argv[i],"--domain")==0){
CHECK_ARG("--domain", ++i, argc);

View file

@ -202,6 +202,7 @@ typedef struct _stats {
char * dtmf_list_received;
int dtmf_count;
int number_of_LinphoneCallStatsUpdated;
int number_of_rtcp_sent;
int number_of_rtcp_received;
@ -211,6 +212,10 @@ typedef struct _stats {
int number_of_LinphoneCoreLogCollectionUploadStateDelivered;
int number_of_LinphoneCoreLogCollectionUploadStateNotDelivered;
int number_of_LinphoneCoreLogCollectionUploadStateInProgress;
int audio_download_bandwidth;
int audio_upload_bandwidth;
int video_download_bandwidth;
int video_upload_bandwidth;
}stats;
@ -297,6 +302,7 @@ void liblinphone_tester_enable_ipv6(bool_t enabled);
void linphone_call_cb(LinphoneCall *call,void * user_data);
void call_paused_resumed_base(bool_t multicast);
void simple_call_base(bool_t enable_multicast_recv_side);
void call_base_with_configfile(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_relay,LinphoneFirewallPolicy policy,bool_t enable_tunnel, const char *marie_rc, const char *pauline_rc);
void call_base(LinphoneMediaEncryption mode, bool_t enable_video,bool_t enable_relay,LinphoneFirewallPolicy policy,bool_t enable_tunnel);
bool_t call_with_caller_params(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr, const LinphoneCallParams *params);
bool_t pause_call_1(LinphoneCoreManager* mgr_1,LinphoneCall* call_1,LinphoneCoreManager* mgr_2,LinphoneCall* call_2);

View file

@ -143,11 +143,29 @@ static FILE* gzuncompress(const char* filepath) {
}
#endif
static time_t get_current_time() {
struct timeval tp;
struct tm *lt;
#ifndef WIN32
struct tm tmbuf;
#endif
time_t tt;
ortp_gettimeofday(&tp,NULL);
tt = (time_t)tp.tv_sec;
#ifdef WIN32
lt = localtime(&tt);
#else
lt = localtime_r(&tt,&tmbuf);
#endif
return mktime(lt);
}
static time_t check_file(LinphoneCoreManager* mgr) {
time_t last_log = ms_time(NULL);
time_t cur_time = get_current_time();
char* filepath = linphone_core_compress_log_collection(mgr->lc);
time_t time_curr = -1;
time_t log_time = -1;
uint32_t timediff = 0;
FILE *file = NULL;
@ -159,7 +177,7 @@ static time_t check_file(LinphoneCoreManager* mgr) {
size_t line_size = 256;
#ifndef WIN32
struct tm tm_curr = {0};
time_t time_prev = -1;
time_t time_prev = 0;
#endif
#if HAVE_ZLIB
@ -182,10 +200,13 @@ static time_t check_file(LinphoneCoreManager* mgr) {
if (strlen(line) > 24) {
char date[24] = {'\0'};
memcpy(date, line, 23);
/*reset tm_curr to reset milliseconds and below fields*/
memset(&tm_curr, 0, sizeof(struct tm));
if (strptime(date, "%Y-%m-%d %H:%M:%S", &tm_curr) != NULL) {
time_curr = mktime(&tm_curr);
CU_ASSERT_TRUE(time_curr >= time_prev);
time_prev = time_curr;
tm_curr.tm_isdst = -1; // LOL
log_time = mktime(&tm_curr);
CU_ASSERT_TRUE(log_time >= time_prev);
time_prev = log_time;
}
}
#endif
@ -196,19 +217,27 @@ static time_t check_file(LinphoneCoreManager* mgr) {
ms_free(filepath);
timediff = labs((long int)time_curr - (long int)last_log);
timediff = labs((long int)log_time - (long int)cur_time);
(void)timediff;
#ifndef WIN32
CU_ASSERT_TRUE( timediff <= 1 );
if( !(timediff <= 1) ){
ms_error("time_curr: %ld, last_log: %ld timediff: %u", (long int)time_curr, (long int)last_log, timediff );
char buffers[2][128] = {{0}};
strftime(buffers[0], sizeof(buffers[0]), "%Y-%m-%d %H:%M:%S", localtime(&log_time));
strftime(buffers[1], sizeof(buffers[1]), "%Y-%m-%d %H:%M:%S", localtime(&cur_time));
ms_error("log_time: %ld (%s), cur_time: %ld (%s) timediff: %u"
, (long int)log_time, buffers[0]
, (long int)cur_time, buffers[1]
, timediff
);
}
#else
ms_warning("strptime() not available for this platform, test is incomplete.");
#endif
}
// return latest time in file
return time_curr;
return log_time;
}
static void collect_files_disabled() {

View file

@ -197,10 +197,14 @@ static void profile_call_base(bool_t avpf1, LinphoneMediaEncryption srtp1,bool_t
CU_ASSERT_TRUE(call(marie, pauline));
CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 1));
CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1));
params = linphone_call_get_current_params(linphone_core_get_current_call(marie->lc));
CU_ASSERT_STRING_EQUAL(linphone_call_params_get_rtp_profile(params), expected_profile);
params = linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc));
CU_ASSERT_STRING_EQUAL(linphone_call_params_get_rtp_profile(params), expected_profile);
if (linphone_core_get_current_call(marie->lc)) {
params = linphone_call_get_current_params(linphone_core_get_current_call(marie->lc));
CU_ASSERT_STRING_EQUAL(linphone_call_params_get_rtp_profile(params), expected_profile);
}
if (linphone_core_get_current_call(pauline->lc)) {
params = linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc));
CU_ASSERT_STRING_EQUAL(linphone_call_params_get_rtp_profile(params), expected_profile);
}
linphone_core_terminate_all_calls(marie->lc);
CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1));

View file

@ -30,7 +30,7 @@ video_rtp_port=9410-9910
display=0
capture=0
show_local=0
size=vga
size=qcif
enabled=0
self_view=0
automatically_initiate=0

View file

@ -39,7 +39,7 @@ video_rtp_port=28070-38000
display=0
capture=0
show_local=0
size=vga
size=qcif
enabled=0
self_view=0
automatically_initiate=0

View file

@ -0,0 +1,54 @@
[sip]
sip_port=-1
sip_tcp_port=-1
sip_tls_port=-1
default_proxy=0
ping_with_options=0
register_only_when_network_is_up=0
composing_idle_timeout=1
zrtp_cipher_suites=MS_ZRTP_CIPHER_AES3,MS_ZRTP_CIPHER_AES1
[auth_info_0]
username=marie
userid=marie
passwd=secret
realm=sip.example.org
[proxy_0]
reg_proxy=sip.example.org;transport=tcp
reg_route=sip.example.org;transport=tcp;lr
reg_identity="Super Marie" <sip:marie@sip.example.org>
reg_expires=3600
reg_sendregister=1
publish=0
dial_escape_plus=0
quality_reporting_collector=sip:collector@sip.example.org
quality_reporting_enabled=1
[friend_0]
url="Paupoche" <sip:pauline@sip.example.org>
pol=accept
subscribe=0
[rtp]
audio_rtp_port=18070-28000
video_rtp_port=28070-38000
[video]
display=0
capture=0
show_local=0
size=qcif
enabled=0
self_view=0
automatically_initiate=0
automatically_accept=0
device=StaticImage: Static picture
[sound]
echocancellation=0 #to not overload cpu in case of VG
[net]
dns_srv_enabled=0 #no srv needed in general

View file

@ -0,0 +1,54 @@
[sip]
sip_port=-1
sip_tcp_port=-1
sip_tls_port=-1
default_proxy=0
ping_with_options=0
register_only_when_network_is_up=0
composing_idle_timeout=1
zrtp_sas_suites=MS_ZRTP_SAS_B256
[auth_info_0]
username=marie
userid=marie
passwd=secret
realm=sip.example.org
[proxy_0]
reg_proxy=sip.example.org;transport=tcp
reg_route=sip.example.org;transport=tcp;lr
reg_identity="Super Marie" <sip:marie@sip.example.org>
reg_expires=3600
reg_sendregister=1
publish=0
dial_escape_plus=0
quality_reporting_collector=sip:collector@sip.example.org
quality_reporting_enabled=1
[friend_0]
url="Paupoche" <sip:pauline@sip.example.org>
pol=accept
subscribe=0
[rtp]
audio_rtp_port=18070-28000
video_rtp_port=28070-38000
[video]
display=0
capture=0
show_local=0
size=qcif
enabled=0
self_view=0
automatically_initiate=0
automatically_accept=0
device=StaticImage: Static picture
[sound]
echocancellation=0 #to not overload cpu in case of VG
[net]
dns_srv_enabled=0 #no srv needed in general

View file

@ -0,0 +1,54 @@
[sip]
sip_port=-1
sip_tcp_port=-1
sip_tls_port=-1
default_proxy=0
ping_with_options=0
register_only_when_network_is_up=0
composing_idle_timeout=1
srtp_crypto_suites=AES_CM_256_HMAC_SHA1_80,AES_CM_256_HMAC_SHA1_32
[auth_info_0]
username=marie
userid=marie
passwd=secret
realm=sip.example.org
[proxy_0]
reg_proxy=sip.example.org;transport=tcp
reg_route=sip.example.org;transport=tcp;lr
reg_identity="Super Marie" <sip:marie@sip.example.org>
reg_expires=3600
reg_sendregister=1
publish=0
dial_escape_plus=0
quality_reporting_collector=sip:collector@sip.example.org
quality_reporting_enabled=1
[friend_0]
url="Paupoche" <sip:pauline@sip.example.org>
pol=accept
subscribe=0
[rtp]
audio_rtp_port=18070-28000
video_rtp_port=28070-38000
[video]
display=0
capture=0
show_local=0
size=qcif
enabled=0
self_view=0
automatically_initiate=0
automatically_accept=0
device=StaticImage: Static picture
[sound]
echocancellation=0 #to not overload cpu in case of VG
[net]
dns_srv_enabled=0 #no srv needed in general

View file

@ -36,7 +36,7 @@ video_rtp_port=39072-49000
display=0
capture=0
show_local=0
size=vga
size=qcif
enabled=0
self_view=0
automatically_initiate=0

View file

@ -0,0 +1,51 @@
[sip]
sip_port=-1
sip_tcp_port=-1
sip_tls_port=-1
default_proxy=0
ping_with_options=0
register_only_when_network_is_up=0
composing_idle_timeout=1
zrtp_cipher_suites=MS_ZRTP_CIPHER_AES3,MS_ZRTP_CIPHER_AES1
[auth_info_0]
username=pauline
userid=pauline
passwd=secret
realm=sip.example.org
[proxy_0]
reg_proxy=sip2.linphone.org;transport=tls
reg_route=sip2.linphone.org;transport=tls
reg_identity=sip:pauline@sip.example.org
reg_expires=3600
reg_sendregister=1
publish=0
dial_escape_plus=0
#[friend_0]
#url="Mariette" <sip:marie@sip.example.org>
#pol=accept
#subscribe=0
[rtp]
audio_rtp_port=18070-28000
video_rtp_port=39072-49000
[video]
display=0
capture=0
show_local=0
size=qcif
enabled=0
self_view=0
automatically_initiate=0
automatically_accept=0
device=StaticImage: Static picture
[sound]
echocancellation=0 #to not overload cpu in case of VG
[net]
dns_srv_enabled=0 #no srv needed in general

View file

@ -0,0 +1,51 @@
[sip]
sip_port=-1
sip_tcp_port=-1
sip_tls_port=-1
default_proxy=0
ping_with_options=0
register_only_when_network_is_up=0
composing_idle_timeout=1
zrtp_sas_suites=MS_ZRTP_SAS_B256
[auth_info_0]
username=pauline
userid=pauline
passwd=secret
realm=sip.example.org
[proxy_0]
reg_proxy=sip2.linphone.org;transport=tls
reg_route=sip2.linphone.org;transport=tls
reg_identity=sip:pauline@sip.example.org
reg_expires=3600
reg_sendregister=1
publish=0
dial_escape_plus=0
#[friend_0]
#url="Mariette" <sip:marie@sip.example.org>
#pol=accept
#subscribe=0
[rtp]
audio_rtp_port=18070-28000
video_rtp_port=39072-49000
[video]
display=0
capture=0
show_local=0
size=qcif
enabled=0
self_view=0
automatically_initiate=0
automatically_accept=0
device=StaticImage: Static picture
[sound]
echocancellation=0 #to not overload cpu in case of VG
[net]
dns_srv_enabled=0 #no srv needed in general

View file

@ -0,0 +1,51 @@
[sip]
sip_port=-1
sip_tcp_port=-1
sip_tls_port=-1
default_proxy=0
ping_with_options=0
register_only_when_network_is_up=0
composing_idle_timeout=1
srtp_crypto_suites=AES_CM_256_HMAC_SHA1_80,AES_CM_256_HMAC_SHA1_32
[auth_info_0]
username=pauline
userid=pauline
passwd=secret
realm=sip.example.org
[proxy_0]
reg_proxy=sip2.linphone.org;transport=tls
reg_route=sip2.linphone.org;transport=tls
reg_identity=sip:pauline@sip.example.org
reg_expires=3600
reg_sendregister=1
publish=0
dial_escape_plus=0
#[friend_0]
#url="Mariette" <sip:marie@sip.example.org>
#pol=accept
#subscribe=0
[rtp]
audio_rtp_port=18070-28000
video_rtp_port=39072-49000
[video]
display=0
capture=0
show_local=0
size=qcif
enabled=0
self_view=0
automatically_initiate=0
automatically_accept=0
device=StaticImage: Static picture
[sound]
echocancellation=0 #to not overload cpu in case of VG
[net]
dns_srv_enabled=0 #no srv needed in general

View file

@ -259,6 +259,23 @@ LinphoneCoreManager* linphone_core_manager_init(const char* rc_file) {
linphone_core_set_ringback(mgr->lc, NULL);
#endif
#ifdef VIDEO_ENABLED
{
MSWebCam *cam;
cam = ms_web_cam_manager_get_cam(ms_web_cam_manager_get(), "Mire: Mire (synthetic moving picture)");
if (cam == NULL) {
MSWebCamDesc *desc = ms_mire_webcam_desc_get();
if (desc){
cam=ms_web_cam_new(desc);
ms_web_cam_manager_add_cam(ms_web_cam_manager_get(), cam);
}
}
}
#endif
if( manager_count >= 2){
char hellopath[512];
char *recordpath = ms_strdup_printf("%s/record_for_lc_%p.wav",bc_tester_writable_dir_prefix,mgr->lc);
@ -269,6 +286,7 @@ LinphoneCoreManager* linphone_core_manager_init(const char* rc_file) {
linphone_core_set_record_file(mgr->lc,recordpath);
ms_free(recordpath);
}
linphone_core_set_user_certificates_path(mgr->lc,bc_tester_writable_dir_prefix);
if (rc_path) ms_free(rc_path);

View file

@ -19,7 +19,7 @@ EXTRA_DIST=xml2lpc_jni.cc lpc2xml_jni.cc
if BUILD_TOOLS
bin_PROGRAMS=xml2lpc_test lpc2xml_test lp-gen-wrappers
bin_PROGRAMS=xml2lpc_test lpc2xml_test lp-gen-wrappers auto_answer
xml2lpc_test_SOURCES=\
xml2lpc_test.c
@ -42,6 +42,12 @@ lp_gen_wrappers_SOURCES=genwrappers.cc \
lp_gen_wrappers_LDADD= \
$(LIBXML2_LIBS)
auto_answer_SOURCES=auto_answer.c
auto_answer_CFLAGS=$(COMMON_CFLAGS)
auto_answer_LDADD=\
$(top_builddir)/coreapi/liblinphone.la \
$(MEDIASTREAMER_LIBS)
endif

158
tools/auto_answer.c Normal file
View file

@ -0,0 +1,158 @@
/*
linphone
Copyright (C) 2010 Belledonne Communications SARL
(simon.morlat@linphone.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.
*/
#ifdef IN_LINPHONE
#include "linphonecore.h"
#else
#include "linphone/linphonecore.h"
#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <signal.h>
static bool_t running=TRUE;
static void stop(int signum){
running=FALSE;
}
#ifndef PACKAGE_DATA_DIR
#define PACKAGE_DATA_DIR '.'
#endif
/*
* Call state notification callback
*/
static void call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *msg){
LinphoneCallParams * call_params;
switch(cstate){
case LinphoneCallIncomingReceived:
ms_message("Incoming call arrive !\n");
/* accept the incoming call*/
call_params = linphone_core_create_default_call_parameters(lc);
linphone_call_params_enable_video(call_params,TRUE);
linphone_call_params_set_audio_direction(call_params,LinphoneMediaDirectionSendOnly);
linphone_call_params_set_video_direction(call_params,LinphoneMediaDirectionSendOnly);
linphone_core_accept_call_with_params(lc,call,call_params);
linphone_call_params_destroy(call_params);
break;
default:
break;
}
}
extern MSWebCamDesc mire_desc;
static void helper() {
printf("auto_answer --help\n"
"\t\t\t--listening-uri <uri> uri to listen on, default [sip:localhost:5060]\n"
"\t\t\t--verbose\n");
exit(0);
}
int main(int argc, char *argv[]){
LinphoneCoreVTable vtable={0};
LinphoneCore *lc;
LinphoneVideoPolicy policy;
int i;
LinphoneAddress *addr=NULL;
LCSipTransports tp;
char * tmp = NULL;
LpConfig * lp_config = lp_config_new(NULL);
policy.automatically_accept=TRUE;
signal(SIGINT,stop);
for(i = 1; i < argc; ++i) {
if (strcmp(argv[i], "--verbose") == 0) {
linphone_core_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL);
} else if (strcmp(argv[i], "--listening-uri") == 0){
addr = linphone_address_new(argv[++i]);
if (!addr) {
printf("Error, bad sip uri");
helper();
}
/* switch(linphone_address_get_transport(addr)) {
case LinphoneTransportUdp:
case LinphoneTransportTcp:
break;
default:
ms_error("Error, bad sip uri [%s] transport, should be udp | tcp",argv[i]);
helper();
break;
}*/
} else {
helper();
}
}
if (!addr) {
addr = linphone_address_new("sip:bot@0.0.0.0:5060");
}
lp_config_set_string(lp_config,"sip","bind_address",linphone_address_get_domain(addr));
lp_config_set_string(lp_config,"rtp","bind_address",linphone_address_get_domain(addr));
vtable.call_state_changed=call_state_changed;
lc=linphone_core_new_with_config(&vtable,lp_config,NULL);
linphone_core_enable_video_capture(lc,TRUE);
linphone_core_enable_video_display(lc,FALSE);
linphone_core_set_video_policy(lc,&policy);
/*instead of using sound capture card, a file is played to the calling party*/
linphone_core_set_play_file(lc,PACKAGE_DATA_DIR "/sounds/linphone/hello16000.wav");
linphone_core_set_use_files(lc,TRUE);
{
MSWebCamDesc *desc = ms_mire_webcam_desc_get();
if (desc){
ms_web_cam_manager_add_cam(ms_web_cam_manager_get(),ms_web_cam_new(desc));
linphone_core_set_video_device(lc,"Mire: Mire (synthetic moving picture)");
}
}
memset(&tp,0,sizeof(LCSipTransports));
tp.udp_port = linphone_address_get_port(addr);
tp.tcp_port = linphone_address_get_port(addr);
linphone_core_set_sip_transports(lc,&tp);
linphone_core_set_audio_port_range(lc,1024,65000);
linphone_core_set_preferred_framerate(lc,5);
linphone_core_set_primary_contact(lc,tmp=linphone_address_as_string(addr));
ms_free(tmp);
/* main loop for receiving notifications and doing background linphonecore work: */
while(running){
linphone_core_iterate(lc);
ms_usleep(50000);
}
ms_message("Shutting down...\n");
linphone_core_destroy(lc);
ms_message("Exited\n");
return 0;
}

View file

@ -58,6 +58,7 @@ blacklisted_functions = [
'linphone_core_set_log_file', # There is no use to wrap this function
'linphone_core_set_log_handler', # Hand-written but put directly in the linphone module
'linphone_core_set_log_level', # There is no use to wrap this function
'linphone_core_set_log_level_mask', # There is no use to wrap this function
'linphone_core_set_video_policy', # missing LinphoneVideoPolicy
'linphone_proxy_config_get_privacy', # missing LinphonePrivacyMask
'linphone_proxy_config_normalize_number', # to be handwritten because of result via arguments

View file

@ -106,7 +106,7 @@ static void pylinphone_module_log_handler(OrtpLogLevel lev, const char *fmt, va_
static void pylinphone_init_logging(void) {
linphone_core_serialize_logs();
linphone_core_set_log_handler(pylinphone_module_log_handler);
linphone_core_set_log_level(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL);
linphone_core_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL);
}