forked from mirrors/linphone-iphone
Merge remote-tracking branch 'linphone/master' into daemon
Conflicts: configure.ac
This commit is contained in:
commit
3b9bc6e5f9
112 changed files with 7293 additions and 3443 deletions
|
|
@ -1,7 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<?fileVersion 4.0.0?>
|
||||
|
||||
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||
<cconfiguration id="0.2079208171">
|
||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.2079208171" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
||||
|
|
@ -45,6 +43,7 @@
|
|||
<entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="gtk"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="include"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="tester"/>
|
||||
<entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="tools"/>
|
||||
</sourceEntries>
|
||||
</configuration>
|
||||
</storageModule>
|
||||
|
|
|
|||
|
|
@ -20,12 +20,12 @@
|
|||
#
|
||||
############################################################################
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.12)
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
project(LINPHONE C CXX)
|
||||
|
||||
|
||||
set(LINPHONE_MAJOR_VERSION "3")
|
||||
set(LINPHONE_MINOR_VERSION "7")
|
||||
set(LINPHONE_MINOR_VERSION "8")
|
||||
set(LINPHONE_MICRO_VERSION "0")
|
||||
set(LINPHONE_VERSION "${LINPHONE_MAJOR_VERSION}.${LINPHONE_MINOR_VERSION}.${LINPHONE_MICRO_VERSION}")
|
||||
set(LINPHONE_SO_VERSION "6")
|
||||
|
|
@ -53,17 +53,46 @@ cmake_dependent_option(ENABLE_ASSISTANT "Turn on assistant compiling." YES "ENAB
|
|||
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_PREFIX_PATH}/share/cmake/Modules")
|
||||
|
||||
include(CheckIncludeFile)
|
||||
include(CheckSymbolExists)
|
||||
include(CMakePushCheckState)
|
||||
|
||||
set(MSVC_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include/MSVC")
|
||||
if(MSVC)
|
||||
list(APPEND CMAKE_REQUIRED_INCLUDES "${CMAKE_PREFIX_PATH}/include/MSVC")
|
||||
list(APPEND CMAKE_REQUIRED_INCLUDES "${MSVC_INCLUDE_DIR}")
|
||||
|
||||
if(ENABLE_GTK_UI)
|
||||
if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/intltool_win32.zip")
|
||||
message(STATUS "Installing intltool")
|
||||
file(DOWNLOAD http://ftp.acc.umu.se/pub/GNOME/binaries/win32/intltool/0.40/intltool_0.40.4-1_win32.zip "${CMAKE_CURRENT_BINARY_DIR}/intltool_win32.zip" SHOW_PROGRESS)
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_COMMAND}" "-E" "tar" "x" "${CMAKE_CURRENT_BINARY_DIR}/intltool_win32.zip"
|
||||
WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}"
|
||||
)
|
||||
endif()
|
||||
if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/gtk+-bundle_win32.zip")
|
||||
message(STATUS "Installing GTK")
|
||||
file(DOWNLOAD http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip "${CMAKE_CURRENT_BINARY_DIR}/gtk+-bundle_win32.zip" SHOW_PROGRESS)
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_COMMAND}" "-E" "tar" "x" "${CMAKE_CURRENT_BINARY_DIR}/gtk+-bundle_win32.zip"
|
||||
WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
if(ENABLE_ASSISTANT)
|
||||
if(NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/libsoup.zip")
|
||||
message(STATUS "Installing libsoup")
|
||||
file(DOWNLOAD http://www.linphone.org/files/libsoup_2.24.0-1_win32.zip "${CMAKE_CURRENT_BINARY_DIR}/libsoup.zip" SHOW_PROGRESS)
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_COMMAND}" "-E" "tar" "x" "${CMAKE_CURRENT_BINARY_DIR}/libsoup.zip"
|
||||
WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_package(BelleSIP REQUIRED)
|
||||
find_package(MS2 REQUIRED)
|
||||
find_package(Mediastreamer2 REQUIRED)
|
||||
find_package(XML2 REQUIRED)
|
||||
if(ENABLE_UNIT_TESTS)
|
||||
find_package(CUnit)
|
||||
|
|
@ -87,10 +116,7 @@ if(ENABLE_TUNNEL)
|
|||
endif()
|
||||
endif()
|
||||
if(ENABLE_MSG_STORAGE)
|
||||
find_package(Sqlite3)
|
||||
if(NOT SQLITE3_FOUND)
|
||||
message(FATAL_ERROR "Could not find the sqlite3 library!")
|
||||
endif()
|
||||
find_package(Sqlite3 REQUIRED)
|
||||
endif()
|
||||
if(ENABLE_NOTIFY)
|
||||
find_package(Notify)
|
||||
|
|
@ -119,7 +145,7 @@ include_directories(
|
|||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/coreapi/
|
||||
${BELLESIP_INCLUDE_DIRS}
|
||||
${MS2_INCLUDE_DIRS}
|
||||
${MEDIASTREAMER2_INCLUDE_DIRS}
|
||||
${XML2_INCLUDE_DIRS}
|
||||
)
|
||||
if(SQLITE3_FOUND)
|
||||
|
|
@ -132,9 +158,8 @@ endif()
|
|||
if(ENABLE_ASSISTANT)
|
||||
include_directories(${SOUP_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
include_directories(${CMAKE_PREFIX_PATH}/include/MSVC)
|
||||
include_directories(${MSVC_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
add_definitions("-DIN_LINPHONE")
|
||||
|
|
@ -166,6 +191,9 @@ else()
|
|||
set(LINPHONE_DATA_DIR "${CMAKE_INSTALL_PREFIX}")
|
||||
endif()
|
||||
set(LINPHONE_PLUGINS_DIR "${LINPHONE_DATA_DIR}/lib/liblinphone/plugins")
|
||||
if(WIN32)
|
||||
set(LINPHONE_CONFIG_DIR "Linphone")
|
||||
endif()
|
||||
set(PACKAGE_LOCALE_DIR "${LINPHONE_DATA_DIR}/share/locale")
|
||||
set(PACKAGE_DATA_DIR "${LINPHONE_DATA_DIR}/share")
|
||||
set(PACKAGE_SOUND_DIR "${LINPHONE_DATA_DIR}/share/sounds/linphone")
|
||||
|
|
@ -196,9 +224,29 @@ if(ENABLE_UNIT_TESTS)
|
|||
endif()
|
||||
|
||||
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindLinphone.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/FindLinphone.cmake)
|
||||
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FindLinphone.cmake
|
||||
DESTINATION share/cmake/Modules
|
||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||
include(CMakePackageConfigHelpers)
|
||||
write_basic_package_version_file(
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/LinphoneConfigVersion.cmake"
|
||||
VERSION ${LINPHONE_VERSION}
|
||||
COMPATIBILITY AnyNewerVersion
|
||||
)
|
||||
export(EXPORT LinphoneTargets
|
||||
FILE "${CMAKE_CURRENT_BINARY_DIR}/LinphoneTargets.cmake"
|
||||
NAMESPACE BelledonneCommunications::
|
||||
)
|
||||
configure_file(cmake/LinphoneConfig.cmake.in
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/LinphoneConfig.cmake"
|
||||
@ONLY
|
||||
)
|
||||
|
||||
set(ConfigPackageLocation lib/cmake/Linphone)
|
||||
install(EXPORT LinphoneTargets
|
||||
FILE LinphoneTargets.cmake
|
||||
NAMESPACE BelledonneCommunications::
|
||||
DESTINATION ${ConfigPackageLocation}
|
||||
)
|
||||
install(FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/LinphoneConfig.cmake"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/LinphoneConfigVersion.cmake"
|
||||
DESTINATION ${ConfigPackageLocation}
|
||||
)
|
||||
|
|
|
|||
2
NEWS
2
NEWS
|
|
@ -1,4 +1,4 @@
|
|||
linphone-3.8.0 -- Date to be defined
|
||||
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.
|
||||
* The out of call video preview feature (to test camera) is moved into the settings and is no longer linked to the in-call video preview feature.
|
||||
|
|
|
|||
|
|
@ -63,10 +63,7 @@ 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 CFLAGS="-arch i386 -arch x86_64 -mmacosx-version-min=10.5"
|
||||
export OBJCFLAGS="-arch i386 -arch x86_64 -mmacosx-version-min=10.5"
|
||||
export CXXFLAGS="-arch i386 -arch x86_64 -mmacosx-version-min=10.5"
|
||||
export LDFLAGS="-arch i386 -arch x86_64 -mmacosx-version-min=10.5 -Wl,-headerpad_max_install_names -Wl,-read_only_relocs -Wl,suppress"
|
||||
export LDFLAGS="-Wl,-headerpad_max_install_names -Wl,-read_only_relocs -Wl,suppress"
|
||||
|
||||
* (MacPorts only) Install libantlr3c (library used by belle-sip for parsing)
|
||||
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ LOCAL_SRC_FILES := \
|
|||
linphone_tunnel_config.c \
|
||||
localplayer.c \
|
||||
lpc2xml.c \
|
||||
lime.c \
|
||||
lpconfig.c \
|
||||
message_storage.c \
|
||||
misc.c \
|
||||
|
|
@ -71,7 +72,8 @@ LOCAL_SRC_FILES := \
|
|||
siplogin.c \
|
||||
sipsetup.c \
|
||||
xml2lpc.c \
|
||||
xml.c
|
||||
xml.c \
|
||||
vtables.c
|
||||
|
||||
ifndef LIBLINPHONE_VERSION
|
||||
LIBLINPHONE_VERSION = "Devel"
|
||||
|
|
@ -117,7 +119,8 @@ LOCAL_C_INCLUDES += \
|
|||
$(LOCAL_PATH)/../../belle-sip/include \
|
||||
$(LOCAL_PATH)/../../../gen \
|
||||
$(LOCAL_PATH)/../../externals/libxml2/include \
|
||||
$(LOCAL_PATH)/../../externals/build/libxml2
|
||||
$(LOCAL_PATH)/../../externals/build/libxml2 \
|
||||
$(LOCAL_PATH)/../../externals/polarssl/include
|
||||
|
||||
LOCAL_LDLIBS += -llog -ldl -lz
|
||||
|
||||
|
|
|
|||
|
|
@ -20,7 +20,8 @@ common_SRC_FILES := \
|
|||
dtmf_tester.c \
|
||||
accountmanager.c \
|
||||
offeranswer_tester.c \
|
||||
multicast_call_tester.c
|
||||
multicast_call_tester.c \
|
||||
multi_call.c
|
||||
|
||||
common_C_INCLUDES += \
|
||||
$(LOCAL_PATH) \
|
||||
|
|
|
|||
58
cmake/FindCUnit.cmake
Normal file
58
cmake/FindCUnit.cmake
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
############################################################################
|
||||
# FindCUnit.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 CUnit include file and library
|
||||
#
|
||||
# CUNIT_FOUND - system has CUnit
|
||||
# CUNIT_INCLUDE_DIRS - the CUnit include directory
|
||||
# CUNIT_LIBRARIES - The libraries needed to use CUnit
|
||||
|
||||
include(CheckIncludeFile)
|
||||
include(CheckLibraryExists)
|
||||
|
||||
set(_CUNIT_ROOT_PATHS
|
||||
${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
find_path(CUNIT_INCLUDE_DIRS
|
||||
NAMES CUnit/CUnit.h
|
||||
HINTS _CUNIT_ROOT_PATHS
|
||||
PATH_SUFFIXES include
|
||||
)
|
||||
|
||||
if(CUNIT_INCLUDE_DIRS)
|
||||
set(HAVE_CUNIT_CUNIT_H 1)
|
||||
endif()
|
||||
|
||||
find_library(CUNIT_LIBRARIES
|
||||
NAMES cunit
|
||||
HINTS ${_CUNIT_ROOT_PATHS}
|
||||
PATH_SUFFIXES bin lib
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(CUnit
|
||||
DEFAULT_MSG
|
||||
CUNIT_INCLUDE_DIRS CUNIT_LIBRARIES
|
||||
)
|
||||
|
||||
mark_as_advanced(CUNIT_INCLUDE_DIRS CUNIT_LIBRARIES)
|
||||
55
cmake/FindIconv.cmake
Normal file
55
cmake/FindIconv.cmake
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
############################################################################
|
||||
# FindIconv.cmake
|
||||
# Copyright (C) 2014 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 iconv include file and library
|
||||
#
|
||||
# ICONV_FOUND - system has libiconv
|
||||
# ICONV_INCLUDE_DIRS - the libiconv include directory
|
||||
# ICONV_LIBRARIES - The libraries needed to use libiconv
|
||||
|
||||
set(_ICONV_ROOT_PATHS
|
||||
${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
find_path(ICONV_INCLUDE_DIRS
|
||||
NAMES iconv.h
|
||||
HINTS _ICONV_ROOT_PATHS
|
||||
PATH_SUFFIXES include
|
||||
)
|
||||
|
||||
if(ICONV_INCLUDE_DIRS)
|
||||
set(HAVE_ICONV_H 1)
|
||||
endif()
|
||||
|
||||
find_library(ICONV_LIBRARIES
|
||||
NAMES iconv
|
||||
HINTS ${_ICONV_ROOT_PATHS}
|
||||
PATH_SUFFIXES bin lib
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Iconv
|
||||
DEFAULT_MSG
|
||||
ICONV_INCLUDE_DIRS ICONV_LIBRARIES HAVE_ICONV_H
|
||||
)
|
||||
|
||||
mark_as_advanced(ICONV_INCLUDE_DIRS ICONV_LIBRARIES HAVE_ICONV_H)
|
||||
56
cmake/FindIntl.cmake
Normal file
56
cmake/FindIntl.cmake
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
############################################################################
|
||||
# FindIntl.cmake
|
||||
# Copyright (C) 2014 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 libintl include file and library
|
||||
#
|
||||
# INTL_FOUND - system has libintl
|
||||
# INTL_INCLUDE_DIRS - the libintl include directory
|
||||
# INTL_LIBRARIES - The libraries needed to use libintl
|
||||
|
||||
set(_INTL_ROOT_PATHS
|
||||
${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
find_path(INTL_INCLUDE_DIRS
|
||||
NAMES libintl.h
|
||||
HINTS _INTL_ROOT_PATHS
|
||||
PATH_SUFFIXES include
|
||||
)
|
||||
|
||||
if(INTL_INCLUDE_DIRS)
|
||||
set(HAVE_LIBINTL_H 1)
|
||||
endif()
|
||||
|
||||
set(INTL_ARGS INTL_INCLUDE_DIRS HAVE_LIBINTL_H)
|
||||
if(NOT UNIX OR APPLE)
|
||||
find_library(INTL_LIBRARIES
|
||||
NAMES intl
|
||||
HINTS ${_INTL_ROOT_PATHS}
|
||||
PATH_SUFFIXES bin lib
|
||||
)
|
||||
list(APPEND INTL_ARGS INTL_LIBRARIES)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Intl DEFAULT_MSG ${INTL_ARGS})
|
||||
|
||||
mark_as_advanced(${INTL_ARGS})
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
############################################################################
|
||||
# FindLinphone.cmake
|
||||
# Copyright (C) 2014 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 linphone include file and library
|
||||
#
|
||||
# LINPHONE_FOUND - system has linphone
|
||||
# LINPHONE_INCLUDE_DIRS - the linphone include directory
|
||||
# LINPHONE_LIBRARIES - The libraries needed to use linphone
|
||||
# LINPHONE_CPPFLAGS - The compilation flags needed to use linphone
|
||||
# LINPHONE_LDFLAGS - The linking flags needed to use linphone
|
||||
|
||||
find_package(ORTP REQUIRED)
|
||||
find_package(MS2 REQUIRED)
|
||||
find_package(XML2 REQUIRED)
|
||||
find_package(BelleSIP REQUIRED)
|
||||
if(@ENABLE_MSG_STORAGE@)
|
||||
find_package(Sqlite3)
|
||||
endif()
|
||||
|
||||
set(_LINPHONE_ROOT_PATHS
|
||||
${WITH_LINPHONE}
|
||||
${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
find_path(LINPHONE_INCLUDE_DIRS
|
||||
NAMES linphone/linphonecore.h
|
||||
HINTS _LINPHONE_ROOT_PATHS
|
||||
PATH_SUFFIXES include
|
||||
)
|
||||
|
||||
if(LINPHONE_INCLUDE_DIRS)
|
||||
set(HAVE_LINPHONE_LINPHONECORE_H 1)
|
||||
endif()
|
||||
|
||||
find_library(LINPHONE_LIBRARIES
|
||||
NAMES linphone
|
||||
HINTS ${_LINPHONE_ROOT_PATHS}
|
||||
PATH_SUFFIXES bin lib
|
||||
)
|
||||
|
||||
list(APPEND LINPHONE_INCLUDE_DIRS ${ORTP_INCLUDE_DIRS} ${MS2_INCLUDE_DIRS} ${XML2_INCLUDE_DIRS} ${BELLESIP_INCLUDE_DIRS})
|
||||
list(APPEND LINPHONE_LIBRARIES ${ORTP_LIBRARIES} ${MS2_LIBRARIES} ${XML2_LIBRARIES} ${BELLESIP_LIBRARIES})
|
||||
|
||||
if(SQLITE3_FOUND)
|
||||
list(APPEND LINPHONE_INCLUDE_DIRS ${SQLITE3_INCLUDE_DIRS})
|
||||
list(APPEND LINPHONE_LIBRARIES ${SQLITE3_LIBRARIES})
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
list(APPEND LINPHONE_LIBRARIES shlwapi)
|
||||
endif(WIN32)
|
||||
|
||||
list(REMOVE_DUPLICATES LINPHONE_INCLUDE_DIRS)
|
||||
list(REMOVE_DUPLICATES LINPHONE_LIBRARIES)
|
||||
set(LINPHONE_CPPFLAGS "${MS2_CPPFLAGS}")
|
||||
set(LINPHONE_LDFLAGS "${MS2_LDFLAGS} ${BELLESIP_LDFLAGS}")
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Linphone
|
||||
DEFAULT_MSG
|
||||
LINPHONE_INCLUDE_DIRS LINPHONE_LIBRARIES
|
||||
)
|
||||
|
||||
mark_as_advanced(LINPHONE_INCLUDE_DIRS LINPHONE_LIBRARIES LINPHONE_CPPFLAGS LINPHONE_LDFLAGS)
|
||||
|
|
@ -27,7 +27,6 @@
|
|||
# NOTIFY_LIBRARIES - The libraries needed to use libnotify
|
||||
|
||||
set(_NOTIFY_ROOT_PATHS
|
||||
${WITH_NOTIFY}
|
||||
${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -26,10 +26,12 @@
|
|||
# SOUP_INCLUDE_DIRS - the libsoup include directory
|
||||
# SOUP_LIBRARIES - The libraries needed to use libsoup
|
||||
|
||||
if(WIN32)
|
||||
set(GTK2_ADDITIONAL_SUFFIXES "../lib/glib-2.0/include" "../lib/gtk-2.0/include")
|
||||
endif()
|
||||
find_package(GTK2 2.18 REQUIRED gtk)
|
||||
|
||||
set(_SOUP_ROOT_PATHS
|
||||
${WITH_SOUP}
|
||||
${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
|
|
|
|||
55
cmake/FindSqlite3.cmake
Normal file
55
cmake/FindSqlite3.cmake
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
############################################################################
|
||||
# FindSqlite3.cmake
|
||||
# Copyright (C) 2014 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 sqlite3 include file and library
|
||||
#
|
||||
# SQLITE3_FOUND - system has sqlite3
|
||||
# SQLITE3_INCLUDE_DIRS - the sqlite3 include directory
|
||||
# SQLITE3_LIBRARIES - The libraries needed to use sqlite3
|
||||
|
||||
set(_SQLITE3_ROOT_PATHS
|
||||
${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
find_path(SQLITE3_INCLUDE_DIRS
|
||||
NAMES sqlite3.h
|
||||
HINTS _SQLITE3_ROOT_PATHS
|
||||
PATH_SUFFIXES include
|
||||
)
|
||||
|
||||
if(SQLITE3_INCLUDE_DIRS)
|
||||
set(HAVE_SQLITE3_H 1)
|
||||
endif()
|
||||
|
||||
find_library(SQLITE3_LIBRARIES
|
||||
NAMES sqlite3
|
||||
HINTS ${_SQLITE3_ROOT_PATHS}
|
||||
PATH_SUFFIXES bin lib
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Sqlite3
|
||||
DEFAULT_MSG
|
||||
SQLITE3_INCLUDE_DIRS SQLITE3_LIBRARIES HAVE_SQLITE3_H
|
||||
)
|
||||
|
||||
mark_as_advanced(SQLITE3_INCLUDE_DIRS SQLITE3_LIBRARIES HAVE_SQLITE3_H)
|
||||
55
cmake/FindXML2.cmake
Normal file
55
cmake/FindXML2.cmake
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
############################################################################
|
||||
# FindXML2.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 libxml2 include file and library
|
||||
#
|
||||
# XML2_FOUND - system has libxml2
|
||||
# XML2_INCLUDE_DIRS - the libxml2 include directory
|
||||
# XML2_LIBRARIES - The libraries needed to use libxml2
|
||||
|
||||
set(_XML2_ROOT_PATHS
|
||||
${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
|
||||
find_path(XML2_INCLUDE_DIRS
|
||||
NAMES libxml/xmlreader.h
|
||||
HINTS _XML2_ROOT_PATHS
|
||||
PATH_SUFFIXES include/libxml2
|
||||
)
|
||||
|
||||
if(XML2_INCLUDE_DIRS)
|
||||
set(HAVE_LIBXML_XMLREADER_H 1)
|
||||
endif()
|
||||
|
||||
find_library(XML2_LIBRARIES
|
||||
NAMES xml2
|
||||
HINTS ${_XML2_ROOT_PATHS}
|
||||
PATH_SUFFIXES bin lib
|
||||
)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(XML2
|
||||
DEFAULT_MSG
|
||||
XML2_INCLUDE_DIRS XML2_LIBRARIES
|
||||
)
|
||||
|
||||
mark_as_advanced(XML2_INCLUDE_DIRS XML2_LIBRARIES)
|
||||
51
cmake/LinphoneConfig.cmake.in
Normal file
51
cmake/LinphoneConfig.cmake.in
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
############################################################################
|
||||
# LinphoneConfig.cmake
|
||||
# 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.
|
||||
#
|
||||
############################################################################
|
||||
#
|
||||
# Config file for the belle-sip package.
|
||||
# It defines the following variables:
|
||||
#
|
||||
# LINPHONE_FOUND - system has linphone
|
||||
# LINPHONE_INCLUDE_DIRS - the linphone include directory
|
||||
# LINPHONE_LIBRARIES - The libraries needed to use linphone
|
||||
# LINPHONE_CPPFLAGS - The compilation flags needed to use linphone
|
||||
# LINPHONE_LDFLAGS - The linking flags needed to use linphone
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/LinphoneTargets.cmake")
|
||||
find_package(Mediastreamer2 REQUIRED)
|
||||
find_package(BelleSIP REQUIRED)
|
||||
if(@ENABLE_TUNNEL@)
|
||||
find_package(Tunnel)
|
||||
endif()
|
||||
|
||||
get_filename_component(LINPHONE_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
||||
set(LINPHONE_INCLUDE_DIRS "${LINPHONE_CMAKE_DIR}/../../../include")
|
||||
set(LINPHONE_LIBRARIES BelledonneCommunications::linphone)
|
||||
set(LINPHONE_LDFLAGS @LINK_FLAGS@)
|
||||
list(APPEND LINPHONE_INCLUDE_DIRS ${MEDIASTREAMER2_INCLUDE_DIRS} ${BELLESIP_INCLUDE_DIRS})
|
||||
list(APPEND LINPHONE_LIBRARIES ${MEDIASTREAMER2_LIBRARIES} ${BELLESIP_LIBRARIES})
|
||||
set(LINPHONE_CPPFLAGS "${MEDIASTREAMER2_CPPFLAGS}")
|
||||
set(LINPHONE_LDFLAGS "${MEDIASTREAMER2_LDFLAGS} ${BELLESIP_LDFLAGS}")
|
||||
if(TUNNEL_FOUND)
|
||||
list(APPEND LINPHONE_INCLUDE_DIRS ${TUNNEL_INCLUDE_DIRS})
|
||||
list(APPEND LINPHONE_LIBRARIES ${TUNNEL_LIBRARIES})
|
||||
endif()
|
||||
set(LINPHONE_FOUND 1)
|
||||
|
|
@ -29,6 +29,7 @@
|
|||
#define LINPHONE_ALL_LANGS "${LINPHONE_ALL_LANGS}"
|
||||
|
||||
#define LINPHONE_PLUGINS_DIR "${LINPHONE_PLUGINS_DIR}"
|
||||
#define LINPHONE_CONFIG_DIR "${LINPHONE_CONFIG_DIR}"
|
||||
|
||||
#define GETTEXT_PACKAGE "${GETTEXT_PACKAGE}"
|
||||
|
||||
|
|
|
|||
21
configure.ac
21
configure.ac
|
|
@ -1,6 +1,6 @@
|
|||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_INIT([linphone],[3.7.0-linphone-daemon],[linphone-developers@nongnu.org])
|
||||
AC_INIT([linphone],[3.8.0-linphone-daemon],[linphone-developers@nongnu.org])
|
||||
AC_CANONICAL_SYSTEM
|
||||
AC_CONFIG_SRCDIR([coreapi/linphonecore.c])
|
||||
|
||||
|
|
@ -30,7 +30,7 @@ AC_SUBST(LINPHONE_VERSION)
|
|||
AC_MSG_NOTICE([$PACKAGE_NAME-$PACKAGE_VERSION A full featured audio/video sip phone.])
|
||||
AC_MSG_NOTICE([licensed under the terms of the General Public License (GPL)])
|
||||
|
||||
AM_INIT_AUTOMAKE([1.9 tar-pax])
|
||||
AM_INIT_AUTOMAKE([1.9 tar-pax subdir-objects])
|
||||
AC_SUBST([LIBTOOL_DEPS])
|
||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],)
|
||||
AC_SUBST([docdir], [${datadir}/doc])
|
||||
|
|
@ -71,7 +71,7 @@ case $target in
|
|||
mingw_found=yes
|
||||
AC_CHECK_TOOL(WINDRES, windres)
|
||||
;;
|
||||
armv6-apple-darwin|armv7-apple-darwin|i386-apple-darwin|armv7s-apple-darwin)
|
||||
armv6-apple-darwin|armv7-apple-darwin|i386-apple-darwin|armv7s-apple-darwin|aarch64-apple-darwin|*-apple-darwin.ios)
|
||||
CFLAGS="$CFLAGS -DTARGET_OS_IPHONE=1 "
|
||||
LIBS="$LIBS -framework CoreFoundation -framework AudioToolbox -framework CoreAudio -framework Foundation -framework QuartzCore -framework OpenGLES -framework UIKit -framework AVFoundation"
|
||||
ios_found=yes
|
||||
|
|
@ -377,15 +377,6 @@ if test "$gtk_ui" = "true" ; then
|
|||
fi
|
||||
fi
|
||||
|
||||
case "$target" in
|
||||
#macosx 64 bits
|
||||
x86_64-apple-darwin*)
|
||||
LIBS="$LIBS -mmacosx-version-min=10.6"
|
||||
CXXFLAGS="$CXXFLAGS -mmacosx-version-min=10.6"
|
||||
CFLAGS="$CFLAGS -mmacosx-version-min=10.6"
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl os-specific problems not handled by existing macros.
|
||||
case "$host_os" in
|
||||
*freebsd*)
|
||||
|
|
@ -769,7 +760,7 @@ AC_ARG_ENABLE(external-ortp,
|
|||
)
|
||||
|
||||
if test "$external_ortp" = 'true'; then
|
||||
PKG_CHECK_MODULES([ORTP], [ortp >= 0.23.0])
|
||||
PKG_CHECK_MODULES([ORTP], [ortp >= 0.24.0])
|
||||
ORTP_VERSION=`$PKG_CONFIG --modversion ortp`
|
||||
else
|
||||
AC_CONFIG_SUBDIRS( oRTP )
|
||||
|
|
@ -798,7 +789,7 @@ AC_ARG_ENABLE([external-mediastreamer],
|
|||
|
||||
AS_CASE($enable_external_mediastreamer,
|
||||
[yes],
|
||||
[PKG_CHECK_MODULES([MEDIASTREAMER], [mediastreamer >= 2.10.0])
|
||||
[PKG_CHECK_MODULES([MEDIASTREAMER], [mediastreamer >= 2.11.0])
|
||||
MS2_VERSION=`$PKG_CONFIG --modversion mediastreamer`],
|
||||
[no],
|
||||
[AC_CONFIG_SUBDIRS( mediastreamer2 )
|
||||
|
|
@ -869,7 +860,7 @@ fi
|
|||
|
||||
AM_CONDITIONAL(BUILD_MSG_STORAGE, test x$enable_msg_storage = xtrue)
|
||||
|
||||
PKG_CHECK_MODULES(BELLESIP, [belle-sip >= 1.3.1])
|
||||
PKG_CHECK_MODULES(BELLESIP, [belle-sip >= 1.4.0])
|
||||
|
||||
SIPSTACK_CFLAGS="$BELLESIP_CFLAGS"
|
||||
SIPSTACK_LIBS="$BELLESIP_LIBS"
|
||||
|
|
|
|||
|
|
@ -25,6 +25,10 @@ if(MSVC)
|
|||
find_library(LIBMINGWEX NAMES mingwex)
|
||||
endif()
|
||||
|
||||
if(NOT WIN32)
|
||||
find_package(Iconv)
|
||||
endif()
|
||||
|
||||
|
||||
set(SOURCE_FILES
|
||||
address.c
|
||||
|
|
@ -59,6 +63,7 @@ set(SOURCE_FILES
|
|||
friend.c
|
||||
info.c
|
||||
ldap/ldapprovider.c
|
||||
lime.c
|
||||
linphonecall.c
|
||||
linphonecore.c
|
||||
linphonecore.h
|
||||
|
|
@ -87,6 +92,7 @@ set(SOURCE_FILES
|
|||
xml2lpc.c
|
||||
xml2lpc.h
|
||||
xml.c
|
||||
vtables.c
|
||||
)
|
||||
if(ENABLE_TUNNEL)
|
||||
list(APPEND SOURCE_FILES
|
||||
|
|
@ -118,12 +124,15 @@ set(LIBS
|
|||
${LIBGCC}
|
||||
${LIBMINGWEX}
|
||||
${BELLESIP_LIBRARIES}
|
||||
${MS2_LIBRARIES}
|
||||
${MEDIASTREAMER2_LIBRARIES}
|
||||
${XML2_LIBRARIES}
|
||||
)
|
||||
if(SQLITE3_FOUND)
|
||||
list(APPEND LIBS ${SQLITE3_LIBRARIES})
|
||||
endif()
|
||||
if(ICONV_FOUND)
|
||||
list(APPEND LIBS ${ICONV_LIBRARIES})
|
||||
endif()
|
||||
if(ENABLE_TUNNEL)
|
||||
list(APPEND LIBS ${TUNNEL_LIBRARIES})
|
||||
endif()
|
||||
|
|
@ -150,8 +159,11 @@ else()
|
|||
endif()
|
||||
endif()
|
||||
endif()
|
||||
if(ICONV_FOUND)
|
||||
target_include_directories(linphone PUBLIC ${ICONV_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
install(TARGETS linphone
|
||||
install(TARGETS linphone EXPORT LinphoneTargets
|
||||
RUNTIME DESTINATION bin
|
||||
LIBRARY DESTINATION lib
|
||||
ARCHIVE DESTINATION lib
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ GITREVISION=`cd $(top_srcdir) && git rev-parse HEAD`
|
|||
## We can't only depend on the presence of the .git/ directory anymore,
|
||||
## because of gits submodule handling.
|
||||
## We now simply issue a git log on configure.ac and if the output is empty (error or file not tracked), then we are not in git.
|
||||
GITLOG=$(shell git log -1 --pretty=format:%H $(top_srcdir)/configure.ac)
|
||||
GITLOG=`cd $(top_srcdir) && git log -1 --pretty=format:%H configure.ac`
|
||||
|
||||
ECHO=/bin/echo
|
||||
|
||||
|
|
@ -65,6 +65,7 @@ liblinphone_la_SOURCES=\
|
|||
linphonecore_utils.h \
|
||||
localplayer.c \
|
||||
lpc2xml.c \
|
||||
lime.c lime.h\
|
||||
lpconfig.c lpconfig.h \
|
||||
lsd.c \
|
||||
message_storage.c \
|
||||
|
|
@ -81,6 +82,7 @@ liblinphone_la_SOURCES=\
|
|||
sipsetup.c sipsetup.h \
|
||||
xml2lpc.c \
|
||||
xml.c \
|
||||
vtables.c \
|
||||
$(GITVERSION_FILE)
|
||||
|
||||
if BUILD_UPNP
|
||||
|
|
|
|||
|
|
@ -18,6 +18,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
*/
|
||||
#include "sal_impl.h"
|
||||
|
||||
#include "linphonecore.h"
|
||||
#include "private.h"
|
||||
#include "lime.h"
|
||||
#include <libxml/xmlwriter.h>
|
||||
|
||||
static void process_error( SalOp* op) {
|
||||
if (op->dir == SalOpDirOutgoing) {
|
||||
op->base.root->callbacks.text_delivery_update(op, SalTextDeliveryFailed);
|
||||
|
|
@ -56,14 +61,22 @@ static void process_response_event(void *op_base, const belle_sip_response_event
|
|||
}
|
||||
|
||||
static bool_t is_rcs_filetransfer(belle_sip_header_content_type_t* content_type) {
|
||||
return strcmp("application",belle_sip_header_content_type_get_type(content_type))==0
|
||||
&& strcmp("vnd.gsma.rcs-ft-http+xml",belle_sip_header_content_type_get_subtype(content_type))==0;
|
||||
return (strcmp("application",belle_sip_header_content_type_get_type(content_type))==0)
|
||||
&& ((strcmp("vnd.gsma.rcs-ft-http+xml",belle_sip_header_content_type_get_subtype(content_type))==0) || (strcmp("cipher.vnd.gsma.rcs-ft-http+xml",belle_sip_header_content_type_get_subtype(content_type))==0));
|
||||
}
|
||||
|
||||
static bool_t is_plain_text(belle_sip_header_content_type_t* content_type) {
|
||||
return strcmp("text",belle_sip_header_content_type_get_type(content_type))==0
|
||||
&& strcmp("plain",belle_sip_header_content_type_get_subtype(content_type))==0;
|
||||
}
|
||||
|
||||
static bool_t is_cipher_xml(belle_sip_header_content_type_t* content_type) {
|
||||
return (strcmp("xml",belle_sip_header_content_type_get_type(content_type))==0
|
||||
&& strcmp("cipher",belle_sip_header_content_type_get_subtype(content_type))==0)
|
||||
|
||||
|| (strcmp("application",belle_sip_header_content_type_get_type(content_type))==0
|
||||
&& strcmp("cipher.vnd.gsma.rcs-ft-http+xml",belle_sip_header_content_type_get_subtype(content_type))==0);
|
||||
}
|
||||
static bool_t is_external_body(belle_sip_header_content_type_t* content_type) {
|
||||
return strcmp("message",belle_sip_header_content_type_get_type(content_type))==0
|
||||
&& strcmp("external-body",belle_sip_header_content_type_get_subtype(content_type))==0;
|
||||
|
|
@ -74,7 +87,7 @@ static bool_t is_im_iscomposing(belle_sip_header_content_type_t* content_type) {
|
|||
}
|
||||
|
||||
static void add_message_accept(belle_sip_message_t *msg){
|
||||
belle_sip_message_add_header(msg,belle_sip_header_create("Accept","text/plain, message/external-body, application/im-iscomposing+xml, application/vnd.gsma.rcs-ft-http+xml"));
|
||||
belle_sip_message_add_header(msg,belle_sip_header_create("Accept","text/plain, message/external-body, application/im-iscomposing+xml, xml/cipher, application/vnd.gsma.rcs-ft-http+xml, application/cipher.vnd.gsma.rcs-ft-http+xml"));
|
||||
}
|
||||
|
||||
void sal_process_incoming_message(SalOp *op,const belle_sip_request_event_t *event){
|
||||
|
|
@ -84,19 +97,74 @@ void sal_process_incoming_message(SalOp *op,const belle_sip_request_event_t *eve
|
|||
belle_sip_header_from_t* from_header;
|
||||
belle_sip_header_content_type_t* content_type;
|
||||
belle_sip_response_t* resp;
|
||||
int errcode=500;
|
||||
belle_sip_header_call_id_t* call_id = belle_sip_message_get_header_by_type(req,belle_sip_header_call_id_t);
|
||||
belle_sip_header_cseq_t* cseq = belle_sip_message_get_header_by_type(req,belle_sip_header_cseq_t);
|
||||
belle_sip_header_date_t *date=belle_sip_message_get_header_by_type(req,belle_sip_header_date_t);
|
||||
char* from;
|
||||
bool_t plain_text=FALSE;
|
||||
bool_t external_body=FALSE;
|
||||
bool_t cipher_xml=FALSE;
|
||||
bool_t rcs_filetransfer=FALSE;
|
||||
uint8_t *decryptedMessage = NULL;
|
||||
|
||||
from_header=belle_sip_message_get_header_by_type(BELLE_SIP_MESSAGE(req),belle_sip_header_from_t);
|
||||
content_type=belle_sip_message_get_header_by_type(BELLE_SIP_MESSAGE(req),belle_sip_header_content_type_t);
|
||||
/* check if we have a xml/cipher message to be decrypted */
|
||||
if (content_type && (cipher_xml=is_cipher_xml(content_type))) {
|
||||
/* access the zrtp cache to get keys needed to decipher the message */
|
||||
LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op));
|
||||
FILE *CACHEFD = fopen(lc->zrtp_secrets_cache, "rb+");
|
||||
if (CACHEFD == NULL) {
|
||||
ms_warning("Unable to access ZRTP ZID cache to decrypt message");
|
||||
goto error;
|
||||
} else {
|
||||
size_t cacheSize;
|
||||
char *cacheString;
|
||||
int retval;
|
||||
xmlDocPtr cacheXml;
|
||||
|
||||
cacheString=ms_load_file_content(CACHEFD, &cacheSize);
|
||||
if (!cacheString){
|
||||
ms_warning("Unable to load content of ZRTP ZID cache to decrypt message");
|
||||
goto error;
|
||||
}
|
||||
cacheString[cacheSize] = '\0';
|
||||
cacheSize += 1;
|
||||
fclose(CACHEFD);
|
||||
cacheXml = xmlParseDoc((xmlChar*)cacheString);
|
||||
ms_free(cacheString);
|
||||
retval = lime_decryptMultipartMessage(cacheXml, (uint8_t *)belle_sip_message_get_body(BELLE_SIP_MESSAGE(req)), &decryptedMessage);
|
||||
if (retval != 0) {
|
||||
ms_warning("Unable to decrypt message, reason : %s - op [%p]", lime_error_code_to_string(retval), op);
|
||||
free(decryptedMessage);
|
||||
xmlFreeDoc(cacheXml);
|
||||
errcode = 488;
|
||||
goto error;
|
||||
} else {
|
||||
/* dump updated cache to a string */
|
||||
xmlChar *xmlStringOutput;
|
||||
int xmlStringLength;
|
||||
xmlDocDumpFormatMemoryEnc(cacheXml, &xmlStringOutput, &xmlStringLength, "UTF-8", 0);
|
||||
/* write it to the cache file */
|
||||
CACHEFD = fopen(lc->zrtp_secrets_cache, "wb+");
|
||||
if (fwrite(xmlStringOutput, 1, xmlStringLength, CACHEFD)<=0){
|
||||
ms_warning("Fail to write cache");
|
||||
}
|
||||
xmlFree(xmlStringOutput);
|
||||
fclose(CACHEFD);
|
||||
}
|
||||
|
||||
xmlFreeDoc(cacheXml);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
rcs_filetransfer=is_rcs_filetransfer(content_type);
|
||||
if (content_type && ((plain_text=is_plain_text(content_type))
|
||||
|| (external_body=is_external_body(content_type))
|
||||
|| (rcs_filetransfer=is_rcs_filetransfer(content_type)))) {
|
||||
|| (decryptedMessage!=NULL)
|
||||
|| rcs_filetransfer)) {
|
||||
SalMessage salmsg;
|
||||
char message_id[256]={0};
|
||||
|
||||
|
|
@ -111,7 +179,12 @@ void sal_process_incoming_message(SalOp *op,const belle_sip_request_event_t *eve
|
|||
,belle_sip_header_call_id_get_call_id(call_id)
|
||||
,belle_sip_header_cseq_get_seq_number(cseq));
|
||||
salmsg.from=from;
|
||||
salmsg.text=(plain_text||rcs_filetransfer)?belle_sip_message_get_body(BELLE_SIP_MESSAGE(req)):NULL;
|
||||
/* if we just deciphered a message, use the deciphered part(which can be a rcs xml body pointing to the file to retreive from server)*/
|
||||
if (cipher_xml) {
|
||||
salmsg.text = (char *)decryptedMessage;
|
||||
} else { /* message body wasn't ciphered */
|
||||
salmsg.text=(plain_text||rcs_filetransfer)?belle_sip_message_get_body(BELLE_SIP_MESSAGE(req)):NULL;
|
||||
}
|
||||
salmsg.url=NULL;
|
||||
salmsg.content_type = NULL;
|
||||
if (rcs_filetransfer) { /* if we have a rcs file transfer, set the type, message body (stored in salmsg.text) contains all needed information to retrieve the file */
|
||||
|
|
@ -125,6 +198,8 @@ void sal_process_incoming_message(SalOp *op,const belle_sip_request_event_t *eve
|
|||
salmsg.message_id=message_id;
|
||||
salmsg.time=date ? belle_sip_header_date_get_time(date) : time(NULL);
|
||||
op->base.root->callbacks.text_received(op,&salmsg);
|
||||
|
||||
free(decryptedMessage);
|
||||
belle_sip_object_unref(address);
|
||||
belle_sip_free(from);
|
||||
if (salmsg.url) ms_free((char*)salmsg.url);
|
||||
|
|
@ -145,8 +220,14 @@ void sal_process_incoming_message(SalOp *op,const belle_sip_request_event_t *eve
|
|||
resp = belle_sip_response_create_from_request(req,415);
|
||||
add_message_accept((belle_sip_message_t*)resp);
|
||||
belle_sip_server_transaction_send_response(server_transaction,resp);
|
||||
sal_op_release(op);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
error:
|
||||
resp = belle_sip_response_create_from_request(req, errcode);
|
||||
belle_sip_server_transaction_send_response(server_transaction,resp);
|
||||
sal_op_release(op);
|
||||
}
|
||||
|
||||
static void process_request_event(void *op_base, const belle_sip_request_event_t *event) {
|
||||
|
|
@ -154,11 +235,13 @@ static void process_request_event(void *op_base, const belle_sip_request_event_t
|
|||
sal_process_incoming_message(op,event);
|
||||
}
|
||||
|
||||
int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg){
|
||||
int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg, const char *peer_uri){
|
||||
belle_sip_request_t* req;
|
||||
char content_type_raw[256];
|
||||
size_t content_length = msg?strlen(msg):0;
|
||||
time_t curtime=time(NULL);
|
||||
uint8_t *multipartEncryptedMessage = NULL;
|
||||
int retval;
|
||||
|
||||
if (op->dialog){
|
||||
/*for SIP MESSAGE that are sent in call's dialog*/
|
||||
|
|
@ -179,13 +262,70 @@ int sal_message_send(SalOp *op, const char *from, const char *to, const char* co
|
|||
belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),BELLE_SIP_HEADER(sal_op_create_contact(op)));
|
||||
}
|
||||
}
|
||||
|
||||
/* shall we try to encrypt the message?*/
|
||||
if ((strcmp(content_type, "xml/cipher") == 0) || ((strcmp(content_type, "application/cipher.vnd.gsma.rcs-ft-http+xml") == 0))) {
|
||||
/* access the zrtp cache to get keys needed to cipher the message */
|
||||
LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op));
|
||||
FILE *CACHEFD = fopen(lc->zrtp_secrets_cache, "rb+");
|
||||
if (CACHEFD == NULL) {
|
||||
ms_warning("Unable to access ZRTP ZID cache to encrypt message");
|
||||
/*probably not a good idea to do this:*/
|
||||
sal_error_info_set(&op->error_info, SalReasonNotAcceptable, 488, "Unable to encrypt IM", NULL);
|
||||
op->base.root->callbacks.text_delivery_update(op,SalTextDeliveryFailed);
|
||||
return -1;
|
||||
} else {
|
||||
size_t cacheSize;
|
||||
char *cacheString;
|
||||
xmlDocPtr cacheXml;
|
||||
int retval;
|
||||
|
||||
cacheString=ms_load_file_content(CACHEFD, &cacheSize);
|
||||
if (!cacheString){
|
||||
ms_warning("Unable to load content of ZRTP ZID cache to encrypt message");
|
||||
return -1;
|
||||
}
|
||||
cacheString[cacheSize] = '\0';
|
||||
cacheSize += 1;
|
||||
fclose(CACHEFD);
|
||||
cacheXml = xmlParseDoc((xmlChar*)cacheString);
|
||||
ms_free(cacheString);
|
||||
retval = lime_createMultipartMessage(cacheXml, (uint8_t *)msg, (uint8_t *)peer_uri, &multipartEncryptedMessage);
|
||||
if (retval != 0) {
|
||||
ms_warning("Unable to encrypt message for %s : %s - op [%p]", peer_uri, lime_error_code_to_string(retval), op);
|
||||
xmlFreeDoc(cacheXml);
|
||||
free(multipartEncryptedMessage);
|
||||
/*probably not a good idea to do this:*/
|
||||
sal_error_info_set(&op->error_info, SalReasonNotAcceptable, 488, "Unable to encrypt IM", NULL);
|
||||
op->base.root->callbacks.text_delivery_update(op,SalTextDeliveryFailed);
|
||||
return -1;
|
||||
} else {
|
||||
/* dump updated cache to a string */
|
||||
xmlChar *xmlStringOutput;
|
||||
int xmlStringLength;
|
||||
xmlDocDumpFormatMemoryEnc(cacheXml, &xmlStringOutput, &xmlStringLength, "UTF-8", 0);
|
||||
/* write it to the cache file */
|
||||
CACHEFD = fopen(lc->zrtp_secrets_cache, "wb+");
|
||||
if (fwrite(xmlStringOutput, 1, xmlStringLength, CACHEFD)<=0){
|
||||
ms_warning("Unable to write zid cache");
|
||||
}
|
||||
xmlFree(xmlStringOutput);
|
||||
fclose(CACHEFD);
|
||||
content_length = strlen((const char *)multipartEncryptedMessage);
|
||||
}
|
||||
xmlFreeDoc(cacheXml);
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(content_type_raw,sizeof(content_type_raw),BELLE_SIP_CONTENT_TYPE ": %s",content_type);
|
||||
belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),BELLE_SIP_HEADER(belle_sip_header_content_type_parse(content_type_raw)));
|
||||
belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),BELLE_SIP_HEADER(belle_sip_header_content_length_create(content_length)));
|
||||
belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),BELLE_SIP_HEADER(belle_sip_header_date_create_from_time(&curtime)));
|
||||
belle_sip_message_set_body(BELLE_SIP_MESSAGE(req),msg,content_length);
|
||||
return sal_op_send_request(op,req);
|
||||
belle_sip_message_set_body(BELLE_SIP_MESSAGE(req),(multipartEncryptedMessage==NULL)?msg:(const char *)multipartEncryptedMessage,content_length);
|
||||
retval = sal_op_send_request(op,req);
|
||||
free(multipartEncryptedMessage);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
int sal_message_reply(SalOp *op, SalReason reason){
|
||||
|
|
@ -200,7 +340,7 @@ int sal_message_reply(SalOp *op, SalReason reason){
|
|||
}
|
||||
|
||||
int sal_text_send(SalOp *op, const char *from, const char *to, const char *msg) {
|
||||
return sal_message_send(op,from,to,"text/plain",msg);
|
||||
return sal_message_send(op,from,to,"text/plain",msg, NULL);
|
||||
}
|
||||
|
||||
static belle_sip_listener_callbacks_t op_message_callbacks={0};
|
||||
|
|
|
|||
|
|
@ -147,8 +147,10 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia
|
|||
/* we already started media: check if we really need to restart it*/
|
||||
if (oldmd){
|
||||
int md_changed = media_parameters_changed(call, oldmd, new_md);
|
||||
if ((md_changed & SAL_MEDIA_DESCRIPTION_CODEC_CHANGED) || call->playing_ringbacktone) {
|
||||
if ((md_changed & SAL_MEDIA_DESCRIPTION_CODEC_CHANGED)){
|
||||
ms_message("Media descriptions are different, need to restart the streams.");
|
||||
} else if ( call->playing_ringbacktone) {
|
||||
ms_message("Playing ringback tone, will restart the streams.");
|
||||
} else {
|
||||
if (md_changed == SAL_MEDIA_DESCRIPTION_UNCHANGED) {
|
||||
if (call->all_muted){
|
||||
|
|
@ -391,6 +393,19 @@ static void try_early_media_forking(LinphoneCall *call, SalMediaDescription *md)
|
|||
}
|
||||
}
|
||||
|
||||
static void start_remote_ring(LinphoneCore *lc, LinphoneCall *call) {
|
||||
if (lc->sound_conf.play_sndcard!=NULL){
|
||||
MSSndCard *ringcard=lc->sound_conf.lsd_card ? lc->sound_conf.lsd_card : lc->sound_conf.play_sndcard;
|
||||
if (call->localdesc->streams[0].max_rate>0) ms_snd_card_set_preferred_sample_rate(ringcard, call->localdesc->streams[0].max_rate);
|
||||
/*we release sound before playing ringback tone*/
|
||||
if (call->audiostream)
|
||||
audio_stream_unprepare_sound(call->audiostream);
|
||||
if( lc->sound_conf.remote_ring ){
|
||||
lc->ringstream=ring_start(lc->sound_conf.remote_ring,2000,ringcard);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void call_ringing(SalOp *h){
|
||||
LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(h));
|
||||
LinphoneCall *call=(LinphoneCall*)sal_op_get_user_pointer(h);
|
||||
|
|
@ -411,16 +426,7 @@ static void call_ringing(SalOp *h){
|
|||
return;
|
||||
}
|
||||
if (lc->ringstream!=NULL) return;/*already ringing !*/
|
||||
if (lc->sound_conf.play_sndcard!=NULL){
|
||||
MSSndCard *ringcard=lc->sound_conf.lsd_card ? lc->sound_conf.lsd_card : lc->sound_conf.play_sndcard;
|
||||
if (call->localdesc->streams[0].max_rate>0) ms_snd_card_set_preferred_sample_rate(ringcard, call->localdesc->streams[0].max_rate);
|
||||
/*we release sound before playing ringback tone*/
|
||||
if (call->audiostream)
|
||||
audio_stream_unprepare_sound(call->audiostream);
|
||||
if( lc->sound_conf.remote_ring ){
|
||||
lc->ringstream=ring_start(lc->sound_conf.remote_ring,2000,ringcard);
|
||||
}
|
||||
}
|
||||
start_remote_ring(lc, call);
|
||||
ms_message("Remote ringing...");
|
||||
linphone_core_notify_display_status(lc,_("Remote ringing..."));
|
||||
linphone_call_set_state(call,LinphoneCallOutgoingRinging,"Remote ringing");
|
||||
|
|
@ -444,6 +450,10 @@ static void call_ringing(SalOp *h){
|
|||
linphone_core_stop_ringing(lc);
|
||||
ms_message("Doing early media...");
|
||||
linphone_core_update_streams(lc,call,md);
|
||||
if ((linphone_call_params_get_audio_direction(linphone_call_get_current_params(call)) == LinphoneMediaDirectionInactive) && call->audiostream) {
|
||||
if (lc->ringstream != NULL) return; /* Already ringing! */
|
||||
start_remote_ring(lc, call);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -455,23 +465,24 @@ static void call_ringing(SalOp *h){
|
|||
static void call_accepted(SalOp *op){
|
||||
LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op));
|
||||
LinphoneCall *call=(LinphoneCall*)sal_op_get_user_pointer(op);
|
||||
SalMediaDescription *md;
|
||||
SalMediaDescription *md, *rmd;
|
||||
bool_t update_state=TRUE;
|
||||
|
||||
if (call==NULL){
|
||||
ms_warning("No call to accept.");
|
||||
return ;
|
||||
}
|
||||
rmd=sal_call_get_remote_media_description(op);
|
||||
/*set privacy*/
|
||||
call->current_params->privacy=(LinphonePrivacyMask)sal_op_get_privacy(call->op);
|
||||
|
||||
/* Handle remote ICE attributes if any. */
|
||||
if (call->ice_session != NULL) {
|
||||
linphone_call_update_ice_from_remote_media_description(call, sal_call_get_remote_media_description(op));
|
||||
if (call->ice_session != NULL && rmd) {
|
||||
linphone_call_update_ice_from_remote_media_description(call, rmd);
|
||||
}
|
||||
#ifdef BUILD_UPNP
|
||||
if (call->upnp_session != NULL) {
|
||||
linphone_core_update_upnp_from_remote_media_description(call, sal_call_get_remote_media_description(op));
|
||||
if (call->upnp_session != NULL && rmd) {
|
||||
linphone_core_update_upnp_from_remote_media_description(call, rmd);
|
||||
}
|
||||
#endif //BUILD_UPNP
|
||||
|
||||
|
|
|
|||
216
coreapi/chat.c
216
coreapi/chat.c
|
|
@ -26,14 +26,18 @@
|
|||
#include "private.h"
|
||||
#include "lpconfig.h"
|
||||
#include "belle-sip/belle-sip.h"
|
||||
#include "lime.h"
|
||||
#include "ortp/b64.h"
|
||||
|
||||
#include <libxml/parser.h>
|
||||
#include <libxml/tree.h>
|
||||
#include <libxml/xmlwriter.h>
|
||||
|
||||
#define COMPOSING_DEFAULT_IDLE_TIMEOUT 15
|
||||
#define COMPOSING_DEFAULT_REFRESH_TIMEOUT 60
|
||||
#define COMPOSING_DEFAULT_REMOTE_REFRESH_TIMEOUT 120
|
||||
|
||||
#define FILE_TRANSFER_KEY_SIZE 32
|
||||
|
||||
static LinphoneChatMessageCbs * linphone_chat_message_cbs_new(void) {
|
||||
return belle_sip_object_new(LinphoneChatMessageCbs);
|
||||
|
|
@ -176,6 +180,7 @@ static void process_io_error_upload(void *data, const belle_sip_io_error_event_t
|
|||
if (msg->cb) {
|
||||
msg->cb(msg, LinphoneChatMessageStateNotDelivered, msg->cb_ud);
|
||||
}
|
||||
|
||||
if (linphone_chat_message_cbs_get_msg_state_changed(msg->callbacks)) {
|
||||
linphone_chat_message_cbs_get_msg_state_changed(msg->callbacks)(msg, LinphoneChatMessageStateNotDelivered);
|
||||
}
|
||||
|
|
@ -244,18 +249,49 @@ static int linphone_chat_message_file_transfer_on_send_body(belle_sip_user_body_
|
|||
|
||||
/* if we've not reach the end of file yet, ask for more data*/
|
||||
if (offset<linphone_content_get_size(chatMsg->file_transfer_information)){
|
||||
/* get data from call back */
|
||||
if (linphone_chat_message_cbs_get_file_transfer_send(chatMsg->callbacks)) {
|
||||
LinphoneBuffer *lb = linphone_chat_message_cbs_get_file_transfer_send(chatMsg->callbacks)(chatMsg, chatMsg->file_transfer_information, offset, *size);
|
||||
if (lb == NULL) *size = 0;
|
||||
else {
|
||||
*size = linphone_buffer_get_size(lb);
|
||||
memcpy(buffer, linphone_buffer_get_content(lb), *size);
|
||||
linphone_buffer_unref(lb);
|
||||
|
||||
if (linphone_content_get_key(chatMsg->file_transfer_information) != NULL) { /* if we have a key to cipher the message, use it! */
|
||||
char *plainBuffer;
|
||||
/* get data from callback to a plainBuffer */
|
||||
/* if this chunk is not the last one, the lenght must be a multiple of block cipher size(16 bytes)*/
|
||||
if (offset+*size < linphone_content_get_size(chatMsg->file_transfer_information)) {
|
||||
*size -=(*size%16);
|
||||
}
|
||||
plainBuffer = (char *)malloc(*size);
|
||||
if (linphone_chat_message_cbs_get_file_transfer_send(chatMsg->callbacks)) {
|
||||
LinphoneBuffer *lb = linphone_chat_message_cbs_get_file_transfer_send(chatMsg->callbacks)(chatMsg, chatMsg->file_transfer_information, offset, *size);
|
||||
if (lb == NULL) *size = 0;
|
||||
else {
|
||||
*size = linphone_buffer_get_size(lb);
|
||||
memcpy(plainBuffer, linphone_buffer_get_content(lb), *size);
|
||||
linphone_buffer_unref(lb);
|
||||
}
|
||||
} else {
|
||||
/* Legacy */
|
||||
linphone_core_notify_file_transfer_send(lc, chatMsg, chatMsg->file_transfer_information, plainBuffer, size);
|
||||
}
|
||||
|
||||
lime_encryptFile(linphone_content_get_cryptoContext_address(chatMsg->file_transfer_information), (unsigned char *)linphone_content_get_key(chatMsg->file_transfer_information), *size, plainBuffer, (char*)buffer);
|
||||
free(plainBuffer);
|
||||
/* check if we reach the end of file */
|
||||
if (offset+*size >= linphone_content_get_size(chatMsg->file_transfer_information)) {
|
||||
/* conclude file ciphering by calling it context with a zero size */
|
||||
lime_encryptFile(linphone_content_get_cryptoContext_address(chatMsg->file_transfer_information), NULL, 0, NULL, NULL);
|
||||
}
|
||||
} else {
|
||||
/* Legacy */
|
||||
linphone_core_notify_file_transfer_send(lc, chatMsg, chatMsg->file_transfer_information, buf, size);
|
||||
/* get data from call back */
|
||||
if (linphone_chat_message_cbs_get_file_transfer_send(chatMsg->callbacks)) {
|
||||
LinphoneBuffer *lb = linphone_chat_message_cbs_get_file_transfer_send(chatMsg->callbacks)(chatMsg, chatMsg->file_transfer_information, offset, *size);
|
||||
if (lb == NULL) *size = 0;
|
||||
else {
|
||||
*size = linphone_buffer_get_size(lb);
|
||||
memcpy(buffer, linphone_buffer_get_content(lb), *size);
|
||||
linphone_buffer_unref(lb);
|
||||
}
|
||||
} else {
|
||||
/* Legacy */
|
||||
linphone_core_notify_file_transfer_send(lc, chatMsg, chatMsg->file_transfer_information, buf, size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -286,8 +322,19 @@ static void linphone_chat_message_process_response_from_post_file(void *data, co
|
|||
char *first_part_header;
|
||||
belle_sip_body_handler_t *first_part_bh;
|
||||
|
||||
/* temporary storage for the Content-disposition header value */
|
||||
first_part_header = belle_sip_strdup_printf("form-data; name=\"File\"; filename=\"%s\"", linphone_content_get_name(msg->file_transfer_information));
|
||||
/* shall we encrypt the file */
|
||||
if (linphone_core_lime_enabled(msg->chat_room->lc)) {
|
||||
char keyBuffer[FILE_TRANSFER_KEY_SIZE]; /* temporary storage of generated key: 192 bits of key + 64 bits of initial vector */
|
||||
/* generate a random 192 bits key + 64 bits of initial vector and store it into the file_transfer_information->key field of the message */
|
||||
sal_get_random_bytes((unsigned char *)keyBuffer, FILE_TRANSFER_KEY_SIZE);
|
||||
linphone_content_set_key(msg->file_transfer_information, keyBuffer, FILE_TRANSFER_KEY_SIZE); /* key is duplicated in the content private structure */
|
||||
/* temporary storage for the Content-disposition header value : use a generic filename to not leak it
|
||||
* Actual filename stored in msg->file_transfer_information->name will be set in encrypted message sended to the */
|
||||
first_part_header = belle_sip_strdup_printf("form-data; name=\"File\"; filename=\"filename.txt\"");
|
||||
} else {
|
||||
/* temporary storage for the Content-disposition header value */
|
||||
first_part_header = belle_sip_strdup_printf("form-data; name=\"File\"; filename=\"%s\"", linphone_content_get_name(msg->file_transfer_information));
|
||||
}
|
||||
|
||||
/* create a user body handler to take care of the file and add the content disposition and content-type headers */
|
||||
if (msg->file_transfer_filepath != NULL) {
|
||||
|
|
@ -324,11 +371,65 @@ static void linphone_chat_message_process_response_from_post_file(void *data, co
|
|||
l=belle_http_request_listener_create_from_callbacks(&cbs,msg);
|
||||
belle_http_provider_send_request(msg->chat_room->lc->http_provider,msg->http_request,l);
|
||||
}
|
||||
if (code == 200 ) { /* file has been uploaded correctly, get server reply and send it */
|
||||
|
||||
if (code == 200 ) { /* file has been uplaoded correctly, get server reply and send it */
|
||||
const char *body = belle_sip_message_get_body((belle_sip_message_t *)event->response);
|
||||
belle_sip_object_unref(msg->http_request);
|
||||
msg->http_request = NULL;
|
||||
msg->message = ms_strdup(body);
|
||||
|
||||
/* if we have an encryption key for the file, we must insert it into the message and restore the correct filename */
|
||||
if (linphone_content_get_key(msg->file_transfer_information) != NULL) {
|
||||
/* parse the message body */
|
||||
xmlDocPtr xmlMessageBody = xmlParseDoc((const xmlChar *)body);
|
||||
|
||||
xmlNodePtr cur = xmlDocGetRootElement(xmlMessageBody);
|
||||
if (cur != NULL) {
|
||||
cur = cur->xmlChildrenNode;
|
||||
while (cur!=NULL) {
|
||||
if (!xmlStrcmp(cur->name, (const xmlChar *)"file-info")) { /* we found a file info node, check it has a type="file" attribute */
|
||||
xmlChar *typeAttribute = xmlGetProp(cur, (const xmlChar *)"type");
|
||||
if(!xmlStrcmp(typeAttribute, (const xmlChar *)"file")) { /* this is the node we are looking for : add a file-key children node */
|
||||
xmlNodePtr fileInfoNodeChildren = cur->xmlChildrenNode; /* need to parse the children node to update the file-name one */
|
||||
/* convert key to base64 */
|
||||
int b64Size = b64_encode(NULL, FILE_TRANSFER_KEY_SIZE, NULL, 0);
|
||||
char *keyb64 = (char *)malloc(b64Size+1);
|
||||
int xmlStringLength;
|
||||
|
||||
b64Size = b64_encode(linphone_content_get_key(msg->file_transfer_information), FILE_TRANSFER_KEY_SIZE, keyb64, b64Size);
|
||||
keyb64[b64Size] = '\0'; /* libxml need a null terminated string */
|
||||
|
||||
/* add the node containing the key to the file-info node */
|
||||
xmlNewTextChild(cur, NULL, (const xmlChar *)"file-key", (const xmlChar *)keyb64);
|
||||
xmlFree(typeAttribute);
|
||||
free(keyb64);
|
||||
|
||||
/* look for the file-name node and update its content */
|
||||
while (fileInfoNodeChildren!=NULL) {
|
||||
if (!xmlStrcmp(fileInfoNodeChildren->name, (const xmlChar *)"file-name")) { /* we found a the file-name node, update its content with the real filename */
|
||||
/* update node content */
|
||||
xmlNodeSetContent(fileInfoNodeChildren, (const xmlChar *)(linphone_content_get_name(msg->file_transfer_information)));
|
||||
break;
|
||||
}
|
||||
fileInfoNodeChildren = fileInfoNodeChildren->next;
|
||||
}
|
||||
|
||||
|
||||
/* dump the xml into msg->message */
|
||||
xmlDocDumpFormatMemoryEnc(xmlMessageBody, (xmlChar **)&msg->message, &xmlStringLength, "UTF-8", 0);
|
||||
|
||||
break;
|
||||
}
|
||||
xmlFree(typeAttribute);
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
}
|
||||
xmlFreeDoc(xmlMessageBody);
|
||||
|
||||
} else { /* no encryption key, transfer in plain, just copy the message sent by server */
|
||||
msg->message = ms_strdup(body);
|
||||
}
|
||||
|
||||
msg->content_type = ms_strdup("application/vnd.gsma.rcs-ft-http+xml");
|
||||
if (msg->cb) {
|
||||
msg->cb(msg, LinphoneChatMessageStateFileTransferDone, msg->cb_ud);
|
||||
|
|
@ -339,7 +440,6 @@ static void linphone_chat_message_process_response_from_post_file(void *data, co
|
|||
_linphone_chat_room_send_message(msg->chat_room, msg);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -632,20 +732,29 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM
|
|||
linphone_configure_op(cr->lc,op,cr->peer_url,msg->custom_headers,lp_config_get_int(cr->lc->config,"sip","chat_msg_with_contact",0));
|
||||
sal_op_set_user_pointer(op, msg); /*if out of call, directly store msg*/
|
||||
}
|
||||
|
||||
|
||||
if (msg->external_body_url) {
|
||||
content_type=ms_strdup_printf("message/external-body; access-type=URL; URL=\"%s\"",msg->external_body_url);
|
||||
sal_message_send(op,identity,cr->peer,content_type, NULL);
|
||||
sal_message_send(op,identity,cr->peer,content_type, NULL, NULL);
|
||||
ms_free(content_type);
|
||||
} else { /* the message is either text or have a file transfer using RCS recommendation */
|
||||
if (msg->content_type == NULL) { /* if no content type is specified, it is a text message */
|
||||
sal_text_send(op, identity, cr->peer,msg->message);
|
||||
} else {
|
||||
if (linphone_core_lime_enabled(cr->lc)) { /* shall we try to encrypt messages? */
|
||||
linphone_chat_message_ref(msg); /* ref the message or it may be destroyed by callback if the encryption failed */
|
||||
if ((msg->content_type != NULL) && (strcmp(msg->content_type, "application/vnd.gsma.rcs-ft-http+xml") == 0 )) { /* it's a file transfer, content type shall be set to application/cipher.vnd.gsma.rcs-ft-http+xml*/
|
||||
sal_message_send(op, identity, cr->peer, "application/cipher.vnd.gsma.rcs-ft-http+xml", msg->message, linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr)));
|
||||
} else {
|
||||
sal_message_send(op, identity, cr->peer, "xml/cipher", msg->message, linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr)));
|
||||
}
|
||||
} else {
|
||||
sal_message_send(op, identity, cr->peer, msg->content_type, msg->message);
|
||||
// Remove the message to prevent the xml from the file uplaod to be stored in the database
|
||||
ms_free(msg->message);
|
||||
msg->message = NULL;
|
||||
if (msg->content_type == NULL) {
|
||||
sal_text_send(op, identity, cr->peer,msg->message);
|
||||
} else { /* rcs file transfer */
|
||||
sal_message_send(op, identity, cr->peer, msg->content_type, msg->message, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
msg->dir=LinphoneChatMessageOutgoing;
|
||||
msg->from=linphone_address_new(identity);
|
||||
msg->storage_id=linphone_chat_message_store(msg);
|
||||
|
|
@ -752,6 +861,18 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag
|
|||
file_url = xmlGetProp(cur, (const xmlChar *)"url");
|
||||
}
|
||||
|
||||
if (!xmlStrcmp(cur->name, (const xmlChar *)"file-key")) { /* there is a key in the message: file has been encrypted */
|
||||
/* convert the key from base 64 */
|
||||
xmlChar *keyb64 = xmlNodeListGetString(xmlMessageBody, cur->xmlChildrenNode, 1);
|
||||
int keyLength = b64_decode((char *)keyb64, strlen((char *)keyb64), NULL, 0);
|
||||
uint8_t *keyBuffer = (uint8_t *)malloc(keyLength);
|
||||
/* decode the key into local key buffer */
|
||||
b64_decode((char *)keyb64, strlen((char *)keyb64), keyBuffer, keyLength);
|
||||
linphone_content_set_key(msg->file_transfer_information, (char *)keyBuffer, keyLength); /* duplicate key value into the linphone content private structure */
|
||||
xmlFree(keyb64);
|
||||
free(keyBuffer);
|
||||
}
|
||||
|
||||
cur=cur->next;
|
||||
}
|
||||
xmlFree(typeAttribute);
|
||||
|
|
@ -1069,7 +1190,7 @@ static void linphone_chat_room_send_is_composing_notification(LinphoneChatRoom *
|
|||
}
|
||||
content = linphone_chat_room_create_is_composing_xml(cr);
|
||||
if (content != NULL) {
|
||||
sal_message_send(op, identity, cr->peer, "application/im-iscomposing+xml", content);
|
||||
sal_message_send(op, identity, cr->peer, "application/im-iscomposing+xml", content, NULL);
|
||||
ms_free(content);
|
||||
}
|
||||
}
|
||||
|
|
@ -1217,14 +1338,36 @@ static void on_recv_body(belle_sip_user_body_handler_t *bh, belle_sip_message_t
|
|||
LinphoneChatMessage* chatMsg=(LinphoneChatMessage *)data;
|
||||
LinphoneCore *lc = chatMsg->chat_room->lc;
|
||||
|
||||
if (linphone_chat_message_cbs_get_file_transfer_recv(chatMsg->callbacks)) {
|
||||
LinphoneBuffer *lb = linphone_buffer_new_from_data(buffer, size);
|
||||
linphone_chat_message_cbs_get_file_transfer_recv(chatMsg->callbacks)(chatMsg, chatMsg->file_transfer_information, lb);
|
||||
linphone_buffer_unref(lb);
|
||||
} else {
|
||||
/* Legacy: call back given by application level */
|
||||
linphone_core_notify_file_transfer_recv(lc, chatMsg, chatMsg->file_transfer_information, (char *)buffer, size);
|
||||
/* first call may be with a zero size, ignore it */
|
||||
if (size == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (linphone_content_get_key(chatMsg->file_transfer_information) != NULL) { /* we have a key, we must decrypt the file */
|
||||
/* get data from callback to a plainBuffer */
|
||||
char *plainBuffer = (char *)malloc(size);
|
||||
lime_decryptFile(linphone_content_get_cryptoContext_address(chatMsg->file_transfer_information), (unsigned char *)linphone_content_get_key(chatMsg->file_transfer_information), size, plainBuffer, (char *)buffer);
|
||||
if (linphone_chat_message_cbs_get_file_transfer_recv(chatMsg->callbacks)) {
|
||||
LinphoneBuffer *lb = linphone_buffer_new_from_data((unsigned char *)plainBuffer, size);
|
||||
linphone_chat_message_cbs_get_file_transfer_recv(chatMsg->callbacks)(chatMsg, chatMsg->file_transfer_information, lb);
|
||||
linphone_buffer_unref(lb);
|
||||
} else {
|
||||
/* legacy: call back given by application level */
|
||||
linphone_core_notify_file_transfer_recv(lc, chatMsg, chatMsg->file_transfer_information, plainBuffer, size);
|
||||
}
|
||||
free(plainBuffer);
|
||||
} else { /* regular file, no deciphering */
|
||||
if (linphone_chat_message_cbs_get_file_transfer_recv(chatMsg->callbacks)) {
|
||||
LinphoneBuffer *lb = linphone_buffer_new_from_data(buffer, size);
|
||||
linphone_chat_message_cbs_get_file_transfer_recv(chatMsg->callbacks)(chatMsg, chatMsg->file_transfer_information, lb);
|
||||
linphone_buffer_unref(lb);
|
||||
} else {
|
||||
/* Legacy: call back given by application level */
|
||||
linphone_core_notify_file_transfer_recv(lc, chatMsg, chatMsg->file_transfer_information, (char *)buffer, size);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1293,6 +1436,10 @@ static void linphone_chat_process_response_from_get_file(void *data, const belle
|
|||
if (code==200) {
|
||||
LinphoneChatMessage* chatMsg=(LinphoneChatMessage *)data;
|
||||
LinphoneCore *lc = chatMsg->chat_room->lc;
|
||||
/* if the file was encrypted, finish the decryption and free context */
|
||||
if (linphone_content_get_key(chatMsg->file_transfer_information) != NULL) {
|
||||
lime_decryptFile(linphone_content_get_cryptoContext_address(chatMsg->file_transfer_information), NULL, 0, NULL, NULL);
|
||||
}
|
||||
/* file downloaded succesfully, call again the callback with size at zero */
|
||||
if (linphone_chat_message_cbs_get_file_transfer_recv(chatMsg->callbacks)) {
|
||||
LinphoneBuffer *lb = linphone_buffer_new();
|
||||
|
|
@ -1320,8 +1467,13 @@ void linphone_chat_message_download_file(LinphoneChatMessage *message) {
|
|||
belle_http_request_listener_t *l;
|
||||
belle_generic_uri_t *uri;
|
||||
const char *url=message->external_body_url;
|
||||
char* ua = ms_strdup_printf("%s/%s", linphone_core_get_user_agent_name(), linphone_core_get_user_agent_version());
|
||||
char* ua;
|
||||
|
||||
if (url == NULL) {
|
||||
ms_error("Cannot download file from chat message [%p] because url is NULL",message);
|
||||
return;
|
||||
}
|
||||
ua = ms_strdup_printf("%s/%s", linphone_core_get_user_agent_name(), linphone_core_get_user_agent_version());
|
||||
uri=belle_generic_uri_parse(url);
|
||||
|
||||
message->http_request=belle_http_request_create("GET",
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ void linphone_contact_search_init(LinphoneContactSearch* obj, const char* predic
|
|||
ContactSearchID linphone_contact_search_get_id(LinphoneContactSearch* obj);
|
||||
const char* linphone_contact_search_get_predicate(LinphoneContactSearch* obj);
|
||||
void linphone_contact_search_invoke_cb(LinphoneContactSearch* req, MSList* friends);
|
||||
LinphoneContactSearch* linphone_contact_search_ref(void* obj);
|
||||
LINPHONE_PUBLIC LinphoneContactSearch* linphone_contact_search_ref(void* obj);
|
||||
void linphone_contact_search_unref(void* obj);
|
||||
LinphoneContactSearch* linphone_contact_search_cast( void*obj );
|
||||
|
||||
|
|
@ -32,10 +32,10 @@ void linphone_contact_provider_init(LinphoneContactProvider* obj, Linph
|
|||
LinphoneCore* linphone_contact_provider_get_core(LinphoneContactProvider* obj);
|
||||
const char* linphone_contact_provider_get_name(LinphoneContactProvider* obj);
|
||||
LinphoneContactProvider* linphone_contact_provider_ref(void* obj);
|
||||
void linphone_contact_provider_unref(void* obj);
|
||||
LinphoneContactProvider* linphone_contact_provider_cast( void*obj );
|
||||
LINPHONE_PUBLIC void linphone_contact_provider_unref(void* obj);
|
||||
LINPHONE_PUBLIC LinphoneContactProvider* linphone_contact_provider_cast( void*obj );
|
||||
|
||||
LinphoneContactSearch* linphone_contact_provider_begin_search(LinphoneContactProvider* obj,
|
||||
LINPHONE_PUBLIC LinphoneContactSearch* linphone_contact_provider_begin_search(LinphoneContactProvider* obj,
|
||||
const char* predicate,
|
||||
ContactSearchCallback cb,
|
||||
void* data);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@ static void linphone_content_destroy(LinphoneContent *content) {
|
|||
if (content->lcp.data) belle_sip_free(content->lcp.data);
|
||||
if (content->lcp.encoding) belle_sip_free(content->lcp.encoding);
|
||||
if (content->lcp.name) belle_sip_free(content->lcp.name);
|
||||
if (content->lcp.key) belle_sip_free(content->lcp.key);
|
||||
/* note : crypto context is allocated/destroyed by the encryption function */
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -38,6 +40,7 @@ static void linphone_content_clone(LinphoneContent *obj, const LinphoneContent *
|
|||
linphone_content_set_subtype(obj, linphone_content_get_subtype(ref));
|
||||
linphone_content_set_encoding(obj, linphone_content_get_encoding(ref));
|
||||
linphone_content_set_name(obj, linphone_content_get_name(ref));
|
||||
linphone_content_set_key(obj, linphone_content_get_key(ref), linphone_content_get_key_size(ref));
|
||||
if (linphone_content_get_buffer(ref) != NULL) {
|
||||
linphone_content_set_buffer(obj, linphone_content_get_buffer(ref), linphone_content_get_size(ref));
|
||||
} else {
|
||||
|
|
@ -161,12 +164,36 @@ void linphone_content_set_name(LinphoneContent *content, const char *name) {
|
|||
}
|
||||
}
|
||||
|
||||
size_t linphone_content_get_key_size(const LinphoneContent *content) {
|
||||
return content->lcp.keyLength;
|
||||
}
|
||||
|
||||
const char * linphone_content_get_key(const LinphoneContent *content) {
|
||||
return content->lcp.key;
|
||||
}
|
||||
|
||||
void linphone_content_set_key(LinphoneContent *content, const char *key, const size_t keyLength) {
|
||||
if (content->lcp.key != NULL) {
|
||||
belle_sip_free(content->lcp.key);
|
||||
content->lcp.key = NULL;
|
||||
}
|
||||
if (key != NULL) {
|
||||
content->lcp.key = belle_sip_malloc(keyLength);
|
||||
memcpy(content->lcp.key, key, keyLength);
|
||||
}
|
||||
}
|
||||
|
||||
/* crypto context is managed(allocated/freed) by the encryption function, so provide the address of field in the private structure */
|
||||
void ** linphone_content_get_cryptoContext_address(LinphoneContent *content) {
|
||||
return &(content->lcp.cryptoContext);
|
||||
}
|
||||
|
||||
|
||||
LinphoneContent * linphone_content_new(void) {
|
||||
LinphoneContent *content = belle_sip_object_new(LinphoneContent);
|
||||
belle_sip_object_ref(content);
|
||||
content->owned_fields = TRUE;
|
||||
content->lcp.cryptoContext = NULL; /* this field is managed externally by encryption/decryption functions so be careful to initialise it to NULL */
|
||||
return content;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -51,6 +51,9 @@ struct _LinphoneContentPrivate{
|
|||
When provided by callback #LinphoneCoreFileTransferSendCb or #LinphoneCoreFileTransferRecvCb, it states the total number of bytes of the transfered file*/
|
||||
char *encoding; /**<The encoding of the data buffer, for example "gzip"*/
|
||||
char *name; /**< used by RCS File transfer messages to store the original filename of the file to be downloaded from server */
|
||||
char *key; /**< used by RCS File transfer messages to store the key to encrypt file if needed */
|
||||
size_t keyLength; /**< Length of key in bytes */
|
||||
void *cryptoContext; /**< crypto context used to encrypt file for RCS file transfer */
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ if(DOXYGEN_FOUND)
|
|||
)
|
||||
add_custom_target(doc ALL DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/doc/html/index.html")
|
||||
install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/doc/html" "${CMAKE_CURRENT_BINARY_DIR}/doc/xml"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/doc/linphone-${LINPHONE_VERSION}")
|
||||
DESTINATION "share/doc/linphone-${LINPHONE_VERSION}")
|
||||
else()
|
||||
message(WARNING "The dot program is needed to generate the linphone documentation. You can get it from http://www.graphviz.org/.")
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ struct _LinphoneInfoMessage{
|
|||
SalCustomHeader *headers;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Destroy a LinphoneInfoMessage
|
||||
**/
|
||||
|
|
|
|||
|
|
@ -27,15 +27,15 @@ LinphoneLDAPContactSearch* linphone_ldap_contact_search_create(LinphoneLDAPConta
|
|||
ContactSearchCallback cb,
|
||||
void* cb_data);
|
||||
|
||||
unsigned int linphone_ldap_contact_search_result_count(LinphoneLDAPContactSearch* obj);
|
||||
LinphoneLDAPContactSearch* linphone_ldap_contact_search_cast( void* obj );
|
||||
LINPHONE_PUBLIC unsigned int linphone_ldap_contact_search_result_count(LinphoneLDAPContactSearch* obj);
|
||||
LINPHONE_PUBLIC LinphoneLDAPContactSearch* linphone_ldap_contact_search_cast( void* obj );
|
||||
|
||||
|
||||
/* LinphoneLDAPContactProvider */
|
||||
|
||||
LinphoneLDAPContactProvider* linphone_ldap_contact_provider_create(LinphoneCore* lc, const LinphoneDictionary* config);
|
||||
unsigned int linphone_ldap_contact_provider_get_max_result(const LinphoneLDAPContactProvider* obj);
|
||||
LinphoneLDAPContactProvider* linphone_ldap_contact_provider_ref( void* obj );
|
||||
LINPHONE_PUBLIC LinphoneLDAPContactProvider* linphone_ldap_contact_provider_create(LinphoneCore* lc, const LinphoneDictionary* config);
|
||||
LINPHONE_PUBLIC unsigned int linphone_ldap_contact_provider_get_max_result(const LinphoneLDAPContactProvider* obj);
|
||||
LINPHONE_PUBLIC LinphoneLDAPContactProvider* linphone_ldap_contact_provider_ref( void* obj );
|
||||
void linphone_ldap_contact_provider_unref( void* obj );
|
||||
LinphoneLDAPContactProvider* linphone_ldap_contact_provider_cast( void* obj );
|
||||
int linphone_ldap_contact_provider_available();
|
||||
LINPHONE_PUBLIC int linphone_ldap_contact_provider_available();
|
||||
|
|
|
|||
793
coreapi/lime.c
Normal file
793
coreapi/lime.c
Normal file
|
|
@ -0,0 +1,793 @@
|
|||
#include "lime.h"
|
||||
#include "linphonecore.h"
|
||||
#include "ortp/b64.h"
|
||||
#include "polarssl/gcm.h"
|
||||
|
||||
/* check polarssl version */
|
||||
#include <polarssl/version.h>
|
||||
|
||||
#if POLARSSL_VERSION_NUMBER >= 0x01030000 /* for Polarssl version 1.3 */
|
||||
#include "polarssl/sha256.h"
|
||||
#else /* for Polarssl version 1.2 */
|
||||
#include "polarssl/sha2.h"
|
||||
#endif
|
||||
/**
|
||||
* @brief convert an hexa char [0-9a-fA-F] into the corresponding unsigned integer value
|
||||
* Any invalid char will be converted to zero without any warning
|
||||
*
|
||||
* @param[in] inputChar a char which shall be in range [0-9a-fA-F]
|
||||
*
|
||||
* @return the unsigned integer value in range [0-15]
|
||||
*/
|
||||
uint8_t lime_charToByte(uint8_t inputChar) {
|
||||
/* 0-9 */
|
||||
if (inputChar>0x29 && inputChar<0x3A) {
|
||||
return inputChar - 0x30;
|
||||
}
|
||||
|
||||
/* a-f */
|
||||
if (inputChar>0x60 && inputChar<0x67) {
|
||||
return inputChar - 0x57; /* 0x57 = 0x61(a) + 0x0A*/
|
||||
}
|
||||
|
||||
/* A-F */
|
||||
if (inputChar>0x40 && inputChar<0x47) {
|
||||
return inputChar - 0x37; /* 0x37 = 0x41(a) + 0x0A*/
|
||||
}
|
||||
|
||||
/* shall never arrive here, string is not Hex*/
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief convert a byte which value is in range [0-15] into an hexa char [0-9a-fA-F]
|
||||
*
|
||||
* @param[in] inputByte an integer which shall be in range [0-15]
|
||||
*
|
||||
* @return the hexa char [0-9a-f] corresponding to the input
|
||||
*/
|
||||
uint8_t lime_byteToChar(uint8_t inputByte) {
|
||||
inputByte &=0x0F; /* restrict the input value to range [0-15] */
|
||||
/* 0-9 */
|
||||
if(inputByte<0x0A) {
|
||||
return inputByte+0x30;
|
||||
}
|
||||
/* a-f */
|
||||
return inputByte + 0x57;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Convert an hexadecimal string into the corresponding byte buffer
|
||||
*
|
||||
* @param[out] outputBytes The output bytes buffer, must have a length of half the input string buffer
|
||||
* @param[in] inputString The input string buffer, must be hexadecimal(it is not checked by function, any non hexa char is converted to 0)
|
||||
* @param[in] inputStringLength The lenght in chars of the string buffer, output is half this length
|
||||
*/
|
||||
void lime_strToUint8(uint8_t *outputBytes, uint8_t *inputString, uint16_t inputStringLength) {
|
||||
int i;
|
||||
for (i=0; i<inputStringLength/2; i++) {
|
||||
outputBytes[i] = (lime_charToByte(inputString[2*i]))<<4 | lime_charToByte(inputString[2*i+1]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Convert a byte buffer into the corresponding hexadecimal string
|
||||
*
|
||||
* @param[out] outputString The output string buffer, must have a length of twice the input bytes buffer
|
||||
* @param[in] inputBytes The input bytes buffer
|
||||
* @param[in] inputBytesLength The lenght in bytes buffer, output is twice this length
|
||||
*/
|
||||
void lime_int8ToStr(uint8_t *outputString, uint8_t *inputBytes, uint16_t inputBytesLength) {
|
||||
int i;
|
||||
for (i=0; i<inputBytesLength; i++) {
|
||||
outputString[2*i] = lime_byteToChar((inputBytes[i]>>4)&0x0F);
|
||||
outputString[2*i+1] = lime_byteToChar(inputBytes[i]&0x0F);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int lime_getSelfZid(xmlDocPtr cacheBuffer, uint8_t selfZid[25]) {
|
||||
xmlNodePtr cur;
|
||||
xmlChar *selfZidHex;
|
||||
|
||||
if (cacheBuffer == NULL ) {
|
||||
return LIME_INVALID_CACHE;
|
||||
}
|
||||
|
||||
cur = xmlDocGetRootElement(cacheBuffer);
|
||||
/* if we found a root element, parse its children node */
|
||||
if (cur!=NULL)
|
||||
{
|
||||
cur = cur->xmlChildrenNode;
|
||||
}
|
||||
selfZidHex = NULL;
|
||||
while (cur!=NULL) {
|
||||
if ((!xmlStrcmp(cur->name, (const xmlChar *)"selfZID"))){ /* self ZID found, extract it */
|
||||
selfZidHex = xmlNodeListGetString(cacheBuffer, cur->xmlChildrenNode, 1);
|
||||
/* copy it to the output buffer and add the null termination */
|
||||
memcpy(selfZid, selfZidHex, 24);
|
||||
selfZid[24]='\0';
|
||||
break;
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* did we found a ZID? */
|
||||
if (selfZidHex == NULL) {
|
||||
return LIME_INVALID_CACHE;
|
||||
}
|
||||
|
||||
xmlFree(selfZidHex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lime_getCachedSndKeysByURI(xmlDocPtr cacheBuffer, limeURIKeys_t *associatedKeys) {
|
||||
xmlNodePtr cur;
|
||||
|
||||
/* parse the file to get all peer matching the sipURI given in associatedKeys*/
|
||||
if (cacheBuffer == NULL ) { /* there is no cache return error */
|
||||
return LIME_INVALID_CACHE;
|
||||
}
|
||||
|
||||
/* reset number of associated keys and their buffer */
|
||||
associatedKeys->associatedZIDNumber = 0;
|
||||
associatedKeys->peerKeys = NULL;
|
||||
|
||||
cur = xmlDocGetRootElement(cacheBuffer);
|
||||
/* if we found a root element, parse its children node */
|
||||
if (cur!=NULL)
|
||||
{
|
||||
cur = cur->xmlChildrenNode;
|
||||
}
|
||||
while (cur!=NULL) { /* loop on all peer nodes */
|
||||
uint8_t matchingURIFlag = 0; /* this flag is set to one if we found the requested sipURI in the current peer node */
|
||||
if ((!xmlStrcmp(cur->name, (const xmlChar *)"peer"))) { /* found a peer node, check if there is a matching sipURI node in it */
|
||||
xmlNodePtr peerNodeChildren = cur->xmlChildrenNode;
|
||||
matchingURIFlag = 0;
|
||||
|
||||
/* loop on children nodes until the end or we found the matching sipURI */
|
||||
while (peerNodeChildren!=NULL && matchingURIFlag==0) {
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"uri")) { /* found a peer an URI node, check the content */
|
||||
xmlChar *uriNodeContent = xmlNodeListGetString(cacheBuffer, peerNodeChildren->xmlChildrenNode, 1);
|
||||
if (!xmlStrcmp(uriNodeContent, (const xmlChar *)associatedKeys->peerURI)) { /* found a match with requested URI */
|
||||
matchingURIFlag=1;
|
||||
}
|
||||
xmlFree(uriNodeContent);
|
||||
}
|
||||
peerNodeChildren = peerNodeChildren->next;
|
||||
}
|
||||
|
||||
if (matchingURIFlag == 1) { /* we found a match for the URI in this peer node, extract the keys, session Id and index values */
|
||||
/* allocate a new limeKey_t structure to hold the retreived keys */
|
||||
limeKey_t *currentPeerKeys = (limeKey_t *)malloc(sizeof(limeKey_t));
|
||||
uint8_t itemFound = 0; /* count the item found, we must get all of the requested infos: 5 nodes*/
|
||||
uint8_t pvs = 0;
|
||||
|
||||
peerNodeChildren = cur->xmlChildrenNode; /* reset peerNodeChildren to the first child of node */
|
||||
while (peerNodeChildren!=NULL && itemFound<5) {
|
||||
xmlChar *nodeContent = NULL;
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"ZID")) {
|
||||
nodeContent = xmlNodeListGetString(cacheBuffer, peerNodeChildren->xmlChildrenNode, 1);
|
||||
lime_strToUint8(currentPeerKeys->peerZID, nodeContent, 24);
|
||||
itemFound++;
|
||||
}
|
||||
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"sndKey")) {
|
||||
nodeContent = xmlNodeListGetString(cacheBuffer, peerNodeChildren->xmlChildrenNode, 1);
|
||||
lime_strToUint8(currentPeerKeys->key, nodeContent, 64);
|
||||
itemFound++;
|
||||
}
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"sndSId")) {
|
||||
nodeContent = xmlNodeListGetString(cacheBuffer, peerNodeChildren->xmlChildrenNode, 1);
|
||||
lime_strToUint8(currentPeerKeys->sessionId, nodeContent, 64);
|
||||
itemFound++;
|
||||
}
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"sndIndex")) {
|
||||
uint8_t sessionIndexBuffer[4]; /* session index is a uint32_t but we first retrieved it as an hexa string, convert it to a 4 uint8_t buffer */
|
||||
nodeContent = xmlNodeListGetString(cacheBuffer, peerNodeChildren->xmlChildrenNode, 1);
|
||||
lime_strToUint8(sessionIndexBuffer, nodeContent, 8);
|
||||
/* convert it back to a uint32_t (MSByte first)*/
|
||||
currentPeerKeys->sessionIndex = sessionIndexBuffer[3] + (sessionIndexBuffer[2]<<8) + (sessionIndexBuffer[1]<<16) + (sessionIndexBuffer[0]<<24);
|
||||
itemFound++;
|
||||
}
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"pvs")) {
|
||||
nodeContent = xmlNodeListGetString(cacheBuffer, peerNodeChildren->xmlChildrenNode, 1);
|
||||
lime_strToUint8(&pvs, nodeContent, 2); /* pvs is retrieved as a 2 characters hexa string, convert it to an int8 */
|
||||
itemFound++;
|
||||
}
|
||||
|
||||
xmlFree(nodeContent);
|
||||
peerNodeChildren = peerNodeChildren->next;
|
||||
}
|
||||
|
||||
/* check if we have all the requested information and the PVS flag is set to 1 */
|
||||
if (itemFound == 5 && pvs == 1) {
|
||||
associatedKeys->associatedZIDNumber +=1;
|
||||
/* extend array of pointer to limeKey_t structures to add the one we found */
|
||||
associatedKeys->peerKeys = (limeKey_t **)realloc(associatedKeys->peerKeys, (associatedKeys->associatedZIDNumber)*sizeof(limeKey_t *));
|
||||
|
||||
/* add the new entry at the end */
|
||||
associatedKeys->peerKeys[associatedKeys->associatedZIDNumber-1] = currentPeerKeys;
|
||||
|
||||
} else {
|
||||
free(currentPeerKeys);
|
||||
}
|
||||
}
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lime_getCachedRcvKeyByZid(xmlDocPtr cacheBuffer, limeKey_t *associatedKey) {
|
||||
uint8_t peerZidHex[25];
|
||||
/* to check we collect all the information needed from the cache and that pvs(boolean for previously verified Sas) is set in cache */
|
||||
uint8_t itemFound = 0;
|
||||
uint8_t pvs = 0;
|
||||
xmlNodePtr cur;
|
||||
|
||||
if (cacheBuffer == NULL ) { /* there is no cache return error */
|
||||
return LIME_INVALID_CACHE;
|
||||
}
|
||||
|
||||
/* get the given ZID into hex format */
|
||||
lime_int8ToStr(peerZidHex, associatedKey->peerZID, 12);
|
||||
peerZidHex[24]='\0'; /* must be a null terminated string */
|
||||
|
||||
cur = xmlDocGetRootElement(cacheBuffer);
|
||||
/* if we found a root element, parse its children node */
|
||||
if (cur!=NULL)
|
||||
{
|
||||
cur = cur->xmlChildrenNode;
|
||||
|
||||
}
|
||||
|
||||
while (cur!=NULL) { /* loop on all peer nodes */
|
||||
if ((!xmlStrcmp(cur->name, (const xmlChar *)"peer"))){ /* found a peer, check his ZID element */
|
||||
xmlChar *currentZidHex = xmlNodeListGetString(cacheBuffer, cur->xmlChildrenNode->xmlChildrenNode, 1); /* ZID is the first element of peer */
|
||||
if (!xmlStrcmp(currentZidHex, (const xmlChar *)peerZidHex)) { /* we found the peer element we are looking for */
|
||||
xmlNodePtr peerNodeChildren = cur->xmlChildrenNode->next;
|
||||
while (peerNodeChildren != NULL && itemFound<4) { /* look for the tag we want to read : rcvKey, rcvSId, rcvIndex and pvs*/
|
||||
xmlChar *nodeContent = NULL;
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"rcvKey")) {
|
||||
nodeContent = xmlNodeListGetString(cacheBuffer, peerNodeChildren->xmlChildrenNode, 1);
|
||||
lime_strToUint8(associatedKey->key, nodeContent, 64);
|
||||
itemFound++;
|
||||
}
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"rcvSId")) {
|
||||
nodeContent = xmlNodeListGetString(cacheBuffer, peerNodeChildren->xmlChildrenNode, 1);
|
||||
lime_strToUint8(associatedKey->sessionId, nodeContent, 64);
|
||||
itemFound++;
|
||||
}
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"rcvIndex")) {
|
||||
uint8_t sessionIndexBuffer[4]; /* session index is a uint32_t but we first retrieved it as an hexa string, convert it to a 4 uint8_t buffer */
|
||||
nodeContent = xmlNodeListGetString(cacheBuffer, peerNodeChildren->xmlChildrenNode, 1);
|
||||
lime_strToUint8(sessionIndexBuffer, nodeContent, 8);
|
||||
/* convert it back to a uint32_t (MSByte first)*/
|
||||
associatedKey->sessionIndex = sessionIndexBuffer[3] + (sessionIndexBuffer[2]<<8) + (sessionIndexBuffer[1]<<16) + (sessionIndexBuffer[0]<<24);
|
||||
itemFound++;
|
||||
}
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"pvs")) {
|
||||
nodeContent = xmlNodeListGetString(cacheBuffer, peerNodeChildren->xmlChildrenNode, 1);
|
||||
lime_strToUint8(&pvs, nodeContent, 2); /* pvs is retrieved as a 2 characters hexa string, convert it to an int8 */
|
||||
itemFound++;
|
||||
}
|
||||
xmlFree(nodeContent);
|
||||
peerNodeChildren = peerNodeChildren->next;
|
||||
}
|
||||
xmlFree(currentZidHex);
|
||||
break; /* we parsed the peer node we were looking for, get out of the main while */
|
||||
}
|
||||
xmlFree(currentZidHex);
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
/* if we manage to find the correct key information and that pvs is set to 1, return 0 (success) */
|
||||
if ((pvs == 1) && (itemFound == 4)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* otherwise, key wasn't found or is invalid */
|
||||
return LIME_NO_VALID_KEY_FOUND_FOR_PEER;
|
||||
}
|
||||
|
||||
int lime_setCachedKey(xmlDocPtr cacheBuffer, limeKey_t *associatedKey, uint8_t role) {
|
||||
xmlNodePtr cur;
|
||||
uint8_t peerZidHex[25];
|
||||
uint8_t keyHex[65]; /* key is 32 bytes long -> 64 bytes string + null termination */
|
||||
uint8_t sessionIdHex[65]; /* sessionId is 32 bytes long -> 64 bytes string + null termination */
|
||||
uint8_t sessionIndexHex[9]; /* sessionInedx is an uint32_t : 4 bytes long -> 8 bytes string + null termination */
|
||||
uint8_t itemFound = 0;
|
||||
|
||||
if (cacheBuffer == NULL ) { /* there is no cache return error */
|
||||
return LIME_INVALID_CACHE;
|
||||
}
|
||||
|
||||
/* get the given ZID into hex format */
|
||||
lime_int8ToStr(peerZidHex, associatedKey->peerZID, 12);
|
||||
peerZidHex[24]='\0'; /* must be a null terminated string */
|
||||
|
||||
cur = xmlDocGetRootElement(cacheBuffer);
|
||||
/* if we found a root element, parse its children node */
|
||||
if (cur!=NULL)
|
||||
{
|
||||
cur = cur->xmlChildrenNode;
|
||||
|
||||
}
|
||||
|
||||
/* convert the given tag content to null terminated Hexadecimal strings */
|
||||
lime_int8ToStr(keyHex, associatedKey->key, 32);
|
||||
keyHex[64] = '\0';
|
||||
lime_int8ToStr(sessionIdHex, associatedKey->sessionId, 32);
|
||||
sessionIdHex[64] = '\0';
|
||||
sessionIndexHex[0] = lime_byteToChar((uint8_t)((associatedKey->sessionIndex>>28)&0x0F));
|
||||
sessionIndexHex[1] = lime_byteToChar((uint8_t)((associatedKey->sessionIndex>>24)&0x0F));
|
||||
sessionIndexHex[2] = lime_byteToChar((uint8_t)((associatedKey->sessionIndex>>20)&0x0F));
|
||||
sessionIndexHex[3] = lime_byteToChar((uint8_t)((associatedKey->sessionIndex>>16)&0x0F));
|
||||
sessionIndexHex[4] = lime_byteToChar((uint8_t)((associatedKey->sessionIndex>>12)&0x0F));
|
||||
sessionIndexHex[5] = lime_byteToChar((uint8_t)((associatedKey->sessionIndex>>8)&0x0F));
|
||||
sessionIndexHex[6] = lime_byteToChar((uint8_t)((associatedKey->sessionIndex>>4)&0x0F));
|
||||
sessionIndexHex[7] = lime_byteToChar((uint8_t)((associatedKey->sessionIndex)&0x0F));
|
||||
sessionIndexHex[8] = '\0';
|
||||
|
||||
while (cur!=NULL && itemFound<3) { /* loop on all peer nodes */
|
||||
if ((!xmlStrcmp(cur->name, (const xmlChar *)"peer"))){ /* found a peer, check his ZID element */
|
||||
xmlChar *currentZidHex = xmlNodeListGetString(cacheBuffer, cur->xmlChildrenNode->xmlChildrenNode, 1); /* ZID is the first element of peer */
|
||||
if (!xmlStrcmp(currentZidHex, (const xmlChar *)peerZidHex)) { /* we found the peer element we are looking for */
|
||||
xmlNodePtr peerNodeChildren = cur->xmlChildrenNode->next;
|
||||
while (peerNodeChildren != NULL && itemFound<3) { /* look for the tag we want to write */
|
||||
if (role == LIME_RECEIVER) { /* writing receiver key */
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"rcvKey")) {
|
||||
xmlNodeSetContent(peerNodeChildren, (const xmlChar *)keyHex);
|
||||
itemFound++;
|
||||
}
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"rcvSId")) {
|
||||
xmlNodeSetContent(peerNodeChildren, (const xmlChar *)sessionIdHex);
|
||||
itemFound++;
|
||||
}
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"rcvIndex")) {
|
||||
xmlNodeSetContent(peerNodeChildren, (const xmlChar *)sessionIndexHex);
|
||||
itemFound++;
|
||||
}
|
||||
} else { /* writing sender key */
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"sndKey")) {
|
||||
xmlNodeSetContent(peerNodeChildren, (const xmlChar *)keyHex);
|
||||
itemFound++;
|
||||
}
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"sndSId")) {
|
||||
xmlNodeSetContent(peerNodeChildren, (const xmlChar *)sessionIdHex);
|
||||
itemFound++;
|
||||
}
|
||||
if (!xmlStrcmp(peerNodeChildren->name, (const xmlChar *)"sndIndex")) {
|
||||
xmlNodeSetContent(peerNodeChildren, (const xmlChar *)sessionIndexHex);
|
||||
itemFound++;
|
||||
}
|
||||
}
|
||||
peerNodeChildren = peerNodeChildren->next;
|
||||
}
|
||||
}
|
||||
xmlFree(currentZidHex);
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lime_deriveKey(limeKey_t *key) {
|
||||
uint8_t inputData[55];
|
||||
uint8_t derivedKey[32];
|
||||
|
||||
if (key == NULL) {
|
||||
return LIME_UNABLE_TO_DERIVE_KEY;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*not doing anything yet since key and sessionId are array, not pointers*/
|
||||
if ((key->key == NULL) || (key->sessionId == NULL)) {
|
||||
return LIME_UNABLE_TO_DERIVE_KEY;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Derivation is made derived Key = HMAC_SHA256(Key, 0x0000001||"MessageKey"||0x00||SessionId||SessionIndex||0x00000100)*/
|
||||
/* total data to be hashed is 55 bytes : 4 + 10 + 1 + 32 + 4 + 4 */
|
||||
inputData[0] = 0x00;
|
||||
inputData[1] = 0x00;
|
||||
inputData[2] = 0x00;
|
||||
inputData[3] = 0x01;
|
||||
|
||||
memcpy(inputData+4, "MessageKey", 10);
|
||||
|
||||
inputData[14] = 0x00;
|
||||
|
||||
memcpy(inputData+15, key->sessionId, 32);
|
||||
|
||||
inputData[47] = (uint8_t)((key->sessionIndex>>24)&0x000000FF);
|
||||
inputData[48] = (uint8_t)((key->sessionIndex>>16)&0x000000FF);
|
||||
inputData[49] = (uint8_t)((key->sessionIndex>>8)&0x000000FF);
|
||||
inputData[50] = (uint8_t)(key->sessionIndex&0x000000FF);
|
||||
|
||||
inputData[51] = 0x00;
|
||||
inputData[52] = 0x00;
|
||||
inputData[53] = 0x01;
|
||||
inputData[54] = 0x00;
|
||||
|
||||
/* derive the key in a temp buffer */
|
||||
#if POLARSSL_VERSION_NUMBER >= 0x01030000 /* for Polarssl version 1.3 */
|
||||
sha256_hmac(key->key, 32, inputData, 55, derivedKey, 0); /* last param to zero to select SHA256 and not SHA224 */
|
||||
#else /* for Polarssl version 1.2 */
|
||||
sha2_hmac(key->key, 32, inputData, 55, derivedKey, 0); /* last param to zero to select SHA256 and not SHA224 */
|
||||
#endif /* POLARSSL_VERSION_NUMBER */
|
||||
|
||||
/* overwrite the old key with the derived one */
|
||||
memcpy(key->key, derivedKey, 32);
|
||||
|
||||
/* increment the session Index */
|
||||
key->sessionIndex += 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void lime_freeKeys(limeURIKeys_t associatedKeys) {
|
||||
int i;
|
||||
|
||||
/* free all associated keys */
|
||||
for (i=0; i< associatedKeys.associatedZIDNumber; i++) {
|
||||
if (associatedKeys.peerKeys[i] != NULL) {
|
||||
free(associatedKeys.peerKeys[i]);
|
||||
associatedKeys.peerKeys[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
free(associatedKeys.peerKeys);
|
||||
|
||||
/* free sipURI string */
|
||||
free(associatedKeys.peerURI);
|
||||
}
|
||||
|
||||
int lime_encryptMessage(limeKey_t *key, uint8_t *plainMessage, uint32_t messageLength, uint8_t selfZID[12], uint8_t *encryptedMessage) {
|
||||
uint8_t authenticatedData[28];
|
||||
gcm_context gcmContext;
|
||||
/* Authenticated data is senderZID(12 bytes)||receiverZID(12 bytes)||sessionIndex(4 bytes) */
|
||||
memcpy(authenticatedData, selfZID, 12);
|
||||
memcpy(authenticatedData+12, key->peerZID, 12);
|
||||
authenticatedData[24] = (uint8_t)((key->sessionIndex>>24)&0x000000FF);
|
||||
authenticatedData[25] = (uint8_t)((key->sessionIndex>>16)&0x000000FF);
|
||||
authenticatedData[26] = (uint8_t)((key->sessionIndex>>8)&0x000000FF);
|
||||
authenticatedData[27] = (uint8_t)(key->sessionIndex&0x000000FF);
|
||||
|
||||
/* AES-GCM : key is 192 bits long, Init Vector 64 bits. 256 bits key given is AES key||IV */
|
||||
/* tag is 16 bytes long and is set in the 16 first bytes of the encrypted message */
|
||||
gcm_init(&gcmContext, POLARSSL_CIPHER_ID_AES, key->key, 192);
|
||||
gcm_crypt_and_tag(&gcmContext, GCM_ENCRYPT, messageLength, key->key+24, 8, authenticatedData, 28, plainMessage, encryptedMessage+16, 16, encryptedMessage);
|
||||
gcm_free(&gcmContext);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lime_encryptFile(void **cryptoContext, unsigned char *key, size_t length, char *plain, char *cipher) {
|
||||
gcm_context *gcmContext;
|
||||
|
||||
if (*cryptoContext == NULL) { /* first call to the function, allocate a crypto context and initialise it */
|
||||
gcmContext = (gcm_context *)malloc(sizeof(gcm_context));
|
||||
*cryptoContext = (void *)gcmContext;
|
||||
gcm_init(gcmContext, POLARSSL_CIPHER_ID_AES, key, 192);
|
||||
gcm_starts(gcmContext, GCM_ENCRYPT, key+24, 8, NULL, 0); /* key contains 192bits of key || 64 bits of Initialisation Vector */
|
||||
} else { /* this is not the first call, get the context */
|
||||
gcmContext = (gcm_context *)*cryptoContext;
|
||||
}
|
||||
|
||||
if (length != 0) {
|
||||
gcm_update(gcmContext, length, (const unsigned char *)plain, (unsigned char *)cipher);
|
||||
} else { /* lenght is 0, finish the stream */
|
||||
gcm_finish(gcmContext, NULL, 0); /* do not generate tag */
|
||||
gcm_free(gcmContext);
|
||||
free(*cryptoContext);
|
||||
*cryptoContext = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lime_decryptFile(void **cryptoContext, unsigned char *key, size_t length, char *plain, char *cipher) {
|
||||
gcm_context *gcmContext;
|
||||
|
||||
if (*cryptoContext == NULL) { /* first call to the function, allocate a crypto context and initialise it */
|
||||
gcmContext = (gcm_context *)malloc(sizeof(gcm_context));
|
||||
*cryptoContext = (void *)gcmContext;
|
||||
gcm_init(gcmContext, POLARSSL_CIPHER_ID_AES, key, 192);
|
||||
gcm_starts(gcmContext, GCM_DECRYPT, key+24, 8, NULL, 0); /* key contains 192bits of key || 64 bits of Initialisation Vector */
|
||||
} else { /* this is not the first call, get the context */
|
||||
gcmContext = (gcm_context *)*cryptoContext;
|
||||
}
|
||||
|
||||
if (length != 0) {
|
||||
gcm_update(gcmContext, length, (const unsigned char *)cipher, (unsigned char *)plain);
|
||||
} else { /* lenght is 0, finish the stream */
|
||||
gcm_finish(gcmContext, NULL, 0); /* do not generate tag */
|
||||
gcm_free(gcmContext);
|
||||
free(*cryptoContext);
|
||||
*cryptoContext = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int lime_decryptMessage(limeKey_t *key, uint8_t *encryptedMessage, uint32_t messageLength, uint8_t selfZID[12], uint8_t *plainMessage) {
|
||||
uint8_t authenticatedData[28];
|
||||
gcm_context gcmContext;
|
||||
int retval;
|
||||
|
||||
/* Authenticated data is senderZID(12 bytes)||receiverZID(12 bytes)||sessionIndex(4 bytes) */
|
||||
memcpy(authenticatedData, key->peerZID, 12);
|
||||
memcpy(authenticatedData+12, selfZID, 12);
|
||||
authenticatedData[24] = (uint8_t)((key->sessionIndex>>24)&0x000000FF);
|
||||
authenticatedData[25] = (uint8_t)((key->sessionIndex>>16)&0x000000FF);
|
||||
authenticatedData[26] = (uint8_t)((key->sessionIndex>>8)&0x000000FF);
|
||||
authenticatedData[27] = (uint8_t)(key->sessionIndex&0x000000FF);
|
||||
|
||||
/* AES-GCM : key is 192 bits long, Init Vector 64 bits. 256 bits key given is AES key||IV */
|
||||
/* tag is 16 bytes long and is the 16 first bytes of the encrypted message */
|
||||
gcm_init(&gcmContext, POLARSSL_CIPHER_ID_AES, key->key, 192);
|
||||
/* messageLength-16 is the length of encrypted data, messageLength include the 16 bytes tag included at the begining of encryptedMessage */
|
||||
retval = gcm_auth_decrypt(&gcmContext, messageLength-16, key->key+24, 8, authenticatedData, 28, encryptedMessage, 16, encryptedMessage+16, plainMessage);
|
||||
gcm_free(&gcmContext);
|
||||
/* add the null termination char */
|
||||
plainMessage[messageLength-16] = '\0';
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
int lime_createMultipartMessage(xmlDocPtr cacheBuffer, uint8_t *message, uint8_t *peerURI, uint8_t **output) {
|
||||
uint8_t selfZidHex[25];
|
||||
uint8_t selfZid[12]; /* same data but in byte buffer */
|
||||
uint32_t encryptedMessageLength;
|
||||
limeURIKeys_t associatedKeys;
|
||||
xmlDocPtr xmlOutputMessage;
|
||||
xmlNodePtr rootNode;
|
||||
int i;
|
||||
int xmlStringLength;
|
||||
|
||||
/* retrieve selfZIDHex from cache(return a 24 char hexa string + null termination) */
|
||||
if (lime_getSelfZid(cacheBuffer, selfZidHex) != 0) {
|
||||
return LIME_UNABLE_TO_ENCRYPT_MESSAGE;
|
||||
}
|
||||
lime_strToUint8(selfZid, selfZidHex, 24);
|
||||
|
||||
/* encrypted message length is plaintext + 16 for tag */
|
||||
encryptedMessageLength = strlen((char *)message) + 16;
|
||||
|
||||
/* retrieve keys associated to the peer URI */
|
||||
associatedKeys.peerURI = (uint8_t *)malloc(strlen((char *)peerURI)+1);
|
||||
strcpy((char *)(associatedKeys.peerURI), (char *)peerURI);
|
||||
associatedKeys.associatedZIDNumber = 0;
|
||||
associatedKeys.peerKeys = NULL;
|
||||
|
||||
if (lime_getCachedSndKeysByURI(cacheBuffer, &associatedKeys) != 0) {
|
||||
lime_freeKeys(associatedKeys);
|
||||
return LIME_UNABLE_TO_ENCRYPT_MESSAGE;
|
||||
}
|
||||
|
||||
if (associatedKeys.associatedZIDNumber == 0) {
|
||||
lime_freeKeys(associatedKeys);
|
||||
return LIME_NO_VALID_KEY_FOUND_FOR_PEER;
|
||||
}
|
||||
|
||||
/* create an xml doc to hold the multipart message */
|
||||
xmlOutputMessage = xmlNewDoc((const xmlChar *)"1.0");
|
||||
/* root tag is "doc" */
|
||||
rootNode = xmlNewDocNode(xmlOutputMessage, NULL, (const xmlChar *)"doc", NULL);
|
||||
xmlDocSetRootElement(xmlOutputMessage, rootNode);
|
||||
/* add the self ZID child */
|
||||
xmlNewTextChild(rootNode, NULL, (const xmlChar *)"ZID", selfZidHex);
|
||||
|
||||
/* loop on all keys found */
|
||||
for (i=0; i<associatedKeys.associatedZIDNumber; i++) {
|
||||
uint8_t peerZidHex[25];
|
||||
uint8_t sessionIndexHex[9];
|
||||
xmlNodePtr msgNode;
|
||||
int b64Size;
|
||||
char *encryptedMessageb64;
|
||||
|
||||
/* encrypt message with current key */
|
||||
limeKey_t *currentKey = associatedKeys.peerKeys[i];
|
||||
/* encrypted message include a 16 bytes tag */
|
||||
uint8_t *encryptedMessage = (uint8_t *)malloc(encryptedMessageLength);
|
||||
lime_encryptMessage(currentKey, message, strlen((char *)message), selfZid, encryptedMessage);
|
||||
/* add a "msg" node the the output message, doc node is :
|
||||
* <msg>
|
||||
* <pzid>peerZID</pzid>
|
||||
* <index>session index</index>
|
||||
* <text>ciphertext</text>
|
||||
* </msg> */
|
||||
msgNode = xmlNewDocNode(xmlOutputMessage, NULL, (const xmlChar *)"msg", NULL);
|
||||
lime_int8ToStr(peerZidHex, currentKey->peerZID, 12);
|
||||
peerZidHex[24] = '\0';
|
||||
sessionIndexHex[0] = lime_byteToChar((uint8_t)((currentKey->sessionIndex>>28)&0x0F));
|
||||
sessionIndexHex[1] = lime_byteToChar((uint8_t)((currentKey->sessionIndex>>24)&0x0F));
|
||||
sessionIndexHex[2] = lime_byteToChar((uint8_t)((currentKey->sessionIndex>>20)&0x0F));
|
||||
sessionIndexHex[3] = lime_byteToChar((uint8_t)((currentKey->sessionIndex>>16)&0x0F));
|
||||
sessionIndexHex[4] = lime_byteToChar((uint8_t)((currentKey->sessionIndex>>12)&0x0F));
|
||||
sessionIndexHex[5] = lime_byteToChar((uint8_t)((currentKey->sessionIndex>>8)&0x0F));
|
||||
sessionIndexHex[6] = lime_byteToChar((uint8_t)((currentKey->sessionIndex>>4)&0x0F));
|
||||
sessionIndexHex[7] = lime_byteToChar((uint8_t)((currentKey->sessionIndex)&0x0F));
|
||||
sessionIndexHex[8] = '\0';
|
||||
|
||||
xmlNewTextChild(msgNode, NULL, (const xmlChar *)"pzid", peerZidHex);
|
||||
xmlNewTextChild(msgNode, NULL, (const xmlChar *)"index", sessionIndexHex);
|
||||
|
||||
/* convert the cipherText to base 64 */
|
||||
b64Size = b64_encode(NULL, encryptedMessageLength, NULL, 0);
|
||||
encryptedMessageb64 = (char *)malloc(b64Size+1);
|
||||
b64Size = b64_encode(encryptedMessage, encryptedMessageLength, encryptedMessageb64, b64Size);
|
||||
encryptedMessageb64[b64Size] = '\0'; /* libxml need a null terminated string */
|
||||
xmlNewTextChild(msgNode, NULL, (const xmlChar *)"text", (const xmlChar *)encryptedMessageb64);
|
||||
free(encryptedMessage);
|
||||
free(encryptedMessageb64);
|
||||
|
||||
/* add the message Node into the doc */
|
||||
xmlAddChild(rootNode, msgNode);
|
||||
|
||||
/* update the key used */
|
||||
lime_deriveKey(currentKey);
|
||||
lime_setCachedKey(cacheBuffer, currentKey, LIME_SENDER);
|
||||
}
|
||||
|
||||
/* dump the whole message doc into the output */
|
||||
xmlDocDumpFormatMemoryEnc(xmlOutputMessage, output, &xmlStringLength, "UTF-8", 0);
|
||||
xmlFreeDoc(xmlOutputMessage);
|
||||
|
||||
lime_freeKeys(associatedKeys);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lime_decryptMultipartMessage(xmlDocPtr cacheBuffer, uint8_t *message, uint8_t **output) {
|
||||
int retval;
|
||||
uint8_t selfZidHex[25];
|
||||
uint8_t selfZid[12]; /* same data but in byte buffer */
|
||||
limeKey_t associatedKey;
|
||||
xmlChar *peerZidHex = NULL;
|
||||
xmlNodePtr cur;
|
||||
uint8_t *encryptedMessage = NULL;
|
||||
uint32_t encryptedMessageLength = 0;
|
||||
uint32_t usedSessionIndex = 0;
|
||||
xmlDocPtr xmlEncryptedMessage;
|
||||
|
||||
if (cacheBuffer == NULL) {
|
||||
return LIME_INVALID_CACHE;
|
||||
}
|
||||
/* retrieve selfZIDHex from cache(return a 24 char hexa string + null termination) */
|
||||
if (lime_getSelfZid(cacheBuffer, selfZidHex) != 0) {
|
||||
return LIME_UNABLE_TO_DECRYPT_MESSAGE;
|
||||
}
|
||||
lime_strToUint8(selfZid, selfZidHex, 24);
|
||||
|
||||
/* parse the message into an xml doc */
|
||||
/* make sure we have a valid xml message before trying to parse it */
|
||||
if (memcmp(message, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>", 38) != 0 ) {
|
||||
return LIME_INVALID_ENCRYPTED_MESSAGE;
|
||||
}
|
||||
xmlEncryptedMessage = xmlParseDoc((const xmlChar *)message);
|
||||
if (xmlEncryptedMessage == NULL) {
|
||||
return LIME_INVALID_ENCRYPTED_MESSAGE;
|
||||
}
|
||||
|
||||
/* retrieve the sender ZID which is the first child of root */
|
||||
cur = xmlDocGetRootElement(xmlEncryptedMessage);
|
||||
if (cur != NULL) {
|
||||
cur = cur->xmlChildrenNode;
|
||||
if ((!xmlStrcmp(cur->name, (const xmlChar *)"ZID"))){ /* sender ZID found, extract it */
|
||||
peerZidHex = xmlNodeListGetString(xmlEncryptedMessage, cur->xmlChildrenNode, 1);
|
||||
/* convert it from hexa string to bytes string and set the result in the associatedKey structure */
|
||||
lime_strToUint8(associatedKey.peerZID, peerZidHex, strlen((char *)peerZidHex));
|
||||
cur = cur->next;
|
||||
}
|
||||
}
|
||||
|
||||
if (peerZidHex != NULL) {
|
||||
/* get from cache the matching key */
|
||||
retval = lime_getCachedRcvKeyByZid(cacheBuffer, &associatedKey);
|
||||
|
||||
if (retval != 0) {
|
||||
xmlFree(peerZidHex);
|
||||
xmlFreeDoc(xmlEncryptedMessage);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* retrieve the portion of message which is encrypted with our key */
|
||||
while (cur != NULL) { /* loop on all "msg" node in the message */
|
||||
xmlNodePtr msgChildrenNode = cur->xmlChildrenNode;
|
||||
xmlChar *currentZidHex = xmlNodeListGetString(cacheBuffer, msgChildrenNode->xmlChildrenNode, 1); /* pZID is the first element of msg */
|
||||
if (!xmlStrcmp(currentZidHex, (const xmlChar *)selfZidHex)) { /* we found the msg node we are looking for */
|
||||
/* get the index (second node in the msg one) */
|
||||
xmlChar *sessionIndexHex;
|
||||
xmlChar *encryptedMessageb64;
|
||||
|
||||
msgChildrenNode = msgChildrenNode->next;
|
||||
sessionIndexHex = xmlNodeListGetString(cacheBuffer, msgChildrenNode->xmlChildrenNode, 1);
|
||||
usedSessionIndex = (((uint32_t)lime_charToByte(sessionIndexHex[0]))<<28)
|
||||
| (((uint32_t)lime_charToByte(sessionIndexHex[1]))<<24)
|
||||
| (((uint32_t)lime_charToByte(sessionIndexHex[2]))<<20)
|
||||
| (((uint32_t)lime_charToByte(sessionIndexHex[3]))<<16)
|
||||
| (((uint32_t)lime_charToByte(sessionIndexHex[4]))<<12)
|
||||
| (((uint32_t)lime_charToByte(sessionIndexHex[5]))<<8)
|
||||
| (((uint32_t)lime_charToByte(sessionIndexHex[6]))<<4)
|
||||
| (((uint32_t)lime_charToByte(sessionIndexHex[7])));
|
||||
xmlFree(sessionIndexHex);
|
||||
/* get the encrypted message */
|
||||
msgChildrenNode = msgChildrenNode->next;
|
||||
/* convert the cipherText from base 64 */
|
||||
encryptedMessageb64 = xmlNodeListGetString(cacheBuffer, msgChildrenNode->xmlChildrenNode, 1);
|
||||
encryptedMessageLength = b64_decode((char *)encryptedMessageb64, strlen((char *)encryptedMessageb64), NULL, 0);
|
||||
encryptedMessage = (uint8_t *)malloc(encryptedMessageLength);
|
||||
encryptedMessageLength = b64_decode((char *)encryptedMessageb64, strlen((char *)encryptedMessageb64), encryptedMessage, encryptedMessageLength);
|
||||
xmlFree(encryptedMessageb64);
|
||||
}
|
||||
|
||||
cur = cur->next;
|
||||
xmlFree(currentZidHex);
|
||||
}
|
||||
}
|
||||
|
||||
xmlFree(peerZidHex);
|
||||
xmlFreeDoc(xmlEncryptedMessage);
|
||||
|
||||
/* do we have retrieved correctly all the needed data */
|
||||
if (encryptedMessage == NULL) {
|
||||
return LIME_UNABLE_TO_DECRYPT_MESSAGE;
|
||||
}
|
||||
|
||||
/* shall we derive our key before going for decryption */
|
||||
if (usedSessionIndex < associatedKey.sessionIndex) {
|
||||
/* something wen't wrong with the cache, this shall never happend */
|
||||
free(encryptedMessage);
|
||||
return LIME_UNABLE_TO_DECRYPT_MESSAGE;
|
||||
}
|
||||
|
||||
if ((usedSessionIndex - associatedKey.sessionIndex > MAX_DERIVATION_NUMBER) ) {
|
||||
/* we missed to many messages, ask for a cache reset via a ZRTP call */
|
||||
free(encryptedMessage);
|
||||
return LIME_UNABLE_TO_DECRYPT_MESSAGE;
|
||||
}
|
||||
|
||||
while (usedSessionIndex>associatedKey.sessionIndex) {
|
||||
lime_deriveKey(&associatedKey);
|
||||
}
|
||||
|
||||
/* decrypt the message */
|
||||
*output = (uint8_t *)malloc(encryptedMessageLength - 16 +1); /* plain message is same length than encrypted one with 16 bytes less for the tag + 1 to add the null termination char */
|
||||
retval = lime_decryptMessage(&associatedKey, encryptedMessage, encryptedMessageLength, selfZid, *output);
|
||||
|
||||
free(encryptedMessage);
|
||||
|
||||
if (retval!=0 ) {
|
||||
free(*output);
|
||||
*output = NULL;
|
||||
return LIME_UNABLE_TO_DECRYPT_MESSAGE;
|
||||
}
|
||||
|
||||
/* update used key */
|
||||
lime_deriveKey(&associatedKey);
|
||||
lime_setCachedKey(cacheBuffer, &associatedKey, LIME_RECEIVER);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *lime_error_code_to_string(int errorCode) {
|
||||
switch (errorCode) {
|
||||
case LIME_INVALID_CACHE: return "Invalid ZRTP cache";
|
||||
case LIME_UNABLE_TO_DERIVE_KEY: return "Unable to derive Key";
|
||||
case LIME_UNABLE_TO_ENCRYPT_MESSAGE: return "Unable to encrypt message";
|
||||
case LIME_UNABLE_TO_DECRYPT_MESSAGE: return "Unable to decrypt message";
|
||||
case LIME_NO_VALID_KEY_FOUND_FOR_PEER: return "No valid key found";
|
||||
case LIME_INVALID_ENCRYPTED_MESSAGE: return "Invalid encrypted message";
|
||||
}
|
||||
return "Unknow error";
|
||||
|
||||
}
|
||||
199
coreapi/lime.h
Normal file
199
coreapi/lime.h
Normal file
|
|
@ -0,0 +1,199 @@
|
|||
#ifndef LIME_H
|
||||
#define LIME_H
|
||||
|
||||
#define LIME_INVALID_CACHE 0x1001
|
||||
#define LIME_UNABLE_TO_DERIVE_KEY 0x1002
|
||||
#define LIME_UNABLE_TO_ENCRYPT_MESSAGE 0x1004
|
||||
#define LIME_UNABLE_TO_DECRYPT_MESSAGE 0x1008
|
||||
#define LIME_NO_VALID_KEY_FOUND_FOR_PEER 0x1010
|
||||
#define LIME_INVALID_ENCRYPTED_MESSAGE 0x1020
|
||||
|
||||
/* this define the maximum key derivation number allowed to get the caches back in sync in case of missed messages */
|
||||
#define MAX_DERIVATION_NUMBER 100
|
||||
|
||||
#define LIME_SENDER 0x01
|
||||
#define LIME_RECEIVER 0x02
|
||||
#include <stdint.h>
|
||||
#include <libxml/tree.h>
|
||||
#include <libxml/parser.h>
|
||||
#include <libxml/xmlwriter.h>
|
||||
|
||||
#include <mediastreamer2/mscommon.h>
|
||||
|
||||
#ifndef LINPHONE_PUBLIC
|
||||
#define LINPHONE_PUBLIC MS2_PUBLIC
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Structure holding all needed material to encrypt/decrypt Messages */
|
||||
typedef struct limeKey_struct {
|
||||
uint8_t key[32]; /**< a 256 bit key used to encrypt/decrypt message */
|
||||
uint8_t sessionId[32]; /**< a session id used to derive key */
|
||||
uint32_t sessionIndex; /**< an index to count number of derivation */
|
||||
uint8_t peerZID[12]; /**< the ZID associated to this key */
|
||||
} limeKey_t;
|
||||
|
||||
/**
|
||||
* @brief Store the differents keys associated to a sipURI */
|
||||
typedef struct limeURIKeys_struct {
|
||||
limeKey_t **peerKeys; /**< an array of all the key material associated to each ZID matching the specified URI */
|
||||
uint16_t associatedZIDNumber; /**< previous array length */
|
||||
uint8_t *peerURI; /**< the sip URI associated to all the keys, must be a null terminated string */
|
||||
} limeURIKeys_t;
|
||||
|
||||
/**
|
||||
* @brief Retrieve selfZID from cache
|
||||
*
|
||||
* @param[in] cacheBuffer The xmlDoc containing current cache
|
||||
* @param[out] selfZid The ZID found as a 24 hexa char string null terminated
|
||||
*
|
||||
* @return 0 on success, error code otherwise
|
||||
*/
|
||||
LINPHONE_PUBLIC int lime_getSelfZid(xmlDocPtr cacheBuffer, uint8_t selfZid[25]);
|
||||
|
||||
/**
|
||||
* @brief Get from cache all the senders keys associated to the given URI
|
||||
* peerKeys field from associatedKeys param must be NULL when calling this function.
|
||||
* Structure content must then be freed using lime_freeKeys function
|
||||
*
|
||||
* @param[in] cacheBuffer The xmlDoc containing current cache
|
||||
* @param[in/out] associatedKeys Structure containing the peerURI. After this call contains all key material associated to the given URI. Must be then freed through lime_freeKeys function
|
||||
*
|
||||
* @return 0 on success, error code otherwise
|
||||
*/
|
||||
LINPHONE_PUBLIC int lime_getCachedSndKeysByURI(xmlDocPtr cacheBuffer, limeURIKeys_t *associatedKeys);
|
||||
|
||||
/**
|
||||
* @brief Get the receiver key associated to the ZID given in the associatedKey parameter
|
||||
*
|
||||
* @param[in] cacheBuffer The xmlDoc containing current cache
|
||||
* @param[in/out] associatedKey Structure containing the peerZID and will store the retrieved key
|
||||
*
|
||||
* @return 0 on success, error code otherwise
|
||||
*/
|
||||
LINPHONE_PUBLIC int lime_getCachedRcvKeyByZid(xmlDocPtr cacheBuffer, limeKey_t *associatedKey);
|
||||
|
||||
/**
|
||||
* @brief Set in cache the given key material, association is made by ZID contained in the associatedKey parameter
|
||||
*
|
||||
* @param[out] cacheBuffer The xmlDoc containing current cache to be updated
|
||||
* @param[in/out] associatedKey Structure containing the key and ZID to identify the peer node to be updated
|
||||
* @param[in] role Can be LIME_SENDER or LIME_RECEIVER, specify which key we want to update
|
||||
*
|
||||
* @return 0 on success, error code otherwise
|
||||
*/
|
||||
|
||||
LINPHONE_PUBLIC int lime_setCachedKey(xmlDocPtr cacheBuffer, limeKey_t *associatedKey, uint8_t role);
|
||||
|
||||
/**
|
||||
* @brief Free all allocated data in the associated keys structure
|
||||
* Note, this will also free the peerURI string which then must have been allocated
|
||||
*
|
||||
* @param[in/out] associatedKeys The structure to be cleaned
|
||||
*
|
||||
*/
|
||||
LINPHONE_PUBLIC void lime_freeKeys(limeURIKeys_t associatedKeys);
|
||||
|
||||
/**
|
||||
* @brief Derive in place the key given in parameter and increment session index
|
||||
* Derivation is made derived Key = HMAC_SHA256(Key, 0x0000001||"MessageKey"||0x00||SessionId||SessionIndex||256)
|
||||
*
|
||||
* @param[in/out] key The structure containing the original key which will be overwritten, the sessionId and SessionIndex
|
||||
*
|
||||
* @return 0 on success, error code otherwise
|
||||
*/
|
||||
LINPHONE_PUBLIC int lime_deriveKey(limeKey_t *key);
|
||||
|
||||
/**
|
||||
* @brief encrypt a message with the given key
|
||||
*
|
||||
* @param[in] key Key to use: first 192 bits are used as key, last 64 bits as init vector
|
||||
* @param[in] message The string to be encrypted
|
||||
* @param[in] messageLength The length in bytes of the message to be encrypted
|
||||
* @param[in] selfZID The self ZID is use in authentication tag computation
|
||||
* @param[out] encryptedMessage A buffer to hold the output, ouput length is input's one + 16 for the authentication tag
|
||||
* Authentication tag is set at the begining of the encrypted Message
|
||||
*
|
||||
* @return 0 on success, error code otherwise
|
||||
*
|
||||
*/
|
||||
LINPHONE_PUBLIC int lime_encryptMessage(limeKey_t *key, uint8_t *plainMessage, uint32_t messageLength, uint8_t selfZID[12], uint8_t *encryptedMessage);
|
||||
|
||||
/**
|
||||
* @brief Encrypt a file before transfering it to the server, encryption is done in several call, first one will be done with cryptoContext null, last one with length = 0
|
||||
*
|
||||
* @param[in/out] cryptoContext The context used to encrypt the file using AES-GCM. Is created at first call(if null)
|
||||
* @param[in] key 256 bits : 192 bits of key || 64 bits of Initial Vector
|
||||
* @param[in] length Length of data to be encrypted, if 0 it will conclude the encryption
|
||||
* @param[in] plain Plain data to be encrypted (length bytes)
|
||||
* @param[out] cipher Output to a buffer allocated by caller, at least length bytes available
|
||||
*
|
||||
* @return 0 on success, error code otherwise
|
||||
*
|
||||
*/
|
||||
LINPHONE_PUBLIC int lime_encryptFile(void **cryptoContext, unsigned char *key, size_t length, char *plain, char *cipher);
|
||||
|
||||
/**
|
||||
* @brief Decrypt a file retrieved from server, decryption is done in several call, first one will be done with cryptoContext null, last one with length = 0
|
||||
*
|
||||
* @param[in/out] cryptoContext The context used to decrypt the file using AES-GCM. Is created at first call(if null)
|
||||
* @param[in] key 256 bits : 192 bits of key || 64 bits of Initial Vector
|
||||
* @param[in] length Length of data to be decrypted, if 0 it will conclude the decryption
|
||||
* @param[out] plain Output to a buffer allocated by caller, at least length bytes available
|
||||
* @param[in] cipher Cipher text to be decrypted(length bytes)
|
||||
*
|
||||
* @return 0 on success, error code otherwise
|
||||
*
|
||||
*/
|
||||
LINPHONE_PUBLIC int lime_decryptFile(void **cryptoContext, unsigned char *key, size_t length, char *plain, char *cipher);
|
||||
|
||||
/**
|
||||
* @brief decrypt and authentify a message with the given key
|
||||
*
|
||||
* @param[in] key Key to use: first 192 bits are used as key, last 64 bits as init vector
|
||||
* @param[in] message The string to be decrypted
|
||||
* @param[in] messageLength The length in bytes of the message to be decrypted (this include the 16 bytes tag at the begining of the message)
|
||||
* @param[in] selfZID The self ZID is use in authentication tag computation
|
||||
* @param[out] plainMessage A buffer to hold the output, ouput length is input's one - 16 for the authentication tag + 1 for null termination char
|
||||
* Authentication tag is retrieved at the begining of the encrypted Message
|
||||
*
|
||||
* @return 0 on success, error code otherwise
|
||||
*
|
||||
*/
|
||||
|
||||
LINPHONE_PUBLIC int lime_decryptMessage(limeKey_t *key, uint8_t *encryptedMessage, uint32_t messageLength, uint8_t selfZID[12], uint8_t *plainMessage);
|
||||
|
||||
/**
|
||||
* @brief create the encrypted multipart xml message from plain text and destination URI
|
||||
* Retrieve in cache the needed keys which are then updated. Output buffer is allocated and must be freed by caller
|
||||
*
|
||||
* @param[in/out] cacheBuffer The xmlDoc containing current cache, get the keys and selfZID from it, updated by this function with derivated keys
|
||||
* @param[in] message The plain text message to be encrypted
|
||||
* @param[in] peerURI The destination URI, associated keys will be found in cache
|
||||
* @param[out] output The output buffer, allocated and set with the encrypted message xml body(null terminated string). Must be freed by caller
|
||||
*
|
||||
* @return 0 on success, error code otherwise
|
||||
*/
|
||||
LINPHONE_PUBLIC int lime_createMultipartMessage(xmlDocPtr cacheBuffer, uint8_t *message, uint8_t *peerURI, uint8_t **output);
|
||||
|
||||
/**
|
||||
* @brief decrypt a multipart xml message
|
||||
* Retrieve in cache the needed key which is then updated. Output buffer is allocated and must be freed by caller
|
||||
*
|
||||
* @param[in/out] cacheBuffer The xmlDoc containing current cache, get the key and selfZID from it, updated by this function with derivated keys
|
||||
* @param[in] message The multipart message, contain one or several part identified by destination ZID, one shall match the self ZID retrieved from cache
|
||||
* @param[out] output The output buffer, allocated and set with the decrypted message(null terminated string). Must be freed by caller
|
||||
*
|
||||
* @return 0 on success, error code otherwise
|
||||
*/
|
||||
|
||||
LINPHONE_PUBLIC int lime_decryptMultipartMessage(xmlDocPtr cacheBuffer, uint8_t *message, uint8_t **output);
|
||||
|
||||
/**
|
||||
* @brief given a readable version of error code generated by Lime functions
|
||||
* @param[in] errorCode The error code
|
||||
* @return a string containing the error description
|
||||
*/
|
||||
LINPHONE_PUBLIC char *lime_error_code_to_string(int errorCode);
|
||||
|
||||
#endif /* LIME_H */
|
||||
|
|
@ -28,20 +28,59 @@
|
|||
|
||||
#include "linphonecore.h"
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup tunnel
|
||||
* @{
|
||||
**/
|
||||
|
||||
/**
|
||||
* This set of methods enhance LinphoneCore functionalities in order to provide an easy to use API to
|
||||
* - provision tunnel servers ip addresses and ports. This functionality is an option not implemented under GPL.
|
||||
* - start/stop the tunneling service
|
||||
* - perform auto-detection whether tunneling is required, based on a test of sending/receiving a flow of UDP packets.
|
||||
* Linphone tunnel aims is to bypass IP traffic blocking due to aggressive firewalls which typically only authorize TCP traffic with destination port 443.
|
||||
* <br> Its principle is tunneling all SIP and/or RTP traffic through a single secure https connection up to a detunnelizer server.
|
||||
* <br> This set of methods enhance LinphoneCore functionalities in order to provide an easy to use API to
|
||||
* \li provision tunnel servers IP addresses and ports. This functionality is an option not implemented under GPL. Availability can be check at runtime using function #linphone_core_tunnel_available
|
||||
* \li start/stop the tunneling service
|
||||
* \li perform auto-detection whether tunneling is required, based on a test of sending/receiving a flow of UDP packets.
|
||||
*
|
||||
* It takes in charge automatically the SIP registration procedure when connecting or disconnecting to a tunnel server.
|
||||
* No other action on LinphoneCore is required to enable full operation in tunnel mode.
|
||||
**/
|
||||
*
|
||||
* <br> Provision is done using object #LinphoneTunnelConfig created by function #linphone_tunnel_config_new(). Functions #linphone_tunnel_config_set_host
|
||||
* and #linphone_tunnel_config_set_port allow to point to tunnel server IP/port. Once set, use function #linphone_tunnel_add_server to provision a tunnel server.
|
||||
* <br> Finally tunnel mode configuration is achieved by function #linphone_tunnel_set_mode.
|
||||
* <br> Tunnel connection status can be checked using function #linphone_tunnel_connected.
|
||||
*
|
||||
* Bellow pseudo code that can be use to configure, enable, check state and disable tunnel functionality:
|
||||
*
|
||||
* \code
|
||||
LinphoneTunnel *tunnel = linphone_core_get_tunnel(linphone_core);
|
||||
LinphoneTunnelConfig *config=linphone_tunnel_config_new(); //instantiate tunnel configuration
|
||||
linphone_tunnel_config_set_host(config, "tunnel.linphone.org"); //set tunnel server host address
|
||||
linphone_tunnel_config_set_port(config, 443); //set tunnel server port
|
||||
linphone_tunnel_add_server(tunnel, config); //provision tunnel config
|
||||
linphone_tunnel_set_mode(tunnel, LinphoneTunnelModeEnable); //activate the tunnel unconditional
|
||||
|
||||
while (!linphone_tunnel_connected(tunnel)) { //wait for tunnel to be ready
|
||||
linphone_core_iterate(linphone_core); //schedule core main loop
|
||||
ms_sleep(100); //wait 100ms
|
||||
}
|
||||
|
||||
LinphoneCall *call = linphone_core_invite(linphone_core,"sip:foo@example.org"); //place an outgoing call
|
||||
linphone_call_ref(call); //acquire a reference on the call to avoid deletion after completion
|
||||
//...
|
||||
linphone_core_terminate_call(linphone_core,call);
|
||||
|
||||
while (linphone_call_get_state(call) != LinphoneCallReleased) { //wait for call to be in release state
|
||||
linphone_core_iterate(linphone_core); //schedule core main loop
|
||||
ms_sleep(100); //wait 100ms
|
||||
}
|
||||
|
||||
linphone_tunnel_set_mode(tunnel, LinphoneTunnelModeDisable); //deactivate tunnel
|
||||
linphone_call_unref(call); //release reference on the call
|
||||
|
||||
\endcode
|
||||
*
|
||||
* **/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
|
|
|
|||
|
|
@ -240,7 +240,7 @@ static int get_max_codec_sample_rate(const MSList *codecs){
|
|||
for(it=codecs;it!=NULL;it=it->next){
|
||||
PayloadType *pt=(PayloadType*)it->data;
|
||||
int sample_rate;
|
||||
|
||||
|
||||
if( strcasecmp("G722",pt->mime_type) == 0 ){
|
||||
/* G722 spec says 8000 but the codec actually requires 16000 */
|
||||
sample_rate = 16000;
|
||||
|
|
@ -283,7 +283,7 @@ static void linphone_core_assign_payload_type_numbers(LinphoneCore *lc, MSList *
|
|||
for (elem=codecs; elem!=NULL; elem=elem->next){
|
||||
PayloadType *pt=(PayloadType*)elem->data;
|
||||
int number=payload_type_get_number(pt);
|
||||
|
||||
|
||||
/*check if number is duplicated: it could be the case if the remote forced us to use a mapping with a previous offer*/
|
||||
if (number!=-1 && !(pt->flags & PAYLOAD_TYPE_FROZEN_NUMBER)){
|
||||
if (!is_payload_type_number_available(codecs, number, pt)){
|
||||
|
|
@ -291,7 +291,7 @@ static void linphone_core_assign_payload_type_numbers(LinphoneCore *lc, MSList *
|
|||
number=-1; /*need to be re-assigned*/
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (number==-1){
|
||||
while(dyn_number<127){
|
||||
if (is_payload_type_number_available(codecs, dyn_number, NULL)){
|
||||
|
|
@ -364,7 +364,7 @@ static MSList *make_codec_list(LinphoneCore *lc, CodecConstraints * hints, SalSt
|
|||
for(it=codecs;it!=NULL;it=it->next){
|
||||
PayloadType *pt=(PayloadType*)it->data;
|
||||
int num;
|
||||
|
||||
|
||||
if (!(pt->flags & PAYLOAD_TYPE_ENABLED))
|
||||
continue;
|
||||
if (hints->bandwidth_limit>0 && !linphone_core_is_payload_type_usable_for_bandwidth(lc,pt,hints->bandwidth_limit)){
|
||||
|
|
@ -376,14 +376,14 @@ static MSList *make_codec_list(LinphoneCore *lc, CodecConstraints * hints, SalSt
|
|||
continue;
|
||||
}
|
||||
pt=payload_type_clone(pt);
|
||||
|
||||
|
||||
/*look for a previously assigned number for this codec*/
|
||||
num=find_payload_type_number(hints->previously_used, pt);
|
||||
if (num!=-1){
|
||||
payload_type_set_number(pt,num);
|
||||
payload_type_set_flag(pt, PAYLOAD_TYPE_FROZEN_NUMBER);
|
||||
}
|
||||
|
||||
|
||||
l=ms_list_append(l, pt);
|
||||
nb++;
|
||||
if ((hints->max_codecs > 0) && (nb >= hints->max_codecs)) break;
|
||||
|
|
@ -568,8 +568,8 @@ static const char *linphone_call_get_bind_ip_for_stream(LinphoneCall *call, int
|
|||
|
||||
static const char *linphone_call_get_public_ip_for_stream(LinphoneCall *call, int stream_index){
|
||||
const char *public_ip=call->localip;
|
||||
|
||||
if (stream_index<2 && call->media_ports[stream_index].multicast_ip[0]!='\0')
|
||||
|
||||
if (stream_index<2 && call->media_ports[stream_index].multicast_ip[0]!='\0')
|
||||
public_ip=call->media_ports[stream_index].multicast_ip;
|
||||
return public_ip;
|
||||
}
|
||||
|
|
@ -584,7 +584,7 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *
|
|||
LinphoneAddress *addr;
|
||||
const char *subject;
|
||||
CodecConstraints codec_hints={0};
|
||||
|
||||
|
||||
/*multicast is only set in case of outgoing call*/
|
||||
if (call->dir == LinphoneCallOutgoing && linphone_core_audio_multicast_enabled(lc)) {
|
||||
md->streams[0].ttl=linphone_core_get_audio_multicast_ttl(lc);
|
||||
|
|
@ -803,7 +803,7 @@ static void linphone_call_init_common(LinphoneCall *call, LinphoneAddress *from,
|
|||
|
||||
linphone_core_get_video_port_range(call->core, &min_port, &max_port);
|
||||
port_config_set(call,1,min_port,max_port);
|
||||
|
||||
|
||||
if (call->dir==LinphoneCallOutgoing){
|
||||
if ( linphone_core_audio_multicast_enabled(call->core)){
|
||||
strncpy(call->media_ports[0].multicast_ip,
|
||||
|
|
@ -817,7 +817,7 @@ 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);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void linphone_call_init_stats(LinphoneCallStats *stats, int type) {
|
||||
|
|
@ -1285,12 +1285,6 @@ void linphone_call_set_state(LinphoneCall *call, LinphoneCallState cstate, const
|
|||
call->log->status=LinphoneCallSuccess;
|
||||
call->log->connected_date_time=time(NULL);
|
||||
break;
|
||||
case LinphoneCallStreamsRunning:
|
||||
if (call->dtmfs_timer!=NULL){
|
||||
/*cancelling DTMF sequence, if any*/
|
||||
linphone_call_cancel_dtmfs(call);
|
||||
}
|
||||
break;
|
||||
case LinphoneCallReleased:
|
||||
#ifdef ANDROID
|
||||
ms_message("Call [%p] releases wifi/multicast lock",call);
|
||||
|
|
@ -1300,7 +1294,13 @@ void linphone_call_set_state(LinphoneCall *call, LinphoneCallState cstate, const
|
|||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if(cstate!=LinphoneCallStreamsRunning) {
|
||||
if (call->dtmfs_timer!=NULL){
|
||||
/*cancelling DTMF sequence, if any*/
|
||||
linphone_call_cancel_dtmfs(call);
|
||||
}
|
||||
}
|
||||
linphone_core_notify_call_state_changed(lc,call,cstate,message);
|
||||
linphone_reporting_call_state_updated(call);
|
||||
|
|
@ -1873,7 +1873,7 @@ void linphone_call_init_audio_stream(LinphoneCall *call){
|
|||
if (call->audiostream != NULL) return;
|
||||
if (call->sessions[0].rtp_session==NULL){
|
||||
call->audiostream=audiostream=audio_stream_new2(linphone_call_get_bind_ip_for_stream(call,0),
|
||||
call->media_ports[0].mcast_rtp_port ? call->media_ports[0].mcast_rtp_port : call->media_ports[0].rtp_port,
|
||||
call->media_ports[0].mcast_rtp_port ? call->media_ports[0].mcast_rtp_port : call->media_ports[0].rtp_port,
|
||||
call->media_ports[0].mcast_rtcp_port ? call->media_ports[0].mcast_rtcp_port : call->media_ports[0].rtcp_port);
|
||||
linphone_call_join_multicast_group(call, 0, &audiostream->ms);
|
||||
rtp_session_enable_network_simulation(call->audiostream->ms.sessions.rtp_session, &lc->net_conf.netsim_params);
|
||||
|
|
@ -2091,9 +2091,7 @@ static void parametrize_equalizer(LinphoneCore *lc, AudioStream *st){
|
|||
}
|
||||
|
||||
void set_mic_gain_db(AudioStream *st, float gain){
|
||||
if (st->volsend){
|
||||
ms_filter_call_method(st->volsend,MS_VOLUME_SET_DB_GAIN,&gain);
|
||||
}else ms_warning("Could not apply mic gain: gain control wasn't activated.");
|
||||
audio_stream_set_mic_gain_db(st, gain);
|
||||
}
|
||||
|
||||
void set_playback_gain_db(AudioStream *st, float gain){
|
||||
|
|
@ -2350,6 +2348,11 @@ void static start_dtls( MSMediaStreamSessions *sessions, const SalStreamDescrip
|
|||
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");
|
||||
return;
|
||||
}
|
||||
|
||||
if (call->audiostream && (media_stream_get_state((const MediaStream *)call->audiostream) == MSStreamStarted))/*dtls must start at the end of ice*/
|
||||
start_dtls(&call->audiostream->ms.sessions
|
||||
,sal_media_description_find_best_stream(result_desc,SalAudio)
|
||||
|
|
@ -2379,6 +2382,12 @@ void static set_dtls_fingerprint( MSMediaStreamSessions *sessions, const SalStr
|
|||
void static set_dtls_fingerprint_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 final media desc, aborting DTLS fingerprinting");
|
||||
return;
|
||||
}
|
||||
|
||||
if (call->audiostream && (media_stream_get_state((const MediaStream *)call->audiostream) == MSStreamStarted))/*dtls must start at the end of ice*/
|
||||
set_dtls_fingerprint(&call->audiostream->ms.sessions
|
||||
,sal_media_description_find_best_stream(result_desc,SalAudio)
|
||||
|
|
@ -2419,7 +2428,7 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, bool_t muted, b
|
|||
playfile=lc->play_file;
|
||||
recfile=lc->rec_file;
|
||||
call->audio_profile=make_profile(call,call->resultdesc,stream,&used_pt);
|
||||
|
||||
|
||||
if (used_pt!=-1){
|
||||
call->current_params->audio_codec = rtp_profile_get_payload(call->audio_profile, used_pt);
|
||||
if (playcard==NULL) {
|
||||
|
|
@ -2490,7 +2499,7 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, bool_t muted, b
|
|||
configure_rtp_session_for_rtcp_xr(lc, call, SalAudio);
|
||||
if (is_multicast)
|
||||
rtp_session_set_multicast_ttl(call->audiostream->ms.sessions.rtp_session,stream->ttl);
|
||||
|
||||
|
||||
audio_stream_start_full(
|
||||
call->audiostream,
|
||||
call->audio_profile,
|
||||
|
|
@ -2507,6 +2516,9 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, bool_t muted, b
|
|||
use_ec
|
||||
);
|
||||
post_configure_audio_streams(call, muted && !send_ringbacktone);
|
||||
|
||||
media_stream_session_encryption_mandatory_enable(&call->audiostream->ms.sessions,linphone_core_is_media_encryption_mandatory(call->core));
|
||||
|
||||
if (stream->dir==SalStreamSendOnly && playfile!=NULL){
|
||||
int pause_time=500;
|
||||
ms_filter_call_method(call->audiostream->soundread,MS_FILE_PLAYER_LOOP,&pause_time);
|
||||
|
|
@ -2639,6 +2651,7 @@ static void linphone_call_start_video_stream(LinphoneCall *call, bool_t all_inpu
|
|||
(linphone_core_rtcp_enabled(lc) && !is_multicast) ? (vstream->rtcp_port ? vstream->rtcp_port : vstream->rtp_port+1) : 0,
|
||||
used_pt, linphone_core_get_video_jittcomp(lc), cam);
|
||||
}
|
||||
media_stream_session_encryption_mandatory_enable(&call->videostream->ms.sessions,linphone_core_is_media_encryption_mandatory(call->core));
|
||||
}
|
||||
}else ms_warning("No video stream accepted.");
|
||||
}else{
|
||||
|
|
@ -2652,6 +2665,49 @@ static void linphone_call_start_video_stream(LinphoneCall *call, bool_t all_inpu
|
|||
#endif
|
||||
}
|
||||
|
||||
static void setZrtpCryptoTypesParameters(MSZrtpParams *params, LinphoneCore *lc)
|
||||
{
|
||||
int i;
|
||||
const MSCryptoSuite *srtp_suites;
|
||||
|
||||
if (params == NULL) return;
|
||||
if (lc == NULL) return;
|
||||
|
||||
srtp_suites = linphone_core_get_srtp_crypto_suites(lc);
|
||||
if (srtp_suites!=NULL) {
|
||||
for(i=0; srtp_suites[i]!=MS_CRYPTO_SUITE_INVALID && i<SAL_CRYPTO_ALGO_MAX && i<MS_MAX_ZRTP_CRYPTO_TYPES; ++i){
|
||||
switch (srtp_suites[i]) {
|
||||
case MS_AES_128_SHA1_32:
|
||||
params->ciphers[params->ciphersCount++] = MS_ZRTP_CIPHER_AES1;
|
||||
params->authTags[params->authTagsCount++] = MS_ZRTP_AUTHTAG_HS32;
|
||||
break;
|
||||
case MS_AES_128_NO_AUTH:
|
||||
params->ciphers[params->ciphersCount++] = MS_ZRTP_CIPHER_AES1;
|
||||
break;
|
||||
case MS_NO_CIPHER_SHA1_80:
|
||||
params->authTags[params->authTagsCount++] = MS_ZRTP_AUTHTAG_HS80;
|
||||
break;
|
||||
case MS_AES_128_SHA1_80:
|
||||
params->ciphers[params->ciphersCount++] = MS_ZRTP_CIPHER_AES1;
|
||||
params->authTags[params->authTagsCount++] = MS_ZRTP_AUTHTAG_HS80;
|
||||
break;
|
||||
case MS_AES_256_SHA1_80:
|
||||
params->ciphers[params->ciphersCount++] = MS_ZRTP_CIPHER_AES3;
|
||||
params->authTags[params->authTagsCount++] = MS_ZRTP_AUTHTAG_HS80;
|
||||
break;
|
||||
case MS_AES_256_SHA1_32:
|
||||
params->ciphers[params->ciphersCount++] = MS_ZRTP_CIPHER_AES3;
|
||||
params->authTags[params->authTagsCount++] = MS_ZRTP_AUTHTAG_HS80;
|
||||
break;
|
||||
case MS_CRYPTO_SUITE_INVALID:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
params->keyAgreementsCount = linphone_core_get_zrtp_key_agreements(lc, params->keyAgreements);
|
||||
}
|
||||
|
||||
void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_muted, bool_t send_ringbacktone){
|
||||
LinphoneCore *lc=call->core;
|
||||
bool_t use_arc=linphone_core_adaptive_rate_control_enabled(lc);
|
||||
|
|
@ -2696,6 +2752,8 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut
|
|||
memset(¶ms,0,sizeof(MSZrtpParams));
|
||||
/*call->current_params.media_encryption will be set later when zrtp is activated*/
|
||||
params.zid_file=lc->zrtp_secrets_cache;
|
||||
params.uri= linphone_address_as_string_uri_only((call->dir==LinphoneCallIncoming) ? call->log->from : call->log->to);
|
||||
setZrtpCryptoTypesParameters(¶ms,call->core);
|
||||
audio_stream_enable_zrtp(call->audiostream,¶ms);
|
||||
#if VIDEO_ENABLED
|
||||
if (media_stream_secured((MediaStream *)call->audiostream) && media_stream_get_state((MediaStream *)call->videostream) == MSStreamStarted) {
|
||||
|
|
@ -3246,7 +3304,7 @@ void linphone_call_stop_recording(LinphoneCall *call){
|
|||
static void report_bandwidth(LinphoneCall *call, MediaStream *as, MediaStream *vs){
|
||||
bool_t as_active = as ? (media_stream_get_state(as) == MSStreamStarted) : FALSE;
|
||||
bool_t vs_active = vs ? (media_stream_get_state(vs) == MSStreamStarted) : FALSE;
|
||||
|
||||
|
||||
call->stats[LINPHONE_CALL_STATS_AUDIO].download_bandwidth=(as_active) ? (media_stream_get_down_bw(as)*1e-3) : 0;
|
||||
call->stats[LINPHONE_CALL_STATS_AUDIO].upload_bandwidth=(as_active) ? (media_stream_get_up_bw(as)*1e-3) : 0;
|
||||
call->stats[LINPHONE_CALL_STATS_VIDEO].download_bandwidth=(vs_active) ? (media_stream_get_down_bw(vs)*1e-3) : 0;
|
||||
|
|
@ -3256,18 +3314,18 @@ static void report_bandwidth(LinphoneCall *call, MediaStream *as, MediaStream *v
|
|||
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;
|
||||
|
||||
ms_message("Bandwidth usage for call [%p]: audio[ rtp]=[d=%.1f,u=%.1f], video[ rtp]=[d=%.1f,u=%.1f] kbit/sec",
|
||||
call,
|
||||
call->stats[LINPHONE_CALL_STATS_AUDIO].download_bandwidth,
|
||||
call->stats[LINPHONE_CALL_STATS_AUDIO].upload_bandwidth ,
|
||||
call->stats[LINPHONE_CALL_STATS_VIDEO].download_bandwidth,
|
||||
call->stats[LINPHONE_CALL_STATS_VIDEO].upload_bandwidth
|
||||
);
|
||||
ms_message(" [rtcp]=[d=%.1f,u=%.1f], video[rtcp]=[d=%.1f,u=%.1f] kbit/sec",
|
||||
call->stats[LINPHONE_CALL_STATS_AUDIO].rtcp_download_bandwidth,
|
||||
call->stats[LINPHONE_CALL_STATS_AUDIO].rtcp_upload_bandwidth ,
|
||||
call->stats[LINPHONE_CALL_STATS_VIDEO].rtcp_download_bandwidth,
|
||||
call->stats[LINPHONE_CALL_STATS_VIDEO].rtcp_upload_bandwidth
|
||||
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"
|
||||
"\tRTCP audio=[d=%5.1f,u=%5.1f], video=[d=%5.1f,u=%5.1f] kbits/sec",
|
||||
call,
|
||||
call->stats[LINPHONE_CALL_STATS_AUDIO].download_bandwidth,
|
||||
call->stats[LINPHONE_CALL_STATS_AUDIO].upload_bandwidth,
|
||||
call->stats[LINPHONE_CALL_STATS_VIDEO].download_bandwidth,
|
||||
call->stats[LINPHONE_CALL_STATS_VIDEO].upload_bandwidth,
|
||||
call->stats[LINPHONE_CALL_STATS_AUDIO].rtcp_download_bandwidth,
|
||||
call->stats[LINPHONE_CALL_STATS_AUDIO].rtcp_upload_bandwidth,
|
||||
call->stats[LINPHONE_CALL_STATS_VIDEO].rtcp_download_bandwidth,
|
||||
call->stats[LINPHONE_CALL_STATS_VIDEO].rtcp_upload_bandwidth
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
linphone
|
||||
Copyright (C) 2000 Simon MORLAT (simon.morlat@linphone.org)
|
||||
Copyright (C) 2010 Belledonne Communications SARL
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
|
|
@ -189,7 +190,16 @@ static void linphone_core_log_collection_handler(OrtpLogLevel level, const char
|
|||
struct stat statbuf;
|
||||
|
||||
if (liblinphone_log_func != NULL) {
|
||||
#ifndef WIN32
|
||||
va_list args_copy;
|
||||
va_copy(args_copy, args);
|
||||
liblinphone_log_func(level, fmt, args_copy);
|
||||
va_end(args_copy);
|
||||
#else
|
||||
/* This works on 32 bits, luckily. */
|
||||
/* TODO: va_copy is available in Visual Studio 2013. */
|
||||
liblinphone_log_func(level, fmt, args);
|
||||
#endif
|
||||
}
|
||||
|
||||
ortp_gettimeofday(&tp, NULL);
|
||||
|
|
@ -323,27 +333,31 @@ void linphone_core_enable_log_collection(LinphoneLogCollectionState state) {
|
|||
}
|
||||
}
|
||||
|
||||
static void delete_log_collection_upload_file(void) {
|
||||
static void clean_log_collection_upload_context(LinphoneCore *lc) {
|
||||
char *filename = ms_strdup_printf("%s/%s_log.%s",
|
||||
liblinphone_log_collection_path ? liblinphone_log_collection_path : LOG_COLLECTION_DEFAULT_PATH,
|
||||
liblinphone_log_collection_prefix ? liblinphone_log_collection_prefix : LOG_COLLECTION_DEFAULT_PREFIX,
|
||||
COMPRESSED_LOG_COLLECTION_EXTENSION);
|
||||
unlink(filename);
|
||||
ms_free(filename);
|
||||
if (lc && lc->log_collection_upload_information) {
|
||||
ms_free(lc->log_collection_upload_information);
|
||||
lc->log_collection_upload_information=NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void process_io_error_upload_log_collection(void *data, const belle_sip_io_error_event_t *event) {
|
||||
LinphoneCore *core = (LinphoneCore *)data;
|
||||
ms_error("I/O Error during log collection upload to %s", linphone_core_get_log_collection_upload_server_url(core));
|
||||
linphone_core_notify_log_collection_upload_state_changed(core, LinphoneCoreLogCollectionUploadStateNotDelivered, "I/O Error");
|
||||
delete_log_collection_upload_file();
|
||||
clean_log_collection_upload_context(core);
|
||||
}
|
||||
|
||||
static void process_auth_requested_upload_log_collection(void *data, belle_sip_auth_event_t *event) {
|
||||
LinphoneCore *core = (LinphoneCore *)data;
|
||||
ms_error("Error during log collection upload: auth requested to connect %s", linphone_core_get_log_collection_upload_server_url(core));
|
||||
linphone_core_notify_log_collection_upload_state_changed(core, LinphoneCoreLogCollectionUploadStateNotDelivered, "Auth requested");
|
||||
delete_log_collection_upload_file();
|
||||
clean_log_collection_upload_context(core);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -470,7 +484,7 @@ static void process_response_from_post_file_log_collection(void *data, const bel
|
|||
if (file_url != NULL) {
|
||||
linphone_core_notify_log_collection_upload_state_changed(core, LinphoneCoreLogCollectionUploadStateDelivered, (const char *)file_url);
|
||||
}
|
||||
delete_log_collection_upload_file();
|
||||
clean_log_collection_upload_context(core);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -609,7 +623,7 @@ char * linphone_core_compress_log_collection() {
|
|||
void linphone_core_reset_log_collection() {
|
||||
char *filename;
|
||||
ortp_mutex_lock(&liblinphone_log_collection_mutex);
|
||||
delete_log_collection_upload_file();
|
||||
clean_log_collection_upload_context(NULL);
|
||||
filename = ms_strdup_printf("%s/%s1.log",
|
||||
liblinphone_log_collection_path ? liblinphone_log_collection_path : LOG_COLLECTION_DEFAULT_PATH,
|
||||
liblinphone_log_collection_prefix ? liblinphone_log_collection_prefix : LOG_COLLECTION_DEFAULT_PREFIX);
|
||||
|
|
@ -890,6 +904,8 @@ static void sip_config_read(LinphoneCore *lc)
|
|||
tmp=lp_config_get_int(lc->config,"sip","guess_hostname",1);
|
||||
linphone_core_set_guess_hostname(lc,tmp);
|
||||
|
||||
tmp=lp_config_get_int(lc->config,"sip","lime",FALSE);
|
||||
linphone_core_enable_lime(lc,tmp);
|
||||
|
||||
tmp=lp_config_get_int(lc->config,"sip","inc_timeout",30);
|
||||
linphone_core_set_inc_timeout(lc,tmp);
|
||||
|
|
@ -1075,7 +1091,10 @@ static bool_t get_codec(LinphoneCore *lc, SalStreamType type, int index, Payload
|
|||
pt=find_payload(type==SalAudio ? lc->default_audio_codecs : lc->default_video_codecs,mime,rate,channels,fmtp);
|
||||
if (!pt){
|
||||
MSList **default_list=(type==SalAudio) ? &lc->default_audio_codecs : &lc->default_video_codecs;
|
||||
ms_warning("Codec %s/%i read from conf is not in the default list.",mime,rate);
|
||||
if (type==SalAudio)
|
||||
ms_warning("Codec %s/%i/%i read from conf is not in the default list.",mime,rate,channels);
|
||||
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;
|
||||
pt->mime_type=ortp_strdup(mime);
|
||||
|
|
@ -1086,6 +1105,7 @@ static bool_t get_codec(LinphoneCore *lc, SalStreamType type, int index, Payload
|
|||
*default_list=ms_list_append(*default_list, pt);
|
||||
}
|
||||
if (enabled ) pt->flags|=PAYLOAD_TYPE_ENABLED;
|
||||
else pt->flags&=~PAYLOAD_TYPE_ENABLED;
|
||||
*ret=pt;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -1292,7 +1312,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", "Simple");
|
||||
return lp_config_get_string(lc->config, "net", "adaptive_rate_algorithm", "Stateful");
|
||||
}
|
||||
|
||||
bool_t linphone_core_rtcp_enabled(const LinphoneCore *lc){
|
||||
|
|
@ -1473,7 +1493,7 @@ static void misc_config_read(LinphoneCore *lc) {
|
|||
LpConfig *config=lc->config;
|
||||
const char *uuid;
|
||||
|
||||
lc->max_call_logs=lp_config_get_int(config,"misc","history_max_size",15);
|
||||
lc->max_call_logs=lp_config_get_int(config,"misc","history_max_size",30);
|
||||
lc->max_calls=lp_config_get_int(config,"misc","max_calls",NB_MAX_CALLS);
|
||||
|
||||
uuid=lp_config_get_string(config,"misc","uuid",NULL);
|
||||
|
|
@ -1615,7 +1635,7 @@ static void linphone_core_init(LinphoneCore * lc, const LinphoneCoreVTable *vtab
|
|||
|
||||
|
||||
memcpy(local_vtable,vtable,sizeof(LinphoneCoreVTable));
|
||||
lc->vtables=ms_list_append(lc->vtables,local_vtable);
|
||||
_linphone_core_add_listener(lc, local_vtable, TRUE);
|
||||
|
||||
linphone_core_set_state(lc,LinphoneGlobalStartup,"Starting up");
|
||||
ortp_init();
|
||||
|
|
@ -1810,6 +1830,20 @@ bool_t linphone_core_get_guess_hostname(LinphoneCore *lc){
|
|||
return lc->sip_conf.guess_hostname;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tells to LinphoneCore to use Linphone Instant Messaging encryption
|
||||
*
|
||||
*/
|
||||
void linphone_core_enable_lime(LinphoneCore *lc, bool_t val){
|
||||
if (linphone_core_ready(lc)){
|
||||
lp_config_set_int(lc->config,"sip","lime",val);
|
||||
}
|
||||
}
|
||||
|
||||
bool_t linphone_core_lime_enabled(const LinphoneCore *lc){
|
||||
return lp_config_get_int(lc->config,"sip", "lime", FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as linphone_core_get_primary_contact() but the result is a LinphoneAddress object
|
||||
* instead of const char*
|
||||
|
|
@ -4768,8 +4802,12 @@ bool_t linphone_core_echo_limiter_enabled(const LinphoneCore *lc){
|
|||
}
|
||||
|
||||
static void linphone_core_mute_audio_stream(LinphoneCore *lc, AudioStream *st, bool_t val) {
|
||||
audio_stream_set_mic_gain(st,
|
||||
(val==TRUE) ? 0 : pow(10,lc->sound_conf.soft_mic_lev/10));
|
||||
if (val) {
|
||||
audio_stream_set_mic_gain(st, 0);
|
||||
} 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);
|
||||
}
|
||||
|
|
@ -6341,7 +6379,7 @@ static void linphone_core_uninit(LinphoneCore *lc)
|
|||
ms_exit();
|
||||
linphone_core_set_state(lc,LinphoneGlobalOff,"Off");
|
||||
linphone_core_deactivate_log_serialization_if_needed();
|
||||
ms_list_free_with_data(lc->vtables,(void (*)(void *))linphone_core_v_table_destroy);
|
||||
ms_list_free_with_data(lc->vtable_refs,(void (*)(void *))v_table_reference_destroy);
|
||||
}
|
||||
|
||||
static void set_network_reachable(LinphoneCore* lc,bool_t isReachable, time_t curtime){
|
||||
|
|
@ -7123,144 +7161,6 @@ int linphone_payload_type_get_channels(const LinphonePayloadType *pt) {
|
|||
return pt->channels;
|
||||
}
|
||||
|
||||
LinphoneCoreVTable *linphone_core_v_table_new() {
|
||||
return ms_new0(LinphoneCoreVTable,1);
|
||||
}
|
||||
|
||||
void linphone_core_v_table_set_user_data(LinphoneCoreVTable *table, void *data) {
|
||||
table->user_data = data;
|
||||
}
|
||||
|
||||
void* linphone_core_v_table_get_user_data(LinphoneCoreVTable *table) {
|
||||
return table->user_data;
|
||||
}
|
||||
|
||||
void linphone_core_v_table_destroy(LinphoneCoreVTable* table) {
|
||||
ms_free(table);
|
||||
}
|
||||
|
||||
LinphoneCoreVTable *linphone_core_get_current_vtable(LinphoneCore *lc) {
|
||||
return lc->current_vtable;
|
||||
}
|
||||
|
||||
#define NOTIFY_IF_EXIST(function_name) \
|
||||
MSList* iterator; \
|
||||
ms_message ("Linphone core [%p] notifying [%s]",lc,#function_name);\
|
||||
for (iterator=lc->vtables; iterator!=NULL; iterator=iterator->next) \
|
||||
if ((lc->current_vtable=((LinphoneCoreVTable*)(iterator->data)))->function_name)\
|
||||
((LinphoneCoreVTable*)(iterator->data))->function_name
|
||||
void linphone_core_notify_global_state_changed(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message) {
|
||||
NOTIFY_IF_EXIST(global_state_changed)(lc,gstate,message);
|
||||
}
|
||||
void linphone_core_notify_call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *message){
|
||||
NOTIFY_IF_EXIST(call_state_changed)(lc,call,cstate,message);
|
||||
}
|
||||
void linphone_core_notify_call_encryption_changed(LinphoneCore *lc, LinphoneCall *call, bool_t on, const char *authentication_token) {
|
||||
NOTIFY_IF_EXIST(call_encryption_changed)(lc,call,on,authentication_token);
|
||||
}
|
||||
void linphone_core_notify_registration_state_changed(LinphoneCore *lc, LinphoneProxyConfig *cfg, LinphoneRegistrationState cstate, const char *message){
|
||||
NOTIFY_IF_EXIST(registration_state_changed)(lc,cfg,cstate,message);
|
||||
}
|
||||
void linphone_core_notify_show_interface(LinphoneCore *lc){
|
||||
NOTIFY_IF_EXIST(show)(lc);
|
||||
}
|
||||
void linphone_core_notify_display_status(LinphoneCore *lc, const char *message) {
|
||||
NOTIFY_IF_EXIST(display_status)(lc,message);
|
||||
}
|
||||
void linphone_core_notify_display_message(LinphoneCore *lc, const char *message){
|
||||
NOTIFY_IF_EXIST(display_message)(lc,message);
|
||||
}
|
||||
void linphone_core_notify_display_warning(LinphoneCore *lc, const char *message){
|
||||
NOTIFY_IF_EXIST(display_warning)(lc,message);
|
||||
}
|
||||
void linphone_core_notify_display_url(LinphoneCore *lc, const char *message, const char *url){
|
||||
NOTIFY_IF_EXIST(display_url)(lc,message,url);
|
||||
}
|
||||
void linphone_core_notify_notify_presence_received(LinphoneCore *lc, LinphoneFriend * lf){
|
||||
NOTIFY_IF_EXIST(notify_presence_received)(lc,lf);
|
||||
}
|
||||
void linphone_core_notify_new_subscription_requested(LinphoneCore *lc, LinphoneFriend *lf, const char *url){
|
||||
NOTIFY_IF_EXIST(new_subscription_requested)(lc,lf,url);
|
||||
}
|
||||
void linphone_core_notify_auth_info_requested(LinphoneCore *lc, const char *realm, const char *username, const char *domain){
|
||||
NOTIFY_IF_EXIST(auth_info_requested)(lc,realm,username,domain);
|
||||
}
|
||||
void linphone_core_notify_call_log_updated(LinphoneCore *lc, LinphoneCallLog *newcl){
|
||||
NOTIFY_IF_EXIST(call_log_updated)(lc,newcl);
|
||||
}
|
||||
void linphone_core_notify_text_message_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message){
|
||||
NOTIFY_IF_EXIST(text_received)(lc,room,from,message);
|
||||
}
|
||||
void linphone_core_notify_message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *message){
|
||||
NOTIFY_IF_EXIST(message_received)(lc,room,message);
|
||||
}
|
||||
void linphone_core_notify_file_transfer_recv(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, const char* buff, size_t size) {
|
||||
NOTIFY_IF_EXIST(file_transfer_recv)(lc,message,content,buff,size);
|
||||
}
|
||||
void linphone_core_notify_file_transfer_send(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, char* buff, size_t* size) {
|
||||
NOTIFY_IF_EXIST(file_transfer_send)(lc,message,content,buff,size);
|
||||
}
|
||||
void linphone_core_notify_file_transfer_progress_indication(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, size_t offset, size_t total) {
|
||||
NOTIFY_IF_EXIST(file_transfer_progress_indication)(lc,message,content,offset,total);
|
||||
}
|
||||
void linphone_core_notify_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room) {
|
||||
NOTIFY_IF_EXIST(is_composing_received)(lc,room);
|
||||
}
|
||||
void linphone_core_notify_dtmf_received(LinphoneCore* lc, LinphoneCall *call, int dtmf) {
|
||||
NOTIFY_IF_EXIST(dtmf_received)(lc,call,dtmf);
|
||||
}
|
||||
bool_t linphone_core_dtmf_received_has_listener(const LinphoneCore* lc) {
|
||||
MSList* iterator;
|
||||
for (iterator=lc->vtables; iterator!=NULL; iterator=iterator->next)
|
||||
if (((LinphoneCoreVTable*)(iterator->data))->dtmf_received)
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
void linphone_core_notify_refer_received(LinphoneCore *lc, const char *refer_to) {
|
||||
NOTIFY_IF_EXIST(refer_received)(lc,refer_to);
|
||||
}
|
||||
void linphone_core_notify_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf) {
|
||||
NOTIFY_IF_EXIST(buddy_info_updated)(lc,lf);
|
||||
}
|
||||
void linphone_core_notify_transfer_state_changed(LinphoneCore *lc, LinphoneCall *transfered, LinphoneCallState new_call_state) {
|
||||
NOTIFY_IF_EXIST(transfer_state_changed)(lc,transfered,new_call_state);
|
||||
}
|
||||
void linphone_core_notify_call_stats_updated(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallStats *stats) {
|
||||
NOTIFY_IF_EXIST(call_stats_updated)(lc,call,stats);
|
||||
}
|
||||
void linphone_core_notify_info_received(LinphoneCore *lc, LinphoneCall *call, const LinphoneInfoMessage *msg) {
|
||||
NOTIFY_IF_EXIST(info_received)(lc,call,msg);
|
||||
}
|
||||
void linphone_core_notify_configuring_status(LinphoneCore *lc, LinphoneConfiguringState status, const char *message) {
|
||||
NOTIFY_IF_EXIST(configuring_status)(lc,status,message);
|
||||
}
|
||||
void linphone_core_notify_network_reachable(LinphoneCore *lc, bool_t reachable) {
|
||||
NOTIFY_IF_EXIST(network_reachable)(lc,reachable);
|
||||
}
|
||||
void linphone_core_notify_notify_received(LinphoneCore *lc, LinphoneEvent *lev, const char *notified_event, const LinphoneContent *body) {
|
||||
NOTIFY_IF_EXIST(notify_received)(lc,lev,notified_event,body);
|
||||
}
|
||||
void linphone_core_notify_subscription_state_changed(LinphoneCore *lc, LinphoneEvent *lev, LinphoneSubscriptionState state) {
|
||||
NOTIFY_IF_EXIST(subscription_state_changed)(lc,lev,state);
|
||||
}
|
||||
void linphone_core_notify_publish_state_changed(LinphoneCore *lc, LinphoneEvent *lev, LinphonePublishState state) {
|
||||
NOTIFY_IF_EXIST(publish_state_changed)(lc,lev,state);
|
||||
}
|
||||
void linphone_core_notify_log_collection_upload_state_changed(LinphoneCore *lc, LinphoneCoreLogCollectionUploadState state, const char *info) {
|
||||
NOTIFY_IF_EXIST(log_collection_upload_state_changed)(lc, state, info);
|
||||
}
|
||||
void linphone_core_notify_log_collection_upload_progress_indication(LinphoneCore *lc, size_t offset, size_t total) {
|
||||
NOTIFY_IF_EXIST(log_collection_upload_progress_indication)(lc, offset, total);
|
||||
}
|
||||
void linphone_core_add_listener(LinphoneCore *lc, LinphoneCoreVTable *vtable) {
|
||||
ms_message("Vtable [%p] registered on core [%p]",lc,vtable);
|
||||
lc->vtables=ms_list_append(lc->vtables,vtable);
|
||||
}
|
||||
void linphone_core_remove_listener(LinphoneCore *lc, const LinphoneCoreVTable *vtable) {
|
||||
ms_message("Vtable [%p] unregistered on core [%p]",lc,vtable);
|
||||
lc->vtables=ms_list_remove(lc->vtables,(void*)vtable);
|
||||
}
|
||||
|
||||
int linphone_core_set_audio_multicast_addr(LinphoneCore *lc, const char* ip) {
|
||||
char* new_value;
|
||||
if (ip && !ms_is_multicast(ip)) {
|
||||
|
|
@ -7289,7 +7189,6 @@ const char* linphone_core_get_audio_multicast_addr(const LinphoneCore *lc) {
|
|||
return lc->rtp_conf.audio_multicast_addr;
|
||||
}
|
||||
|
||||
|
||||
const char* linphone_core_get_video_multicast_addr(const LinphoneCore *lc){
|
||||
return lc->rtp_conf.video_multicast_addr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -200,9 +200,9 @@ LINPHONE_PUBLIC int linphone_error_info_get_protocol_code(const LinphoneErrorInf
|
|||
|
||||
/* linphone dictionary */
|
||||
LINPHONE_PUBLIC LinphoneDictionary* linphone_dictionary_new(void);
|
||||
LinphoneDictionary * linphone_dictionary_clone(const LinphoneDictionary* src);
|
||||
LinphoneDictionary * linphone_dictionary_ref(LinphoneDictionary* obj);
|
||||
void linphone_dictionary_unref(LinphoneDictionary* obj);
|
||||
LINPHONE_PUBLIC LinphoneDictionary * linphone_dictionary_clone(const LinphoneDictionary* src);
|
||||
LINPHONE_PUBLIC LinphoneDictionary * linphone_dictionary_ref(LinphoneDictionary* obj);
|
||||
LINPHONE_PUBLIC void linphone_dictionary_unref(LinphoneDictionary* obj);
|
||||
LINPHONE_PUBLIC void linphone_dictionary_set_int(LinphoneDictionary* obj, const char* key, int value);
|
||||
LINPHONE_PUBLIC int linphone_dictionary_get_int(LinphoneDictionary* obj, const char* key, int default_value);
|
||||
LINPHONE_PUBLIC void linphone_dictionary_set_string(LinphoneDictionary* obj, const char* key, const char*value);
|
||||
|
|
@ -218,14 +218,14 @@ LINPHONE_PUBLIC void linphone_dictionary_foreach( const LinphoneDictionary* obj,
|
|||
* @return a #LinphoneDictionary with all the keys from a section, or NULL if the section doesn't exist
|
||||
* @ingroup misc
|
||||
*/
|
||||
LinphoneDictionary* lp_config_section_to_dict( const LpConfig* lpconfig, const char* section );
|
||||
LINPHONE_PUBLIC LinphoneDictionary* lp_config_section_to_dict( const LpConfig* lpconfig, const char* section );
|
||||
|
||||
/**
|
||||
* Loads a dictionary into a section of the lpconfig. If the section doesn't exist it is created.
|
||||
* Overwrites existing keys, creates non-existing keys.
|
||||
* @ingroup misc
|
||||
*/
|
||||
void lp_config_load_dict_to_section( LpConfig* lpconfig, const char* section, const LinphoneDictionary* dict);
|
||||
LINPHONE_PUBLIC void lp_config_load_dict_to_section( LpConfig* lpconfig, const char* section, const LinphoneDictionary* dict);
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -583,15 +583,15 @@ typedef struct _LinphonePlayer LinphonePlayer;
|
|||
**/
|
||||
typedef void (*LinphonePlayerEofCallback)(struct _LinphonePlayer *obj, void *user_data);
|
||||
|
||||
int linphone_player_open(LinphonePlayer *obj, const char *filename, LinphonePlayerEofCallback, void *user_data);
|
||||
int linphone_player_start(LinphonePlayer *obj);
|
||||
int linphone_player_pause(LinphonePlayer *obj);
|
||||
int linphone_player_seek(LinphonePlayer *obj, int time_ms);
|
||||
MSPlayerState linphone_player_get_state(LinphonePlayer *obj);
|
||||
int linphone_player_get_duration(LinphonePlayer *obj);
|
||||
int linphone_player_get_current_position(LinphonePlayer *obj);
|
||||
void linphone_player_close(LinphonePlayer *obj);
|
||||
void linphone_player_destroy(LinphonePlayer *obj);
|
||||
LINPHONE_PUBLIC int linphone_player_open(LinphonePlayer *obj, const char *filename, LinphonePlayerEofCallback, void *user_data);
|
||||
LINPHONE_PUBLIC int linphone_player_start(LinphonePlayer *obj);
|
||||
LINPHONE_PUBLIC int linphone_player_pause(LinphonePlayer *obj);
|
||||
LINPHONE_PUBLIC int linphone_player_seek(LinphonePlayer *obj, int time_ms);
|
||||
LINPHONE_PUBLIC MSPlayerState linphone_player_get_state(LinphonePlayer *obj);
|
||||
LINPHONE_PUBLIC int linphone_player_get_duration(LinphonePlayer *obj);
|
||||
LINPHONE_PUBLIC int linphone_player_get_current_position(LinphonePlayer *obj);
|
||||
LINPHONE_PUBLIC void linphone_player_close(LinphonePlayer *obj);
|
||||
LINPHONE_PUBLIC void linphone_player_destroy(LinphonePlayer *obj);
|
||||
|
||||
/**
|
||||
* @brief Create an independent media file player.
|
||||
|
|
@ -1062,7 +1062,7 @@ LINPHONE_PUBLIC const char* linphone_proxy_config_get_transport(const LinphonePr
|
|||
/* destruction is called automatically when removing the proxy config */
|
||||
LINPHONE_PUBLIC void linphone_proxy_config_destroy(LinphoneProxyConfig *cfg);
|
||||
LINPHONE_PUBLIC void linphone_proxy_config_set_sip_setup(LinphoneProxyConfig *cfg, const char *type);
|
||||
SipSetupContext *linphone_proxy_config_get_sip_setup_context(LinphoneProxyConfig *cfg);
|
||||
LINPHONE_PUBLIC SipSetupContext *linphone_proxy_config_get_sip_setup_context(LinphoneProxyConfig *cfg);
|
||||
LINPHONE_PUBLIC SipSetup *linphone_proxy_config_get_sip_setup(LinphoneProxyConfig *cfg);
|
||||
|
||||
/**
|
||||
|
|
@ -1186,19 +1186,19 @@ typedef struct _LinphoneAccountCreator{
|
|||
bool_t succeeded;
|
||||
}LinphoneAccountCreator;
|
||||
|
||||
LinphoneAccountCreator *linphone_account_creator_new(LinphoneCore *core, const char *type);
|
||||
void linphone_account_creator_set_username(LinphoneAccountCreator *obj, const char *username);
|
||||
void linphone_account_creator_set_password(LinphoneAccountCreator *obj, const char *password);
|
||||
void linphone_account_creator_set_domain(LinphoneAccountCreator *obj, const char *domain);
|
||||
void linphone_account_creator_set_route(LinphoneAccountCreator *obj, const char *route);
|
||||
void linphone_account_creator_set_email(LinphoneAccountCreator *obj, const char *email);
|
||||
void linphone_account_creator_set_suscribe(LinphoneAccountCreator *obj, int suscribre);
|
||||
const char * linphone_account_creator_get_username(LinphoneAccountCreator *obj);
|
||||
const char * linphone_account_creator_get_domain(LinphoneAccountCreator *obj);
|
||||
int linphone_account_creator_test_existence(LinphoneAccountCreator *obj);
|
||||
int linphone_account_creator_test_validation(LinphoneAccountCreator *obj);
|
||||
LinphoneProxyConfig * linphone_account_creator_validate(LinphoneAccountCreator *obj);
|
||||
void linphone_account_creator_destroy(LinphoneAccountCreator *obj);
|
||||
LINPHONE_PUBLIC LinphoneAccountCreator *linphone_account_creator_new(LinphoneCore *core, const char *type);
|
||||
LINPHONE_PUBLIC void linphone_account_creator_set_username(LinphoneAccountCreator *obj, const char *username);
|
||||
LINPHONE_PUBLIC void linphone_account_creator_set_password(LinphoneAccountCreator *obj, const char *password);
|
||||
LINPHONE_PUBLIC void linphone_account_creator_set_domain(LinphoneAccountCreator *obj, const char *domain);
|
||||
LINPHONE_PUBLIC void linphone_account_creator_set_route(LinphoneAccountCreator *obj, const char *route);
|
||||
LINPHONE_PUBLIC void linphone_account_creator_set_email(LinphoneAccountCreator *obj, const char *email);
|
||||
LINPHONE_PUBLIC void linphone_account_creator_set_suscribe(LinphoneAccountCreator *obj, int suscribre);
|
||||
LINPHONE_PUBLIC const char * linphone_account_creator_get_username(LinphoneAccountCreator *obj);
|
||||
LINPHONE_PUBLIC const char * linphone_account_creator_get_domain(LinphoneAccountCreator *obj);
|
||||
LINPHONE_PUBLIC int linphone_account_creator_test_existence(LinphoneAccountCreator *obj);
|
||||
LINPHONE_PUBLIC int linphone_account_creator_test_validation(LinphoneAccountCreator *obj);
|
||||
LINPHONE_PUBLIC LinphoneProxyConfig * linphone_account_creator_validate(LinphoneAccountCreator *obj);
|
||||
LINPHONE_PUBLIC void linphone_account_creator_destroy(LinphoneAccountCreator *obj);
|
||||
|
||||
struct _LinphoneAuthInfo;
|
||||
|
||||
|
|
@ -1890,7 +1890,7 @@ typedef struct _LinphoneCoreVTable{
|
|||
LinphoneCoreNetworkReachableCb network_reachable; /**< Callback to report IP network status (I.E up/down )*/
|
||||
LinphoneCoreLogCollectionUploadStateChangedCb log_collection_upload_state_changed; /**< Callback to upload collected logs */
|
||||
LinphoneCoreLogCollectionUploadProgressIndicationCb log_collection_upload_progress_indication; /**< Callback to indicate log collection upload progress */
|
||||
void *user_data;
|
||||
void *user_data; /**<User data associated with the above callbacks */
|
||||
} LinphoneCoreVTable;
|
||||
|
||||
/**
|
||||
|
|
@ -2249,6 +2249,9 @@ LINPHONE_PUBLIC const char * linphone_core_get_identity(LinphoneCore *lc);
|
|||
LINPHONE_PUBLIC void linphone_core_set_guess_hostname(LinphoneCore *lc, bool_t val);
|
||||
LINPHONE_PUBLIC bool_t linphone_core_get_guess_hostname(LinphoneCore *lc);
|
||||
|
||||
LINPHONE_PUBLIC void linphone_core_enable_lime(LinphoneCore *lc, bool_t val);
|
||||
LINPHONE_PUBLIC bool_t linphone_core_lime_enabled(const LinphoneCore *lc);
|
||||
|
||||
LINPHONE_PUBLIC bool_t linphone_core_ipv6_enabled(LinphoneCore *lc);
|
||||
LINPHONE_PUBLIC void linphone_core_enable_ipv6(LinphoneCore *lc, bool_t val);
|
||||
|
||||
|
|
@ -2423,7 +2426,7 @@ LINPHONE_PUBLIC const MSList *linphone_core_get_proxy_config_list(const Linphone
|
|||
/** @deprecated Use linphone_core_set_default_proxy_config() instead. */
|
||||
#define linphone_core_set_default_proxy(lc, config) linphone_core_set_default_proxy_config(lc, config)
|
||||
|
||||
void linphone_core_set_default_proxy_index(LinphoneCore *lc, int index);
|
||||
LINPHONE_PUBLIC void linphone_core_set_default_proxy_index(LinphoneCore *lc, int index);
|
||||
|
||||
LINPHONE_PUBLIC int linphone_core_get_default_proxy(LinphoneCore *lc, LinphoneProxyConfig **config);
|
||||
|
||||
|
|
@ -3090,10 +3093,10 @@ LINPHONE_PUBLIC LpConfig * linphone_core_get_config(LinphoneCore *lc);
|
|||
LINPHONE_PUBLIC LpConfig * linphone_core_create_lp_config(LinphoneCore *lc, const char *filename);
|
||||
|
||||
/*set a callback for some blocking operations, it takes you informed of the progress of the operation*/
|
||||
void linphone_core_set_waiting_callback(LinphoneCore *lc, LinphoneCoreWaitingCallback cb, void *user_context);
|
||||
LINPHONE_PUBLIC void linphone_core_set_waiting_callback(LinphoneCore *lc, LinphoneCoreWaitingCallback cb, void *user_context);
|
||||
|
||||
/*returns the list of registered SipSetup (linphonecore plugins) */
|
||||
const MSList * linphone_core_get_sip_setups(LinphoneCore *lc);
|
||||
LINPHONE_PUBLIC const MSList * linphone_core_get_sip_setups(LinphoneCore *lc);
|
||||
|
||||
LINPHONE_PUBLIC void linphone_core_destroy(LinphoneCore *lc);
|
||||
|
||||
|
|
@ -3177,8 +3180,8 @@ LINPHONE_PUBLIC float linphone_core_get_conference_local_input_volume(LinphoneCo
|
|||
|
||||
LINPHONE_PUBLIC int linphone_core_terminate_conference(LinphoneCore *lc);
|
||||
LINPHONE_PUBLIC int linphone_core_get_conference_size(LinphoneCore *lc);
|
||||
int linphone_core_start_conference_recording(LinphoneCore *lc, const char *path);
|
||||
int linphone_core_stop_conference_recording(LinphoneCore *lc);
|
||||
LINPHONE_PUBLIC int linphone_core_start_conference_recording(LinphoneCore *lc, const char *path);
|
||||
LINPHONE_PUBLIC int linphone_core_stop_conference_recording(LinphoneCore *lc);
|
||||
/**
|
||||
* Get the maximum number of simultaneous calls Linphone core can manage at a time. All new call above this limit are declined with a busy answer
|
||||
* @ingroup initializing
|
||||
|
|
@ -3195,6 +3198,13 @@ LINPHONE_PUBLIC int linphone_core_get_max_calls(LinphoneCore *lc);
|
|||
LINPHONE_PUBLIC void linphone_core_set_max_calls(LinphoneCore *lc, int max);
|
||||
|
||||
LINPHONE_PUBLIC bool_t linphone_core_sound_resources_locked(LinphoneCore *lc);
|
||||
/**
|
||||
* @ingroup initializing
|
||||
* Check if a media encryption type is supported
|
||||
* @param lc core
|
||||
* @param menc LinphoneMediaEncryption
|
||||
* @return whether a media encryption scheme is supported by the LinphoneCore engine
|
||||
**/
|
||||
|
||||
LINPHONE_PUBLIC bool_t linphone_core_media_encryption_supported(const LinphoneCore *lc, LinphoneMediaEncryption menc);
|
||||
|
||||
|
|
@ -3238,6 +3248,7 @@ LINPHONE_PUBLIC void linphone_core_init_default_params(LinphoneCore*lc, Linphone
|
|||
|
||||
/**
|
||||
* True if tunnel support was compiled.
|
||||
* @ingroup tunnel
|
||||
*/
|
||||
LINPHONE_PUBLIC bool_t linphone_core_tunnel_available(void);
|
||||
|
||||
|
|
@ -3249,6 +3260,9 @@ typedef struct _LinphoneTunnel LinphoneTunnel;
|
|||
|
||||
/**
|
||||
* get tunnel instance if available
|
||||
* @ingroup tunnel
|
||||
* @param lc core object
|
||||
* @returns LinphoneTunnel or NULL if not available
|
||||
*/
|
||||
LINPHONE_PUBLIC LinphoneTunnel *linphone_core_get_tunnel(const LinphoneCore *lc);
|
||||
|
||||
|
|
|
|||
|
|
@ -84,6 +84,8 @@ static jmethodID loghandler_id;
|
|||
static jobject handler_obj=NULL;
|
||||
|
||||
static jobject create_java_linphone_content(JNIEnv *env, const LinphoneContent *content);
|
||||
static jobject create_java_linphone_buffer(JNIEnv *env, const LinphoneBuffer *buffer);
|
||||
static LinphoneBuffer* create_c_linphone_buffer_from_java_linphone_buffer(JNIEnv *env, jobject jbuffer);
|
||||
|
||||
#ifdef ANDROID
|
||||
void linphone_android_log_handler(int prio, char *str) {
|
||||
|
|
@ -1193,8 +1195,9 @@ extern "C" void Java_org_linphone_core_LinphoneCoreImpl_removeListener(JNIEnv* e
|
|||
MSList* iterator;
|
||||
LinphoneCore *core = (LinphoneCore*)lc;
|
||||
//jobject listener = env->NewGlobalRef(jlistener);
|
||||
for (iterator = core->vtables; iterator != NULL; ) {
|
||||
LinphoneCoreVTable *vTable = (LinphoneCoreVTable*)(iterator->data);
|
||||
for (iterator = core->vtable_refs; iterator != NULL; ) {
|
||||
VTableReference *ref=(VTableReference*)(iterator->data);
|
||||
LinphoneCoreVTable *vTable = ref->valid ? ref->vtable : NULL;
|
||||
iterator = iterator->next; //Because linphone_core_remove_listener may change the list
|
||||
if (vTable) {
|
||||
LinphoneCoreData *data = (LinphoneCoreData*) linphone_core_v_table_get_user_data(vTable);
|
||||
|
|
@ -1965,15 +1968,31 @@ extern "C" jint Java_org_linphone_core_LinphoneCoreImpl_startEchoCalibration(JNI
|
|||
|
||||
}
|
||||
|
||||
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_needsEchoCalibration(JNIEnv *env, jobject thiz, jlong lc){
|
||||
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_needsEchoCalibration(JNIEnv *env, jobject thiz, jlong lc) {
|
||||
MSSndCard *sndcard;
|
||||
MSSndCardManager *m=ms_snd_card_manager_get();
|
||||
const char *card=linphone_core_get_capture_device((LinphoneCore*)lc);
|
||||
sndcard=ms_snd_card_manager_get_card(m,card);
|
||||
if (sndcard == NULL){
|
||||
MSSndCardManager *m = ms_snd_card_manager_get();
|
||||
const char *card = linphone_core_get_capture_device((LinphoneCore*)lc);
|
||||
sndcard = ms_snd_card_manager_get_card(m, card);
|
||||
if (sndcard == NULL) {
|
||||
ms_error("Could not get soundcard %s", card);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (ms_snd_card_get_capabilities(sndcard) & MS_SND_CARD_CAP_BUILTIN_ECHO_CANCELLER) return FALSE;
|
||||
if (ms_snd_card_get_minimal_latency(sndcard) != 0) return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
extern "C" jboolean Java_org_linphone_core_LinphoneCoreImpl_needsEchoCanceler(JNIEnv *env, jobject thiz, jlong lc) {
|
||||
MSSndCard *sndcard;
|
||||
MSSndCardManager *m = ms_snd_card_manager_get();
|
||||
const char *card = linphone_core_get_capture_device((LinphoneCore*)lc);
|
||||
sndcard = ms_snd_card_manager_get_card(m, card);
|
||||
if (sndcard == NULL) {
|
||||
ms_error("Could not get soundcard %s", card);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (ms_snd_card_get_capabilities(sndcard) & MS_SND_CARD_CAP_BUILTIN_ECHO_CANCELLER) return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -3046,6 +3065,8 @@ extern "C" jlong Java_org_linphone_core_LinphoneChatRoomImpl_createFileTransferM
|
|||
return (jlong) message;
|
||||
}
|
||||
|
||||
|
||||
|
||||
extern "C" void Java_org_linphone_core_LinphoneChatMessageImpl_cancelFileTransfer(JNIEnv* env, jobject thiz, jlong ptr) {
|
||||
linphone_chat_message_cancel_file_transfer((LinphoneChatMessage *)ptr);
|
||||
}
|
||||
|
|
@ -3193,6 +3214,105 @@ extern "C" jint Java_org_linphone_core_LinphoneChatMessageImpl_getStorageId(JNIE
|
|||
return (jint) linphone_chat_message_get_storage_id((LinphoneChatMessage*)ptr);
|
||||
}
|
||||
|
||||
extern "C" void Java_org_linphone_core_LinphoneChatMessageImpl_setFileTransferFilepath(JNIEnv* env
|
||||
,jobject thiz
|
||||
,jlong ptr, jstring jpath) {
|
||||
const char* path = env->GetStringUTFChars(jpath, NULL);
|
||||
linphone_chat_message_set_file_transfer_filepath((LinphoneChatMessage*)ptr, path);
|
||||
env->ReleaseStringUTFChars(jpath, path);
|
||||
}
|
||||
|
||||
extern "C" void Java_org_linphone_core_LinphoneChatMessageImpl_downloadFile(JNIEnv* env
|
||||
,jobject thiz
|
||||
,jlong ptr) {
|
||||
linphone_chat_message_download_file((LinphoneChatMessage*)ptr);
|
||||
}
|
||||
|
||||
static void message_state_changed(LinphoneChatMessage* msg, LinphoneChatMessageState state) {
|
||||
JNIEnv *env = 0;
|
||||
jint result = jvm->AttachCurrentThread(&env,NULL);
|
||||
if (result != 0) {
|
||||
ms_error("cannot attach VM\n");
|
||||
return;
|
||||
}
|
||||
|
||||
jobject listener = (jobject) msg->cb_ud;
|
||||
jclass clazz = (jclass) env->GetObjectClass(listener);
|
||||
jmethodID method = env->GetMethodID(clazz, "onLinphoneChatMessageStateChanged","(Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneChatMessage$State;)V");
|
||||
jobject jmessage = getChatMessage(env, msg);
|
||||
|
||||
jclass chatMessageStateClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneChatMessage$State"));
|
||||
jmethodID chatMessageStateFromIntId = env->GetStaticMethodID(chatMessageStateClass, "fromInt","(I)Lorg/linphone/core/LinphoneChatMessage$State;");
|
||||
env->CallVoidMethod(listener, method, jmessage, env->CallStaticObjectMethod(chatMessageStateClass, chatMessageStateFromIntId, (jint)state));
|
||||
|
||||
if (state == LinphoneChatMessageStateDelivered || state == LinphoneChatMessageStateNotDelivered) {
|
||||
env->DeleteGlobalRef(listener);
|
||||
}
|
||||
}
|
||||
|
||||
static void file_transfer_progress_indication(LinphoneChatMessage *msg, const LinphoneContent* content, size_t offset, size_t total) {
|
||||
JNIEnv *env = 0;
|
||||
jint result = jvm->AttachCurrentThread(&env,NULL);
|
||||
if (result != 0) {
|
||||
ms_error("cannot attach VM\n");
|
||||
return;
|
||||
}
|
||||
|
||||
jobject listener = (jobject) msg->cb_ud;
|
||||
jclass clazz = (jclass) env->GetObjectClass(listener);
|
||||
jmethodID method = env->GetMethodID(clazz, "onLinphoneChatMessageFileTransferProgressChanged", "(Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneContent;II)V");
|
||||
jobject jmessage = getChatMessage(env, msg);
|
||||
env->CallVoidMethod(listener, method, jmessage, content ? create_java_linphone_content(env, content) : NULL, offset, total);
|
||||
}
|
||||
|
||||
static void file_transfer_recv(LinphoneChatMessage *msg, const LinphoneContent* content, const LinphoneBuffer *buffer) {
|
||||
JNIEnv *env = 0;
|
||||
jint result = jvm->AttachCurrentThread(&env,NULL);
|
||||
if (result != 0) {
|
||||
ms_error("cannot attach VM\n");
|
||||
return;
|
||||
}
|
||||
|
||||
jobject listener = (jobject) msg->cb_ud;
|
||||
jclass clazz = (jclass) env->GetObjectClass(listener);
|
||||
jmethodID method = env->GetMethodID(clazz, "onLinphoneChatMessageFileTransferReceived", "(Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneContent;Lorg/linphone/core/LinphoneBuffer;)V");
|
||||
jobject jmessage = getChatMessage(env, msg);
|
||||
env->CallVoidMethod(listener, method, jmessage, content ? create_java_linphone_content(env, content) : NULL, buffer ? create_java_linphone_buffer(env, buffer) : NULL);
|
||||
}
|
||||
|
||||
static LinphoneBuffer* file_transfer_send(LinphoneChatMessage *msg, const LinphoneContent* content, size_t offset, size_t size) {
|
||||
JNIEnv *env = 0;
|
||||
jint result = jvm->AttachCurrentThread(&env,NULL);
|
||||
LinphoneBuffer *buffer = NULL;
|
||||
if (result != 0) {
|
||||
ms_error("cannot attach VM\n");
|
||||
return buffer;
|
||||
}
|
||||
|
||||
jobject listener = (jobject) msg->cb_ud;
|
||||
jclass clazz = (jclass) env->GetObjectClass(listener);
|
||||
jmethodID method = env->GetMethodID(clazz, "onLinphoneChatMessageFileTransferSent","(Lorg/linphone/core/LinphoneChatMessage;Lorg/linphone/core/LinphoneContent;IILorg/linphone/core/LinphoneBuffer;)V");
|
||||
jobject jmessage = getChatMessage(env, msg);
|
||||
jobject jbuffer = create_java_linphone_buffer(env, NULL);
|
||||
env->CallVoidMethod(listener, method, jmessage, content ? create_java_linphone_content(env, content) : NULL, offset, size, jbuffer);
|
||||
|
||||
buffer = create_c_linphone_buffer_from_java_linphone_buffer(env, jbuffer);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
extern "C" void Java_org_linphone_core_LinphoneChatMessageImpl_setListener(JNIEnv* env, jobject thiz, jlong ptr, jobject jlistener) {
|
||||
jobject listener = env->NewGlobalRef(jlistener);
|
||||
LinphoneChatMessage *message = (LinphoneChatMessage *)ptr;
|
||||
LinphoneChatMessageCbs *cbs;
|
||||
|
||||
message->cb_ud = listener;
|
||||
cbs = linphone_chat_message_get_callbacks(message);
|
||||
linphone_chat_message_cbs_set_msg_state_changed(cbs, message_state_changed);
|
||||
linphone_chat_message_cbs_set_file_transfer_progress_indication(cbs, file_transfer_progress_indication);
|
||||
linphone_chat_message_cbs_set_file_transfer_recv(cbs, file_transfer_recv);
|
||||
linphone_chat_message_cbs_set_file_transfer_send(cbs, file_transfer_send);
|
||||
}
|
||||
|
||||
extern "C" void Java_org_linphone_core_LinphoneChatMessageImpl_unref(JNIEnv* env
|
||||
,jobject thiz
|
||||
,jlong ptr) {
|
||||
|
|
@ -3275,11 +3395,15 @@ extern "C" void Java_org_linphone_core_LinphoneChatRoomImpl_sendMessage2(JNIEnv*
|
|||
linphone_chat_room_send_message2((LinphoneChatRoom*)chatroom_ptr, (LinphoneChatMessage*)messagePtr, chat_room_impl_callback, (void*)listener);
|
||||
}
|
||||
|
||||
extern "C" void Java_org_linphone_core_LinphoneChatMessageImpl_startFileDownload(JNIEnv* env, jobject thiz, jlong ptr, jobject jlistener) {
|
||||
jobject listener = env->NewGlobalRef(jlistener);
|
||||
LinphoneChatMessage * message = (LinphoneChatMessage *)ptr;
|
||||
message->cb_ud = listener;
|
||||
linphone_chat_message_start_file_download(message, chat_room_impl_callback, NULL);
|
||||
extern "C" void Java_org_linphone_core_LinphoneChatRoomImpl_sendChatMessage(JNIEnv* env
|
||||
,jobject thiz
|
||||
,jlong chatroom_ptr
|
||||
,jobject message
|
||||
,jlong messagePtr) {
|
||||
message = env->NewGlobalRef(message);
|
||||
linphone_chat_message_ref((LinphoneChatMessage*)messagePtr);
|
||||
linphone_chat_message_set_user_data((LinphoneChatMessage*)messagePtr, message);
|
||||
linphone_chat_room_send_chat_message((LinphoneChatRoom*)chatroom_ptr, (LinphoneChatMessage*)messagePtr);
|
||||
}
|
||||
|
||||
extern "C" void Java_org_linphone_core_LinphoneCoreImpl_setVideoWindowId(JNIEnv* env
|
||||
|
|
@ -4428,6 +4552,52 @@ static jobject create_java_linphone_content(JNIEnv *env, const LinphoneContent *
|
|||
return jobj;
|
||||
}
|
||||
|
||||
static jobject create_java_linphone_buffer(JNIEnv *env, const LinphoneBuffer *buffer) {
|
||||
jclass bufferClass;
|
||||
jmethodID ctor;
|
||||
jbyteArray jdata = NULL;
|
||||
jint jsize = 0;
|
||||
|
||||
bufferClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneBufferImpl"));
|
||||
ctor = env->GetMethodID(bufferClass,"<init>", "([BI)V");
|
||||
jsize = buffer ? (jint) buffer->size : 0;
|
||||
|
||||
if (buffer && buffer->content) {
|
||||
jdata = env->NewByteArray(buffer->size);
|
||||
env->SetByteArrayRegion(jdata, 0, buffer->size, (jbyte*)buffer->content);
|
||||
}
|
||||
|
||||
jobject jobj = env->NewObject(bufferClass, ctor, jdata, jsize);
|
||||
env->DeleteGlobalRef(bufferClass);
|
||||
return jobj;
|
||||
}
|
||||
|
||||
static LinphoneBuffer* create_c_linphone_buffer_from_java_linphone_buffer(JNIEnv *env, jobject jbuffer) {
|
||||
jclass bufferClass;
|
||||
jmethodID getSizeMethod, getDataMethod;
|
||||
LinphoneBuffer *buffer;
|
||||
jint jsize;
|
||||
jobject jdata;
|
||||
jbyteArray jcontent;
|
||||
uint8_t *content;
|
||||
|
||||
bufferClass = (jclass)env->NewGlobalRef(env->FindClass("org/linphone/core/LinphoneBufferImpl"));
|
||||
getSizeMethod = env->GetMethodID(bufferClass, "getSize", "()I");
|
||||
getDataMethod = env->GetMethodID(bufferClass, "getContent", "()[B");
|
||||
|
||||
jsize = env->CallIntMethod(jbuffer, getSizeMethod);
|
||||
jdata = env->CallObjectMethod(jbuffer, getDataMethod);
|
||||
jcontent = reinterpret_cast<jbyteArray>(jdata);
|
||||
content = (uint8_t*)env->GetByteArrayElements(jcontent, NULL);
|
||||
|
||||
buffer = linphone_buffer_new_from_data(content, (size_t)jsize);
|
||||
|
||||
env->ReleaseByteArrayElements(jcontent, (jbyte*)content, JNI_ABORT);
|
||||
env->DeleteGlobalRef(bufferClass);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: org_linphone_core_LinphoneInfoMessageImpl
|
||||
* Method: getContent
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#endif
|
||||
|
||||
#ifndef WIN32
|
||||
#ifndef ANDROID
|
||||
#if !defined(ANDROID) && !defined(__QNXNTO__)
|
||||
# include <langinfo.h>
|
||||
# include <iconv.h>
|
||||
# include <string.h>
|
||||
|
|
@ -592,7 +592,7 @@ void linphone_core_message_storage_set_debug(LinphoneCore *lc, bool_t debug){
|
|||
}
|
||||
|
||||
static int _linphone_sqlite3_open(const char *db_file, sqlite3 **db) {
|
||||
#ifdef ANDROID
|
||||
#if defined(ANDROID) || defined(__QNXNTO__)
|
||||
return sqlite3_open(db_file, db);
|
||||
#elif defined(WIN32)
|
||||
int ret;
|
||||
|
|
|
|||
|
|
@ -1533,7 +1533,7 @@ void linphone_core_set_tone(LinphoneCore *lc, LinphoneToneID id, const char *aud
|
|||
}
|
||||
|
||||
const MSCryptoSuite * linphone_core_get_srtp_crypto_suites(LinphoneCore *lc){
|
||||
const char *config=lp_config_get_string(lc->config,"sip","srtp_crypto_suites","AES_CM_128_HMAC_SHA1_80, AES_CM_128_HMAC_SHA1_32");
|
||||
const char *config=lp_config_get_string(lc->config,"sip","srtp_crypto_suites","AES_CM_128_HMAC_SHA1_80, AES_CM_128_HMAC_SHA1_32, AES_CM_256_HMAC_SHA1_80, AES_CM_256_HMAC_SHA1_32");
|
||||
char *tmp=ms_strdup(config);
|
||||
char *sep;
|
||||
char *pos;
|
||||
|
|
@ -1581,6 +1581,41 @@ const MSCryptoSuite * linphone_core_get_srtp_crypto_suites(LinphoneCore *lc){
|
|||
return result;
|
||||
}
|
||||
|
||||
static char * seperate_string_list(char **str) {
|
||||
char *ret;
|
||||
|
||||
if (str == NULL) return NULL;
|
||||
if (*str == NULL) return NULL;
|
||||
if (**str == '\0') return NULL;
|
||||
|
||||
ret = *str;
|
||||
for ( ; **str!='\0' && **str!=' ' && **str!=','; (*str)++);
|
||||
if (**str == '\0') {
|
||||
return ret;
|
||||
} else {
|
||||
**str = '\0';
|
||||
do { (*str)++; } while (**str!='\0' && (**str==' ' || **str==','));
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
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 key_agreements_count = 0;
|
||||
|
||||
if (config == NULL) return 0;
|
||||
|
||||
while ((entry = seperate_string_list(&config))) {
|
||||
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));
|
||||
keyAgreements[key_agreements_count++] = agreement;
|
||||
}
|
||||
}
|
||||
|
||||
return key_agreements_count;
|
||||
}
|
||||
|
||||
|
||||
const char ** linphone_core_get_supported_file_formats(LinphoneCore *core){
|
||||
|
|
|
|||
|
|
@ -321,7 +321,7 @@ void _linphone_proxy_config_release(LinphoneProxyConfig *cfg);
|
|||
* Can be NULL
|
||||
* */
|
||||
const LinphoneAddress* linphone_proxy_config_get_service_route(const LinphoneProxyConfig* cfg);
|
||||
char* linphone_proxy_config_get_contact(const LinphoneProxyConfig *cfg);
|
||||
LINPHONE_PUBLIC char* linphone_proxy_config_get_contact(const LinphoneProxyConfig *cfg);
|
||||
|
||||
void linphone_friend_close_subscriptions(LinphoneFriend *lf);
|
||||
void linphone_friend_update_subscribes(LinphoneFriend *fr, LinphoneProxyConfig *cfg, bool_t only_when_registered);
|
||||
|
|
@ -717,7 +717,7 @@ typedef struct _LinphoneConference LinphoneConference;
|
|||
|
||||
struct _LinphoneCore
|
||||
{
|
||||
MSList* vtables;
|
||||
MSList* vtable_refs;
|
||||
Sal *sal;
|
||||
LinphoneGlobalState state;
|
||||
struct _LpConfig *config;
|
||||
|
|
@ -767,6 +767,8 @@ struct _LinphoneCore
|
|||
char* zrtp_secrets_cache;
|
||||
char* user_certificates_path;
|
||||
LinphoneVideoPolicy video_policy;
|
||||
time_t network_last_check;
|
||||
|
||||
bool_t use_files;
|
||||
bool_t apply_nat_settings;
|
||||
bool_t initial_subscribes_sent;
|
||||
|
|
@ -776,13 +778,11 @@ struct _LinphoneCore
|
|||
bool_t auto_net_state_mon;
|
||||
bool_t network_reachable;
|
||||
bool_t network_reachable_to_be_notified; /*set to true when state must be notified in next iterate*/
|
||||
|
||||
bool_t use_preview_window;
|
||||
|
||||
time_t network_last_check;
|
||||
|
||||
bool_t network_last_status;
|
||||
bool_t ringstream_autorelease;
|
||||
bool_t pad[2];
|
||||
bool_t vtables_running;
|
||||
char localip[LINPHONE_IPADDR_SIZE];
|
||||
int device_rotation;
|
||||
int max_calls;
|
||||
|
|
@ -801,6 +801,7 @@ struct _LinphoneCore
|
|||
belle_tls_verify_policy_t *http_verify_policy;
|
||||
MSList *tones;
|
||||
LinphoneReason chat_deny_code;
|
||||
char *file_transfer_server;
|
||||
const char **supported_formats;
|
||||
LinphoneContent *log_collection_upload_information;
|
||||
LinphoneCoreVTable *current_vtable; // the latest vtable to call a callback, see linphone_core_get_current_vtable
|
||||
|
|
@ -973,7 +974,7 @@ BELLE_SIP_DECLARE_VPTR(LinphoneBuffer);
|
|||
|
||||
void linphone_configuring_terminated(LinphoneCore *lc, LinphoneConfiguringState state, const char *message);
|
||||
int linphone_remote_provisioning_download_and_apply(LinphoneCore *lc, const char *remote_provisioning_uri);
|
||||
int linphone_remote_provisioning_load_file( LinphoneCore* lc, const char* file_path);
|
||||
LINPHONE_PUBLIC int linphone_remote_provisioning_load_file( LinphoneCore* lc, const char* file_path);
|
||||
|
||||
/*****************************************************************************
|
||||
* Player interface
|
||||
|
|
@ -1048,6 +1049,7 @@ 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]);
|
||||
|
||||
/** Belle Sip-based objects need unique ids
|
||||
*/
|
||||
|
|
@ -1113,6 +1115,37 @@ void set_playback_gain_db(AudioStream *st, float gain);
|
|||
LinphoneMediaDirection media_direction_from_sal_stream_dir(SalStreamDir dir);
|
||||
SalStreamDir sal_dir_from_call_params_dir(LinphoneMediaDirection cpdir);
|
||||
|
||||
/*****************************************************************************
|
||||
* LINPHONE CONTENT PRIVATE ACCESSORS *
|
||||
****************************************************************************/
|
||||
/**
|
||||
* Get the key associated with a RCS file transfer message if encrypted
|
||||
* @param[in] content LinphoneContent object.
|
||||
* @return The key to encrypt/decrypt the file associated to this content.
|
||||
*/
|
||||
const char *linphone_content_get_key(const LinphoneContent *content);
|
||||
|
||||
/**
|
||||
* Get the size of key associated with a RCS file transfer message if encrypted
|
||||
* @param[in] content LinphoneContent object.
|
||||
* @return The key size in bytes
|
||||
*/
|
||||
size_t linphone_content_get_key_size(const LinphoneContent *content);
|
||||
/**
|
||||
* Set the key associated with a RCS file transfer message if encrypted
|
||||
* @param[in] content LinphoneContent object.
|
||||
* @param[in] key The key to be used to encrypt/decrypt file associated to this content.
|
||||
*/
|
||||
void linphone_content_set_key(LinphoneContent *content, const char *key, const size_t keyLength);
|
||||
|
||||
/**
|
||||
* Get the address of the crypto context associated with a RCS file transfer message if encrypted
|
||||
* @param[in] content LinphoneContent object.
|
||||
* @return The address of the pointer to the crypto context. Crypto context is managed(alloc/free)
|
||||
* by the encryption/decryption functions, so we give the address to store/retrieve the pointer
|
||||
*/
|
||||
void ** linphone_content_get_cryptoContext_address(LinphoneContent *content);
|
||||
|
||||
#ifdef ANDROID
|
||||
void linphone_core_wifi_lock_acquire(LinphoneCore *lc);
|
||||
void linphone_core_wifi_lock_release(LinphoneCore *lc);
|
||||
|
|
@ -1120,6 +1153,18 @@ void linphone_core_multicast_lock_acquire(LinphoneCore *lc);
|
|||
void linphone_core_multicast_lock_release(LinphoneCore *lc);
|
||||
#endif
|
||||
|
||||
struct _VTableReference{
|
||||
LinphoneCoreVTable *vtable;
|
||||
bool_t valid;
|
||||
bool_t autorelease;
|
||||
};
|
||||
|
||||
typedef struct _VTableReference VTableReference;
|
||||
|
||||
void v_table_reference_destroy(VTableReference *ref);
|
||||
|
||||
void _linphone_core_add_listener(LinphoneCore *lc, LinphoneCoreVTable *vtable, bool_t autorelease);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -510,7 +510,7 @@ void linphone_proxy_config_refresh_register(LinphoneProxyConfig *obj){
|
|||
/**
|
||||
* Sets a dialing prefix to be automatically prepended when inviting a number with
|
||||
* linphone_core_invite();
|
||||
* This dialing prefix shall usually be the country code of the country where the user is living.
|
||||
* This dialing prefix shall usually be the country code of the country where the user is living, without "+".
|
||||
*
|
||||
**/
|
||||
void linphone_proxy_config_set_dial_prefix(LinphoneProxyConfig *cfg, const char *prefix){
|
||||
|
|
@ -917,7 +917,7 @@ static void replace_plus(const char *src, char *dest, size_t destlen, const char
|
|||
|
||||
if (icp && src[0]=='+' && (destlen>(i=strlen(icp))) ){
|
||||
src++;
|
||||
strcpy(dest,icp);
|
||||
strncpy(dest, icp, destlen);
|
||||
}
|
||||
|
||||
for(;(i<destlen-1) && *src!='\0';++i){
|
||||
|
|
@ -927,8 +927,18 @@ static void replace_plus(const char *src, char *dest, size_t destlen, const char
|
|||
dest[i]='\0';
|
||||
}
|
||||
|
||||
static void replace_icp(const char *src, char *dest, size_t destlen, const char *icp){
|
||||
int i=0;
|
||||
if (strstr(src, icp) == src){
|
||||
dest[0]='+';
|
||||
i++;
|
||||
}
|
||||
strncpy(dest+i, src+strlen(icp), destlen-i-1);
|
||||
}
|
||||
|
||||
|
||||
bool_t linphone_proxy_config_normalize_number(LinphoneProxyConfig *proxy, const char *username, char *result, size_t result_len){
|
||||
memset(result, 0, result_len);
|
||||
if (linphone_proxy_config_is_phone_number(proxy, username)){
|
||||
char *flatten;
|
||||
flatten=flatten_number(username);
|
||||
|
|
@ -936,18 +946,21 @@ bool_t linphone_proxy_config_normalize_number(LinphoneProxyConfig *proxy, const
|
|||
|
||||
if (proxy->dial_prefix==NULL || proxy->dial_prefix[0]=='\0'){
|
||||
/*no prefix configured, nothing else to do*/
|
||||
strncpy(result,flatten,result_len);
|
||||
ms_free(flatten);
|
||||
strncpy(result,flatten,result_len-1);
|
||||
}else{
|
||||
dial_plan_t dialplan;
|
||||
lookup_dial_plan(proxy->dial_prefix,&dialplan);
|
||||
ms_debug("Using dialplan '%s'",dialplan.country);
|
||||
if (flatten[0]=='+' || strstr(flatten,dialplan.icp)==flatten){
|
||||
if (flatten[0]=='+'){
|
||||
/* the number has international prefix or +, so nothing to do*/
|
||||
ms_debug("Prefix already present.");
|
||||
/*eventually replace the plus*/
|
||||
/*eventually replace the plus by the international calling prefix of the country*/
|
||||
replace_plus(flatten,result,result_len,proxy->dial_escape_plus ? dialplan.icp : NULL);
|
||||
ms_free(flatten);
|
||||
}else if (strstr(flatten,dialplan.icp)==flatten){
|
||||
if (!proxy->dial_escape_plus)
|
||||
replace_icp(flatten, result, result_len, dialplan.icp);
|
||||
else
|
||||
strncpy(result, flatten, result_len-1);
|
||||
}else{
|
||||
int numlen;
|
||||
int i=0;
|
||||
|
|
@ -956,7 +969,7 @@ bool_t linphone_proxy_config_normalize_number(LinphoneProxyConfig *proxy, const
|
|||
/*keep at most national number significant digits */
|
||||
skip=numlen-dialplan.nnl;
|
||||
if (skip<0) skip=0;
|
||||
/*first prepend internation calling prefix or +*/
|
||||
/*first prepend international calling prefix or +*/
|
||||
if (proxy->dial_escape_plus){
|
||||
strncpy(result,dialplan.icp,result_len);
|
||||
i+=strlen(dialplan.icp);
|
||||
|
|
@ -971,12 +984,12 @@ bool_t linphone_proxy_config_normalize_number(LinphoneProxyConfig *proxy, const
|
|||
}
|
||||
/*add user digits */
|
||||
strncpy(result+i,flatten+skip,result_len-i-1);
|
||||
ms_free(flatten);
|
||||
}
|
||||
}
|
||||
ms_free(flatten);
|
||||
return TRUE;
|
||||
} else {
|
||||
strncpy(result,username,result_len);
|
||||
strncpy(result,username,result_len-1);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,32 +60,9 @@ static void linphone_remote_provisioning_apply(LinphoneCore *lc, const char *xml
|
|||
, error_msg);
|
||||
}
|
||||
|
||||
static char *load_file_content(const char *path){
|
||||
FILE *f=fopen(path,"rb");
|
||||
size_t bufsize=2048;
|
||||
size_t step=bufsize;
|
||||
size_t pos=0;
|
||||
size_t count;
|
||||
char *buffer=ms_malloc(bufsize+1);
|
||||
if (!f) {
|
||||
ms_error("load_file_content(): could not open [%s]",path);
|
||||
return NULL;
|
||||
}
|
||||
while((count=fread(buffer+pos, 1, step, f))>0){
|
||||
pos+=count;
|
||||
if (pos+step>=bufsize){
|
||||
bufsize*=2;
|
||||
buffer=ms_realloc(buffer, bufsize+1);
|
||||
}
|
||||
}
|
||||
buffer[pos]='\0';
|
||||
fclose(f);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
int linphone_remote_provisioning_load_file( LinphoneCore* lc, const char* file_path){
|
||||
int status = -1;
|
||||
char* provisioning=load_file_content(file_path);
|
||||
char* provisioning=ms_load_path_content(file_path, NULL);
|
||||
|
||||
if (provisioning){
|
||||
linphone_remote_provisioning_apply(lc, provisioning);
|
||||
|
|
|
|||
|
|
@ -23,6 +23,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
#include "mediastreamer2/mscommon.h"
|
||||
|
||||
#ifndef LINPHONE_PUBLIC
|
||||
#define LINPHONE_PUBLIC MS2_PUBLIC
|
||||
#endif
|
||||
|
||||
struct _SipSetup;
|
||||
|
||||
struct _BuddyInfo;
|
||||
|
|
@ -120,7 +124,7 @@ extern "C"{
|
|||
BuddyInfo *buddy_info_new(void);
|
||||
void buddy_info_free(BuddyInfo *info);
|
||||
|
||||
void buddy_lookup_request_set_key(BuddyLookupRequest *req, const char *key);
|
||||
LINPHONE_PUBLIC void buddy_lookup_request_set_key(BuddyLookupRequest *req, const char *key);
|
||||
void buddy_lookup_request_set_max_results(BuddyLookupRequest *req, int ncount);
|
||||
|
||||
|
||||
|
|
@ -128,28 +132,28 @@ void sip_setup_register(SipSetup *ss);
|
|||
void sip_setup_register_all(void);
|
||||
SipSetup *sip_setup_lookup(const char *type_name);
|
||||
void sip_setup_unregister_all(void);
|
||||
unsigned int sip_setup_get_capabilities(SipSetup *s);
|
||||
LINPHONE_PUBLIC unsigned int sip_setup_get_capabilities(SipSetup *s);
|
||||
|
||||
SipSetupContext * sip_setup_context_new(SipSetup *s, struct _LinphoneProxyConfig *cfg);
|
||||
int sip_setup_context_account_exists(SipSetupContext *ctx, const char *uri);
|
||||
int sip_setup_context_account_validated(SipSetupContext *ctx, const char *uri);
|
||||
int sip_setup_context_create_account(SipSetupContext *ctx, const char *uri, const char *passwd, const char *email, int suscribe);
|
||||
int sip_setup_context_get_capabilities(SipSetupContext *ctx);
|
||||
int sip_setup_context_login_account(SipSetupContext * ctx, const char *uri, const char *passwd, const char *userid);
|
||||
LINPHONE_PUBLIC int sip_setup_context_get_capabilities(SipSetupContext *ctx);
|
||||
LINPHONE_PUBLIC int sip_setup_context_login_account(SipSetupContext * ctx, const char *uri, const char *passwd, const char *userid);
|
||||
int sip_setup_context_get_proxy(SipSetupContext *ctx, const char *domain, char *proxy, size_t sz);
|
||||
int sip_setup_context_get_stun_servers(SipSetupContext *ctx, char *stun1, char *stun2, size_t size);
|
||||
int sip_setup_context_get_relay(SipSetupContext *ctx, char *relay, size_t size);
|
||||
|
||||
BuddyLookupRequest *sip_setup_context_create_buddy_lookup_request(SipSetupContext *ctx);
|
||||
int sip_setup_context_buddy_lookup_submit(SipSetupContext *ctx , BuddyLookupRequest *req);
|
||||
int sip_setup_context_buddy_lookup_free(SipSetupContext *ctx , BuddyLookupRequest *req);
|
||||
LINPHONE_PUBLIC BuddyLookupRequest *sip_setup_context_create_buddy_lookup_request(SipSetupContext *ctx);
|
||||
LINPHONE_PUBLIC int sip_setup_context_buddy_lookup_submit(SipSetupContext *ctx , BuddyLookupRequest *req);
|
||||
LINPHONE_PUBLIC int sip_setup_context_buddy_lookup_free(SipSetupContext *ctx , BuddyLookupRequest *req);
|
||||
|
||||
const char * sip_setup_context_get_notice(SipSetupContext *ctx);
|
||||
const char ** sip_setup_context_get_domains(SipSetupContext *ctx);
|
||||
|
||||
void sip_setup_context_free(SipSetupContext *ctx);
|
||||
|
||||
int sip_setup_context_logout(SipSetupContext *ctx);
|
||||
LINPHONE_PUBLIC int sip_setup_context_logout(SipSetupContext *ctx);
|
||||
|
||||
/*internal methods for use WITHIN plugins: do not use elsewhere*/
|
||||
struct _LinphoneProxyConfig *sip_setup_context_get_proxy_config(const SipSetupContext *ctx);
|
||||
|
|
|
|||
|
|
@ -255,8 +255,6 @@ SipSetup linphone_sip_wizard={
|
|||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
sip_wizard_get_domains,
|
||||
NULL,
|
||||
NULL,
|
||||
|
|
|
|||
266
coreapi/vtables.c
Normal file
266
coreapi/vtables.c
Normal file
|
|
@ -0,0 +1,266 @@
|
|||
/*
|
||||
linphone
|
||||
Copyright (C) 2000 Simon MORLAT (simon.morlat@linphone.org)
|
||||
Copyright (C) 2010 Belledonne Communications SARL
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "private.h"
|
||||
|
||||
|
||||
LinphoneCoreVTable *linphone_core_v_table_new() {
|
||||
return ms_new0(LinphoneCoreVTable,1);
|
||||
}
|
||||
|
||||
void linphone_core_v_table_set_user_data(LinphoneCoreVTable *table, void *data) {
|
||||
table->user_data = data;
|
||||
}
|
||||
|
||||
void* linphone_core_v_table_get_user_data(LinphoneCoreVTable *table) {
|
||||
return table->user_data;
|
||||
}
|
||||
|
||||
void linphone_core_v_table_destroy(LinphoneCoreVTable* table) {
|
||||
ms_free(table);
|
||||
}
|
||||
|
||||
LinphoneCoreVTable *linphone_core_get_current_vtable(LinphoneCore *lc) {
|
||||
return lc->current_vtable;
|
||||
}
|
||||
|
||||
static void cleanup_dead_vtable_refs(LinphoneCore *lc){
|
||||
MSList *it,*next_it;
|
||||
for(it=lc->vtable_refs; it!=NULL; ){
|
||||
VTableReference *ref=(VTableReference*)it->data;
|
||||
next_it=it->next;
|
||||
if (ref->valid==0){
|
||||
ref->valid=0;
|
||||
lc->vtable_refs=ms_list_remove_link(lc->vtable_refs, it);
|
||||
ms_free(ref);
|
||||
}
|
||||
it=next_it;
|
||||
}
|
||||
}
|
||||
|
||||
#define NOTIFY_IF_EXIST(function_name) \
|
||||
MSList* iterator; \
|
||||
VTableReference *ref; \
|
||||
ms_message("Linphone core [%p] notifying [%s]",lc,#function_name);\
|
||||
for (iterator=lc->vtable_refs; iterator!=NULL; iterator=iterator->next) \
|
||||
if ((ref=(VTableReference*)iterator->data)->valid && (lc->current_vtable=ref->vtable)->function_name)\
|
||||
lc->current_vtable->function_name
|
||||
|
||||
void linphone_core_notify_global_state_changed(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message) {
|
||||
NOTIFY_IF_EXIST(global_state_changed)(lc,gstate,message);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *message){
|
||||
NOTIFY_IF_EXIST(call_state_changed)(lc,call,cstate,message);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_call_encryption_changed(LinphoneCore *lc, LinphoneCall *call, bool_t on, const char *authentication_token) {
|
||||
NOTIFY_IF_EXIST(call_encryption_changed)(lc,call,on,authentication_token);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_registration_state_changed(LinphoneCore *lc, LinphoneProxyConfig *cfg, LinphoneRegistrationState cstate, const char *message){
|
||||
NOTIFY_IF_EXIST(registration_state_changed)(lc,cfg,cstate,message);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_show_interface(LinphoneCore *lc){
|
||||
NOTIFY_IF_EXIST(show)(lc);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_display_status(LinphoneCore *lc, const char *message) {
|
||||
NOTIFY_IF_EXIST(display_status)(lc,message);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_display_message(LinphoneCore *lc, const char *message){
|
||||
NOTIFY_IF_EXIST(display_message)(lc,message);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_display_warning(LinphoneCore *lc, const char *message){
|
||||
NOTIFY_IF_EXIST(display_warning)(lc,message);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_display_url(LinphoneCore *lc, const char *message, const char *url){
|
||||
NOTIFY_IF_EXIST(display_url)(lc,message,url);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_notify_presence_received(LinphoneCore *lc, LinphoneFriend * lf){
|
||||
NOTIFY_IF_EXIST(notify_presence_received)(lc,lf);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_new_subscription_requested(LinphoneCore *lc, LinphoneFriend *lf, const char *url){
|
||||
NOTIFY_IF_EXIST(new_subscription_requested)(lc,lf,url);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_auth_info_requested(LinphoneCore *lc, const char *realm, const char *username, const char *domain){
|
||||
NOTIFY_IF_EXIST(auth_info_requested)(lc,realm,username,domain);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_call_log_updated(LinphoneCore *lc, LinphoneCallLog *newcl){
|
||||
NOTIFY_IF_EXIST(call_log_updated)(lc,newcl);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_text_message_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message){
|
||||
NOTIFY_IF_EXIST(text_received)(lc,room,from,message);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *message){
|
||||
NOTIFY_IF_EXIST(message_received)(lc,room,message);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_file_transfer_recv(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, const char* buff, size_t size) {
|
||||
NOTIFY_IF_EXIST(file_transfer_recv)(lc,message,content,buff,size);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_file_transfer_send(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, char* buff, size_t* size) {
|
||||
NOTIFY_IF_EXIST(file_transfer_send)(lc,message,content,buff,size);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_file_transfer_progress_indication(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, size_t offset, size_t total) {
|
||||
NOTIFY_IF_EXIST(file_transfer_progress_indication)(lc,message,content,offset,total);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room) {
|
||||
NOTIFY_IF_EXIST(is_composing_received)(lc,room);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_dtmf_received(LinphoneCore* lc, LinphoneCall *call, int dtmf) {
|
||||
NOTIFY_IF_EXIST(dtmf_received)(lc,call,dtmf);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
bool_t linphone_core_dtmf_received_has_listener(const LinphoneCore* lc) {
|
||||
MSList* iterator;
|
||||
for (iterator=lc->vtable_refs; iterator!=NULL; iterator=iterator->next){
|
||||
VTableReference *ref=(VTableReference*)iterator->data;
|
||||
if (ref->valid && ref->vtable->dtmf_received)
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void linphone_core_notify_refer_received(LinphoneCore *lc, const char *refer_to) {
|
||||
NOTIFY_IF_EXIST(refer_received)(lc,refer_to);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf) {
|
||||
NOTIFY_IF_EXIST(buddy_info_updated)(lc,lf);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_transfer_state_changed(LinphoneCore *lc, LinphoneCall *transfered, LinphoneCallState new_call_state) {
|
||||
NOTIFY_IF_EXIST(transfer_state_changed)(lc,transfered,new_call_state);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_call_stats_updated(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallStats *stats) {
|
||||
NOTIFY_IF_EXIST(call_stats_updated)(lc,call,stats);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_info_received(LinphoneCore *lc, LinphoneCall *call, const LinphoneInfoMessage *msg) {
|
||||
NOTIFY_IF_EXIST(info_received)(lc,call,msg);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_configuring_status(LinphoneCore *lc, LinphoneConfiguringState status, const char *message) {
|
||||
NOTIFY_IF_EXIST(configuring_status)(lc,status,message);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_network_reachable(LinphoneCore *lc, bool_t reachable) {
|
||||
NOTIFY_IF_EXIST(network_reachable)(lc,reachable);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_notify_received(LinphoneCore *lc, LinphoneEvent *lev, const char *notified_event, const LinphoneContent *body) {
|
||||
NOTIFY_IF_EXIST(notify_received)(lc,lev,notified_event,body);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_subscription_state_changed(LinphoneCore *lc, LinphoneEvent *lev, LinphoneSubscriptionState state) {
|
||||
NOTIFY_IF_EXIST(subscription_state_changed)(lc,lev,state);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_publish_state_changed(LinphoneCore *lc, LinphoneEvent *lev, LinphonePublishState state) {
|
||||
NOTIFY_IF_EXIST(publish_state_changed)(lc,lev,state);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_log_collection_upload_state_changed(LinphoneCore *lc, LinphoneCoreLogCollectionUploadState state, const char *info) {
|
||||
NOTIFY_IF_EXIST(log_collection_upload_state_changed)(lc, state, info);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
void linphone_core_notify_log_collection_upload_progress_indication(LinphoneCore *lc, size_t offset, size_t total) {
|
||||
NOTIFY_IF_EXIST(log_collection_upload_progress_indication)(lc, offset, total);
|
||||
cleanup_dead_vtable_refs(lc);
|
||||
}
|
||||
|
||||
static VTableReference * v_table_reference_new(LinphoneCoreVTable *vtable, bool_t autorelease){
|
||||
VTableReference *ref=ms_new0(VTableReference,1);
|
||||
ref->valid=1;
|
||||
ref->autorelease=autorelease;
|
||||
ref->vtable=vtable;
|
||||
return ref;
|
||||
}
|
||||
|
||||
void v_table_reference_destroy(VTableReference *ref){
|
||||
if (ref->autorelease) linphone_core_v_table_destroy(ref->vtable);
|
||||
ms_free(ref);
|
||||
}
|
||||
|
||||
void _linphone_core_add_listener(LinphoneCore *lc, LinphoneCoreVTable *vtable, bool_t autorelease) {
|
||||
ms_message("Vtable [%p] registered on core [%p]",lc,vtable);
|
||||
lc->vtable_refs=ms_list_append(lc->vtable_refs,v_table_reference_new(vtable, autorelease));
|
||||
}
|
||||
|
||||
void linphone_core_add_listener(LinphoneCore *lc, LinphoneCoreVTable *vtable){
|
||||
_linphone_core_add_listener(lc, vtable, FALSE);
|
||||
}
|
||||
|
||||
void linphone_core_remove_listener(LinphoneCore *lc, const LinphoneCoreVTable *vtable) {
|
||||
MSList *it;
|
||||
ms_message("Vtable [%p] unregistered on core [%p]",lc,vtable);
|
||||
for(it=lc->vtable_refs; it!=NULL; it=it->next){
|
||||
VTableReference *ref=(VTableReference*)it->data;
|
||||
if (ref->vtable==vtable)
|
||||
ref->valid=0;
|
||||
}
|
||||
}
|
||||
|
|
@ -20,7 +20,11 @@
|
|||
#
|
||||
############################################################################
|
||||
|
||||
if(WIN32)
|
||||
set(GTK2_ADDITIONAL_SUFFIXES "../lib/glib-2.0/include" "../lib/gtk-2.0/include")
|
||||
endif()
|
||||
find_package(GTK2 2.18 REQUIRED gtk)
|
||||
find_package(Intl REQUIRED)
|
||||
|
||||
set(UI_FILES
|
||||
about.ui
|
||||
|
|
@ -44,6 +48,7 @@ set(UI_FILES
|
|||
)
|
||||
|
||||
set(PIXMAPS stock_people.png)
|
||||
set(LICENSE ../COPYING)
|
||||
|
||||
set(SOURCE_FILES
|
||||
audio_assistant.c
|
||||
|
|
@ -64,6 +69,9 @@ set(SOURCE_FILES
|
|||
utils.c
|
||||
videowindow.c
|
||||
)
|
||||
if(WIN32)
|
||||
list(APPEND SOURCE_FILES linphone.rc)
|
||||
endif()
|
||||
|
||||
if(ENABLE_ASSISTANT)
|
||||
list(APPEND SOURCE_FILES setupwizard.c)
|
||||
|
|
@ -73,10 +81,20 @@ if(GETTEXT_FOUND)
|
|||
add_definitions("-DENABLE_NLS")
|
||||
endif()
|
||||
|
||||
add_executable(linphone-gtk ${SOURCE_FILES})
|
||||
set_target_properties(linphone-gtk PROPERTIES OUTPUT_NAME linphone)
|
||||
target_include_directories(linphone-gtk PUBLIC ${GTK2_INCLUDE_DIRS})
|
||||
if(WIN32)
|
||||
add_executable(linphone-gtk WIN32 ${SOURCE_FILES})
|
||||
else()
|
||||
add_executable(linphone-gtk ${SOURCE_FILES})
|
||||
endif()
|
||||
set_target_properties(linphone-gtk PROPERTIES OUTPUT_NAME linphone LINKER_LANGUAGE CXX)
|
||||
target_include_directories(linphone-gtk PUBLIC ${GTK2_INCLUDE_DIRS} ${INTL_INCLUDE_DIRS})
|
||||
target_link_libraries(linphone-gtk linphone ${GTK2_LIBRARIES})
|
||||
if(INTL_LIBRARIES)
|
||||
target_link_libraries(linphone-gtk ${INTL_LIBRARIES})
|
||||
endif()
|
||||
if(WIN32)
|
||||
target_link_libraries(linphone-gtk Wininet)
|
||||
endif()
|
||||
if(ENABLE_NOTIFY)
|
||||
target_include_directories(linphone-gtk PUBLIC ${NOTIFY_INCLUDE_DIRS})
|
||||
target_link_libraries(linphone-gtk ${NOTIFY_LIBRARIES})
|
||||
|
|
@ -92,7 +110,7 @@ install(TARGETS linphone-gtk
|
|||
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
|
||||
)
|
||||
|
||||
install(FILES ${UI_FILES} ${PIXMAPS}
|
||||
install(FILES ${UI_FILES} ${PIXMAPS} ${LICENSE}
|
||||
DESTINATION ${PACKAGE_DATA_DIR}/linphone
|
||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
||||
)
|
||||
|
|
|
|||
|
|
@ -23,6 +23,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#include <gtkosxapplication.h>
|
||||
#endif
|
||||
|
||||
#if defined(WIN32) && !defined(F_OK)
|
||||
#define F_OK 00 /*visual studio does not define F_OK*/
|
||||
#endif
|
||||
|
||||
#define NB_MSG_HIST 250
|
||||
|
||||
#define CONFIG_FILE ".linphone-history.db"
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@ static void linphone_gtk_set_selection_to_uri_bar(GtkTreeView *treeview){
|
|||
}
|
||||
}
|
||||
|
||||
void linphone_gtk_add_contact(){
|
||||
void linphone_gtk_add_contact(void){
|
||||
GtkWidget *w=linphone_gtk_create_window("contact");
|
||||
int presence_enabled=linphone_gtk_get_ui_config_int("use_subscribe_notify",1);
|
||||
|
||||
|
|
|
|||
|
|
@ -499,7 +499,7 @@ static void display_peer_name_in_label(GtkWidget *label, const LinphoneAddress *
|
|||
uri_label=g_markup_printf_escaped("<span size=\"large\"><i>%s</i></span>\n",id);
|
||||
gtk_label_set_markup(GTK_LABEL(label),uri_label);
|
||||
g_free(uri_label);
|
||||
g_free(id);
|
||||
ms_free(id);
|
||||
}
|
||||
|
||||
void linphone_gtk_in_call_view_set_calling(LinphoneCall *call){
|
||||
|
|
|
|||
319
gtk/linphone.h
319
gtk/linphone.h
|
|
@ -83,121 +83,236 @@ GtkWidget*create_pixmap(const gchar *filename);
|
|||
GtkWidget *_gtk_image_new_from_memory_at_scale(const void *data, gint len, gint w, gint h, gboolean preserve_ratio);
|
||||
GdkPixbuf *_gdk_pixbuf_new_from_memory_at_scale(const void *data, gint len, gint w, gint h, gboolean preserve_ratio);
|
||||
|
||||
void linphone_gtk_destroy_window(GtkWidget *window);
|
||||
GtkWidget *linphone_gtk_create_window(const char *window_name);
|
||||
GtkWidget *linphone_gtk_get_widget(GtkWidget *window, const char *name);
|
||||
GtkWidget *linphone_gtk_create_widget(const char *filename, const char *widget_name);
|
||||
LINPHONE_PUBLIC void linphone_gtk_destroy_window(GtkWidget *window);
|
||||
LINPHONE_PUBLIC GtkWidget *linphone_gtk_create_window(const char *window_name);
|
||||
LINPHONE_PUBLIC GtkWidget *linphone_gtk_get_widget(GtkWidget *window, const char *name);
|
||||
LINPHONE_PUBLIC GtkWidget *linphone_gtk_create_widget(const char *filename, const char *widget_name);
|
||||
|
||||
const char *linphone_gtk_message_storage_get_db_file(const char *filename);
|
||||
void linphone_gtk_show_assistant(void);
|
||||
void linphone_gtk_close_assistant(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_show_assistant(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_close_assistant(void);
|
||||
|
||||
LinphoneCore *linphone_gtk_get_core(void);
|
||||
GtkWidget *linphone_gtk_get_main_window();
|
||||
void linphone_gtk_display_something(GtkMessageType type,const gchar *message);
|
||||
void linphone_gtk_start_call(GtkWidget *button);
|
||||
void linphone_gtk_call_terminated();
|
||||
void linphone_gtk_set_my_presence(LinphoneOnlineStatus ss);
|
||||
void linphone_gtk_show_parameters(void);
|
||||
void linphone_gtk_fill_soundcards(GtkWidget *pb);
|
||||
void linphone_gtk_fill_webcams(GtkWidget *pb);
|
||||
void linphone_gtk_load_identities(void);
|
||||
void linphone_gtk_call_log_update(GtkWidget *w);
|
||||
void linphone_gtk_create_log_window(void);
|
||||
void linphone_gtk_log_show(void);
|
||||
void linphone_gtk_show_main_window(void);
|
||||
void linphone_gtk_log_push(OrtpLogLevel lev, const char *fmt, va_list args);
|
||||
void linphone_gtk_destroy_log_window(void);
|
||||
void linphone_gtk_refer_received(LinphoneCore *lc, const char *refer_to);
|
||||
gboolean linphone_gtk_check_logs();
|
||||
const gchar *linphone_gtk_get_ui_config(const char *key, const char *def);
|
||||
int linphone_gtk_get_ui_config_int(const char *key, int def);
|
||||
void linphone_gtk_set_ui_config_int(const char *key , int val);
|
||||
void linphone_gtk_visibility_set(const char *hiddens, const char *window_name, GtkWidget *w, gboolean show);
|
||||
LINPHONE_PUBLIC LinphoneCore *linphone_gtk_get_core(void);
|
||||
LINPHONE_PUBLIC GtkWidget *linphone_gtk_get_main_window();
|
||||
LINPHONE_PUBLIC void linphone_gtk_display_something(GtkMessageType type, const gchar *message);
|
||||
LINPHONE_PUBLIC void linphone_gtk_start_call(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_call_terminated();
|
||||
LINPHONE_PUBLIC void linphone_gtk_set_my_presence(LinphoneOnlineStatus ss);
|
||||
LINPHONE_PUBLIC void linphone_gtk_show_parameters(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_fill_soundcards(GtkWidget *pb);
|
||||
LINPHONE_PUBLIC void linphone_gtk_fill_webcams(GtkWidget *pb);
|
||||
LINPHONE_PUBLIC void linphone_gtk_load_identities(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_call_log_update(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_create_log_window(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_log_show(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_show_main_window(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_log_push(OrtpLogLevel lev, const char *fmt, va_list args);
|
||||
LINPHONE_PUBLIC void linphone_gtk_destroy_log_window(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_refer_received(LinphoneCore *lc, const char *refer_to);
|
||||
LINPHONE_PUBLIC gboolean linphone_gtk_check_logs();
|
||||
LINPHONE_PUBLIC const gchar *linphone_gtk_get_ui_config(const char *key, const char *def);
|
||||
LINPHONE_PUBLIC int linphone_gtk_get_ui_config_int(const char *key, int def);
|
||||
LINPHONE_PUBLIC void linphone_gtk_set_ui_config_int(const char *key, int val);
|
||||
LINPHONE_PUBLIC void linphone_gtk_visibility_set(const char *hiddens, const char *window_name, GtkWidget *w, gboolean show);
|
||||
|
||||
LinphoneLDAPContactProvider* linphone_gtk_get_ldap(void);
|
||||
void linphone_gtk_set_ldap(LinphoneLDAPContactProvider* ldap);
|
||||
int linphone_gtk_is_ldap_supported(void);
|
||||
LINPHONE_PUBLIC LinphoneLDAPContactProvider* linphone_gtk_get_ldap(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_set_ldap(LinphoneLDAPContactProvider* ldap);
|
||||
LINPHONE_PUBLIC int linphone_gtk_is_ldap_supported(void);
|
||||
|
||||
void linphone_gtk_open_browser(const char *url);
|
||||
void linphone_gtk_check_for_new_version(void);
|
||||
const char *linphone_gtk_get_lang(const char *config_file);
|
||||
void linphone_gtk_set_lang(const char *code);
|
||||
SipSetupContext* linphone_gtk_get_default_sip_setup_context(void);
|
||||
GtkWidget * linphone_gtk_show_buddy_lookup_window(SipSetupContext *ctx);
|
||||
void linphone_gtk_buddy_lookup_set_keyword(GtkWidget *w, const char *kw);
|
||||
void * linphone_gtk_wait(LinphoneCore *lc, void *ctx, LinphoneWaitingState ws, const char *purpose, float progress);
|
||||
void linphone_gtk_terminate_call(GtkWidget *button);
|
||||
void linphone_gtk_call_update_tab_header(LinphoneCall *call,gboolean pause);
|
||||
void linphone_gtk_show_directory_search(void);
|
||||
void linphone_gtk_status_icon_set_blinking(gboolean val);
|
||||
void linphone_gtk_notify(LinphoneCall *call, const char *msg);
|
||||
LINPHONE_PUBLIC void linphone_gtk_open_browser(const char *url);
|
||||
LINPHONE_PUBLIC void linphone_gtk_check_for_new_version(void);
|
||||
LINPHONE_PUBLIC const char *linphone_gtk_get_lang(const char *config_file);
|
||||
LINPHONE_PUBLIC void linphone_gtk_set_lang(const char *code);
|
||||
LINPHONE_PUBLIC SipSetupContext* linphone_gtk_get_default_sip_setup_context(void);
|
||||
LINPHONE_PUBLIC GtkWidget * linphone_gtk_show_buddy_lookup_window(SipSetupContext *ctx);
|
||||
LINPHONE_PUBLIC void linphone_gtk_buddy_lookup_set_keyword(GtkWidget *w, const char *kw);
|
||||
LINPHONE_PUBLIC void * linphone_gtk_wait(LinphoneCore *lc, void *ctx, LinphoneWaitingState ws, const char *purpose, float progress);
|
||||
LINPHONE_PUBLIC void linphone_gtk_terminate_call(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_call_update_tab_header(LinphoneCall *call, gboolean pause);
|
||||
LINPHONE_PUBLIC void linphone_gtk_show_directory_search(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_status_icon_set_blinking(gboolean val);
|
||||
LINPHONE_PUBLIC void linphone_gtk_notify(LinphoneCall *call, const char *msg);
|
||||
|
||||
void linphone_gtk_load_chatroom(LinphoneChatRoom *cr,const LinphoneAddress *uri,GtkWidget *chat_view);
|
||||
void linphone_gtk_send_text();
|
||||
GtkWidget * linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddress *with);
|
||||
LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with);
|
||||
void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg);
|
||||
void linphone_gtk_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room);
|
||||
LINPHONE_PUBLIC void linphone_gtk_load_chatroom(LinphoneChatRoom *cr, const LinphoneAddress *uri, GtkWidget *chat_view);
|
||||
LINPHONE_PUBLIC void linphone_gtk_send_text();
|
||||
LINPHONE_PUBLIC GtkWidget * linphone_gtk_init_chatroom(LinphoneChatRoom *cr, const LinphoneAddress *with);
|
||||
LINPHONE_PUBLIC LinphoneChatRoom * linphone_gtk_create_chatroom(const LinphoneAddress *with);
|
||||
LINPHONE_PUBLIC void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *msg);
|
||||
LINPHONE_PUBLIC void linphone_gtk_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room);
|
||||
|
||||
void linphone_gtk_friend_list_update_chat_picture();
|
||||
void linphone_gtk_friend_list_set_chat_conversation(const LinphoneAddress *la);
|
||||
gboolean linphone_gtk_friend_list_is_contact(const LinphoneAddress *addr);
|
||||
void linphone_gtk_friend_list_set_active_address(const LinphoneAddress *addr);
|
||||
const LinphoneAddress *linphone_gtk_friend_list_get_active_address(void);
|
||||
void linphone_gtk_notebook_tab_select(GtkNotebook *notebook,GtkWidget *page,guint page_num, gpointer data);
|
||||
void linphone_gtk_show_friends(void);
|
||||
void linphone_gtk_show_contact(LinphoneFriend *lf);
|
||||
void linphone_gtk_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf);
|
||||
LINPHONE_PUBLIC void linphone_gtk_friend_list_update_chat_picture();
|
||||
LINPHONE_PUBLIC void linphone_gtk_friend_list_set_chat_conversation(const LinphoneAddress *la);
|
||||
LINPHONE_PUBLIC gboolean linphone_gtk_friend_list_is_contact(const LinphoneAddress *addr);
|
||||
LINPHONE_PUBLIC void linphone_gtk_friend_list_set_active_address(const LinphoneAddress *addr);
|
||||
LINPHONE_PUBLIC const LinphoneAddress *linphone_gtk_friend_list_get_active_address(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_notebook_tab_select(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data);
|
||||
LINPHONE_PUBLIC void linphone_gtk_show_friends(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_show_contact(LinphoneFriend *lf);
|
||||
LINPHONE_PUBLIC void linphone_gtk_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf);
|
||||
|
||||
/*functions controlling the different views*/
|
||||
gboolean linphone_gtk_use_in_call_view();
|
||||
LinphoneCall *linphone_gtk_get_currently_displayed_call(gboolean *is_conf);
|
||||
void linphone_gtk_create_in_call_view(LinphoneCall *call);
|
||||
void linphone_gtk_in_call_view_set_calling(LinphoneCall *call);
|
||||
void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call);
|
||||
void linphone_gtk_in_call_view_update_duration(LinphoneCall *call);
|
||||
void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_msg);
|
||||
void linphone_gtk_in_call_view_set_incoming(LinphoneCall *call);
|
||||
void linphone_gtk_in_call_view_set_paused(LinphoneCall *call);
|
||||
void linphone_gtk_in_call_view_set_transfer_status(LinphoneCall *call,LinphoneCallState cstate);
|
||||
void linphone_gtk_mute_clicked(GtkButton *button);
|
||||
void transfer_button_clicked(GtkWidget *button, gpointer call_ref);
|
||||
void linphone_gtk_enable_mute_button(GtkButton *button, gboolean sensitive);
|
||||
void linphone_gtk_enable_hold_button(LinphoneCall *call, gboolean sensitive, gboolean holdon);
|
||||
void linphone_gtk_enable_transfer_button(LinphoneCore *lc, gboolean value);
|
||||
void linphone_gtk_enable_conference_button(LinphoneCore *lc, gboolean value);
|
||||
void linphone_gtk_set_in_conference(LinphoneCall *call);
|
||||
void linphone_gtk_unset_from_conference(LinphoneCall *call);
|
||||
void linphone_gtk_terminate_conference_participant(LinphoneCall *call);
|
||||
void linphone_gtk_in_call_view_show_encryption(LinphoneCall *call);
|
||||
void linphone_gtk_update_video_button(LinphoneCall *call);
|
||||
void linphone_gtk_init_audio_meter(GtkWidget *w, get_volume_t get_volume, void *data);
|
||||
void linphone_gtk_uninit_audio_meter(GtkWidget *w);
|
||||
LINPHONE_PUBLIC gboolean linphone_gtk_use_in_call_view();
|
||||
LINPHONE_PUBLIC LinphoneCall *linphone_gtk_get_currently_displayed_call(gboolean *is_conf);
|
||||
LINPHONE_PUBLIC void linphone_gtk_create_in_call_view(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_in_call_view_set_calling(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_in_call_view_set_in_call(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_in_call_view_update_duration(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_in_call_view_terminate(LinphoneCall *call, const char *error_msg);
|
||||
LINPHONE_PUBLIC void linphone_gtk_in_call_view_set_incoming(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_in_call_view_set_paused(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_in_call_view_set_transfer_status(LinphoneCall *call, LinphoneCallState cstate);
|
||||
LINPHONE_PUBLIC void linphone_gtk_mute_clicked(GtkButton *button);
|
||||
LINPHONE_PUBLIC void transfer_button_clicked(GtkWidget *button, gpointer call_ref);
|
||||
LINPHONE_PUBLIC void linphone_gtk_enable_mute_button(GtkButton *button, gboolean sensitive);
|
||||
LINPHONE_PUBLIC void linphone_gtk_enable_hold_button(LinphoneCall *call, gboolean sensitive, gboolean holdon);
|
||||
LINPHONE_PUBLIC void linphone_gtk_enable_transfer_button(LinphoneCore *lc, gboolean value);
|
||||
LINPHONE_PUBLIC void linphone_gtk_enable_conference_button(LinphoneCore *lc, gboolean value);
|
||||
LINPHONE_PUBLIC void linphone_gtk_set_in_conference(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_unset_from_conference(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_terminate_conference_participant(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_in_call_view_show_encryption(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_update_video_button(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_init_audio_meter(GtkWidget *w, get_volume_t get_volume, void *data);
|
||||
LINPHONE_PUBLIC void linphone_gtk_uninit_audio_meter(GtkWidget *w);
|
||||
|
||||
void linphone_gtk_show_login_frame(LinphoneProxyConfig *cfg, gboolean disable_auto_login);
|
||||
void linphone_gtk_exit_login_frame(void);
|
||||
void linphone_gtk_set_ui_config(const char *key, const char *value);
|
||||
LINPHONE_PUBLIC void linphone_gtk_show_login_frame(LinphoneProxyConfig *cfg, gboolean disable_auto_login);
|
||||
LINPHONE_PUBLIC void linphone_gtk_exit_login_frame(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_set_ui_config(const char *key, const char *value);
|
||||
|
||||
void linphone_gtk_log_uninit();
|
||||
LINPHONE_PUBLIC void linphone_gtk_log_uninit();
|
||||
|
||||
bool_t linphone_gtk_init_instance(const char *app_name, int option, const char *addr_to_call);
|
||||
void linphone_gtk_uninit_instance(void);
|
||||
void linphone_gtk_monitor_usb(void);
|
||||
void linphone_gtk_unmonitor_usb(void);
|
||||
LINPHONE_PUBLIC bool_t linphone_gtk_init_instance(const char *app_name, int option, const char *addr_to_call);
|
||||
LINPHONE_PUBLIC void linphone_gtk_uninit_instance(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_monitor_usb(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_unmonitor_usb(void);
|
||||
|
||||
void linphone_gtk_fill_combo_box(GtkWidget *combo, const char **devices, const char *selected, DeviceCap cap);
|
||||
gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference);
|
||||
void linphone_gtk_schedule_restart(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_fill_combo_box(GtkWidget *combo, const char **devices, const char *selected, DeviceCap cap);
|
||||
LINPHONE_PUBLIC gchar *linphone_gtk_get_record_path(const LinphoneAddress *address, gboolean is_conference);
|
||||
LINPHONE_PUBLIC void linphone_gtk_schedule_restart(void);
|
||||
|
||||
void linphone_gtk_show_audio_assistant(void);
|
||||
gboolean linphone_gtk_get_audio_assistant_option(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_show_audio_assistant(void);
|
||||
LINPHONE_PUBLIC gboolean linphone_gtk_get_audio_assistant_option(void);
|
||||
|
||||
void linphone_gtk_set_configuration_uri(void);
|
||||
GtkWidget * linphone_gtk_show_config_fetching(void);
|
||||
void linphone_gtk_close_config_fetching(GtkWidget *w, LinphoneConfiguringState state);
|
||||
const char *linphone_gtk_get_sound_path(const char *file);
|
||||
void linphone_gtk_in_call_show_video(LinphoneCall *call);
|
||||
char *linphone_gtk_address(const LinphoneAddress *addr);/*return human readable identifier for a LinphoneAddress */
|
||||
GtkWidget *linphone_gtk_get_camera_preview_window(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_set_configuration_uri(void);
|
||||
LINPHONE_PUBLIC GtkWidget * linphone_gtk_show_config_fetching(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_close_config_fetching(GtkWidget *w, LinphoneConfiguringState state);
|
||||
LINPHONE_PUBLIC const char *linphone_gtk_get_sound_path(const char *file);
|
||||
LINPHONE_PUBLIC void linphone_gtk_in_call_show_video(LinphoneCall *call);
|
||||
LINPHONE_PUBLIC char *linphone_gtk_address(const LinphoneAddress *addr);/*return human readable identifier for a LinphoneAddress */
|
||||
LINPHONE_PUBLIC GtkWidget *linphone_gtk_get_camera_preview_window(void);
|
||||
|
||||
LINPHONE_PUBLIC void linphone_gtk_login_frame_connect_clicked(GtkWidget *button);
|
||||
|
||||
LINPHONE_PUBLIC gboolean linphone_gtk_call_log_reset_missed_call(GtkWidget *w, GdkEvent *event, gpointer user_data);
|
||||
LINPHONE_PUBLIC void linphone_gtk_history_row_activated(GtkWidget *treeview);
|
||||
LINPHONE_PUBLIC void linphone_gtk_history_row_selected(GtkWidget *treeview);
|
||||
LINPHONE_PUBLIC void linphone_gtk_clear_call_logs(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_add_contact(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_contact_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data);
|
||||
LINPHONE_PUBLIC void linphone_gtk_contact_clicked(GtkTreeView *treeview);
|
||||
LINPHONE_PUBLIC void linphone_gtk_add_button_clicked(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_edit_button_clicked(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_remove_button_clicked(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_my_presence_clicked(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_directory_search_button_clicked(GtkWidget *button);
|
||||
LINPHONE_PUBLIC gboolean linphone_gtk_popup_contact_menu(GtkWidget *list, GdkEventButton *event);
|
||||
LINPHONE_PUBLIC gboolean linphone_gtk_contact_list_button_pressed(GtkWidget *widget, GdkEventButton *event);
|
||||
LINPHONE_PUBLIC void linphone_gtk_auth_token_verified_clicked(GtkButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_hold_clicked(GtkButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_record_call_toggled(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_log_hide(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_log_scroll_to_end(GtkToggleButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_log_clear(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_logout_clicked(void);
|
||||
|
||||
LINPHONE_PUBLIC void linphone_gtk_about_response(GtkDialog *dialog, gint id);
|
||||
LINPHONE_PUBLIC void linphone_gtk_show_about(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_start_call(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_uri_bar_activate(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_terminate_call(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_decline_clicked(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_answer_clicked(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_enable_video(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_enable_self_view(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_used_identity_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void on_proxy_refresh_button_clicked(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_link_to_website(GtkWidget *item);
|
||||
LINPHONE_PUBLIC void linphone_gtk_options_activate(GtkWidget *item);
|
||||
LINPHONE_PUBLIC void linphone_gtk_create_keypad(GtkWidget *button);
|
||||
|
||||
LINPHONE_PUBLIC void linphone_gtk_keyword_changed(GtkEditable *e);
|
||||
LINPHONE_PUBLIC void linphone_gtk_buddy_lookup_contact_activated(GtkWidget *treeview);
|
||||
LINPHONE_PUBLIC void linphone_gtk_add_buddy_from_database(GtkWidget *button);
|
||||
LINPHONE_PUBLIC gboolean linphone_gtk_call_log_button_pressed(GtkWidget *widget, GdkEventButton *event);
|
||||
LINPHONE_PUBLIC void linphone_gtk_call_statistics_closed(GtkWidget *call_stats);
|
||||
LINPHONE_PUBLIC void linphone_gtk_config_uri_cancel(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_config_uri_changed(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_contact_cancel(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_contact_ok(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_dscp_edit(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_dscp_edit_response(GtkWidget *dialog, guint response_id);
|
||||
LINPHONE_PUBLIC void linphone_gtk_keypad_key_released(GtkWidget *w, GdkEvent *event, gpointer userdata);
|
||||
LINPHONE_PUBLIC void linphone_gtk_keypad_key_pressed(GtkWidget *w, GdkEvent *event, gpointer userdata);
|
||||
LINPHONE_PUBLIC void linphone_gtk_ldap_save(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_ldap_reset(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_parameters_destroyed(GtkWidget *pb);
|
||||
LINPHONE_PUBLIC void linphone_gtk_mtu_set(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_mtu_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_use_sip_info_dtmf_toggled(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_ipv6_toggled(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_disabled_udp_port_toggle(GtkCheckButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_random_udp_port_toggle(GtkCheckButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_udp_port_value_changed(GtkSpinButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_disabled_tcp_port_toggle(GtkCheckButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_random_tcp_port_toggle(GtkCheckButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_tcp_port_value_changed(GtkSpinButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_min_audio_port_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_max_audio_port_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_fixed_audio_port_toggle(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_min_video_port_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_max_video_port_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_fixed_video_port_toggle(void);
|
||||
LINPHONE_PUBLIC void linphone_gtk_set_media_encryption_mandatory(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_edit_tunnel(GtkButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_no_firewall_toggled(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_use_nat_address_toggled(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_use_stun_toggled(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_use_ice_toggled(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_use_upnp_toggled(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_nat_address_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_stun_server_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_ring_file_set(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_play_ring_file(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_alsa_special_device_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_capture_device_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_ring_device_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_playback_device_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_echo_cancelation_toggled(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_cam_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_video_size_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_video_renderer_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_show_camera_preview_clicked(GtkButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_update_my_contact(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_add_proxy(GtkButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_edit_proxy(GtkButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_remove_proxy(GtkButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_clear_passwords(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_codec_view_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_codec_up(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_codec_down(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_codec_enable(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_codec_disable(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_upload_bw_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_download_bw_changed(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_adaptive_rate_control_toggled(GtkToggleButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_lang_changed(GtkComboBox *combo);
|
||||
LINPHONE_PUBLIC void linphone_gtk_ui_level_toggled(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_show_ldap_config(GtkWidget* button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_parameters_closed(GtkWidget *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_password_ok(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_password_cancel(GtkWidget *w);
|
||||
LINPHONE_PUBLIC void linphone_gtk_proxy_ok(GtkButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_proxy_cancel(GtkButton *button);
|
||||
LINPHONE_PUBLIC void linphone_gtk_proxy_address_changed(GtkEditable *editable);
|
||||
LINPHONE_PUBLIC void linphone_gtk_proxy_transport_changed(GtkWidget *combo);
|
||||
LINPHONE_PUBLIC void linphone_gtk_tunnel_ok(GtkButton *button);
|
||||
|
|
|
|||
|
|
@ -202,7 +202,7 @@ static void linphone_gtk_log_file(OrtpLogLevel lev, const char *msg)
|
|||
}
|
||||
}
|
||||
|
||||
void linphone_gtk_log_hide(){
|
||||
void linphone_gtk_log_hide(void){
|
||||
if (log_window)
|
||||
gtk_widget_hide(log_window);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
#include "linphone.h"
|
||||
|
||||
void linphone_gtk_login_frame_connect_clicked(GtkWidget *button);
|
||||
void test_button_clicked_cb(GtkWidget *button);
|
||||
void linphone_gtk_exit_login_frame(void);
|
||||
|
||||
|
|
@ -122,7 +121,7 @@ void linphone_gtk_exit_login_frame(void){
|
|||
gtk_widget_show(linphone_gtk_get_widget(mw,"disconnect_item"));
|
||||
}
|
||||
|
||||
void linphone_gtk_logout_clicked(){
|
||||
void linphone_gtk_logout_clicked(void){
|
||||
LinphoneCore *lc=linphone_gtk_get_core();
|
||||
LinphoneProxyConfig *cfg=NULL;
|
||||
linphone_core_get_default_proxy(lc,&cfg);
|
||||
|
|
|
|||
127
gtk/main.c
127
gtk/main.c
|
|
@ -27,7 +27,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_GTK_OSX
|
||||
#include <gtkosxapplication.h>
|
||||
|
|
@ -36,6 +38,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#ifdef WIN32
|
||||
#define chdir _chdir
|
||||
#include "direct.h"
|
||||
#ifndef F_OK
|
||||
#define F_OK 00 /*visual studio does not define F_OK*/
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_NOTIFY1) || defined(HAVE_NOTIFY4)
|
||||
|
|
@ -102,77 +107,43 @@ static gchar *custom_config_file=NULL;
|
|||
static gboolean restart=FALSE;
|
||||
static GtkWidget *config_fetching_dialog=NULL;
|
||||
|
||||
#if _MSC_VER
|
||||
|
||||
#define LINPHONE_OPTION(optlname, optsname, optarg, optargdata, optdesc) \
|
||||
{ \
|
||||
optlname, \
|
||||
optsname, \
|
||||
0, \
|
||||
optarg, \
|
||||
optargdata, \
|
||||
optdesc, \
|
||||
NULL \
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define LINPHONE_OPTION(optlname, optsname, optarg, optargdata, optdesc) \
|
||||
{ \
|
||||
.long_name = optlname, \
|
||||
.short_name = optsname, \
|
||||
.arg = optarg, \
|
||||
.arg_data = optargdata, \
|
||||
.description = optdesc, \
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static GOptionEntry linphone_options[]={
|
||||
{
|
||||
.long_name="verbose",
|
||||
.short_name= '\0',
|
||||
.arg=G_OPTION_ARG_NONE,
|
||||
.arg_data= (gpointer)&verbose,
|
||||
.description=N_("log to stdout some debug information while running.")
|
||||
},
|
||||
{
|
||||
.long_name = "logfile",
|
||||
.short_name = 'l',
|
||||
.arg = G_OPTION_ARG_STRING,
|
||||
.arg_data = &linphone_logfile,
|
||||
.description = N_("path to a file to write logs into.")
|
||||
},
|
||||
{
|
||||
.long_name = "no-video",
|
||||
.short_name = '\0',
|
||||
.arg = G_OPTION_ARG_NONE,
|
||||
.arg_data = (gpointer)&no_video,
|
||||
.description = N_("Start linphone with video disabled.")
|
||||
},
|
||||
{
|
||||
.long_name="iconified",
|
||||
.short_name= '\0',
|
||||
.arg=G_OPTION_ARG_NONE,
|
||||
.arg_data= (gpointer)&iconified,
|
||||
.description=N_("Start only in the system tray, do not show the main interface.")
|
||||
},
|
||||
{
|
||||
.long_name = "call",
|
||||
.short_name = 'c',
|
||||
.arg = G_OPTION_ARG_STRING,
|
||||
.arg_data = &addr_to_call,
|
||||
.description = N_("address to call right now")
|
||||
},
|
||||
{
|
||||
.long_name = "auto-answer",
|
||||
.short_name = 'a',
|
||||
.arg = G_OPTION_ARG_NONE,
|
||||
.arg_data = (gpointer) & auto_answer,
|
||||
.description = N_("if set automatically answer incoming calls")
|
||||
},
|
||||
{
|
||||
.long_name = "workdir",
|
||||
.short_name = '\0',
|
||||
.arg = G_OPTION_ARG_STRING,
|
||||
.arg_data = (gpointer) & workingdir,
|
||||
.description = N_("Specifiy a working directory (should be the base of the installation, eg: c:\\Program Files\\Linphone)")
|
||||
},
|
||||
{
|
||||
.long_name = "config",
|
||||
.short_name = '\0',
|
||||
.arg = G_OPTION_ARG_FILENAME,
|
||||
.arg_data = (gpointer) &custom_config_file,
|
||||
.description = N_("Configuration file")
|
||||
},
|
||||
{
|
||||
.long_name = "run-audio-assistant",
|
||||
.short_name = '\0',
|
||||
.arg = G_OPTION_ARG_NONE,
|
||||
.arg_data = (gpointer) &run_audio_assistant,
|
||||
.description = N_("Run the audio assistant")
|
||||
},
|
||||
{
|
||||
.long_name = "selftest",
|
||||
.short_name = '\0',
|
||||
.arg = G_OPTION_ARG_NONE,
|
||||
.arg_data = (gpointer) &selftest,
|
||||
.description = N_("Run self test and exit 0 if succeed")
|
||||
},
|
||||
LINPHONE_OPTION("verbose", '\0', G_OPTION_ARG_NONE, (gpointer)&verbose, N_("log to stdout some debug information while running.")),
|
||||
LINPHONE_OPTION("logfile", 'l', G_OPTION_ARG_STRING, &linphone_logfile, N_("path to a file to write logs into.")),
|
||||
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")),
|
||||
LINPHONE_OPTION("selftest", '\0', G_OPTION_ARG_NONE, (gpointer) &selftest, N_("Run self test and exit 0 if succeed")),
|
||||
{0}
|
||||
};
|
||||
|
||||
|
|
@ -538,7 +509,7 @@ static void about_url_clicked(GtkAboutDialog *dialog, const char *url, gpointer
|
|||
linphone_gtk_open_browser(url);
|
||||
}
|
||||
|
||||
void linphone_gtk_show_about(){
|
||||
void linphone_gtk_show_about(void){
|
||||
struct stat filestat;
|
||||
const char *license_file=PACKAGE_DATA_DIR "/linphone/COPYING";
|
||||
GtkWidget *about;
|
||||
|
|
@ -557,7 +528,7 @@ void linphone_gtk_show_about(){
|
|||
if (filestat.st_size>0){
|
||||
char *license=g_malloc(filestat.st_size+1);
|
||||
FILE *f=fopen(license_file,"r");
|
||||
if (f && fread(license,filestat.st_size,1,f)==1){
|
||||
if (f && fread(license,1,filestat.st_size,f)>0){
|
||||
license[filestat.st_size]='\0';
|
||||
gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(about),license);
|
||||
}
|
||||
|
|
@ -2114,7 +2085,7 @@ int main(int argc, char *argv[]){
|
|||
progpath = strdup(argv[0]);
|
||||
|
||||
config_file=linphone_gtk_get_config_file(NULL);
|
||||
|
||||
|
||||
workingdir= (tmp=g_getenv("LINPHONE_WORKDIR")) ? g_strdup(tmp) : NULL;
|
||||
|
||||
#ifdef WIN32
|
||||
|
|
@ -2141,6 +2112,7 @@ int main(int argc, char *argv[]){
|
|||
}
|
||||
#elif __APPLE__
|
||||
setenv("LANG",lang,1);
|
||||
setenv("LANGUAGE",lang,1);
|
||||
#else
|
||||
setenv("LANGUAGE",lang,1);
|
||||
#endif
|
||||
|
|
@ -2166,7 +2138,7 @@ int main(int argc, char *argv[]){
|
|||
g_critical("%s", error->message);
|
||||
return -1;
|
||||
}
|
||||
if (config_file) free(config_file);
|
||||
if (config_file) g_free(config_file);
|
||||
if (custom_config_file && !g_path_is_absolute(custom_config_file)) {
|
||||
gchar *res = g_get_current_dir();
|
||||
res = g_strjoin(G_DIR_SEPARATOR_S, res, custom_config_file, NULL);
|
||||
|
|
@ -2257,7 +2229,7 @@ core_start:
|
|||
restart=FALSE;
|
||||
goto core_start;
|
||||
}
|
||||
if (config_file) free(config_file);
|
||||
if (config_file) g_free(config_file);
|
||||
#ifndef HAVE_GTK_OSX
|
||||
/*workaround a bug on win32 that makes status icon still present in the systray even after program exit.*/
|
||||
if (icon) gtk_status_icon_set_visible(icon,FALSE);
|
||||
|
|
@ -2266,3 +2238,8 @@ core_start:
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
||||
return main(__argc, __argv);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1741,7 +1741,7 @@ static int read_dscp(GtkWidget *entry){
|
|||
return -1;
|
||||
}
|
||||
|
||||
void linphone_gtk_dscp_edit(){
|
||||
void linphone_gtk_dscp_edit(void){
|
||||
LinphoneCore *lc=linphone_gtk_get_core();
|
||||
GtkWidget *widget=linphone_gtk_create_window("dscp_settings");
|
||||
show_dscp(linphone_gtk_get_widget(widget,"sip_dscp"),
|
||||
|
|
|
|||
|
|
@ -260,7 +260,7 @@ static GtkWidget *create_video_window(LinphoneCall *call){
|
|||
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;
|
||||
MSVideoSize vsize={MS_VIDEO_SIZE_CIF_W,MS_VIDEO_SIZE_CIF_H};
|
||||
GdkColor color;
|
||||
|
||||
addr=linphone_call_get_remote_address(call);
|
||||
|
|
|
|||
305
include/MSVC/inttypes.h
Normal file
305
include/MSVC/inttypes.h
Normal file
|
|
@ -0,0 +1,305 @@
|
|||
// ISO C9x compliant inttypes.h for Microsoft Visual Studio
|
||||
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
|
||||
//
|
||||
// Copyright (c) 2006 Alexander Chemeris
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
//
|
||||
// 3. The name of the author may be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _MSC_VER // [
|
||||
#error "Use this header only with Microsoft Visual C++ compilers!"
|
||||
#endif // _MSC_VER ]
|
||||
|
||||
#ifndef _MSC_INTTYPES_H_ // [
|
||||
#define _MSC_INTTYPES_H_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include "stdint.h"
|
||||
|
||||
// 7.8 Format conversion of integer types
|
||||
|
||||
typedef struct {
|
||||
intmax_t quot;
|
||||
intmax_t rem;
|
||||
} imaxdiv_t;
|
||||
|
||||
// 7.8.1 Macros for format specifiers
|
||||
|
||||
#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198
|
||||
|
||||
// The fprintf macros for signed integers are:
|
||||
#define PRId8 "d"
|
||||
#define PRIi8 "i"
|
||||
#define PRIdLEAST8 "d"
|
||||
#define PRIiLEAST8 "i"
|
||||
#define PRIdFAST8 "d"
|
||||
#define PRIiFAST8 "i"
|
||||
|
||||
#define PRId16 "hd"
|
||||
#define PRIi16 "hi"
|
||||
#define PRIdLEAST16 "hd"
|
||||
#define PRIiLEAST16 "hi"
|
||||
#define PRIdFAST16 "hd"
|
||||
#define PRIiFAST16 "hi"
|
||||
|
||||
#define PRId32 "I32d"
|
||||
#define PRIi32 "I32i"
|
||||
#define PRIdLEAST32 "I32d"
|
||||
#define PRIiLEAST32 "I32i"
|
||||
#define PRIdFAST32 "I32d"
|
||||
#define PRIiFAST32 "I32i"
|
||||
|
||||
#define PRId64 "I64d"
|
||||
#define PRIi64 "I64i"
|
||||
#define PRIdLEAST64 "I64d"
|
||||
#define PRIiLEAST64 "I64i"
|
||||
#define PRIdFAST64 "I64d"
|
||||
#define PRIiFAST64 "I64i"
|
||||
|
||||
#define PRIdMAX "I64d"
|
||||
#define PRIiMAX "I64i"
|
||||
|
||||
#define PRIdPTR "Id"
|
||||
#define PRIiPTR "Ii"
|
||||
|
||||
// The fprintf macros for unsigned integers are:
|
||||
#define PRIo8 "o"
|
||||
#define PRIu8 "u"
|
||||
#define PRIx8 "x"
|
||||
#define PRIX8 "X"
|
||||
#define PRIoLEAST8 "o"
|
||||
#define PRIuLEAST8 "u"
|
||||
#define PRIxLEAST8 "x"
|
||||
#define PRIXLEAST8 "X"
|
||||
#define PRIoFAST8 "o"
|
||||
#define PRIuFAST8 "u"
|
||||
#define PRIxFAST8 "x"
|
||||
#define PRIXFAST8 "X"
|
||||
|
||||
#define PRIo16 "ho"
|
||||
#define PRIu16 "hu"
|
||||
#define PRIx16 "hx"
|
||||
#define PRIX16 "hX"
|
||||
#define PRIoLEAST16 "ho"
|
||||
#define PRIuLEAST16 "hu"
|
||||
#define PRIxLEAST16 "hx"
|
||||
#define PRIXLEAST16 "hX"
|
||||
#define PRIoFAST16 "ho"
|
||||
#define PRIuFAST16 "hu"
|
||||
#define PRIxFAST16 "hx"
|
||||
#define PRIXFAST16 "hX"
|
||||
|
||||
#define PRIo32 "I32o"
|
||||
#define PRIu32 "I32u"
|
||||
#define PRIx32 "I32x"
|
||||
#define PRIX32 "I32X"
|
||||
#define PRIoLEAST32 "I32o"
|
||||
#define PRIuLEAST32 "I32u"
|
||||
#define PRIxLEAST32 "I32x"
|
||||
#define PRIXLEAST32 "I32X"
|
||||
#define PRIoFAST32 "I32o"
|
||||
#define PRIuFAST32 "I32u"
|
||||
#define PRIxFAST32 "I32x"
|
||||
#define PRIXFAST32 "I32X"
|
||||
|
||||
#define PRIo64 "I64o"
|
||||
#define PRIu64 "I64u"
|
||||
#define PRIx64 "I64x"
|
||||
#define PRIX64 "I64X"
|
||||
#define PRIoLEAST64 "I64o"
|
||||
#define PRIuLEAST64 "I64u"
|
||||
#define PRIxLEAST64 "I64x"
|
||||
#define PRIXLEAST64 "I64X"
|
||||
#define PRIoFAST64 "I64o"
|
||||
#define PRIuFAST64 "I64u"
|
||||
#define PRIxFAST64 "I64x"
|
||||
#define PRIXFAST64 "I64X"
|
||||
|
||||
#define PRIoMAX "I64o"
|
||||
#define PRIuMAX "I64u"
|
||||
#define PRIxMAX "I64x"
|
||||
#define PRIXMAX "I64X"
|
||||
|
||||
#define PRIoPTR "Io"
|
||||
#define PRIuPTR "Iu"
|
||||
#define PRIxPTR "Ix"
|
||||
#define PRIXPTR "IX"
|
||||
|
||||
// The fscanf macros for signed integers are:
|
||||
#define SCNd8 "d"
|
||||
#define SCNi8 "i"
|
||||
#define SCNdLEAST8 "d"
|
||||
#define SCNiLEAST8 "i"
|
||||
#define SCNdFAST8 "d"
|
||||
#define SCNiFAST8 "i"
|
||||
|
||||
#define SCNd16 "hd"
|
||||
#define SCNi16 "hi"
|
||||
#define SCNdLEAST16 "hd"
|
||||
#define SCNiLEAST16 "hi"
|
||||
#define SCNdFAST16 "hd"
|
||||
#define SCNiFAST16 "hi"
|
||||
|
||||
#define SCNd32 "ld"
|
||||
#define SCNi32 "li"
|
||||
#define SCNdLEAST32 "ld"
|
||||
#define SCNiLEAST32 "li"
|
||||
#define SCNdFAST32 "ld"
|
||||
#define SCNiFAST32 "li"
|
||||
|
||||
#define SCNd64 "I64d"
|
||||
#define SCNi64 "I64i"
|
||||
#define SCNdLEAST64 "I64d"
|
||||
#define SCNiLEAST64 "I64i"
|
||||
#define SCNdFAST64 "I64d"
|
||||
#define SCNiFAST64 "I64i"
|
||||
|
||||
#define SCNdMAX "I64d"
|
||||
#define SCNiMAX "I64i"
|
||||
|
||||
#ifdef _WIN64 // [
|
||||
# define SCNdPTR "I64d"
|
||||
# define SCNiPTR "I64i"
|
||||
#else // _WIN64 ][
|
||||
# define SCNdPTR "ld"
|
||||
# define SCNiPTR "li"
|
||||
#endif // _WIN64 ]
|
||||
|
||||
// The fscanf macros for unsigned integers are:
|
||||
#define SCNo8 "o"
|
||||
#define SCNu8 "u"
|
||||
#define SCNx8 "x"
|
||||
#define SCNX8 "X"
|
||||
#define SCNoLEAST8 "o"
|
||||
#define SCNuLEAST8 "u"
|
||||
#define SCNxLEAST8 "x"
|
||||
#define SCNXLEAST8 "X"
|
||||
#define SCNoFAST8 "o"
|
||||
#define SCNuFAST8 "u"
|
||||
#define SCNxFAST8 "x"
|
||||
#define SCNXFAST8 "X"
|
||||
|
||||
#define SCNo16 "ho"
|
||||
#define SCNu16 "hu"
|
||||
#define SCNx16 "hx"
|
||||
#define SCNX16 "hX"
|
||||
#define SCNoLEAST16 "ho"
|
||||
#define SCNuLEAST16 "hu"
|
||||
#define SCNxLEAST16 "hx"
|
||||
#define SCNXLEAST16 "hX"
|
||||
#define SCNoFAST16 "ho"
|
||||
#define SCNuFAST16 "hu"
|
||||
#define SCNxFAST16 "hx"
|
||||
#define SCNXFAST16 "hX"
|
||||
|
||||
#define SCNo32 "lo"
|
||||
#define SCNu32 "lu"
|
||||
#define SCNx32 "lx"
|
||||
#define SCNX32 "lX"
|
||||
#define SCNoLEAST32 "lo"
|
||||
#define SCNuLEAST32 "lu"
|
||||
#define SCNxLEAST32 "lx"
|
||||
#define SCNXLEAST32 "lX"
|
||||
#define SCNoFAST32 "lo"
|
||||
#define SCNuFAST32 "lu"
|
||||
#define SCNxFAST32 "lx"
|
||||
#define SCNXFAST32 "lX"
|
||||
|
||||
#define SCNo64 "I64o"
|
||||
#define SCNu64 "I64u"
|
||||
#define SCNx64 "I64x"
|
||||
#define SCNX64 "I64X"
|
||||
#define SCNoLEAST64 "I64o"
|
||||
#define SCNuLEAST64 "I64u"
|
||||
#define SCNxLEAST64 "I64x"
|
||||
#define SCNXLEAST64 "I64X"
|
||||
#define SCNoFAST64 "I64o"
|
||||
#define SCNuFAST64 "I64u"
|
||||
#define SCNxFAST64 "I64x"
|
||||
#define SCNXFAST64 "I64X"
|
||||
|
||||
#define SCNoMAX "I64o"
|
||||
#define SCNuMAX "I64u"
|
||||
#define SCNxMAX "I64x"
|
||||
#define SCNXMAX "I64X"
|
||||
|
||||
#ifdef _WIN64 // [
|
||||
# define SCNoPTR "I64o"
|
||||
# define SCNuPTR "I64u"
|
||||
# define SCNxPTR "I64x"
|
||||
# define SCNXPTR "I64X"
|
||||
#else // _WIN64 ][
|
||||
# define SCNoPTR "lo"
|
||||
# define SCNuPTR "lu"
|
||||
# define SCNxPTR "lx"
|
||||
# define SCNXPTR "lX"
|
||||
#endif // _WIN64 ]
|
||||
|
||||
#endif // __STDC_FORMAT_MACROS ]
|
||||
|
||||
// 7.8.2 Functions for greatest-width integer types
|
||||
|
||||
// 7.8.2.1 The imaxabs function
|
||||
#define imaxabs _abs64
|
||||
|
||||
// 7.8.2.2 The imaxdiv function
|
||||
|
||||
// This is modified version of div() function from Microsoft's div.c found
|
||||
// in %MSVC.NET%\crt\src\div.c
|
||||
#ifdef STATIC_IMAXDIV // [
|
||||
static
|
||||
#else // STATIC_IMAXDIV ][
|
||||
_inline
|
||||
#endif // STATIC_IMAXDIV ]
|
||||
imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom)
|
||||
{
|
||||
imaxdiv_t result;
|
||||
|
||||
result.quot = numer / denom;
|
||||
result.rem = numer % denom;
|
||||
|
||||
if (numer < 0 && result.rem > 0) {
|
||||
// did division wrong; must fix up
|
||||
++result.quot;
|
||||
result.rem -= denom;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// 7.8.2.3 The strtoimax and strtoumax functions
|
||||
#define strtoimax _strtoi64
|
||||
#define strtoumax _strtoui64
|
||||
|
||||
// 7.8.2.4 The wcstoimax and wcstoumax functions
|
||||
#define wcstoimax _wcstoi64
|
||||
#define wcstoumax _wcstoui64
|
||||
|
||||
|
||||
#endif // _MSC_INTTYPES_H_ ]
|
||||
247
include/MSVC/stdint.h
Normal file
247
include/MSVC/stdint.h
Normal file
|
|
@ -0,0 +1,247 @@
|
|||
// ISO C9x compliant stdint.h for Microsoft Visual Studio
|
||||
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
|
||||
//
|
||||
// Copyright (c) 2006-2008 Alexander Chemeris
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
//
|
||||
// 3. The name of the author may be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _MSC_VER // [
|
||||
#error "Use this header only with Microsoft Visual C++ compilers!"
|
||||
#endif // _MSC_VER ]
|
||||
|
||||
#ifndef _MSC_STDINT_H_ // [
|
||||
#define _MSC_STDINT_H_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
|
||||
// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
|
||||
// or compiler give many errors like this:
|
||||
// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
# include <wchar.h>
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
// Define _W64 macros to mark types changing their size, like intptr_t.
|
||||
#ifndef _W64
|
||||
# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
|
||||
# define _W64 __w64
|
||||
# else
|
||||
# define _W64
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
// 7.18.1 Integer types
|
||||
|
||||
// 7.18.1.1 Exact-width integer types
|
||||
|
||||
// Visual Studio 6 and Embedded Visual C++ 4 doesn't
|
||||
// realize that, e.g. char has the same size as __int8
|
||||
// so we give up on __intX for them.
|
||||
#if (_MSC_VER < 1300)
|
||||
typedef signed char int8_t;
|
||||
typedef signed short int16_t;
|
||||
typedef signed int int32_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef unsigned int uint32_t;
|
||||
#else
|
||||
typedef signed __int8 int8_t;
|
||||
typedef signed __int16 int16_t;
|
||||
typedef signed __int32 int32_t;
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef unsigned __int16 uint16_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
#endif
|
||||
typedef signed __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
|
||||
|
||||
// 7.18.1.2 Minimum-width integer types
|
||||
typedef int8_t int_least8_t;
|
||||
typedef int16_t int_least16_t;
|
||||
typedef int32_t int_least32_t;
|
||||
typedef int64_t int_least64_t;
|
||||
typedef uint8_t uint_least8_t;
|
||||
typedef uint16_t uint_least16_t;
|
||||
typedef uint32_t uint_least32_t;
|
||||
typedef uint64_t uint_least64_t;
|
||||
|
||||
// 7.18.1.3 Fastest minimum-width integer types
|
||||
typedef int8_t int_fast8_t;
|
||||
typedef int16_t int_fast16_t;
|
||||
typedef int32_t int_fast32_t;
|
||||
typedef int64_t int_fast64_t;
|
||||
typedef uint8_t uint_fast8_t;
|
||||
typedef uint16_t uint_fast16_t;
|
||||
typedef uint32_t uint_fast32_t;
|
||||
typedef uint64_t uint_fast64_t;
|
||||
|
||||
// 7.18.1.4 Integer types capable of holding object pointers
|
||||
#ifdef _WIN64 // [
|
||||
typedef signed __int64 intptr_t;
|
||||
typedef unsigned __int64 uintptr_t;
|
||||
#else // _WIN64 ][
|
||||
typedef _W64 signed int intptr_t;
|
||||
typedef _W64 unsigned int uintptr_t;
|
||||
#endif // _WIN64 ]
|
||||
|
||||
// 7.18.1.5 Greatest-width integer types
|
||||
typedef int64_t intmax_t;
|
||||
typedef uint64_t uintmax_t;
|
||||
|
||||
|
||||
// 7.18.2 Limits of specified-width integer types
|
||||
|
||||
#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
|
||||
|
||||
// 7.18.2.1 Limits of exact-width integer types
|
||||
#define INT8_MIN ((int8_t)_I8_MIN)
|
||||
#define INT8_MAX _I8_MAX
|
||||
#define INT16_MIN ((int16_t)_I16_MIN)
|
||||
#define INT16_MAX _I16_MAX
|
||||
#define INT32_MIN ((int32_t)_I32_MIN)
|
||||
#define INT32_MAX _I32_MAX
|
||||
#define INT64_MIN ((int64_t)_I64_MIN)
|
||||
#define INT64_MAX _I64_MAX
|
||||
#define UINT8_MAX _UI8_MAX
|
||||
#define UINT16_MAX _UI16_MAX
|
||||
#define UINT32_MAX _UI32_MAX
|
||||
#define UINT64_MAX _UI64_MAX
|
||||
|
||||
// 7.18.2.2 Limits of minimum-width integer types
|
||||
#define INT_LEAST8_MIN INT8_MIN
|
||||
#define INT_LEAST8_MAX INT8_MAX
|
||||
#define INT_LEAST16_MIN INT16_MIN
|
||||
#define INT_LEAST16_MAX INT16_MAX
|
||||
#define INT_LEAST32_MIN INT32_MIN
|
||||
#define INT_LEAST32_MAX INT32_MAX
|
||||
#define INT_LEAST64_MIN INT64_MIN
|
||||
#define INT_LEAST64_MAX INT64_MAX
|
||||
#define UINT_LEAST8_MAX UINT8_MAX
|
||||
#define UINT_LEAST16_MAX UINT16_MAX
|
||||
#define UINT_LEAST32_MAX UINT32_MAX
|
||||
#define UINT_LEAST64_MAX UINT64_MAX
|
||||
|
||||
// 7.18.2.3 Limits of fastest minimum-width integer types
|
||||
#define INT_FAST8_MIN INT8_MIN
|
||||
#define INT_FAST8_MAX INT8_MAX
|
||||
#define INT_FAST16_MIN INT16_MIN
|
||||
#define INT_FAST16_MAX INT16_MAX
|
||||
#define INT_FAST32_MIN INT32_MIN
|
||||
#define INT_FAST32_MAX INT32_MAX
|
||||
#define INT_FAST64_MIN INT64_MIN
|
||||
#define INT_FAST64_MAX INT64_MAX
|
||||
#define UINT_FAST8_MAX UINT8_MAX
|
||||
#define UINT_FAST16_MAX UINT16_MAX
|
||||
#define UINT_FAST32_MAX UINT32_MAX
|
||||
#define UINT_FAST64_MAX UINT64_MAX
|
||||
|
||||
// 7.18.2.4 Limits of integer types capable of holding object pointers
|
||||
#ifdef _WIN64 // [
|
||||
# define INTPTR_MIN INT64_MIN
|
||||
# define INTPTR_MAX INT64_MAX
|
||||
# define UINTPTR_MAX UINT64_MAX
|
||||
#else // _WIN64 ][
|
||||
# define INTPTR_MIN INT32_MIN
|
||||
# define INTPTR_MAX INT32_MAX
|
||||
# define UINTPTR_MAX UINT32_MAX
|
||||
#endif // _WIN64 ]
|
||||
|
||||
// 7.18.2.5 Limits of greatest-width integer types
|
||||
#define INTMAX_MIN INT64_MIN
|
||||
#define INTMAX_MAX INT64_MAX
|
||||
#define UINTMAX_MAX UINT64_MAX
|
||||
|
||||
// 7.18.3 Limits of other integer types
|
||||
|
||||
#ifdef _WIN64 // [
|
||||
# define PTRDIFF_MIN _I64_MIN
|
||||
# define PTRDIFF_MAX _I64_MAX
|
||||
#else // _WIN64 ][
|
||||
# define PTRDIFF_MIN _I32_MIN
|
||||
# define PTRDIFF_MAX _I32_MAX
|
||||
#endif // _WIN64 ]
|
||||
|
||||
#define SIG_ATOMIC_MIN INT_MIN
|
||||
#define SIG_ATOMIC_MAX INT_MAX
|
||||
|
||||
#ifndef SIZE_MAX // [
|
||||
# ifdef _WIN64 // [
|
||||
# define SIZE_MAX _UI64_MAX
|
||||
# else // _WIN64 ][
|
||||
# define SIZE_MAX _UI32_MAX
|
||||
# endif // _WIN64 ]
|
||||
#endif // SIZE_MAX ]
|
||||
|
||||
// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
|
||||
#ifndef WCHAR_MIN // [
|
||||
# define WCHAR_MIN 0
|
||||
#endif // WCHAR_MIN ]
|
||||
#ifndef WCHAR_MAX // [
|
||||
# define WCHAR_MAX _UI16_MAX
|
||||
#endif // WCHAR_MAX ]
|
||||
|
||||
#define WINT_MIN 0
|
||||
#define WINT_MAX _UI16_MAX
|
||||
|
||||
#endif // __STDC_LIMIT_MACROS ]
|
||||
|
||||
|
||||
// 7.18.4 Limits of other integer types
|
||||
|
||||
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
|
||||
|
||||
// 7.18.4.1 Macros for minimum-width integer constants
|
||||
|
||||
#define INT8_C(val) val##i8
|
||||
#define INT16_C(val) val##i16
|
||||
#define INT32_C(val) val##i32
|
||||
#define INT64_C(val) val##i64
|
||||
|
||||
#define UINT8_C(val) val##ui8
|
||||
#define UINT16_C(val) val##ui16
|
||||
#define UINT32_C(val) val##ui32
|
||||
#define UINT64_C(val) val##ui64
|
||||
|
||||
// 7.18.4.2 Macros for greatest-width integer constants
|
||||
#define INTMAX_C INT64_C
|
||||
#define UINTMAX_C UINT64_C
|
||||
|
||||
#endif // __STDC_CONSTANT_MACROS ]
|
||||
|
||||
|
||||
#endif // _MSC_STDINT_H_ ]
|
||||
|
|
@ -698,9 +698,9 @@ int sal_call_notify_refer_state(SalOp *h, SalOp *newcall);
|
|||
* @param h the Sal instance
|
||||
* @param handling_method Could be SalOpSDPNormal, SalOpSDPSimulateError, SalOpSDPSimulateRemoval (\ref SalOpSDPHandling)
|
||||
*/
|
||||
void sal_default_set_sdp_handling(Sal* h, SalOpSDPHandling handling_method) ;
|
||||
LINPHONE_PUBLIC void sal_default_set_sdp_handling(Sal* h, SalOpSDPHandling handling_method) ;
|
||||
/* Second version: for a specific call*/
|
||||
void sal_call_set_sdp_handling(SalOp *h, SalOpSDPHandling handling) ;
|
||||
LINPHONE_PUBLIC void sal_call_set_sdp_handling(SalOp *h, SalOpSDPHandling handling) ;
|
||||
|
||||
/*Registration*/
|
||||
int sal_register(SalOp *op, const char *proxy, const char *from, int expires);
|
||||
|
|
@ -710,7 +710,7 @@ int sal_unregister(SalOp *h);
|
|||
|
||||
/*Messaging */
|
||||
int sal_text_send(SalOp *op, const char *from, const char *to, const char *text);
|
||||
int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg);
|
||||
int sal_message_send(SalOp *op, const char *from, const char *to, const char* content_type, const char *msg, const char *peer_uri);
|
||||
int sal_message_reply(SalOp *op, SalReason reason);
|
||||
|
||||
/*presence Subscribe/notify*/
|
||||
|
|
@ -812,7 +812,7 @@ LINPHONE_PUBLIC bool_t sal_dns_srv_enabled(const Sal *sal);
|
|||
LINPHONE_PUBLIC void sal_set_dns_user_hosts_file(Sal *sal, const char *hosts_file);
|
||||
LINPHONE_PUBLIC const char *sal_get_dns_user_hosts_file(const Sal *sal);
|
||||
unsigned int sal_get_random(void);
|
||||
char *sal_get_random_token(int size);
|
||||
LINPHONE_PUBLIC char *sal_get_random_token(int size);
|
||||
unsigned char * sal_get_random_bytes(unsigned char *ret, size_t size);
|
||||
belle_sip_source_t * sal_create_timer(Sal *sal, belle_sip_source_func_t func, void *data, unsigned int timeout_value_ms, const char* timer_name);
|
||||
void sal_cancel_timer(Sal *sal, belle_sip_source_t *timer);
|
||||
|
|
@ -821,7 +821,7 @@ int sal_body_has_type(const SalBody *body, const char *type, const char *subtype
|
|||
/*this function parses a document with key=value pairs separated by new lines, and extracts the value for a given key*/
|
||||
int sal_lines_get_value(const char *data, const char *key, char *value, size_t value_size);
|
||||
|
||||
belle_sip_stack_t *sal_get_belle_sip_stack(Sal *sal);
|
||||
LINPHONE_PUBLIC belle_sip_stack_t *sal_get_belle_sip_stack(Sal *sal);
|
||||
char* sal_op_get_public_uri(SalOp *sal);
|
||||
|
||||
unsigned long sal_begin_background_task(const char *name, void (*max_time_reached)(void *), void *data);
|
||||
|
|
|
|||
15
java/common/org/linphone/core/LinphoneBuffer.java
Normal file
15
java/common/org/linphone/core/LinphoneBuffer.java
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
package org.linphone.core;
|
||||
|
||||
/**
|
||||
* The LinphoneContent object representing a data buffer.
|
||||
**/
|
||||
public interface LinphoneBuffer {
|
||||
|
||||
byte[] getContent();
|
||||
|
||||
void setContent(byte[] data);
|
||||
|
||||
int getSize();
|
||||
|
||||
void setSize(int size);
|
||||
}
|
||||
|
|
@ -4,9 +4,38 @@ import java.util.Vector;
|
|||
|
||||
|
||||
public interface LinphoneChatMessage {
|
||||
interface StateListener{
|
||||
@Deprecated
|
||||
interface StateListener {
|
||||
void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg, State state);
|
||||
}
|
||||
|
||||
interface LinphoneChatMessageListener {
|
||||
void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg, State state);
|
||||
|
||||
/**
|
||||
* This function is called by the core upon an incoming File transfer is started. This function may be call several time for the same file in case of large file.
|
||||
* @param content incoming content information
|
||||
* @param buffer holding the received data. Empty buffer means end of file.
|
||||
*/
|
||||
void onLinphoneChatMessageFileTransferReceived(LinphoneChatMessage msg, LinphoneContent content, LinphoneBuffer buffer);
|
||||
|
||||
/**
|
||||
* This function is called by the core when an outgoing file transfer is started. This function is called until size is set to 0.
|
||||
* @param content incoming content information
|
||||
* @param offset the offset in the file from where to get the data to be sent
|
||||
* @param size the number of bytes expected by the framework
|
||||
* @param bufferToFill A LinphoneBuffer object holding the data written by the application. An empty buffer means end of file.
|
||||
*/
|
||||
void onLinphoneChatMessageFileTransferSent(LinphoneChatMessage msg, LinphoneContent content, int offset, int size, LinphoneBuffer bufferToFill);
|
||||
|
||||
/**
|
||||
* File transfer progress indication callback prototype.
|
||||
* @param content incoming content information
|
||||
* @param offset The number of bytes sent/received since the beginning of the transfer.
|
||||
* @param total The total number of bytes to be sent/received.
|
||||
*/
|
||||
void onLinphoneChatMessageFileTransferProgressChanged(LinphoneChatMessage msg, LinphoneContent content, int offset, int total);
|
||||
}
|
||||
public static class State {
|
||||
static private Vector<State> values = new Vector<State>();
|
||||
private final int mValue;
|
||||
|
|
@ -33,6 +62,10 @@ public interface LinphoneChatMessage {
|
|||
* Message was received(and acknowledged) but cannot get file from server
|
||||
*/
|
||||
public final static State FileTransferError = new State(4,"FileTransferError");
|
||||
/**
|
||||
* File transfer has been completed successfully.
|
||||
*/
|
||||
public final static State FileTransferDone = new State(5,"FileTransferDone");
|
||||
|
||||
private State(int value,String stringValue) {
|
||||
mValue = value;
|
||||
|
|
@ -158,11 +191,6 @@ public interface LinphoneChatMessage {
|
|||
*/
|
||||
ErrorInfo getErrorInfo();
|
||||
|
||||
/**
|
||||
* Start the download of the file bundled in the message
|
||||
*/
|
||||
void startFileDownload(LinphoneChatMessage.StateListener listener);
|
||||
|
||||
/**
|
||||
* Cancel an ongoing file transfer attached to this message.(upload or download).
|
||||
*/
|
||||
|
|
@ -184,4 +212,19 @@ public interface LinphoneChatMessage {
|
|||
*/
|
||||
String getAppData();
|
||||
|
||||
/**
|
||||
* Set the path to the file to read from or write to during the file transfer.
|
||||
* @param path The path to the file to use for the file transfer.
|
||||
*/
|
||||
void setFileTransferFilepath(String path);
|
||||
|
||||
/**
|
||||
* Start the download of the file referenced in a LinphoneChatMessage from remote server.
|
||||
*/
|
||||
void downloadFile();
|
||||
|
||||
/**
|
||||
* Set the callbacks associated with the LinphoneChatMessage.
|
||||
*/
|
||||
void setListener(LinphoneChatMessage.LinphoneChatMessageListener listener);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ public interface LinphoneChatRoom {
|
|||
* Send a message to peer member of this chat room.
|
||||
* @param chat message
|
||||
*/
|
||||
@Deprecated
|
||||
void sendMessage(LinphoneChatMessage message, LinphoneChatMessage.StateListener listener);
|
||||
|
||||
/**
|
||||
|
|
@ -144,4 +145,9 @@ public interface LinphoneChatRoom {
|
|||
*/
|
||||
LinphoneChatMessage createFileTransferMessage(LinphoneContent content);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param message
|
||||
*/
|
||||
void sendChatMessage(LinphoneChatMessage message);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1164,6 +1164,12 @@ public interface LinphoneCore {
|
|||
* If the device has a builtin echo canceller or calibration value is already known, it will return false.
|
||||
*/
|
||||
boolean needsEchoCalibration();
|
||||
|
||||
/**
|
||||
* Returns true if the software echo canceler needs to be turned on.
|
||||
* If the device has a builtin echo canceller, it will return false.
|
||||
*/
|
||||
boolean needsEchoCanceler();
|
||||
|
||||
void enableIpv6(boolean enable);
|
||||
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ abstract public class LinphoneCoreFactory {
|
|||
/**
|
||||
* Create a LinphoneContent object from byte array.
|
||||
*/
|
||||
abstract public LinphoneContent createLinphoneContent(String type, String subType,byte [] data, String encoding);
|
||||
abstract public LinphoneContent createLinphoneContent(String type, String subType, byte[] data, String encoding);
|
||||
|
||||
/**
|
||||
* Create a PresenceActivity object.
|
||||
|
|
|
|||
33
java/impl/org/linphone/core/LinphoneBufferImpl.java
Normal file
33
java/impl/org/linphone/core/LinphoneBufferImpl.java
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
package org.linphone.core;
|
||||
|
||||
public class LinphoneBufferImpl implements LinphoneBuffer {
|
||||
private byte[] mData;
|
||||
private int mSize;
|
||||
|
||||
public LinphoneBufferImpl(byte[] data, int size)
|
||||
{
|
||||
mData = data;
|
||||
mSize = size;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getContent() {
|
||||
return mData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setContent(byte[] data) {
|
||||
mData = data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSize() {
|
||||
return mSize;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSize(int size) {
|
||||
mSize = size;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -15,6 +15,9 @@ public class LinphoneChatMessageImpl implements LinphoneChatMessage {
|
|||
private native boolean isOutgoing(long ptr);
|
||||
private native void store(long ptr);
|
||||
private native int getStorageId(long ptr);
|
||||
private native void setFileTransferFilepath(long ptr, String path);
|
||||
private native void downloadFile(long ptr);
|
||||
private native void setListener(long ptr, LinphoneChatMessageListener listener);
|
||||
private native void unref(long ptr);
|
||||
|
||||
protected LinphoneChatMessageImpl(long aNativePtr) {
|
||||
|
|
@ -113,12 +116,6 @@ public class LinphoneChatMessageImpl implements LinphoneChatMessage {
|
|||
super.finalize();
|
||||
}
|
||||
|
||||
private native void startFileDownload(long ptr, StateListener listener);
|
||||
@Override
|
||||
public void startFileDownload(StateListener listener) {
|
||||
startFileDownload(nativePtr, listener);
|
||||
}
|
||||
|
||||
private native Object getFileTransferInformation(long ptr);
|
||||
@Override
|
||||
public LinphoneContent getFileTransferInformation() {
|
||||
|
|
@ -142,4 +139,19 @@ public class LinphoneChatMessageImpl implements LinphoneChatMessage {
|
|||
public void cancelFileTransfer() {
|
||||
cancelFileTransfer(nativePtr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFileTransferFilepath(String path) {
|
||||
setFileTransferFilepath(nativePtr, path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void downloadFile() {
|
||||
downloadFile(nativePtr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setListener(LinphoneChatMessageListener listener) {
|
||||
setListener(nativePtr, listener);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ package org.linphone.core;
|
|||
import org.linphone.core.LinphoneChatMessage.State;
|
||||
import org.linphone.core.LinphoneChatMessage.StateListener;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
class LinphoneChatRoomImpl implements LinphoneChatRoom {
|
||||
protected final long nativePtr;
|
||||
private native long createLinphoneChatMessage(long ptr, String message);
|
||||
|
|
@ -41,6 +42,7 @@ class LinphoneChatRoomImpl implements LinphoneChatRoom {
|
|||
private native long createLinphoneChatMessage2(long ptr, String message,
|
||||
String url, int state, long timestamp, boolean isRead,
|
||||
boolean isIncoming);
|
||||
private native void sendChatMessage(long ptr, Object message, long messagePtr);
|
||||
|
||||
protected LinphoneChatRoomImpl(long aNativePtr) {
|
||||
nativePtr = aNativePtr;
|
||||
|
|
@ -176,5 +178,8 @@ class LinphoneChatRoomImpl implements LinphoneChatRoom {
|
|||
return new LinphoneChatMessageImpl(createFileTransferMessage(nativePtr, content.getName(), content.getType(), content.getSubtype(), content.getRealSize()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendChatMessage(LinphoneChatMessage message) {
|
||||
sendChatMessage(nativePtr, message, ((LinphoneChatMessageImpl)message).getNativePtr());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory {
|
|||
@Override
|
||||
public LinphoneContent createLinphoneContent(String type, String subType,
|
||||
String data) {
|
||||
return new LinphoneContentImpl(type,subType,data.getBytes(),null);
|
||||
return new LinphoneContentImpl(type,subType,data == null ? null : data.getBytes(), null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -1045,6 +1045,11 @@ class LinphoneCoreImpl implements LinphoneCore {
|
|||
public synchronized boolean needsEchoCalibration() {
|
||||
return needsEchoCalibration(nativePtr);
|
||||
}
|
||||
private native boolean needsEchoCanceler(long ptr);
|
||||
@Override
|
||||
public synchronized boolean needsEchoCanceler() {
|
||||
return needsEchoCanceler(nativePtr);
|
||||
}
|
||||
private native void declineCall(long coreptr, long callptr, int reason);
|
||||
@Override
|
||||
public synchronized void declineCall(LinphoneCall aCall, Reason reason) {
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit e35a1e71bdc64bc914b866b1a66815d5e47f8a01
|
||||
Subproject commit 8e8dd84a37db6d079b254229575b4109973b61a0
|
||||
2
oRTP
2
oRTP
|
|
@ -1 +1 @@
|
|||
Subproject commit 496b5b1fd0053bf94e5e0fcecf9cd43713820ca1
|
||||
Subproject commit 19ed314d52d4061a21daa4805aef9459ad31640c
|
||||
147
po/ar.po
147
po/ar.po
|
|
@ -9,10 +9,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\n"
|
||||
"PO-Revision-Date: 2015-02-17 11:28+0000\n"
|
||||
"Last-Translator: Belledonne Communications <support@belledonne-"
|
||||
"communications.com>\n"
|
||||
"POT-Creation-Date: 2015-03-11 16:26+0100\n"
|
||||
"PO-Revision-Date: 2015-02-17 21:52+0000\n"
|
||||
"Last-Translator: محيي الدين <tx99h4@hotmail.com>\n"
|
||||
"Language-Team: Arabic (http://www.transifex.com/projects/p/linphone-gtk/"
|
||||
"language/ar/)\n"
|
||||
"Language: ar\n"
|
||||
|
|
@ -102,54 +101,54 @@ msgstr "أنا"
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "أيقونة غير موجودة : %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "جهة اتصال sip غير صالحة !"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr "أظهِرْ بعض معلومات التنقيح خلال التشغيل."
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr "الدليل إلى الملف الذي سيُكتَب فيه سجل الوقائع."
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr "ابدأ لِنْفُونْ لكن دون تفعيل الفيديو."
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "شغِّله مُصغَّرا، ولا تُظهِر الواجهة الرئيسية."
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "العنوان المُراد الاتصال به الآن"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "إذا تم التفعيل، سيجيب تلقائيا عن المكالمات الواردة"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
msgstr ""
|
||||
"حدِّد مجلد العمل (الذي سيكون مجلد التثبيت، مثلا c:\\Program Files\\Linphone)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr "ملف التهيئة"
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr "ابدأ مرشد الصوت"
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr "شغِّل الاختبار الذاتي ثم اخرِجْ 0 إذا نجح"
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -161,7 +160,7 @@ msgstr ""
|
|||
"هل تريد السماح له برؤية معلومات حضورك وكذا إضافته إلى جهة اتصالك أيضا ؟ إذا "
|
||||
"أجبت ب لا، سيُحظَر هذا الشخص مؤقتا."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
|
|
@ -170,59 +169,59 @@ msgstr ""
|
|||
"ادخل كلمة السر ل <i>%s</i>\n"
|
||||
" في نطاق <i>%s</i>:"
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr "خطأ في المكالمة"
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "إنتهت المكالمة"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "مكالمة واردة"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "أجِبْ"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "ارفضْ"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr "المكالمة متوقفة"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr "<b>بواسطة %s</b>"
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr "يود %s تشغيل الفيديو. هل تقبل ذلك ؟"
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "وصلة إلى الموقع وِبْ"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "لِنْفُونْ - الهاتف المرئي عبر الإنترنت"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (افتراضي)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "التحويل إلى %s"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -230,7 +229,7 @@ msgstr ""
|
|||
"لا وجود للوحة الصوت على هذا الحاسوب.\n"
|
||||
"لن تتمكن من تلقي أو إجراء أي مكالمة."
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "هاتف SIP المرئي الحر"
|
||||
|
||||
|
|
@ -394,7 +393,7 @@ msgstr "SRTP"
|
|||
|
||||
#: ../gtk/propertybox.c:1246
|
||||
msgid "DTLS"
|
||||
msgstr ""
|
||||
msgstr "DTLS"
|
||||
|
||||
#: ../gtk/propertybox.c:1253
|
||||
msgid "ZRTP"
|
||||
|
|
@ -709,7 +708,7 @@ msgstr "آمن بواسطة SRTP"
|
|||
|
||||
#: ../gtk/incall_view.c:685
|
||||
msgid "Secured by DTLS"
|
||||
msgstr ""
|
||||
msgstr "مُؤمَّن بواسطة DTLS"
|
||||
|
||||
#: ../gtk/incall_view.c:691
|
||||
#, c-format
|
||||
|
|
@ -773,7 +772,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr "(متوقف)"
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "يُرجى إدخال معلومات الولوج ل %s"
|
||||
|
|
@ -1751,60 +1750,60 @@ msgstr "تجري التهيئة..."
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr "رجاءً انتظر ريثما ينتهي من جلب الإعدادات من الخادم..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "جاهز"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr "تجري التهيئة"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "يجري البحث عن وجهة رقم الهاتف..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "لم يتمكن من إيجاد هذا الرقم."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "يتصل ب"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr "لم يتمكن من الاتصال"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr "آسف، وصل عدد المكالمات الآنية إلى حده الأقصى"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr "يتصل بك"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr "ويطلب ردا تلقائيا."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "يجري تعديل إعدادات المكالمة..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "متصل."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr "أُلغيت المكالمة"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "لم يتمكن من توقيف المكالمة مؤقتا"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "وضع المكالمة قيد الانتظار..."
|
||||
|
||||
|
|
@ -1888,112 +1887,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "تعذر الولوج بالهوية %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "يرن الجرس عن بعد..."
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr "يرن الجرس عن بعد..."
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "أخذ المكالمة مبكرا."
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr "المكاملة مع %s متوقفة."
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr "يجيب %s عن المكالمة - في وضع الانتظار."
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr "استُعيدت المكالمة."
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr "أجاب عن المكالمة %s."
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr "غير موائم، تحقق من المراميز أو إعدادات الأمان..."
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr "إعدادات الوسائط غير موائمة."
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr "استُأنِفت المكالمة."
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr "وُقِّفت المكالمة مؤقتا من طرف آخر."
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr "حُدِّث الاتصال من البعيد."
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "أُنهيت المكالمة."
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "المستخدم مشغول."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "المستخدم غير متاح مؤقتا."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "لا يريد المستخدم أي إزعاج."
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "تم تجاهل المكالمة."
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr "انتهت مهلة الطلب."
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "مُوجَّه"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr "فشل الاتصال."
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "تم التسجيل في %s بنجاح."
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "أُلغي التسجيل في %s ."
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "لا إجابة قبل انتهاء المهلة"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "فَشِل التسجيل في %s: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr "خدمة غير متاحة، تجري الإعادة"
|
||||
|
||||
|
|
@ -2003,7 +2002,7 @@ msgstr "خدمة غير متاحة، تجري الإعادة"
|
|||
msgid "Authentication token is %s"
|
||||
msgstr "شارة التحقق من الهوية هي %s"
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/cs.po
138
po/cs.po
|
|
@ -9,7 +9,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -95,35 +95,35 @@ msgstr "Já"
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "Nelze najít soubor s obrázkem: %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "Neplatný sipový kontakt!"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr "Za běhu vypisuje některé ladicí informace na standardní výstup."
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr "Soubor, kam zapisovat protokol."
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr "Spustí linphone se zakázaným obrazem."
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "Spustí se pouze do systémové oblasti, nezobrazí hlavní okno."
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "Zavolá právě teď na tuto adresu"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "je-li nastaveno, automaticky zvedne příchozí hovor"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
|
|
@ -131,19 +131,19 @@ msgstr ""
|
|||
"Zadejte pracovní adresář (měl by být základní instalační adresář, například "
|
||||
"c:\\Program Files\\Linphone)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -156,66 +156,66 @@ msgstr ""
|
|||
"do svého adresáře?\n"
|
||||
"Odpovíte-li ne, tato osobo bude dočasně blokována."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
" at realm <i>%s</i>:"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr "Chyba hovoru"
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "Hovor ukončen"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "Příchozí hovor"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "Odpovědět"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "Odmítnout"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr "Hovor odložen"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr "<b>kým: %s</b>"
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr "%s navrhuje začít videohovor. Přijímáte?"
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "Odkaz na webovou stránku"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Lipnhone – internetový videofon"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (Výchozí)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "Byly jsme přepojeni na %s"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -223,7 +223,7 @@ msgstr ""
|
|||
"Na tomto počítači nebyla objevena žádná zvuková karta.\n"
|
||||
"Nebudete moci vytáčet a přijímat a zvukové hovory."
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "Volný SIP videofon"
|
||||
|
||||
|
|
@ -762,7 +762,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr "(Odloženo)"
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "Prosím, zadejte své přihlašovací jméno pro %s:"
|
||||
|
|
@ -1721,60 +1721,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "Připraven."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "Vyhledává se umístění čísla…"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "Toto číslo nelze vyhledat."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "Navazuje se spojení"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr "Nelze volat"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr "Je nám líto, ale byl dosažen maximální počet současných hovorů."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr "vás volá"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr " a požaduje automatickou zvednutí."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "Upravují se parametry hovoru…"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "Připojeno."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr "Hovor přerušen"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "Hovor nebylo možné odložit"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "Současný hovor se odkládá…"
|
||||
|
||||
|
|
@ -1859,112 +1859,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "Nelze se přihlásit jako %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "Vyzvání na druhé straně."
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr "Vyzvání na druhé straně…"
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "Časná média."
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr "Hovor s %s je odložen."
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr "Hovor přijat kým: %s – odložen."
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr "Hovor obnoven."
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr "Hovor přijat kým: %s."
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr "Není slučitelné. Zkontrolujte nastavení kodeků a zabezpečení…"
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr "Neslučitelné parametry médií."
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr "Byli jsme obnoveni."
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr "Byli jsme odloženi protistranou."
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr "Hovor byl aktualizován protistranou."
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "Hovor ukončen."
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "Uživatel je zaneprázdněn."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "Uživatel je dočasně nedostupný."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "Uživatel si nepřeje být rušen."
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "Volání odmítnuto."
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "Přesměrováno"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr "Volání se nezdařilo."
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "Registrace na %s byla úspěšná."
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "Odregistrování z %s hotovo."
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "odpověď nedorazila včas"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "Registrace na %s selhala: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1974,7 +1974,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr "Klíč k ověření totožnosti je %s"
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/de.po
138
po/de.po
|
|
@ -11,7 +11,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -95,37 +95,37 @@ msgstr "Eigenes Telefon"
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "Pixmapdatei %s kann nicht gefunden werden."
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "Ungültiger SIP-Kontakt!"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr "Ausgabe von Debug-Informationen auf stdout während der Laufzeit"
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr "Pfad zu einer Datei, in die Protokolle geschrieben werden."
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr "Linphone mit ausgeschaltetem Video starten."
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr ""
|
||||
"Nur im Systemabschnitt der Kontrollleiste starten, aber das Hauptfenster "
|
||||
"nicht zeigen."
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "Im Moment anzurufende Adresse"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "Falls aktiviert, werden eingehende Anrufe automatisch beantwortet"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
|
|
@ -133,19 +133,19 @@ msgstr ""
|
|||
"Geben Sie einen Arbeitsordner an (sollte der Installationsordner sein, z. B. "
|
||||
"C:\\Programme\\Linphone)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr "Konfigurationsdatei"
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr "Starte den Audio-Assistent"
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -158,7 +158,7 @@ msgstr ""
|
|||
"Ihrer Kontaktliste hinzufügen?\n"
|
||||
"Wenn Sie mit Nein antworten, wird diese Person vorläufig blockiert."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
|
|
@ -167,59 +167,59 @@ msgstr ""
|
|||
"Bitte geben Sie Ihr Passwort für den Benutzernamen <i>%s</i>\n"
|
||||
" für Bereich <i>%s</i> ein:"
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr "Anruf fehlgeschlagen"
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "Anruf beendet"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "Eingehender Anruf"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "Annehmen"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "Abweisen"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr "Anruf wird gehalten"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr "<b>von %s</b>"
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr "%s schlägt vor, eine Videoübertragung zu starten. Nehmen Sie an?"
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "Website-Verknüpfung"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Linphone - ein Internet-Video-Telefon"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (Vorgabe)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "Vermittlung nach %s"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -227,7 +227,7 @@ msgstr ""
|
|||
"Auf diesem Rechner können keine Soundkarten gefunden werden.\n"
|
||||
"Sie können keine Audio-Anrufe tätigen oder entgegennehmen."
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "Ein freies SIP-Video-Telefon"
|
||||
|
||||
|
|
@ -771,7 +771,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr "(pausiert)"
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "Bitte geben Sie die Anmeldeinformationen für %s ein."
|
||||
|
|
@ -1755,60 +1755,60 @@ msgid "Please wait while fetching configuration from server..."
|
|||
msgstr ""
|
||||
"Bitte warten Sie während die Einstellungen vom Server abgerufen werden..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "Bereit"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr "Einstellen"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "Telefonnummernziel wird gesucht..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "Diese Nummer kann nicht aufgelöst werden."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "Verbindungsaufbau"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr "Anruf kann nicht getätigt werden."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr "Die maximale Anzahl der gleichzeitigen Anrufe ist erreicht."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr "ruft Sie an"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr " und fragt nach automatischer Antwort."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "Die Anrufparameter werden verändert..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "Verbunden."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr "Anruf abgebrochen"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "Anruf kann nicht gehalten werden"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "Aktueller Anruf wird gehalten..."
|
||||
|
||||
|
|
@ -1894,112 +1894,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "Anmeldung als %s fehlgeschlagen"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "Klingeln bei der Gegenseite."
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr "Klingeln bei der Gegenseite..."
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "nicht kompatibel, prüfe Codecs oder Sicherheitseinstellungen..."
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr "Anruf mit %s wird gehalten."
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr "Der von %s entgegengenommene Anruf wird gehalten."
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr "Anruf fortgesetzt."
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr "Anruf wird von %s entgegengenommen."
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr "Inkompatibel, prüfe Codecs oder Sicherheitseinstellungen..."
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr "Inkompatible Medienparameter."
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr "Anruf wird fortgesetzt."
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr "Anruf wird von der Gegenseite gehalten."
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr "Anruf ist von der Gegenseite aktualisiert worden."
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "Anruf beendet."
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "Teilnehmer ist besetzt."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "Teilnehmer zur Zeit nicht verfügbar."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "Teilnehmer möchte nicht gestört werden."
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "Anruf abgewiesen"
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr "Zeitüberschreitung bei der Anfrage"
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "Umgeleitet"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr "Anruf fehlgeschlagen."
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "Registrierung auf %s erfolgreich."
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "Abmeldung von %s ist erfolgt."
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "Zeitüberschreitung bei der Antwort"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "Registrierung auf %s fehlgeschlagen: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr "Service nicht verfügbar, versuche erneut"
|
||||
|
||||
|
|
@ -2009,7 +2009,7 @@ msgstr "Service nicht verfügbar, versuche erneut"
|
|||
msgid "Authentication token is %s"
|
||||
msgstr "Authentifizierungs-Token ist %s"
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/es.po
138
po/es.po
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -89,36 +89,36 @@ msgstr "Yo"
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "No se pudo encontrar el archivo pixmap: %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "¡Contacto SIP no válido!"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr ""
|
||||
"registra a stdout cierta información de depuración durante la ejecución."
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr "ruta a un fichero donde escribir logs."
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "Iniciar sólo en la barra de tareas, no mostrar la interfaz principal."
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "dirección a la que llamar inmediatamente"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "si está activo, responder a llamadas entrantes automáticamente"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
|
|
@ -126,19 +126,19 @@ msgstr ""
|
|||
"Especifique un directorio de trabajo (debería ser la raíz de la instalación, "
|
||||
"ej: c:\\Archivos de Programa\\Linphone)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -151,66 +151,66 @@ msgstr ""
|
|||
"contactos?\n"
|
||||
"Si responde no, esta persona será bloqueada temporalmente."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
" at realm <i>%s</i>:"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "Llamada entrante"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "Contestar"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "Enlace a la Web"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Linphone - un video-teléfono a través de Internet"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (Opción predeterminada)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "Somos transferidos a %s"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -218,7 +218,7 @@ msgstr ""
|
|||
"No se ha encontrado una tarjeta de sonido en este equipo.\n"
|
||||
"No será posible realizar o recibir llamadas de audio."
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "Un video-teléfono SIP gratuito"
|
||||
|
||||
|
|
@ -744,7 +744,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "Por favor, introduzca los datos de inicio de sesión para %s"
|
||||
|
|
@ -1705,60 +1705,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "Buscando el número de teléfono del destinatario…"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "No se ha podido resolver este número."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr "Disculpe, se ha alcanzado el máximo número de llamadas simultáneas"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr "y ha solicitado auto respuesta."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "Modificando parámetros de llamada…"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "Conectado."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "No se pudo pausar la llamada"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "Pausando la llamada actual..."
|
||||
|
||||
|
|
@ -1844,112 +1844,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "Medios iniciales."
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr "La llamada con %s está puesta en pausa."
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr "Llamada respondida por %s - en espera."
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr ""
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr ""
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "El usuario está ocupado."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "El usuario no está disponible temporalmente."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "El usuario no quiere que le molesten."
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "Llamada rechazada."
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "Redigirida"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "timeout sin respuesta"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1959,7 +1959,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
140
po/fr.po
140
po/fr.po
|
|
@ -12,8 +12,8 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\n"
|
||||
"PO-Revision-Date: 2015-02-17 11:30+0000\n"
|
||||
"POT-Creation-Date: 2015-03-11 16:26+0100\n"
|
||||
"PO-Revision-Date: 2015-02-17 14:38+0000\n"
|
||||
"Last-Translator: Belledonne Communications <support@belledonne-"
|
||||
"communications.com>\n"
|
||||
"Language-Team: French (http://www.transifex.com/projects/p/linphone-gtk/"
|
||||
|
|
@ -96,35 +96,35 @@ msgstr "Moi"
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "Icone non trouvée: %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "Contact sip invalide !"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr "affiche des informations de debogage"
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr "chemin vers le fichier de logs."
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr "Démarrer linphone avec la vidéo désactivée."
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "Démarre iconifié, sans interface principale."
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "adresse à appeler maintenant"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "si positionné, répond automatiquement aux appels entrants"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
|
|
@ -132,19 +132,19 @@ msgstr ""
|
|||
"Spécifie un répertoire de travail (qui devrait être le répertoire "
|
||||
"d'installation, par exemple c:\\Program Files\\Linphone)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr "Ficher de configuration"
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr "Démarre l'assistant audio"
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr "Exécuter le test local et retourner 0 en cas de succès"
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -158,7 +158,7 @@ msgstr ""
|
|||
"Si vous répondez non, cette personne sera mise temporairement sur liste "
|
||||
"noire."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
|
|
@ -167,59 +167,59 @@ msgstr ""
|
|||
"Entrez le mot de passe pour <i>%s</i>\n"
|
||||
" sur le domaine <i>%s</i>:"
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr "Erreur lors de l'appel"
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "Appel terminé."
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "Appel entrant"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "Répondre"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "Refuser"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr "Appel en pause"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr "b>par %s</b>"
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr "%s propose de démarrer la vidéo. Acceptez-vous ?"
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "Lien site web"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Linphone - un téléphone video pour l'internet"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (par défaut)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "Transfert vers %s"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -227,7 +227,7 @@ msgstr ""
|
|||
"Aucune carte son n'a été détectée sur cet ordinateur.\n"
|
||||
"Vous ne pourrez pas effectuer d'appels audio."
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "Un visiophone libre"
|
||||
|
||||
|
|
@ -770,7 +770,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr "(en attente)"
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "Entrez vos identifiants pour %s"
|
||||
|
|
@ -1754,60 +1754,60 @@ msgstr ""
|
|||
"Veuillez patenter un instant pendant le chargement de la configuration "
|
||||
"distante..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "Prêt."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr "Configuration en cours"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "Recherche de la destination du numéro de téléphone..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "La destination n'a pu être trouvée."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "Appel de"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr "Echec de l'appel"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr "Désolé, le nombre maximum d'appels simultanés est atteint."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr "vous appelle"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr "et sollicite un décrochage automatique."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "Modifications des paramètres d'appels..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "En ligne."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr "Appel abandonné"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "La mise en attente a échoué"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "Mise en attente de l'appel..."
|
||||
|
||||
|
|
@ -1893,112 +1893,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "Echec de la connexion en tant que %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "Sonnerie distante."
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr "Sonnerie distante..."
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "Prise d'appel anticipée."
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr "%s est maintenant en attente."
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr "Appel répondu par %s - en attente"
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr "Appel repris."
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr "Appel répondu par %s."
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr "Incompatible, vérfiez les codecs ou les paramètres de sécurité..."
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr "Paramètres media incompatibles."
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr "Appel repris."
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr "L'appel a été mis en attente."
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr "L'appel est modifié par la partie distante."
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "Appel terminé."
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "Occupé..."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "L'usager est temporairement indisponible."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "L'usager ne souhaite pas être dérangé"
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "Appel décliné."
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr "Délai d'attente de la requête dépassé."
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "Redirection"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr "L'appel a échoué."
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "Enregistrement sur %s effectué."
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "Désenregistrement sur %s effectué."
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "Pas de réponse"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "Echec de l'enregistrement sur %s: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr "Service indisponible, nouvelle tentative"
|
||||
|
||||
|
|
@ -2008,7 +2008,7 @@ msgstr "Service indisponible, nouvelle tentative"
|
|||
msgid "Authentication token is %s"
|
||||
msgstr "Le jeton d'authentification est %s"
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
146
po/he.po
146
po/he.po
|
|
@ -4,6 +4,7 @@
|
|||
#
|
||||
# Translators:
|
||||
# Eli Zaretskii <eliz@gnu.org>, 2012
|
||||
# Gautier Pelloux-Prayer <gautier.pelloux@gmail.com>, 2015
|
||||
# GenghisKhan <genghiskhan@gmx.ca>, 2014
|
||||
# GenghisKhan <genghiskhan@gmx.ca>, 2014
|
||||
# GenghisKhan <genghiskhan@gmx.ca>, 2012-2013
|
||||
|
|
@ -11,10 +12,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\n"
|
||||
"PO-Revision-Date: 2015-02-17 11:28+0000\n"
|
||||
"Last-Translator: Belledonne Communications <support@belledonne-"
|
||||
"communications.com>\n"
|
||||
"POT-Creation-Date: 2015-03-11 16:26+0100\n"
|
||||
"PO-Revision-Date: 2015-03-11 15:33+0000\n"
|
||||
"Last-Translator: Gautier Pelloux-Prayer <gautier.pelloux@gmail.com>\n"
|
||||
"Language-Team: Hebrew (http://www.transifex.com/projects/p/linphone-gtk/"
|
||||
"language/he/)\n"
|
||||
"Language: he\n"
|
||||
|
|
@ -95,53 +95,53 @@ msgstr "אני"
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "לא ניתן למצוא קובץ pixmap: %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "כתובת sip לא תקפה !"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -154,7 +154,7 @@ msgstr ""
|
|||
"שלך ?\n"
|
||||
"היה ותשובתך תהיה לא, אדם זה יהיה מסומן באופן זמני ברשימה השחורה."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
|
|
@ -163,59 +163,59 @@ msgstr ""
|
|||
"אנא הזן סיסמה עבור משתמש <i>%s</i>\n"
|
||||
"במתחם <i>%s</i>:"
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr "שגיאת קריאה"
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "שיחה הסתיימה"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "קריאה נכנסת"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "לענות"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "לדחות"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr "שיחה הושהתה"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr "<b>על ידי %s</b>"
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr "%s רוצה להתחיל וידאו. האם אתה מסכים ?"
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "קישור אתר רשת"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Linphone - וידאופון אינטרנטי"
|
||||
msgstr "Linphone - וידאופון אינטרנטי"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (ברירת מחדל)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "אנחנו מועברים אל %s"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -223,7 +223,7 @@ msgstr ""
|
|||
"לא אותרו כרטיסי קול במחשב זה.\n"
|
||||
"לא תהיה ביכולתך לשלוח או לקבל שיחות אודיו."
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "וידאופון SIP חופשי"
|
||||
|
||||
|
|
@ -759,7 +759,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr "(מושהה)"
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "נא להזין מידע התחברות עבור %s"
|
||||
|
|
@ -1718,60 +1718,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "מוכן"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "מחפש כעת עבור יעד מספר טלפון..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "לא ניתן לפתור את מספר זה."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "מתקשר כעת"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr "לא ניתן להתקשר"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr "הגענו אל המספר המרבי של שיחות מקבילות, עמך הסליחה"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr "מתקשר/ת אליך"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr " ומבקש/ת מענה אוטומטי."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "מתאים כעת פרמטרים של שיחה..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "מקושר."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr "קריאה בוטלה"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "לא ניתן להשהות את השיחה"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "משהה כעת שיחה נוכחית..."
|
||||
|
||||
|
|
@ -1855,112 +1855,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "לא ניתן להתחבר בזהות %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "צלצול מרוחק."
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr "צלצול מרוחק..."
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "מדיה מוקדמת."
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr "שיחה עם %s מושהית."
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr "קריאה נענתה על ידי %s - בהמתנה."
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr "קריאה חודשה."
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr "קריאה נענתה על ידי %s."
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr "חוסר תאימות, בדוק קודקים או הגדרות אבטחה..."
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr "פרמטריי מדיה חסרי תואמים."
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr "חזרנו."
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr "אנו מושהים על ידי צד אחר."
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr "שיחה עודכנה מרחוק."
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "קריאה הסתיימה."
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "משתמש עסוק כעת."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "משתמש לא זמין זמנית."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "משתמש לא מעוניין שיפריעו לו."
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "קריאה סורבה."
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "מכוון מחדש"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr "קריאה נכשלה."
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "רישום אצל %s הושלם בהצלחה."
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "אי רישום אצל %s סוים."
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "אין היענות תוך זמן מוגדר"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "רישום אצל %s נכשל: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1970,7 +1970,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr "אות האימות הינה %s"
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/hu.po
138
po/hu.po
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -89,35 +89,35 @@ msgstr "én"
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "Nemtalálható a pixmap fájl: %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "Érvénytelen sip partner !"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr "Futás közben némi hibakeresési információ az stdout-ra naplózása."
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr "fájl elérési útja, melybe a naplók kerülnek."
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr "Linphone indítása, videó kikpacsolva. "
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "Csak a tálcaikon indítása, ne mutassa a fő ablakot."
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "Cím azonnali híváshoz"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "Bekapcsolva automatikusan válaszol a bejövő hívásokra"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
|
|
@ -125,19 +125,19 @@ msgstr ""
|
|||
"Adjon meg egy munkakönyvtárat (ennek az installációs könyvtárnak kéne "
|
||||
"lennie, pl. C:\\Program Files\\Linphone)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -150,66 +150,66 @@ msgstr ""
|
|||
"szeretné adni a partnerlistához?\n"
|
||||
"Ha nemmel válaszol, ez a személy átmenetileg tiltólistára kerül."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
" at realm <i>%s</i>:"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr "Hiba a hívás közben"
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "Hívás vége"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "Beérkező hívás"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "Hívás fogadása"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "Elutasítás"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr "Hívás várakoztatva"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr "<b>a következő által: %s</b>"
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr "%s szerené elidítani a videót. Elfogadja?"
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "Internetes oldal"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Linphone - internetes videó telefon"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (Alapértelmezett)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "Át vagyunk irányítva ide: %s"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -217,7 +217,7 @@ msgstr ""
|
|||
"Hangkártya nincs érzékelve ezen a számítógépen.\n"
|
||||
"Nem fog tudni hang hívásokat küldeni vagy fogadni."
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "Egy ingyenes SIP video-telefon"
|
||||
|
||||
|
|
@ -757,7 +757,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr "(Várakoztatva)"
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "Kérem, adja meg a bejelentkezési információt %s -hoz"
|
||||
|
|
@ -1718,60 +1718,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "Kész"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "Telefonszám-cél keresése..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "Nem sikkerült értelmezni a számot."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "Kapcsolódás"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr "Nem sikerült hívni"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr "Elnézést, elértük a egyidejű hívások maximális számát"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr "kapcsolatba lépett veled."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr "és automatikus választ kért."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "A hívási jellemzők módosítása..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "Kapcsolódva."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr "Hívás megszakítva"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "Nem sikerült várakoztatni a hívást"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "Jelenlegi hívás várakoztatásának aktiválása..."
|
||||
|
||||
|
|
@ -1857,113 +1857,113 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "Nem sikerült belépni ezzel: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "Távoli csengés."
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr "Távoli csengés..."
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "Korai médiák."
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr "A hívás a következővel: %s várakoztatva"
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr "%s fogadta a hívást - várakoztatva."
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr "Hívás visszatért"
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr "%s válaszolt a hívásra."
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr ""
|
||||
"Nem kompatibilis, ellenőrizze a kódek- vagy a biztonsági beállításokat..."
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr "Nem kompatibilis médiajellemzők."
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr "Visszatértünk."
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr "Megállítva a másik fél által."
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr "A hívás távolról frissítve."
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "A hívás befejezve."
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "A felhasználó foglalt."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "A felhasználó ideiglenesen nem elérhető"
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "A felhasználó nem akarja, hogy zavarják."
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "Hívás elutasítva"
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "Átirányítva"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr "Nem sikerült a hívás."
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "A regisztáció a %s -n sikerült."
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "A kiregisztrálás kész a következőn: %s ."
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "időtúllépés után nincs válasz"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "A regisztáció a %s -n nem sikerült: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1973,7 +1973,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr "Hitelesítési jel: %s"
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/it.po
138
po/it.po
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -89,53 +89,53 @@ msgstr ""
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "Contatto SIP non valido"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -147,72 +147,72 @@ msgstr ""
|
|||
"veda il tuo stato o aggiungerlo alla tua lista dei contatti Se rispondi no "
|
||||
"questo utente sarà momentaneamente bloccato."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
" at realm <i>%s</i>:"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "Chiamata terminata"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "Chimata in entrata"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "Rifiuta"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (Default)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
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:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -740,7 +740,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "Prego inserire le proprie credenziali di accesso per %s"
|
||||
|
|
@ -1698,60 +1698,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "Pronto"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "Ricerca numero destinazione..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "Impossibile risolvere il numero."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "In connessione"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "Connessione"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1836,112 +1836,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "impossibile login come %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr ""
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr ""
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "Chiamata terminata."
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "Utente occupato"
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "Utente non disponibile"
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "L'utente non vuole essere disturbato"
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "Chiamata rifiutata"
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "Registrazione su %s attiva"
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "Unregistrazione su %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "timeout no risposta"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "Registrazione su %s fallita: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1951,7 +1951,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/ja.po
138
po/ja.po
|
|
@ -9,7 +9,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -91,35 +91,35 @@ msgstr "自分"
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "pixmapファイルが見つかりません %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "無効なSIP接続です!"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr "実行中にいくつかのデバッグ情報をstdoutに送信します。"
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr "ログを書き込むファイルへのパス。"
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr "ビデオを無効にしてLinphoneを開始します。"
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "主なインターフェイスを表示しないでシステムトレイに移動します。"
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "今すぐに呼び出す"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "着信呼び出しが設定されている場合自動的に応答する"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
|
|
@ -127,19 +127,19 @@ msgstr ""
|
|||
"作業ディレクトリをSpecifiy (インストールした時のベースである必要があります。"
|
||||
"例:c:\\Program Files\\Linphone)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr "設定ファイル"
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr "オーディオアシスタントを実行"
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -152,72 +152,72 @@ msgstr ""
|
|||
"す。\n"
|
||||
"あなたが拒否すると、この人は一時的にブラックリストへ登録されます。"
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
" at realm <i>%s</i>:"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr "呼出エラー"
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "呼出終了"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "着信"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "応答"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "拒否"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr "呼び出しの一時停止"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr "<b>%s</b>"
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "ウェブサイトリンク"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Linphone - ビデオインターネット電話"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (デフォルト)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "%s に転送しました"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
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:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "無料 SIP ビデオ-電話"
|
||||
|
||||
|
|
@ -752,7 +752,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr "(停止中)"
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr ""
|
||||
|
|
@ -1723,60 +1723,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "準備"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr ""
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr "と自動応答を尋ねる"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "コールパラメーターの変更..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "接続しました。"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr "呼び出しを打ち切る"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "呼び出しを一時停止できませんでした"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "現在の通話を一時停止..."
|
||||
|
||||
|
|
@ -1857,112 +1857,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "Early media."
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr ""
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr ""
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "呼び出し終了。"
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "相手はビジーです。"
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "相手は、今出られません。"
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "相手は手が離せないようです。"
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "通話は拒否されました。"
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr "リクエストは時間切れです。"
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1972,7 +1972,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/nb_NO.po
138
po/nb_NO.po
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -90,35 +90,35 @@ msgstr ""
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "Fant ikke pixmap fli: %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "Ugyldig SIP kontakt !"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr "skriv logg-informasjon under kjøring"
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "Start skjult i systemkurven, ikke vis programbildet."
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "address som skal ringes nå"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "besvarer innkommende samtaler automatisk om valgt"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
|
|
@ -126,19 +126,19 @@ msgstr ""
|
|||
"Spesifiser arbeidsmappe (bør være base for installasjonen, f.eks: c:"
|
||||
"\\Programfiler\\Linphone)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -151,66 +151,66 @@ msgstr ""
|
|||
"din kontaktliste?\n"
|
||||
"Hvis du svarer nei vil personen bli svartelyst midlertidig."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
" at realm <i>%s</i>:"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "Samtale avsluttet"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "Innkommende samtale"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "Svarer"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "Avvis"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "Peker til nettsted"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Linphone - en video Internet telefon"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (Standard)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "Vi er overført til %s"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -218,7 +218,7 @@ msgstr ""
|
|||
"Klarte ikke å finne noe lydkort på denne datamaskinen.\n"
|
||||
"Du vil ikke kunne sende eller motta lydsamtaler."
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "En gratis SIP video-telefon"
|
||||
|
||||
|
|
@ -746,7 +746,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "Skriv inn påloggingsinformasjon for %s:"
|
||||
|
|
@ -1705,60 +1705,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "Klar"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "Ser etter telefonnummer for destinasjonen..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "Kan ikke tilkoble dette nummeret."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "Tilknytter"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr "Kunne ikke ringe"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr "Beklager, du har nådd maksimalt antall samtidige samtaler"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr "Kontakter deg."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr " og ba om autosvar."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "Endrer ringeparametre..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "Tilkoblet"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr "Samtale avbrutt"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "Kunne ikke pause samtalen"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "Pauser nåværende samtale"
|
||||
|
||||
|
|
@ -1843,112 +1843,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "Ikke ikke logge inn som %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "Ringer hos motparten."
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "Tidlig media"
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr "Samtalen med %s er pauset."
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr "Samtale besvart av %s - på vent."
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr "Samtale gjenopptatt."
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr "Samtale besvart av %s."
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr ""
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr ""
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "Samtale avsluttet."
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "Brukeren er opptatt."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "Brukeren er midlertidig ikke tilgjengelig."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "Brukeren vil ikke bli forstyrret."
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "Samtale avvist."
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "Omdirigert"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr "Samtale feilet."
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "Registrering hos %s lykkes."
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "Avregistrering hos %s lykkes."
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "ingen svar innen angitt tid"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "Registrering hos %s mislykkes: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1958,7 +1958,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/pl.po
138
po/pl.po
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -92,53 +92,53 @@ msgstr ""
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "Nie można znaleźć pixmapy: %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -147,72 +147,72 @@ msgid ""
|
|||
"If you answer no, this person will be temporarily blacklisted."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
" at realm <i>%s</i>:"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
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:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -739,7 +739,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr ""
|
||||
|
|
@ -1696,60 +1696,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr ""
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "Połączony"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1830,112 +1830,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr ""
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr ""
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "Osoba jest zajęta."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "Osoba jest tymczasowo niedostępna."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "Osoba nie chce, aby jej przeszkadzać."
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "Rozmowa odrzucona."
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1945,7 +1945,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/pt_BR.po
138
po/pt_BR.po
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -89,53 +89,53 @@ msgstr ""
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "Não é possível achar arquivo pixmap: %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -144,72 +144,72 @@ msgid ""
|
|||
"If you answer no, this person will be temporarily blacklisted."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
" at realm <i>%s</i>:"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "Camadas recebidas"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
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:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -735,7 +735,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr ""
|
||||
|
|
@ -1692,60 +1692,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "Procurando por telefone de destino..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
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:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "Conectado."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1826,112 +1826,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr ""
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr ""
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "Usuário está ocupado."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "Usuário está temporáriamente indisponível."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1941,7 +1941,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
147
po/ru.po
147
po/ru.po
|
|
@ -12,10 +12,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\n"
|
||||
"PO-Revision-Date: 2015-02-17 11:28+0000\n"
|
||||
"Last-Translator: Belledonne Communications <support@belledonne-"
|
||||
"communications.com>\n"
|
||||
"POT-Creation-Date: 2015-03-11 16:26+0100\n"
|
||||
"PO-Revision-Date: 2015-02-18 18:31+0000\n"
|
||||
"Last-Translator: AlexL <loginov.alex.valer@gmail.com>\n"
|
||||
"Language-Team: Russian (http://www.transifex.com/projects/p/linphone-gtk/"
|
||||
"language/ru/)\n"
|
||||
"Language: ru\n"
|
||||
|
|
@ -99,37 +98,37 @@ msgstr "Мне"
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "Невозможно найти графический файл: %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "Неверный sip контакт!"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr ""
|
||||
"Вывод некоторой отладочной информации на устройство стандартного вывода во "
|
||||
"время работы."
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr "Путь к файлу для записи логов."
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr "Запуск linphone с видео отключен."
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "Показывать только в системном лотке, не запуская главное окно."
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "Адрес для звонка прямо сейчас."
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "Если установлено, то автоматический приём входящих звонков."
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
|
|
@ -137,19 +136,19 @@ msgstr ""
|
|||
"Определить рабочий каталог (относительно каталога установки, например: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr "Файл конфигурации"
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr "Запустить помощника аудио"
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr "Запустить самотест и выйти при успехе со статусом 0"
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -162,7 +161,7 @@ msgstr ""
|
|||
"контактный лист?\n"
|
||||
"Если вы ответите Нет, эта персона будет временно в чёрном списке."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
|
|
@ -171,59 +170,59 @@ msgstr ""
|
|||
"Пожалуйста, введите пароль для пользователя <i>%s</i>\n"
|
||||
" для реалм (рилм) <i>%s</i>:"
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr "Ошибка звонка"
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "Звонок окончен"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "Входящий звонок"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "Ответ"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "Отклонить"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr "Звонок приостановлен"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr "<b>%s</b>"
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr "%s предложил запустить видео. Вы принимаете?"
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "Домашняя страница"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Linphone - интернет видео телефон"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (по умолчанию)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "Мы передали в %s"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -231,7 +230,7 @@ msgstr ""
|
|||
"Звуковые карты не были обнаружены на этом компьютере.\n"
|
||||
"Вы не сможете отправлять или получать аудио звонки."
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "Свободный SIP видео-телефон"
|
||||
|
||||
|
|
@ -397,7 +396,7 @@ msgstr "SRTP"
|
|||
|
||||
#: ../gtk/propertybox.c:1246
|
||||
msgid "DTLS"
|
||||
msgstr ""
|
||||
msgstr "DTLS"
|
||||
|
||||
#: ../gtk/propertybox.c:1253
|
||||
msgid "ZRTP"
|
||||
|
|
@ -712,7 +711,7 @@ msgstr "Защищённые с помощью SRTP"
|
|||
|
||||
#: ../gtk/incall_view.c:685
|
||||
msgid "Secured by DTLS"
|
||||
msgstr ""
|
||||
msgstr "Защищённые с помощью DTLS"
|
||||
|
||||
#: ../gtk/incall_view.c:691
|
||||
#, c-format
|
||||
|
|
@ -776,7 +775,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr "(Пауза)"
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "Пожалуйста, введите информацию для входа %s:"
|
||||
|
|
@ -1756,61 +1755,61 @@ msgstr "Конфигурирование..."
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr "Пожалуйста, подождите пока получается конфигурация с сервера..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "Готов"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr "Конфигурирование"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "Поиск назначения для телефонного номера.."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "Не получилось принять решение по этому номеру."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "Соединение"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr "Невозможно позвонить"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr ""
|
||||
"К сожалению, мы достигли максимального количества одновременных звонков"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr "контактирует с вами"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr "и спросил автоматический ответ."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "Изменение параметров звонка..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "Соединён."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr "Звонок отменён"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "Невозможно приостановить звонок"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "Приостановка текущего звонка..."
|
||||
|
||||
|
|
@ -1896,112 +1895,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "Невозможно зайти как: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "Дистанционный звонок."
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr "Дистанционный звонок..."
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "Предответное проключение."
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr "Звонок с %s приостановлен."
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr "На звонок ответил %s - на удержании."
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr "Звонок возобновлён."
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr "На звонок ответил %s."
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr "Несовместимость, проверьте кодеки или параметры безопасности..."
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr "Несовместимость медиа-параметров."
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr "Мы возобновили."
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr "Мы приостановлены другой стороной."
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr "Звонок был дистанционно обновлён."
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "Звонок прерван."
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "Пользователь занят."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "Пользователь временно недоступен."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "Пользователь не хочет чтобы его беспокоили."
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "Звонок отклонён."
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr "Таймаут запроса."
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "Переадресован"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr "Звонок не удался."
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "Регистрация на %s прошла успешно."
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "Отмена регистрации на %s завершена."
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "время ожидания истекло"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "Регистрация на %s не удалась: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr "Сервис недоступен, повтор"
|
||||
|
||||
|
|
@ -2011,7 +2010,7 @@ msgstr "Сервис недоступен, повтор"
|
|||
msgid "Authentication token is %s"
|
||||
msgstr "Маркер проверки подлинности: %s"
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/sr.po
138
po/sr.po
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -95,35 +95,35 @@ msgstr "Ја"
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "Не могу да пронађем датотеку сличице: %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "Неисправан сип контакт !"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr "бележи на стандардни излаз неке податке прочишћавања док ради."
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr "путања до датотеке за уписивање дневника."
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr "Покреће линфон са искљученим видеом."
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "Покреће се само у системској фиоци, не приказује главно сучеље."
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "адреса за позивање управо сада"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "ако је подешено сам ће се јављати на долазне позиве"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
|
|
@ -131,19 +131,19 @@ msgstr ""
|
|||
"Наводи радни директоријум (треба да буде основа инсталације, нпр: „c:"
|
||||
"\\Program Files\\Linphone“)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr "Датотека подешавања"
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr "Покреће помоћника звука"
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr "Покреће самоиспробавање и излази 0 ако је успешно"
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -157,7 +157,7 @@ msgstr ""
|
|||
"Ако одговорите са не, ова особа ће привремено бити стављена на списак "
|
||||
"забрана."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
|
|
@ -166,59 +166,59 @@ msgstr ""
|
|||
"Унесите вашу лозинку за корисничко име <i>%s</i>\n"
|
||||
" на подручју <i>%s</i>:"
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr "Грешка позива"
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "Позив је завршен"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "Долазни позив"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "Јави се"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "Одбиј"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr "Позив је заустављен"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr "<b>од %s</b>"
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr "%s предлаже да започнете видео. Да ли прихватате ?"
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "Веза веб сајта"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Линфон — интернет телефон са снимком"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (основно)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "Преселили смо се на %s"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -226,7 +226,7 @@ msgstr ""
|
|||
"Ниједна звучна картица није откривена на овом рачунару.\n"
|
||||
"Нећете бити у могућности да шаљете или да примате звучне позиве."
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "Слободан СИП телефон са снимком"
|
||||
|
||||
|
|
@ -768,7 +768,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr "(Паузирано)"
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "Унесите податке пријављивања за %s"
|
||||
|
|
@ -1748,60 +1748,60 @@ msgstr "Подешавам..."
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr "Сачекајте док довучем подешавања са сервера..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "Спреман"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr "Подешавам"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "Тражим одредиште телефонског броја..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "Не могу да решим овај број."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "Ступам у везу"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr "Не могу да позовем"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr "Извините, достигли смо највећи број истовремених позива"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr "вам се обраћа"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr " и затражени само-одговор."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "Мењам параметре позива..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "Повезан сам."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr "Позив је прекинут"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "Не могу да зауставим позив"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "Заустављам тренутни позив..."
|
||||
|
||||
|
|
@ -1887,112 +1887,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "Не могу да се пријавим као %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "Удаљено звоњење."
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr "Удаљено звоњење..."
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "Ранији медиј."
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr "Позив са „%s“ је заустављен."
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr "Позив на који је одговорио „%s“ — на чекању."
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr "Позив је настављен."
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr "На позив је одговорио „%s“."
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr "Несагласно, проверите кодеке или безбедносна подешавања..."
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr "Медијски параметри су несагласни."
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr "Наставили смо."
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr "Друга страна нас је паузирала."
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr "Позив је освежен удаљеним."
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "Позив је завршен."
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "Корисник је заузет."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "Корисник је привремено недоступан."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "Корисник не жели да буде узнемираван."
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "Позив је одбијен."
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr "Истекло је време захтева."
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "Преусмерен"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr "Позив није успео."
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "Уписивање на „%s“ је успело."
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "Исписивање са „%s“ је обављено."
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "нема ограничења одговора"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "Уписивање на „%s“ није успело: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr "Услуга није доступна, поново покушавам"
|
||||
|
||||
|
|
@ -2002,7 +2002,7 @@ msgstr "Услуга није доступна, поново покушавам"
|
|||
msgid "Authentication token is %s"
|
||||
msgstr "Симбол потврђивања идентитета је „%s“"
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/sv.po
138
po/sv.po
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -89,35 +89,35 @@ msgstr ""
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "Kunde inte hitta pixmap filen: %s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "ogiltig SIP kontakt!"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr "skriv loggning information under körning"
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "Starta ikonifierat, visa inte huvudfönstret"
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "Samtalsmottagare"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "Om på, besvara automatisk alla inkommande samtal"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
|
|
@ -125,19 +125,19 @@ msgstr ""
|
|||
"Välj en arbetskatalog som ska vara basen för installationen, såsom C:"
|
||||
"\\Program\\Linphone"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -150,72 +150,72 @@ msgstr ""
|
|||
"henne till din kontaktlista?\n"
|
||||
"Om du svarar nej, personen kommer att vara bannlyst."
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
" at realm <i>%s</i>:"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "Samtalet slut"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "Inkommande samtal"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "Avböj"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "Webbsajt"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Linphone - en video Internet telefon"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (Default)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
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:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "En gratis SIP video-telefon"
|
||||
|
||||
|
|
@ -743,7 +743,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "Mata in ditt lösenord för domänen %s:"
|
||||
|
|
@ -1701,60 +1701,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "Redo"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "Leta efter telefonnummer för destinationen..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "Kan inte nå dett nummer."
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "Kontaktar"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "Kopplad"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1839,112 +1839,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "Kunde inte logga in som %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "Ringer hos motparten."
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "Tidig media"
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr ""
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr ""
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "Samtalet slut."
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "Användare upptagen."
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "Användaren temporärt inte tillgänglig."
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "Användaren vill inte bli störd."
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "Samtalet avböjdes."
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "Registrering hos %s lyckades."
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "Avregistrering hos %s lyckades."
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "Inget svar inom angiven tid"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "Registrering hos %s mislyckades: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1954,7 +1954,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/zh_CN.po
138
po/zh_CN.po
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -87,53 +87,53 @@ msgstr ""
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "无法打开位图文件:%s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "无效的 SIP 联系人!"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr "运行时向标准输出记录调试信息。"
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "启动到系统托盘,不显示主界面。"
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "现在呼叫的地址"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "是否设置呼叫自动应答"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
msgstr "指定工作目录(应为安装目录例如 C:\\Program Files\\Linphone)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -145,66 +145,66 @@ msgstr ""
|
|||
"您是否允许他看到您的在线状态或者将它加为您的联系人允许?\n"
|
||||
"如果您回答否,则会将该人临时性的放入黑名单"
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
" at realm <i>%s</i>:"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "呼叫结束"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "呼入"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "拒绝"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "网站"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Linphone - 互联网视频电话"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (默认)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -212,7 +212,7 @@ msgstr ""
|
|||
"未在此计算机上检测到声卡。\n"
|
||||
"您无法发送或接收音频呼叫。"
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "免费的 SIP 视频电话"
|
||||
|
||||
|
|
@ -739,7 +739,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "请输入 %s 的登录信息"
|
||||
|
|
@ -1696,60 +1696,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "就绪"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "查询电话号码目的地..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "该号码无法解析。"
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "联系中"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr "正在联系您"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr " 并询问了自动回答。"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "已连接。"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1832,112 +1832,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "无法登录为 %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "响铃。"
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr ""
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr ""
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "通话结束。"
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "被叫正忙。"
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "您呼叫的用户暂时无法接通。"
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "用户已开启免打扰功能。"
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "呼叫被拒绝。"
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "已重定向"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr "呼叫失败。"
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "成功注册到 %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "已在 %s 解除注册。"
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "没有响应,超时"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "注册到 %s 失败: %s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1947,7 +1947,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
138
po/zh_TW.po
138
po/zh_TW.po
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: linphone-gtk\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-02-17 12:28+0100\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"
|
||||
|
|
@ -87,54 +87,54 @@ msgstr ""
|
|||
msgid "Couldn't find pixmap file: %s"
|
||||
msgstr "找不到 pixmap 檔:%s"
|
||||
|
||||
#: ../gtk/chat.c:367 ../gtk/friendlist.c:924
|
||||
#: ../gtk/chat.c:374 ../gtk/friendlist.c:924
|
||||
msgid "Invalid sip contact !"
|
||||
msgstr "無效的 sip 連絡人!"
|
||||
|
||||
#: ../gtk/main.c:109
|
||||
#: ../gtk/main.c:137
|
||||
msgid "log to stdout some debug information while running."
|
||||
msgstr "執行時將一些除錯資訊記錄到標準輸出。"
|
||||
|
||||
#: ../gtk/main.c:116
|
||||
#: ../gtk/main.c:138
|
||||
msgid "path to a file to write logs into."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:123
|
||||
#: ../gtk/main.c:139
|
||||
msgid "Start linphone with video disabled."
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:130
|
||||
#: ../gtk/main.c:140
|
||||
msgid "Start only in the system tray, do not show the main interface."
|
||||
msgstr "只在系統匣啟動,不要顯示主要介面。"
|
||||
|
||||
#: ../gtk/main.c:137
|
||||
#: ../gtk/main.c:141
|
||||
msgid "address to call right now"
|
||||
msgstr "現在要打電話的位址"
|
||||
|
||||
#: ../gtk/main.c:144
|
||||
#: ../gtk/main.c:142
|
||||
msgid "if set automatically answer incoming calls"
|
||||
msgstr "如啟用此項,將會自動接聽來電"
|
||||
|
||||
#: ../gtk/main.c:151
|
||||
#: ../gtk/main.c:143
|
||||
msgid ""
|
||||
"Specifiy a working directory (should be the base of the installation, eg: c:"
|
||||
"\\Program Files\\Linphone)"
|
||||
msgstr ""
|
||||
"指定一個工作目錄(應該為安裝的根目錄,例如:c:\\Program Files\\Linphone)"
|
||||
|
||||
#: ../gtk/main.c:158
|
||||
#: ../gtk/main.c:144
|
||||
msgid "Configuration file"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:165
|
||||
#: ../gtk/main.c:145
|
||||
msgid "Run the audio assistant"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:172
|
||||
#: ../gtk/main.c:146
|
||||
msgid "Run self test and exit 0 if succeed"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1088
|
||||
#: ../gtk/main.c:1061
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%s would like to add you to his contact list.\n"
|
||||
|
|
@ -146,66 +146,66 @@ msgstr ""
|
|||
"您是否要允許他看見您的上線狀態或將他加入您的連絡人清單?\n"
|
||||
"如果您回答否,這個人會被暫時列入黑名單。"
|
||||
|
||||
#: ../gtk/main.c:1165
|
||||
#: ../gtk/main.c:1138
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please enter your password for username <i>%s</i>\n"
|
||||
" at realm <i>%s</i>:"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1286
|
||||
#: ../gtk/main.c:1259
|
||||
msgid "Call error"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1289 ../coreapi/linphonecore.c:3787
|
||||
#: ../gtk/main.c:1262 ../coreapi/linphonecore.c:3791
|
||||
msgid "Call ended"
|
||||
msgstr "通話已結束"
|
||||
|
||||
#: ../gtk/main.c:1292 ../coreapi/call_log.c:221
|
||||
#: ../gtk/main.c:1265 ../coreapi/call_log.c:221
|
||||
msgid "Incoming call"
|
||||
msgstr "來電"
|
||||
|
||||
#: ../gtk/main.c:1294 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
#: ../gtk/main.c:1267 ../gtk/incall_view.c:532 ../gtk/main.ui.h:5
|
||||
msgid "Answer"
|
||||
msgstr "接聽"
|
||||
|
||||
#: ../gtk/main.c:1296 ../gtk/main.ui.h:6
|
||||
#: ../gtk/main.c:1269 ../gtk/main.ui.h:6
|
||||
msgid "Decline"
|
||||
msgstr "拒接"
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
msgid "Call paused"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1302
|
||||
#: ../gtk/main.c:1275
|
||||
#, c-format
|
||||
msgid "<b>by %s</b>"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1372
|
||||
#: ../gtk/main.c:1345
|
||||
#, c-format
|
||||
msgid "%s proposed to start video. Do you accept ?"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/main.c:1534
|
||||
#: ../gtk/main.c:1507
|
||||
msgid "Website link"
|
||||
msgstr "網站連結"
|
||||
|
||||
#: ../gtk/main.c:1583
|
||||
#: ../gtk/main.c:1556
|
||||
msgid "Linphone - a video internet phone"
|
||||
msgstr "Linphone - 網路視訊電話"
|
||||
|
||||
#: ../gtk/main.c:1675
|
||||
#: ../gtk/main.c:1648
|
||||
#, c-format
|
||||
msgid "%s (Default)"
|
||||
msgstr "%s (預設值)"
|
||||
|
||||
#: ../gtk/main.c:2007 ../coreapi/callbacks.c:1027
|
||||
#: ../gtk/main.c:1980 ../coreapi/callbacks.c:1045
|
||||
#, c-format
|
||||
msgid "We are transferred to %s"
|
||||
msgstr "我們被轉接到 %s"
|
||||
|
||||
#: ../gtk/main.c:2017
|
||||
#: ../gtk/main.c:1990
|
||||
msgid ""
|
||||
"No sound cards have been detected on this computer.\n"
|
||||
"You won't be able to send or receive audio calls."
|
||||
|
|
@ -213,7 +213,7 @@ msgstr ""
|
|||
"在這臺電腦中偵測不到音效卡。\n"
|
||||
"您將無法傳送或接收語音電話。"
|
||||
|
||||
#: ../gtk/main.c:2161
|
||||
#: ../gtk/main.c:2135
|
||||
msgid "A free SIP video-phone"
|
||||
msgstr "自由的 SIP 視訊電話"
|
||||
|
||||
|
|
@ -740,7 +740,7 @@ msgstr ""
|
|||
msgid "(Paused)"
|
||||
msgstr ""
|
||||
|
||||
#: ../gtk/loginframe.c:88
|
||||
#: ../gtk/loginframe.c:87
|
||||
#, c-format
|
||||
msgid "Please enter login information for %s"
|
||||
msgstr "請輸入 %s 的 登入資訊"
|
||||
|
|
@ -1697,60 +1697,60 @@ msgstr ""
|
|||
msgid "Please wait while fetching configuration from server..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:1508
|
||||
#: ../coreapi/linphonecore.c:1512
|
||||
msgid "Ready"
|
||||
msgstr "準備就緒"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2495
|
||||
#: ../coreapi/linphonecore.c:2499
|
||||
msgid "Configuring"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecore.c:2669
|
||||
#: ../coreapi/linphonecore.c:2673
|
||||
msgid "Looking for telephone number destination..."
|
||||
msgstr "尋找電話號碼目的端..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:2671
|
||||
#: ../coreapi/linphonecore.c:2675
|
||||
msgid "Could not resolve this number."
|
||||
msgstr "無法解析這個號碼。"
|
||||
|
||||
#. must be known at that time
|
||||
#: ../coreapi/linphonecore.c:2957
|
||||
#: ../coreapi/linphonecore.c:2961
|
||||
msgid "Contacting"
|
||||
msgstr "正在連絡"
|
||||
|
||||
#: ../coreapi/linphonecore.c:2962
|
||||
#: ../coreapi/linphonecore.c:2966
|
||||
msgid "Could not call"
|
||||
msgstr "無法通話"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3112
|
||||
#: ../coreapi/linphonecore.c:3116
|
||||
msgid "Sorry, we have reached the maximum number of simultaneous calls"
|
||||
msgstr "抱歉,我們已達瀏同步通話的最大數目"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3270
|
||||
#: ../coreapi/linphonecore.c:3274
|
||||
msgid "is contacting you"
|
||||
msgstr "正在連絡您"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3271
|
||||
#: ../coreapi/linphonecore.c:3275
|
||||
msgid " and asked autoanswer."
|
||||
msgstr "並要求自動接聽。"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3395
|
||||
#: ../coreapi/linphonecore.c:3399
|
||||
msgid "Modifying call parameters..."
|
||||
msgstr "修改通話參數..."
|
||||
|
||||
#: ../coreapi/linphonecore.c:3743
|
||||
#: ../coreapi/linphonecore.c:3747
|
||||
msgid "Connected."
|
||||
msgstr "已連線。"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3768
|
||||
#: ../coreapi/linphonecore.c:3772
|
||||
msgid "Call aborted"
|
||||
msgstr "通話已放棄"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3958
|
||||
#: ../coreapi/linphonecore.c:3962
|
||||
msgid "Could not pause the call"
|
||||
msgstr "無法暫停通話"
|
||||
|
||||
#: ../coreapi/linphonecore.c:3961
|
||||
#: ../coreapi/linphonecore.c:3965
|
||||
msgid "Pausing the current call..."
|
||||
msgstr "暫停目前的通話..."
|
||||
|
||||
|
|
@ -1834,112 +1834,112 @@ msgstr ""
|
|||
msgid "Could not login as %s"
|
||||
msgstr "無法以 %s 登入"
|
||||
|
||||
#: ../coreapi/callbacks.c:404
|
||||
#: ../coreapi/callbacks.c:419
|
||||
msgid "Remote ringing."
|
||||
msgstr "遠端響鈴。"
|
||||
|
||||
#: ../coreapi/callbacks.c:425
|
||||
#: ../coreapi/callbacks.c:431
|
||||
msgid "Remote ringing..."
|
||||
msgstr "遠端響鈴..."
|
||||
|
||||
#: ../coreapi/callbacks.c:442
|
||||
#: ../coreapi/callbacks.c:448
|
||||
msgid "Early media."
|
||||
msgstr "早期媒體。"
|
||||
|
||||
#: ../coreapi/callbacks.c:503
|
||||
#: ../coreapi/callbacks.c:521
|
||||
#, c-format
|
||||
msgid "Call with %s is paused."
|
||||
msgstr "和 %s 的通話已暫停。"
|
||||
|
||||
#: ../coreapi/callbacks.c:516
|
||||
#: ../coreapi/callbacks.c:534
|
||||
#, c-format
|
||||
msgid "Call answered by %s - on hold."
|
||||
msgstr "通話由 %s 接聽 - 保留中。"
|
||||
|
||||
#: ../coreapi/callbacks.c:526
|
||||
#: ../coreapi/callbacks.c:544
|
||||
msgid "Call resumed."
|
||||
msgstr "通話已繼續。"
|
||||
|
||||
#: ../coreapi/callbacks.c:530
|
||||
#: ../coreapi/callbacks.c:548
|
||||
#, c-format
|
||||
msgid "Call answered by %s."
|
||||
msgstr "通話由 %s 接聽。"
|
||||
|
||||
#: ../coreapi/callbacks.c:553
|
||||
#: ../coreapi/callbacks.c:571
|
||||
msgid "Incompatible, check codecs or security settings..."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:558 ../coreapi/callbacks.c:870
|
||||
#: ../coreapi/callbacks.c:576 ../coreapi/callbacks.c:888
|
||||
msgid "Incompatible media parameters."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:588
|
||||
#: ../coreapi/callbacks.c:606
|
||||
msgid "We have been resumed."
|
||||
msgstr ""
|
||||
|
||||
#. we are being paused
|
||||
#: ../coreapi/callbacks.c:596
|
||||
#: ../coreapi/callbacks.c:614
|
||||
msgid "We are paused by other party."
|
||||
msgstr ""
|
||||
|
||||
#. reINVITE and in-dialogs UPDATE go here
|
||||
#: ../coreapi/callbacks.c:630
|
||||
#: ../coreapi/callbacks.c:648
|
||||
msgid "Call is updated by remote."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:746
|
||||
#: ../coreapi/callbacks.c:764
|
||||
msgid "Call terminated."
|
||||
msgstr "通話已終止。"
|
||||
|
||||
#: ../coreapi/callbacks.c:774
|
||||
#: ../coreapi/callbacks.c:792
|
||||
msgid "User is busy."
|
||||
msgstr "使用者現正忙碌。"
|
||||
|
||||
#: ../coreapi/callbacks.c:775
|
||||
#: ../coreapi/callbacks.c:793
|
||||
msgid "User is temporarily unavailable."
|
||||
msgstr "使用者暫時無法聯繫。"
|
||||
|
||||
#. char *retrymsg=_("%s. Retry after %i minute(s).");
|
||||
#: ../coreapi/callbacks.c:777
|
||||
#: ../coreapi/callbacks.c:795
|
||||
msgid "User does not want to be disturbed."
|
||||
msgstr "使用者不想要被打擾。"
|
||||
|
||||
#: ../coreapi/callbacks.c:778
|
||||
#: ../coreapi/callbacks.c:796
|
||||
msgid "Call declined."
|
||||
msgstr "通話被拒接。"
|
||||
|
||||
#: ../coreapi/callbacks.c:793
|
||||
#: ../coreapi/callbacks.c:811
|
||||
msgid "Request timeout."
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/callbacks.c:824
|
||||
#: ../coreapi/callbacks.c:842
|
||||
msgid "Redirected"
|
||||
msgstr "已重新導向"
|
||||
|
||||
#: ../coreapi/callbacks.c:879
|
||||
#: ../coreapi/callbacks.c:897
|
||||
msgid "Call failed."
|
||||
msgstr "通話失敗。"
|
||||
|
||||
#: ../coreapi/callbacks.c:957
|
||||
#: ../coreapi/callbacks.c:975
|
||||
#, c-format
|
||||
msgid "Registration on %s successful."
|
||||
msgstr "在 %s 註冊成功。"
|
||||
|
||||
#: ../coreapi/callbacks.c:958
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#, c-format
|
||||
msgid "Unregistration on %s done."
|
||||
msgstr "在 %s 取消註冊完成。"
|
||||
|
||||
#: ../coreapi/callbacks.c:976
|
||||
#: ../coreapi/callbacks.c:994
|
||||
msgid "no response timeout"
|
||||
msgstr "沒有回應逾時"
|
||||
|
||||
#: ../coreapi/callbacks.c:979
|
||||
#: ../coreapi/callbacks.c:997
|
||||
#, c-format
|
||||
msgid "Registration on %s failed: %s"
|
||||
msgstr "在 %s 註冊失敗:%s"
|
||||
|
||||
#: ../coreapi/callbacks.c:986
|
||||
#: ../coreapi/callbacks.c:1004
|
||||
msgid "Service unavailable, retrying"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -1949,7 +1949,7 @@ msgstr ""
|
|||
msgid "Authentication token is %s"
|
||||
msgstr ""
|
||||
|
||||
#: ../coreapi/linphonecall.c:3492
|
||||
#: ../coreapi/linphonecall.c:3600
|
||||
#, c-format
|
||||
msgid "You have missed %i call."
|
||||
msgid_plural "You have missed %i calls."
|
||||
|
|
|
|||
|
|
@ -20,9 +20,14 @@
|
|||
#
|
||||
############################################################################
|
||||
|
||||
if(WIN32)
|
||||
set(GTK2_ADDITIONAL_SUFFIXES "../lib/glib-2.0/include" "../lib/gtk-2.0/include")
|
||||
endif()
|
||||
find_package(GTK2 2.18 COMPONENTS gtk)
|
||||
|
||||
set(SOURCE_FILES
|
||||
common/bc_tester_utils.c
|
||||
common/bc_tester_utils.h
|
||||
accountmanager.c
|
||||
call_tester.c
|
||||
dtmf_tester.c
|
||||
|
|
@ -31,6 +36,7 @@ set(SOURCE_FILES
|
|||
liblinphone_tester.c
|
||||
log_collection_tester.c
|
||||
message_tester.c
|
||||
multi_call.c
|
||||
multicast_call_tester.c
|
||||
offeranswer_tester.c
|
||||
player_tester.c
|
||||
|
|
@ -46,7 +52,10 @@ set(SOURCE_FILES
|
|||
video_tester.c
|
||||
)
|
||||
|
||||
add_definitions(-DBC_CONFIG_FILE="config.h")
|
||||
|
||||
add_executable(liblinphone_tester ${SOURCE_FILES})
|
||||
set_target_properties(liblinphone_tester PROPERTIES LINKER_LANGUAGE CXX)
|
||||
target_include_directories(liblinphone_tester PUBLIC ${CUNIT_INCLUDE_DIRS})
|
||||
target_link_libraries(liblinphone_tester linphone ${CUNIT_LIBRARIES})
|
||||
if (GTK2_FOUND)
|
||||
|
|
|
|||
|
|
@ -10,32 +10,37 @@ liblinphone_HEADERS = liblinphone_tester.h
|
|||
|
||||
lib_LTLIBRARIES = liblinphonetester.la
|
||||
|
||||
liblinphonetester_la_SOURCES = tester.c \
|
||||
setup_tester.c \
|
||||
register_tester.c \
|
||||
message_tester.c \
|
||||
liblinphonetester_la_SOURCES = \
|
||||
accountmanager.c \
|
||||
call_tester.c \
|
||||
multicast_call_tester.c \
|
||||
presence_tester.c \
|
||||
upnp_tester.c \
|
||||
dtmf_tester.c \
|
||||
eventapi_tester.c \
|
||||
flexisip_tester.c \
|
||||
stun_tester.c \
|
||||
remote_provisioning_tester.c \
|
||||
quality_reporting_tester.c \
|
||||
log_collection_tester.c \
|
||||
transport_tester.c \
|
||||
player_tester.c \
|
||||
dtmf_tester.c \
|
||||
accountmanager.c \
|
||||
message_tester.c \
|
||||
multi_call.c \
|
||||
multicast_call_tester.c \
|
||||
offeranswer_tester.c \
|
||||
video_tester.c
|
||||
player_tester.c \
|
||||
presence_tester.c \
|
||||
quality_reporting_tester.c \
|
||||
register_tester.c \
|
||||
remote_provisioning_tester.c \
|
||||
setup_tester.c \
|
||||
stun_tester.c \
|
||||
transport_tester.c \
|
||||
tester.c \
|
||||
upnp_tester.c \
|
||||
video_tester.c \
|
||||
common/bc_tester_utils.c
|
||||
liblinphonetester_ladir = $(includedir)/linphone
|
||||
liblinphonetester_la_HEADERS = common/bc_tester_utils.h
|
||||
|
||||
liblinphonetester_la_LDFLAGS= -no-undefined
|
||||
liblinphonetester_la_LIBADD= ../coreapi/liblinphone.la $(CUNIT_LIBS)
|
||||
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/coreapi
|
||||
AM_CFLAGS = $(STRICT_OPTIONS) $(STRICT_OPTIONS_CC) -DIN_LINPHONE $(ORTP_CFLAGS) $(MEDIASTREAMER_CFLAGS) $(CUNIT_CFLAGS) $(BELLESIP_CFLAGS) $(LIBXML2_CFLAGS) $(SQLITE3_CFLAGS)
|
||||
AM_CFLAGS = -DBC_CONFIG_FILE=\"config.h\" $(STRICT_OPTIONS) $(STRICT_OPTIONS_CC) -DIN_LINPHONE $(ORTP_CFLAGS) $(MEDIASTREAMER_CFLAGS) $(CUNIT_CFLAGS) $(BELLESIP_CFLAGS) $(LIBXML2_CFLAGS) $(SQLITE3_CFLAGS)
|
||||
|
||||
if BUILD_GTK_UI
|
||||
|
||||
|
|
|
|||
2
tester/ZIDCache.xml
Normal file
2
tester/ZIDCache.xml
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<cache><selfZID>ef7692d0792a67491ae2d44e</selfZID><peer><ZID>005dbe0399643d953a2202dd</ZID><rs1>9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045</rs1><aux>f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e</aux><rs2>2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899</rs2><uri>pipo1@pipo.com</uri><sndKey>963c57bb28e62068d2df23e8f9b771932d3c57bb28e62068d2df23e8f9b77193</sndKey><rcvKey>05d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193</rcvKey><sndSId>5f9aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b77193</sndSId><rcvSId>02ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b77193</rcvSId><sndIndex>00000069</sndIndex><rcvIndex>000001e8</rcvIndex><pvs>01</pvs></peer><peer><ZID>1234567889643d953a2202ee</ZID><rs1>9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045</rs1><aux>f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e</aux><rs2>2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899</rs2><uri>pipo1@pipo.com</uri><sndKey>123456789012345678901234567890123456765431262068d2df23e8f9b77193</sndKey><rcvKey>25d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193</rcvKey><sndSId>f69aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b77193</sndSId><rcvSId>22ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b77193</rcvSId><sndIndex>00000001</sndIndex><rcvIndex>00000000</rcvIndex><pvs>01</pvs></peer></cache>
|
||||
2
tester/ZIDCacheAlice.xml
Normal file
2
tester/ZIDCacheAlice.xml
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<cache><selfZID>ef7692d0792a67491ae2d44e</selfZID><peer><ZID>005dbe0399643d953a2202dd</ZID><rs1>9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045</rs1><aux>f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e</aux><rs2>2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899</rs2><uri>sip:pauline@sip.example.org</uri><sndKey>9111ebeb52e50edcc6fcb3eea1a2d3ae3c2c75d3668923e83c59d0f472455150</sndKey><rcvKey>60f020a3fe11dc2cc0e1e8ed9341b4cd14944db806ca4fc95456bbe45d95c43a</rcvKey><sndSId>5f9aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b77193</sndSId><rcvSId>bcffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b77193</rcvSId><sndIndex>00000080</sndIndex><rcvIndex>000001cf</rcvIndex><pvs>01</pvs></peer><peer><ZID>1234567889643d953a2202ee</ZID><rs1>9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045</rs1><aux>f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e</aux><rs2>2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899</rs2><uri>sip:pauline@sip.example.org</uri><sndKey>72d80ab1cad243cf45634980c1d02cfb2df81ce0dd5dfcf1ebeacfc5345a9176</sndKey><rcvKey>25d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193</rcvKey><sndSId>f69aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b77193</sndSId><rcvSId>22ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b77193</rcvSId><sndIndex>0000000f</sndIndex><rcvIndex>00000000</rcvIndex></peer></cache>
|
||||
4
tester/ZIDCacheBob.xml
Normal file
4
tester/ZIDCacheBob.xml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<cache><selfZID>005dbe0399643d953a2202dd</selfZID>
|
||||
<peer><ZID>ef7692d0792a67491ae2d44e</ZID><rs1>9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045</rs1><aux>f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e</aux><rs2>2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899</rs2><uri>sip:marie@sip.example.org</uri><rcvKey>9111ebeb52e50edcc6fcb3eea1a2d3ae3c2c75d3668923e83c59d0f472455150</rcvKey><sndKey>60f020a3fe11dc2cc0e1e8ed9341b4cd14944db806ca4fc95456bbe45d95c43a</sndKey><rcvSId>5f9aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b77193</rcvSId><sndSId>bcffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b77193</sndSId><rcvIndex>00000080</rcvIndex><sndIndex>000001cf</sndIndex><pvs>01</pvs></peer>
|
||||
<peer><ZID>1234567889643d953a2202ee</ZID><rs1>9b5c8f06f3b6c2c695f2dfc3c26f31f5fef8661f8c5fe7c95aeb5c5b0435b045</rs1><aux>f8324dd18ea905171ec2be89f879d01d5994132048d92ea020778cbdf31c605e</aux><rs2>2fdcef69380937c2cf221f7d11526f286c39f49641452ba9012521c705094899</rs2><uri>sip:marie@sip.example.org</uri><sndKey>81e6e6362c34dc974263d1f77cbb9a8d6d6a718330994379099a8fa19fb12faa</sndKey><rcvKey>25d9ac653a83c4559cb0ae7394e7cd3b2d3c57bb28e62068d2df23e8f9b77193</rcvKey><sndSId>f69aa1e5e4c7ec88fa389a9f6b8879b42d3c57bb28e62068d2df23e8f9b77193</sndSId><rcvSId>22ffd51e7316a6c6f53a50fcf01b01bf2d3c57bb28e62068d2df23e8f9b77193</rcvSId><sndIndex>0000002e</sndIndex><rcvIndex>00000000</rcvIndex><pvs>01</pvs></peer></cache>
|
||||
|
|
@ -33,7 +33,7 @@ typedef struct _Account Account;
|
|||
Account *account_new(LinphoneAddress *identity, const char *unique_id){
|
||||
char *modified_username;
|
||||
Account *obj=ms_new0(Account,1);
|
||||
|
||||
|
||||
/* we need to inhibit leak detector because the two LinphoneAddress will remain behond the scope of the test being run */
|
||||
belle_sip_object_inhibit_leak_detector(TRUE);
|
||||
obj->identity=linphone_address_clone(identity);
|
||||
|
|
@ -82,7 +82,7 @@ void account_manager_destroy(void){
|
|||
|
||||
Account *account_manager_get_account(AccountManager *m, const LinphoneAddress *identity){
|
||||
MSList *it;
|
||||
|
||||
|
||||
for(it=m->accounts;it!=NULL;it=it->next){
|
||||
Account *a=(Account*)it->data;
|
||||
if (linphone_address_weak_equal(a->identity,identity)){
|
||||
|
|
@ -120,15 +120,15 @@ void account_create_on_server(Account *account, const LinphoneProxyConfig *refcf
|
|||
char *tmp;
|
||||
LinphoneAddress *server_addr;
|
||||
LCSipTransports tr;
|
||||
|
||||
|
||||
vtable.registration_state_changed=account_created_on_server_cb;
|
||||
vtable.auth_info_requested=account_created_auth_requested_cb;
|
||||
lc=configure_lc_from(&vtable,liblinphone_tester_file_prefix,NULL,account);
|
||||
lc=configure_lc_from(&vtable,bc_tester_read_dir_prefix,NULL,account);
|
||||
tr.udp_port=LC_SIP_TRANSPORT_RANDOM;
|
||||
tr.tcp_port=LC_SIP_TRANSPORT_RANDOM;
|
||||
tr.tls_port=LC_SIP_TRANSPORT_RANDOM;
|
||||
linphone_core_set_sip_transports(lc,&tr);
|
||||
|
||||
|
||||
cfg=linphone_core_create_proxy_config(lc);
|
||||
linphone_address_set_secure(tmp_identity, FALSE);
|
||||
linphone_address_set_password(tmp_identity,account->password);
|
||||
|
|
@ -137,7 +137,7 @@ void account_create_on_server(Account *account, const LinphoneProxyConfig *refcf
|
|||
linphone_proxy_config_set_identity(cfg,tmp);
|
||||
ms_free(tmp);
|
||||
linphone_address_unref(tmp_identity);
|
||||
|
||||
|
||||
server_addr=linphone_address_new(linphone_proxy_config_get_server_addr(refcfg));
|
||||
linphone_address_set_secure(server_addr, FALSE);
|
||||
linphone_address_set_transport(server_addr,LinphoneTransportTcp); /*use tcp for account creation, we may not have certificates configured at this stage*/
|
||||
|
|
@ -147,9 +147,9 @@ void account_create_on_server(Account *account, const LinphoneProxyConfig *refcf
|
|||
ms_free(tmp);
|
||||
linphone_address_unref(server_addr);
|
||||
linphone_proxy_config_set_expires(cfg,3600);
|
||||
|
||||
|
||||
linphone_core_add_proxy_config(lc,cfg);
|
||||
|
||||
|
||||
if (wait_for_until(lc,NULL,&account->auth_requested,1,10000)==FALSE){
|
||||
ms_fatal("Account for %s could not be created on server.", linphone_proxy_config_get_identity(refcfg));
|
||||
}
|
||||
|
|
@ -161,13 +161,13 @@ void account_create_on_server(Account *account, const LinphoneProxyConfig *refcf
|
|||
linphone_address_unref(tmp_identity);
|
||||
ms_free(tmp);
|
||||
linphone_proxy_config_done(cfg);
|
||||
|
||||
|
||||
ai=linphone_auth_info_new(linphone_address_get_username(account->modified_identity),
|
||||
NULL,
|
||||
account->password,NULL,NULL,linphone_address_get_domain(account->modified_identity));
|
||||
linphone_core_add_auth_info(lc,ai);
|
||||
linphone_auth_info_destroy(ai);
|
||||
|
||||
|
||||
if (wait_for_until(lc,NULL,&account->created,1,3000)==FALSE){
|
||||
ms_fatal("Account for %s is not working on server.", linphone_proxy_config_get_identity(refcfg));
|
||||
}
|
||||
|
|
@ -187,7 +187,7 @@ LinphoneAddress *account_manager_check_account(AccountManager *m, LinphoneProxyC
|
|||
LinphoneAuthInfo *ai;
|
||||
char *tmp;
|
||||
bool_t create_account=FALSE;
|
||||
|
||||
|
||||
if (!account){
|
||||
account=account_new(id_addr,m->unique_id);
|
||||
ms_message("No account for %s exists, going to create one.",identity);
|
||||
|
|
@ -199,7 +199,7 @@ LinphoneAddress *account_manager_check_account(AccountManager *m, LinphoneProxyC
|
|||
tmp=linphone_address_as_string(id_addr);
|
||||
linphone_proxy_config_set_identity(cfg,tmp);
|
||||
ms_free(tmp);
|
||||
|
||||
|
||||
if (create_account){
|
||||
account_create_on_server(account,cfg);
|
||||
}
|
||||
|
|
@ -208,7 +208,7 @@ LinphoneAddress *account_manager_check_account(AccountManager *m, LinphoneProxyC
|
|||
account->password,NULL,NULL,linphone_address_get_domain(account->modified_identity));
|
||||
linphone_core_add_auth_info(lc,ai);
|
||||
linphone_auth_info_destroy(ai);
|
||||
|
||||
|
||||
linphone_address_unref(id_addr);
|
||||
return account->modified_identity;
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
# Created by Gautier Pelloux-Prayer on 2014/10/24.
|
||||
# This script adds auto-completion for liblinphone_tester binary for Bash and
|
||||
# zsh. To use it, just type: `source liblinphone_completion`, then use
|
||||
# `./liblinphone_tester [tab] to get auto-completions. To use it permanently,
|
||||
# source this file in your .rc file
|
||||
# Zsh. To use it, just type: `source liblinphone_completion`, then for each
|
||||
# supported exectuable (see end of file), you will get auto-completions.
|
||||
# To use it permanently, source this file in your .rc file (.bashrc or .zshrc).
|
||||
|
||||
_liblinphone_complete() {
|
||||
local completions command_requiring_argument prev_arg latest_arg available_tasks has_not_set_suite suite_name
|
||||
|
|
@ -102,7 +102,9 @@ _liblinphone_complete() {
|
|||
fi
|
||||
}
|
||||
|
||||
for tester in liblinphone_tester mediastreamer2_tester belle_sip_tester; do
|
||||
for tester in liblinphone_tester mediastreamer2_tester belle_sip_tester pcap_playback \
|
||||
bench mediastream msaudiocmp mtudiscover videodisplay linphone lpc2xml_test \
|
||||
lp-gen-wrappers xml2lpc_test; do
|
||||
if [ -n "$BASH_VERSION" ]; then
|
||||
complete -F _liblinphone_complete $tester
|
||||
elif [ -n "$ZSH_VERSION" ]; then
|
||||
362
tester/common/bc_tester_utils.c
Normal file
362
tester/common/bc_tester_utils.c
Normal file
|
|
@ -0,0 +1,362 @@
|
|||
/*
|
||||
tester - liblinphone test suite
|
||||
Copyright (C) 2013 Belledonne Communications SARL
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
/* this must be provided at compile time*/
|
||||
#include BC_CONFIG_FILE
|
||||
|
||||
#include "bc_tester_utils.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include "CUnit/Automated.h"
|
||||
|
||||
#if WINAPI_FAMILY_PHONE_APP
|
||||
const char *bc_tester_read_dir_prefix="Assets";
|
||||
#elif defined(__QNX__)
|
||||
const char *bc_tester_read_dir_prefix="./app/native/assets/";
|
||||
#else
|
||||
const char *bc_tester_read_dir_prefix=".";
|
||||
#endif
|
||||
|
||||
/* TODO: have the same "static" for QNX and windows as above? */
|
||||
#ifdef ANDROID
|
||||
const char *bc_tester_writable_dir_prefix = "/data/data/org.linphone.tester/cache";
|
||||
#else
|
||||
const char *bc_tester_writable_dir_prefix = ".";
|
||||
#endif
|
||||
|
||||
static test_suite_t **test_suite = NULL;
|
||||
static int nb_test_suites = 0;
|
||||
|
||||
#ifdef HAVE_CU_CURSES
|
||||
#include "CUnit/CUCurses.h"
|
||||
static unsigned char curses = 0;
|
||||
#endif
|
||||
|
||||
char* xml_file = "CUnitAutomated-Results.xml";
|
||||
int xml_enabled = 0;
|
||||
char * suite_name;
|
||||
char * test_name;
|
||||
void (*tester_printf_va)(int level, const char *fmt, va_list args);
|
||||
int verbosity_info;
|
||||
int verbosity_error;
|
||||
|
||||
static void tester_printf(int level, const char *fmt, ...) {
|
||||
va_list args;
|
||||
va_start (args, fmt);
|
||||
tester_printf_va(level, fmt, args);
|
||||
va_end (args);
|
||||
}
|
||||
|
||||
int bc_tester_run_suite(test_suite_t *suite) {
|
||||
int i;
|
||||
|
||||
CU_pSuite pSuite = CU_add_suite(suite->name, suite->init_func, suite->cleanup_func);
|
||||
|
||||
for (i = 0; i < suite->nb_tests; i++) {
|
||||
if (NULL == CU_add_test(pSuite, suite->tests[i].name, suite->tests[i].func)) {
|
||||
return CU_get_error();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char * bc_tester_suite_name(int suite_index) {
|
||||
if (suite_index >= nb_test_suites) return NULL;
|
||||
return test_suite[suite_index]->name;
|
||||
}
|
||||
|
||||
int bc_tester_suite_index(const char *suite_name) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nb_test_suites; i++) {
|
||||
if ((strcmp(suite_name, test_suite[i]->name) == 0) && (strlen(suite_name) == strlen(test_suite[i]->name))) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int bc_tester_nb_suites() {
|
||||
return nb_test_suites;
|
||||
}
|
||||
|
||||
const char * bc_tester_test_name(const char *suite_name, int test_index) {
|
||||
int suite_index = bc_tester_suite_index(suite_name);
|
||||
if ((suite_index < 0) || (suite_index >= nb_test_suites)) return NULL;
|
||||
if (test_index >= test_suite[suite_index]->nb_tests) return NULL;
|
||||
return test_suite[suite_index]->tests[test_index].name;
|
||||
}
|
||||
|
||||
int bc_tester_nb_tests(const char *suite_name) {
|
||||
int i = bc_tester_suite_index(suite_name);
|
||||
if (i < 0) return 0;
|
||||
return test_suite[i]->nb_tests;
|
||||
}
|
||||
|
||||
void bc_tester_list_suites() {
|
||||
int j;
|
||||
for(j=0;j<nb_test_suites;j++) {
|
||||
fprintf(stdout, "%s\n", bc_tester_suite_name(j));
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
static void all_complete_message_handler(const CU_pFailureRecord pFailure) {
|
||||
#ifdef HAVE_CU_GET_SUITE
|
||||
char * results = CU_get_run_results_string();
|
||||
tester_printf(verbosity_info,"\n%s",results);
|
||||
free(results);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void suite_init_failure_message_handler(const CU_pSuite pSuite) {
|
||||
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);
|
||||
}
|
||||
|
||||
#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);
|
||||
}
|
||||
static void suite_complete_message_handler(const CU_pSuite pSuite, const CU_pFailureRecord pFailure) {
|
||||
tester_printf(verbosity_info,"Suite [%s] ended\n", pSuite->pName);
|
||||
}
|
||||
|
||||
static void test_start_message_handler(const CU_pTest pTest, const CU_pSuite pSuite) {
|
||||
tester_printf(verbosity_info,"Suite [%s] Test [%s] started", pSuite->pName,pTest->pName);
|
||||
}
|
||||
|
||||
/*derivated from cunit*/
|
||||
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...
|
||||
CU_pFailureRecord pFailure = pFailureList;
|
||||
sprintf(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,
|
||||
(NULL != pFailure->strFileName) ? pFailure->strFileName : "",
|
||||
pFailure->uiLineNumber,
|
||||
(NULL != pFailure->strCondition) ? pFailure->strCondition : "");
|
||||
}
|
||||
} else {
|
||||
strncat(result, " passed", strlen(" passed"));
|
||||
}
|
||||
tester_printf(verbosity_info,"%s\n", result);
|
||||
free(result);
|
||||
}
|
||||
#endif
|
||||
|
||||
int bc_tester_run_tests(const char *suite_name, const char *test_name) {
|
||||
int i;
|
||||
|
||||
/* initialize the CUnit test registry */
|
||||
if (CUE_SUCCESS != CU_initialize_registry())
|
||||
return CU_get_error();
|
||||
|
||||
for (i = 0; i < nb_test_suites; i++) {
|
||||
bc_tester_run_suite(test_suite[i]);
|
||||
}
|
||||
#ifdef HAVE_CU_GET_SUITE
|
||||
CU_set_suite_start_handler(suite_start_message_handler);
|
||||
CU_set_suite_complete_handler(suite_complete_message_handler);
|
||||
CU_set_test_start_handler(test_start_message_handler);
|
||||
CU_set_test_complete_handler(test_complete_message_handler);
|
||||
#endif
|
||||
CU_set_all_test_complete_handler(all_complete_message_handler);
|
||||
CU_set_suite_init_failure_handler(suite_init_failure_message_handler);
|
||||
CU_set_suite_cleanup_failure_handler(suite_cleanup_failure_message_handler);
|
||||
|
||||
if( xml_enabled != 0 ){
|
||||
CU_automated_run_tests();
|
||||
} else {
|
||||
|
||||
#ifndef HAVE_CU_GET_SUITE
|
||||
if( suite_name ){
|
||||
tester_printf(verbosity_info, "Tester compiled without CU_get_suite() function, running all tests instead of suite '%s'", suite_name);
|
||||
}
|
||||
#else
|
||||
if (suite_name){
|
||||
CU_pSuite suite;
|
||||
suite=CU_get_suite(suite_name);
|
||||
if (!suite) {
|
||||
tester_printf(verbosity_error, "Could not find suite '%s'. Available suites are:", suite_name);
|
||||
bc_tester_list_suites();
|
||||
return -1;
|
||||
} else if (test_name) {
|
||||
CU_pTest test=CU_get_test_by_name(test_name, suite);
|
||||
if (!test) {
|
||||
tester_printf(verbosity_error, "Could not find test '%s' in suite '%s'. Available tests are:", test_name, suite_name);
|
||||
// do not use suite_name here, since this method is case sensitive
|
||||
bc_tester_list_tests(suite->pName);
|
||||
return -2;
|
||||
} else {
|
||||
CU_ErrorCode err= CU_run_test(suite, test);
|
||||
if (err != CUE_SUCCESS) tester_printf(verbosity_error, "CU_basic_run_test error %d", err);
|
||||
}
|
||||
} else {
|
||||
CU_run_suite(suite);
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
#ifdef HAVE_CU_CURSES
|
||||
if (curses) {
|
||||
/* Run tests using the CUnit curses interface */
|
||||
CU_curses_run_tests();
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
/* Run all tests using the CUnit Basic interface */
|
||||
CU_run_all_tests();
|
||||
}
|
||||
}
|
||||
}
|
||||
return CU_get_number_of_tests_failed()!=0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void bc_tester_helper(const char *name, const char* additionnal_helper) {
|
||||
fprintf(stdout,"%s --help\n"
|
||||
"\t\t\t--list-suites\n"
|
||||
"\t\t\t--list-tests <suite>\n"
|
||||
"\t\t\t--suite <suite name>\n"
|
||||
"\t\t\t--test <test name>\n"
|
||||
#ifdef HAVE_CU_CURSES
|
||||
"\t\t\t--curses\n"
|
||||
#endif
|
||||
"\t\t\t--xml\n"
|
||||
"\t\t\t--xml-file <xml file prefix (will be suffixed by '-Results.xml')>\n"
|
||||
"And additionally:\n"
|
||||
"%s"
|
||||
, name
|
||||
, additionnal_helper);
|
||||
}
|
||||
|
||||
void bc_tester_init(void (*ftester_printf)(int level, const char *fmt, va_list args), int iverbosity_info, int iverbosity_error) {
|
||||
tester_printf_va = ftester_printf;
|
||||
verbosity_error = iverbosity_error;
|
||||
verbosity_info = iverbosity_info;
|
||||
}
|
||||
|
||||
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){
|
||||
CHECK_ARG("--test", ++i, argc);
|
||||
test_name=argv[i];
|
||||
}else if (strcmp(argv[i],"--suite")==0){
|
||||
CHECK_ARG("--suite", ++i, argc);
|
||||
suite_name=argv[i];
|
||||
} else if (strcmp(argv[i],"--list-suites")==0){
|
||||
bc_tester_list_suites();
|
||||
return 0;
|
||||
} else if (strcmp(argv[i],"--list-tests")==0){
|
||||
CHECK_ARG("--list-tests", ++i, argc);
|
||||
suite_name = argv[i];
|
||||
bc_tester_list_tests(suite_name);
|
||||
return 0;
|
||||
} else if (strcmp(argv[i], "--xml-file") == 0){
|
||||
CHECK_ARG("--xml-file", ++i, argc);
|
||||
xml_file = argv[i];
|
||||
xml_enabled = 1;
|
||||
} else if (strcmp(argv[i], "--xml") == 0){
|
||||
xml_enabled = 1;
|
||||
}else {
|
||||
fprintf(stderr, "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");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* returns number of arguments read + 1 */
|
||||
return i - argid + 1;
|
||||
}
|
||||
|
||||
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);
|
||||
CU_set_output_filename(xml_tmp_file);
|
||||
free(xml_tmp_file);
|
||||
}
|
||||
|
||||
ret = bc_tester_run_tests(suite_name, test_name);
|
||||
|
||||
return ret;
|
||||
}
|
||||
void bc_tester_add_suite(test_suite_t *suite) {
|
||||
if (test_suite == NULL) {
|
||||
test_suite = (test_suite_t **)malloc(10 * sizeof(test_suite_t *));
|
||||
}
|
||||
test_suite[nb_test_suites] = suite;
|
||||
nb_test_suites++;
|
||||
if ((nb_test_suites % 10) == 0) {
|
||||
test_suite = (test_suite_t **)realloc(test_suite, (nb_test_suites + 10) * sizeof(test_suite_t *));
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
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);
|
||||
rename(xml_tmp_file, xml_file);
|
||||
free(xml_tmp_file);
|
||||
}
|
||||
|
||||
if (test_suite != NULL) {
|
||||
free(test_suite);
|
||||
test_suite = NULL;
|
||||
nb_test_suites = 0;
|
||||
}
|
||||
}
|
||||
77
tester/common/bc_tester_utils.h
Normal file
77
tester/common/bc_tester_utils.h
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
tester - liblinphone test suite
|
||||
Copyright (C) 2013 Belledonne Communications SARL
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef TESTER_UTILS_H
|
||||
#define TESTER_UTILS_H
|
||||
|
||||
#include "CUnit/Basic.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
extern const char *bc_tester_read_dir_prefix;
|
||||
extern const char *bc_tester_writable_dir_prefix;
|
||||
|
||||
typedef void (*test_function_t)(void);
|
||||
typedef int (*test_suite_function_t)(const char *name);
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
test_function_t func;
|
||||
} test_t;
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
CU_InitializeFunc init_func;
|
||||
CU_CleanupFunc cleanup_func;
|
||||
int nb_tests;
|
||||
test_t *tests;
|
||||
} test_suite_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#define CHECK_ARG(argument, index, argc) \
|
||||
if(index >= argc) { \
|
||||
fprintf(stderr, "Missing argument for \"%s\"\n", argument); \
|
||||
return -1; \
|
||||
} \
|
||||
|
||||
void bc_tester_init(void (*ftester_printf)(int level, const char *fmt, va_list args)
|
||||
, int verbosity_info, int verbosity_error);
|
||||
void bc_tester_helper(const char *name, const char* additionnal_helper);
|
||||
int bc_tester_parse_args(int argc, char** argv, int argid);
|
||||
int bc_tester_start();
|
||||
void bc_tester_add_suite(test_suite_t *suite);
|
||||
void bc_tester_uninit();
|
||||
|
||||
int bc_tester_nb_suites();
|
||||
int bc_tester_nb_tests(const char* name);
|
||||
void bc_tester_list_suites();
|
||||
void bc_tester_list_tests(const char *suite_name);
|
||||
const char * bc_tester_suite_name(int suite_index);
|
||||
const char * bc_tester_test_name(const char *suite_name, int test_index);
|
||||
int bc_tester_run_suite(test_suite_t *suite);
|
||||
int bc_tester_run_tests(const char *suite_name, const char *test_name);
|
||||
int bc_tester_suite_index(const char *suite_name);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -31,7 +31,7 @@ static void subscribe_forking(void) {
|
|||
LinphoneEvent *lev;
|
||||
int expires= 600;
|
||||
MSList* lcs=ms_list_append(NULL,marie->lc);
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,pauline->lc);
|
||||
lcs=ms_list_append(lcs,pauline2->lc);
|
||||
|
||||
|
|
@ -39,9 +39,9 @@ static void subscribe_forking(void) {
|
|||
linphone_content_set_type(content,"application");
|
||||
linphone_content_set_subtype(content,"somexml");
|
||||
linphone_content_set_buffer(content, liblinphone_tester_get_subscribe_content(), strlen(liblinphone_tester_get_subscribe_content()));
|
||||
|
||||
|
||||
lev=linphone_core_subscribe(marie->lc,pauline->identity,"dodo",expires,content);
|
||||
|
||||
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingInit,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline2->stat.number_of_LinphoneSubscriptionIncomingReceived,1,1000));
|
||||
|
|
@ -67,10 +67,10 @@ static void message_forking(void) {
|
|||
char* to = linphone_address_as_string(marie->identity);
|
||||
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc,to);
|
||||
LinphoneChatMessage* message = linphone_chat_room_create_message(chat_room,"Bli bli bli \n blu");
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,pauline->lc);
|
||||
lcs=ms_list_append(lcs,marie2->lc);
|
||||
|
||||
|
||||
linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc);
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneMessageReceived,1,3000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneMessageReceived,1,1000));
|
||||
|
|
@ -92,15 +92,15 @@ static void message_forking_with_unreachable_recipients(void) {
|
|||
char* to = linphone_address_as_string(marie->identity);
|
||||
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc,to);
|
||||
LinphoneChatMessage* message = linphone_chat_room_create_message(chat_room,"Bli bli bli \n blu");
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,pauline->lc);
|
||||
lcs=ms_list_append(lcs,marie2->lc);
|
||||
lcs=ms_list_append(lcs,marie3->lc);
|
||||
|
||||
|
||||
/*marie2 and marie3 go offline*/
|
||||
linphone_core_set_network_reachable(marie2->lc,FALSE);
|
||||
linphone_core_set_network_reachable(marie3->lc,FALSE);
|
||||
|
||||
|
||||
linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc);
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneMessageReceived,1,3000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageDelivered,1,1000));
|
||||
|
|
@ -110,14 +110,14 @@ static void message_forking_with_unreachable_recipients(void) {
|
|||
/*marie 2 goes online */
|
||||
linphone_core_set_network_reachable(marie2->lc,TRUE);
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneMessageReceived,1,3000));
|
||||
|
||||
|
||||
/*wait a long time so that all transactions are expired*/
|
||||
wait_for_list(lcs,NULL,0,32000);
|
||||
|
||||
|
||||
/*marie 3 goes online now*/
|
||||
linphone_core_set_network_reachable(marie3->lc,TRUE);
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneMessageReceived,1,3000));
|
||||
|
||||
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(marie2);
|
||||
linphone_core_manager_destroy(pauline);
|
||||
|
|
@ -134,40 +134,40 @@ static void message_forking_with_all_recipients_unreachable(void) {
|
|||
char* to = linphone_address_as_string(marie->identity);
|
||||
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc,to);
|
||||
LinphoneChatMessage* message = linphone_chat_room_create_message(chat_room,"Bli bli bli \n blu");
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,pauline->lc);
|
||||
lcs=ms_list_append(lcs,marie2->lc);
|
||||
lcs=ms_list_append(lcs,marie3->lc);
|
||||
|
||||
|
||||
/*All marie's device go offline*/
|
||||
linphone_core_set_network_reachable(marie->lc,FALSE);
|
||||
linphone_core_set_network_reachable(marie2->lc,FALSE);
|
||||
linphone_core_set_network_reachable(marie3->lc,FALSE);
|
||||
|
||||
|
||||
linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc);
|
||||
|
||||
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageInProgress,1,5000));
|
||||
/*flexisip will accept the message with 202 after 16 seconds*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneMessageDelivered,1,18000));
|
||||
CU_ASSERT_TRUE( marie->stat.number_of_LinphoneMessageReceived==0);
|
||||
CU_ASSERT_TRUE( marie2->stat.number_of_LinphoneMessageReceived==0);
|
||||
CU_ASSERT_TRUE( marie3->stat.number_of_LinphoneMessageReceived==0);
|
||||
|
||||
|
||||
/*marie 1 goes online */
|
||||
linphone_core_set_network_reachable(marie->lc,TRUE);
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneMessageReceived,1,3000));
|
||||
|
||||
|
||||
/*marie 2 goes online */
|
||||
linphone_core_set_network_reachable(marie2->lc,TRUE);
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneMessageReceived,1,3000));
|
||||
|
||||
|
||||
/*wait a long time so that all transactions are expired*/
|
||||
wait_for_list(lcs,NULL,0,32000);
|
||||
|
||||
|
||||
/*marie 3 goes online now*/
|
||||
linphone_core_set_network_reachable(marie3->lc,TRUE);
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneMessageReceived,1,3000));
|
||||
|
||||
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(marie2);
|
||||
linphone_core_manager_destroy(pauline);
|
||||
|
|
@ -181,16 +181,16 @@ static void call_forking(void){
|
|||
LinphoneCoreManager* marie2 = linphone_core_manager_new( "marie_rc");
|
||||
LinphoneCoreManager* marie3 = linphone_core_manager_new( "marie_rc");
|
||||
MSList* lcs=ms_list_append(NULL,pauline->lc);
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,marie->lc);
|
||||
lcs=ms_list_append(lcs,marie2->lc);
|
||||
lcs=ms_list_append(lcs,marie3->lc);
|
||||
|
||||
|
||||
linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie2->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie3->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL);
|
||||
|
||||
|
||||
linphone_core_invite_address(pauline->lc,marie->identity);
|
||||
/*pauline should hear ringback*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000));
|
||||
|
|
@ -198,22 +198,22 @@ static void call_forking(void){
|
|||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,3000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,3000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,3000));
|
||||
|
||||
|
||||
/*marie accepts the call on its first device*/
|
||||
linphone_core_accept_call(marie->lc,linphone_core_get_current_call(marie->lc));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000));
|
||||
|
||||
|
||||
/*other devices should stop ringing*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
|
||||
|
||||
linphone_core_terminate_call(pauline->lc,linphone_core_get_current_call(pauline->lc));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
|
||||
|
||||
linphone_core_manager_destroy(pauline);
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(marie2);
|
||||
|
|
@ -227,38 +227,38 @@ static void call_forking_with_urgent_reply(void){
|
|||
LinphoneCoreManager* marie2 = linphone_core_manager_new( "marie_rc");
|
||||
LinphoneCoreManager* marie3 = linphone_core_manager_new( "marie_rc");
|
||||
MSList* lcs=ms_list_append(NULL,pauline->lc);
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,marie->lc);
|
||||
lcs=ms_list_append(lcs,marie2->lc);
|
||||
lcs=ms_list_append(lcs,marie3->lc);
|
||||
|
||||
|
||||
linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie2->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie3->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL);
|
||||
|
||||
|
||||
CU_ASSERT_TRUE(linphone_core_media_encryption_supported(pauline->lc,LinphoneMediaEncryptionSRTP));
|
||||
linphone_core_set_media_encryption(pauline->lc,LinphoneMediaEncryptionSRTP);
|
||||
linphone_core_set_network_reachable(marie2->lc,FALSE);
|
||||
linphone_core_set_network_reachable(marie3->lc,FALSE);
|
||||
|
||||
|
||||
linphone_core_invite_address(pauline->lc,marie->identity);
|
||||
/*pauline should hear ringback, after 5 seconds, when it will retry without SRTP*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,9000));
|
||||
/*Marie should be ringing*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000));
|
||||
|
||||
|
||||
/*marie accepts the call on its first device*/
|
||||
linphone_core_accept_call(marie->lc,linphone_core_get_current_call(marie->lc));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000));
|
||||
|
||||
|
||||
linphone_core_terminate_call(pauline->lc,linphone_core_get_current_call(pauline->lc));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
|
||||
|
||||
linphone_core_manager_destroy(pauline);
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(marie2);
|
||||
|
|
@ -272,16 +272,16 @@ static void call_forking_cancelled(void){
|
|||
LinphoneCoreManager* marie2 = linphone_core_manager_new( "marie_rc");
|
||||
LinphoneCoreManager* marie3 = linphone_core_manager_new( "marie_rc");
|
||||
MSList* lcs=ms_list_append(NULL,pauline->lc);
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,marie->lc);
|
||||
lcs=ms_list_append(lcs,marie2->lc);
|
||||
lcs=ms_list_append(lcs,marie3->lc);
|
||||
|
||||
|
||||
linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie2->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie3->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL);
|
||||
|
||||
|
||||
linphone_core_invite_address(pauline->lc,marie->identity);
|
||||
/*pauline should hear ringback*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000));
|
||||
|
|
@ -289,16 +289,16 @@ static void call_forking_cancelled(void){
|
|||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,1000));
|
||||
|
||||
|
||||
/*pauline finally cancels the call*/
|
||||
linphone_core_terminate_call(pauline->lc,linphone_core_get_current_call(pauline->lc));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
|
||||
|
||||
/*all devices should stop ringing*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
|
||||
|
||||
linphone_core_manager_destroy(pauline);
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(marie2);
|
||||
|
|
@ -312,16 +312,16 @@ static void call_forking_declined(bool_t declined_globaly){
|
|||
LinphoneCoreManager* marie2 = linphone_core_manager_new( "marie_rc");
|
||||
LinphoneCoreManager* marie3 = linphone_core_manager_new( "marie_rc");
|
||||
MSList* lcs=ms_list_append(NULL,pauline->lc);
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,marie->lc);
|
||||
lcs=ms_list_append(lcs,marie2->lc);
|
||||
lcs=ms_list_append(lcs,marie3->lc);
|
||||
|
||||
|
||||
linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie2->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie3->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL);
|
||||
|
||||
|
||||
linphone_core_invite_address(pauline->lc,marie->identity);
|
||||
/*pauline should hear ringback*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000));
|
||||
|
|
@ -329,12 +329,12 @@ static void call_forking_declined(bool_t declined_globaly){
|
|||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,1000));
|
||||
|
||||
|
||||
/*marie1 finally declines the call*/
|
||||
linphone_core_decline_call(marie->lc,linphone_core_get_current_call(marie->lc),
|
||||
declined_globaly ? LinphoneReasonDeclined : LinphoneReasonBusy
|
||||
);
|
||||
|
||||
|
||||
if (declined_globaly){
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
/*all devices should stop ringing*/
|
||||
|
|
@ -353,7 +353,7 @@ static void call_forking_declined(bool_t declined_globaly){
|
|||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,3000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,3000));
|
||||
}
|
||||
|
||||
|
||||
linphone_core_manager_destroy(pauline);
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(marie2);
|
||||
|
|
@ -373,40 +373,40 @@ static void call_forking_with_push_notification_single(void){
|
|||
MSList* lcs;
|
||||
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc");
|
||||
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
|
||||
|
||||
|
||||
linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL);
|
||||
|
||||
|
||||
lcs=ms_list_append(NULL,pauline->lc);
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,marie->lc);
|
||||
|
||||
|
||||
/*unfortunately marie gets unreachable due to crappy 3G operator or iOS bug...*/
|
||||
linphone_core_set_network_reachable(marie->lc,FALSE);
|
||||
|
||||
|
||||
linphone_core_invite_address(pauline->lc,marie->identity);
|
||||
|
||||
|
||||
/*the server is expected to send a push notification to marie, this will wake up linphone, that will reconnect:*/
|
||||
linphone_core_set_network_reachable(marie->lc,TRUE);
|
||||
|
||||
|
||||
/*Marie shall receive the call immediately*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,5000));
|
||||
/*pauline should hear ringback as well*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,1000));
|
||||
|
||||
|
||||
/*marie accepts the call*/
|
||||
linphone_core_accept_call(marie->lc,linphone_core_get_current_call(marie->lc));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,5000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000));
|
||||
|
||||
|
||||
liblinphone_tester_check_rtcp(pauline,marie);
|
||||
|
||||
|
||||
linphone_core_terminate_call(pauline->lc,linphone_core_get_current_call(pauline->lc));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,5000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,5000));
|
||||
|
||||
|
||||
linphone_core_manager_destroy(pauline);
|
||||
linphone_core_manager_destroy(marie);
|
||||
ms_list_free(lcs);
|
||||
|
|
@ -416,49 +416,49 @@ static void call_forking_with_push_notification_multiple(void){
|
|||
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc");
|
||||
LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
|
||||
LinphoneCoreManager* marie2 = linphone_core_manager_new( "marie_rc");
|
||||
|
||||
|
||||
MSList* lcs=ms_list_append(NULL,pauline->lc);
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,marie->lc);
|
||||
lcs=ms_list_append(lcs,marie2->lc);
|
||||
|
||||
|
||||
linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie2->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL);
|
||||
|
||||
|
||||
/*unfortunately marie gets unreachable due to crappy 3G operator or iOS bug...*/
|
||||
linphone_core_set_network_reachable(marie2->lc,FALSE);
|
||||
|
||||
|
||||
linphone_core_invite_address(pauline->lc,marie->identity);
|
||||
|
||||
|
||||
/*marie1 will ring*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,5000));
|
||||
/*pauline should hear ringback as well*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,1000));
|
||||
|
||||
|
||||
/*the server is expected to send a push notification to marie2, this will wake up linphone, that will reconnect:*/
|
||||
linphone_core_set_network_reachable(marie2->lc,TRUE);
|
||||
|
||||
|
||||
/*Marie shall receive the call immediately*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,5000));
|
||||
|
||||
|
||||
/*marie2 accepts the call*/
|
||||
linphone_core_accept_call(marie2->lc,linphone_core_get_current_call(marie2->lc));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallConnected,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallConnected,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallStreamsRunning,1,1000));
|
||||
|
||||
|
||||
/*call to marie1 should be cancelled*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
|
||||
|
||||
liblinphone_tester_check_rtcp(pauline,marie2);
|
||||
|
||||
|
||||
linphone_core_terminate_call(pauline->lc,linphone_core_get_current_call(pauline->lc));
|
||||
|
||||
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
|
||||
|
||||
linphone_core_manager_destroy(pauline);
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(marie2);
|
||||
|
|
@ -470,16 +470,16 @@ static void call_forking_not_responded(void){
|
|||
LinphoneCoreManager* marie2 = linphone_core_manager_new( "marie_rc");
|
||||
LinphoneCoreManager* marie3 = linphone_core_manager_new( "marie_rc");
|
||||
MSList* lcs=ms_list_append(NULL,pauline->lc);
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,marie->lc);
|
||||
lcs=ms_list_append(lcs,marie2->lc);
|
||||
lcs=ms_list_append(lcs,marie3->lc);
|
||||
|
||||
|
||||
linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie2->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie3->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL);
|
||||
|
||||
|
||||
linphone_core_invite_address(pauline->lc,marie->identity);
|
||||
/*pauline should hear ringback*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingRinging,1,3000));
|
||||
|
|
@ -487,14 +487,14 @@ static void call_forking_not_responded(void){
|
|||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallIncomingReceived,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallIncomingReceived,1,1000));
|
||||
|
||||
|
||||
/*nobody answers, flexisip should close the call after XX seconds*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallError,1,22000));
|
||||
/*all devices should stop ringing*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie3->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
|
||||
|
||||
linphone_core_manager_destroy(pauline);
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(marie2);
|
||||
|
|
@ -516,28 +516,28 @@ static void early_media_call_forking(void) {
|
|||
|
||||
pol.automatically_accept=1;
|
||||
pol.automatically_initiate=1;
|
||||
|
||||
|
||||
linphone_core_set_user_agent(marie1->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(marie2->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(pauline->lc,"Natted Linphone",NULL);
|
||||
|
||||
|
||||
linphone_core_enable_video(pauline->lc,TRUE,TRUE);
|
||||
|
||||
|
||||
linphone_core_enable_video(marie1->lc,TRUE,TRUE);
|
||||
linphone_core_set_video_policy(marie1->lc,&pol);
|
||||
|
||||
|
||||
linphone_core_enable_video(marie2->lc,TRUE,TRUE);
|
||||
linphone_core_set_video_policy(marie2->lc,&pol);
|
||||
linphone_core_set_audio_port_range(marie2->lc,40200,40300);
|
||||
linphone_core_set_video_port_range(marie2->lc,40400,40500);
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,marie1->lc);
|
||||
lcs=ms_list_append(lcs,marie2->lc);
|
||||
lcs=ms_list_append(lcs,pauline->lc);
|
||||
|
||||
linphone_call_params_enable_early_media_sending(params,TRUE);
|
||||
linphone_call_params_enable_video(params,TRUE);
|
||||
|
||||
|
||||
linphone_core_invite_address_with_params(pauline->lc,marie1->identity,params);
|
||||
linphone_call_params_destroy(params);
|
||||
|
||||
|
|
@ -545,11 +545,11 @@ static void early_media_call_forking(void) {
|
|||
CU_ASSERT_TRUE(wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallIncomingEarlyMedia,1,3000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,3000));
|
||||
CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia,1);
|
||||
|
||||
|
||||
pauline_call=linphone_core_get_current_call(pauline->lc);
|
||||
marie1_call=linphone_core_get_current_call(marie1->lc);
|
||||
marie2_call=linphone_core_get_current_call(marie2->lc);
|
||||
|
||||
|
||||
/*wait a bit that streams are established*/
|
||||
wait_for_list(lcs,&dummy,1,6000);
|
||||
CU_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>60
|
||||
|
|
@ -558,21 +558,21 @@ static void early_media_call_forking(void) {
|
|||
&& linphone_call_get_audio_stats(marie1_call)->download_bandwidth<99);
|
||||
CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie2_call)->download_bandwidth>60
|
||||
&& linphone_call_get_audio_stats(marie2_call)->download_bandwidth<99);
|
||||
|
||||
|
||||
linphone_core_accept_call(marie1->lc,linphone_core_get_current_call(marie1->lc));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallStreamsRunning,1,3000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallStreamsRunning,1,3000));
|
||||
|
||||
|
||||
/*marie2 should get her call terminated*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallEnd,1,1000));
|
||||
|
||||
|
||||
/*wait a bit that streams are established*/
|
||||
wait_for_list(lcs,&dummy,1,3000);
|
||||
CU_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>60
|
||||
&& linphone_call_get_audio_stats(pauline_call)->download_bandwidth<99 );
|
||||
CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>60
|
||||
&& linphone_call_get_audio_stats(marie1_call)->download_bandwidth<99 );
|
||||
|
||||
|
||||
linphone_core_terminate_all_calls(pauline->lc);
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,5000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallEnd,1,5000));
|
||||
|
|
@ -588,35 +588,35 @@ static void call_with_sips(void){
|
|||
LinphoneCoreManager* pauline1 = linphone_core_manager_new( "pauline_sips_rc");
|
||||
LinphoneCoreManager* pauline2 = linphone_core_manager_new( "pauline_tcp_rc");
|
||||
MSList* lcs=ms_list_append(NULL,marie->lc);
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,pauline1->lc);
|
||||
lcs=ms_list_append(lcs,pauline2->lc);
|
||||
|
||||
|
||||
linphone_core_set_user_agent(marie->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(pauline1->lc,"Natted Linphone",NULL);
|
||||
linphone_core_set_user_agent(pauline2->lc,"Natted Linphone",NULL);
|
||||
|
||||
|
||||
linphone_core_invite_address(marie->lc,pauline1->identity);
|
||||
|
||||
/*marie should hear ringback*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallOutgoingRinging,1,3000));
|
||||
/*Only the sips registered device from pauline should ring*/
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallIncomingReceived,1,1000));
|
||||
|
||||
|
||||
/*pauline accepts the call */
|
||||
linphone_core_accept_call(pauline1->lc,linphone_core_get_current_call(pauline1->lc));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallConnected,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallStreamsRunning,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallConnected,1,1000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallStreamsRunning,1,1000));
|
||||
|
||||
|
||||
/*pauline2 should not have ring*/
|
||||
CU_ASSERT_TRUE(pauline2->stat.number_of_LinphoneCallIncomingReceived==0);
|
||||
|
||||
|
||||
linphone_core_terminate_call(pauline1->lc,linphone_core_get_current_call(pauline1->lc));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline1->stat.number_of_LinphoneCallEnd,1,3000));
|
||||
CU_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneCallEnd,1,3000));
|
||||
|
||||
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(pauline1);
|
||||
linphone_core_manager_destroy(pauline2);
|
||||
|
|
@ -631,11 +631,11 @@ static void call_with_sips_not_achievable(void){
|
|||
LinphoneAddress *dest;
|
||||
LinphoneCall *call;
|
||||
const LinphoneErrorInfo *ei;
|
||||
|
||||
|
||||
lcs=ms_list_append(lcs,pauline1->lc);
|
||||
lcs=ms_list_append(lcs,pauline2->lc);
|
||||
|
||||
|
||||
|
||||
dest=linphone_address_clone(pauline1->identity);
|
||||
linphone_address_set_secure(dest,TRUE);
|
||||
call=linphone_core_invite_address(marie->lc,dest);
|
||||
|
|
@ -649,7 +649,7 @@ static void call_with_sips_not_achievable(void){
|
|||
if (ei){
|
||||
CU_ASSERT_EQUAL(linphone_error_info_get_reason(ei), LinphoneReasonTemporarilyUnavailable);
|
||||
}
|
||||
|
||||
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(pauline1);
|
||||
linphone_core_manager_destroy(pauline2);
|
||||
|
|
@ -665,12 +665,12 @@ static void call_with_ipv6(void) {
|
|||
|
||||
/*calling ortp_init() here is done to have WSAStartup() done, otherwise liblinphone_tester_ipv6_available() will not work.*/
|
||||
ortp_init();
|
||||
|
||||
|
||||
if (!liblinphone_tester_ipv6_available()){
|
||||
ms_warning("Call with ipv6 not tested, no ipv6 connectivity");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
belle_sip_object_enable_leak_detector(TRUE);
|
||||
begin=belle_sip_object_get_object_count();
|
||||
|
||||
|
|
@ -687,7 +687,7 @@ static void call_with_ipv6(void) {
|
|||
/*check that the remote contact is IPv6*/
|
||||
const char *contact=linphone_call_get_remote_contact(pauline_call);
|
||||
LinphoneAddress *ct_addr;
|
||||
|
||||
|
||||
CU_ASSERT_PTR_NOT_NULL(contact);
|
||||
if (contact){
|
||||
ct_addr=linphone_address_new(contact);
|
||||
|
|
@ -697,7 +697,7 @@ static void call_with_ipv6(void) {
|
|||
}
|
||||
linphone_address_destroy(ct_addr);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
liblinphone_tester_check_rtcp(marie,pauline);
|
||||
|
|
@ -714,6 +714,150 @@ static void call_with_ipv6(void) {
|
|||
ortp_exit();
|
||||
}
|
||||
|
||||
static void file_transfer_message_rcs_to_external_body_client(void) {
|
||||
char* to;
|
||||
LinphoneChatRoom* chat_room;
|
||||
LinphoneChatMessage* message;
|
||||
LinphoneChatMessageCbs *cbs;
|
||||
LinphoneContent* content;
|
||||
FILE *file_to_send = NULL;
|
||||
size_t file_size;
|
||||
char *send_filepath = ms_strdup_printf("%s/images/nowebcamCIF.jpg", bc_tester_read_dir_prefix);
|
||||
char *receive_filepath = ms_strdup_printf("%s/receive_file.dump", bc_tester_writable_dir_prefix);
|
||||
|
||||
LinphoneCoreManager* marie = linphone_core_manager_init( "marie_rc");
|
||||
LinphoneCoreManager* pauline = linphone_core_manager_init( "pauline_rc");
|
||||
|
||||
linphone_proxy_config_set_custom_header(marie->lc->default_proxy, "Accept", "application/sdp");
|
||||
linphone_core_manager_start(marie, "marie_rc", TRUE);
|
||||
|
||||
linphone_proxy_config_set_custom_header(pauline->lc->default_proxy, "Accept", "application/sdp, text/plain, application/vnd.gsma.rcs-ft-http+xml");
|
||||
linphone_core_manager_start(pauline, "pauline_rc", TRUE);
|
||||
|
||||
reset_counters(&marie->stat);
|
||||
reset_counters(&pauline->stat);
|
||||
|
||||
file_to_send = fopen(send_filepath, "rb");
|
||||
fseek(file_to_send, 0, SEEK_END);
|
||||
file_size = ftell(file_to_send);
|
||||
fseek(file_to_send, 0, SEEK_SET);
|
||||
|
||||
/* Globally configure an http file transfer server. */
|
||||
linphone_core_set_file_transfer_server(pauline->lc,"https://www.linphone.org:444/lft.php");
|
||||
|
||||
/* create a chatroom on pauline's side */
|
||||
to = linphone_address_as_string(marie->identity);
|
||||
chat_room = linphone_core_create_chat_room(pauline->lc,to);
|
||||
ms_free(to);
|
||||
/* create a file transfer message */
|
||||
content = linphone_core_create_content(pauline->lc);
|
||||
linphone_content_set_type(content,"image");
|
||||
linphone_content_set_subtype(content,"jpeg");
|
||||
linphone_content_set_size(content,file_size); /*total size to be transfered*/
|
||||
linphone_content_set_name(content,"nowebcamCIF.jpg");
|
||||
message = linphone_chat_room_create_file_transfer_message(chat_room, content);
|
||||
linphone_chat_message_set_user_data(message, file_to_send);
|
||||
cbs = linphone_chat_message_get_callbacks(message);
|
||||
{
|
||||
int dummy=0;
|
||||
wait_for_until(marie->lc,pauline->lc,&dummy,1,100); /*just to have time to purge message stored in the server*/
|
||||
reset_counters(&marie->stat);
|
||||
reset_counters(&pauline->stat);
|
||||
}
|
||||
linphone_chat_message_cbs_set_msg_state_changed(cbs,liblinphone_tester_chat_message_msg_state_changed);
|
||||
linphone_chat_message_cbs_set_file_transfer_send(cbs, file_transfer_send);
|
||||
linphone_chat_room_send_chat_message(chat_room,message);
|
||||
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageExtBodyReceived,1));
|
||||
fclose(file_to_send);
|
||||
if (marie->stat.last_received_chat_message ) {
|
||||
cbs = linphone_chat_message_get_callbacks(marie->stat.last_received_chat_message);
|
||||
linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed);
|
||||
linphone_chat_message_cbs_set_file_transfer_recv(cbs, file_transfer_received);
|
||||
linphone_chat_message_download_file(marie->stat.last_received_chat_message);
|
||||
}
|
||||
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageFileTransferDone,1));
|
||||
|
||||
CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1);
|
||||
CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageDelivered,1);
|
||||
CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,1);
|
||||
CU_ASSERT_TRUE(compare_files(send_filepath, receive_filepath));
|
||||
|
||||
linphone_content_unref(content);
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(pauline);
|
||||
ms_free(send_filepath);
|
||||
ms_free(receive_filepath);
|
||||
}
|
||||
|
||||
static void send_file_transfer_message_using_external_body_url(LinphoneCoreManager *marie, LinphoneCoreManager *pauline) {
|
||||
char *to;
|
||||
LinphoneChatMessageCbs *cbs;
|
||||
LinphoneChatRoom *chat_room;
|
||||
LinphoneChatMessage *message;
|
||||
|
||||
/* create a chatroom on pauline's side */
|
||||
to = linphone_address_as_string(marie->identity);
|
||||
chat_room = linphone_core_create_chat_room(pauline->lc,to);
|
||||
|
||||
message = linphone_chat_room_create_message(chat_room, NULL);
|
||||
|
||||
cbs = linphone_chat_message_get_callbacks(message);
|
||||
linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed);
|
||||
|
||||
linphone_chat_message_set_external_body_url(message, "https://www.linphone.org:444//tmp/54ec58280ace9_c30709218df8eaba61d1.jpg");
|
||||
linphone_chat_room_send_chat_message(chat_room, message);
|
||||
|
||||
CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1));
|
||||
if (marie->stat.last_received_chat_message) {
|
||||
linphone_chat_message_download_file(marie->stat.last_received_chat_message);
|
||||
}
|
||||
CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageExtBodyReceived, 1));
|
||||
|
||||
CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress, 1);
|
||||
CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived, 1);
|
||||
}
|
||||
|
||||
static void file_transfer_message_external_body_to_external_body_client(void) {
|
||||
LinphoneCoreManager* marie = linphone_core_manager_init( "marie_rc");
|
||||
LinphoneCoreManager* pauline = linphone_core_manager_init( "pauline_rc");
|
||||
|
||||
linphone_proxy_config_set_custom_header(marie->lc->default_proxy, "Accept", "application/sdp");
|
||||
linphone_core_manager_start(marie, "marie_rc", TRUE);
|
||||
|
||||
linphone_proxy_config_set_custom_header(pauline->lc->default_proxy, "Accept", "application/sdp");
|
||||
linphone_core_manager_start(pauline, "pauline_rc", TRUE);
|
||||
|
||||
reset_counters(&marie->stat);
|
||||
reset_counters(&pauline->stat);
|
||||
|
||||
linphone_core_refresh_registers(marie->lc);
|
||||
linphone_core_refresh_registers(pauline->lc);
|
||||
|
||||
send_file_transfer_message_using_external_body_url(marie, pauline);
|
||||
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(pauline);
|
||||
}
|
||||
|
||||
static void file_transfer_message_external_body_to_rcs_client(void) {
|
||||
LinphoneCoreManager* marie = linphone_core_manager_init( "marie_rc");
|
||||
LinphoneCoreManager* pauline = linphone_core_manager_init( "pauline_rc");
|
||||
|
||||
linphone_proxy_config_set_custom_header(marie->lc->default_proxy, "Accept", "application/sdp");
|
||||
linphone_core_manager_start(marie, "marie_rc", TRUE);
|
||||
|
||||
linphone_proxy_config_set_custom_header(pauline->lc->default_proxy, "Accept", "application/sdp, text/plain, application/vnd.gsma.rcs-ft-http+xml");
|
||||
linphone_core_manager_start(pauline, "pauline_rc", TRUE);
|
||||
|
||||
reset_counters(&marie->stat);
|
||||
reset_counters(&pauline->stat);
|
||||
|
||||
send_file_transfer_message_using_external_body_url(marie, pauline);
|
||||
|
||||
linphone_core_manager_destroy(marie);
|
||||
linphone_core_manager_destroy(pauline);
|
||||
}
|
||||
|
||||
test_t flexisip_tests[] = {
|
||||
{ "Subscribe forking", subscribe_forking },
|
||||
{ "Message forking", message_forking },
|
||||
|
|
@ -730,7 +874,10 @@ test_t flexisip_tests[] = {
|
|||
{ "Early-media call forking", early_media_call_forking },
|
||||
{ "Call with sips", call_with_sips },
|
||||
{ "Call with sips not achievable", call_with_sips_not_achievable },
|
||||
{ "Call with ipv6", call_with_ipv6 }
|
||||
{ "Call with ipv6", call_with_ipv6 },
|
||||
{ "File transfer message rcs to external body client", file_transfer_message_rcs_to_external_body_client },
|
||||
{ "File transfer message external body to rcs client", file_transfer_message_external_body_to_rcs_client },
|
||||
{ "File transfer message external body to external body client", file_transfer_message_external_body_to_external_body_client }
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,9 @@
|
|||
#include <gtk/gtk.h>
|
||||
#endif
|
||||
|
||||
extern int liblinphone_tester_use_log_file;
|
||||
|
||||
static FILE * log_file = NULL;
|
||||
static OrtpLogFunc ortp_log_handler;
|
||||
|
||||
#ifdef ANDROID
|
||||
|
||||
|
|
@ -43,7 +45,7 @@ static const char* LogDomain = "liblinphone_tester";
|
|||
|
||||
int main(int argc, char** argv);
|
||||
|
||||
void linphone_android_log_handler(int prio, const char *fmt, va_list args) {
|
||||
void liblinphone_android_log_handler(int prio, const char *fmt, va_list args) {
|
||||
char str[4096];
|
||||
char *current;
|
||||
char *next;
|
||||
|
|
@ -63,17 +65,17 @@ void linphone_android_log_handler(int prio, const char *fmt, va_list args) {
|
|||
}
|
||||
}
|
||||
|
||||
static void linphone_android_ortp_log_handler(OrtpLogLevel lev, const char *fmt, va_list args) {
|
||||
static void liblinphone_android_ortp_log_handler(OrtpLogLevel lev, const char *fmt, va_list args) {
|
||||
int prio;
|
||||
switch(lev){
|
||||
case ORTP_DEBUG: prio = ANDROID_LOG_DEBUG; break;
|
||||
case ORTP_MESSAGE: prio = ANDROID_LOG_INFO; break;
|
||||
case ORTP_WARNING: prio = ANDROID_LOG_WARN; break;
|
||||
case ORTP_ERROR: prio = ANDROID_LOG_ERROR; break;
|
||||
case ORTP_FATAL: prio = ANDROID_LOG_FATAL; break;
|
||||
default: prio = ANDROID_LOG_DEFAULT; break;
|
||||
case ORTP_DEBUG: prio = ANDROID_LOG_DEBUG; break;
|
||||
case ORTP_MESSAGE: prio = ANDROID_LOG_INFO; break;
|
||||
case ORTP_WARNING: prio = ANDROID_LOG_WARN; break;
|
||||
case ORTP_ERROR: prio = ANDROID_LOG_ERROR; break;
|
||||
case ORTP_FATAL: prio = ANDROID_LOG_FATAL; break;
|
||||
default: prio = ANDROID_LOG_DEFAULT; break;
|
||||
}
|
||||
linphone_android_log_handler(prio, fmt, args);
|
||||
liblinphone_android_log_handler(prio, fmt, args);
|
||||
}
|
||||
|
||||
void cunit_android_trace_handler(int level, const char *fmt, va_list args) {
|
||||
|
|
@ -121,7 +123,6 @@ JNIEXPORT void JNICALL Java_org_linphone_tester_Tester_keepAccounts(JNIEnv *env,
|
|||
JNIEXPORT void JNICALL Java_org_linphone_tester_Tester_clearAccounts(JNIEnv *env, jclass c) {
|
||||
liblinphone_tester_clear_accounts();
|
||||
}
|
||||
|
||||
#endif /* ANDROID */
|
||||
|
||||
#ifdef __QNX__
|
||||
|
|
@ -130,48 +131,48 @@ static void liblinphone_tester_qnx_log_handler(OrtpLogLevel lev, const char *fmt
|
|||
}
|
||||
#endif /* __QNX__ */
|
||||
|
||||
|
||||
|
||||
void helper(const char *name) {
|
||||
liblinphone_tester_fprintf(stderr,"%s --help\n"
|
||||
"\t\t\t--verbose\n"
|
||||
"\t\t\t--silent\n"
|
||||
"\t\t\t--list-suites\n"
|
||||
"\t\t\t--list-tests <suite>\n"
|
||||
"\t\t\t--config <config path>\n"
|
||||
"\t\t\t--domain <test sip domain>\n"
|
||||
"\t\t\t--auth-domain <test auth domain>\n"
|
||||
"\t\t\t--suite <suite name>\n"
|
||||
"\t\t\t--test <test name>\n"
|
||||
"\t\t\t--dns-hosts </etc/hosts -like file to used to override DNS names (default: tester_hosts)>\n"
|
||||
"\t\t\t--log-file <output log file path>\n"
|
||||
#if HAVE_CU_CURSES
|
||||
"\t\t\t--curses\n"
|
||||
#endif
|
||||
"\t\t\t--xml\n"
|
||||
"\t\t\t--xml-file <xml file prefix (will be suffixed by '-Results.xml')>\n"
|
||||
, name);
|
||||
static void log_handler(int lev, const char *fmt, va_list args) {
|
||||
ortp_set_log_file(stderr);
|
||||
ortp_log_handler(lev, fmt, args);
|
||||
if (log_file){
|
||||
ortp_set_log_file(log_file);
|
||||
ortp_log_handler(lev, fmt, args);
|
||||
}
|
||||
}
|
||||
|
||||
#define CHECK_ARG(argument, index, argc) \
|
||||
if(index >= argc) { \
|
||||
fprintf(stderr, "Missing argument for \"%s\"\n", argument); \
|
||||
return -1; \
|
||||
} \
|
||||
void liblinphone_tester_init(void) {
|
||||
ortp_log_handler = ortp_get_log_handler();
|
||||
#if defined(ANDROID)
|
||||
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);
|
||||
#endif
|
||||
|
||||
#ifndef WINAPI_FAMILY_PHONE_APP
|
||||
bc_tester_init(log_handler, ORTP_MESSAGE, ORTP_ERROR);
|
||||
liblinphone_tester_add_suites();
|
||||
}
|
||||
|
||||
void liblinphone_tester_uninit(void) {
|
||||
bc_tester_uninit();
|
||||
}
|
||||
|
||||
|
||||
static const char* liblinphone_helper =
|
||||
"\t\t\t--verbose\n"
|
||||
"\t\t\t--silent\n"
|
||||
"\t\t\t--log-file <output log file path>\n"
|
||||
"\t\t\t--config <config path>\n"
|
||||
"\t\t\t--domain <test sip domain>\n"
|
||||
"\t\t\t--auth-domain <test auth domain>\n"
|
||||
"\t\t\t--dns-hosts </etc/hosts -like file to used to override DNS names (default: tester_hosts)>\n";
|
||||
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
const char *suite_name=NULL;
|
||||
const char *test_name=NULL;
|
||||
const char *xml_file="CUnitAutomated-Results.xml";
|
||||
char *xml_tmp_file=NULL;
|
||||
int xml = 0;
|
||||
FILE* log_file=NULL;
|
||||
|
||||
#ifdef HAVE_GTK
|
||||
gtk_init(&argc, &argv);
|
||||
|
|
@ -181,95 +182,48 @@ int main (int argc, char *argv[])
|
|||
gdk_threads_init();
|
||||
#endif
|
||||
|
||||
#if defined(ANDROID)
|
||||
linphone_core_set_log_handler(linphone_android_ortp_log_handler);
|
||||
#elif defined(__QNX__)
|
||||
linphone_core_set_log_handler(liblinphone_tester_qnx_log_handler);
|
||||
#else
|
||||
linphone_core_set_log_file(NULL);
|
||||
#endif
|
||||
|
||||
liblinphone_tester_init();
|
||||
|
||||
for(i=1;i<argc;++i){
|
||||
if (strcmp(argv[i],"--help")==0){
|
||||
helper(argv[0]);
|
||||
return 0;
|
||||
} else if (strcmp(argv[i],"--verbose")==0){
|
||||
linphone_core_set_log_level(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL);
|
||||
} else if (strcmp(argv[i],"--silent")==0){
|
||||
for(i = 1; i < argc; ++i) {
|
||||
if (strcmp(argv[i], "--verbose") == 0) {
|
||||
linphone_core_set_log_level(ORTP_MESSAGE);
|
||||
} else if (strcmp(argv[i], "--silent") == 0) {
|
||||
linphone_core_set_log_level(ORTP_FATAL);
|
||||
} else if (strcmp(argv[i],"--log-file")==0){
|
||||
CHECK_ARG("--log-file", ++i, argc);
|
||||
log_file=fopen(argv[i],"w");
|
||||
if (!log_file) {
|
||||
ms_error("Cannot open file [%s] for writing logs because [%s]",argv[i],strerror(errno));
|
||||
return -2;
|
||||
} else {
|
||||
ms_message("Redirecting traces to file [%s]",argv[i]);
|
||||
}
|
||||
} else if (strcmp(argv[i],"--domain")==0){
|
||||
CHECK_ARG("--domain", ++i, argc);
|
||||
test_domain=argv[i];
|
||||
} else if (strcmp(argv[i],"--auth-domain")==0){
|
||||
CHECK_ARG("--auth-domain", ++i, argc);
|
||||
auth_domain=argv[i];
|
||||
} else if (strcmp(argv[i],"--test")==0){
|
||||
CHECK_ARG("--test", ++i, argc);
|
||||
test_name=argv[i];
|
||||
} else if (strcmp(argv[i],"--config")==0){
|
||||
CHECK_ARG("--config", ++i, argc);
|
||||
liblinphone_tester_file_prefix=argv[i];
|
||||
bc_tester_read_dir_prefix=argv[i];
|
||||
}else if (strcmp(argv[i],"--dns-hosts")==0){
|
||||
CHECK_ARG("--dns-hosts", ++i, argc);
|
||||
userhostsfile=argv[i];
|
||||
}else if (strcmp(argv[i],"--suite")==0){
|
||||
CHECK_ARG("--suite", ++i, argc);
|
||||
suite_name=argv[i];
|
||||
} else if (strcmp(argv[i],"--list-suites")==0){
|
||||
liblinphone_tester_list_suites();
|
||||
return 0;
|
||||
} else if (strcmp(argv[i],"--list-tests")==0){
|
||||
CHECK_ARG("--list-tests", ++i, argc);
|
||||
suite_name = argv[i];
|
||||
liblinphone_tester_list_suite_tests(suite_name);
|
||||
return 0;
|
||||
} else if (strcmp(argv[i], "--xml-file") == 0){
|
||||
CHECK_ARG("--xml-file", ++i, argc);
|
||||
xml_file = argv[i];
|
||||
xml = 1;
|
||||
} else if (strcmp(argv[i], "--xml") == 0){
|
||||
xml = 1;
|
||||
} else if (strcmp(argv[i],"--log-file")==0){
|
||||
CHECK_ARG("--log-file", ++i, argc);
|
||||
log_file=fopen(argv[i],"w");
|
||||
if (!log_file) {
|
||||
ms_fatal("Cannot open file [%s] for writting logs because [%s]",argv[i],strerror(errno));
|
||||
} else {
|
||||
liblinphone_tester_use_log_file=1;
|
||||
liblinphone_tester_fprintf(stdout,"Redirecting traces to file [%s]",argv[i]);
|
||||
linphone_core_set_log_file(log_file);
|
||||
} else {
|
||||
int ret = bc_tester_parse_args(argc, argv, i);
|
||||
if (ret>0) {
|
||||
i += ret - 1;
|
||||
continue;
|
||||
} else if (ret<0) {
|
||||
bc_tester_helper(argv[0], liblinphone_helper);
|
||||
}
|
||||
|
||||
}else {
|
||||
liblinphone_tester_fprintf(stderr, "Unknown option \"%s\"\n", argv[i]); \
|
||||
helper(argv[0]);
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if( xml && (suite_name || test_name) ){
|
||||
printf("Cannot use both xml and specific test suite\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if( xml ){
|
||||
xml_tmp_file = ms_strdup_printf("%s.tmp", xml_file);
|
||||
liblinphone_tester_set_xml_output(xml_tmp_file);
|
||||
}
|
||||
liblinphone_tester_enable_xml(xml);
|
||||
|
||||
ret = liblinphone_tester_run_tests(suite_name, test_name);
|
||||
ret = bc_tester_start();
|
||||
liblinphone_tester_uninit();
|
||||
|
||||
if ( xml ) {
|
||||
/*create real xml file only if tester did not crash*/
|
||||
ms_strcat_printf(xml_tmp_file, "-Results.xml");
|
||||
rename(xml_tmp_file, xml_file);
|
||||
ms_free(xml_tmp_file);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif /* WINAPI_FAMILY_PHONE_APP */
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -22,34 +22,16 @@
|
|||
|
||||
|
||||
|
||||
#include "CUnit/Basic.h"
|
||||
#include "common/bc_tester_utils.h"
|
||||
#include "linphonecore.h"
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
typedef void (*test_function_t)(void);
|
||||
typedef int (*test_suite_function_t)(const char *name);
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
test_function_t func;
|
||||
} test_t;
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
CU_InitializeFunc init_func;
|
||||
CU_CleanupFunc cleanup_func;
|
||||
int nb_tests;
|
||||
test_t *tests;
|
||||
} test_suite_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern const char *liblinphone_tester_file_prefix;
|
||||
extern const char *liblinphone_tester_writable_dir_prefix;
|
||||
extern test_suite_t setup_test_suite;
|
||||
extern test_suite_t register_test_suite;
|
||||
extern test_suite_t call_test_suite;
|
||||
|
|
@ -68,28 +50,11 @@ extern test_suite_t dtmf_test_suite;
|
|||
extern test_suite_t offeranswer_test_suite;
|
||||
extern test_suite_t video_test_suite;
|
||||
extern test_suite_t multicast_call_test_suite;
|
||||
extern test_suite_t multi_call_test_suite;
|
||||
|
||||
|
||||
extern int liblinphone_tester_nb_test_suites(void);
|
||||
extern int liblinphone_tester_nb_tests(const char *suite_name);
|
||||
extern const char * liblinphone_tester_test_suite_name(int suite_index);
|
||||
extern int liblinphone_tester_test_suite_index(const char *suite_name);
|
||||
extern void liblinphone_tester_list_suites();
|
||||
extern void liblinphone_tester_list_suite_tests(const char *suite_name);
|
||||
extern const char * liblinphone_tester_test_name(const char *suite_name, int test_index);
|
||||
extern int liblinphone_tester_test_index(const char *suite_name, const char *test_name);
|
||||
extern void liblinphone_tester_init(void);
|
||||
extern void liblinphone_tester_uninit(void);
|
||||
extern int liblinphone_tester_run_tests(const char *suite_name, const char *test_name);
|
||||
extern void liblinphone_tester_set_fileprefix(const char* file_prefix);
|
||||
extern void liblinphone_tester_set_writable_dir_prefix(const char* writable_dir_prefix);
|
||||
extern int liblinphone_tester_ipv6_available(void);
|
||||
|
||||
|
||||
extern void liblinphone_tester_enable_xml( bool_t enable );
|
||||
extern void liblinphone_tester_set_xml_output(const char *xml_path );
|
||||
extern const char* liblinphone_tester_get_xml_output(void);
|
||||
|
||||
/**
|
||||
* @brief Tells the tester whether or not to clean the accounts it has created between runs.
|
||||
* @details Setting this to 1 will not clear the list of created accounts between successive
|
||||
|
|
@ -166,6 +131,7 @@ typedef struct _stats {
|
|||
int number_of_LinphoneMessageInProgress;
|
||||
int number_of_LinphoneMessageDelivered;
|
||||
int number_of_LinphoneMessageNotDelivered;
|
||||
int number_of_LinphoneMessageFileTransferDone;
|
||||
int number_of_LinphoneIsComposingActiveReceived;
|
||||
int number_of_LinphoneIsComposingIdleReceived;
|
||||
int progress_of_LinphoneFileTransfer;
|
||||
|
|
@ -241,6 +207,11 @@ typedef struct _stats {
|
|||
|
||||
int number_of_video_windows_created;
|
||||
|
||||
int number_of_LinphoneFileTransferDownloadSuccessful;
|
||||
int number_of_LinphoneCoreLogCollectionUploadStateDelivered;
|
||||
int number_of_LinphoneCoreLogCollectionUploadStateNotDelivered;
|
||||
int number_of_LinphoneCoreLogCollectionUploadStateInProgress;
|
||||
|
||||
}stats;
|
||||
|
||||
typedef struct _LinphoneCoreManager {
|
||||
|
|
@ -259,6 +230,11 @@ typedef struct _LinphoneCallTestParams {
|
|||
bool_t sdp_simulate_error;
|
||||
} LinphoneCallTestParams;
|
||||
|
||||
|
||||
void liblinphone_tester_add_suites();
|
||||
|
||||
LinphoneCoreManager* linphone_core_manager_init(const char* rc_file);
|
||||
void linphone_core_manager_start(LinphoneCoreManager *mgr, const char* rc_file, int check_for_proxies);
|
||||
LinphoneCoreManager* linphone_core_manager_new2(const char* rc_file, int check_for_proxies);
|
||||
LinphoneCoreManager* linphone_core_manager_new(const char* rc_file);
|
||||
void linphone_core_manager_stop(LinphoneCoreManager *mgr);
|
||||
|
|
@ -318,13 +294,12 @@ void linphone_core_manager_check_accounts(LinphoneCoreManager *m);
|
|||
void account_manager_destroy(void);
|
||||
LinphoneCore* configure_lc_from(LinphoneCoreVTable* v_table, const char* path, const char* file, void* user_data);
|
||||
void liblinphone_tester_enable_ipv6(bool_t enabled);
|
||||
#ifdef ANDROID
|
||||
void cunit_android_trace_handler(int level, const char *fmt, va_list args) ;
|
||||
#endif
|
||||
int liblinphone_tester_fprintf(FILE * stream, const char * format, ...);
|
||||
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(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);
|
||||
bool_t compare_files(const char *path1, const char *path2);
|
||||
#endif /* LIBLINPHONE_TESTER_H_ */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
belle-sip - SIP (RFC3261) library.
|
||||
Copyright (C) 2010 Belledonne Communications SARL
|
||||
Linphone
|
||||
Copyright (C) 2014 Belledonne Communications SARL
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -67,7 +67,7 @@ static size_t getline(char **lineptr, size_t *n, FILE *stream) {
|
|||
p = bufptr;
|
||||
while(c != EOF) {
|
||||
size_t curpos = p-bufptr;
|
||||
|
||||
|
||||
if (curpos > (size - 1)) {
|
||||
size = size + 128;
|
||||
bufptr = realloc(bufptr, size);
|
||||
|
|
@ -94,7 +94,7 @@ static size_t getline(char **lineptr, size_t *n, FILE *stream) {
|
|||
static LinphoneLogCollectionState old_collection_state;
|
||||
static void collect_init() {
|
||||
old_collection_state = linphone_core_log_collection_enabled();
|
||||
linphone_core_set_log_collection_path(liblinphone_tester_writable_dir_prefix);
|
||||
linphone_core_set_log_collection_path(bc_tester_writable_dir_prefix);
|
||||
}
|
||||
|
||||
static void collect_cleanup(LinphoneCoreManager *marie) {
|
||||
|
|
@ -171,7 +171,7 @@ static time_t check_file(LinphoneCoreManager* mgr) {
|
|||
CU_ASSERT_PTR_NOT_NULL(file);
|
||||
if (!file) return 0;
|
||||
// 1) expect to find folder name in filename path
|
||||
CU_ASSERT_PTR_NOT_NULL(strstr(filepath, liblinphone_tester_writable_dir_prefix));
|
||||
CU_ASSERT_PTR_NOT_NULL(strstr(filepath, bc_tester_writable_dir_prefix));
|
||||
|
||||
// 2) check file contents
|
||||
while (getline(&line, &line_size, file) != -1) {
|
||||
|
|
@ -244,12 +244,54 @@ static void collect_files_changing_size() {
|
|||
|
||||
collect_cleanup(marie);
|
||||
}
|
||||
static void logCollectionUploadStateChangedCb(LinphoneCore *lc, LinphoneCoreLogCollectionUploadState state, const char *info) {
|
||||
|
||||
stats* counters = get_stats(lc);
|
||||
switch(state) {
|
||||
case LinphoneCoreLogCollectionUploadStateInProgress:
|
||||
counters->number_of_LinphoneCoreLogCollectionUploadStateInProgress++;
|
||||
break;
|
||||
case LinphoneCoreLogCollectionUploadStateDelivered:
|
||||
counters->number_of_LinphoneCoreLogCollectionUploadStateDelivered++;
|
||||
CU_ASSERT_TRUE(strlen(info)>0)
|
||||
break;
|
||||
case LinphoneCoreLogCollectionUploadStateNotDelivered:
|
||||
counters->number_of_LinphoneCoreLogCollectionUploadStateNotDelivered++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
static void upload_collected_traces() {
|
||||
LinphoneCoreManager* marie = setup(TRUE);
|
||||
int waiting = 100;
|
||||
LinphoneCoreVTable *v_table = linphone_core_v_table_new();
|
||||
v_table->log_collection_upload_state_changed = logCollectionUploadStateChangedCb;
|
||||
linphone_core_add_listener(marie->lc, v_table);
|
||||
|
||||
linphone_core_set_log_collection_max_file_size(5000);
|
||||
linphone_core_set_log_collection_upload_server_url(marie->lc,"https://www.linphone.org:444/lft.php");
|
||||
// Generate some logs
|
||||
while (--waiting) ms_error("(test error)Waiting %d...", waiting);
|
||||
linphone_core_compress_log_collection(marie->lc);
|
||||
linphone_core_upload_log_collection(marie->lc);
|
||||
CU_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneCoreLogCollectionUploadStateDelivered,1));
|
||||
|
||||
/*try 2 times*/
|
||||
waiting=100;
|
||||
linphone_core_reset_log_collection(marie->lc);
|
||||
while (--waiting) ms_error("(test error)Waiting %d...", waiting);
|
||||
linphone_core_compress_log_collection(marie->lc);
|
||||
linphone_core_upload_log_collection(marie->lc);
|
||||
CU_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneCoreLogCollectionUploadStateDelivered,2));
|
||||
|
||||
collect_cleanup(marie);
|
||||
}
|
||||
|
||||
test_t log_collection_tests[] = {
|
||||
{ "No file when disabled", collect_files_disabled},
|
||||
{ "Collect files filled when enabled", collect_files_filled},
|
||||
{ "Logs collected into small file", collect_files_small_size},
|
||||
{ "Logs collected when decreasing max size", collect_files_changing_size},
|
||||
{ "Upload collected traces", upload_collected_traces}
|
||||
};
|
||||
|
||||
test_suite_t log_collection_test_suite = {
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue