diff --git a/.cproject b/.cproject
index 07ef2412f..0d1eed0ed 100644
--- a/.cproject
+++ b/.cproject
@@ -60,47 +60,6 @@
-
-
-
- make
- all
- true
- true
- true
-
-
- make
- CFLAGS="-g"
- install
- true
- true
- true
-
-
- make
- CFLAGS="-g"
- install
- true
- true
- true
-
-
- make
- all
- true
- true
- true
-
-
- make
- all
- true
- true
- true
-
-
-
@@ -209,4 +168,40 @@
+
+
+
+ make
+ -j4 CFLAGS="-g -Wall -Werror -Qunused-arguments" CXXFLAGS="-g"
+ all
+ true
+ true
+ true
+
+
+ make
+ -j4 CFLAGS="-g -Wall -Werror -Qunused-arguments" CXXFLAGS="-g"
+
+ true
+ true
+ true
+
+
+ make
+ -j4 CFLAGS="-g -Wall -Werror -Qunused-arguments" CXXFLAGS="-g"
+ all
+ true
+ true
+ true
+
+
+ make
+ -j4 CFLAGS="-g -Wall -Werror -Qunused-arguments" CXXFLAGS="-g"
+ all
+ true
+ true
+ true
+
+
+
diff --git a/.gitignore b/.gitignore
index 974e81a75..121e4f172 100644
--- a/.gitignore
+++ b/.gitignore
@@ -74,3 +74,5 @@ tester/liblinphone_tester
tools/lp-gen-wrappers
tools/lpc2xml_test
tools/xml2lpc_test
+coreapi/help/filetransfer
+tester/receive_file.dump
diff --git a/build/android/Android.mk b/build/android/Android.mk
index d815a11a9..438732952 100755
--- a/build/android/Android.mk
+++ b/build/android/Android.mk
@@ -160,10 +160,31 @@ LOCAL_CFLAGS += -DHAVE_SILK
LOCAL_STATIC_LIBRARIES += libmssilk
endif
-ifeq ($(BUILD_WEBRTC_ISAC),1)
-LOCAL_CFLAGS += -DHAVE_ISAC
-LOCAL_STATIC_LIBRARIES += libwebrtc_isacfix_neon
-LOCAL_STATIC_LIBRARIES += libwebrtc_spl libwebrtc_isacfix libmsisac
+ifneq ($(BUILD_WEBRTC_AECM)$(BUILD_WEBRTC_ISAC),00)
+LOCAL_CFLAGS += -DHAVE_WEBRTC
+LOCAL_STATIC_LIBRARIES += libmswebrtc
+endif
+ifneq ($(BUILD_WEBRTC_AECM),0)
+LOCAL_STATIC_LIBRARIES += \
+ libwebrtc_aecm \
+ libwebrtc_apm_utility \
+ libwebrtc_spl \
+ libwebrtc_system_wrappers
+ifeq ($(TARGET_ARCH_ABI), armeabi-v7a)
+LOCAL_STATIC_LIBRARIES += \
+ libwebrtc_aecm_neon \
+ libwebrtc_spl_neon
+endif
+endif
+ifneq ($(BUILD_WEBRTC_ISAC),0)
+LOCAL_STATIC_LIBRARIES += \
+ libwebrtc_isacfix \
+ libwebrtc_spl
+ifeq ($(TARGET_ARCH_ABI), armeabi-v7a)
+LOCAL_STATIC_LIBRARIES += \
+ libwebrtc_isacfix_neon \
+ libwebrtc_spl_neon
+endif
endif
ifeq ($(BUILD_G729),1)
diff --git a/build/android/liblinphone_tester.mk b/build/android/liblinphone_tester.mk
index 8e5221e20..e9a2c8718 100644
--- a/build/android/liblinphone_tester.mk
+++ b/build/android/liblinphone_tester.mk
@@ -12,21 +12,22 @@ common_SRC_FILES := \
stun_tester.c \
flexisip_tester.c \
tester.c \
- remote_provisioning_tester.c
-
+ remote_provisioning_tester.c \
+ quality_reporting_tester.c
+
common_C_INCLUDES += \
$(LOCAL_PATH) \
$(LOCAL_PATH)/../include \
$(LOCAL_PATH)/../coreapi \
$(LOCAL_PATH)/../oRTP/include \
- $(LOCAL_PATH)/../mediastreamer2/include
+ $(LOCAL_PATH)/../mediastreamer2/include
include $(CLEAR_VARS)
-LOCAL_MODULE := liblinphone_tester
+LOCAL_MODULE := liblinphone_tester
LOCAL_MODULE_FILENAME := liblinphone_tester-$(TARGET_ARCH_ABI)
-LOCAL_SRC_FILES += $(common_SRC_FILES)
+LOCAL_SRC_FILES += $(common_SRC_FILES)
LOCAL_C_INCLUDES = $(common_C_INCLUDES)
LOCAL_CFLAGS = -DIN_LINPHONE
LOCAL_LDLIBS := -llog
diff --git a/build/vsx/LibLinphone/LibLinphone.vcxproj b/build/vsx/LibLinphone/LibLinphone.vcxproj
deleted file mode 100644
index bc1f56695..000000000
--- a/build/vsx/LibLinphone/LibLinphone.vcxproj
+++ /dev/null
@@ -1,279 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
- Debug
- ARM
-
-
- Release
- Win32
-
-
- Release
- ARM
-
-
-
- {08dd0d38-d9b5-4626-b60d-b4d76b571142}
- LibLinphone
- en-US
- 11.0
-
-
-
- DynamicLibrary
- true
- v110
- false
-
-
- DynamicLibrary
- true
- v110_wp80
- false
-
-
- DynamicLibrary
- false
- true
- v110
- false
-
-
- DynamicLibrary
- false
- true
- v110_wp80
- false
-
-
-
-
-
-
-
- $(SolutionDir)$(Platform)\$(Configuration)\
- $(SolutionDir)$(Platform)\$(Configuration)\$(TargetName)\
-
-
- false
-
-
-
- Level4
- $(ProjectDir)..\..\..\..\belle-sip\include;$(ProjectDir)..\..\..\..\oRTP\include;$(ProjectDir)..\..\..\..\mediastreamer2\include;$(ProjectDIr)..\..\..\..\tunnel\include;$(ProjectDir)..\..\..\coreapi;$(ProjectDir)..\..\..\include;$(SolutionDir)$(Platform)\$(Configuration)\include;%(AdditionalIncludeDirectories)
- __STDC_CONSTANT_MACROS;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;WINDOW_NATIVE;_TRUE_TIME;IN_LINPHONE;USE_BELLESIP;TUNNEL_ENABLED;VIDEO_ENABLED;LINPHONE_PACKAGE_NAME="linphone";LINPHONE_VERSION="Devel";LIBLINPHONE_EXPORTS;LINPHONE_PLUGINS_DIR="";UNICODE;%(PreprocessorDefinitions)
- false
- Default
- NotUsing
- false
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
-
-
- Console
- false
- false
- true
- belle-sip_dll.lib;mediastreamer2_dll.lib;ws2_32.lib;ortp_dll.lib;gsm_dll.lib;speex_dll.lib;speexdsp_dll.lib;%(AdditionalDependencies)
- $(SolutionDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
- $(TargetDir)$(TargetName)_dll.lib
-
-
- $(TargetDir)$(TargetName)_dll.lib;%(Outputs)
-
-
-
-
- Level4
- $(ProjectDir)..\..\..\..\belle-sip\include;$(ProjectDir)..\..\..\..\oRTP\include;$(ProjectDir)..\..\..\..\mediastreamer2\include;$(ProjectDIr)..\..\..\..\tunnel\include;$(ProjectDir)..\..\..\coreapi;$(ProjectDir)..\..\..\include;$(SolutionDir)$(Platform)\$(Configuration)\include;%(AdditionalIncludeDirectories)
- __STDC_CONSTANT_MACROS;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;WINDOW_NATIVE;_TRUE_TIME;IN_LINPHONE;USE_BELLESIP;TUNNEL_ENABLED;VIDEO_ENABLED;LINPHONE_PACKAGE_NAME="linphone";LINPHONE_VERSION="Devel";LIBLINPHONE_EXPORTS;LINPHONE_PLUGINS_DIR="";UNICODE;%(PreprocessorDefinitions)
- true
- true
- Default
- true
- NotUsing
- false
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
-
-
- Console
- false
- false
- false
- belle-sip_dll.lib;mediastreamer2_dll.lib;ws2_32.lib;ortp_dll.lib;gsm_dll.lib;speex_dll.lib;speexdsp_dll.lib;%(AdditionalDependencies)
- $(SolutionDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
- $(TargetDir)$(TargetName)_dll.lib
-
-
- $(TargetDir)$(TargetName)_dll.lib;%(Outputs)
-
-
-
-
- Level4
- $(ProjectDir)..\..\..\..\belle-sip\include;$(ProjectDir)..\..\..\..\oRTP\include;$(ProjectDir)..\..\..\..\mediastreamer2\include;$(ProjectDIr)..\..\..\..\tunnel\include;$(ProjectDir)..\..\..\coreapi;$(ProjectDir)..\..\..\include;$(SolutionDir)$(Platform)\$(Configuration)\include;%(AdditionalIncludeDirectories)
- __STDC_CONSTANT_MACROS;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;WINDOW_NATIVE;_TRUE_TIME;IN_LINPHONE;USE_BELLESIP;TUNNEL_ENABLED;VIDEO_ENABLED;LINPHONE_PACKAGE_NAME="linphone";LINPHONE_VERSION="Devel";LIBLINPHONE_EXPORTS;LINPHONE_PLUGINS_DIR="";UNICODE;_XKEYCHECK_H;%(PreprocessorDefinitions)
- false
- Default
- NotUsing
- false
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
- false
- false
- SyncCThrow
-
-
- Console
- false
- false
- true
- ws2_32.lib;%(AdditionalDependencies)
- $(SolutionDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
- $(TargetDir)$(TargetName)_dll.lib
- ole32.lib;%(IgnoreSpecificDefaultLibraries)
-
-
-
-
- $(TargetDir)$(TargetName)_dll.lib;%(Outputs)
-
-
-
-
- Level4
- $(ProjectDir)..\..\..\..\belle-sip\include;$(ProjectDir)..\..\..\..\oRTP\include;$(ProjectDir)..\..\..\..\mediastreamer2\include;$(ProjectDIr)..\..\..\..\tunnel\include;$(ProjectDir)..\..\..\coreapi;$(ProjectDir)..\..\..\include;$(SolutionDir)$(Platform)\$(Configuration)\include;%(AdditionalIncludeDirectories)
- __STDC_CONSTANT_MACROS;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;WINDOW_NATIVE;_TRUE_TIME;IN_LINPHONE;USE_BELLESIP;TUNNEL_ENABLED;VIDEO_ENABLED;LINPHONE_PACKAGE_NAME="linphone";LINPHONE_VERSION="Devel";LIBLINPHONE_EXPORTS;LINPHONE_PLUGINS_DIR="";UNICODE;_XKEYCHECK_H;%(PreprocessorDefinitions)
- true
- true
- Default
- true
- NotUsing
- false
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
-
-
- Console
- false
- false
- false
- belle-sip_dll.lib;mediastreamer2_dll.lib;ws2_32.lib;ortp_dll.lib;gsm_dll.lib;speex_dll.lib;speexdsp_dll.lib;%(AdditionalDependencies)
- $(SolutionDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
- $(TargetDir)$(TargetName)_dll.lib
-
-
- $(TargetDir)$(TargetName)_dll.lib;%(Outputs)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {4c225a82-800b-427b-ba7b-61686a9b347f}
-
-
- {027bad0e-9179-48c1-9733-7aa7e2c2ec70}
-
-
- {9924ac72-f96c-4e56-94d9-2b025da43c6b}
-
-
- {072fad20-7007-4da2-b2e7-16ce2b219f67}
-
-
- {b16b81a9-bef2-44c9-b603-1065183ae844}
-
-
- {36b528f9-fb79-4078-a16b-0a7442581bb7}
-
-
- {d22bd217-d0f8-4274-9b3a-f3f35f46482c}
-
-
- {ffc7b532-0502-4d88-ac98-9e89071cbc97}
- false
- true
- false
- true
- false
-
-
- {59500dd1-b192-4ddf-a402-8a8e3739e032}
-
-
- {5dfa07b4-0be9-46a9-ba32-fdf5a55c580b}
-
-
-
-
- true
-
-
- true
- false
-
-
-
-
-
-
-
-
-
-
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8.sln b/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8.sln
deleted file mode 100644
index cccf2645c..000000000
--- a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8.sln
+++ /dev/null
@@ -1,522 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Express 2012 for Windows Phone
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibLinphoneTester-wp8", "LibLinphoneTester-wp8\LibLinphoneTester-wp8.csproj", "{34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}"
- ProjectSection(ProjectDependencies) = postProject
- {5E94A00B-B14A-4E42-8284-8CB0EF099534} = {5E94A00B-B14A-4E42-8284-8CB0EF099534}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibLinphone", "..\LibLinphone\LibLinphone.vcxproj", "{08DD0D38-D9B5-4626-B60D-B4D76B571142}"
- ProjectSection(ProjectDependencies) = postProject
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C} = {D22BD217-D0F8-4274-9B3A-F3F35F46482C}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibLinphoneTester", "..\LibLinphoneTester\LibLinphoneTester.vcxproj", "{5E94A00B-B14A-4E42-8284-8CB0EF099534}"
- ProjectSection(ProjectDependencies) = postProject
- {902DAF1D-EBF1-4D03-B598-143500A50AB4} = {902DAF1D-EBF1-4D03-B598-143500A50AB4}
- {08DD0D38-D9B5-4626-B60D-B4D76B571142} = {08DD0D38-D9B5-4626-B60D-B4D76B571142}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "belle-sip", "..\..\..\..\belle-sip\build\windows\belle-sip\belle-sip.vcxproj", "{4C225A82-800B-427B-BA7B-61686A9B347F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mediastreamer2", "..\..\..\..\mediastreamer2\build\vsx\mediastreamer2\mediastreamer2\mediastreamer2.vcxproj", "{027BAD0E-9179-48C1-9733-7AA7E2C2EC70}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "oRTP", "..\..\..\..\oRTP\build\vsx\oRTP\oRTP\oRTP.vcxproj", "{FFC7B532-0502-4D88-AC98-9E89071CBC97}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libantlr3c", "..\..\..\..\antlr3\runtime\C\build\vsx\libantlr3c\libantlr3c.vcxproj", "{8FA74260-151B-429B-83EF-3CF3EAC8CFD9}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsm", "..\..\..\..\gsm\build\windows\gsm\gsm\gsm.vcxproj", "{746EA080-5BA9-42C5-9E52-EA421C3F3AFD}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "speex", "..\..\..\..\speex\build\windows\speex\speex\speex.vcxproj", "{D5EC8C11-C1D9-47E3-BB82-A93C300FD902}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "speexdsp", "..\..\..\..\speex\build\windows\speex\speexdsp\speexdsp.vcxproj", "{6BD78980-9C71-4341-8775-AD19E9EC7305}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cunit", "..\..\..\..\cunit\build\windows\cunit\cunit.vcxproj", "{902DAF1D-EBF1-4D03-B598-143500A50AB4}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmswasapi", "..\..\..\..\mswasapi\mswasapi\mswasapi\mswasapi.vcxproj", "{D22BD217-D0F8-4274-9B3A-F3F35F46482C}"
- ProjectSection(ProjectDependencies) = postProject
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70} = {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}
- {FFC7B532-0502-4D88-AC98-9E89071CBC97} = {FFC7B532-0502-4D88-AC98-9E89071CBC97}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "webrtcaecm", "..\..\..\..\webrtc\build\windows\webrtcaecm\webrtcaecm\webrtcaecm.vcxproj", "{1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libilbc-rfc3951", "..\..\..\..\libilbc-rfc3951\build\windows\libilbc-rfc3951\libilbc-rfc3951\libilbc-rfc3951.vcxproj", "{8E216BF3-2DD8-4794-8E97-B1AED301ED4D}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmsilbc", "..\..\..\..\msilbc\build\windows\msilbc\msilbc\msilbc.vcxproj", "{072FAD20-7007-4DA2-B2E7-16CE2B219F67}"
- ProjectSection(ProjectDependencies) = postProject
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70} = {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}
- {FFC7B532-0502-4D88-AC98-9E89071CBC97} = {FFC7B532-0502-4D88-AC98-9E89071CBC97}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmssilk", "..\..\..\..\mssilk\build\windows\mssilk\mssilk\mssilk.vcxproj", "{36B528F9-FB79-4078-A16B-0A7442581BB7}"
- ProjectSection(ProjectDependencies) = postProject
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70} = {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}
- {FFC7B532-0502-4D88-AC98-9E89071CBC97} = {FFC7B532-0502-4D88-AC98-9E89071CBC97}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmsamr", "..\..\..\..\msamr\build\windows\msamr\msamr\msamr.vcxproj", "{9924AC72-F96C-4E56-94D9-2B025DA43C6B}"
- ProjectSection(ProjectDependencies) = postProject
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70} = {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2} = {018A4428-535C-4566-9AE0-E93AFF0D3ED2}
- {7AC65D2A-6981-4D17-856D-C37A522739D8} = {7AC65D2A-6981-4D17-856D-C37A522739D8}
- {88191E75-2993-48D7-AA76-652F274EF0FE} = {88191E75-2993-48D7-AA76-652F274EF0FE}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vo-amrwbenc", "..\..\..\..\msamr\build\windows\msamr\vo-amrwbenc\vo-amrwbenc.vcxproj", "{018A4428-535C-4566-9AE0-E93AFF0D3ED2}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opencore_amrnb", "..\..\..\..\msamr\build\windows\msamr\opencore_amrnb\opencore_amrnb.vcxproj", "{88191E75-2993-48D7-AA76-652F274EF0FE}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opencore_amrwb", "..\..\..\..\msamr\build\windows\msamr\opencore_amrwb\opencore_amrwb.vcxproj", "{7AC65D2A-6981-4D17-856D-C37A522739D8}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "polarssl", "..\..\..\..\polarssl\build\windows\polarssl\polarssl\polarssl.vcxproj", "{E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tunnel", "..\..\..\..\tunnel\build\windows\tunnel\tunnel\tunnel.vcxproj", "{59500DD1-B192-4DDF-A402-8A8E3739E032}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libxml2", "..\libxml2\libxml2\libxml2.vcxproj", "{5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|ARM = Debug|ARM
- Debug|Mixed Platforms = Debug|Mixed Platforms
- Debug|Win32 = Debug|Win32
- Debug|x86 = Debug|x86
- Release|Any CPU = Release|Any CPU
- Release|ARM = Release|ARM
- Release|Mixed Platforms = Release|Mixed Platforms
- Release|Win32 = Release|Win32
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|ARM.ActiveCfg = Debug|ARM
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|ARM.Build.0 = Debug|ARM
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|ARM.Deploy.0 = Debug|ARM
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|Mixed Platforms.ActiveCfg = Debug|ARM
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|Mixed Platforms.Build.0 = Debug|ARM
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|Mixed Platforms.Deploy.0 = Debug|ARM
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|Win32.ActiveCfg = Debug|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|Win32.Build.0 = Debug|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|Win32.Deploy.0 = Debug|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|x86.ActiveCfg = Debug|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|x86.Build.0 = Debug|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|x86.Deploy.0 = Debug|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|Any CPU.Build.0 = Release|Any CPU
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|Any CPU.Deploy.0 = Release|Any CPU
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|ARM.ActiveCfg = Release|ARM
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|ARM.Build.0 = Release|ARM
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|ARM.Deploy.0 = Release|ARM
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|Mixed Platforms.ActiveCfg = Release|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|Mixed Platforms.Build.0 = Release|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|Mixed Platforms.Deploy.0 = Release|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|Win32.ActiveCfg = Release|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|Win32.Build.0 = Release|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|Win32.Deploy.0 = Release|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|x86.ActiveCfg = Release|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|x86.Build.0 = Release|x86
- {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|x86.Deploy.0 = Release|x86
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|ARM.ActiveCfg = Debug|ARM
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|ARM.Build.0 = Debug|ARM
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|Mixed Platforms.ActiveCfg = Debug|ARM
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|Mixed Platforms.Build.0 = Debug|ARM
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|Win32.ActiveCfg = Debug|Win32
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|Win32.Build.0 = Debug|Win32
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|x86.ActiveCfg = Debug|Win32
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|x86.Build.0 = Debug|Win32
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|Any CPU.ActiveCfg = Release|Win32
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|ARM.ActiveCfg = Release|ARM
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|ARM.Build.0 = Release|ARM
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|Mixed Platforms.Build.0 = Release|Win32
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|Win32.ActiveCfg = Release|Win32
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|Win32.Build.0 = Release|Win32
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|x86.ActiveCfg = Release|Win32
- {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|x86.Build.0 = Release|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|ARM.ActiveCfg = Debug|ARM
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|ARM.Build.0 = Debug|ARM
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|Mixed Platforms.ActiveCfg = Debug|ARM
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|Mixed Platforms.Build.0 = Debug|ARM
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|Win32.ActiveCfg = Debug|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|Win32.Build.0 = Debug|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|x86.ActiveCfg = Debug|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|x86.Build.0 = Debug|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|Any CPU.ActiveCfg = Release|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|ARM.ActiveCfg = Release|ARM
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|ARM.Build.0 = Release|ARM
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|Mixed Platforms.Build.0 = Release|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|Win32.ActiveCfg = Release|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|Win32.Build.0 = Release|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|x86.ActiveCfg = Release|Win32
- {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|x86.Build.0 = Release|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|ARM.ActiveCfg = Debug|ARM
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|ARM.Build.0 = Debug|ARM
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|Mixed Platforms.ActiveCfg = Debug|ARM
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|Mixed Platforms.Build.0 = Debug|ARM
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|Win32.ActiveCfg = Debug|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|Win32.Build.0 = Debug|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|x86.ActiveCfg = Debug|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|x86.Build.0 = Debug|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|Any CPU.ActiveCfg = Release|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|ARM.ActiveCfg = Release|ARM
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|ARM.Build.0 = Release|ARM
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|Mixed Platforms.Build.0 = Release|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|Win32.ActiveCfg = Release|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|Win32.Build.0 = Release|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|x86.ActiveCfg = Release|Win32
- {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|x86.Build.0 = Release|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|ARM.ActiveCfg = Debug|ARM
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|ARM.Build.0 = Debug|ARM
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|Mixed Platforms.ActiveCfg = Debug|ARM
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|Mixed Platforms.Build.0 = Debug|ARM
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|Win32.ActiveCfg = Debug|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|Win32.Build.0 = Debug|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|x86.ActiveCfg = Debug|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|x86.Build.0 = Debug|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|Any CPU.ActiveCfg = Release|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|ARM.ActiveCfg = Release|ARM
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|ARM.Build.0 = Release|ARM
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|Mixed Platforms.Build.0 = Release|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|Win32.ActiveCfg = Release|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|Win32.Build.0 = Release|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|x86.ActiveCfg = Release|Win32
- {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|x86.Build.0 = Release|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|ARM.ActiveCfg = Debug|ARM
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|ARM.Build.0 = Debug|ARM
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|Mixed Platforms.ActiveCfg = Debug|ARM
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|Mixed Platforms.Build.0 = Debug|ARM
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|Win32.ActiveCfg = Debug|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|Win32.Build.0 = Debug|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|x86.ActiveCfg = Debug|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|x86.Build.0 = Debug|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|Any CPU.ActiveCfg = Release|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|ARM.ActiveCfg = Release|ARM
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|ARM.Build.0 = Release|ARM
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|Mixed Platforms.Build.0 = Release|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|Win32.ActiveCfg = Release|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|Win32.Build.0 = Release|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|x86.ActiveCfg = Release|Win32
- {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|x86.Build.0 = Release|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|ARM.ActiveCfg = Debug|ARM
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|ARM.Build.0 = Debug|ARM
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|Mixed Platforms.ActiveCfg = Debug|ARM
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|Mixed Platforms.Build.0 = Debug|ARM
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|Win32.ActiveCfg = Debug|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|Win32.Build.0 = Debug|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|x86.ActiveCfg = Debug|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|x86.Build.0 = Debug|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|Any CPU.ActiveCfg = Release|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|ARM.ActiveCfg = Release|ARM
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|ARM.Build.0 = Release|ARM
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|Mixed Platforms.Build.0 = Release|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|Win32.ActiveCfg = Release|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|Win32.Build.0 = Release|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|x86.ActiveCfg = Release|Win32
- {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|x86.Build.0 = Release|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|ARM.ActiveCfg = Debug|ARM
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|ARM.Build.0 = Debug|ARM
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|Mixed Platforms.ActiveCfg = Debug|ARM
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|Mixed Platforms.Build.0 = Debug|ARM
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|Win32.ActiveCfg = Debug|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|Win32.Build.0 = Debug|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|x86.ActiveCfg = Debug|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|x86.Build.0 = Debug|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|Any CPU.ActiveCfg = Release|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|ARM.ActiveCfg = Release|ARM
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|ARM.Build.0 = Release|ARM
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|Mixed Platforms.Build.0 = Release|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|Win32.ActiveCfg = Release|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|Win32.Build.0 = Release|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|x86.ActiveCfg = Release|Win32
- {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|x86.Build.0 = Release|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|ARM.ActiveCfg = Debug|ARM
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|ARM.Build.0 = Debug|ARM
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|Mixed Platforms.ActiveCfg = Debug|ARM
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|Mixed Platforms.Build.0 = Debug|ARM
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|Win32.ActiveCfg = Debug|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|Win32.Build.0 = Debug|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|x86.ActiveCfg = Debug|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|x86.Build.0 = Debug|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|Any CPU.ActiveCfg = Release|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|ARM.ActiveCfg = Release|ARM
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|ARM.Build.0 = Release|ARM
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|Mixed Platforms.Build.0 = Release|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|Win32.ActiveCfg = Release|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|Win32.Build.0 = Release|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|x86.ActiveCfg = Release|Win32
- {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|x86.Build.0 = Release|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|ARM.ActiveCfg = Debug|ARM
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|ARM.Build.0 = Debug|ARM
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|Mixed Platforms.ActiveCfg = Debug|ARM
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|Mixed Platforms.Build.0 = Debug|ARM
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|Win32.ActiveCfg = Debug|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|Win32.Build.0 = Debug|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|x86.ActiveCfg = Debug|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|x86.Build.0 = Debug|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|Any CPU.ActiveCfg = Release|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|ARM.ActiveCfg = Release|ARM
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|ARM.Build.0 = Release|ARM
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|Mixed Platforms.Build.0 = Release|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|Win32.ActiveCfg = Release|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|Win32.Build.0 = Release|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|x86.ActiveCfg = Release|Win32
- {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|x86.Build.0 = Release|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|ARM.ActiveCfg = Debug|ARM
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|ARM.Build.0 = Debug|ARM
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|Mixed Platforms.ActiveCfg = Debug|ARM
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|Mixed Platforms.Build.0 = Debug|ARM
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|Win32.ActiveCfg = Debug|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|Win32.Build.0 = Debug|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|x86.ActiveCfg = Debug|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|x86.Build.0 = Debug|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|Any CPU.ActiveCfg = Release|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|ARM.ActiveCfg = Release|ARM
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|ARM.Build.0 = Release|ARM
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|Mixed Platforms.Build.0 = Release|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|Win32.ActiveCfg = Release|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|Win32.Build.0 = Release|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|x86.ActiveCfg = Release|Win32
- {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|x86.Build.0 = Release|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|ARM.ActiveCfg = Debug|ARM
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|ARM.Build.0 = Debug|ARM
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|Win32.ActiveCfg = Debug|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|Win32.Build.0 = Debug|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|x86.ActiveCfg = Debug|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|x86.Build.0 = Debug|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|Any CPU.ActiveCfg = Release|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|ARM.ActiveCfg = Release|ARM
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|ARM.Build.0 = Release|ARM
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|Mixed Platforms.Build.0 = Release|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|Win32.ActiveCfg = Release|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|Win32.Build.0 = Release|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|x86.ActiveCfg = Release|Win32
- {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|x86.Build.0 = Release|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Debug|ARM.ActiveCfg = Debug|ARM
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Debug|ARM.Build.0 = Debug|ARM
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Debug|Win32.ActiveCfg = Debug|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Debug|Win32.Build.0 = Debug|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Debug|x86.ActiveCfg = Debug|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Debug|x86.Build.0 = Debug|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Release|Any CPU.ActiveCfg = Release|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Release|ARM.ActiveCfg = Release|ARM
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Release|ARM.Build.0 = Release|ARM
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Release|Mixed Platforms.Build.0 = Release|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Release|Win32.ActiveCfg = Release|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Release|Win32.Build.0 = Release|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Release|x86.ActiveCfg = Release|Win32
- {1C4E6DA0-B8C7-4A05-A58E-54A6ED07C8DF}.Release|x86.Build.0 = Release|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|ARM.ActiveCfg = Debug|ARM
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|ARM.Build.0 = Debug|ARM
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|Win32.ActiveCfg = Debug|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|Win32.Build.0 = Debug|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|x86.ActiveCfg = Debug|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|x86.Build.0 = Debug|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|Any CPU.ActiveCfg = Release|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|ARM.ActiveCfg = Release|ARM
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|ARM.Build.0 = Release|ARM
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|Mixed Platforms.Build.0 = Release|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|Win32.ActiveCfg = Release|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|Win32.Build.0 = Release|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|x86.ActiveCfg = Release|Win32
- {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|x86.Build.0 = Release|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|ARM.ActiveCfg = Debug|ARM
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|ARM.Build.0 = Debug|ARM
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|Win32.ActiveCfg = Debug|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|Win32.Build.0 = Debug|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|x86.ActiveCfg = Debug|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|x86.Build.0 = Debug|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|Any CPU.ActiveCfg = Release|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|ARM.ActiveCfg = Release|ARM
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|ARM.Build.0 = Release|ARM
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|Mixed Platforms.Build.0 = Release|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|Win32.ActiveCfg = Release|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|Win32.Build.0 = Release|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|x86.ActiveCfg = Release|Win32
- {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|x86.Build.0 = Release|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|ARM.ActiveCfg = Debug|ARM
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|ARM.Build.0 = Debug|ARM
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|Win32.ActiveCfg = Debug|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|Win32.Build.0 = Debug|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|x86.ActiveCfg = Debug|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|x86.Build.0 = Debug|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|Any CPU.ActiveCfg = Release|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|ARM.ActiveCfg = Release|ARM
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|ARM.Build.0 = Release|ARM
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|Mixed Platforms.Build.0 = Release|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|Win32.ActiveCfg = Release|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|Win32.Build.0 = Release|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|x86.ActiveCfg = Release|Win32
- {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|x86.Build.0 = Release|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|ARM.ActiveCfg = Debug|ARM
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|ARM.Build.0 = Debug|ARM
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|Win32.ActiveCfg = Debug|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|Win32.Build.0 = Debug|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|x86.ActiveCfg = Debug|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|x86.Build.0 = Debug|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|Any CPU.ActiveCfg = Release|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|ARM.ActiveCfg = Release|ARM
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|ARM.Build.0 = Release|ARM
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|Mixed Platforms.Build.0 = Release|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|Win32.ActiveCfg = Release|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|Win32.Build.0 = Release|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|x86.ActiveCfg = Release|Win32
- {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|x86.Build.0 = Release|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|ARM.ActiveCfg = Debug|ARM
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|ARM.Build.0 = Debug|ARM
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|Win32.ActiveCfg = Debug|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|Win32.Build.0 = Debug|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|x86.ActiveCfg = Debug|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|x86.Build.0 = Debug|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|Any CPU.ActiveCfg = Release|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|ARM.ActiveCfg = Release|ARM
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|ARM.Build.0 = Release|ARM
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|Mixed Platforms.Build.0 = Release|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|Win32.ActiveCfg = Release|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|Win32.Build.0 = Release|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|x86.ActiveCfg = Release|Win32
- {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|x86.Build.0 = Release|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|ARM.ActiveCfg = Debug|ARM
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|ARM.Build.0 = Debug|ARM
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|Win32.ActiveCfg = Debug|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|Win32.Build.0 = Debug|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|x86.ActiveCfg = Debug|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|x86.Build.0 = Debug|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|Any CPU.ActiveCfg = Release|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|ARM.ActiveCfg = Release|ARM
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|ARM.Build.0 = Release|ARM
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|Mixed Platforms.Build.0 = Release|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|Win32.ActiveCfg = Release|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|Win32.Build.0 = Release|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|x86.ActiveCfg = Release|Win32
- {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|x86.Build.0 = Release|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|ARM.ActiveCfg = Debug|ARM
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|ARM.Build.0 = Debug|ARM
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|Win32.ActiveCfg = Debug|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|Win32.Build.0 = Debug|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|x86.ActiveCfg = Debug|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|x86.Build.0 = Debug|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|Any CPU.ActiveCfg = Release|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|ARM.ActiveCfg = Release|ARM
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|ARM.Build.0 = Release|ARM
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|Mixed Platforms.Build.0 = Release|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|Win32.ActiveCfg = Release|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|Win32.Build.0 = Release|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|x86.ActiveCfg = Release|Win32
- {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|x86.Build.0 = Release|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|ARM.ActiveCfg = Debug|ARM
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|ARM.Build.0 = Debug|ARM
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|Win32.ActiveCfg = Debug|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|Win32.Build.0 = Debug|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|x86.ActiveCfg = Debug|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|x86.Build.0 = Debug|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|Any CPU.ActiveCfg = Release|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|ARM.ActiveCfg = Release|ARM
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|ARM.Build.0 = Release|ARM
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|Mixed Platforms.Build.0 = Release|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|Win32.ActiveCfg = Release|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|Win32.Build.0 = Release|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|x86.ActiveCfg = Release|Win32
- {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|x86.Build.0 = Release|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|ARM.ActiveCfg = Debug|ARM
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|ARM.Build.0 = Debug|ARM
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|Win32.ActiveCfg = Debug|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|Win32.Build.0 = Debug|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|x86.ActiveCfg = Debug|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|x86.Build.0 = Debug|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|Any CPU.ActiveCfg = Release|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|ARM.ActiveCfg = Release|ARM
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|ARM.Build.0 = Release|ARM
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|Mixed Platforms.Build.0 = Release|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|Win32.ActiveCfg = Release|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|Win32.Build.0 = Release|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|x86.ActiveCfg = Release|Win32
- {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|x86.Build.0 = Release|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|Any CPU.ActiveCfg = Debug|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|ARM.ActiveCfg = Debug|ARM
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|ARM.Build.0 = Debug|ARM
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|Mixed Platforms.Build.0 = Debug|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|Win32.ActiveCfg = Debug|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|Win32.Build.0 = Debug|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|x86.ActiveCfg = Debug|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|x86.Build.0 = Debug|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|Any CPU.ActiveCfg = Release|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|ARM.ActiveCfg = Release|ARM
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|ARM.Build.0 = Release|ARM
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|Mixed Platforms.ActiveCfg = Release|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|Mixed Platforms.Build.0 = Release|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|Win32.ActiveCfg = Release|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|Win32.Build.0 = Release|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|x86.ActiveCfg = Release|Win32
- {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|x86.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/marie_early_rc b/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/marie_early_rc
deleted file mode 100644
index 65934c3f3..000000000
--- a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/marie_early_rc
+++ /dev/null
@@ -1,45 +0,0 @@
-[sip]
-sip_port=5082
-sip_tcp_port=5082
-sip_tls_port=5083
-default_proxy=0
-ping_with_options=0
-register_only_when_network_is_up=0
-incoming_calls_early_media=1
-
-[auth_info_0]
-username=marie
-userid=marie
-passwd=secret
-realm="sip.example.org"
-
-
-[proxy_0]
-reg_proxy=sip.example.org;transport=tcp
-reg_route=sip.example.org;transport=tcp;lr
-reg_identity=sip:marie@sip.example.org
-reg_expires=3600
-reg_sendregister=1
-publish=0
-dial_escape_plus=0
-
-[friend_0]
-url="Paupoche"
-pol=accept
-subscribe=0
-
-
-[rtp]
-audio_rtp_port=8070
-video_rtp_port=8072
-
-[video]
-display=0
-capture=0
-show_local=0
-size=vga
-enabled=0
-self_view=0
-automatically_initiate=0
-automatically_accept=0
-device=StaticImage: Static picture
\ No newline at end of file
diff --git a/build/vsx/libxml2/libxml2/libxml2.vcxproj b/build/vsx/libxml2/libxml2/libxml2.vcxproj
deleted file mode 100644
index fb873bf4e..000000000
--- a/build/vsx/libxml2/libxml2/libxml2.vcxproj
+++ /dev/null
@@ -1,249 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
- Debug
- ARM
-
-
- Release
- Win32
-
-
- Release
- ARM
-
-
-
- {5dfa07b4-0be9-46a9-ba32-fdf5a55c580b}
- libxml2
- en-US
- 11.0
-
-
-
- DynamicLibrary
- true
- v110
- false
-
-
- DynamicLibrary
- true
- v110_wp80
- false
-
-
- DynamicLibrary
- false
- true
- v110
- false
-
-
- DynamicLibrary
- false
- true
- v110_wp80
- false
-
-
-
-
-
-
-
- $(SolutionDir)$(Platform)\$(Configuration)\
- $(SolutionDir)$(Platform)\$(Configuration)\$(TargetName)\
-
-
- false
-
-
-
- Level4
- $(SolutionDir)$(Platform)\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\..\libxml2\win32\VC10;%(AdditionalIncludeDirectories)
- _WIN32;_WINDLL;_USRDLL;_CRT_SECURE_NO_WARNINGS;HAVE_WIN32_THREADS;HAVE_COMPILER_TLS;UNICODE;%(PreprocessorDefinitions)
- LIBXML_MODULES_ENABLED
- false
- Default
- NotUsing
- false
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
- $(ProjectDir)libxml2_port.h
-
-
- Console
- false
- false
- true
- $(TargetDir)$(TargetName)_dll.lib
- Ws2_32.lib;%(AdditionalDependencies)
-
-
- install_headers.bat $(SolutionDir)$(Platform)\$(Configuration)\include
-
-
- $(TargetDir)$(TargetName)_dll.lib;%(Outputs)
-
-
-
-
- Level4
- MaxSpeed
- $(SolutionDir)$(Platform)\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\..\libxml2\win32\VC10;%(AdditionalIncludeDirectories)
- _WIN32;_WINDLL;_USRDLL;NDEBUG;_CRT_SECURE_NO_WARNINGS;HAVE_WIN32_THREADS;HAVE_COMPILER_TLS;UNICODE;%(PreprocessorDefinitions)
- LIBXML_MODULES_ENABLED
- true
- true
- Default
- true
- NotUsing
- false
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
- $(ProjectDir)libxml2_port.h
-
-
- Console
- false
- false
- false
- $(TargetDir)$(TargetName)_dll.lib
- Ws2_32.lib;%(AdditionalDependencies)
-
-
- install_headers.bat $(SolutionDir)$(Platform)\$(Configuration)\include
-
-
- $(TargetDir)$(TargetName)_dll.lib;%(Outputs)
-
-
-
-
- Level4
- $(SolutionDir)$(Platform)\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\..\libxml2\win32\VC10;%(AdditionalIncludeDirectories)
- _WIN32;WIN32;_WINDLL;_USRDLL;_CRT_SECURE_NO_WARNINGS;HAVE_WIN32_THREADS;HAVE_COMPILER_TLS;UNICODE;%(PreprocessorDefinitions)
- LIBXML_MODULES_ENABLED
- false
- Default
- NotUsing
- false
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
- $(ProjectDir)libxml2_port.h
-
-
- Console
- false
- false
- true
- $(TargetDir)$(TargetName)_dll.lib
- Ws2_32.lib;%(AdditionalDependencies)
-
-
- install_headers.bat $(SolutionDir)$(Platform)\$(Configuration)\include
-
-
- $(TargetDir)$(TargetName)_dll.lib;%(Outputs)
-
-
-
-
- Level4
- MaxSpeed
- $(SolutionDir)$(Platform)\$(Configuration)\include;$(ProjectDir)..\..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\..\libxml2\win32\VC10;%(AdditionalIncludeDirectories)
- _WIN32;_WINDLL;_USRDLL;NDEBUG;_CRT_SECURE_NO_WARNINGS;HAVE_WIN32_THREADS;HAVE_COMPILER_TLS;UNICODE;%(PreprocessorDefinitions)
- LIBXML_MODULES_ENABLED
- true
- true
- Default
- true
- NotUsing
- false
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
- $(ProjectDir)libxml2_port.h
-
-
- Console
- false
- false
- false
- $(TargetDir)$(TargetName)_dll.lib
- Ws2_32.lib;%(AdditionalDependencies)
-
-
- install_headers.bat $(SolutionDir)$(Platform)\$(Configuration)\include
-
-
- $(TargetDir)$(TargetName)_dll.lib;%(Outputs)
-
-
-
-
- true
-
-
- true
- false
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/build/wp8/LibLinphone.vcxproj b/build/wp8/LibLinphone.vcxproj
new file mode 100644
index 000000000..ed1e7e847
--- /dev/null
+++ b/build/wp8/LibLinphone.vcxproj
@@ -0,0 +1,204 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ ARM
+
+
+ Release
+ Win32
+
+
+ Release
+ ARM
+
+
+
+ {08dd0d38-d9b5-4626-b60d-b4d76b571142}
+ LibLinphone
+ en-US
+ 11.0
+
+
+
+ DynamicLibrary
+ true
+ v110_wp80
+ false
+
+
+ DynamicLibrary
+ false
+ true
+ v110_wp80
+ false
+
+
+
+
+
+
+
+ $(SolutionDir)$(Platform)\$(Configuration)\
+ $(SolutionDir)$(Platform)\$(Configuration)\$(TargetName)\
+
+
+ false
+
+
+
+ Level4
+ $(ProjectDir)..\..\..\belle-sip\include;$(ProjectDir)..\..\oRTP\include;$(ProjectDir)..\..\mediastreamer2\include;$(ProjectDIr)..\..\..\tunnel\include;$(ProjectDir)..\..\coreapi;$(ProjectDir)..\..\include;$(SolutionDir)$(Platform)\$(Configuration)\include;%(AdditionalIncludeDirectories)
+ __STDC_CONSTANT_MACROS;_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;_USRDLL;WINDOW_NATIVE;_TRUE_TIME;IN_LINPHONE;USE_BELLESIP;TUNNEL_ENABLED;VIDEO_ENABLED;LINPHONE_PACKAGE_NAME="linphone";LINPHONE_VERSION="Devel";LIBLINPHONE_EXPORTS;LINPHONE_PLUGINS_DIR="";UNICODE;_XKEYCHECK_H;%(PreprocessorDefinitions)
+ Default
+ NotUsing
+ false
+ $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
+
+
+ Console
+ false
+ false
+ belle-sip.lib;mediastreamer2.lib;ws2_32.lib;ortp.lib;gsm.lib;speex.lib;speexdsp.lib;%(AdditionalDependencies)
+ $(SolutionDir)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
+ $(TargetDir)$(TargetName).lib
+
+
+ $(TargetDir)$(TargetName)_dll.lib;%(Outputs)
+
+
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+
+
+ true
+
+
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+ MaxSpeed
+ true
+ true
+ true
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ true
+ false
+
+
+
+
+
+
+
+ {1db09afe-fc9b-472e-a746-0e33f8ef8883}
+
+
+ {4c225a82-800b-427b-ba7b-61686a9b347f}
+
+
+ {9924ac72-f96c-4e56-94d9-2b025da43c6b}
+
+
+ {072fad20-7007-4da2-b2e7-16ce2b219f67}
+
+
+ {36b528f9-fb79-4078-a16b-0a7442581bb7}
+
+
+ {d22bd217-d0f8-4274-9b3a-f3f35f46482c}
+
+
+ {b16b81a9-bef2-44c9-b603-1065183ae844}
+
+
+ {0565952a-ea62-46a2-8261-f5b4b490da42}
+
+
+ {59500dd1-b192-4ddf-a402-8a8e3739e032}
+
+
+ {027bad0e-9179-48c1-9733-7aa7e2c2ec70}
+
+
+ {ffc7b532-0502-4d88-ac98-9e89071cbc97}
+
+
+ {5dfa07b4-0be9-46a9-ba32-fdf5a55c580b}
+
+
+
+
+
\ No newline at end of file
diff --git a/build/vsx/LibLinphoneTester/LibLinphoneTester.vcxproj b/build/wp8/LibLinphoneTester-native/LibLinphoneTester-native.vcxproj
similarity index 52%
rename from build/vsx/LibLinphoneTester/LibLinphoneTester.vcxproj
rename to build/wp8/LibLinphoneTester-native/LibLinphoneTester-native.vcxproj
index 3b8e9bfc0..424044515 100644
--- a/build/vsx/LibLinphoneTester/LibLinphoneTester.vcxproj
+++ b/build/wp8/LibLinphoneTester-native/LibLinphoneTester-native.vcxproj
@@ -26,26 +26,13 @@
true
-
+
DynamicLibrary
true
v110_wp80
false
-
- DynamicLibrary
- true
- v110_wp80
- true
-
-
- DynamicLibrary
- false
- true
- v110_wp80
- false
-
-
+
DynamicLibrary
false
true
@@ -60,66 +47,42 @@
false
-
-
- _USRDLL;%(PreprocessorDefinitions)
- NotUsing
- false
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
-
-
- Console
- false
- false
- true
-
-
-
-
- _USRDLL;NDEBUG;%(PreprocessorDefinitions)
- NotUsing
- false
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
-
-
- Console
- false
- false
- false
-
-
-
+
Level4
- WIN32;_DEBUG;_WINDOWS;_WINRT_DLL;_CRT_SECURE_NO_WARNINGS;HAVE_CU_GET_SUITE;IN_LINPHONE;%(PreprocessorDefinitions)
- $(ProjectDir)..\..\..\..\belle-sip\include;$(ProjectDir)..\..\..\..\oRTP\include;$(ProjectDir)..\..\..\..\mediastreamer2\include;$(ProjectDir)..\..\..\tester;$(ProjectDir)..\..\..\coreapi;$(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cunit\build\windows\cunit\$(Platform)\$(Configuration);%(AdditionalIncludeDirectories)
+ $(ProjectDir)..\..\..\..\belle-sip\include;$(ProjectDir)..\..\..\oRTP\include;$(ProjectDir)..\..\..\mediastreamer2\include;$(ProjectDir)..\..\..\tester;$(ProjectDir)..\..\..\coreapi;$(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cunit\build\wp8\cunit\$(Platform)\$(Configuration);$(SolutionDir)$(Platform)\$(Configuration)\include;%(AdditionalIncludeDirectories)
+ WIN32;_WINDOWS;_WINRT_DLL;_CRT_SECURE_NO_WARNINGS;HAVE_CU_GET_SUITE;IN_LINPHONE;%(PreprocessorDefinitions)
Default
NotUsing
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
false
- Async
+ $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
Console
false
- ole32.lib;%(IgnoreSpecificDefaultLibraries)
true
+ ole32.lib;%(IgnoreSpecificDefaultLibraries)
WindowsPhoneCore.lib;RuntimeObject.lib;PhoneAppModelHost.lib;ws2_32.lib;%(AdditionalDependencies)
$(SolutionDir)$(Platform)\$(Configuration)
-
+
- _USRDLL;NDEBUG;%(PreprocessorDefinitions)
- NotUsing
- false
- $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
- $(ProjectDir)..\..\..\..\belle-sip\include;$(ProjectDir)..\..\..\..\oRTP\include;$(ProjectDir)..\..\..\..\mediastreamer2\include;$(ProjectDir)..\..\..\tester;$(ProjectDir)..\..\..\coreapi;$(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cunit\build\windows\cunit\$(Platform)\$(Configuration);%(AdditionalIncludeDirectories)
+ _DEBUG;%(PreprocessorDefinitions)
+
+
+ true
+
+
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+ MaxSpeed
+ true
+ true
+ true
- Console
- false
- false
false
@@ -132,13 +95,18 @@
+
+
+
+
+
- true
+ true
@@ -146,21 +114,43 @@
-
+
+ {1db09afe-fc9b-472e-a746-0e33f8ef8883}
+
+
+ {4c225a82-800b-427b-ba7b-61686a9b347f}
+
+
{902daf1d-ebf1-4d03-b598-143500a50ab4}
-
+
+ {9924ac72-f96c-4e56-94d9-2b025da43c6b}
+
+
+ {072fad20-7007-4da2-b2e7-16ce2b219f67}
+
+
+ {36b528f9-fb79-4078-a16b-0a7442581bb7}
+
+
+ {d22bd217-d0f8-4274-9b3a-f3f35f46482c}
+
+
+ {b16b81a9-bef2-44c9-b603-1065183ae844}
+
+
+ {0565952a-ea62-46a2-8261-f5b4b490da42}
+
+
{027bad0e-9179-48c1-9733-7aa7e2c2ec70}
-
+
{ffc7b532-0502-4d88-ac98-9e89071cbc97}
-
+
{08dd0d38-d9b5-4626-b60d-b4d76b571142}
-
-
\ No newline at end of file
diff --git a/build/vsx/LibLinphoneTester/linphone-tester-native.cpp b/build/wp8/LibLinphoneTester-native/linphone-tester-native.cpp
similarity index 100%
rename from build/vsx/LibLinphoneTester/linphone-tester-native.cpp
rename to build/wp8/LibLinphoneTester-native/linphone-tester-native.cpp
diff --git a/build/vsx/LibLinphoneTester/linphone-tester-native.h b/build/wp8/LibLinphoneTester-native/linphone-tester-native.h
similarity index 100%
rename from build/vsx/LibLinphoneTester/linphone-tester-native.h
rename to build/wp8/LibLinphoneTester-native/linphone-tester-native.h
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/App.xaml b/build/wp8/LibLinphoneTester-wp8/App.xaml
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/App.xaml
rename to build/wp8/LibLinphoneTester-wp8/App.xaml
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/App.xaml.cs b/build/wp8/LibLinphoneTester-wp8/App.xaml.cs
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/App.xaml.cs
rename to build/wp8/LibLinphoneTester-wp8/App.xaml.cs
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/AlignmentGrid.png b/build/wp8/LibLinphoneTester-wp8/Assets/AlignmentGrid.png
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/AlignmentGrid.png
rename to build/wp8/LibLinphoneTester-wp8/Assets/AlignmentGrid.png
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/ApplicationIcon.png b/build/wp8/LibLinphoneTester-wp8/Assets/ApplicationIcon.png
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/ApplicationIcon.png
rename to build/wp8/LibLinphoneTester-wp8/Assets/ApplicationIcon.png
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileLarge.png b/build/wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileLarge.png
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileLarge.png
rename to build/wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileLarge.png
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileMedium.png b/build/wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileMedium.png
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileMedium.png
rename to build/wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileMedium.png
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileSmall.png b/build/wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileSmall.png
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileSmall.png
rename to build/wp8/LibLinphoneTester-wp8/Assets/Tiles/FlipCycleTileSmall.png
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/Tiles/IconicTileMediumLarge.png b/build/wp8/LibLinphoneTester-wp8/Assets/Tiles/IconicTileMediumLarge.png
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/Tiles/IconicTileMediumLarge.png
rename to build/wp8/LibLinphoneTester-wp8/Assets/Tiles/IconicTileMediumLarge.png
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/Tiles/IconicTileSmall.png b/build/wp8/LibLinphoneTester-wp8/Assets/Tiles/IconicTileSmall.png
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/Tiles/IconicTileSmall.png
rename to build/wp8/LibLinphoneTester-wp8/Assets/Tiles/IconicTileSmall.png
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/empty_rc b/build/wp8/LibLinphoneTester-wp8/Assets/empty_rc
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/empty_rc
rename to build/wp8/LibLinphoneTester-wp8/Assets/empty_rc
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/laure_rc b/build/wp8/LibLinphoneTester-wp8/Assets/laure_rc
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/laure_rc
rename to build/wp8/LibLinphoneTester-wp8/Assets/laure_rc
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/multi_account_lrc b/build/wp8/LibLinphoneTester-wp8/Assets/multi_account_lrc
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/multi_account_lrc
rename to build/wp8/LibLinphoneTester-wp8/Assets/multi_account_lrc
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/oldphone.wav b/build/wp8/LibLinphoneTester-wp8/Assets/oldphone.wav
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/oldphone.wav
rename to build/wp8/LibLinphoneTester-wp8/Assets/oldphone.wav
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/ringback.wav b/build/wp8/LibLinphoneTester-wp8/Assets/ringback.wav
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/ringback.wav
rename to build/wp8/LibLinphoneTester-wp8/Assets/ringback.wav
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/LibLinphoneTester-wp8.csproj b/build/wp8/LibLinphoneTester-wp8/LibLinphoneTester-wp8.csproj
similarity index 84%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/LibLinphoneTester-wp8.csproj
rename to build/wp8/LibLinphoneTester-wp8/LibLinphoneTester-wp8.csproj
index 6ab7c0d58..4a73fb3b2 100644
--- a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/LibLinphoneTester-wp8.csproj
+++ b/build/wp8/LibLinphoneTester-wp8/LibLinphoneTester-wp8.csproj
@@ -26,27 +26,6 @@
11.0
true
-
- true
- full
- false
- Bin\Debug
- DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
- true
- true
- prompt
- 4
-
-
- pdbonly
- true
- Bin\Release
- TRACE;SILVERLIGHT;WINDOWS_PHONE
- true
- true
- prompt
- 4
-
true
full
@@ -171,12 +150,15 @@
-
+
+ {0565952A-EA62-46A2-8261-F5B4B490DA42}
+ libmswp8vid
+
+
{5E94A00B-B14A-4E42-8284-8CB0EF099534}
- LibLinphoneTester
+ LibLinphoneTester-native
-
- Xcopy /I /Y $(ProjectDir)..\..\..\..\tester\*rc $(ProjectDir)Assets\
+ Xcopy /I /Y $(ProjectDir)..\..\..\tester\rcfiles\*_rc $(ProjectDir)Assets\
\ No newline at end of file
diff --git a/build/wp8/LibLinphoneTester-wp8/LibLinphoneTester-wp8.sln b/build/wp8/LibLinphoneTester-wp8/LibLinphoneTester-wp8.sln
new file mode 100644
index 000000000..cf0d4a086
--- /dev/null
+++ b/build/wp8/LibLinphoneTester-wp8/LibLinphoneTester-wp8.sln
@@ -0,0 +1,336 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Express 2012 for Windows Phone
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibLinphoneTester-wp8", "LibLinphoneTester-wp8.csproj", "{34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}"
+ ProjectSection(ProjectDependencies) = postProject
+ {5E94A00B-B14A-4E42-8284-8CB0EF099534} = {5E94A00B-B14A-4E42-8284-8CB0EF099534}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibLinphone", "..\LibLinphone.vcxproj", "{08DD0D38-D9B5-4626-B60D-B4D76B571142}"
+ ProjectSection(ProjectDependencies) = postProject
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70} = {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}
+ {59500DD1-B192-4DDF-A402-8A8E3739E032} = {59500DD1-B192-4DDF-A402-8A8E3739E032}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibLinphoneTester-native", "..\LibLinphoneTester-native\LibLinphoneTester-native.vcxproj", "{5E94A00B-B14A-4E42-8284-8CB0EF099534}"
+ ProjectSection(ProjectDependencies) = postProject
+ {D22BD217-D0F8-4274-9B3A-F3F35F46482C} = {D22BD217-D0F8-4274-9B3A-F3F35F46482C}
+ {902DAF1D-EBF1-4D03-B598-143500A50AB4} = {902DAF1D-EBF1-4D03-B598-143500A50AB4}
+ {072FAD20-7007-4DA2-B2E7-16CE2B219F67} = {072FAD20-7007-4DA2-B2E7-16CE2B219F67}
+ {0565952A-EA62-46A2-8261-F5B4B490DA42} = {0565952A-EA62-46A2-8261-F5B4B490DA42}
+ {08DD0D38-D9B5-4626-B60D-B4D76B571142} = {08DD0D38-D9B5-4626-B60D-B4D76B571142}
+ {9924AC72-F96C-4E56-94D9-2B025DA43C6B} = {9924AC72-F96C-4E56-94D9-2B025DA43C6B}
+ {B16B81A9-BEF2-44C9-B603-1065183AE844} = {B16B81A9-BEF2-44C9-B603-1065183AE844}
+ {36B528F9-FB79-4078-A16B-0A7442581BB7} = {36B528F9-FB79-4078-A16B-0A7442581BB7}
+ {1DB09AFE-FC9B-472E-A746-0E33F8EF8883} = {1DB09AFE-FC9B-472E-A746-0E33F8EF8883}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "belle-sip", "..\..\..\..\belle-sip\build\wp8\belle-sip\belle-sip.vcxproj", "{4C225A82-800B-427B-BA7B-61686A9B347F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mediastreamer2", "..\..\..\mediastreamer2\build\wp8\mediastreamer2\mediastreamer2.vcxproj", "{027BAD0E-9179-48C1-9733-7AA7E2C2EC70}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "oRTP", "..\..\..\oRTP\build\wp8\oRTP\oRTP.vcxproj", "{FFC7B532-0502-4D88-AC98-9E89071CBC97}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libantlr3c", "..\..\..\..\antlr3\runtime\C\build\wp8\libantlr3c\libantlr3c.vcxproj", "{8FA74260-151B-429B-83EF-3CF3EAC8CFD9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsm", "..\..\..\..\gsm\build\wp8\gsm\gsm.vcxproj", "{746EA080-5BA9-42C5-9E52-EA421C3F3AFD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "speex", "..\..\..\..\speex\build\wp8\speex\speex.vcxproj", "{D5EC8C11-C1D9-47E3-BB82-A93C300FD902}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "speexdsp", "..\..\..\..\speex\build\wp8\speex\speexdsp.vcxproj", "{6BD78980-9C71-4341-8775-AD19E9EC7305}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cunit", "..\..\..\..\cunit\build\wp8\cunit\cunit.vcxproj", "{902DAF1D-EBF1-4D03-B598-143500A50AB4}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmswasapi", "..\..\..\..\mswasapi\mswasapi\mswasapi.vcxproj", "{D22BD217-D0F8-4274-9B3A-F3F35F46482C}"
+ ProjectSection(ProjectDependencies) = postProject
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70} = {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}
+ {FFC7B532-0502-4D88-AC98-9E89071CBC97} = {FFC7B532-0502-4D88-AC98-9E89071CBC97}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libilbc-rfc3951", "..\..\..\..\libilbc-rfc3951\build\wp8\libilbc-rfc3951\libilbc-rfc3951.vcxproj", "{8E216BF3-2DD8-4794-8E97-B1AED301ED4D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmsilbc", "..\..\..\..\msilbc\build\wp8\msilbc\msilbc.vcxproj", "{072FAD20-7007-4DA2-B2E7-16CE2B219F67}"
+ ProjectSection(ProjectDependencies) = postProject
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70} = {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}
+ {FFC7B532-0502-4D88-AC98-9E89071CBC97} = {FFC7B532-0502-4D88-AC98-9E89071CBC97}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmssilk", "..\..\..\..\mssilk\build\wp8\mssilk\mssilk.vcxproj", "{36B528F9-FB79-4078-A16B-0A7442581BB7}"
+ ProjectSection(ProjectDependencies) = postProject
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70} = {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}
+ {FFC7B532-0502-4D88-AC98-9E89071CBC97} = {FFC7B532-0502-4D88-AC98-9E89071CBC97}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmsamr", "..\..\..\..\msamr\build\wp8\msamr\msamr.vcxproj", "{9924AC72-F96C-4E56-94D9-2B025DA43C6B}"
+ ProjectSection(ProjectDependencies) = postProject
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70} = {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}
+ {018A4428-535C-4566-9AE0-E93AFF0D3ED2} = {018A4428-535C-4566-9AE0-E93AFF0D3ED2}
+ {7AC65D2A-6981-4D17-856D-C37A522739D8} = {7AC65D2A-6981-4D17-856D-C37A522739D8}
+ {88191E75-2993-48D7-AA76-652F274EF0FE} = {88191E75-2993-48D7-AA76-652F274EF0FE}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vo-amrwbenc", "..\..\..\..\msamr\build\wp8\msamr\vo-amrwbenc.vcxproj", "{018A4428-535C-4566-9AE0-E93AFF0D3ED2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opencore_amrnb", "..\..\..\..\msamr\build\wp8\msamr\opencore_amrnb.vcxproj", "{88191E75-2993-48D7-AA76-652F274EF0FE}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opencore_amrwb", "..\..\..\..\msamr\build\wp8\msamr\opencore_amrwb.vcxproj", "{7AC65D2A-6981-4D17-856D-C37A522739D8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "polarssl", "..\..\..\..\polarssl\build\wp8\polarssl\polarssl.vcxproj", "{E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tunnel", "..\..\..\..\tunnel\build\wp8\tunnel\tunnel.vcxproj", "{59500DD1-B192-4DDF-A402-8A8E3739E032}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libxml2", "..\libxml2\libxml2.vcxproj", "{5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "srtp", "..\..\..\..\srtp\build\wp8\srtp\srtp.vcxproj", "{B4B96BC4-2B72-4964-98E4-7FD048A43363}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmswp8vid", "..\..\..\..\mswp8vid\mswp8vid\mswp8vid.vcxproj", "{0565952A-EA62-46A2-8261-F5B4B490DA42}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmswebrtc", "..\..\..\..\mswebrtc\build\wp8\mswebrtc\mswebrtc.vcxproj", "{B16B81A9-BEF2-44C9-B603-1065183AE844}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "webrtc", "..\..\..\..\mswebrtc\webrtc\build\wp8\webrtc\webrtc.vcxproj", "{A5A719E5-FDD6-4DFD-AAF6-68C9534B5562}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmsbcg729", "..\..\..\..\bcg729\build\wp8\bcg729\bcg729.vcxproj", "{1DB09AFE-FC9B-472E-A746-0E33F8EF8883}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "opus", "..\..\..\..\opus\build\wp8\opus\opus.vcxproj", "{D450EC75-DF02-48B0-A4FB-ACA79BD894AB}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|ARM = Debug|ARM
+ Debug|x86 = Debug|x86
+ Release|ARM = Release|ARM
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|ARM.ActiveCfg = Debug|ARM
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|ARM.Build.0 = Debug|ARM
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|ARM.Deploy.0 = Debug|ARM
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|x86.ActiveCfg = Debug|x86
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|x86.Build.0 = Debug|x86
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Debug|x86.Deploy.0 = Debug|x86
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|ARM.ActiveCfg = Release|ARM
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|ARM.Build.0 = Release|ARM
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|ARM.Deploy.0 = Release|ARM
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|x86.ActiveCfg = Release|x86
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|x86.Build.0 = Release|x86
+ {34D6878F-6CAB-4AE3-9CCC-25E8D6734C90}.Release|x86.Deploy.0 = Release|x86
+ {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|ARM.ActiveCfg = Debug|ARM
+ {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|ARM.Build.0 = Debug|ARM
+ {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|x86.ActiveCfg = Debug|Win32
+ {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Debug|x86.Build.0 = Debug|Win32
+ {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|ARM.ActiveCfg = Release|ARM
+ {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|ARM.Build.0 = Release|ARM
+ {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|x86.ActiveCfg = Release|Win32
+ {08DD0D38-D9B5-4626-B60D-B4D76B571142}.Release|x86.Build.0 = Release|Win32
+ {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|ARM.ActiveCfg = Debug|ARM
+ {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|ARM.Build.0 = Debug|ARM
+ {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|x86.ActiveCfg = Debug|Win32
+ {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Debug|x86.Build.0 = Debug|Win32
+ {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|ARM.ActiveCfg = Release|ARM
+ {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|ARM.Build.0 = Release|ARM
+ {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|x86.ActiveCfg = Release|Win32
+ {5E94A00B-B14A-4E42-8284-8CB0EF099534}.Release|x86.Build.0 = Release|Win32
+ {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|ARM.ActiveCfg = Debug|ARM
+ {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|ARM.Build.0 = Debug|ARM
+ {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|x86.ActiveCfg = Debug|Win32
+ {4C225A82-800B-427B-BA7B-61686A9B347F}.Debug|x86.Build.0 = Debug|Win32
+ {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|ARM.ActiveCfg = Release|ARM
+ {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|ARM.Build.0 = Release|ARM
+ {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|x86.ActiveCfg = Release|Win32
+ {4C225A82-800B-427B-BA7B-61686A9B347F}.Release|x86.Build.0 = Release|Win32
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|ARM.ActiveCfg = Debug|ARM
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|ARM.Build.0 = Debug|ARM
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|x86.ActiveCfg = Debug|Win32
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Debug|x86.Build.0 = Debug|Win32
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|ARM.ActiveCfg = Release|ARM
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|ARM.Build.0 = Release|ARM
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|x86.ActiveCfg = Release|Win32
+ {027BAD0E-9179-48C1-9733-7AA7E2C2EC70}.Release|x86.Build.0 = Release|Win32
+ {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|ARM.ActiveCfg = Debug|ARM
+ {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|ARM.Build.0 = Debug|ARM
+ {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|x86.ActiveCfg = Debug|Win32
+ {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Debug|x86.Build.0 = Debug|Win32
+ {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|ARM.ActiveCfg = Release|ARM
+ {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|ARM.Build.0 = Release|ARM
+ {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|x86.ActiveCfg = Release|Win32
+ {FFC7B532-0502-4D88-AC98-9E89071CBC97}.Release|x86.Build.0 = Release|Win32
+ {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|ARM.ActiveCfg = Debug|ARM
+ {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|ARM.Build.0 = Debug|ARM
+ {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|x86.ActiveCfg = Debug|Win32
+ {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Debug|x86.Build.0 = Debug|Win32
+ {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|ARM.ActiveCfg = Release|ARM
+ {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|ARM.Build.0 = Release|ARM
+ {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|x86.ActiveCfg = Release|Win32
+ {8FA74260-151B-429B-83EF-3CF3EAC8CFD9}.Release|x86.Build.0 = Release|Win32
+ {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|ARM.ActiveCfg = Debug|ARM
+ {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|ARM.Build.0 = Debug|ARM
+ {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|x86.ActiveCfg = Debug|Win32
+ {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Debug|x86.Build.0 = Debug|Win32
+ {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|ARM.ActiveCfg = Release|ARM
+ {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|ARM.Build.0 = Release|ARM
+ {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|x86.ActiveCfg = Release|Win32
+ {746EA080-5BA9-42C5-9E52-EA421C3F3AFD}.Release|x86.Build.0 = Release|Win32
+ {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|ARM.ActiveCfg = Debug|ARM
+ {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|ARM.Build.0 = Debug|ARM
+ {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|x86.ActiveCfg = Debug|Win32
+ {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Debug|x86.Build.0 = Debug|Win32
+ {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|ARM.ActiveCfg = Release|ARM
+ {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|ARM.Build.0 = Release|ARM
+ {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|x86.ActiveCfg = Release|Win32
+ {D5EC8C11-C1D9-47E3-BB82-A93C300FD902}.Release|x86.Build.0 = Release|Win32
+ {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|ARM.ActiveCfg = Debug|ARM
+ {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|ARM.Build.0 = Debug|ARM
+ {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|x86.ActiveCfg = Debug|Win32
+ {6BD78980-9C71-4341-8775-AD19E9EC7305}.Debug|x86.Build.0 = Debug|Win32
+ {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|ARM.ActiveCfg = Release|ARM
+ {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|ARM.Build.0 = Release|ARM
+ {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|x86.ActiveCfg = Release|Win32
+ {6BD78980-9C71-4341-8775-AD19E9EC7305}.Release|x86.Build.0 = Release|Win32
+ {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|ARM.ActiveCfg = Debug|ARM
+ {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|ARM.Build.0 = Debug|ARM
+ {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|x86.ActiveCfg = Debug|Win32
+ {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Debug|x86.Build.0 = Debug|Win32
+ {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|ARM.ActiveCfg = Release|ARM
+ {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|ARM.Build.0 = Release|ARM
+ {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|x86.ActiveCfg = Release|Win32
+ {902DAF1D-EBF1-4D03-B598-143500A50AB4}.Release|x86.Build.0 = Release|Win32
+ {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|ARM.ActiveCfg = Debug|ARM
+ {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|ARM.Build.0 = Debug|ARM
+ {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|x86.ActiveCfg = Debug|Win32
+ {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Debug|x86.Build.0 = Debug|Win32
+ {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|ARM.ActiveCfg = Release|ARM
+ {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|ARM.Build.0 = Release|ARM
+ {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|x86.ActiveCfg = Release|Win32
+ {D22BD217-D0F8-4274-9B3A-F3F35F46482C}.Release|x86.Build.0 = Release|Win32
+ {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|ARM.ActiveCfg = Debug|ARM
+ {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|ARM.Build.0 = Debug|ARM
+ {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|x86.ActiveCfg = Debug|Win32
+ {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Debug|x86.Build.0 = Debug|Win32
+ {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|ARM.ActiveCfg = Release|ARM
+ {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|ARM.Build.0 = Release|ARM
+ {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|x86.ActiveCfg = Release|Win32
+ {8E216BF3-2DD8-4794-8E97-B1AED301ED4D}.Release|x86.Build.0 = Release|Win32
+ {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|ARM.ActiveCfg = Debug|ARM
+ {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|ARM.Build.0 = Debug|ARM
+ {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|x86.ActiveCfg = Debug|Win32
+ {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Debug|x86.Build.0 = Debug|Win32
+ {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|ARM.ActiveCfg = Release|ARM
+ {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|ARM.Build.0 = Release|ARM
+ {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|x86.ActiveCfg = Release|Win32
+ {072FAD20-7007-4DA2-B2E7-16CE2B219F67}.Release|x86.Build.0 = Release|Win32
+ {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|ARM.ActiveCfg = Debug|ARM
+ {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|ARM.Build.0 = Debug|ARM
+ {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|x86.ActiveCfg = Debug|Win32
+ {36B528F9-FB79-4078-A16B-0A7442581BB7}.Debug|x86.Build.0 = Debug|Win32
+ {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|ARM.ActiveCfg = Release|ARM
+ {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|ARM.Build.0 = Release|ARM
+ {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|x86.ActiveCfg = Release|Win32
+ {36B528F9-FB79-4078-A16B-0A7442581BB7}.Release|x86.Build.0 = Release|Win32
+ {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|ARM.ActiveCfg = Debug|ARM
+ {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|ARM.Build.0 = Debug|ARM
+ {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|x86.ActiveCfg = Debug|Win32
+ {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Debug|x86.Build.0 = Debug|Win32
+ {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|ARM.ActiveCfg = Release|ARM
+ {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|ARM.Build.0 = Release|ARM
+ {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|x86.ActiveCfg = Release|Win32
+ {9924AC72-F96C-4E56-94D9-2B025DA43C6B}.Release|x86.Build.0 = Release|Win32
+ {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|ARM.ActiveCfg = Debug|ARM
+ {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|ARM.Build.0 = Debug|ARM
+ {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|x86.ActiveCfg = Debug|Win32
+ {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Debug|x86.Build.0 = Debug|Win32
+ {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|ARM.ActiveCfg = Release|ARM
+ {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|ARM.Build.0 = Release|ARM
+ {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|x86.ActiveCfg = Release|Win32
+ {018A4428-535C-4566-9AE0-E93AFF0D3ED2}.Release|x86.Build.0 = Release|Win32
+ {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|ARM.ActiveCfg = Debug|ARM
+ {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|ARM.Build.0 = Debug|ARM
+ {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|x86.ActiveCfg = Debug|Win32
+ {88191E75-2993-48D7-AA76-652F274EF0FE}.Debug|x86.Build.0 = Debug|Win32
+ {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|ARM.ActiveCfg = Release|ARM
+ {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|ARM.Build.0 = Release|ARM
+ {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|x86.ActiveCfg = Release|Win32
+ {88191E75-2993-48D7-AA76-652F274EF0FE}.Release|x86.Build.0 = Release|Win32
+ {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|ARM.ActiveCfg = Debug|ARM
+ {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|ARM.Build.0 = Debug|ARM
+ {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|x86.ActiveCfg = Debug|Win32
+ {7AC65D2A-6981-4D17-856D-C37A522739D8}.Debug|x86.Build.0 = Debug|Win32
+ {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|ARM.ActiveCfg = Release|ARM
+ {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|ARM.Build.0 = Release|ARM
+ {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|x86.ActiveCfg = Release|Win32
+ {7AC65D2A-6981-4D17-856D-C37A522739D8}.Release|x86.Build.0 = Release|Win32
+ {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|ARM.ActiveCfg = Debug|ARM
+ {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|ARM.Build.0 = Debug|ARM
+ {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|x86.ActiveCfg = Debug|Win32
+ {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Debug|x86.Build.0 = Debug|Win32
+ {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|ARM.ActiveCfg = Release|ARM
+ {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|ARM.Build.0 = Release|ARM
+ {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|x86.ActiveCfg = Release|Win32
+ {E9F8C5D1-13A2-46B6-A9BC-878030D4BE09}.Release|x86.Build.0 = Release|Win32
+ {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|ARM.ActiveCfg = Debug|ARM
+ {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|ARM.Build.0 = Debug|ARM
+ {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|x86.ActiveCfg = Debug|Win32
+ {59500DD1-B192-4DDF-A402-8A8E3739E032}.Debug|x86.Build.0 = Debug|Win32
+ {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|ARM.ActiveCfg = Release|ARM
+ {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|ARM.Build.0 = Release|ARM
+ {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|x86.ActiveCfg = Release|Win32
+ {59500DD1-B192-4DDF-A402-8A8E3739E032}.Release|x86.Build.0 = Release|Win32
+ {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|ARM.ActiveCfg = Debug|ARM
+ {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|ARM.Build.0 = Debug|ARM
+ {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|x86.ActiveCfg = Debug|Win32
+ {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Debug|x86.Build.0 = Debug|Win32
+ {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|ARM.ActiveCfg = Release|ARM
+ {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|ARM.Build.0 = Release|ARM
+ {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|x86.ActiveCfg = Release|Win32
+ {5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}.Release|x86.Build.0 = Release|Win32
+ {B4B96BC4-2B72-4964-98E4-7FD048A43363}.Debug|ARM.ActiveCfg = Debug|ARM
+ {B4B96BC4-2B72-4964-98E4-7FD048A43363}.Debug|ARM.Build.0 = Debug|ARM
+ {B4B96BC4-2B72-4964-98E4-7FD048A43363}.Debug|x86.ActiveCfg = Debug|Win32
+ {B4B96BC4-2B72-4964-98E4-7FD048A43363}.Debug|x86.Build.0 = Debug|Win32
+ {B4B96BC4-2B72-4964-98E4-7FD048A43363}.Release|ARM.ActiveCfg = Release|ARM
+ {B4B96BC4-2B72-4964-98E4-7FD048A43363}.Release|ARM.Build.0 = Release|ARM
+ {B4B96BC4-2B72-4964-98E4-7FD048A43363}.Release|x86.ActiveCfg = Release|Win32
+ {B4B96BC4-2B72-4964-98E4-7FD048A43363}.Release|x86.Build.0 = Release|Win32
+ {0565952A-EA62-46A2-8261-F5B4B490DA42}.Debug|ARM.ActiveCfg = Debug|ARM
+ {0565952A-EA62-46A2-8261-F5B4B490DA42}.Debug|ARM.Build.0 = Debug|ARM
+ {0565952A-EA62-46A2-8261-F5B4B490DA42}.Debug|x86.ActiveCfg = Debug|Win32
+ {0565952A-EA62-46A2-8261-F5B4B490DA42}.Debug|x86.Build.0 = Debug|Win32
+ {0565952A-EA62-46A2-8261-F5B4B490DA42}.Release|ARM.ActiveCfg = Release|ARM
+ {0565952A-EA62-46A2-8261-F5B4B490DA42}.Release|ARM.Build.0 = Release|ARM
+ {0565952A-EA62-46A2-8261-F5B4B490DA42}.Release|x86.ActiveCfg = Release|Win32
+ {0565952A-EA62-46A2-8261-F5B4B490DA42}.Release|x86.Build.0 = Release|Win32
+ {B16B81A9-BEF2-44C9-B603-1065183AE844}.Debug|ARM.ActiveCfg = Debug|ARM
+ {B16B81A9-BEF2-44C9-B603-1065183AE844}.Debug|ARM.Build.0 = Debug|ARM
+ {B16B81A9-BEF2-44C9-B603-1065183AE844}.Debug|x86.ActiveCfg = Debug|Win32
+ {B16B81A9-BEF2-44C9-B603-1065183AE844}.Debug|x86.Build.0 = Debug|Win32
+ {B16B81A9-BEF2-44C9-B603-1065183AE844}.Release|ARM.ActiveCfg = Release|ARM
+ {B16B81A9-BEF2-44C9-B603-1065183AE844}.Release|ARM.Build.0 = Release|ARM
+ {B16B81A9-BEF2-44C9-B603-1065183AE844}.Release|x86.ActiveCfg = Release|Win32
+ {B16B81A9-BEF2-44C9-B603-1065183AE844}.Release|x86.Build.0 = Release|Win32
+ {A5A719E5-FDD6-4DFD-AAF6-68C9534B5562}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A5A719E5-FDD6-4DFD-AAF6-68C9534B5562}.Debug|ARM.Build.0 = Debug|ARM
+ {A5A719E5-FDD6-4DFD-AAF6-68C9534B5562}.Debug|x86.ActiveCfg = Debug|Win32
+ {A5A719E5-FDD6-4DFD-AAF6-68C9534B5562}.Debug|x86.Build.0 = Debug|Win32
+ {A5A719E5-FDD6-4DFD-AAF6-68C9534B5562}.Release|ARM.ActiveCfg = Release|ARM
+ {A5A719E5-FDD6-4DFD-AAF6-68C9534B5562}.Release|ARM.Build.0 = Release|ARM
+ {A5A719E5-FDD6-4DFD-AAF6-68C9534B5562}.Release|x86.ActiveCfg = Release|Win32
+ {A5A719E5-FDD6-4DFD-AAF6-68C9534B5562}.Release|x86.Build.0 = Release|Win32
+ {1DB09AFE-FC9B-472E-A746-0E33F8EF8883}.Debug|ARM.ActiveCfg = Debug|ARM
+ {1DB09AFE-FC9B-472E-A746-0E33F8EF8883}.Debug|ARM.Build.0 = Debug|ARM
+ {1DB09AFE-FC9B-472E-A746-0E33F8EF8883}.Debug|x86.ActiveCfg = Debug|Win32
+ {1DB09AFE-FC9B-472E-A746-0E33F8EF8883}.Debug|x86.Build.0 = Debug|Win32
+ {1DB09AFE-FC9B-472E-A746-0E33F8EF8883}.Release|ARM.ActiveCfg = Release|ARM
+ {1DB09AFE-FC9B-472E-A746-0E33F8EF8883}.Release|ARM.Build.0 = Release|ARM
+ {1DB09AFE-FC9B-472E-A746-0E33F8EF8883}.Release|x86.ActiveCfg = Release|Win32
+ {1DB09AFE-FC9B-472E-A746-0E33F8EF8883}.Release|x86.Build.0 = Release|Win32
+ {D450EC75-DF02-48B0-A4FB-ACA79BD894AB}.Debug|ARM.ActiveCfg = Debug|ARM
+ {D450EC75-DF02-48B0-A4FB-ACA79BD894AB}.Debug|ARM.Build.0 = Debug|ARM
+ {D450EC75-DF02-48B0-A4FB-ACA79BD894AB}.Debug|x86.ActiveCfg = Debug|Win32
+ {D450EC75-DF02-48B0-A4FB-ACA79BD894AB}.Debug|x86.Build.0 = Debug|Win32
+ {D450EC75-DF02-48B0-A4FB-ACA79BD894AB}.Release|ARM.ActiveCfg = Release|ARM
+ {D450EC75-DF02-48B0-A4FB-ACA79BD894AB}.Release|ARM.Build.0 = Release|ARM
+ {D450EC75-DF02-48B0-A4FB-ACA79BD894AB}.Release|x86.ActiveCfg = Release|Win32
+ {D450EC75-DF02-48B0-A4FB-ACA79BD894AB}.Release|x86.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/LocalizedStrings.cs b/build/wp8/LibLinphoneTester-wp8/LocalizedStrings.cs
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/LocalizedStrings.cs
rename to build/wp8/LibLinphoneTester-wp8/LocalizedStrings.cs
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/MainPage.xaml b/build/wp8/LibLinphoneTester-wp8/MainPage.xaml
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/MainPage.xaml
rename to build/wp8/LibLinphoneTester-wp8/MainPage.xaml
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/MainPage.xaml.cs b/build/wp8/LibLinphoneTester-wp8/MainPage.xaml.cs
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/MainPage.xaml.cs
rename to build/wp8/LibLinphoneTester-wp8/MainPage.xaml.cs
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Properties/AppManifest.xml b/build/wp8/LibLinphoneTester-wp8/Properties/AppManifest.xml
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Properties/AppManifest.xml
rename to build/wp8/LibLinphoneTester-wp8/Properties/AppManifest.xml
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Properties/AssemblyInfo.cs b/build/wp8/LibLinphoneTester-wp8/Properties/AssemblyInfo.cs
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Properties/AssemblyInfo.cs
rename to build/wp8/LibLinphoneTester-wp8/Properties/AssemblyInfo.cs
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Properties/WMAppManifest.xml b/build/wp8/LibLinphoneTester-wp8/Properties/WMAppManifest.xml
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Properties/WMAppManifest.xml
rename to build/wp8/LibLinphoneTester-wp8/Properties/WMAppManifest.xml
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Resources/AppResources.Designer.cs b/build/wp8/LibLinphoneTester-wp8/Resources/AppResources.Designer.cs
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Resources/AppResources.Designer.cs
rename to build/wp8/LibLinphoneTester-wp8/Resources/AppResources.Designer.cs
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Resources/AppResources.resx b/build/wp8/LibLinphoneTester-wp8/Resources/AppResources.resx
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Resources/AppResources.resx
rename to build/wp8/LibLinphoneTester-wp8/Resources/AppResources.resx
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/TestCasePage.xaml b/build/wp8/LibLinphoneTester-wp8/TestCasePage.xaml
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/TestCasePage.xaml
rename to build/wp8/LibLinphoneTester-wp8/TestCasePage.xaml
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/TestCasePage.xaml.cs b/build/wp8/LibLinphoneTester-wp8/TestCasePage.xaml.cs
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/TestCasePage.xaml.cs
rename to build/wp8/LibLinphoneTester-wp8/TestCasePage.xaml.cs
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/TestResultPage.xaml b/build/wp8/LibLinphoneTester-wp8/TestResultPage.xaml
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/TestResultPage.xaml
rename to build/wp8/LibLinphoneTester-wp8/TestResultPage.xaml
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/TestResultPage.xaml.cs b/build/wp8/LibLinphoneTester-wp8/TestResultPage.xaml.cs
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/TestResultPage.xaml.cs
rename to build/wp8/LibLinphoneTester-wp8/TestResultPage.xaml.cs
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/log.html b/build/wp8/LibLinphoneTester-wp8/log.html
similarity index 100%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/log.html
rename to build/wp8/LibLinphoneTester-wp8/log.html
diff --git a/build/vsx/libxml2/libxml2/install_headers.bat b/build/wp8/libxml2/install_headers.bat
similarity index 71%
rename from build/vsx/libxml2/libxml2/install_headers.bat
rename to build/wp8/libxml2/install_headers.bat
index 8e97127d8..d33f20c04 100644
--- a/build/vsx/libxml2/libxml2/install_headers.bat
+++ b/build/wp8/libxml2/install_headers.bat
@@ -1,5 +1,5 @@
SET curdir=%CD%
-SET incdir=..\..\..\..\..\libxml2\include\libxml
+SET incdir=..\..\..\..\libxml2\include\libxml
SET installdir=%1\libxml
Xcopy /I /Y %incdir%\*.h %installdir%\
diff --git a/build/vsx/libxml2/libxml2.sln b/build/wp8/libxml2/libxml2.sln
similarity index 94%
rename from build/vsx/libxml2/libxml2.sln
rename to build/wp8/libxml2/libxml2.sln
index 62fad2d3f..b10b61b6b 100644
--- a/build/vsx/libxml2/libxml2.sln
+++ b/build/wp8/libxml2/libxml2.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Express 2012 for Windows Phone
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libxml2", "libxml2\libxml2.vcxproj", "{5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libxml2", "libxml2.vcxproj", "{5DFA07B4-0BE9-46A9-BA32-FDF5A55C580B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
diff --git a/build/wp8/libxml2/libxml2.vcxproj b/build/wp8/libxml2/libxml2.vcxproj
new file mode 100644
index 000000000..0e1f21c63
--- /dev/null
+++ b/build/wp8/libxml2/libxml2.vcxproj
@@ -0,0 +1,159 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ ARM
+
+
+ Release
+ Win32
+
+
+ Release
+ ARM
+
+
+
+ {5dfa07b4-0be9-46a9-ba32-fdf5a55c580b}
+ libxml2
+ en-US
+ 11.0
+
+
+
+ DynamicLibrary
+ true
+ v110_wp80
+ false
+
+
+ DynamicLibrary
+ false
+ true
+ v110_wp80
+ false
+
+
+
+
+
+
+
+ $(SolutionDir)$(Platform)\$(Configuration)\
+ $(SolutionDir)$(Platform)\$(Configuration)\$(TargetName)\
+
+
+ false
+
+
+
+ Level4
+ $(SolutionDir)$(Platform)\$(Configuration)\include;$(ProjectDir)..\..\..\..\libxml2\include;$(ProjectDir)..\..\..\..\libxml2\win32\VC10;%(AdditionalIncludeDirectories)
+ _WIN32;_WINDLL;_USRDLL;_CRT_SECURE_NO_WARNINGS;HAVE_WIN32_THREADS;HAVE_COMPILER_TLS;UNICODE;%(PreprocessorDefinitions)
+ LIBXML_MODULES_ENABLED
+ Default
+ NotUsing
+ false
+ $(WindowsSDK_MetadataPath);$(AdditionalUsingDirectories)
+ $(ProjectDir)libxml2_port.h
+
+
+ Console
+ false
+ false
+ $(TargetDir)$(TargetName).lib
+ Ws2_32.lib;%(AdditionalDependencies)
+
+
+ install_headers.bat $(SolutionDir)$(Platform)\$(Configuration)\include
+
+
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+
+
+ true
+
+
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+ MaxSpeed
+ true
+ true
+ true
+
+
+ false
+
+
+
+
+ true
+
+
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build/vsx/libxml2/libxml2/libxml2_port.h b/build/wp8/libxml2/libxml2_port.h
similarity index 100%
rename from build/vsx/libxml2/libxml2/libxml2_port.h
rename to build/wp8/libxml2/libxml2_port.h
diff --git a/build/vsx/libxml2/libxml2/xmlversion.h b/build/wp8/libxml2/xmlversion.h
similarity index 100%
rename from build/vsx/libxml2/libxml2/xmlversion.h
rename to build/wp8/libxml2/xmlversion.h
diff --git a/configure.ac b/configure.ac
index d7fe3f5ea..c8a3e9029 100644
--- a/configure.ac
+++ b/configure.ac
@@ -925,7 +925,7 @@ printf "* %-30s %s\n" "Account assistant" $build_wizard
printf "* %-30s %s\n" "Console interface" $console_ui
printf "* %-30s %s\n" "Tools" $build_tools
printf "* %-30s %s\n" "Message storage" $enable_msg_storage
-printf "* %-30s %s\n" "zRTP encryption (GPLv3)" $zrtp
+printf "* %-30s %s\n" "zRTP encryption" $zrtp
printf "* %-30s %s\n" "uPnP support" $build_upnp
printf "* %-30s %s\n" "LDAP support" $enable_ldap
diff --git a/console/commands.c b/console/commands.c
index 725ce8e4b..3af324b7c 100644
--- a/console/commands.c
+++ b/console/commands.c
@@ -45,7 +45,7 @@
/***************************************************************************
*
- * Forward declarations
+ * Forward declarations
*
***************************************************************************/
@@ -190,19 +190,19 @@ static LPC_COMMAND commands[] = {
"'conference add : join the call with id 'call id' into the audio conference."
"'conference rm : remove the call with id 'call id' from the audio conference."
},
- { "mute", lpc_cmd_mute_mic,
+ { "mute", lpc_cmd_mute_mic,
"Mute microphone and suspend voice transmission."},
#ifdef VIDEO_ENABLED
{ "camera", lpc_cmd_camera, "Send camera output for current call.",
"'camera on'\t: allow sending of local camera video to remote end.\n"
"'camera off'\t: disable sending of local camera's video to remote end.\n"},
#endif
- { "unmute", lpc_cmd_unmute_mic,
+ { "unmute", lpc_cmd_unmute_mic,
"Unmute microphone and resume voice transmission."},
- { "playbackgain", lpc_cmd_playback_gain,
+ { "playbackgain", lpc_cmd_playback_gain,
"Adjust playback gain."},
{ "duration", lpc_cmd_duration, "Print duration in seconds of the last call.", NULL },
-
+
{ "autoanswer", lpc_cmd_autoanswer, "Show/set auto-answer mode",
"'autoanswer' \t: show current autoanswer mode\n"
"'autoanswer enable'\t: enable autoanswer mode\n"
@@ -291,7 +291,7 @@ static LPC_COMMAND advanced_commands[] = {
{ "nortp-on-audio-mute", lpc_cmd_rtp_no_xmit_on_audio_mute,
"Set the rtp_no_xmit_on_audio_mute configuration parameter",
" If set to 1 then rtp transmission will be muted when\n"
- " audio is muted , otherwise rtp is always sent."},
+ " audio is muted , otherwise rtp is always sent."},
#ifdef VIDEO_ENABLED
{ "vwindow", lpc_cmd_video_window, "Control video display window",
"'vwindow show': shows video window\n"
@@ -321,11 +321,11 @@ static LPC_COMMAND advanced_commands[] = {
},
{ "register", lpc_cmd_register, "Register in one line to a proxy" , "register "},
{ "unregister", lpc_cmd_unregister, "Unregister from default proxy", NULL },
- { "status", lpc_cmd_status, "Print various status information",
+ { "status", lpc_cmd_status, "Print various status information",
"'status register' \t: print status concerning registration\n"
"'status autoanswer'\t: tell whether autoanswer mode is enabled\n"
"'status hook' \t: print hook status\n" },
- { "ports", lpc_cmd_ports, "Network ports configuration",
+ { "ports", lpc_cmd_ports, "Network ports configuration",
"'ports' \t: prints current used ports.\n"
"'ports sip '\t: Sets the sip port.\n" },
{ "param", lpc_cmd_param, "parameter set or read as normally given in .linphonerc",
@@ -365,7 +365,7 @@ static LPC_COMMAND advanced_commands[] = {
/***************************************************************************
*
- * Public interface
+ * Public interface
*
***************************************************************************/
@@ -476,7 +476,7 @@ linphonec_command_generator(const char *text, int state)
/***************************************************************************
*
- * Command handlers
+ * Command handlers
*
***************************************************************************/
@@ -497,7 +497,7 @@ lpc_cmd_help(LinphoneCore *lc, char *arg)
commands[i].help);
i++;
}
-
+
linphonec_out("---------------------------\n");
linphonec_out("Type 'help ' for more details or\n");
linphonec_out(" 'help advanced' to list additional commands.\n");
@@ -515,13 +515,13 @@ lpc_cmd_help(LinphoneCore *lc, char *arg)
advanced_commands[i].help);
i++;
}
-
+
linphonec_out("---------------------------\n");
linphonec_out("Type 'help ' for more details.\n");
return 1;
}
-
+
cmd=lpc_find_command(arg);
if ( !cmd )
{
@@ -579,7 +579,7 @@ lpc_cmd_call(LinphoneCore *lc, char *args)
return 1;
}
-static int
+static int
lpc_cmd_calls(LinphoneCore *lc, char *args){
const MSList *calls = linphone_core_get_calls(lc);
if(calls)
@@ -692,7 +692,7 @@ lpc_cmd_terminate(LinphoneCore *lc, char *args)
}
return 1;
}
-
+
if(strcmp(args,"all")==0){
linphonec_out("We are going to stop all the calls.\n");
linphone_core_terminate_all_calls(lc);
@@ -709,7 +709,7 @@ lpc_cmd_terminate(LinphoneCore *lc, char *args)
return 1;
}
return 0;
-
+
}
static int
@@ -852,7 +852,7 @@ lpc_cmd_firewall(LinphoneCore *lc, char *args)
{
linphone_core_set_firewall_policy(lc,LinphonePolicyNoFirewall);
}
- else if (strcmp(args,"upnp")==0)
+ else if (strcmp(args,"upnp")==0)
{
linphone_core_set_firewall_policy(lc,LinphonePolicyUseUpnp);
}
@@ -930,7 +930,7 @@ lpc_friend_name(char **args, char **name)
*args = ++end;
} else {
*name = strsep(args, " ");
-
+
if (NULL == *args) { /* Means there was no separator */
fprintf(stderr, "Either name or address is missing\n");
return 0;
@@ -960,7 +960,7 @@ lpc_cmd_friend(LinphoneCore *lc, char *args)
args+=4;
if ( ! *args ) return 0;
friend_num = strtol(args, NULL, 10);
-#ifndef _WIN32_WCE
+#ifndef _WIN32_WCE
if ( errno == ERANGE ) {
linphonec_out("Invalid friend number\n");
return 0;
@@ -978,11 +978,11 @@ lpc_cmd_friend(LinphoneCore *lc, char *args)
if (!strncmp(args, "all", 3))
{
friend_num = -1;
- }
+ }
else
{
friend_num = strtol(args, NULL, 10);
-#ifndef _WIN32_WCE
+#ifndef _WIN32_WCE
if ( errno == ERANGE ) {
linphonec_out("Invalid friend number\n");
return 0;
@@ -1411,7 +1411,7 @@ static int lpc_cmd_pause(LinphoneCore *lc, char *args){
}
static int lpc_cmd_resume(LinphoneCore *lc, char *args){
-
+
if(linphone_core_in_call(lc))
{
linphonec_out("There is already a call in process pause or stop it first");
@@ -1450,7 +1450,7 @@ static int lpc_cmd_resume(LinphoneCore *lc, char *args){
}
}
return 0;
-
+
}
static int lpc_cmd_conference(LinphoneCore *lc, char *args){
@@ -1659,7 +1659,7 @@ linphonec_proxy_add(LinphoneCore *lc)
}
/*
- * Final confirmation
+ * Final confirmation
*/
while (1)
{
@@ -1742,12 +1742,12 @@ linphonec_proxy_list(LinphoneCore *lc)
const MSList *proxies;
int n;
int def=linphone_core_get_default_proxy(lc,NULL);
-
+
proxies=linphone_core_get_proxy_config_list(lc);
for(n=0;proxies!=NULL;proxies=ms_list_next(proxies),n++){
if (n==def)
linphonec_out("****** Proxy %i - this is the default one - *******\n",n);
- else
+ else
linphonec_out("****** Proxy %i *******\n",n);
linphonec_proxy_display((LinphoneProxyConfig*)proxies->data);
}
@@ -1789,7 +1789,7 @@ linphonec_friend_display(LinphoneFriend *fr)
{
LinphoneAddress *uri=linphone_address_clone(linphone_friend_get_address(fr));
char *str;
-
+
linphonec_out("name: %s\n", linphone_address_get_display_name(uri));
linphone_address_set_display_name(uri,NULL);
str=linphone_address_as_string(uri);
@@ -1874,7 +1874,7 @@ linphonec_friend_delete(LinphoneCore *lc, int num)
}
}
- if (-1 == num)
+ if (-1 == num)
{
unsigned int i;
for (i = 0 ; i < n ; i++)
@@ -1900,7 +1900,7 @@ static int lpc_cmd_register(LinphoneCore *lc, char *args){
char passwd[512];
LinphoneProxyConfig *cfg;
const MSList *elem;
-
+
if (!args)
{
/* it means that you want to register the default proxy */
@@ -1979,7 +1979,7 @@ static int lpc_cmd_duration(LinphoneCore *lc, char *args){
static int lpc_cmd_status(LinphoneCore *lc, char *args)
{
LinphoneProxyConfig *cfg;
-
+
if ( ! args ) return 0;
linphone_core_get_default_proxy(lc,&cfg);
if (strstr(args,"register"))
@@ -2042,7 +2042,7 @@ static int lpc_cmd_status(LinphoneCore *lc, char *args)
default:
break;
}
-
+
}
else return 0;
@@ -2101,19 +2101,23 @@ static int lpc_cmd_speak(LinphoneCore *lc, char *args){
char voice[64];
char *sentence;
char cl[128];
- char *wavfile;
+ char wavfile[128]="/tmp/linphonec-espeak-XXXXXX";
int status;
FILE *file;
-
+
if (!args) return 0;
memset(voice,0,sizeof(voice));
sscanf(args,"%63s",voice);
sentence=args+strlen(voice);
#ifdef __APPLE__
- wavfile=mktemp("/tmp/linphonec-espeak-XXXXXX");
+ mktemp(wavfile);
#else
- wavfile=tempnam("/tmp/","linphonec-espeak-");
+ if (mkstemp(wavfile)==-1){
+ ms_error("Could not create temporary filename: %s", strerror(errno));
+ linphonec_out("An error occured, please consult logs for details.");
+ return 1;
+ }
#endif
snprintf(cl,sizeof(cl),"espeak -v %s -s 100 -w %s --stdin",voice,wavfile);
@@ -2200,7 +2204,7 @@ static void linphonec_codec_list(int type, LinphoneCore *lc){
for(;node!=NULL;node=ms_list_next(node)){
pt=(PayloadType*)(node->data);
- linphonec_out("%2d: %s (%d) %s\n", index, pt->mime_type, pt->clock_rate,
+ linphonec_out("%2d: %s (%d) %s\n", index, pt->mime_type, pt->clock_rate,
linphone_core_payload_type_enabled(lc,pt) ? "enabled" : "disabled");
index++;
}
@@ -2274,7 +2278,7 @@ static int lpc_cmd_echocancellation(LinphoneCore *lc, char *args){
if (arg2 != 0) {
n = sscanf(arg2, "%d %d %d", &delay, &tail_len, &frame_size);
- if (n == 1) {
+ if (n == 1) {
lp_config_set_int(config,"sound","ec_delay",delay);
}
else if (n == 2) {
@@ -2292,11 +2296,11 @@ static int lpc_cmd_echocancellation(LinphoneCore *lc, char *args){
linphone_core_enable_echo_cancellation(lc,0);
}
else if (strcmp(arg1,"show")==0){
- linphonec_out("echo cancellation is %s; delay %d, tail length %d, frame size %d\n",
+ linphonec_out("echo cancellation is %s; delay %d, tail length %d, frame size %d\n",
linphone_core_echo_cancellation_enabled(lc) ? "on" : "off",
lp_config_get_int(config,"sound","ec_delay",0),
lp_config_get_int(config,"sound","ec_tail_len",0),
- lp_config_get_int(config,"sound","ec_framesize",0));
+ lp_config_get_int(config,"sound","ec_framesize",0));
}
else {
return 0;
@@ -2346,7 +2350,7 @@ static int lpc_cmd_rtp_no_xmit_on_audio_mute(LinphoneCore *lc, char *args)
if(strstr(args,"1"))rtp_xmit_off=TRUE;
if(linphone_core_get_current_call (lc)==NULL)
linphone_core_set_rtp_no_xmit_on_audio_mute(lc,rtp_xmit_off);
- else
+ else
linphonec_out("nortp-on-audio-mute: call in progress - cannot change state\n");
}
rtp_xmit_off=linphone_core_get_rtp_no_xmit_on_audio_mute(lc);
@@ -2434,7 +2438,7 @@ static void lpc_display_call_states(LinphoneCore *lc){
for(;elem!=NULL;elem=elem->next){
const char *flag;
call=(LinphoneCall*)elem->data;
- bool_t in_conference=linphone_call_params_local_conference_mode(linphone_call_get_current_params(call));
+ bool_t in_conference=linphone_call_params_get_local_conference_mode(linphone_call_get_current_params(call));
tmp=linphone_call_get_remote_address_as_string (call);
flag=in_conference ? "conferencing" : "";
flag=linphone_call_has_transfer_pending(call) ? "transfer pending" : flag;
@@ -2487,7 +2491,7 @@ static int lpc_cmd_states(LinphoneCore *lc, char *args){
static int lpc_cmd_camera(LinphoneCore *lc, char *args){
LinphoneCall *call=linphone_core_get_current_call(lc);
bool_t activated=FALSE;
-
+
if (linphone_core_video_enabled (lc)==FALSE){
linphonec_out("Video is disabled, re-run linphonec with -V option.");
return 1;
diff --git a/console/linphonec.c b/console/linphonec.c
index ca7d6cafa..b8072e325 100644
--- a/console/linphonec.c
+++ b/console/linphonec.c
@@ -551,7 +551,7 @@ char *linphonec_readline(char *prompt){
should. Maybe should we only have this on when the option -V
or -D is on? */
MSG msg;
-
+
if (PeekMessage(&msg, NULL, 0, 0,1)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
@@ -648,7 +648,7 @@ main (int argc, char *argv[]) {
linphonec_vtable.refer_received=linphonec_display_refer;
linphonec_vtable.transfer_state_changed=linphonec_transfer_state_changed;
linphonec_vtable.call_encryption_changed=linphonec_call_encryption_changed;
-
+
if (! linphonec_init(argc, argv) ) exit(EXIT_FAILURE);
linphonec_main_loop (linphonec);
@@ -671,8 +671,8 @@ linphonec_init(int argc, char **argv)
* Set initial values for global variables
*/
mylogfile = NULL;
-
-
+
+
#ifndef _WIN32
snprintf(configfile_name, PATH_MAX, "%s/.linphonerc",
getenv("HOME"));
@@ -701,7 +701,6 @@ linphonec_init(int argc, char **argv)
default:
break;
}
-
#ifdef ENABLE_NLS
if (NULL == bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR))
perror ("bindtextdomain failed");
@@ -741,10 +740,12 @@ linphonec_init(int argc, char **argv)
* Initialize linphone core
*/
linphonec=linphone_core_new (&linphonec_vtable, configfile_name, factory_configfile_name, NULL);
+
+ linphone_core_set_user_agent(linphonec,"Linphonec", LINPHONE_VERSION);
linphone_core_set_zrtp_secrets_file(linphonec,zrtpsecrets);
linphone_core_enable_video_capture(linphonec, vcap_enabled);
linphone_core_enable_video_display(linphonec, display_enabled);
- if (display_enabled && window_id != 0)
+ if (display_enabled && window_id != 0)
{
printf ("Setting window_id: 0x%x\n", window_id);
linphone_core_set_native_video_window_id(linphonec,window_id);
@@ -782,7 +783,7 @@ linphonec_finish(int exit_status)
{
// Do not allow concurrent destroying to prevent glibc errors
static bool_t terminating=FALSE;
- if (terminating) return;
+ if (terminating) return;
terminating=TRUE;
linphonec_out("Terminating...\n");
@@ -829,9 +830,9 @@ linphonec_prompt_for_auth_final(LinphoneCore *lc)
#endif
if (reentrancy!=0) return 0;
-
+
reentrancy++;
-
+
LinphoneAuthInfo *pending_auth=auth_stack.elem[auth_stack.nitems-1];
snprintf(auth_prompt, 256, "Password for %s on %s: ",
@@ -1159,7 +1160,6 @@ linphonec_main_loop (LinphoneCore * opm)
add_history(iptr);
}
#endif
-
linphonec_parse_command_line(linphonec, iptr);
linphonec_command_finished();
free(input);
diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am
index e2db1d2c1..8a3b62daf 100644
--- a/coreapi/Makefile.am
+++ b/coreapi/Makefile.am
@@ -91,7 +91,7 @@ if HAVE_LD_OUTPUT_DEF
liblinphone_la_LDFLAGS += -Wl,--output-def,liblinphone-$(LIBLINPHONE_SO_CURRENT).def
defexecdir = $(libdir)
defexec_DATA = liblinphone-$(LIBLINPHONE_SO_CURRENT).def
-CLEANFILES = $(defexec_DATA)
+CLEANFILES += $(defexec_DATA)
liblinphone-$(LIBLINPHONE_SO_CURRENT).def: liblinphone.la
@@ -156,15 +156,21 @@ AM_CFLAGS+= -DUSE_BELLESIP
AM_CXXFLAGS=$(AM_CFLAGS)
+#Make sure that we are in linphone's git tree by doing git log $(top_srcdir)/configure.ac.
+#if it is something known to git, then that will be ok to check the git describe number and make sure it is consistent with
+#the PACKAGE_VERSION given in configure.ac
+
make_gitversion_h:
- if test "$(GITDESCRIBE)" != "" ; then \
- if test "$(GIT_TAG)" != "$(PACKAGE_VERSION)" ; then \
- echo "*** PACKAGE_VERSION and git tag differ. Please put them identical."; \
- exit 1; \
+ if test -d $(top_srcdir)/.git ; then \
+ if test "$(GITDESCRIBE)" != "" ; then \
+ if test "$(GIT_TAG)" != "$(PACKAGE_VERSION)" ; then \
+ echo "*** PACKAGE_VERSION and git tag differ. Please put them identical."; \
+ exit 1; \
+ fi ; \
+ $(ECHO) -n "#define LIBLINPHONE_GIT_VERSION \"$(GITDESCRIBE)\"" > $(GITVERSION_FILE_TMP) ; \
+ elif test "$(GITREVISION)" != "" ; then \
+ $(ECHO) -n "#define LIBLINPHONE_GIT_VERSION \"$(LINPHONE_VERSION)_$(GITREVISION)\"" > $(GITVERSION_FILE_TMP) ; \
fi ; \
- $(ECHO) -n "#define LIBLINPHONE_GIT_VERSION \"$(GITDESCRIBE)\"" > $(GITVERSION_FILE_TMP) ; \
- elif test "$(GITREVISION)" != "" ; then \
- $(ECHO) -n "#define LIBLINPHONE_GIT_VERSION \"$(LINPHONE_VERSION)_$(GITREVISION)\"" > $(GITVERSION_FILE_TMP) ; \
else \
$(ECHO) -n "" > $(GITVERSION_FILE_TMP) ; \
fi
diff --git a/coreapi/TunnelManager.cc b/coreapi/TunnelManager.cc
index efac8fbb0..2bc8cd3e0 100644
--- a/coreapi/TunnelManager.cc
+++ b/coreapi/TunnelManager.cc
@@ -30,82 +30,6 @@
using namespace belledonnecomm;
using namespace ::std;
-#ifndef USE_BELLESIP
-
-Mutex TunnelManager::sMutex;
-
-int TunnelManager::eXosipSendto(int fd,const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen,void* userdata){
- TunnelManager* lTunnelMgr=(TunnelManager*)userdata;
-
- sMutex.lock();
- if (lTunnelMgr->mSipSocket==NULL){
- sMutex.unlock();
- return len;
- }
- lTunnelMgr->mSipSocket->sendto(buf,len,to,tolen);
- sMutex.unlock();
- //ignore the error in all cases, retransmissions might be successful.
- return len;
-}
-
-int TunnelManager::eXosipRecvfrom(int fd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen,void* userdata){
- TunnelManager* lTunnelMgr=(TunnelManager*)userdata;
- int err;
- sMutex.lock();
- if (lTunnelMgr->mSipSocket==NULL){
- sMutex.unlock();
- return 0;//let ignore the error
- }
- err=lTunnelMgr->mSipSocket->recvfrom(buf,len,from,*fromlen);
- sMutex.unlock();
- return err;
-}
-
-int TunnelManager::eXosipSelect(int max_fds, fd_set *s1, fd_set *s2, fd_set *s3, struct timeval *tv,void* userdata){
- struct timeval begin,cur;
- TunnelManager* lTunnelMgr=(TunnelManager*)userdata;
- if (s1 && tv!=0 && tv->tv_sec){
- /*this is the select from udp.c, the one that is interesting to us*/
- NativeSocket udp_fd=(NativeSocket)eXosip_get_udp_socket();
- NativeSocket controlfd=(NativeSocket)eXosip_get_control_fd();
-
- FD_ZERO(s1);
- gettimeofday(&begin,NULL);
- do{
- struct timeval abit;
-
- abit.tv_sec=0;
- abit.tv_usec=20000;
- sMutex.lock();
- if (lTunnelMgr->mSipSocket!=NULL){
- if (lTunnelMgr->mSipSocket->hasData()) {
- sMutex.unlock();
- /* we make exosip believe that it has udp data to read*/
- FD_SET(udp_fd,s1);
- return 1;
- }
- }
- sMutex.unlock();
- gettimeofday(&cur,NULL);
- if (cur.tv_sec-begin.tv_sec>tv->tv_sec) {
- FD_SET(controlfd,s1);
- FD_SET(udp_fd,s1);
- return 0;
- }
- FD_ZERO(s1);
- FD_SET(controlfd,s1);
- if (select(max_fds,s1,s2,s3,&abit)==1) {
- return 1;
- }
- }while(1);
-
- }else{
- /*select called from other places, only the control fd is present */
- return select(max_fds,s1,s2,s3,tv);
- }
-}
-#endif
-
void TunnelManager::addServer(const char *ip, int port,unsigned int udpMirrorPort,unsigned int delay) {
if (ip == NULL) {
@@ -186,10 +110,6 @@ void TunnelManager::start() {
mTunnelClient->setHttpProxy(mHttpProxyHost.c_str(), mHttpProxyPort, mHttpUserName.c_str(), mHttpPasswd.c_str());
}
mTunnelClient->start();
-
-#ifndef USE_BELLESIP
- if (mSipSocket == NULL) mSipSocket =mTunnelClient->createSocket(5060);
-#endif
}
bool TunnelManager::isStarted() {
@@ -217,9 +137,6 @@ int TunnelManager::customRecvfrom(struct _RtpTransport *t, mblk_t *msg, int flag
TunnelManager::TunnelManager(LinphoneCore* lc) :TunnelClientController()
,mCore(lc)
-#ifndef USE_BELLESIP
-,mSipSocket(NULL)
-#endif
,mCallback(NULL)
,mEnabled(false)
,mTunnelClient(NULL)
@@ -227,12 +144,6 @@ TunnelManager::TunnelManager(LinphoneCore* lc) :TunnelClientController()
,mReady(false)
,mHttpProxyPort(0){
-#ifndef USE_BELLESIP
- mExosipTransport.data=this;
- mExosipTransport.recvfrom=eXosipRecvfrom;
- mExosipTransport.sendto=eXosipSendto;
- mExosipTransport.select=eXosipSelect;
-#endif
linphone_core_add_iterate_hook(mCore,(LinphoneCoreIterateHook)sOnIterate,this);
mTransportFactories.audio_rtcp_func=sCreateRtpTransport;
mTransportFactories.audio_rtcp_func_data=this;
@@ -249,17 +160,7 @@ TunnelManager::~TunnelManager(){
}
void TunnelManager::stopClient(){
-#ifdef USE_BELLESIP
sal_disable_tunnel(mCore->sal);
-#else
- eXosip_transport_hook_register(NULL);
- if (mSipSocket != NULL){
- sMutex.lock();
- mTunnelClient->closeSocket(mSipSocket);
- mSipSocket = NULL;
- sMutex.unlock();
- }
-#endif
if (mTunnelClient){
delete mTunnelClient;
mTunnelClient=NULL;
@@ -279,16 +180,11 @@ void TunnelManager::processTunnelEvent(const Event &ev){
//register
if (lProxy) {
- linphone_proxy_config_done(lProxy);
+ linphone_proxy_config_refresh_register(lProxy);
}
mReady=true;
}else if (mEnabled && !mTunnelClient->isReady()){
/* we got disconnected from the tunnel */
- if (lProxy && linphone_proxy_config_is_registered(lProxy)) {
- /*forces de-registration so that we register again when the tunnel is up*/
- linphone_proxy_config_edit(lProxy);
- linphone_core_iterate(mCore);
- }
mReady=false;
}
}
@@ -299,6 +195,8 @@ void TunnelManager::waitUnRegistration(){
if (lProxy && linphone_proxy_config_get_state(lProxy)==LinphoneRegistrationOk) {
int i=0;
linphone_proxy_config_edit(lProxy);
+ linphone_proxy_config_enable_register(lProxy,FALSE);
+ linphone_proxy_config_done(lProxy);
//make sure unregister is sent and authenticated
do{
linphone_core_iterate(mCore);
@@ -348,6 +246,8 @@ void TunnelManager::enable(bool isEnable) {
LinphoneProxyConfig* lProxy;
linphone_core_get_default_proxy(mCore, &lProxy);
if (lProxy) {
+ linphone_proxy_config_edit(lProxy);
+ linphone_proxy_config_enable_register(lProxy,TRUE);
linphone_proxy_config_done(lProxy);
}
diff --git a/coreapi/bellesip_sal/sal_impl.c b/coreapi/bellesip_sal/sal_impl.c
index a35d85822..9693226dd 100644
--- a/coreapi/bellesip_sal/sal_impl.c
+++ b/coreapi/bellesip_sal/sal_impl.c
@@ -97,14 +97,13 @@ void sal_disable_logs() {
void sal_add_pending_auth(Sal *sal, SalOp *op){
if (ms_list_find(sal->pending_auths,op)==NULL){
- sal->pending_auths=ms_list_append(sal->pending_auths,sal_op_ref(op));
+ sal->pending_auths=ms_list_append(sal->pending_auths,op);
}
}
void sal_remove_pending_auth(Sal *sal, SalOp *op){
if (ms_list_find(sal->pending_auths,op)){
sal->pending_auths=ms_list_remove(sal->pending_auths,op);
- sal_op_unref(op);
}
}
@@ -157,7 +156,10 @@ void sal_process_authentication(SalOp *op) {
}
}
/*always store auth info, for case of wrong credential*/
- if (op->auth_info) sal_auth_info_delete(op->auth_info);
+ if (op->auth_info) {
+ sal_auth_info_delete(op->auth_info);
+ op->auth_info=NULL;
+ }
if (auth_list){
auth_event=(belle_sip_auth_event_t*)(auth_list->data);
op->auth_info=sal_auth_info_create(auth_event);
@@ -321,9 +323,8 @@ static void process_response_event(void *user_ctx, const belle_sip_response_even
belle_sip_message("Op is terminated, nothing to do with this [%i]",response_code);
return;
}
- if (!op->base.remote_ua) {
- sal_op_set_remote_ua(op,BELLE_SIP_MESSAGE(response));
- }
+ /*do it all the time, since we can receive provisional responses from a different instance than the final one*/
+ sal_op_set_remote_ua(op,BELLE_SIP_MESSAGE(response));
if(remote_contact) {
__sal_op_set_remote_contact(op, belle_sip_header_get_unparsed_value(BELLE_SIP_HEADER(remote_contact)));
@@ -342,7 +343,6 @@ static void process_response_event(void *user_ctx, const belle_sip_response_even
break;
case 401:
case 407:
- /*belle_sip_transaction_set_application_data(BELLE_SIP_TRANSACTION(client_transaction),NULL);*//*remove op from trans*/
if (op->state == SalOpStateTerminating && strcmp("BYE",belle_sip_request_get_method(request))!=0) {
/*only bye are completed*/
belle_sip_message("Op is in state terminating, nothing else to do ");
@@ -376,8 +376,8 @@ static void process_response_event(void *user_ctx, const belle_sip_response_even
ms_error("Unhandled event response [%p]",event);
}
}
-
}
+
static void process_timeout(void *user_ctx, const belle_sip_timeout_event_t *event) {
belle_sip_client_transaction_t* client_transaction = belle_sip_timeout_event_get_client_transaction(event);
SalOp* op = (SalOp*)belle_sip_transaction_get_application_data(BELLE_SIP_TRANSACTION(client_transaction));
@@ -387,6 +387,7 @@ static void process_timeout(void *user_ctx, const belle_sip_timeout_event_t *eve
ms_error("Unhandled event timeout [%p]",event);
}
}
+
static void process_transaction_terminated(void *user_ctx, const belle_sip_transaction_terminated_event_t *event) {
belle_sip_client_transaction_t* client_transaction = belle_sip_transaction_terminated_event_get_client_transaction(event);
belle_sip_server_transaction_t* server_transaction = belle_sip_transaction_terminated_event_get_server_transaction(event);
@@ -396,7 +397,7 @@ static void process_transaction_terminated(void *user_ctx, const belle_sip_trans
if(client_transaction)
trans=BELLE_SIP_TRANSACTION(client_transaction);
else
- trans=BELLE_SIP_TRANSACTION(server_transaction);
+ trans=BELLE_SIP_TRANSACTION(server_transaction);
op = (SalOp*)belle_sip_transaction_get_application_data(trans);
if (op && op->callbacks && op->callbacks->process_transaction_terminated) {
@@ -404,8 +405,7 @@ static void process_transaction_terminated(void *user_ctx, const belle_sip_trans
} else {
ms_message("Unhandled transaction terminated [%p]",trans);
}
- if (op && client_transaction) sal_op_unref(op); /*because every client transaction ref op*/
-
+ if (op) sal_op_unref(op); /*because every transaction ref op*/
}
@@ -423,19 +423,21 @@ static void process_auth_requested(void *sal, belle_sip_auth_event_t *event) {
Sal * sal_init(){
belle_sip_listener_callbacks_t listener_callbacks;
Sal * sal=ms_new0(Sal,1);
+
+ /*belle_sip_object_enable_marshal_check(TRUE);*/
sal->auto_contacts=TRUE;
-
+
/*first create the stack, which initializes the belle-sip object's pool for this thread*/
belle_sip_set_log_handler(_belle_sip_log);
sal->stack = belle_sip_stack_new(NULL);
-
+
sal->user_agent=belle_sip_header_user_agent_new();
#if defined(PACKAGE_NAME) && defined(LINPHONE_VERSION)
belle_sip_header_user_agent_add_product(sal->user_agent, PACKAGE_NAME "/" LINPHONE_VERSION);
#endif
sal_append_stack_string_to_user_agent(sal);
belle_sip_object_ref(sal->user_agent);
-
+
sal->prov = belle_sip_stack_create_provider(sal->stack,NULL);
sal_nat_helper_enable(sal,TRUE);
memset(&listener_callbacks,0,sizeof(listener_callbacks));
@@ -451,6 +453,7 @@ Sal * sal_init(){
sal->tls_verify=TRUE;
sal->tls_verify_cn=TRUE;
sal->refresher_retry_after=60000; /*default value in ms*/
+ sal->enable_sip_update=TRUE;
return sal;
}
@@ -613,6 +616,12 @@ void sal_set_user_agent(Sal *ctx, const char *user_agent){
return ;
}
+const char* sal_get_user_agent(Sal *ctx){
+ static char user_agent[255];
+ belle_sip_header_user_agent_get_products_as_string(ctx->user_agent, user_agent, 254);
+ return user_agent;
+}
+
void sal_append_stack_string_to_user_agent(Sal *ctx) {
char stack_string[64];
snprintf(stack_string, sizeof(stack_string) - 1, "(belle-sip/%s)", belle_sip_version_to_string());
@@ -999,3 +1008,7 @@ void sal_cancel_timer(Sal *sal, belle_sip_source_t *timer) {
belle_sip_main_loop_t *ml = belle_sip_stack_get_main_loop(sal->stack);
belle_sip_main_loop_remove_source(ml, timer);
}
+void sal_enable_sip_update_method(Sal *ctx,bool_t value) {
+ ctx->enable_sip_update=value;
+}
+
diff --git a/coreapi/bellesip_sal/sal_impl.h b/coreapi/bellesip_sal/sal_impl.h
index b6e18d76a..a20150de2 100644
--- a/coreapi/bellesip_sal/sal_impl.h
+++ b/coreapi/bellesip_sal/sal_impl.h
@@ -48,6 +48,7 @@ struct Sal{
bool_t auto_contacts;
bool_t enable_test_features;
bool_t no_initial_route;
+ bool_t enable_sip_update; /*true by default*/
};
typedef enum SalOpState {
diff --git a/coreapi/bellesip_sal/sal_op_call.c b/coreapi/bellesip_sal/sal_op_call.c
index 9a2474b37..26bbdb038 100644
--- a/coreapi/bellesip_sal/sal_op_call.c
+++ b/coreapi/bellesip_sal/sal_op_call.c
@@ -27,16 +27,11 @@ static void call_set_released(SalOp* op){
op->state=SalOpStateTerminated;
op->base.root->callbacks.call_released(op);
op->call_released=TRUE;
+ /*be aware that the following line may destroy the op*/
+ set_or_update_dialog(op,NULL);
}
}
-/*used when the SalOp was ref'd by the dialog, in which case we rely only on the dialog terminated notification*/
-static void call_set_released_and_unref(SalOp* op) {
- call_set_released(op);
- sal_op_unref(op);
-}
-
-
static void call_set_error(SalOp* op,belle_sip_response_t* response){
sal_op_set_error_info_from_response(op,response);
op->base.root->callbacks.call_failure(op);
@@ -62,7 +57,7 @@ static void sdp_process(SalOp *h){
strcpy(h->result->addr,h->base.remote_media->addr);
h->result->bandwidth=h->base.remote_media->bandwidth;
- for(i=0;iresult->n_active_streams;++i){
+ for(i=0;iresult);++i){
strcpy(h->result->streams[i].rtp_addr,h->base.remote_media->streams[i].rtp_addr);
h->result->streams[i].ptime=h->base.remote_media->streams[i].ptime;
h->result->streams[i].bandwidth=h->base.remote_media->streams[i].bandwidth;
@@ -70,7 +65,7 @@ static void sdp_process(SalOp *h){
strcpy(h->result->streams[i].rtcp_addr,h->base.remote_media->streams[i].rtcp_addr);
h->result->streams[i].rtcp_port=h->base.remote_media->streams[i].rtcp_port;
- if (h->result->streams[i].proto == SalProtoRtpSavp) {
+ if ((h->result->streams[i].proto == SalProtoRtpSavpf) || (h->result->streams[i].proto == SalProtoRtpSavp)) {
h->result->streams[i].crypto[0] = h->base.remote_media->streams[i].crypto[0];
}
}
@@ -142,7 +137,7 @@ static void process_dialog_terminated(void *ctx, const belle_sip_dialog_terminat
break;
}
belle_sip_main_loop_do_later(belle_sip_stack_get_main_loop(op->base.root->stack)
- ,(belle_sip_callback_t) call_set_released_and_unref
+ ,(belle_sip_callback_t) call_set_released
, op);
} else {
ms_error("dialog unknown for op ");
@@ -152,6 +147,10 @@ static void process_dialog_terminated(void *ctx, const belle_sip_dialog_terminat
static void handle_sdp_from_response(SalOp* op,belle_sip_response_t* response) {
belle_sdp_session_description_t* sdp;
SalReason reason;
+ if (op->base.remote_media){
+ sal_media_description_unref(op->base.remote_media);
+ op->base.remote_media=NULL;
+ }
if (extract_sdp(BELLE_SIP_MESSAGE(response),&sdp,&reason)==0) {
if (sdp){
op->base.remote_media=sal_media_description_new();
@@ -168,12 +167,14 @@ static void cancelling_invite(SalOp* op ){
sal_op_send_request(op,cancel);
op->state=SalOpStateTerminating;
}
+
static int vfu_retry (void *user_data, unsigned int events) {
SalOp *op=(SalOp *)user_data;
sal_call_send_vfu_request(op);
sal_op_unref(op);
return BELLE_SIP_STOP;
}
+
static void call_process_response(void *op_base, const belle_sip_response_event_t *event){
SalOp* op = (SalOp*)op_base;
belle_sip_request_t* ack;
@@ -183,17 +184,17 @@ static void call_process_response(void *op_base, const belle_sip_response_event_
belle_sip_response_t* response=belle_sip_response_event_get_response(event);
int code = belle_sip_response_get_status_code(response);
belle_sip_header_content_type_t *header_content_type=NULL;
-
+ belle_sip_dialog_t *dialog=belle_sip_response_event_get_dialog(event);
if (!client_transaction) {
ms_warning("Discarding stateless response [%i] on op [%p]",code,op);
return;
}
req=belle_sip_transaction_get_request(BELLE_SIP_TRANSACTION(client_transaction));
- set_or_update_dialog(op,belle_sip_response_event_get_dialog(event));
- dialog_state=op->dialog?belle_sip_dialog_get_state(op->dialog):BELLE_SIP_DIALOG_NULL;
+ set_or_update_dialog(op,dialog);
+ dialog_state=dialog ? belle_sip_dialog_get_state(dialog) : BELLE_SIP_DIALOG_NULL;
- ms_message("Op [%p] receiving call response [%i], dialog is [%p] in state [%s]",op,code,op->dialog,belle_sip_dialog_state_to_string(dialog_state));
+ ms_message("Op [%p] receiving call response [%i], dialog is [%p] in state [%s]",op,code,dialog,belle_sip_dialog_state_to_string(dialog_state));
switch(dialog_state) {
case BELLE_SIP_DIALOG_NULL:
@@ -215,14 +216,18 @@ static void call_process_response(void *op_base, const belle_sip_response_event_
if (op->dialog==NULL) call_set_released(op);
}
}
- } else if (code >= 180 && code<300) {
- handle_sdp_from_response(op,response);
- op->base.root->callbacks.call_ringing(op);
+ } else if (code >= 180 && code<200) {
+ belle_sip_response_t *prev_response=belle_sip_object_data_get(BELLE_SIP_OBJECT(dialog),"early_response");
+ if (!prev_response || code>belle_sip_response_get_status_code(prev_response)){
+ handle_sdp_from_response(op,response);
+ op->base.root->callbacks.call_ringing(op);
+ }
+ belle_sip_object_data_set(BELLE_SIP_OBJECT(dialog),"early_response",belle_sip_object_ref(response),belle_sip_object_unref);
} else if (code>=300){
call_set_error(op,response);
if (op->dialog==NULL) call_set_released(op);
}
- } else if ( code >=200
+ } else if (code >=200
&& code<300
&& strcmp("UPDATE",belle_sip_request_get_method(req))==0) {
handle_sdp_from_response(op,response);
@@ -364,7 +369,7 @@ static int extract_sdp(belle_sip_message_t* message,belle_sdp_session_descriptio
}
static int is_media_description_acceptable(SalMediaDescription *md){
- if (md->n_total_streams==0){
+ if (md->nb_streams==0){
ms_warning("Media description does not define any stream.");
return FALSE;
}
@@ -418,8 +423,7 @@ static void process_request_event(void *op_base, const belle_sip_request_event_t
if (strcmp("ACK",method)!=0){ /*ACK does'nt create srv transaction*/
server_transaction = belle_sip_provider_create_server_transaction(op->base.root->prov,belle_sip_request_event_get_request(event));
belle_sip_object_ref(server_transaction);
- belle_sip_transaction_set_application_data(BELLE_SIP_TRANSACTION(server_transaction),op);
- sal_op_ref(op);
+ belle_sip_transaction_set_application_data(BELLE_SIP_TRANSACTION(server_transaction),sal_op_ref(op));
}
if (strcmp("INVITE",method)==0) {
@@ -561,6 +565,9 @@ static void process_request_event(void *op_base, const belle_sip_request_event_t
} else if (strcmp("MESSAGE",method)==0){
sal_process_incoming_message(op,event);
} else if (strcmp("UPDATE",method)==0) {
+
+ /*FIXME jehan: It might be better to silently accept UPDATE which do not modify either the number or the nature of streams*/
+
/*rfc 3311
* 5.2 Receiving an UPDATE
* ...
@@ -568,8 +575,9 @@ static void process_request_event(void *op_base, const belle_sip_request_event_t
* the request with a 504 response.
*/
resp=sal_op_create_response_from_request(op,req,504);
- belle_sip_message_add_header( BELLE_SIP_MESSAGE(resp)
- ,belle_sip_header_create( "Warning", "Cannot change the session parameters without prompting the user"));
+ belle_sip_response_set_reason_phrase(resp,"Cannot change the session parameters without prompting the user");
+ /*belle_sip_message_add_header( BELLE_SIP_MESSAGE(resp)
+ ,belle_sip_header_create( "Warning", "Cannot change the session parameters without prompting the user"));*/
belle_sip_server_transaction_send_response(server_transaction,resp);
return;
}else{
@@ -607,14 +615,16 @@ int sal_call_set_local_media_description(SalOp *op, SalMediaDescription *desc){
return 0;
}
-static belle_sip_header_allow_t *create_allow(){
+static belle_sip_header_allow_t *create_allow(bool_t enable_update){
belle_sip_header_allow_t* header_allow;
- header_allow = belle_sip_header_allow_create("INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO, UPDATE");
+ char allow [256];
+ snprintf(allow,sizeof(allow),"INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO%s",(enable_update?", UPDATE":""));
+ header_allow = belle_sip_header_allow_create(allow);
return header_allow;
}
static void sal_op_fill_invite(SalOp *op, belle_sip_request_t* invite) {
- belle_sip_message_add_header(BELLE_SIP_MESSAGE(invite),BELLE_SIP_HEADER(create_allow()));
+ belle_sip_message_add_header(BELLE_SIP_MESSAGE(invite),BELLE_SIP_HEADER(create_allow(op->base.root->enable_sip_update)));
if (op->base.root->session_expires!=0){
belle_sip_message_add_header(BELLE_SIP_MESSAGE(invite),belle_sip_header_create( "Session-expires", "200"));
@@ -742,7 +752,7 @@ int sal_call_accept(SalOp*h){
ms_error("Fail to build answer for call");
return -1;
}
- belle_sip_message_add_header(BELLE_SIP_MESSAGE(response),BELLE_SIP_HEADER(create_allow()));
+ belle_sip_message_add_header(BELLE_SIP_MESSAGE(response),BELLE_SIP_HEADER(create_allow(h->base.root->enable_sip_update)));
if (h->base.root->session_expires!=0){
if (h->supports_session_timers) {
belle_sip_message_add_header(BELLE_SIP_MESSAGE(response),belle_sip_header_create("Supported", "timer"));
diff --git a/coreapi/bellesip_sal/sal_op_call_transfer.c b/coreapi/bellesip_sal/sal_op_call_transfer.c
index 796966acd..84e529091 100644
--- a/coreapi/bellesip_sal/sal_op_call_transfer.c
+++ b/coreapi/bellesip_sal/sal_op_call_transfer.c
@@ -122,9 +122,9 @@ int sal_call_set_referer(SalOp *h, SalOp *refered_call){
SalOp *sal_call_get_replaces(SalOp *op){
if (op && op->replaces){
belle_sip_dialog_t* dialog=belle_sip_provider_find_dialog(op->base.root->prov
- ,belle_sip_header_replaces_get_call_id(op->replaces)
- ,belle_sip_header_replaces_get_from_tag(op->replaces)
- ,belle_sip_header_replaces_get_to_tag(op->replaces));
+ ,belle_sip_header_replaces_get_call_id(op->replaces)
+ ,belle_sip_header_replaces_get_from_tag(op->replaces)
+ ,belle_sip_header_replaces_get_to_tag(op->replaces));
if (dialog) {
return (SalOp*)belle_sip_dialog_get_application_data(dialog);
@@ -208,7 +208,7 @@ void sal_op_process_refer(SalOp *op, const belle_sip_request_event_t *event, bel
belle_sip_free(refer_to_uri_str);
} else {
ms_warning("cannot do anything with the refer without destination\n");
- resp = sal_op_create_response_from_request(op,req,501);
+ resp = sal_op_create_response_from_request(op,req,400);
belle_sip_server_transaction_send_response(server_transaction,resp);
}
@@ -233,9 +233,9 @@ void sal_op_call_process_notify(SalOp *op, const belle_sip_request_event_t *even
if (sipfrag){
int code=belle_sip_response_get_status_code(sipfrag);
SalReferStatus status=SalReferFailed;
- if (code==100){
+ if (code<200){
status=SalReferTrying;
- }else if (code==200){
+ }else if (code<300){
status=SalReferSuccess;
}else if (code>=400){
status=SalReferFailed;
diff --git a/coreapi/bellesip_sal/sal_op_impl.c b/coreapi/bellesip_sal/sal_op_impl.c
index a364ce324..649a4e240 100644
--- a/coreapi/bellesip_sal/sal_op_impl.c
+++ b/coreapi/bellesip_sal/sal_op_impl.c
@@ -44,8 +44,8 @@ void sal_op_release(SalOp *op){
void sal_op_release_impl(SalOp *op){
ms_message("Destroying op [%p] of type [%s]",op,sal_op_type_to_string(op->type));
if (op->pending_auth_transaction) belle_sip_object_unref(op->pending_auth_transaction);
+ sal_remove_pending_auth(op->base.root,op);
if (op->auth_info) {
- sal_remove_pending_auth(op->base.root,op);
sal_auth_info_delete(op->auth_info);
}
if (op->sdp_answer) belle_sip_object_unref(op->sdp_answer);
@@ -560,21 +560,30 @@ const SalErrorInfo *sal_op_get_error_info(const SalOp *op){
return &op->error_info;
}
+static void unlink_op_with_dialog(SalOp *op, belle_sip_dialog_t* dialog){
+ belle_sip_dialog_set_application_data(dialog,NULL);
+ sal_op_unref(op);
+ belle_sip_object_unref(dialog);
+}
+
+static belle_sip_dialog_t *link_op_with_dialog(SalOp *op, belle_sip_dialog_t* dialog){
+ belle_sip_dialog_set_application_data(dialog,sal_op_ref(op));
+ belle_sip_object_ref(dialog);
+ return dialog;
+}
+
void set_or_update_dialog(SalOp* op, belle_sip_dialog_t* dialog) {
- /*check if dialog has changed*/
- if (dialog && dialog != op->dialog) {
- ms_message("Dialog set from [%p] to [%p] for op [%p]",op->dialog,dialog,op);
- /*fixme, shouldn't we cancel previous dialog*/
- if (op->dialog) {
- belle_sip_dialog_set_application_data(op->dialog,NULL);
- belle_sip_object_unref(op->dialog);
- sal_op_unref(op);
+ ms_message("op [%p] : set_or_update_dialog() current=[%p] new=[%p]",op,op->dialog,dialog);
+ sal_op_ref(op);
+ if (op->dialog!=dialog){
+ if (op->dialog){
+ /*FIXME: shouldn't we delete unconfirmed dialogs ?*/
+ unlink_op_with_dialog(op,op->dialog);
+ op->dialog=NULL;
}
- op->dialog=dialog;
- belle_sip_dialog_set_application_data(op->dialog,op);
- sal_op_ref(op);
- belle_sip_object_ref(op->dialog);
+ if (dialog) op->dialog=link_op_with_dialog(op,dialog);
}
+ sal_op_unref(op);
}
/*return reffed op*/
SalOp* sal_op_ref(SalOp* op) {
@@ -599,6 +608,13 @@ int sal_op_send_and_create_refresher(SalOp* op,belle_sip_request_t* req, int exp
belle_sip_object_unref(op->refresher);
}
if ((op->refresher = belle_sip_client_transaction_create_refresher(op->pending_client_trans))) {
+ /*since refresher acquires the transaction, we should remove our context from the transaction, because we won't be notified
+ * that it is terminated anymore.*/
+ sal_op_unref(op);/*loose the reference that was given to the transaction when creating it*/
+ /* Note that the refresher will replace our data with belle_sip_transaction_set_application_data().
+ Something in the design is not very good here, it makes things complicated to the belle-sip user.
+ Possible ideas to improve things: refresher shall not use belle_sip_transaction_set_application_data() internally, refresher should let the first transaction
+ notify the user as a normal transaction*/
belle_sip_refresher_set_listener(op->refresher,listener,op);
belle_sip_refresher_set_retry_after(op->refresher,op->base.root->refresher_retry_after);
belle_sip_refresher_enable_manual_mode(op->refresher,op->manual_refresher);
diff --git a/coreapi/bellesip_sal/sal_op_message.c b/coreapi/bellesip_sal/sal_op_message.c
index 2f161c2a6..3324cefb7 100644
--- a/coreapi/bellesip_sal/sal_op_message.c
+++ b/coreapi/bellesip_sal/sal_op_message.c
@@ -55,6 +55,11 @@ static void process_response_event(void *op_base, const belle_sip_response_event
op->base.root->callbacks.text_delivery_update(op,status);
}
+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;
+}
+
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;
@@ -69,7 +74,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"));
+ 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"));
}
void sal_process_incoming_message(SalOp *op,const belle_sip_request_event_t *event){
@@ -85,11 +90,13 @@ void sal_process_incoming_message(SalOp *op,const belle_sip_request_event_t *eve
char* from;
bool_t plain_text=FALSE;
bool_t external_body=FALSE;
+ bool_t rcs_filetransfer=FALSE;
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);
if (content_type && ((plain_text=is_plain_text(content_type))
- || (external_body=is_external_body(content_type)))) {
+ || (external_body=is_external_body(content_type))
+ || (rcs_filetransfer=is_rcs_filetransfer(content_type)))) {
SalMessage salmsg;
char message_id[256]={0};
@@ -104,8 +111,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?belle_sip_message_get_body(BELLE_SIP_MESSAGE(req)):NULL;
+ 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 */
+ salmsg.content_type = "application/vnd.gsma.rcs-ft-http+xml";
+ }
if (external_body && belle_sip_parameters_get_parameter(BELLE_SIP_PARAMETERS(content_type),"URL")) {
size_t url_length=strlen(belle_sip_parameters_get_parameter(BELLE_SIP_PARAMETERS(content_type),"URL"));
salmsg.url = ms_strdup(belle_sip_parameters_get_parameter(BELLE_SIP_PARAMETERS(content_type),"URL")+1); /* skip first "*/
diff --git a/coreapi/bellesip_sal/sal_op_registration.c b/coreapi/bellesip_sal/sal_op_registration.c
index 0f011d308..b51435a4f 100644
--- a/coreapi/bellesip_sal/sal_op_registration.c
+++ b/coreapi/bellesip_sal/sal_op_registration.c
@@ -56,13 +56,15 @@ static void register_refresher_listener (belle_sip_refresher_t* refresher
chooses not to re-register, the UA SHOULD discard any stored service
route for that address-of-record. */
sal_op_set_service_route(op,NULL);
+ sal_op_ref(op); /*take a ref while invoking the callback to make sure the operations done after are valid*/
op->base.root->callbacks.register_failure(op);
- if (op->auth_info) {
+ if (op->state!=SalOpStateTerminated && op->auth_info) {
/*add pending auth*/
sal_add_pending_auth(op->base.root,op);
if (status_code==403 || status_code==401 || status_code==407 )
op->base.root->callbacks.auth_failure(op,op->auth_info);
}
+ sal_op_unref(op);
}
}
diff --git a/coreapi/bellesip_sal/sal_sdp.c b/coreapi/bellesip_sal/sal_sdp.c
index 50e3504a5..fe952bb56 100644
--- a/coreapi/bellesip_sal/sal_sdp.c
+++ b/coreapi/bellesip_sal/sal_sdp.c
@@ -68,6 +68,82 @@ static void add_ice_remote_candidates(belle_sdp_media_description_t *md, const S
if (buffer[0] != '\0') belle_sdp_media_description_add_attribute(md,belle_sdp_attribute_create("remote-candidates",buffer));
}
+static bool_t is_rtcp_fb_trr_int_the_same_for_all_payloads(const SalStreamDescription *stream, uint16_t *trr_int) {
+ MSList *pt_it;
+ bool_t first = TRUE;
+ for (pt_it = stream->payloads; pt_it != NULL; pt_it = pt_it->next) {
+ PayloadType *pt = (PayloadType *)pt_it->data;
+ if (payload_type_get_flags(pt) & PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED) {
+ if (first == TRUE) {
+ *trr_int = payload_type_get_avpf_params(pt).trr_interval;
+ first = FALSE;
+ } else if (payload_type_get_avpf_params(pt).trr_interval != *trr_int) {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+static void add_rtcp_fb_trr_int_attribute(belle_sdp_media_description_t *media_desc, int8_t id, uint16_t trr_int) {
+ belle_sdp_rtcp_fb_attribute_t *attribute = belle_sdp_rtcp_fb_attribute_new();
+ belle_sdp_rtcp_fb_attribute_set_id(attribute, id);
+ belle_sdp_rtcp_fb_attribute_set_type(attribute, BELLE_SDP_RTCP_FB_TRR_INT);
+ belle_sdp_rtcp_fb_attribute_set_trr_int(attribute, trr_int);
+ belle_sdp_media_description_add_attribute(media_desc, BELLE_SDP_ATTRIBUTE(attribute));
+}
+
+static void add_rtcp_fb_nack_attribute(belle_sdp_media_description_t *media_desc, int8_t id, belle_sdp_rtcp_fb_val_param_t param) {
+ belle_sdp_rtcp_fb_attribute_t *attribute = belle_sdp_rtcp_fb_attribute_new();
+ belle_sdp_rtcp_fb_attribute_set_id(attribute, id);
+ belle_sdp_rtcp_fb_attribute_set_type(attribute, BELLE_SDP_RTCP_FB_NACK);
+ belle_sdp_rtcp_fb_attribute_set_param(attribute, param);
+ belle_sdp_media_description_add_attribute(media_desc, BELLE_SDP_ATTRIBUTE(attribute));
+}
+
+static void add_rtcp_fb_ccm_attribute(belle_sdp_media_description_t *media_desc, int8_t id, belle_sdp_rtcp_fb_val_param_t param) {
+ belle_sdp_rtcp_fb_attribute_t *attribute = belle_sdp_rtcp_fb_attribute_new();
+ belle_sdp_rtcp_fb_attribute_set_id(attribute, id);
+ belle_sdp_rtcp_fb_attribute_set_type(attribute, BELLE_SDP_RTCP_FB_CCM);
+ belle_sdp_rtcp_fb_attribute_set_param(attribute, param);
+ belle_sdp_media_description_add_attribute(media_desc, BELLE_SDP_ATTRIBUTE(attribute));
+}
+
+static void add_rtcp_fb_attributes(belle_sdp_media_description_t *media_desc, const SalMediaDescription *md, const SalStreamDescription *stream) {
+ MSList *pt_it;
+ PayloadType *pt;
+ PayloadTypeAvpfParams avpf_params;
+ bool_t general_trr_int;
+ uint16_t trr_int = 0;
+
+ general_trr_int = is_rtcp_fb_trr_int_the_same_for_all_payloads(stream, &trr_int);
+ if (general_trr_int == TRUE) {
+ add_rtcp_fb_trr_int_attribute(media_desc, -1, trr_int);
+ }
+
+ for (pt_it = stream->payloads; pt_it != NULL; pt_it = pt_it->next) {
+ pt = (PayloadType *)pt_it->data;
+
+ /* AVPF/SAVPF profile is used so enable AVPF for all paylad types. */
+ payload_type_set_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED);
+ avpf_params = payload_type_get_avpf_params(pt);
+
+ /* Add rtcp-fb attributes according to the AVPF features of the payload types. */
+ if (avpf_params.features & PAYLOAD_TYPE_AVPF_PLI) {
+ add_rtcp_fb_nack_attribute(media_desc, payload_type_get_number(pt), BELLE_SDP_RTCP_FB_PLI);
+ }
+ if (avpf_params.features & PAYLOAD_TYPE_AVPF_SLI) {
+ add_rtcp_fb_nack_attribute(media_desc, payload_type_get_number(pt), BELLE_SDP_RTCP_FB_SLI);
+ }
+ if (avpf_params.features & PAYLOAD_TYPE_AVPF_RPSI) {
+ add_rtcp_fb_nack_attribute(media_desc, payload_type_get_number(pt), BELLE_SDP_RTCP_FB_RPSI);
+ }
+ if (avpf_params.features & PAYLOAD_TYPE_AVPF_FIR) {
+ add_rtcp_fb_ccm_attribute(media_desc, payload_type_get_number(pt), BELLE_SDP_RTCP_FB_FIR);
+ }
+ }
+}
+
static belle_sdp_attribute_t * create_rtcp_xr_attribute(const OrtpRtcpXrConfiguration *config) {
belle_sdp_rtcp_xr_attribute_t *attribute = belle_sdp_rtcp_xr_attribute_new();
if (config->rcvr_rtt_mode != OrtpRtcpXrRcvrRttNone) {
@@ -100,12 +176,12 @@ static void stream_description_to_sdp ( belle_sdp_session_description_t *session
int rtp_port;
int rtcp_port;
bool_t different_rtp_and_rtcp_addr;
-
+
rtp_addr=stream->rtp_addr;
rtcp_addr=stream->rtcp_addr;
rtp_port=stream->rtp_port;
rtcp_port=stream->rtcp_port;
-
+
media_desc = belle_sdp_media_description_create ( sal_stream_description_get_type_as_string(stream)
,stream->rtp_port
,1
@@ -139,43 +215,22 @@ static void stream_description_to_sdp ( belle_sdp_session_description_t *session
}else inet6=FALSE;
belle_sdp_media_description_set_connection(media_desc,belle_sdp_connection_create("IN", inet6 ? "IP6" : "IP4", rtp_addr));
}
-
+
if ( stream->bandwidth>0 )
belle_sdp_media_description_set_bandwidth ( media_desc,"AS",stream->bandwidth );
- if ( stream->proto == SalProtoRtpSavp ) {
+ if ((stream->proto == SalProtoRtpSavpf) || (stream->proto == SalProtoRtpSavp)) {
/* add crypto lines */
for ( j=0; jcrypto[j].algo ) {
- case MS_AES_128_SHA1_80:
- enc_name="AES_CM_128_HMAC_SHA1_80";
- break;
- case MS_AES_128_SHA1_32:
- enc_name="AES_CM_128_HMAC_SHA1_32";
- break;
- case MS_AES_256_SHA1_32:
- enc_name="AES_CM_256_HMAC_SHA1_32";
- break;
- case MS_AES_256_SHA1_80:
- enc_name="AES_CM_256_HMAC_SHA1_32";
- break;
- case MS_AES_128_NO_AUTH:
- ms_warning ( "Unsupported crypto suite: AES_128_NO_AUTH" );
- break;
- case MS_NO_CIPHER_SHA1_80:
- ms_warning ( "Unsupported crypto suite: NO_CIPHER_SHA1_80" );
- break;
- default:
- j = SAL_CRYPTO_ALGO_MAX;
- /* no break */
- }
- if (enc_name){
- snprintf ( buffer, sizeof ( buffer )-1, "%d %s inline:%s",
- stream->crypto[j].tag, enc_name, stream->crypto[j].master_key );
- belle_sdp_media_description_add_attribute ( media_desc,belle_sdp_attribute_create ( "crypto",buffer ) );
- }
+ MSCryptoSuiteNameParams desc;
+ if (ms_crypto_suite_to_name_params(stream->crypto[j].algo,&desc)==0){
+ if (desc.params)
+ snprintf ( buffer, sizeof ( buffer )-1, "%d %s inline:%s %s", stream->crypto[j].tag, desc.name, stream->crypto[j].master_key,desc.params);
+ else
+ snprintf ( buffer, sizeof ( buffer )-1, "%d %s inline:%s", stream->crypto[j].tag, desc.name, stream->crypto[j].master_key );
+
+ belle_sdp_media_description_add_attribute( media_desc,belle_sdp_attribute_create ("crypto", buffer));
+ }else break;
}
}
switch ( stream->dir ) {
@@ -222,7 +277,11 @@ static void stream_description_to_sdp ( belle_sdp_session_description_t *session
}
}
- if (stream->rtcp_xr.enabled == TRUE) {
+ if ((rtp_port != 0) && ((stream->proto == SalProtoRtpAvpf) || (stream->proto == SalProtoRtpSavpf))) {
+ add_rtcp_fb_attributes(media_desc, md, stream);
+ }
+
+ if ((rtp_port != 0) && (stream->rtcp_xr.enabled == TRUE)) {
char sastr[1024] = {0};
char mastr[1024] = {0};
size_t saoff = 0;
@@ -296,7 +355,7 @@ belle_sdp_session_description_t * media_description_to_sdp ( const SalMediaDescr
belle_sdp_session_description_add_attribute(session_desc, create_rtcp_xr_attribute(&desc->rtcp_xr));
}
- for ( i=0; in_total_streams; i++ ) {
+ for ( i=0; inb_streams; i++ ) {
stream_description_to_sdp(session_desc, desc, &desc->streams[i]);
}
return session_desc;
@@ -305,9 +364,11 @@ belle_sdp_session_description_t * media_description_to_sdp ( const SalMediaDescr
static void sdp_parse_payload_types(belle_sdp_media_description_t *media_desc, SalStreamDescription *stream) {
PayloadType *pt;
+ PayloadTypeAvpfParams avpf_params;
belle_sip_list_t* mime_param_it=NULL;
belle_sdp_mime_parameter_t* mime_param;
belle_sip_list_t* mime_params=belle_sdp_media_description_build_mime_parameters ( media_desc );
+ memset(&avpf_params, 0, sizeof(avpf_params));
for ( mime_param_it=mime_params
; mime_param_it!=NULL
; mime_param_it=mime_param_it->next ) {
@@ -319,6 +380,7 @@ static void sdp_parse_payload_types(belle_sdp_media_description_t *media_desc, S
pt->mime_type=ms_strdup ( belle_sdp_mime_parameter_get_type ( mime_param ) );
pt->channels=belle_sdp_mime_parameter_get_channel_count ( mime_param );
payload_type_set_send_fmtp ( pt,belle_sdp_mime_parameter_get_parameters ( mime_param ) );
+ payload_type_set_avpf_params(pt, avpf_params);
stream->payloads=ms_list_append ( stream->payloads,pt );
stream->ptime=belle_sdp_mime_parameter_get_ptime ( mime_param );
ms_message ( "Found payload %s/%i fmtp=%s",pt->mime_type,pt->clock_rate,
@@ -330,7 +392,7 @@ static void sdp_parse_payload_types(belle_sdp_media_description_t *media_desc, S
static void sdp_parse_media_crypto_parameters(belle_sdp_media_description_t *media_desc, SalStreamDescription *stream) {
belle_sip_list_t *attribute_it;
belle_sdp_attribute_t *attribute;
- char tmp[256], tmp2[256];
+ char tmp[256], tmp2[256], parameters[256]={0};
int valid_count = 0;
int nb;
@@ -341,42 +403,39 @@ static void sdp_parse_media_crypto_parameters(belle_sdp_media_description_t *med
attribute=BELLE_SDP_ATTRIBUTE ( attribute_it->data );
if ( keywordcmp ( "crypto",belle_sdp_attribute_get_name ( attribute ) ) ==0 && belle_sdp_attribute_get_value ( attribute ) !=NULL ) {
- nb = sscanf ( belle_sdp_attribute_get_value ( attribute ), "%d %256s inline:%256s",
+ nb = sscanf ( belle_sdp_attribute_get_value ( attribute ), "%d %256s inline:%256s %256s",
&stream->crypto[valid_count].tag,
tmp,
- tmp2 );
- ms_message ( "Found valid crypto line (tag:%d algo:'%s' key:'%s'",
- stream->crypto[valid_count].tag,
- tmp,
- tmp2 );
- if ( nb == 3 ) {
- if ( keywordcmp ( "AES_CM_128_HMAC_SHA1_80",tmp ) == 0 ){
- stream->crypto[valid_count].algo = MS_AES_128_SHA1_80;
- }else if ( keywordcmp ( "AES_CM_128_HMAC_SHA1_32",tmp ) == 0 ){
- stream->crypto[valid_count].algo = MS_AES_128_SHA1_32;
- }else if ( keywordcmp ( "AES_CM_256_HMAC_SHA1_32",tmp ) == 0 ){
- stream->crypto[valid_count].algo = MS_AES_256_SHA1_32;
- }else if ( keywordcmp ( "AES_CM_256_HMAC_SHA1_80",tmp ) == 0 ){
- stream->crypto[valid_count].algo = MS_AES_256_SHA1_80;
- }else {
+ tmp2, parameters );
+
+ if ( nb >= 3 ) {
+ MSCryptoSuite cs;
+ MSCryptoSuiteNameParams np;
+
+ np.name=tmp;
+ np.params=parameters[0]!='\0' ? parameters : NULL;
+ cs=ms_crypto_suite_build_from_name_params(&np);
+ if (cs==MS_CRYPTO_SUITE_INVALID){
ms_warning ( "Failed to parse crypto-algo: '%s'", tmp );
stream->crypto[valid_count].algo = 0;
- }
- if ( stream->crypto[valid_count].algo ) {
- strncpy ( stream->crypto[valid_count].master_key, tmp2, 41 );
- stream->crypto[valid_count].master_key[40] = '\0';
+ }else{
+ char *sep;
+ strncpy ( stream->crypto[valid_count].master_key, tmp2, sizeof(stream->crypto[valid_count].master_key)-1 );
+ sep=strchr(stream->crypto[valid_count].master_key,'|');
+ if (sep) *sep='\0';
+ stream->crypto[valid_count].algo = cs;
ms_message ( "Found valid crypto line (tag:%d algo:'%s' key:'%s'",
stream->crypto[valid_count].tag,
tmp,
stream->crypto[valid_count].master_key );
valid_count++;
}
- } else {
+ }else{
ms_warning ( "sdp has a strange a= line (%s) nb=%i",belle_sdp_attribute_get_value ( attribute ),nb );
}
}
}
- ms_message ( "Found: %d valid crypto lines", valid_count );
+ ms_message("Found: %d valid crypto lines", valid_count );
}
static void sdp_parse_media_ice_parameters(belle_sdp_media_description_t *media_desc, SalStreamDescription *stream) {
@@ -425,6 +484,92 @@ static void sdp_parse_media_ice_parameters(belle_sdp_media_description_t *media_
}
}
+static void enable_avpf_for_stream(SalStreamDescription *stream) {
+ MSList *pt_it;
+ for (pt_it = stream->payloads; pt_it != NULL; pt_it = pt_it->next) {
+ PayloadType *pt = (PayloadType *)pt_it->data;
+ payload_type_set_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED);
+ }
+}
+
+static void apply_rtcp_fb_attribute_to_payload(belle_sdp_rtcp_fb_attribute_t *fb_attribute, PayloadType *pt) {
+ PayloadTypeAvpfParams avpf_params = payload_type_get_avpf_params(pt);
+ switch (belle_sdp_rtcp_fb_attribute_get_type(fb_attribute)) {
+ case BELLE_SDP_RTCP_FB_NACK:
+ switch (belle_sdp_rtcp_fb_attribute_get_param(fb_attribute)) {
+ case BELLE_SDP_RTCP_FB_NONE:
+ avpf_params.features |= PAYLOAD_TYPE_AVPF_PLI | PAYLOAD_TYPE_AVPF_SLI | PAYLOAD_TYPE_AVPF_RPSI;
+ break;
+ case BELLE_SDP_RTCP_FB_PLI:
+ avpf_params.features |= PAYLOAD_TYPE_AVPF_PLI;
+ break;
+ case BELLE_SDP_RTCP_FB_SLI:
+ avpf_params.features |= PAYLOAD_TYPE_AVPF_SLI;
+ break;
+ case BELLE_SDP_RTCP_FB_RPSI:
+ avpf_params.features |= PAYLOAD_TYPE_AVPF_RPSI;
+ break;
+ default:
+ break;
+ }
+ break;
+ case BELLE_SDP_RTCP_FB_TRR_INT:
+ avpf_params.trr_interval = belle_sdp_rtcp_fb_attribute_get_trr_int(fb_attribute);
+ break;
+ case BELLE_SDP_RTCP_FB_CCM:
+ switch (belle_sdp_rtcp_fb_attribute_get_param(fb_attribute)) {
+ case BELLE_SDP_RTCP_FB_FIR:
+ avpf_params.features |= PAYLOAD_TYPE_AVPF_FIR;
+ break;
+ default:
+ break;
+ }
+ break;
+ case BELLE_SDP_RTCP_FB_ACK:
+ default:
+ break;
+ }
+ payload_type_set_avpf_params(pt, avpf_params);
+}
+
+static void sdp_parse_rtcp_fb_parameters(belle_sdp_media_description_t *media_desc, SalStreamDescription *stream) {
+ belle_sip_list_t *it;
+ belle_sdp_attribute_t *attribute;
+ belle_sdp_rtcp_fb_attribute_t *fb_attribute;
+ MSList *pt_it;
+ PayloadType *pt;
+ int8_t pt_num;
+
+ /* Handle rtcp-fb attributes that concern all payload types. */
+ for (it = belle_sdp_media_description_get_attributes(media_desc); it != NULL; it = it->next) {
+ attribute = BELLE_SDP_ATTRIBUTE(it->data);
+ if (keywordcmp("rtcp-fb", belle_sdp_attribute_get_name(attribute)) == 0) {
+ fb_attribute = BELLE_SDP_RTCP_FB_ATTRIBUTE(attribute);
+ if (belle_sdp_rtcp_fb_attribute_get_id(fb_attribute) == -1) {
+ for (pt_it = stream->payloads; pt_it != NULL; pt_it = pt_it->next) {
+ pt = (PayloadType *)pt_it->data;
+ apply_rtcp_fb_attribute_to_payload(fb_attribute, pt);
+ }
+ }
+ }
+ }
+
+ /* Handle rtcp-fb attributes that are specefic to a payload type. */
+ for (it = belle_sdp_media_description_get_attributes(media_desc); it != NULL; it = it->next) {
+ attribute = BELLE_SDP_ATTRIBUTE(it->data);
+ if (keywordcmp("rtcp-fb", belle_sdp_attribute_get_name(attribute)) == 0) {
+ fb_attribute = BELLE_SDP_RTCP_FB_ATTRIBUTE(attribute);
+ pt_num = belle_sdp_rtcp_fb_attribute_get_id(fb_attribute);
+ for (pt_it = stream->payloads; pt_it != NULL; pt_it = pt_it->next) {
+ pt = (PayloadType *)pt_it->data;
+ if (payload_type_get_number(pt) == (int)pt_num) {
+ apply_rtcp_fb_attribute_to_payload(fb_attribute, pt);
+ }
+ }
+ }
+ }
+}
+
static void sal_init_rtcp_xr_description(OrtpRtcpXrConfiguration *config) {
config->enabled = FALSE;
config->rcvr_rtt_mode = OrtpRtcpXrRcvrRttNone;
@@ -450,7 +595,7 @@ static void sdp_parse_rtcp_xr_parameters(const belle_sdp_attribute_t *attribute,
}
config->stat_summary_enabled = (belle_sdp_rtcp_xr_attribute_has_stat_summary(xr_attr) != 0);
if (config->stat_summary_enabled) {
- belle_sip_list_t *stat_summary_flag_it;
+ const belle_sip_list_t *stat_summary_flag_it;
for (stat_summary_flag_it = belle_sdp_rtcp_xr_attribute_get_stat_summary_flags(xr_attr); stat_summary_flag_it != NULL; stat_summary_flag_it = stat_summary_flag_it->next ) {
const char *flag = (const char *)stat_summary_flag_it->data;
if (flag != NULL) {
@@ -485,7 +630,7 @@ static SalStreamDescription * sdp_to_stream_description(SalMediaDescription *md,
const char* value;
const char *mtype,*proto;
- stream=&md->streams[md->n_total_streams];
+ stream=&md->streams[md->nb_streams];
media=belle_sdp_media_description_get_media ( media_desc );
memset ( stream,0,sizeof ( *stream ) );
@@ -493,11 +638,15 @@ static SalStreamDescription * sdp_to_stream_description(SalMediaDescription *md,
proto = belle_sdp_media_get_protocol ( media );
stream->proto=SalProtoOther;
if ( proto ) {
- if ( strcasecmp ( proto,"RTP/AVP" ) ==0 )
- stream->proto=SalProtoRtpAvp;
- else if ( strcasecmp ( proto,"RTP/SAVP" ) ==0 ) {
- stream->proto=SalProtoRtpSavp;
- }else{
+ if (strcasecmp(proto, "RTP/AVP") == 0) {
+ stream->proto = SalProtoRtpAvp;
+ } else if (strcasecmp(proto, "RTP/SAVP") == 0) {
+ stream->proto = SalProtoRtpSavp;
+ } else if (strcasecmp(proto, "RTP/AVPF") == 0) {
+ stream->proto = SalProtoRtpAvpf;
+ } else if (strcasecmp(proto, "RTP/SAVPF") == 0) {
+ stream->proto = SalProtoRtpSavpf;
+ } else {
strncpy(stream->proto_other,proto,sizeof(stream->proto_other)-1);
}
}
@@ -507,9 +656,6 @@ static SalStreamDescription * sdp_to_stream_description(SalMediaDescription *md,
stream->rtp_port=belle_sdp_media_get_media_port ( media );
- if ( stream->rtp_port > 0 )
- md->n_active_streams++;
-
mtype = belle_sdp_media_get_media_type ( media );
if ( strcasecmp ( "audio", mtype ) == 0 ) {
stream->type=SalAudio;
@@ -556,18 +702,24 @@ static SalStreamDescription * sdp_to_stream_description(SalMediaDescription *md,
}
/* Read crypto lines if any */
- if ( stream->proto == SalProtoRtpSavp ) {
+ if ((stream->proto == SalProtoRtpSavpf) || (stream->proto == SalProtoRtpSavp)) {
sdp_parse_media_crypto_parameters(media_desc, stream);
}
/* Get ICE candidate attributes if any */
sdp_parse_media_ice_parameters(media_desc, stream);
+ /* Get RTCP-FB attributes if any */
+ if ((stream->proto == SalProtoRtpAvpf) || (stream->proto == SalProtoRtpSavpf)) {
+ enable_avpf_for_stream(stream);
+ sdp_parse_rtcp_fb_parameters(media_desc, stream);
+ }
+
/* Get RTCP-XR attributes if any */
stream->rtcp_xr = md->rtcp_xr; // Use session parameters if no stream parameters are defined
sdp_parse_media_rtcp_xr_parameters(media_desc, &stream->rtcp_xr);
- md->n_total_streams++;
+ md->nb_streams++;
return stream;
}
@@ -579,8 +731,7 @@ int sdp_to_media_description ( belle_sdp_session_description_t *session_desc, S
belle_sdp_session_name_t *sname;
const char* value;
- desc->n_active_streams = 0;
- desc->n_total_streams = 0;
+ desc->nb_streams = 0;
desc->dir = SalStreamSendRecv;
if ( ( cnx=belle_sdp_session_description_get_connection ( session_desc ) ) && belle_sdp_connection_get_address ( cnx ) ) {
@@ -621,8 +772,8 @@ int sdp_to_media_description ( belle_sdp_session_description_t *session_desc, S
for ( media_desc_it=belle_sdp_session_description_get_media_descriptions ( session_desc )
; media_desc_it!=NULL
; media_desc_it=media_desc_it->next ) {
- if (desc->n_total_streams==SAL_MEDIA_DESCRIPTION_MAX_STREAMS){
- ms_warning("Cannot convert mline at position [%i] from SDP to SalMediaDescription",desc->n_total_streams);
+ if (desc->nb_streams==SAL_MEDIA_DESCRIPTION_MAX_STREAMS){
+ ms_warning("Cannot convert mline at position [%i] from SDP to SalMediaDescription",desc->nb_streams);
break;
}
media_desc=BELLE_SDP_MEDIA_DESCRIPTION ( media_desc_it->data );
diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c
index 94d7f17d2..c64a5d7e3 100644
--- a/coreapi/callbacks.c
+++ b/coreapi/callbacks.c
@@ -47,7 +47,8 @@ void linphone_core_update_streams_destinations(LinphoneCore *lc, LinphoneCall *c
char *rtp_addr, *rtcp_addr;
int i;
- for (i = 0; i < new_md->n_active_streams; i++) {
+ for (i = 0; i < new_md->nb_streams; i++) {
+ if (!sal_stream_description_active(&new_md->streams[i])) continue;
if (new_md->streams[i].type == SalAudio) {
new_audiodesc = &new_md->streams[i];
} else if (new_md->streams[i].type == SalVideo) {
@@ -72,6 +73,32 @@ void linphone_core_update_streams_destinations(LinphoneCore *lc, LinphoneCall *c
#endif
}
+static void _clear_early_media_destinations(LinphoneCall *call, MediaStream *ms){
+ RtpSession *session=ms->sessions.rtp_session;
+ rtp_session_clear_aux_remote_addr(session);
+ if (!call->ice_session) rtp_session_set_symmetric_rtp(session,TRUE);/*restore symmetric rtp if ICE is not used*/
+}
+
+static void clear_early_media_destinations(LinphoneCall *call){
+ if (call->audiostream){
+ _clear_early_media_destinations(call,(MediaStream*)call->audiostream);
+ }
+ if (call->videostream){
+ _clear_early_media_destinations(call,(MediaStream*)call->videostream);
+ }
+}
+
+static void prepare_early_media_forking(LinphoneCall *call){
+ /*we need to disable symmetric rtp otherwise our outgoing streams will be switching permanently between the multiple destinations*/
+ if (call->audiostream){
+ rtp_session_set_symmetric_rtp(call->audiostream->ms.sessions.rtp_session,FALSE);
+ }
+ if (call->videostream){
+ rtp_session_set_symmetric_rtp(call->videostream->ms.sessions.rtp_session,FALSE);
+ }
+
+}
+
void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMediaDescription *new_md){
SalMediaDescription *oldmd=call->resultdesc;
bool_t all_muted=FALSE;
@@ -82,7 +109,7 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia
ms_error("linphone_core_update_streams() called with null media description");
return;
}
- if (call->biggestdesc==NULL || new_md->n_total_streams>call->biggestdesc->n_total_streams){
+ if (call->biggestdesc==NULL || new_md->nb_streams>call->biggestdesc->nb_streams){
/*we have been offered and now are ready to proceed, or we added a new stream*/
/*store the media description to remember the mapping of calls*/
if (call->biggestdesc){
@@ -98,6 +125,7 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia
call->expect_media_in_ack=FALSE;
call->resultdesc=new_md;
if ((call->audiostream && call->audiostream->ms.state==MSStreamStarted) || (call->videostream && call->videostream->ms.state==MSStreamStarted)){
+ clear_early_media_destinations(call);
/* we already started media: check if we really need to restart it*/
if (oldmd){
int md_changed = media_parameters_changed(call, oldmd, new_md);
@@ -146,6 +174,9 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia
if ((call->state==LinphoneCallIncomingEarlyMedia || call->state==LinphoneCallOutgoingEarlyMedia) && !call->params.real_early_media){
all_muted=TRUE;
}
+ if (call->params.real_early_media && call->state==LinphoneCallOutgoingEarlyMedia){
+ prepare_early_media_forking(call);
+ }
linphone_call_start_media_streams(call,all_muted,send_ringbacktone);
if (call->state==LinphoneCallPausing && call->paused_by_app && ms_list_size(lc->calls)==1){
linphone_core_play_named_tone(lc,LinphoneToneCallOnHold);
@@ -189,6 +220,7 @@ static bool_t already_a_call_pending(LinphoneCore *lc){
for(elem=lc->calls;elem!=NULL;elem=elem->next){
LinphoneCall *call=(LinphoneCall*)elem->data;
if (call->state==LinphoneCallIncomingReceived
+ || call->state==LinphoneCallIncomingEarlyMedia
|| call->state==LinphoneCallOutgoingInit
|| call->state==LinphoneCallOutgoingProgress
|| call->state==LinphoneCallOutgoingEarlyMedia
@@ -276,6 +308,39 @@ static void call_received(SalOp *h){
linphone_core_notify_incoming_call(lc,call);
}
+static void try_early_media_forking(LinphoneCall *call, SalMediaDescription *md){
+ SalMediaDescription *cur_md=call->resultdesc;
+ int i;
+ SalStreamDescription *ref_stream,*new_stream;
+ ms_message("Early media response received from another branch, checking if media can be forked to this new destination.");
+
+ for (i=0;inb_streams;++i){
+ if (!sal_stream_description_active(&cur_md->streams[i])) continue;
+ ref_stream=&cur_md->streams[i];
+ new_stream=&md->streams[i];
+ if (ref_stream->type==new_stream->type && ref_stream->payloads && new_stream->payloads){
+ PayloadType *refpt, *newpt;
+ refpt=(PayloadType*)ref_stream->payloads->data;
+ newpt=(PayloadType*)new_stream->payloads->data;
+ if (strcmp(refpt->mime_type,newpt->mime_type)==0 && refpt->clock_rate==newpt->clock_rate
+ && payload_type_get_number(refpt)==payload_type_get_number(newpt)){
+ MediaStream *ms=NULL;
+ if (ref_stream->type==SalAudio){
+ ms=(MediaStream*)call->audiostream;
+ }else if (ref_stream->type==SalVideo){
+ ms=(MediaStream*)call->videostream;
+ }
+ if (ms){
+ RtpSession *session=ms->sessions.rtp_session;
+ const char *rtp_addr=new_stream->rtp_addr[0]!='\0' ? new_stream->rtp_addr : md->addr;
+ const char *rtcp_addr=new_stream->rtcp_addr[0]!='\0' ? new_stream->rtcp_addr : md->addr;
+ rtp_session_add_aux_remote_addr_full(session,rtp_addr,new_stream->rtp_port,rtcp_addr,new_stream->rtcp_port);
+ }
+ }
+ }
+ }
+}
+
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);
@@ -309,7 +374,7 @@ static void call_ringing(SalOp *h){
/*accept early media */
if (call->audiostream && audio_stream_started(call->audiostream)){
/*streams already started */
- ms_message("Early media already started.");
+ try_early_media_forking(call,md);
return;
}
if (lc->vtable.show) lc->vtable.show(lc);
@@ -460,6 +525,8 @@ static void call_accept_update(LinphoneCore *lc, LinphoneCall *call){
}
static void call_resumed(LinphoneCore *lc, LinphoneCall *call){
+ /*when we are resumed, increment session id, because sdp is changed (a=recvonly disapears)*/
+ linphone_call_increment_local_media_description(call);
call_accept_update(lc,call);
if(lc->vtable.display_status)
lc->vtable.display_status(lc,_("We have been resumed."));
@@ -467,6 +534,8 @@ static void call_resumed(LinphoneCore *lc, LinphoneCall *call){
}
static void call_paused_by_remote(LinphoneCore *lc, LinphoneCall *call){
+ /*when we are resumed, increment session id, because sdp is changed (a=recvonly appears)*/
+ linphone_call_increment_local_media_description(call);
call_accept_update(lc,call);
/* we are being paused */
if(lc->vtable.display_status)
@@ -666,24 +735,33 @@ static void call_failure(SalOp *op){
break;
case SalReasonUnsupportedContent: /*params.media_encryption == LinphoneMediaEncryptionSRTP &&
- !linphone_core_is_media_encryption_mandatory(lc)) {
+ ms_message("Outgoing call [%p] failed with SRTP and/or AVPF enabled", call);
+ if ((call->state == LinphoneCallOutgoingInit)
+ || (call->state == LinphoneCallOutgoingProgress)
+ || (call->state == LinphoneCallOutgoingRinging) /* Push notification case */
+ || (call->state == LinphoneCallOutgoingEarlyMedia)) {
int i;
- ms_message("Outgoing call [%p] failed with SRTP (SAVP) enabled",call);
- if (call->state==LinphoneCallOutgoingInit
- || call->state==LinphoneCallOutgoingProgress
- || call->state==LinphoneCallOutgoingRinging /*push case*/
- || call->state==LinphoneCallOutgoingEarlyMedia){
- ms_message("Retrying call [%p] with AVP",call);
- /* clear SRTP local params */
- call->params.media_encryption = LinphoneMediaEncryptionNone;
- for(i=0; ilocaldesc->n_active_streams; i++) {
- call->localdesc->streams[i].proto = SalProtoRtpAvp;
- memset(call->localdesc->streams[i].crypto, 0, sizeof(call->localdesc->streams[i].crypto));
+ for (i = 0; i < call->localdesc->nb_streams; i++) {
+ if (!sal_stream_description_active(&call->localdesc->streams[i])) continue;
+ if (call->params.media_encryption == LinphoneMediaEncryptionSRTP) {
+ if (call->params.avpf_enabled == TRUE) {
+ if (i == 0) ms_message("Retrying call [%p] with SAVP", call);
+ call->params.avpf_enabled = FALSE;
+ linphone_core_restart_invite(lc, call);
+ return;
+ } else if (!linphone_core_is_media_encryption_mandatory(lc)) {
+ if (i == 0) ms_message("Retrying call [%p] with AVP", call);
+ call->params.media_encryption = LinphoneMediaEncryptionNone;
+ memset(call->localdesc->streams[i].crypto, 0, sizeof(call->localdesc->streams[i].crypto));
+ linphone_core_restart_invite(lc, call);
+ return;
+ }
+ } else if (call->params.avpf_enabled == TRUE) {
+ if (i == 0) ms_message("Retrying call [%p] with AVP", call);
+ call->params.avpf_enabled = FALSE;
+ linphone_core_restart_invite(lc, call);
+ return;
}
- linphone_core_restart_invite(lc, call);
- return;
}
}
msg=_("Incompatible media parameters.");
@@ -740,7 +818,11 @@ static void call_released(SalOp *op){
LinphoneCall *call=(LinphoneCall*)sal_op_get_user_pointer(op);
if (call!=NULL){
linphone_call_set_state(call,LinphoneCallReleased,"Call released");
- }else ms_error("call_released() for already destroyed call ?");
+ }else{
+ /*we can arrive here when the core manages call at Sal level without creating a LinphoneCall object. Typicially:
+ * - when declining an incoming call with busy because maximum number of calls is reached.
+ */
+ }
}
static void auth_failure(SalOp *op, SalAuthInfo* info) {
diff --git a/coreapi/chat.c b/coreapi/chat.c
index fb2a34159..7617f0e55 100644
--- a/coreapi/chat.c
+++ b/coreapi/chat.c
@@ -25,13 +25,152 @@
#include "linphonecore.h"
#include "private.h"
#include "lpconfig.h"
+#include "belle-sip/belle-sip.h"
+#include
#include
#define COMPOSING_DEFAULT_IDLE_TIMEOUT 15
#define COMPOSING_DEFAULT_REFRESH_TIMEOUT 60
#define COMPOSING_DEFAULT_REMOTE_REFRESH_TIMEOUT 120
+
+static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatMessage* msg);
+#define MULTIPART_BOUNDARY "---------------------------14737809831466499882746641449"
+#define FILEPART_HEADER_1 "Content-Disposition: form-data; name=\"File\"; filename=\""
+#define FILEPART_HEADER_2 "\"\r\n" \
+ "Content-Type: "
+#define FILEPART_HEADER_3 "\r\n\r\n"
+const char *multipart_boundary=MULTIPART_BOUNDARY;
+
+static size_t linphone_chat_message_compute_filepart_header_size(const char *filename, const char *content_type) {
+ return strlen(FILEPART_HEADER_1)+strlen(filename)+strlen(FILEPART_HEADER_2)+strlen(content_type)+strlen(FILEPART_HEADER_3);
+}
+static void process_io_error(void *data, const belle_sip_io_error_event_t *event){
+ LinphoneChatMessage* msg=(LinphoneChatMessage *)data;
+ msg->cb(msg, LinphoneChatMessageStateNotDelivered, msg->chat_room->lc);
+}
+static void process_auth_requested(void *data, belle_sip_auth_event_t *event){
+ printf("We have a auth requested!\n");
+}
+
+/**
+ * Callback called during upload or download of a file from server
+ * It is just forwarding the call and some parameters to the vtable defined callback
+ */
+static void linphone_chat_message_file_transfer_on_progress(belle_sip_body_handler_t *bh, belle_sip_message_t *msg, void *data, size_t offset, size_t total){
+ LinphoneChatMessage* chatMsg=(LinphoneChatMessage *)data;
+ LinphoneCore *lc = chatMsg->chat_room->lc;
+ /* call back given by application level */
+ if (lc->vtable.file_transfer_progress_indication != NULL) {
+ lc->vtable.file_transfer_progress_indication(lc, chatMsg, chatMsg->file_transfer_information, (size_t)(((double)offset/(double)total)*100.0));
+ }
+ return;
+}
+
+/**
+ * Callback called when posting a file to server (following rcs5.1 recommendation)
+ *
+ * @param bh the body handler
+ * @param msg the belle sip message
+ * @param data the user data associated to the handler, contains the linphoneChatMessage we're working on
+ * @param offset current position in the input buffer
+ * @param buffer the ouput buffer we to copy the data to be uploaded
+ * @param size size in byte of the data requested, as output it will contain the effective copied size
+ *
+ */
+static int linphone_chat_message_file_transfer_on_send_body(belle_sip_user_body_handler_t *bh, belle_sip_message_t *msg, void *data, size_t offset, uint8_t *buffer, size_t *size){
+ LinphoneChatMessage* chatMsg=(LinphoneChatMessage *)data;
+ LinphoneCore *lc = chatMsg->chat_room->lc;
+ char *buf = (char *)buffer;
+
+ char *content_type=belle_sip_strdup_printf("%s/%s", chatMsg->file_transfer_information->type, chatMsg->file_transfer_information->subtype);
+ size_t end_of_file=linphone_chat_message_compute_filepart_header_size(chatMsg->file_transfer_information->name, content_type)+chatMsg->file_transfer_information->size;
+
+ if (offset==0){
+ int partlen=linphone_chat_message_compute_filepart_header_size(chatMsg->file_transfer_information->name, content_type);
+ memcpy(buf,FILEPART_HEADER_1,strlen(FILEPART_HEADER_1));
+ buf += strlen(FILEPART_HEADER_1);
+ memcpy(buf,chatMsg->file_transfer_information->name,strlen(chatMsg->file_transfer_information->name));
+ buf += strlen(chatMsg->file_transfer_information->name);
+ memcpy(buf,FILEPART_HEADER_2,strlen(FILEPART_HEADER_2));
+ buf += strlen(FILEPART_HEADER_2);
+ memcpy(buf,content_type,strlen(content_type));
+ buf += strlen(content_type);
+ memcpy(buf,FILEPART_HEADER_3,strlen(FILEPART_HEADER_3));
+
+ *size=partlen;
+ }else if (offsetvtable.file_transfer_send(lc, chatMsg, chatMsg->file_transfer_information, buf, size);
+ }
+
+ belle_sip_free(content_type);
+ return BELLE_SIP_CONTINUE;
+}
+
+/**
+ * Callback function called when we have a response from server during a file upload to server (rcs5.1 recommandation)
+ * Note: The first post is empty and the server shall reply a 204 (No content) message, this will trigger a new post request to the server
+ * to upoad the file. The server response to this second post is processed by this same function
+ *
+ * @param data the user define pointer associated with the request, it contains the linphoneChatMessage we're trying to send
+ * @param event the response from server
+ */
+static void linphone_chat_message_process_response_from_post_file(void *data, const belle_http_response_event_t *event){
+ LinphoneChatMessage* msg=(LinphoneChatMessage *)data;
+
+ /* check the answer code */
+ if (event->response){
+ int code=belle_http_response_get_status_code(event->response);
+ if (code == 204) { /* this is the reply to the first post to the server - an empty message */
+ /* start uploading the file */
+ belle_http_request_listener_callbacks_t cbs={0};
+ belle_http_request_listener_t *l;
+ belle_generic_uri_t *uri;
+ belle_http_request_t *req;
+ char *content_type=belle_sip_strdup_printf("%s/%s", msg->file_transfer_information->type, msg->file_transfer_information->subtype);
+
+ /* create a user body handler to take care of the file */
+ belle_sip_user_body_handler_t *first_part_bh=belle_sip_user_body_handler_new(msg->file_transfer_information->size+linphone_chat_message_compute_filepart_header_size(msg->file_transfer_information->name, content_type), NULL, NULL, linphone_chat_message_file_transfer_on_send_body, msg);
+ /* insert it in a multipart body handler which will manage the boundaries of multipart message */
+ belle_sip_multipart_body_handler_t *bh=belle_sip_multipart_body_handler_new(linphone_chat_message_file_transfer_on_progress, msg, (belle_sip_body_handler_t *)first_part_bh);
+
+ char* ua = ms_strdup_printf("%s/%s", linphone_core_get_user_agent_name(), linphone_core_get_user_agent_version());
+
+ belle_sip_free(content_type);
+ content_type=belle_sip_strdup_printf("multipart/form-data; boundary=%s",multipart_boundary);
+
+ uri=belle_generic_uri_parse(msg->chat_room->lc->file_transfer_server);
+
+ req=belle_http_request_create("POST",
+ uri,
+ belle_sip_header_create("User-Agent",ua),
+ belle_sip_header_create("Content-type",content_type),
+ NULL);
+ ms_free(ua);
+ belle_sip_free(content_type);
+ belle_sip_message_set_body_handler(BELLE_SIP_MESSAGE(req),BELLE_SIP_BODY_HANDLER(bh));
+ cbs.process_response=linphone_chat_message_process_response_from_post_file;
+ cbs.process_io_error=process_io_error;
+ cbs.process_auth_requested=process_auth_requested;
+ l=belle_http_request_listener_create_from_callbacks(&cbs,msg);
+ belle_http_provider_send_request(msg->chat_room->lc->http_provider,req,l);
+ }
+ 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);
+ msg->message = ms_strdup(body);
+ linphone_content_uninit(msg->file_transfer_information);
+ ms_free(msg->file_transfer_information);
+ msg->file_transfer_information = NULL;
+ msg->content_type = ms_strdup("application/vnd.gsma.rcs-ft-http+xml");
+ _linphone_chat_room_send_message(msg->chat_room, msg);
+ }
+ }
+
+}
+
+
static void _linphone_chat_message_destroy(LinphoneChatMessage* msg);
BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneChatMessage);
@@ -75,9 +214,9 @@ bool_t linphone_core_chat_enabled(const LinphoneCore *lc){
}
/**
- * Returns an array of chat rooms
+ * Returns an list of chat rooms
* @param lc #LinphoneCore object
- * @return An array of #LinpĥoneChatRoom
+ * @return A list of #LinphoneChatRoom
**/
MSList* linphone_core_get_chat_rooms(LinphoneCore *lc) {
return lc->chatrooms;
@@ -177,6 +316,30 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM
char* content_type;
const char *identity=NULL;
time_t t=time(NULL);
+ linphone_chat_message_ref(msg);
+ /* Check if we shall upload a file to a server */
+ if (msg->file_transfer_information != NULL) {
+ /* open a transaction with the server and send an empty request(RCS5.1 section 3.5.4.8.3.1) */
+ belle_http_request_listener_callbacks_t cbs={0};
+ belle_http_request_listener_t *l;
+ belle_generic_uri_t *uri;
+ belle_http_request_t *req;
+
+ uri=belle_generic_uri_parse(cr->lc->file_transfer_server);
+
+ req=belle_http_request_create("POST",
+ uri,
+ NULL,
+ NULL,
+ NULL);
+ cbs.process_response=linphone_chat_message_process_response_from_post_file;
+ cbs.process_io_error=process_io_error;
+ cbs.process_auth_requested=process_auth_requested;
+ l=belle_http_request_listener_create_from_callbacks(&cbs,msg); /* give msg to listener to be able to start the actual file upload when server answer a 204 No content */
+ belle_http_provider_send_request(cr->lc->http_provider,req,l);
+ linphone_chat_message_unref(msg);
+ return;
+ }
if (lp_config_get_int(cr->lc->config,"sip","chat_use_call_dialogs",0)){
if((call = linphone_core_get_call_by_remote_address(cr->lc,cr->peer))!=NULL){
@@ -207,7 +370,11 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM
sal_message_send(op,identity,cr->peer,content_type, NULL);
ms_free(content_type);
} else {
- sal_text_send(op, identity, cr->peer,msg->message);
+ if (msg->content_type == NULL) {
+ sal_text_send(op, identity, cr->peer,msg->message);
+ } else {
+ sal_message_send(op, identity, cr->peer, msg->content_type, msg->message);
+ }
}
msg->dir=LinphoneChatMessageOutgoing;
msg->from=linphone_address_new(identity);
@@ -221,6 +388,7 @@ static void _linphone_chat_room_send_message(LinphoneChatRoom *cr, LinphoneChatM
}
linphone_chat_room_delete_composing_idle_timer(cr);
linphone_chat_room_delete_composing_refresh_timer(cr);
+ linphone_chat_message_unref(msg);
}
/**
@@ -247,7 +415,7 @@ void linphone_chat_room_message_received(LinphoneChatRoom *cr, LinphoneCore *lc,
/**
* Retrieve an existing chat room whose peer is the supplied address, if exists.
* @param lc the linphone core
- * @param add a linphone address.
+ * @param addr a linphone address.
* @returns the matching chatroom, or NULL if no such chatroom exists.
**/
LinphoneChatRoom *linphone_core_get_chat_room(LinphoneCore *lc, const LinphoneAddress *addr){
@@ -280,7 +448,68 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag
/* create a new chat room */
cr=linphone_core_create_chat_room(lc,cleanfrom);
}
- msg = linphone_chat_room_create_message(cr, sal_msg->text);
+ if (sal_msg->content_type != NULL) { /* content_type field is, for now, used only for rcs file transfer bu twe shall strcmp it with "application/vnd.gsma.rcs-ft-http+xml" */
+ xmlChar *file_url = NULL;
+ xmlDocPtr xmlMessageBody;
+ xmlNodePtr cur;
+
+ msg = linphone_chat_room_create_message(cr, NULL); /* create a message with empty body */
+ msg->content_type = ms_strdup(sal_msg->content_type); /* add the content_type "application/vnd.gsma.rcs-ft-http+xml" */
+ msg->file_transfer_information = (LinphoneContent *)malloc(sizeof(LinphoneContent));
+ memset(msg->file_transfer_information, 0, sizeof(*(msg->file_transfer_information)));
+
+ /* parse the message body to get all informations from it */
+ xmlMessageBody = xmlParseDoc((const xmlChar *)sal_msg->text);
+
+ 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 */
+ cur = cur->xmlChildrenNode; /* now loop on the content of the file-info node */
+ while (cur!=NULL) {
+ if (!xmlStrcmp(cur->name, (const xmlChar *)"file-size")) {
+ xmlChar *fileSizeString = xmlNodeListGetString(xmlMessageBody, cur->xmlChildrenNode, 1);
+ msg->file_transfer_information->size = strtol((const char*)fileSizeString, NULL, 10);
+ xmlFree(fileSizeString);
+ }
+
+ if (!xmlStrcmp(cur->name, (const xmlChar *)"file-name")) {
+ msg->file_transfer_information->name = (char *)xmlNodeListGetString(xmlMessageBody, cur->xmlChildrenNode, 1);
+ }
+ if (!xmlStrcmp(cur->name, (const xmlChar *)"content-type")) {
+ xmlChar *contentType = xmlNodeListGetString(xmlMessageBody, cur->xmlChildrenNode, 1);
+ int contentTypeIndex = 0;
+ while (contentType[contentTypeIndex]!='/' && contentType[contentTypeIndex]!='\0') {
+ contentTypeIndex++;
+ }
+ msg->file_transfer_information->type = ms_strndup((char *)contentType, contentTypeIndex);
+ msg->file_transfer_information->subtype = ms_strdup(((char *)contentType+contentTypeIndex+1));
+ xmlFree(contentType);
+ }
+ if (!xmlStrcmp(cur->name, (const xmlChar *)"data")) {
+ file_url = xmlGetProp(cur, (const xmlChar *)"url");
+ }
+
+ cur=cur->next;
+ }
+ xmlFree(typeAttribute);
+ break;
+ }
+ xmlFree(typeAttribute);
+ }
+ cur = cur->next;
+ }
+ }
+ xmlFreeDoc(xmlMessageBody);
+
+ linphone_chat_message_set_external_body_url(msg, (const char *)file_url);
+ xmlFree(file_url);
+ } else { /* message is not rcs file transfer, create it with provided sal_msg->text as ->message */
+ msg = linphone_chat_room_create_message(cr, sal_msg->text);
+ }
linphone_chat_message_set_from(msg, cr->peer_url);
{
@@ -299,6 +528,7 @@ void linphone_core_message_received(LinphoneCore *lc, SalOp *op, const SalMessag
if (sal_msg->url) {
linphone_chat_message_set_external_body_url(msg, sal_msg->url);
}
+
linphone_address_destroy(addr);
msg->storage_id=linphone_chat_message_store(msg);
linphone_chat_room_message_received(cr,lc,msg);
@@ -387,11 +617,19 @@ bool_t linphone_chat_room_is_remote_composing(const LinphoneChatRoom *cr) {
/**
* Returns back pointer to LinphoneCore object.
+ * @deprecated use linphone_chat_room_get_core()
**/
LinphoneCore* linphone_chat_room_get_lc(LinphoneChatRoom *cr){
return cr->lc;
}
+/**
+ * Returns back pointer to LinphoneCore object.
+**/
+LinphoneCore* linphone_chat_room_get_core(LinphoneChatRoom *cr){
+ return cr->lc;
+}
+
/**
* Assign a user pointer to the chat room.
**/
@@ -426,6 +664,8 @@ LinphoneChatMessage* linphone_chat_room_create_message(LinphoneChatRoom *cr, con
msg->chat_room=(LinphoneChatRoom*)cr;
msg->message=message?ms_strdup(message):NULL;
msg->is_read=TRUE;
+ msg->content_type = NULL; /* this property is used only when transfering file */
+ msg->file_transfer_information = NULL; /* this property is used only when transfering file */
return msg;
}
@@ -452,6 +692,8 @@ LinphoneChatMessage* linphone_chat_room_create_message_2(
msg->time=time;
msg->state=state;
msg->is_read=is_read;
+ msg->content_type = NULL; /* this property is used only when transfering file */
+ msg->file_transfer_information = NULL; /* this property is used only when transfering file */
if (is_incoming) {
msg->dir=LinphoneChatMessageIncoming;
linphone_chat_message_set_from(msg, linphone_chat_room_get_peer_address(cr));
@@ -668,6 +910,120 @@ void linphone_chat_message_set_external_body_url(LinphoneChatMessage* message,co
message->external_body_url=url?ms_strdup(url):NULL;
}
+
+/**
+ * Linphone message has an app-specific field that can store a text. The application might want
+ * to use it for keeping data over restarts, like thumbnail image path.
+ * @param message #LinphoneChatMessage
+ * @return the application-specific data or NULL if none has been stored.
+ */
+const char* linphone_chat_message_get_appdata(const LinphoneChatMessage* message){
+ return message->appdata;
+}
+
+/**
+ * Linphone message has an app-specific field that can store a text. The application might want
+ * to use it for keeping data over restarts, like thumbnail image path.
+ *
+ * Invoking this function will attempt to update the message storage to reflect the changeif it is
+ * enabled.
+ *
+ * @param message #LinphoneChatMessage
+ * @param data the data to store into the message
+ */
+void linphone_chat_message_set_appdata(LinphoneChatMessage* message, const char* data){
+ if( message->appdata ){
+ ms_free(message->appdata);
+ }
+ message->appdata = data? ms_strdup(data) : NULL;
+ linphone_chat_message_store_appdata(message);
+}
+
+
+/**
+ * Get the file_transfer_information (used by call backs to recover informations during a rcs file transfer)
+ *
+ * @param message #LinphoneChatMessage
+ * @return a pointer to the LinphoneContent structure or NULL if not present.
+ */
+const LinphoneContent *linphone_chat_message_get_file_transfer_information(const LinphoneChatMessage*message) {
+ return message->file_transfer_information;
+}
+
+static void on_recv_body(belle_sip_user_body_handler_t *bh, belle_sip_message_t *msg, void *data, size_t offset, const uint8_t *buffer, size_t size){
+ //printf("Receive %ld bytes\n\n%s\n\n", size, (char *)buffer);
+ LinphoneChatMessage* chatMsg=(LinphoneChatMessage *)data;
+ LinphoneCore *lc = chatMsg->chat_room->lc;
+ /* call back given by application level */
+ if (lc->vtable.file_transfer_received != NULL) {
+ lc->vtable.file_transfer_received(lc, chatMsg, chatMsg->file_transfer_information, (char *)buffer, size);
+ }
+ return;
+
+ /* feed the callback with the received data */
+
+
+}
+
+static void linphone_chat_process_response_headers_from_get_file(void *data, const belle_http_response_event_t *event){
+ if (event->response){
+ /*we are receiving a response, set a specific body handler to acquire the response.
+ * if not done, belle-sip will create a memory body handler, the default*/
+ LinphoneChatMessage *message=(LinphoneChatMessage *)belle_sip_object_data_get(BELLE_SIP_OBJECT(event->request),"message");
+ belle_sip_message_set_body_handler(
+ (belle_sip_message_t*)event->response,
+ (belle_sip_body_handler_t*)belle_sip_user_body_handler_new(message->file_transfer_information->size, linphone_chat_message_file_transfer_on_progress,on_recv_body,NULL,message)
+ );
+ }
+}
+
+static void linphone_chat_process_response_from_get_file(void *data, const belle_http_response_event_t *event){
+ //LinphoneChatMessage* msg=(LinphoneChatMessage *)data;
+
+ /* check the answer code */
+ if (event->response){
+ int code=belle_http_response_get_status_code(event->response);
+ if (code==200) {
+ LinphoneChatMessage* chatMsg=(LinphoneChatMessage *)data;
+ LinphoneCore *lc = chatMsg->chat_room->lc;
+ /* file downloaded succesfully, call again the callback with size at zero */
+ if (lc->vtable.file_transfer_received != NULL) {
+ lc->vtable.file_transfer_received(lc, chatMsg, chatMsg->file_transfer_information, NULL, 0);
+ }
+ }
+ }
+}
+
+/**
+ * Start the download of the file from remote server
+ *
+ * @param message #LinphoneChatMessage
+ */
+void linphone_chat_message_start_file_download(const LinphoneChatMessage *message) {
+ belle_http_request_listener_callbacks_t cbs={0};
+ belle_http_request_listener_t *l;
+ belle_generic_uri_t *uri;
+ belle_http_request_t *req;
+ 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());
+
+ uri=belle_generic_uri_parse(url);
+
+ req=belle_http_request_create("GET",
+ uri,
+ belle_sip_header_create("User-Agent",ua),
+ NULL);
+
+ ms_free(ua);
+
+ cbs.process_response_headers=linphone_chat_process_response_headers_from_get_file;
+ cbs.process_response=linphone_chat_process_response_from_get_file;
+ cbs.process_io_error=process_io_error;
+ cbs.process_auth_requested=process_auth_requested;
+ l=belle_http_request_listener_create_from_callbacks(&cbs, (void *)message);
+ belle_sip_object_data_set(BELLE_SIP_OBJECT(req),"message",(void *)message,NULL);
+ belle_http_provider_send_request(message->chat_room->lc->http_provider,req,l);
+}
/**
* Set origin of the message
*@param message #LinphoneChatMessage obj
@@ -805,6 +1161,7 @@ LinphoneChatMessage* linphone_chat_message_clone(const LinphoneChatMessage* msg)
};*/
LinphoneChatMessage* new_message = linphone_chat_room_create_message(msg->chat_room,msg->message);
if (msg->external_body_url) new_message->external_body_url=ms_strdup(msg->external_body_url);
+ if (msg->appdata) new_message->appdata = ms_strdup(msg->appdata);
new_message->cb=msg->cb;
new_message->cb_ud=msg->cb_ud;
new_message->message_userdata=msg->message_userdata;
@@ -831,9 +1188,15 @@ static void _linphone_chat_message_destroy(LinphoneChatMessage* msg) {
if (msg->op) sal_op_release(msg->op);
if (msg->message) ms_free(msg->message);
if (msg->external_body_url) ms_free(msg->external_body_url);
+ if (msg->appdata) ms_free(msg->appdata);
if (msg->from) linphone_address_destroy(msg->from);
if (msg->to) linphone_address_destroy(msg->to);
if (msg->custom_headers) sal_custom_header_free(msg->custom_headers);
+ if (msg->content_type) ms_free(msg->content_type);
+ if (msg->file_transfer_information) {
+ linphone_content_uninit(msg->file_transfer_information);
+ ms_free(msg->file_transfer_information);
+ }
}
@@ -868,6 +1231,29 @@ LinphoneReason linphone_chat_message_get_reason(LinphoneChatMessage* msg) {
return linphone_error_info_get_reason(linphone_chat_message_get_error_info(msg));
}
+
+
+/**
+ * Create a message attached to a dedicated chat room with a particular content. Use #linphone_chat_room_send_message2 to initiate the transfer
+ * @param cr the chat room.
+ * @param a #LinphoneContent initial content. #LinphoneCoreVTable.file_transfer_send is invoked later to notify file transfer progress and collect next chunk of the message if #LinphoneContent.data is NULL.
+ * @return a new #LinphoneChatMessage
+ */
+
+LinphoneChatMessage* linphone_chat_room_create_file_transfer_message(LinphoneChatRoom *cr, LinphoneContent* initial_content) {
+ LinphoneChatMessage* msg = belle_sip_object_new(LinphoneChatMessage);
+ msg->chat_room=(LinphoneChatRoom*)cr;
+ msg->message = NULL;
+ msg->file_transfer_information = (LinphoneContent *)malloc(sizeof(LinphoneContent));
+ memset(msg->file_transfer_information, 0, sizeof(LinphoneContent));
+ linphone_content_copy(msg->file_transfer_information, initial_content);
+ msg->dir=LinphoneChatMessageOutgoing;
+ linphone_chat_message_set_to(msg, linphone_chat_room_get_peer_address(cr));
+ linphone_chat_message_set_from(msg, linphone_address_new(linphone_core_get_identity(cr->lc)));
+ msg->content_type=NULL; /* this will be set to application/vnd.gsma.rcs-ft-http+xml when we will transfer the xml reply from server to the peers */
+
+ return msg;
+}
/**
* @}
*/
diff --git a/coreapi/conference.c b/coreapi/conference.c
index 9e6dc7730..7bee313dd 100644
--- a/coreapi/conference.c
+++ b/coreapi/conference.c
@@ -200,7 +200,8 @@ int linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call){
params->has_video=FALSE;
if (call->audiostream || call->videostream){
- linphone_call_stop_media_streams (call); /*free the audio & video local resources*/
+ linphone_call_stop_media_streams(call); /*free the audio & video local resources*/
+ linphone_call_init_media_streams(call);
}
if (call==lc->current_call){
lc->current_call=NULL;
diff --git a/coreapi/event.c b/coreapi/event.c
index b1c7b110d..992d058ab 100644
--- a/coreapi/event.c
+++ b/coreapi/event.c
@@ -79,12 +79,15 @@ static LinphoneEvent *linphone_event_new_with_op_base(LinphoneCore *lc, SalOp *o
lev->is_out_of_dialog_op=is_out_of_dialog;
return lev;
}
+
LinphoneEvent *linphone_event_new_with_op(LinphoneCore *lc, SalOp *op, LinphoneSubscriptionDir dir, const char *name) {
return linphone_event_new_with_op_base(lc,op,dir,name,FALSE);
}
+
LinphoneEvent *linphone_event_new_with_out_of_dialog_op(LinphoneCore *lc, SalOp *op, LinphoneSubscriptionDir dir, const char *name) {
return linphone_event_new_with_op_base(lc,op,dir,name,TRUE);
}
+
void linphone_event_set_state(LinphoneEvent *lev, LinphoneSubscriptionState state){
LinphoneCore *lc=lev->lc;
if (lev->subscription_state!=state){
@@ -107,9 +110,22 @@ void linphone_event_set_publish_state(LinphoneEvent *lev, LinphonePublishState s
if (lc->vtable.publish_state_changed){
lc->vtable.publish_state_changed(lev->lc,lev,state);
}
- if (state==LinphonePublishCleared){
- linphone_event_unref(lev);
+ switch(state){
+ case LinphonePublishCleared:
+ linphone_event_unref(lev);
+ break;
+ case LinphonePublishOk:
+ case LinphonePublishError:
+ if (lev->expires==-1)
+ linphone_event_unref(lev);
+ break;
+ case LinphonePublishNone:
+ case LinphonePublishProgress:
+ case LinphonePublishExpiring:
+ /*nothing special to do*/
+ break;
}
+
}
}
diff --git a/coreapi/event.h b/coreapi/event.h
index 2b0e2bf0d..894f3e32a 100644
--- a/coreapi/event.h
+++ b/coreapi/event.h
@@ -37,9 +37,9 @@ typedef struct _LinphoneEvent LinphoneEvent;
* Enum for subscription direction (incoming or outgoing).
**/
enum _LinphoneSubscriptionDir{
- LinphoneSubscriptionIncoming,
- LinphoneSubscriptionOutgoing,
- LinphoneSubscriptionInvalidDir
+ LinphoneSubscriptionIncoming, /**< Incoming subscription. */
+ LinphoneSubscriptionOutgoing, /**< Outgoing subscription. */
+ LinphoneSubscriptionInvalidDir /**< Invalid subscription direction. */
};
/**
@@ -97,12 +97,12 @@ typedef void (*LinphoneCoreNotifyReceivedCb)(LinphoneCore *lc, LinphoneEvent *le
/**
* Callback prototype for notifying the application about changes of subscription states, including arrival of new subscriptions.
-**/
+**/
typedef void (*LinphoneCoreSubscriptionStateChangedCb)(LinphoneCore *lc, LinphoneEvent *lev, LinphoneSubscriptionState state);
/**
* Callback prototype for notifying the application about changes of publish states.
-**/
+**/
typedef void (*LinphoneCorePublishStateChangedCb)(LinphoneCore *lc, LinphoneEvent *lev, LinphonePublishState state);
/**
@@ -125,7 +125,6 @@ LINPHONE_PUBLIC LinphoneEvent *linphone_core_subscribe(LinphoneCore *lc, const L
* @param resource the destination resource
* @param event the event name
* @param expires the whished duration of the subscription
- * @param body an optional body, may be NULL.
* @return a LinphoneEvent holding the context of the created subcription.
**/
LINPHONE_PUBLIC LinphoneEvent *linphone_core_create_subscribe(LinphoneCore *lc, const LinphoneAddress *resource, const char *event, int expires);
@@ -211,7 +210,7 @@ LINPHONE_PUBLIC LinphoneReason linphone_event_get_reason(const LinphoneEvent *le
/**
* Get full details about an error occured.
**/
-const LinphoneErrorInfo *linphone_event_get_error_info(const LinphoneEvent *lev);
+LINPHONE_PUBLIC const LinphoneErrorInfo *linphone_event_get_error_info(const LinphoneEvent *lev);
/**
* Get subscription state. If the event object was not created by a subscription mechanism, #LinphoneSubscriptionNone is returned.
@@ -258,7 +257,7 @@ LINPHONE_PUBLIC const char *linphone_event_get_custom_header(LinphoneEvent *ev,
/**
* Terminate an incoming or outgoing subscription that was previously acccepted, or a previous publication.
* This function does not unref the object. The core will unref() if it does not need this object anymore.
- *
+ *
* For subscribed event, when the subscription is terminated normally or because of an error, the core will unref.
* For published events, no unref is performed. This is because it is allowed to re-publish an expired publish, as well as retry it in case of error.
**/
@@ -270,7 +269,7 @@ LINPHONE_PUBLIC void linphone_event_terminate(LinphoneEvent *lev);
* By default LinphoneEvents created by the core are owned by the core only.
* An application that wishes to retain a reference to it must call linphone_event_ref().
* When this reference is no longer needed, linphone_event_unref() must be called.
- *
+ *
**/
LINPHONE_PUBLIC LinphoneEvent *linphone_event_ref(LinphoneEvent *lev);
diff --git a/coreapi/help/Makefile.am b/coreapi/help/Makefile.am
index 9d3c2475a..84822e51c 100644
--- a/coreapi/help/Makefile.am
+++ b/coreapi/help/Makefile.am
@@ -46,7 +46,7 @@ clean-local:
if ENABLE_TUTORIALS
-noinst_PROGRAMS=helloworld registration buddy_status chatroom notify
+noinst_PROGRAMS=helloworld registration buddy_status chatroom notify filetransfer
helloworld_SOURCES=helloworld.c
LINPHONE_TUTOS=$(helloworld_SOURCES)
@@ -76,6 +76,11 @@ LINPHONE_TUTOS+=$(notify_SOURCES)
notify_LDADD=$(helloworld_LDADD)
+filetransfer_SOURCES=filetransfer.c
+LINPHONE_TUTOS+=$(filetransfer_SOURCES)
+
+filetransfer_LDADD=$(helloworld_LDADD)
+
AM_CFLAGS=\
-I$(top_srcdir)/coreapi \
$(STRICT_OPTIONS) \
diff --git a/coreapi/help/doxygen.dox b/coreapi/help/doxygen.dox
index 656f25e09..8831758d6 100644
--- a/coreapi/help/doxygen.dox
+++ b/coreapi/help/doxygen.dox
@@ -61,7 +61,7 @@
*like \link linphone_proxy_config_set_server_addr() proxy address \endlink , \link linphone_proxy_config_set_identity() user id \endlink, \link linphone_proxy_config_expires() refresh period \endlink, and so on.
*
A created proxy config using linphone_proxy_config_new(), once configured, must be added to #LinphoneCore using function linphone_core_add_proxy_config().
*
It is recommended to set a default \link #LinphoneProxyConfig proxy config \endlink using function linphone_core_set_default_proxy(). Once done, if \link #LinphoneProxyConfig a proxy config \endlink has been configured with attribute \link linphone_proxy_config_enable_register() enable register \endlink , next call to linphone_core_iterate() triggers a SIP register.
- *
Registration status is reported by #LinphoneRegistrationStateCb.
+ *
Registration status is reported by LinphoneCoreRegistrationStateChangedCb.
*
*
This pseudo code demonstrates basic registration operations:
*
\code
@@ -96,7 +96,7 @@
}
\endcode
*
Authentication:
- *
Most of the time, registration requires \ref authentication "authentication" to succed. #LinphoneAuthInfo info must be either added to #LinphoneCore using function linphone_core_add_auth_info() before #LinphoneProxyConfig is added to Linphone core, or on demand from call back #AuthInfoRequested .
+ *
Most of the time, registration requires \ref authentication "authentication" to succeed. #LinphoneAuthInfo info must be either added to #LinphoneCore using function linphone_core_add_auth_info() before #LinphoneProxyConfig is added to Linphone core, or on demand from call back #LinphoneCoreAuthInfoRequestedCb.
*
*
Unregistration:
*
Unregistration or any changes to #LinphoneProxyConfig must be first started by a call to function linphone_proxy_config_edit() and validated by function linphone_proxy_config_done()
@@ -203,7 +203,7 @@ void text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddre
* While initiating the second call, the first one is automatically paused.
* Then, once the second call is established, the application has the possibility to merge the two calls to form a conference where each participant
* (the local participant, the remote destination of the first call, the remote destination of the second call) can talk together.
- * This must be done by adding the two calls to the conference using \link linphone_call_add_to_conference() \endlink
+ * This must be done by adding the two calls to the conference using \link linphone_core_add_to_conference() \endlink
*
* Once merged into a conference the LinphoneCall objects representing the calls that were established remain unchanged, except that
* they are tagged as part of the conference (see \link linphone_call_is_in_conference() \endlink ). The calls in a conference are in the LinphoneCallStreamsRunning state.
@@ -270,7 +270,7 @@ and register a keep-alive handler for periodically refreshing the registration.
}];
\endcode
Incoming call notification while in background mode
-
Assuming application using liblinphone is well configured for multitasking, incoming calls arriving while liblinphone is in background mode will simply wakeup liblinphone thread but not resume GUI. To wakeup GUI, it is recommended to send a Local Notification to the user from the #LinphoneCallStateCb. Here under a speudo code for this operation:
+
Assuming application using liblinphone is well configured for multitasking, incoming calls arriving while liblinphone is in background mode will simply wakeup liblinphone thread but not resume GUI. To wakeup GUI, it is recommended to send a Local Notification to the user from the #LinphoneCoreCallStateChangedCb. Here under a speudo code for this operation:
\code
if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
// Create a new notification
diff --git a/coreapi/help/filetransfer.c b/coreapi/help/filetransfer.c
new file mode 100644
index 000000000..819330f57
--- /dev/null
+++ b/coreapi/help/filetransfer.c
@@ -0,0 +1,217 @@
+
+/*
+linphone
+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.
+*/
+
+/**
+ * @defgroup chatroom_tuto Chat room and messaging
+ * @ingroup tutorials
+ *This program is a _very_ simple usage example of liblinphone,
+ *desmonstrating how to send/receive SIP MESSAGE from a sip uri identity passed from the command line.
+ *
Argument must be like sip:jehan@sip.linphone.org .
+ *
+ *ex chatroom sip:jehan@sip.linphone.org
+ *
+ *@include chatroom.c
+
+ *
+ */
+
+#ifdef IN_LINPHONE
+#include "linphonecore.h"
+#else
+#include "linphone/linphonecore.h"
+#endif
+
+#include
+
+static bool_t running=TRUE;
+
+static void stop(int signum){
+ running=FALSE;
+}
+/**
+ * function invoked to report file transfer progress.
+ * */
+static void file_transfer_progress_indication(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, size_t progress) {
+ const LinphoneAddress* from_address = linphone_chat_message_get_from(message);
+ const LinphoneAddress* to_address = linphone_chat_message_get_to(message);
+ char *address = linphone_chat_message_is_outgoing(message)?linphone_address_as_string(to_address):linphone_address_as_string(from_address);
+ printf(" File transfer [%d%%] %s of type [%s/%s] %s [%s] \n", (int)progress
+ ,(linphone_chat_message_is_outgoing(message)?"sent":"received")
+ , content->type
+ , content->subtype
+ ,(linphone_chat_message_is_outgoing(message)?"to":"from")
+ , address);
+ free(address);
+}
+/**
+ * function invoked when a file transfer is received.
+ **/
+static void file_transfer_received(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, const char* buff, size_t size){
+ FILE* file=NULL;
+ if (!linphone_chat_message_get_user_data(message)) {
+ /*first chunk, creating file*/
+ file = fopen("receive_file.dump","wb");
+ linphone_chat_message_set_user_data(message,(void*)file); /*store fd for next chunks*/
+ } else {
+ /*next chunk*/
+ file = (FILE*)linphone_chat_message_get_user_data(message);
+
+ if (size==0) {
+
+ printf("File transfert completed\n");
+ linphone_chat_room_destroy(linphone_chat_message_get_chat_room(message));
+ linphone_chat_message_destroy(message);
+ fclose(file);
+ running=FALSE;
+ } else { /* store content on a file*/
+ if (fwrite(buff,size,1,file)==-1){
+ ms_warning("file_transfer_received() write failed: %s",strerror(errno));
+ }
+ }
+ }
+}
+
+char big_file [128000];
+/*
+ * function called when the file transfer is initiated. file content should be feed into object LinphoneContent
+ * */
+static void file_transfer_send(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, char* buff, size_t* size){
+ int offset=-1;
+
+ if (!linphone_chat_message_get_user_data(message)) {
+ /*first chunk*/
+ offset=0;
+ } else {
+ /*subsequent chunk*/
+ offset = (int)((long)(linphone_chat_message_get_user_data(message))&0x00000000FFFFFFFF);
+ }
+ *size = MIN(*size,sizeof(big_file)-offset); /*updating content->size with minimun between remaining data and requested size*/
+
+ if (*size==0) {
+ /*end of file*/
+ return;
+ }
+ memcpy(buff,big_file+offset,*size);
+
+ /*store offset for next chunk*/
+ linphone_chat_message_set_user_data(message,(void*)(offset+*size));
+
+}
+
+/*
+ * Call back called when a message is received
+ */
+static void message_received(LinphoneCore *lc, LinphoneChatRoom *cr, LinphoneChatMessage *msg) {
+ const LinphoneContent *file_transfer_info = linphone_chat_message_get_file_transfer_information(msg);
+ printf ("Do you really want to download %s (size %ld)?[Y/n]\nOk, let's go\n", file_transfer_info->name, (long int)file_transfer_info->size);
+
+ linphone_chat_message_start_file_download(msg);
+
+}
+/*
+ * Call back to get delivery status of a message
+ * */
+static void linphone_file_transfer_state_changed(LinphoneChatMessage* msg,LinphoneChatMessageState state,void* ud) {
+ const LinphoneAddress* to_address = linphone_chat_message_get_to(msg);
+ char *to = linphone_address_as_string(to_address);
+ printf("File transfer sent to [%s] delivery status is [%s] \n" , to
+ , linphone_chat_message_state_to_string(state));
+ free(to);
+}
+
+
+LinphoneCore *lc;
+int main(int argc, char *argv[]){
+ LinphoneCoreVTable vtable={0};
+
+ const char* dest_friend=NULL;
+ int i;
+ const char* big_file_content="big file";
+ /*seting dummy file content to something*/
+ for (i=0;ifield=ms_strdup(val); \
}
-static void linphone_content_copy(LinphoneContent *obj, const LinphoneContent *ref){
+void linphone_content_copy(LinphoneContent *obj, const LinphoneContent *ref){
SET_STRING(obj,type,ref->type);
SET_STRING(obj,subtype,ref->subtype);
SET_STRING(obj,encoding,ref->encoding);
+ SET_STRING(obj,name,ref->name);
if (obj->data) {
ms_free(obj->data);
obj->data=NULL;
@@ -63,6 +64,7 @@ void linphone_content_uninit(LinphoneContent * obj){
if (obj->subtype) ms_free(obj->subtype);
if (obj->data) ms_free(obj->data);
if (obj->encoding) ms_free(obj->encoding);
+ if (obj->name) ms_free(obj->name);
}
LinphoneContent *linphone_content_copy_from_sal_body(LinphoneContent *obj, const SalBody *ref){
diff --git a/coreapi/linphone_tunnel.h b/coreapi/linphone_tunnel.h
index cff8fc532..9b33e32f8 100644
--- a/coreapi/linphone_tunnel.h
+++ b/coreapi/linphone_tunnel.h
@@ -22,7 +22,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-
+
#ifndef LINPHONETUNNEL_H
#define LINPHONETUNNEL_H
@@ -86,7 +86,7 @@ LINPHONE_PUBLIC void linphone_tunnel_config_set_port(LinphoneTunnelConfig *tunne
LINPHONE_PUBLIC int linphone_tunnel_config_get_port(const LinphoneTunnelConfig *tunnel);
/**
- * Set the remote port on the tunnel server side used to test udp reachability.
+ * Set the remote port on the tunnel server side used to test udp reachability.
*
* @param tunnel configuration object
* @param remote_udp_mirror_port remote port on the tunnel server side used to test udp reachability, set to -1 to disable the feature
@@ -110,7 +110,7 @@ LINPHONE_PUBLIC void linphone_tunnel_config_set_delay(LinphoneTunnelConfig *tunn
/**
* Get the udp packet round trip delay in ms for a tunnel configuration.
- *
+ *
* @param tunnel configuration object
*/
LINPHONE_PUBLIC int linphone_tunnel_config_get_delay(const LinphoneTunnelConfig *tunnel);
@@ -132,7 +132,7 @@ LINPHONE_PUBLIC void linphone_tunnel_add_server(LinphoneTunnel *tunnel, Linphone
/**
* Remove tunnel server configuration
- *
+ *
* @param tunnel object
* @param tunnel_config object
*/
@@ -208,7 +208,7 @@ LINPHONE_PUBLIC bool_t linphone_tunnel_auto_detect_enabled(LinphoneTunnel *tunne
* @param host Http proxy host.
* @param port http proxy port.
* @param username optional http proxy username if the proxy request authentication. Currently only basic authentication is supported. Use NULL if not needed.
- * @param password optional http proxy password. Use NULL if not needed.
+ * @param passwd optional http proxy password. Use NULL if not needed.
**/
LINPHONE_PUBLIC void linphone_tunnel_set_http_proxy(LinphoneTunnel *tunnel, const char *host, int port, const char* username,const char* passwd);
@@ -218,7 +218,7 @@ LINPHONE_PUBLIC void linphone_tunnel_set_http_proxy(LinphoneTunnel *tunnel, cons
* @param host Http proxy host.
* @param port http proxy port.
* @param username optional http proxy username if the proxy request authentication. Currently only basic authentication is supported. Use NULL if not needed.
- * @param password optional http proxy password. Use NULL if not needed.
+ * @param passwd optional http proxy password. Use NULL if not needed.
**/
LINPHONE_PUBLIC void linphone_tunnel_get_http_proxy(LinphoneTunnel*tunnel,const char **host, int *port, const char **username, const char **passwd);
diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c
index 27ce04a3a..171b44fd8 100644
--- a/coreapi/linphonecall.c
+++ b/coreapi/linphonecall.c
@@ -37,6 +37,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "mediastreamer2/mseventqueue.h"
#include "mediastreamer2/mssndcard.h"
+static void linphone_call_stats_uninit(LinphoneCallStats *stats);
+
#ifdef VIDEO_ENABLED
static MSWebCam *get_nowebcam_device(){
return ms_web_cam_manager_get_cam(ms_web_cam_manager_get(),"StaticImage: Static picture");
@@ -94,27 +96,63 @@ bool_t linphone_call_get_authentication_token_verified(LinphoneCall *call){
return call->auth_token_verified;
}
-static bool_t linphone_call_are_all_streams_encrypted(LinphoneCall *call) {
+static bool_t linphone_call_all_streams_encrypted(const LinphoneCall *call) {
int number_of_encrypted_stream = 0;
int number_of_active_stream = 0;
if (call) {
if (call->audiostream && media_stream_get_state((MediaStream *)call->audiostream) == MSStreamStarted) {
number_of_active_stream++;
- if(media_stream_is_secured((MediaStream *)call->audiostream))
+ if(media_stream_secured((MediaStream *)call->audiostream))
number_of_encrypted_stream++;
}
if (call->videostream && media_stream_get_state((MediaStream *)call->videostream) == MSStreamStarted) {
number_of_active_stream++;
- if (media_stream_is_secured((MediaStream *)call->videostream))
+ if (media_stream_secured((MediaStream *)call->videostream))
number_of_encrypted_stream++;
}
}
return number_of_active_stream>0 && number_of_active_stream==number_of_encrypted_stream;
}
+static bool_t linphone_call_all_streams_avpf_enabled(const LinphoneCall *call) {
+ int nb_active_streams = 0;
+ int nb_avpf_enabled_streams = 0;
+ if (call) {
+ if (call->audiostream && media_stream_get_state((MediaStream *)call->audiostream) == MSStreamStarted) {
+ nb_active_streams++;
+ if (media_stream_avpf_enabled((MediaStream *)call->audiostream))
+ nb_avpf_enabled_streams++;
+ }
+ if (call->videostream && media_stream_get_state((MediaStream *)call->videostream) == MSStreamStarted) {
+ nb_active_streams++;
+ if (media_stream_avpf_enabled((MediaStream *)call->videostream))
+ nb_avpf_enabled_streams++;
+ }
+ }
+ return ((nb_active_streams > 0) && (nb_active_streams == nb_avpf_enabled_streams));
+}
+
+static uint16_t linphone_call_get_avpf_rr_interval(const LinphoneCall *call) {
+ uint16_t rr_interval = 0;
+ uint16_t stream_rr_interval;
+ if (call) {
+ if (call->audiostream && media_stream_get_state((MediaStream *)call->audiostream) == MSStreamStarted) {
+ stream_rr_interval = media_stream_get_avpf_rr_interval((MediaStream *)call->audiostream);
+ if (stream_rr_interval > rr_interval) rr_interval = stream_rr_interval;
+ }
+ if (call->videostream && media_stream_get_state((MediaStream *)call->videostream) == MSStreamStarted) {
+ stream_rr_interval = media_stream_get_avpf_rr_interval((MediaStream *)call->videostream);
+ if (stream_rr_interval > rr_interval) rr_interval = stream_rr_interval;
+ }
+ } else {
+ rr_interval = 5000;
+ }
+ return rr_interval;
+}
+
static void propagate_encryption_changed(LinphoneCall *call){
LinphoneCore *lc=call->core;
- if (!linphone_call_are_all_streams_encrypted(call)) {
+ if (!linphone_call_all_streams_encrypted(call)) {
ms_message("Some streams are not encrypted");
call->current_params.media_encryption=LinphoneMediaEncryptionNone;
if (lc->vtable.call_encryption_changed)
@@ -197,7 +235,6 @@ static MSList *make_codec_list(LinphoneCore *lc, const MSList *codecs, int bandw
if (max_sample_rate) *max_sample_rate=0;
for(it=codecs;it!=NULL;it=it->next){
PayloadType *pt=(PayloadType*)it->data;
- payload_type_unset_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED); /* Disable AVPF for the moment. */
if (pt->flags & PAYLOAD_TYPE_ENABLED){
if (bandwidth_limit>0 && !linphone_core_is_payload_type_usable_for_bandwidth(lc,pt,bandwidth_limit)){
ms_message("Codec %s/%i eliminated because of audio bandwidth constraint of %i kbit/s",
@@ -217,11 +254,12 @@ static MSList *make_codec_list(LinphoneCore *lc, const MSList *codecs, int bandw
static void update_media_description_from_stun(SalMediaDescription *md, const StunCandidate *ac, const StunCandidate *vc){
int i;
- for (i = 0; i < md->n_active_streams; i++) {
+ for (i = 0; i < md->nb_streams; i++) {
+ if (!sal_stream_description_active(&md->streams[i])) continue;
if ((md->streams[i].type == SalAudio) && (ac->port != 0)) {
strcpy(md->streams[0].rtp_addr,ac->addr);
md->streams[0].rtp_port=ac->port;
- if ((ac->addr[0]!='\0' && vc->addr[0]!='\0' && strcmp(ac->addr,vc->addr)==0) || md->n_active_streams==1){
+ if ((ac->addr[0]!='\0' && vc->addr[0]!='\0' && strcmp(ac->addr,vc->addr)==0) || sal_media_description_get_nb_active_streams(md)==1){
strcpy(md->addr,ac->addr);
}
}
@@ -232,35 +270,80 @@ static void update_media_description_from_stun(SalMediaDescription *md, const St
}
}
+static int setup_encryption_key(SalSrtpCryptoAlgo *crypto, MSCryptoSuite suite, unsigned int tag){
+ int keylen=0;
+ crypto->tag=tag;
+ crypto->algo=suite;
+ switch(suite){
+ case MS_AES_128_SHA1_80:
+ case MS_AES_128_SHA1_32:
+ case MS_AES_128_NO_AUTH:
+ case MS_NO_CIPHER_SHA1_80: /*not sure for this one*/
+ keylen=30;
+ break;
+ case MS_AES_256_SHA1_80:
+ case MS_AES_256_SHA1_32:
+ keylen=46;
+ break;
+ case MS_CRYPTO_SUITE_INVALID:
+ break;
+ }
+ if (keylen==0 || !generate_b64_crypto_key(30, crypto->master_key, SAL_SRTP_KEY_SIZE)){
+ ms_error("Could not generate SRTP key.");
+ crypto->algo = 0;
+ return -1;
+ }
+ return 0;
+}
+
static void setup_encryption_keys(LinphoneCall *call, SalMediaDescription *md){
LinphoneCore *lc=call->core;
- int i;
+ int i,j;
SalMediaDescription *old_md=call->localdesc;
bool_t keep_srtp_keys=lp_config_get_int(lc->config,"sip","keep_srtp_keys",1);
- for(i=0; in_active_streams; i++) {
- if (md->streams[i].proto == SalProtoRtpSavp) {
- if (keep_srtp_keys && old_md && old_md->streams[i].proto==SalProtoRtpSavp){
+ for(i=0; inb_streams; i++) {
+ if (!sal_stream_description_active(&md->streams[i])) continue;
+ if (sal_stream_description_has_srtp(&md->streams[i]) == TRUE) {
+ if (keep_srtp_keys && old_md && sal_stream_description_has_srtp(&old_md->streams[i]) == TRUE){
int j;
ms_message("Keeping same crypto keys.");
for(j=0;jstreams[i].crypto[j],&old_md->streams[i].crypto[j],sizeof(SalSrtpCryptoAlgo));
}
}else{
- md->streams[i].crypto[0].tag = 1;
- md->streams[i].crypto[0].algo = MS_AES_128_SHA1_80;
- if (!generate_b64_crypto_key(30, md->streams[i].crypto[0].master_key, SAL_SRTP_KEY_SIZE))
- md->streams[i].crypto[0].algo = 0;
- md->streams[i].crypto[1].tag = 2;
- md->streams[i].crypto[1].algo = MS_AES_128_SHA1_32;
- if (!generate_b64_crypto_key(30, md->streams[i].crypto[1].master_key, SAL_SRTP_KEY_SIZE))
- md->streams[i].crypto[1].algo = 0;
- md->streams[i].crypto[2].algo = 0;
+ const MSCryptoSuite *suites=linphone_core_get_srtp_crypto_suites(lc);
+ for(j=0;suites!=NULL && suites[j]!=MS_CRYPTO_SUITE_INVALID && jstreams[i].crypto[j],suites[j],j+1);
+ }
}
}
}
}
+static void setup_rtcp_fb(LinphoneCall *call, SalMediaDescription *md) {
+ MSList *pt_it;
+ PayloadType *pt;
+ PayloadTypeAvpfParams avpf_params;
+ int i;
+
+ for (i = 0; i < md->nb_streams; i++) {
+ if (!sal_stream_description_active(&md->streams[i])) continue;
+ for (pt_it = md->streams[i].payloads; pt_it != NULL; pt_it = pt_it->next) {
+ pt = (PayloadType *)pt_it->data;
+ if (call->params.avpf_enabled == TRUE) {
+ payload_type_set_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED);
+ avpf_params = payload_type_get_avpf_params(pt);
+ avpf_params.trr_interval = call->params.avpf_rr_interval;
+ } else {
+ payload_type_unset_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED);
+ memset(&avpf_params, 0, sizeof(avpf_params));
+ }
+ payload_type_set_avpf_params(pt, avpf_params);
+ }
+ }
+}
+
static void setup_rtcp_xr(LinphoneCall *call, SalMediaDescription *md) {
LinphoneCore *lc = call->core;
int i;
@@ -280,16 +363,30 @@ static void setup_rtcp_xr(LinphoneCall *call, SalMediaDescription *md) {
}
md->rtcp_xr.voip_metrics_enabled = lp_config_get_int(lc->config, "rtp", "rtcp_xr_voip_metrics_enabled", 0);
}
- for (i = 0; i < md->n_active_streams; i++) {
+ for (i = 0; i < md->nb_streams; i++) {
+ if (!sal_stream_description_active(&md->streams[i])) continue;
memcpy(&md->streams[i].rtcp_xr, &md->rtcp_xr, sizeof(md->streams[i].rtcp_xr));
}
}
+void linphone_call_increment_local_media_description(LinphoneCall *call){
+ SalMediaDescription *md=call->localdesc;
+ md->session_ver++;
+}
+
+static SalMediaProto get_proto_from_call_params(const LinphoneCallParams *params) {
+ if ((params->media_encryption == LinphoneMediaEncryptionSRTP) && params->avpf_enabled) return SalProtoRtpSavpf;
+ if (params->media_encryption == LinphoneMediaEncryptionSRTP) return SalProtoRtpSavp;
+ if (params->avpf_enabled) return SalProtoRtpAvpf;
+ return SalProtoRtpAvp;
+}
+
void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *call){
MSList *l;
PayloadType *pt;
SalMediaDescription *old_md=call->localdesc;
int i;
+ int nb_active_streams = 0;
const char *me;
SalMediaDescription *md=sal_media_description_new();
LinphoneAddress *addr;
@@ -306,7 +403,7 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *
md->session_id=(old_md ? old_md->session_id : (rand() & 0xfff));
md->session_ver=(old_md ? (old_md->session_ver+1) : (rand() & 0xfff));
- md->n_total_streams=(call->biggestdesc ? call->biggestdesc->n_total_streams : 1);
+ md->nb_streams=(call->biggestdesc ? call->biggestdesc->nb_streams : 1);
strncpy(md->addr,local_ip,sizeof(md->addr));
strncpy(md->username,linphone_address_get_username(addr),sizeof(md->username));
@@ -317,14 +414,12 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *
else md->bandwidth=linphone_core_get_download_bandwidth(lc);
/*set audio capabilities */
- md->n_active_streams=1;
strncpy(md->streams[0].rtp_addr,local_ip,sizeof(md->streams[0].rtp_addr));
strncpy(md->streams[0].rtcp_addr,local_ip,sizeof(md->streams[0].rtcp_addr));
strncpy(md->streams[0].name,"Audio",sizeof(md->streams[0].name)-1);
md->streams[0].rtp_port=call->media_ports[0].rtp_port;
md->streams[0].rtcp_port=call->media_ports[0].rtcp_port;
- md->streams[0].proto=(call->params.media_encryption == LinphoneMediaEncryptionSRTP) ?
- SalProtoRtpSavp : SalProtoRtpAvp;
+ md->streams[0].proto=get_proto_from_call_params(&call->params);
md->streams[0].type=SalAudio;
if (call->params.down_ptime)
md->streams[0].ptime=call->params.down_ptime;
@@ -334,22 +429,26 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *
pt=payload_type_clone(rtp_profile_get_payload_from_mime(lc->default_profile,"telephone-event"));
l=ms_list_append(l,pt);
md->streams[0].payloads=l;
+ nb_active_streams++;
if (call->params.has_video){
- md->n_active_streams++;
- strncpy(md->streams[0].name,"Video",sizeof(md->streams[0].name)-1);
+ strncpy(md->streams[1].rtp_addr,local_ip,sizeof(md->streams[1].rtp_addr));
+ strncpy(md->streams[1].rtcp_addr,local_ip,sizeof(md->streams[1].rtcp_addr));
+ strncpy(md->streams[1].name,"Video",sizeof(md->streams[1].name)-1);
md->streams[1].rtp_port=call->media_ports[1].rtp_port;
md->streams[1].rtcp_port=call->media_ports[1].rtcp_port;
md->streams[1].proto=md->streams[0].proto;
md->streams[1].type=SalVideo;
l=make_codec_list(lc,lc->codecs_conf.video_codecs,0,NULL,-1);
md->streams[1].payloads=l;
+ nb_active_streams++;
}
- if (md->n_total_streams < md->n_active_streams)
- md->n_total_streams = md->n_active_streams;
+
+ if (md->nb_streams < nb_active_streams)
+ md->nb_streams = nb_active_streams;
/* Deactivate inactive streams. */
- for (i = md->n_active_streams; i < md->n_total_streams; i++) {
+ for (i = nb_active_streams; i < md->nb_streams; i++) {
md->streams[i].rtp_port = 0;
md->streams[i].rtcp_port = 0;
md->streams[i].proto = call->biggestdesc->streams[i].proto;
@@ -360,6 +459,7 @@ void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *
}
setup_encryption_keys(call,md);
+ setup_rtcp_fb(call, md);
setup_rtcp_xr(call, md);
update_media_description_from_stun(md,&call->ac,&call->vc);
@@ -461,7 +561,7 @@ static void port_config_set(LinphoneCall *call, int stream_index, int min_port,
static void linphone_call_init_common(LinphoneCall *call, LinphoneAddress *from, LinphoneAddress *to){
int min_port, max_port;
-
+ ms_message("New LinphoneCall [%p] initialized (LinphoneCore version: %s)",call,linphone_core_get_version());
call->magic=linphone_call_magic;
call->refcnt=1;
call->state=LinphoneCallIdle;
@@ -579,6 +679,26 @@ static void linphone_call_incoming_select_ip_version(LinphoneCall *call){
}else call->af=AF_INET;
}
+/**
+ * Fix call parameters on incoming call to eg. enable AVPF if the incoming call propose it and it is not enabled locally.
+ */
+void linphone_call_set_compatible_incoming_call_parameters(LinphoneCall *call, const SalMediaDescription *md) {
+ call->params.has_video &= linphone_core_media_description_contains_video_stream(md);
+
+ /* Handle AVPF and SRTP. */
+ call->params.avpf_enabled = sal_media_description_has_avpf(md);
+ if (call->params.avpf_enabled == TRUE) {
+ if (call->dest_proxy != NULL) {
+ call->params.avpf_rr_interval = linphone_proxy_config_get_avpf_rr_interval(call->dest_proxy) * 1000;
+ } else {
+ call->params.avpf_rr_interval = 5000;
+ }
+ }
+ if ((sal_media_description_has_srtp(md) == TRUE) && (media_stream_srtp_supported() == TRUE)) {
+ call->params.media_encryption = LinphoneMediaEncryptionSRTP;
+ }
+}
+
LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *from, LinphoneAddress *to, SalOp *op){
LinphoneCall *call=ms_new0(LinphoneCall,1);
char *from_str;
@@ -613,6 +733,7 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro
linphone_core_get_local_ip(lc,call->af,call->localip);
linphone_call_init_common(call, from, to);
call->log->call_id=ms_strdup(sal_op_get_call_id(op)); /*must be known at that time*/
+ call->dest_proxy = linphone_core_lookup_known_proxy(call->core, to);
linphone_core_init_default_params(lc, &call->params);
/*
@@ -623,11 +744,11 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro
call->current_params.privacy=(LinphonePrivacyMask)sal_op_get_privacy(call->op);
/*set video support */
md=sal_call_get_remote_media_description(op);
- call->params.has_video = !!lc->video_policy.automatically_accept;
+ call->params.has_video = lc->video_policy.automatically_accept;
if (md) {
// It is licit to receive an INVITE without SDP
// In this case WE chose the media parameters according to policy.
- call->params.has_video &= linphone_core_media_description_contains_video_stream(md);
+ linphone_call_set_compatible_incoming_call_parameters(call, md);
}
fpol=linphone_core_get_firewall_policy(call->core);
/*create the ice session now if ICE is required*/
@@ -686,7 +807,8 @@ static void linphone_call_set_terminated(LinphoneCall *call){
linphone_call_delete_upnp_session(call);
linphone_call_delete_ice_session(call);
linphone_core_update_allocated_audio_bandwidth(lc);
-
+ linphone_call_stats_uninit(&call->stats[0]);
+ linphone_call_stats_uninit(&call->stats[1]);
call->owns_call_log=FALSE;
linphone_call_log_completed(call);
@@ -709,6 +831,7 @@ static void linphone_call_set_terminated(LinphoneCall *call){
void linphone_call_fix_call_parameters(LinphoneCall *call){
call->params.has_video=call->current_params.has_video;
+
if (call->params.media_encryption != LinphoneMediaEncryptionZRTP) /*in case of ZRTP call parameter are handle after zrtp negociation*/
call->params.media_encryption=call->current_params.media_encryption;
}
@@ -796,17 +919,10 @@ void linphone_call_set_state(LinphoneCall *call, LinphoneCallState cstate, const
call->media_start_time=time(NULL);
}
- if (cstate == LinphoneCallStreamsRunning) {
- linphone_reporting_update_ip(call);
- }
-
if (lc->vtable.call_state_changed)
lc->vtable.call_state_changed(lc,call,cstate,message);
- if (cstate==LinphoneCallEnd){
- if (call->log->status == LinphoneCallSuccess)
- linphone_reporting_publish(call);
- }
+ linphone_reporting_call_state_updated(call);
if (cstate==LinphoneCallReleased){
if (call->op!=NULL) {
@@ -922,7 +1038,7 @@ const LinphoneCallParams * linphone_call_get_current_params(LinphoneCall *call){
}
#endif
- if (linphone_call_are_all_streams_encrypted(call)) {
+ if (linphone_call_all_streams_encrypted(call)) {
if (linphone_call_get_authentication_token(call)) {
call->current_params.media_encryption=LinphoneMediaEncryptionZRTP;
} else {
@@ -931,14 +1047,16 @@ const LinphoneCallParams * linphone_call_get_current_params(LinphoneCall *call){
} else {
call->current_params.media_encryption=LinphoneMediaEncryptionNone;
}
+ call->current_params.avpf_enabled = linphone_call_all_streams_avpf_enabled(call);
+ if (call->current_params.avpf_enabled == TRUE) {
+ call->current_params.avpf_rr_interval = linphone_call_get_avpf_rr_interval(call);
+ } else {
+ call->current_params.avpf_rr_interval = 0;
+ }
return &call->current_params;
}
-static bool_t is_video_active(const SalStreamDescription *sd){
- return sd->rtp_port!=0 && sd->dir!=SalStreamInactive;
-}
-
/**
* Returns call parameters proposed by remote.
*
@@ -950,19 +1068,20 @@ const LinphoneCallParams * linphone_call_get_remote_params(LinphoneCall *call){
memset(cp,0,sizeof(*cp));
if (call->op){
SalMediaDescription *md=sal_call_get_remote_media_description(call->op);
- if (md){
- SalStreamDescription *asd,*vsd,*secure_asd,*secure_vsd;
+ if (md) {
+ SalStreamDescription *sd;
+ unsigned int i;
+ unsigned int nb_audio_streams = sal_media_description_nb_active_streams_of_type(md, SalAudio);
+ unsigned int nb_video_streams = sal_media_description_nb_active_streams_of_type(md, SalVideo);
- asd=sal_media_description_find_stream(md,SalProtoRtpAvp,SalAudio);
- vsd=sal_media_description_find_stream(md,SalProtoRtpAvp,SalVideo);
- secure_asd=sal_media_description_find_stream(md,SalProtoRtpSavp,SalAudio);
- secure_vsd=sal_media_description_find_stream(md,SalProtoRtpSavp,SalVideo);
- if (secure_vsd){
- cp->has_video=is_video_active(secure_vsd);
- if (secure_asd || asd==NULL)
- cp->media_encryption=LinphoneMediaEncryptionSRTP;
- }else if (vsd){
- cp->has_video=is_video_active(vsd);
+ for (i = 0; i < nb_video_streams; i++) {
+ sd = sal_media_description_get_active_stream_of_type(md, SalVideo, i);
+ if (sal_stream_description_active(sd) == TRUE) cp->has_video = TRUE;
+ if (sal_stream_description_has_srtp(sd) == TRUE) cp->media_encryption = LinphoneMediaEncryptionSRTP;
+ }
+ for (i = 0; i < nb_audio_streams; i++) {
+ sd = sal_media_description_get_active_stream_of_type(md, SalAudio, i);
+ if (sal_stream_description_has_srtp(sd) == TRUE) cp->media_encryption = LinphoneMediaEncryptionSRTP;
}
if (!cp->has_video){
if (md->bandwidth>0 && md->bandwidth<=linphone_core_get_edge_bw(call->core)){
@@ -1217,6 +1336,10 @@ MSVideoSize linphone_call_params_get_received_video_size(const LinphoneCallParam
return cp->recv_vsize;
}
+const char * linphone_call_params_get_rtp_profile(const LinphoneCallParams *cp) {
+ return sal_media_proto_to_string(get_proto_from_call_params(cp));
+}
+
/**
* @ingroup call_control
* Use to know if this call has been configured in low bandwidth mode.
@@ -1281,7 +1404,7 @@ bool_t linphone_call_params_early_media_sending_enabled(const LinphoneCallParams
/**
* Returns true if the call is part of the locally managed conference.
**/
-bool_t linphone_call_params_local_conference_mode(const LinphoneCallParams *cp){
+bool_t linphone_call_params_get_local_conference_mode(const LinphoneCallParams *cp){
return cp->in_conference;
}
@@ -1338,7 +1461,7 @@ void _linphone_call_params_copy(LinphoneCallParams *ncp, const LinphoneCallParam
* Set requested level of privacy for the call.
* \xmlonly javascript \endxmlonly
* @param params the call parameters to be modified
- * @param LinphonePrivacy to configure privacy
+ * @param privacy LinphonePrivacy to configure privacy
* */
void linphone_call_params_set_privacy(LinphoneCallParams *params, LinphonePrivacyMask privacy) {
params->privacy=privacy;
@@ -1408,7 +1531,6 @@ static void rendercb(void *data, const MSPicture *local, const MSPicture *remote
#ifdef VIDEO_ENABLED
static void video_stream_event_cb(void *user_pointer, const MSFilter *f, const unsigned int event_id, const void *args){
LinphoneCall* call = (LinphoneCall*) user_pointer;
- ms_warning("In linphonecall.c: video_stream_event_cb");
switch (event_id) {
case MS_VIDEO_DECODER_DECODING_ERRORS:
ms_warning("Case is MS_VIDEO_DECODER_DECODING_ERRORS");
@@ -1422,6 +1544,11 @@ static void video_stream_event_cb(void *user_pointer, const MSFilter *f, const u
if (call->nextVideoFrameDecoded._func != NULL)
call->nextVideoFrameDecoded._func(call, call->nextVideoFrameDecoded._user_data);
break;
+ case MS_VIDEO_DECODER_SEND_PLI:
+ case MS_VIDEO_DECODER_SEND_SLI:
+ case MS_VIDEO_DECODER_SEND_RPSI:
+ /* Handled internally by mediastreamer2. */
+ break;
default:
ms_warning("Unhandled event %i", event_id);
break;
@@ -1452,7 +1579,7 @@ static void _linphone_call_prepare_ice_for_stream(LinphoneCall *call, int stream
cl=ice_session_check_list(call->ice_session, stream_index);
if (cl == NULL && create_checklist) {
cl=ice_check_list_new();
- ice_session_add_check_list(call->ice_session, cl);
+ ice_session_add_check_list(call->ice_session, cl, stream_index);
ms_message("Created new ICE check list for stream [%i]",stream_index);
}
if (cl){
@@ -1469,7 +1596,7 @@ int linphone_call_prepare_ice(LinphoneCall *call, bool_t incoming_offer){
if ((linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseIce) && (call->ice_session != NULL)){
if (incoming_offer){
remote=sal_call_get_remote_media_description(call->op);
- has_video=linphone_core_media_description_contains_video_stream(remote);
+ has_video=call->params.has_video && linphone_core_media_description_contains_video_stream(remote);
}else has_video=call->params.has_video;
_linphone_call_prepare_ice_for_stream(call,0,TRUE);
@@ -1505,6 +1632,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_new(call->media_ports[0].rtp_port,call->media_ports[0].rtcp_port,call->af==AF_INET6);
+ rtp_session_set_symmetric_rtp(audiostream->ms.sessions.rtp_session,linphone_core_symmetric_rtp_enabled(lc));
}else{
call->audiostream=audio_stream_new_with_sessions(&call->sessions[0]);
}
@@ -1565,6 +1693,7 @@ void linphone_call_init_video_stream(LinphoneCall *call){
if (call->sessions[1].rtp_session==NULL){
call->videostream=video_stream_new(call->media_ports[1].rtp_port,call->media_ports[1].rtcp_port, call->af==AF_INET6);
+ rtp_session_set_symmetric_rtp(call->videostream->ms.sessions.rtp_session,linphone_core_symmetric_rtp_enabled(lc));
}else{
call->videostream=video_stream_new_with_sessions(&call->sessions[1]);
}
@@ -1711,7 +1840,7 @@ static int get_ideal_audio_bw(LinphoneCall *call, const SalMediaDescription *md,
const LinphoneCallParams *params=&call->params;
bool_t will_use_video=linphone_core_media_description_contains_video_stream(md);
bool_t forced=FALSE;
-
+
if (desc->bandwidth>0) remote_bw=desc->bandwidth;
else if (md->bandwidth>0) {
/*case where b=AS is given globally, not per stream*/
@@ -1723,7 +1852,7 @@ static int get_ideal_audio_bw(LinphoneCall *call, const SalMediaDescription *md,
}else upload_bw=total_upload_bw;
upload_bw=get_min_bandwidth(upload_bw,remote_bw);
if (!will_use_video || forced) return upload_bw;
-
+
if (bandwidth_is_greater(upload_bw,512)){
upload_bw=100;
}else if (bandwidth_is_greater(upload_bw,256)){
@@ -1756,13 +1885,14 @@ static RtpProfile *make_profile(LinphoneCall *call, const SalMediaDescription *m
LinphoneCore *lc=call->core;
int up_ptime=0;
const LinphoneCallParams *params=&call->params;
-
+
*used_pt=-1;
+
if (desc->type==SalAudio)
bw=get_ideal_audio_bw(call,md,desc);
else if (desc->type==SalVideo)
bw=get_video_bw(call,md,desc);
-
+
for(elem=desc->payloads;elem!=NULL;elem=elem->next){
PayloadType *pt=(PayloadType*)elem->data;
int number;
@@ -1784,6 +1914,7 @@ static RtpProfile *make_profile(LinphoneCall *call, const SalMediaDescription *m
first=FALSE;
}
if (pt->flags & PAYLOAD_TYPE_BITRATE_OVERRIDE){
+ ms_message("Payload type [%s/%i] has explicit bitrate [%i] kbit/s", pt->mime_type, pt->clock_rate, pt->normal_bitrate/1000);
pt->normal_bitrate=get_min_bandwidth(pt->normal_bitrate,bw*1000);
} else pt->normal_bitrate=bw*1000;
if (desc->ptime>0){
@@ -1835,12 +1966,10 @@ static void configure_rtp_session_for_rtcp_xr(LinphoneCore *lc, LinphoneCall *ca
const SalStreamDescription *localstream;
const SalStreamDescription *remotestream;
- localstream = sal_media_description_find_stream(call->localdesc, SalProtoRtpSavp, type);
- if (!localstream) localstream = sal_media_description_find_stream(call->localdesc, SalProtoRtpAvp, type);
+ localstream = sal_media_description_find_best_stream(call->localdesc, type);
if (!localstream) return;
localconfig = &localstream->rtcp_xr;
- remotestream = sal_media_description_find_stream(sal_call_get_remote_media_description(call->op), SalProtoRtpSavp, type);
- if (!remotestream) remotestream = sal_media_description_find_stream(sal_call_get_remote_media_description(call->op), SalProtoRtpAvp, type);
+ remotestream = sal_media_description_find_best_stream(sal_call_get_remote_media_description(call->op), type);
if (!remotestream) return;
remoteconfig = &remotestream->rtcp_xr;
@@ -1859,15 +1988,6 @@ static void configure_rtp_session_for_rtcp_xr(LinphoneCore *lc, LinphoneCall *ca
session = call->videostream->ms.sessions.rtp_session;
}
rtp_session_configure_rtcp_xr(session, ¤tconfig);
- if (currentconfig.rcvr_rtt_mode != OrtpRtcpXrRcvrRttNone) {
- rtp_session_set_rtcp_xr_rcvr_rtt_interval(session, lp_config_get_int(lc->config, "rtp", "rtcp_xr_rcvr_rtt_interval_duration", 5000));
- }
- if (currentconfig.stat_summary_enabled == TRUE) {
- rtp_session_set_rtcp_xr_stat_summary_interval(session, lp_config_get_int(lc->config, "rtp", "rtcp_xr_stat_summary_interval_duration", 5000));
- }
- if (currentconfig.voip_metrics_enabled == TRUE) {
- rtp_session_set_rtcp_xr_voip_metrics_interval(session, lp_config_get_int(lc->config, "rtp", "rtcp_xr_voip_metrics_interval_duration", 5000));
- }
}
static void linphone_call_start_audio_stream(LinphoneCall *call, const char *cname, bool_t muted, bool_t send_ringbacktone, bool_t use_arc){
@@ -1885,14 +2005,8 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, const char *cna
int crypto_idx;
snprintf(rtcp_tool,sizeof(rtcp_tool)-1,"%s-%s",linphone_core_get_user_agent_name(),linphone_core_get_user_agent_version());
- /* look for savp stream first */
- stream=sal_media_description_find_stream(call->resultdesc,
- SalProtoRtpSavp,SalAudio);
- /* no savp audio stream, use avp */
- if (!stream)
- stream=sal_media_description_find_stream(call->resultdesc,
- SalProtoRtpAvp,SalAudio);
+ stream = sal_media_description_find_best_stream(call->resultdesc, SalAudio);
if (stream && stream->dir!=SalStreamInactive && stream->rtp_port!=0){
playcard=lc->sound_conf.lsd_card ?
lc->sound_conf.lsd_card : lc->sound_conf.play_sndcard;
@@ -1948,8 +2062,8 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, const char *cna
call->current_params.record_file=ms_strdup(call->params.record_file);
}
/* valid local tags are > 0 */
- if (stream->proto == SalProtoRtpSavp) {
- local_st_desc=sal_media_description_find_stream(call->localdesc,SalProtoRtpSavp,SalAudio);
+ if (sal_stream_description_has_srtp(stream) == TRUE) {
+ local_st_desc=sal_media_description_find_stream(call->localdesc,stream->proto,SalAudio);
crypto_idx = find_crypto_index_from_tag(local_st_desc->crypto, stream->crypto_local_tag);
if (crypto_idx >= 0) {
@@ -1960,6 +2074,7 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, const char *cna
}
}
configure_rtp_session_for_rtcp_xr(lc, call, SalAudio);
+ audio_stream_set_rtcp_information(call->audiostream, cname, rtcp_tool);
audio_stream_start_full(
call->audiostream,
call->audio_profile,
@@ -1986,7 +2101,6 @@ static void linphone_call_start_audio_stream(LinphoneCall *call, const char *cna
if (send_ringbacktone){
setup_ring_player(lc,call);
}
- audio_stream_set_rtcp_information(call->audiostream, cname, rtcp_tool);
if (call->params.in_conference){
/*transform the graph to connect it to the conference filter */
@@ -2003,17 +2117,10 @@ static void linphone_call_start_video_stream(LinphoneCall *call, const char *cna
#ifdef VIDEO_ENABLED
LinphoneCore *lc=call->core;
int used_pt=-1;
-
- /* look for savp stream first */
- const SalStreamDescription *vstream=sal_media_description_find_stream(call->resultdesc,
- SalProtoRtpSavp,SalVideo);
char rtcp_tool[128]={0};
- snprintf(rtcp_tool,sizeof(rtcp_tool)-1,"%s-%s",linphone_core_get_user_agent_name(),linphone_core_get_user_agent_version());
+ const SalStreamDescription *vstream;
- /* no savp audio stream, use avp */
- if (!vstream)
- vstream=sal_media_description_find_stream(call->resultdesc,
- SalProtoRtpAvp,SalVideo);
+ snprintf(rtcp_tool,sizeof(rtcp_tool)-1,"%s-%s",linphone_core_get_user_agent_name(),linphone_core_get_user_agent_version());
/* shutdown preview */
if (lc->previewstream!=NULL) {
@@ -2021,6 +2128,7 @@ static void linphone_call_start_video_stream(LinphoneCall *call, const char *cna
lc->previewstream=NULL;
}
+ vstream = sal_media_description_find_best_stream(call->resultdesc, SalVideo);
if (vstream!=NULL && vstream->dir!=SalStreamInactive && vstream->rtp_port!=0) {
const char *rtp_addr=vstream->rtp_addr[0]!='\0' ? vstream->rtp_addr : call->resultdesc->addr;
const char *rtcp_addr=vstream->rtcp_addr[0]!='\0' ? vstream->rtcp_addr : call->resultdesc->addr;
@@ -2071,7 +2179,7 @@ static void linphone_call_start_video_stream(LinphoneCall *call, const char *cna
cam=get_nowebcam_device();
}
if (!is_inactive){
- if (vstream->proto == SalProtoRtpSavp) {
+ if (sal_stream_description_has_srtp(vstream) == TRUE) {
int crypto_idx = find_crypto_index_from_tag(local_st_desc->crypto, vstream->crypto_local_tag);
if (crypto_idx >= 0) {
media_stream_set_srtp_recv_key(&call->videostream->ms,vstream->crypto[0].algo,vstream->crypto[0].master_key);
@@ -2084,12 +2192,13 @@ static void linphone_call_start_video_stream(LinphoneCall *call, const char *cna
video_stream_set_direction (call->videostream, dir);
ms_message("%s lc rotation:%d\n", __FUNCTION__, lc->device_rotation);
video_stream_set_device_rotation(call->videostream, lc->device_rotation);
+ video_stream_set_rtcp_information(call->videostream, cname, rtcp_tool);
+ video_stream_set_freeze_on_error(call->videostream, lp_config_get_int(lc->config, "video", "freeze_on_error", 0));
video_stream_start(call->videostream,
call->video_profile, rtp_addr, vstream->rtp_port,
rtcp_addr,
linphone_core_rtcp_enabled(lc) ? (vstream->rtcp_port ? vstream->rtcp_port : vstream->rtp_port+1) : 0,
used_pt, linphone_core_get_video_jittcomp(lc), cam);
- video_stream_set_rtcp_information(call->videostream, cname,rtcp_tool);
}
}else ms_warning("No video stream accepted.");
}else{
@@ -2104,8 +2213,7 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut
char *cname;
bool_t use_arc=linphone_core_adaptive_rate_control_enabled(lc);
#ifdef VIDEO_ENABLED
- const SalStreamDescription *vstream=sal_media_description_find_stream(call->resultdesc,
- SalProtoRtpAvp,SalVideo);
+ const SalStreamDescription *vstream=sal_media_description_find_best_stream(call->resultdesc,SalVideo);
#endif
call->current_params.audio_codec = NULL;
@@ -2123,11 +2231,15 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut
use_arc=FALSE;
}
#endif
+ ms_message("linphone_call_start_media_streams() call=[%p] local upload_bandwidth=[%i] kbit/s; local download_bandwidth=[%i] kbit/s",
+ call, linphone_core_get_upload_bandwidth(lc),linphone_core_get_download_bandwidth(lc));
+
if (call->audiostream!=NULL) {
linphone_call_start_audio_stream(call,cname,all_inputs_muted,send_ringbacktone,use_arc);
}
call->current_params.has_video=FALSE;
if (call->videostream!=NULL) {
+ if (call->audiostream) audio_stream_link_video(call->audiostream,call->videostream);
linphone_call_start_video_stream(call,cname,all_inputs_muted);
}
@@ -2142,14 +2254,14 @@ void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_mut
params.zid_file=lc->zrtp_secrets_cache;
audio_stream_enable_zrtp(call->audiostream,¶ms);
#if VIDEO_ENABLED
- if (media_stream_is_secured((MediaStream *)call->audiostream) && media_stream_get_state((MediaStream *)call->videostream) == MSStreamStarted) {
+ if (media_stream_secured((MediaStream *)call->audiostream) && media_stream_get_state((MediaStream *)call->videostream) == MSStreamStarted) {
/*audio stream is already encrypted and video stream is active*/
memset(¶ms,0,sizeof(OrtpZrtpParams));
video_stream_enable_zrtp(call->videostream,call->audiostream,¶ms);
}
#endif
}else{
- call->current_params.media_encryption=linphone_call_are_all_streams_encrypted(call) ?
+ call->current_params.media_encryption=linphone_call_all_streams_encrypted(call) ?
LinphoneMediaEncryptionSRTP : LinphoneMediaEncryptionNone;
}
@@ -2192,17 +2304,17 @@ void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescript
SalStreamDescription *new_stream;
const SalStreamDescription *local_st_desc;
- local_st_desc = sal_media_description_find_stream(call->localdesc, SalProtoRtpSavp, SalAudio);
- old_stream = sal_media_description_find_stream(old_md, SalProtoRtpSavp, SalAudio);
- new_stream = sal_media_description_find_stream(new_md, SalProtoRtpSavp, SalAudio);
+ local_st_desc = sal_media_description_find_secure_stream_of_type(call->localdesc, SalAudio);
+ old_stream = sal_media_description_find_secure_stream_of_type(old_md, SalAudio);
+ new_stream = sal_media_description_find_secure_stream_of_type(new_md, SalAudio);
if (call->audiostream && local_st_desc && old_stream && new_stream &&
update_stream_crypto_params(call,local_st_desc,old_stream,new_stream,&call->audiostream->ms)){
}
#ifdef VIDEO_ENABLED
- local_st_desc = sal_media_description_find_stream(call->localdesc, SalProtoRtpSavp, SalVideo);
- old_stream = sal_media_description_find_stream(old_md, SalProtoRtpSavp, SalVideo);
- new_stream = sal_media_description_find_stream(new_md, SalProtoRtpSavp, SalVideo);
+ local_st_desc = sal_media_description_find_secure_stream_of_type(call->localdesc, SalVideo);
+ old_stream = sal_media_description_find_secure_stream_of_type(old_md, SalVideo);
+ new_stream = sal_media_description_find_secure_stream_of_type(new_md, SalVideo);
if (call->videostream && local_st_desc && old_stream && new_stream &&
update_stream_crypto_params(call,local_st_desc,old_stream,new_stream,&call->videostream->ms)){
}
@@ -2248,9 +2360,9 @@ static void linphone_call_log_fill_stats(LinphoneCallLog *log, MediaStream *st){
}
}
-void linphone_call_stop_audio_stream(LinphoneCall *call) {
+static void linphone_call_stop_audio_stream(LinphoneCall *call) {
if (call->audiostream!=NULL) {
- linphone_reporting_update(call, LINPHONE_CALL_STATS_AUDIO);
+ linphone_reporting_update_media_info(call, LINPHONE_CALL_STATS_AUDIO);
media_stream_reclaim_sessions(&call->audiostream->ms,&call->sessions[0]);
rtp_session_unregister_event_queue(call->audiostream->ms.sessions.rtp_session,call->audiostream_app_evq);
ortp_ev_queue_flush(call->audiostream_app_evq);
@@ -2276,10 +2388,10 @@ void linphone_call_stop_audio_stream(LinphoneCall *call) {
}
}
-void linphone_call_stop_video_stream(LinphoneCall *call) {
+static void linphone_call_stop_video_stream(LinphoneCall *call) {
#ifdef VIDEO_ENABLED
if (call->videostream!=NULL){
- linphone_reporting_update(call, LINPHONE_CALL_STATS_VIDEO);
+ linphone_reporting_update_media_info(call, LINPHONE_CALL_STATS_VIDEO);
media_stream_reclaim_sessions(&call->videostream->ms,&call->sessions[1]);
rtp_session_unregister_event_queue(call->videostream->ms.sessions.rtp_session,call->videostream_app_evq);
ortp_ev_queue_flush(call->videostream_app_evq);
@@ -2300,6 +2412,8 @@ static void unset_rtp_profile(LinphoneCall *call, int i){
void linphone_call_stop_media_streams(LinphoneCall *call){
if (call->audiostream || call->videostream) {
+ if (call->audiostream && call->videostream)
+ audio_stream_unlink_video(call->audiostream, call->videostream);
linphone_call_stop_audio_stream(call);
linphone_call_stop_video_stream(call);
@@ -2663,20 +2777,14 @@ static void report_bandwidth(LinphoneCall *call, MediaStream *as, MediaStream *v
}
static void linphone_core_disconnected(LinphoneCore *lc, LinphoneCall *call){
- char temp[256];
+ char temp[256]={0};
char *from=NULL;
- if(call)
- from = linphone_call_get_remote_address_as_string(call);
- if (from)
- {
- snprintf(temp,sizeof(temp),"Remote end %s seems to have disconnected, the call is going to be closed.",from);
- ms_free(from);
- }
- else
- {
- snprintf(temp,sizeof(temp),"Remote end seems to have disconnected, the call is going to be closed.");
- }
- ms_message("On call [%p] %s",call,temp);
+
+ from = linphone_call_get_remote_address_as_string(call);
+ snprintf(temp,sizeof(temp)-1,"Remote end %s seems to have disconnected, the call is going to be closed.",from ? from : "");
+ if (from) ms_free(from);
+
+ ms_message("On call [%p]: %s",call,temp);
if (lc->vtable.display_warning!=NULL)
lc->vtable.display_warning(lc,temp);
linphone_core_terminate_call(lc,call);
@@ -2784,11 +2892,22 @@ void linphone_call_stats_fill(LinphoneCallStats *stats, MediaStream *ms, OrtpEve
}
}
+void linphone_call_stats_uninit(LinphoneCallStats *stats){
+ if (stats->received_rtcp) {
+ freemsg(stats->received_rtcp);
+ stats->received_rtcp=NULL;
+ }
+ if (stats->sent_rtcp){
+ freemsg(stats->sent_rtcp);
+ stats->sent_rtcp=NULL;
+ }
+}
+
void linphone_call_notify_stats_updated(LinphoneCall *call, int stream_index){
LinphoneCallStats *stats=&call->stats[stream_index];
LinphoneCore *lc=call->core;
if (stats->updated){
- linphone_reporting_call_stats_updated(call, stream_index);
+ linphone_reporting_on_rtcp_update(call, stream_index);
if (lc->vtable.call_stats_updated)
lc->vtable.call_stats_updated(lc, call, stats);
stats->updated = 0;
@@ -2918,8 +3037,8 @@ void linphone_call_set_transfer_state(LinphoneCall* call, LinphoneCallState stat
if (state != call->transfer_state) {
LinphoneCore* lc = call->core;
ms_message("Transfer state for call [%p] changed from [%s] to [%s]",call
- ,linphone_call_state_to_string(call->transfer_state)
- ,linphone_call_state_to_string(state));
+ ,linphone_call_state_to_string(call->transfer_state)
+ ,linphone_call_state_to_string(state));
call->transfer_state = state;
if (lc->vtable.transfer_state_changed)
lc->vtable.transfer_state_changed(lc, call, state);
@@ -2990,7 +3109,7 @@ static LinphoneAddress *get_fixed_contact(LinphoneCore *lc, LinphoneCall *call ,
} else {
ctt=linphone_core_get_primary_contact_parsed(lc);
if (ctt!=NULL){
- /*otherwise use supllied localip*/
+ /*otherwise use supplied localip*/
linphone_address_set_domain(ctt,localip);
linphone_address_set_port(ctt,linphone_core_get_sip_port(lc));
ms_message("Contact has been fixed using local ip"/* to %s",ret*/);
diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c
index a77d550ae..7380ebb80 100644
--- a/coreapi/linphonecore.c
+++ b/coreapi/linphonecore.c
@@ -129,8 +129,8 @@ LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneAddress *fro
cl->status=LinphoneCallAborted; /*default status*/
cl->quality=-1;
- cl->reports[LINPHONE_CALL_STATS_AUDIO]=linphone_reporting_new();
- cl->reports[LINPHONE_CALL_STATS_VIDEO]=linphone_reporting_new();
+ cl->reporting.reports[LINPHONE_CALL_STATS_AUDIO]=linphone_reporting_new();
+ cl->reporting.reports[LINPHONE_CALL_STATS_VIDEO]=linphone_reporting_new();
return cl;
}
@@ -394,8 +394,8 @@ void linphone_call_log_destroy(LinphoneCallLog *cl){
if (cl->to!=NULL) linphone_address_destroy(cl->to);
if (cl->refkey!=NULL) ms_free(cl->refkey);
if (cl->call_id) ms_free(cl->call_id);
- if (cl->reports[LINPHONE_CALL_STATS_AUDIO]!=NULL) linphone_reporting_destroy(cl->reports[LINPHONE_CALL_STATS_AUDIO]);
- if (cl->reports[LINPHONE_CALL_STATS_VIDEO]!=NULL) linphone_reporting_destroy(cl->reports[LINPHONE_CALL_STATS_VIDEO]);
+ if (cl->reporting.reports[LINPHONE_CALL_STATS_AUDIO]!=NULL) linphone_reporting_destroy(cl->reporting.reports[LINPHONE_CALL_STATS_AUDIO]);
+ if (cl->reporting.reports[LINPHONE_CALL_STATS_VIDEO]!=NULL) linphone_reporting_destroy(cl->reporting.reports[LINPHONE_CALL_STATS_VIDEO]);
ms_free(cl);
}
@@ -717,7 +717,7 @@ static void sip_config_read(LinphoneCore *lc)
/* get proxies config */
for(i=0;; i++){
- LinphoneProxyConfig *cfg=linphone_proxy_config_new_from_config_file(lc->config,i);
+ LinphoneProxyConfig *cfg=linphone_proxy_config_new_from_config_file(lc,i);
if (cfg!=NULL){
linphone_core_add_proxy_config(lc,cfg);
}else{
@@ -754,6 +754,7 @@ static void sip_config_read(LinphoneCore *lc)
linphone_core_enable_keep_alive(lc, (lc->sip_conf.keepalive_period > 0));
sal_use_one_matching_codec_policy(lc->sal,lp_config_get_int(lc->config,"sip","only_one_codec",0));
sal_use_dates(lc->sal,lp_config_get_int(lc->config,"sip","put_date",0));
+ sal_enable_sip_update_method(lc->sal,lp_config_get_int(lc->config,"sip","sip_update",1));
}
static void rtp_config_read(LinphoneCore *lc)
@@ -1392,6 +1393,8 @@ static void linphone_core_init(LinphoneCore * lc, const LinphoneCoreVTable *vtab
lc->http_verify_policy = belle_tls_verify_policy_new();
belle_http_provider_set_tls_verify_policy(lc->http_provider,lc->http_verify_policy);
+ lc->file_transfer_server = NULL;
+
certificates_config_read(lc);
remote_provisioning_uri = linphone_core_get_provisioning_uri(lc);
@@ -1911,6 +1914,15 @@ void linphone_core_set_user_agent(LinphoneCore *lc, const char *name, const char
apply_user_agent(lc);
#endif
}
+const char *linphone_core_get_user_agent(LinphoneCore *lc){
+#if USE_BELLESIP
+ return sal_get_user_agent(lc->sal);
+#else
+ static char ua_buffer[255] = {0};
+ snprintf(ua_buffer, "%s/%s", _ua_name, _ua_version, 254);
+ return ua_buffer;
+#endif
+}
const char *linphone_core_get_user_agent_name(void){
return _ua_name;
@@ -2036,6 +2048,7 @@ int linphone_core_get_sip_transports(LinphoneCore *lc, LCSipTransports *tr){
* A zero value means that the transport is not activated.
* If LC_SIP_TRANSPORT_RANDOM was passed to linphone_core_set_sip_transports(), the random port choosed by the system is returned.
* @ingroup network_parameters
+ * @param lc the LinphoneCore
* @param tr a LCSipTransports structure.
**/
void linphone_core_get_sip_transports_used(LinphoneCore *lc, LCSipTransports *tr){
@@ -2373,7 +2386,7 @@ void linphone_core_iterate(LinphoneCore *lc){
*
* @ingroup call_control
*
- * A sip address should look like DisplayName .
+ * A sip address should look like DisplayName \ .
* Basically this function performs the following tasks
* - if a phone number is entered, prepend country prefix of the default proxy
* configuration, eventually escape the '+' by 00.
@@ -2557,6 +2570,7 @@ static MSList *make_routes_for_proxy(LinphoneProxyConfig *proxy, const LinphoneA
LinphoneProxyConfig * linphone_core_lookup_known_proxy(LinphoneCore *lc, const LinphoneAddress *uri){
const MSList *elem;
LinphoneProxyConfig *found_cfg=NULL;
+ LinphoneProxyConfig *found_reg_cfg=NULL;
LinphoneProxyConfig *found_noreg_cfg=NULL;
LinphoneProxyConfig *default_cfg=lc->default_proxy;
@@ -2569,21 +2583,25 @@ LinphoneProxyConfig * linphone_core_lookup_known_proxy(LinphoneCore *lc, const L
}
}
- /*otherwise return first registering matching, otherwise first matching */
+ /*otherwise return first registered, then first registering matching, otherwise first matching */
for (elem=linphone_core_get_proxy_config_list(lc);elem!=NULL;elem=elem->next){
LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)elem->data;
const char *domain=linphone_proxy_config_get_domain(cfg);
if (domain!=NULL && strcmp(domain,linphone_address_get_domain(uri))==0){
- if (linphone_proxy_config_register_enabled(cfg)) {
+ if (linphone_proxy_config_get_state(cfg) == LinphoneRegistrationOk ){
found_cfg=cfg;
- goto end;
+ break;
+ } else if (!found_reg_cfg && linphone_proxy_config_register_enabled(cfg)) {
+ found_reg_cfg=cfg;
} else if (!found_noreg_cfg){
found_noreg_cfg=cfg;
}
}
}
end:
- if (!found_cfg && found_noreg_cfg) found_cfg = found_noreg_cfg;
+ if ( !found_cfg && found_reg_cfg) found_cfg = found_reg_cfg;
+ else if( !found_cfg && found_noreg_cfg ) found_cfg = found_noreg_cfg;
+
if (found_cfg && found_cfg!=default_cfg){
ms_debug("Overriding default proxy setting for this call/message/subscribe operation.");
}else if (!found_cfg) found_cfg=default_cfg; /*when no matching proxy config is found, use the default proxy config*/
@@ -2825,6 +2843,7 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const
char *real_url=NULL;
LinphoneCall *call;
bool_t defer = FALSE;
+ LinphoneCallParams *cp = linphone_call_params_copy(params);
linphone_core_preempt_sound_resources(lc);
@@ -2837,20 +2856,24 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const
real_url=linphone_address_as_string(addr);
proxy=linphone_core_lookup_known_proxy(lc,addr);
- if (proxy!=NULL)
+ if (proxy!=NULL) {
from=linphone_proxy_config_get_identity(proxy);
+ cp->avpf_enabled = linphone_proxy_config_avpf_enabled(proxy);
+ cp->avpf_rr_interval = linphone_proxy_config_get_avpf_rr_interval(proxy) * 1000;
+ }
/* if no proxy or no identity defined for this proxy, default to primary contact*/
if (from==NULL) from=linphone_core_get_primary_contact(lc);
parsed_url2=linphone_address_new(from);
- call=linphone_call_new_outgoing(lc,parsed_url2,linphone_address_clone(addr),params,proxy);
+ call=linphone_call_new_outgoing(lc,parsed_url2,linphone_address_clone(addr),cp,proxy);
if(linphone_core_add_call(lc,call)!= 0)
{
ms_warning("we had a problem in adding the call into the invite ... weird");
linphone_call_unref(call);
+ linphone_call_params_destroy(cp);
return NULL;
}
@@ -2895,6 +2918,7 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const
if (defer==FALSE) linphone_core_start_invite(lc,call,NULL);
if (real_url!=NULL) ms_free(real_url);
+ linphone_call_params_destroy(cp);
return call;
}
@@ -2907,7 +2931,7 @@ LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const
*
* It is possible to follow the progress of the transfer provided that transferee sends notification about it.
* In this case, the transfer_state_changed callback of the #LinphoneCoreVTable is invoked to notify of the state of the new call at the other party.
- * The notified states are #LinphoneCallOutgoingInit , #LinphoneCallOutgoingProgress, #LinphoneCallOutgoingRinging and #LinphoneCallOutgoingConnected.
+ * The notified states are #LinphoneCallOutgoingInit , #LinphoneCallOutgoingProgress, #LinphoneCallOutgoingRinging and #LinphoneCallConnected.
**/
int linphone_core_transfer_call(LinphoneCore *lc, LinphoneCall *call, const char *url)
{
@@ -2947,7 +2971,7 @@ int linphone_core_transfer_call(LinphoneCore *lc, LinphoneCall *call, const char
*
* It is possible to follow the progress of the transfer provided that transferee sends notification about it.
* In this case, the transfer_state_changed callback of the #LinphoneCoreVTable is invoked to notify of the state of the new call at the other party.
- * The notified states are #LinphoneCallOutgoingInit , #LinphoneCallOutgoingProgress, #LinphoneCallOutgoingRinging and #LinphoneCallOutgoingConnected.
+ * The notified states are #LinphoneCallOutgoingInit , #LinphoneCallOutgoingProgress, #LinphoneCallOutgoingRinging and #LinphoneCallConnected.
**/
int linphone_core_transfer_call_to_another(LinphoneCore *lc, LinphoneCall *call, LinphoneCall *dest){
int result = sal_call_refer_with_replaces (call->op,dest->op);
@@ -2966,21 +2990,8 @@ bool_t linphone_core_inc_invite_pending(LinphoneCore*lc){
return FALSE;
}
-bool_t linphone_core_media_description_has_srtp(const SalMediaDescription *md){
- int i;
- if (md->n_active_streams==0) return FALSE;
-
- for(i=0;in_active_streams;i++){
- const SalStreamDescription *sd=&md->streams[i];
- if (sd->proto!=SalProtoRtpSavp){
- return FALSE;
- }
- }
- return TRUE;
-}
-
bool_t linphone_core_incompatible_security(LinphoneCore *lc, SalMediaDescription *md){
- return linphone_core_is_media_encryption_mandatory(lc) && linphone_core_get_media_encryption(lc)==LinphoneMediaEncryptionSRTP && !linphone_core_media_description_has_srtp(md);
+ return linphone_core_is_media_encryption_mandatory(lc) && linphone_core_get_media_encryption(lc)==LinphoneMediaEncryptionSRTP && !sal_media_description_has_srtp(md);
}
void linphone_core_notify_incoming_call(LinphoneCore *lc, LinphoneCall *call){
@@ -3150,26 +3161,37 @@ int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call){
**/
int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params){
int err=0;
-#ifdef VIDEO_ENABLED
+#if defined(VIDEO_ENABLED) && defined(BUILD_UPNP)
bool_t has_video = FALSE;
#endif
+
+ switch(call->state){
+ case LinphoneCallIncomingEarlyMedia:
+ case LinphoneCallIncomingReceived:
+ case LinphoneCallStreamsRunning:
+ /*these states are allowed for linphone_core_update_call()*/
+ break;
+ default:
+ ms_error("linphone_core_update_call() is not allowed in [%s] state",linphone_call_state_to_string(call->state));
+ return -1;
+ }
+
if (params!=NULL){
linphone_call_set_state(call,LinphoneCallUpdating,"Updating call");
-#ifdef VIDEO_ENABLED
+#if defined(VIDEO_ENABLED) && defined(BUILD_UPNP)
has_video = call->params.has_video;
// Video removing
if((call->videostream != NULL) && !params->has_video) {
-#ifdef BUILD_UPNP
if(call->upnp_session != NULL) {
if (linphone_core_update_upnp(lc, call)<0) {
/* uPnP port mappings failed, proceed with the call anyway. */
linphone_call_delete_upnp_session(call);
}
}
-#endif //BUILD_UPNP
+
}
-#endif /* VIDEO_ENABLED */
+#endif /* defined(VIDEO_ENABLED) && defined(BUILD_UPNP) */
_linphone_call_params_copy(&call->params,params);
err=linphone_call_prepare_ice(call,FALSE);
@@ -3178,10 +3200,9 @@ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const Linpho
return 0;
}
-#ifdef VIDEO_ENABLED
+#if defined(VIDEO_ENABLED) && defined(BUILD_UPNP)
// Video adding
if (!has_video && call->params.has_video) {
-#ifdef BUILD_UPNP
if(call->upnp_session != NULL) {
ms_message("Defer call update to add uPnP port mappings");
video_stream_prepare_video(call->videostream);
@@ -3192,9 +3213,8 @@ int linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const Linpho
return err;
}
}
-#endif //BUILD_UPNP
}
-#endif //VIDEO_ENABLED
+#endif //defined(VIDEO_ENABLED) && defined(BUILD_UPNP)
err = linphone_core_start_update_call(lc, call);
}else{
#ifdef VIDEO_ENABLED
@@ -3251,7 +3271,6 @@ int linphone_core_start_accept_call_update(LinphoneCore *lc, LinphoneCall *call)
linphone_core_update_streams (lc,call,md);
linphone_call_fix_call_parameters(call);
}
-
if (call->state != LinphoneCallOutgoingEarlyMedia) /*don't change the state in case of outgoing early (SIP UPDATE)*/
linphone_call_set_state(call,LinphoneCallStreamsRunning,"Connected (streams running)");
return 0;
@@ -3422,7 +3441,10 @@ int linphone_core_accept_call_with_params(LinphoneCore *lc, LinphoneCall *call,
_linphone_call_params_copy(&call->params,params);
// There might not be a md if the INVITE was lacking an SDP
// In this case we use the parameters as is.
- if (md) call->params.has_video &= linphone_core_media_description_contains_video_stream(md);
+ if (md) {
+ linphone_call_set_compatible_incoming_call_parameters(call, md);
+ }
+ linphone_call_prepare_ice(call,TRUE);
linphone_call_make_local_media_description(lc,call);
sal_call_set_local_media_description(call->op,call->localdesc);
sal_op_set_sent_custom_header(call->op,params->custom_headers);
@@ -5603,6 +5625,7 @@ void linphone_core_set_rtp_transport_factories(LinphoneCore* lc, LinphoneRtpTran
/**
* Retrieve RTP statistics regarding current call.
+ * @param lc the LinphoneCore
* @param local RTP statistics computed locally.
* @param remote RTP statistics computed by far end (obtained via RTCP feedback).
*
@@ -5664,7 +5687,7 @@ void sip_config_uninit(LinphoneCore *lc)
if (lc->network_reachable) {
for(elem=config->proxies;elem!=NULL;elem=ms_list_next(elem)){
LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)(elem->data);
- linphone_proxy_config_edit(cfg); /* to unregister */
+ _linphone_proxy_config_unregister(cfg); /* to unregister without changing the stored flag enable_register */
}
ms_message("Unregistration started.");
@@ -5738,6 +5761,7 @@ void rtp_config_uninit(LinphoneCore *lc)
lp_config_set_int(lc->config,"rtp","nortp_timeout",config->nortp_timeout);
lp_config_set_int(lc->config,"rtp","audio_adaptive_jitt_comp_enabled",config->audio_adaptive_jitt_comp_enabled);
lp_config_set_int(lc->config,"rtp","video_adaptive_jitt_comp_enabled",config->video_adaptive_jitt_comp_enabled);
+ ms_free(config->srtp_suites);
}
static void sound_config_uninit(LinphoneCore *lc)
@@ -5880,6 +5904,15 @@ static void linphone_core_uninit(LinphoneCore *lc)
}
#endif //BUILD_UPNP
+ if (lc->chatrooms){
+ MSList *cr=ms_list_copy(lc->chatrooms);
+ MSList *elem;
+ for(elem=cr;elem!=NULL;elem=elem->next){
+ linphone_chat_room_destroy((LinphoneChatRoom*)elem->data);
+ }
+ ms_list_free(cr);
+ }
+
if (lp_config_needs_commit(lc->config)) lp_config_sync(lc->config);
lp_config_destroy(lc->config);
lc->config = NULL; /* Mark the config as NULL to block further calls */
@@ -5891,6 +5924,8 @@ static void linphone_core_uninit(LinphoneCore *lc)
lc->last_recv_msg_ids=ms_list_free(lc->last_recv_msg_ids);
// Free struct variable
+ ms_free(lc->file_transfer_server);
+
if(lc->zrtp_secrets_cache != NULL) {
ms_free(lc->zrtp_secrets_cache);
}
@@ -5904,7 +5939,7 @@ static void linphone_core_uninit(LinphoneCore *lc)
linphone_presence_model_unref(lc->presence_model);
}
linphone_core_free_payload_types(lc);
-
+ if (lc->supported_formats) ms_free(lc->supported_formats);
linphone_core_message_storage_close(lc);
ms_exit();
linphone_core_set_state(lc,LinphoneGlobalOff,"Off");
@@ -6428,6 +6463,7 @@ void linphone_core_init_default_params(LinphoneCore*lc, LinphoneCallParams *para
params->media_encryption=linphone_core_get_media_encryption(lc);
params->in_conference=FALSE;
params->privacy=LinphonePrivacyDefault;
+ params->avpf_enabled=FALSE;
}
void linphone_core_set_device_identifier(LinphoneCore *lc,const char* device_id) {
@@ -6536,3 +6572,6 @@ bool_t linphone_core_sdp_200_ack_enabled(const LinphoneCore *lc) {
return lc->sip_conf.sdp_200_ack!=0;
}
+void linphone_core_set_file_transfer_server(LinphoneCore *core, const char * server_url) {
+ core->file_transfer_server=ms_strdup(server_url);
+}
diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h
index fc02cbb23..40f6b8422 100644
--- a/coreapi/linphonecore.h
+++ b/coreapi/linphonecore.h
@@ -120,7 +120,6 @@ typedef enum _LinphoneTransportType LinphoneTransportType;
* return NULL.
*
* @ingroup linphone_address
- * @var LinphoneAddress
*/
typedef struct SalAddress LinphoneAddress;
@@ -133,9 +132,11 @@ typedef struct belle_sip_dict LinphoneDictionary;
struct _LinphoneContent{
char *type; /** a #LinphoneContent with a size equal zero
+ *
+ * @param lc #LinphoneCore object
+ * @param message #LinphoneChatMessage message from which the body is received.
+ * @param content #LinphoneContent outgoing content
+ * @param buff pointer to the buffer where data chunk shall be written by the app
+ * @param size as input value, it represents the number of bytes expected by the framework. As output value, it means the number of bytes wrote by the application in the buffer. 0 means end of file.
+ *
+ */
+typedef void (*LinphoneCoreFileTransferSendCb)(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, char* buff, size_t* size);
+
+/**
+ * File transfer progress indication callback prototype.
+ *
+ * @param lc #LinphoneCore object
+ * @param message #LinphoneChatMessage message from which the body is received.
+ * @param content #LinphoneContent incoming content information
+ * @param progress number of bytes sent/received from the begening of the transfer.
+ *
+ */
+typedef void (*LinphoneCoreFileTransferProgressIndicationCb)(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, size_t progress);
+
/**
* Is composing notification callback prototype.
*
@@ -1314,7 +1454,7 @@ typedef struct _LinphoneCoreVTable{
LinphoneCoreNewSubscriptionRequestedCb new_subscription_requested; /**< Notify about pending presence subscription request */
LinphoneCoreAuthInfoRequestedCb auth_info_requested; /**< Ask the application some authentication information */
LinphoneCoreCallLogUpdatedCb call_log_updated; /**< Notifies that call log list has been updated */
- LinphoneCoreMessageReceivedCb message_received; /** a message is received, can be text or external body*/
+ LinphoneCoreMessageReceivedCb message_received; /**< a message is received, can be text or external body*/
LinphoneCoreIsComposingReceivedCb is_composing_received; /**< An is-composing notification has been received */
LinphoneCoreDtmfReceivedCb dtmf_received; /**< A dtmf has been received received */
LinphoneCoreReferReceivedCb refer_received; /**< An out of call refer was received */
@@ -1333,6 +1473,9 @@ typedef struct _LinphoneCoreVTable{
DisplayUrlCb display_url; /**< @deprecated */
ShowInterfaceCb show; /**< @deprecated Notifies the application that it should show up*/
LinphoneCoreTextMessageReceivedCb text_received; /** @deprecated, use #message_received instead
A text message has been received */
+ LinphoneCoreFileTransferRecvCb file_transfer_received; /** Callback to store file received attached to a #LinphoneChatMessage */
+ LinphoneCoreFileTransferSendCb file_transfer_send; /** Callback to collect file chunk to be sent for a #LinphoneChatMessage */
+ LinphoneCoreFileTransferProgressIndicationCb file_transfer_progress_indication; /**Callback to indicate file transfer progress*/
} LinphoneCoreVTable;
/**
@@ -1401,7 +1544,14 @@ LINPHONE_PUBLIC void linphone_core_enable_logs(FILE *file);
LINPHONE_PUBLIC void linphone_core_enable_logs_with_cb(OrtpLogFunc logfunc);
LINPHONE_PUBLIC void linphone_core_disable_logs(void);
LINPHONE_PUBLIC const char *linphone_core_get_version(void);
+LINPHONE_PUBLIC const char *linphone_core_get_user_agent(LinphoneCore *lc);
+/**
+ * @deprecated Use #linphone_core_get_user_agent instead.
+**/
LINPHONE_PUBLIC const char *linphone_core_get_user_agent_name(void);
+/**
+ * @deprecated Use #linphone_core_get_user_agent instead.
+**/
LINPHONE_PUBLIC const char *linphone_core_get_user_agent_version(void);
LINPHONE_PUBLIC LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable,
@@ -1506,7 +1656,7 @@ LINPHONE_PUBLIC int linphone_core_accept_call_update(LinphoneCore *lc, LinphoneC
/**
* @ingroup media_parameters
* Get default call parameters reflecting current linphone core configuration
- * @param LinphoneCore object
+ * @param lc LinphoneCore object
* @return LinphoneCallParams
*/
LINPHONE_PUBLIC LinphoneCallParams *linphone_core_create_default_call_parameters(LinphoneCore *lc);
@@ -1594,7 +1744,7 @@ LINPHONE_PUBLIC bool_t linphone_core_payload_type_is_vbr(LinphoneCore *lc, const
* @param[in] lc the #LinphoneCore object
* @param[in] pt the #PayloadType to modify.
* @param[in] bitrate the IP bitrate in kbit/s.
- * @ingroup media_parameters
+ * @ingroup media_parameters
**/
LINPHONE_PUBLIC void linphone_core_set_payload_type_bitrate(LinphoneCore *lc, PayloadType *pt, int bitrate);
@@ -1603,7 +1753,7 @@ LINPHONE_PUBLIC void linphone_core_set_payload_type_bitrate(LinphoneCore *lc, Pa
* @param[in] lc the #LinphoneCore object
* @param[in] pt the #PayloadType to modify.
* @return bitrate the IP bitrate in kbit/s, or -1 if an error occured.
- * @ingroup media_parameters
+ * @ingroup media_parameters
**/
LINPHONE_PUBLIC int linphone_core_get_payload_type_bitrate(LinphoneCore *lc, const PayloadType *pt);
@@ -1675,6 +1825,7 @@ LINPHONE_PUBLIC int linphone_core_get_default_proxy(LinphoneCore *lc, LinphonePr
* @param[in] passwd String containing the password of the authentication credentials (optional, either passwd or ha1 must be set)
* @param[in] ha1 String containing a ha1 hash of the password (optional, either passwd or ha1 must be set)
* @param[in] realm String used to discriminate different SIP authentication domains (optional)
+ * @param[in] domain String containing the SIP domain for which this authentication information is valid, if it has to be restricted for a single SIP domain.
* @return #LinphoneAuthInfo with default values set
* @ingroup authentication
*/
@@ -1948,7 +2099,7 @@ LINPHONE_PUBLIC void linphone_core_mute_mic(LinphoneCore *lc, bool_t muted);
/**
* Get mic state.
- * @deprecated Use #linphone_core_is_mic_enabled instead
+ * @deprecated Use #linphone_core_mic_enabled instead
**/
LINPHONE_PUBLIC bool_t linphone_core_is_mic_muted(LinphoneCore *lc);
@@ -2168,7 +2319,7 @@ LINPHONE_PUBLIC int linphone_core_get_camera_sensor_rotation(LinphoneCore *lc);
void linphone_core_show_video(LinphoneCore *lc, bool_t show);
/*play/record support: use files instead of soundcard*/
-void linphone_core_use_files(LinphoneCore *lc, bool_t yesno);
+LINPHONE_PUBLIC void linphone_core_use_files(LinphoneCore *lc, bool_t yesno);
LINPHONE_PUBLIC void linphone_core_set_play_file(LinphoneCore *lc, const char *file);
LINPHONE_PUBLIC void linphone_core_set_record_file(LinphoneCore *lc, const char *file);
@@ -2356,7 +2507,12 @@ LINPHONE_PUBLIC void linphone_core_init_default_params(LinphoneCore*lc, Linphone
*/
LINPHONE_PUBLIC bool_t linphone_core_tunnel_available(void);
+/**
+ * Linphone tunnel object.
+ * @ingroup tunnel
+ */
typedef struct _LinphoneTunnel LinphoneTunnel;
+
/**
* get tunnel instance if available
*/
@@ -2452,6 +2608,22 @@ typedef enum _LinphoneToneID LinphoneToneID;
LINPHONE_PUBLIC void linphone_core_set_call_error_tone(LinphoneCore *lc, LinphoneReason reason, const char *audiofile);
LINPHONE_PUBLIC void linphone_core_set_tone(LinphoneCore *lc, LinphoneToneID id, const char *audiofile);
+
+/**
+ * Globaly set an http file transfer server to be used for content type application/vnd.gsma.rcs-ft-http+xml. This value can also be set for a dedicated account using #linphone_proxy_config_set_file_transfer_server
+ * @param[in] core #LinphoneCore to be modified
+ * @param[in] server_url URL of the file server like https://file.linphone.org/upload.php
+ * */
+LINPHONE_PUBLIC void linphone_core_set_file_transfer_server(LinphoneCore *core, const char * server_url);
+
+/**
+ * Returns a null terminated table of strings containing the file format extension supported for call recording.
+ * @param core the core
+ * @return the supported formats, typically 'wav' and 'mkv'
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char ** linphone_core_get_supported_file_formats(LinphoneCore *core);
+
#ifdef __cplusplus
}
#endif
diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc
index f6478c5fe..3ab985981 100644
--- a/coreapi/linphonecore_jni.cc
+++ b/coreapi/linphonecore_jni.cc
@@ -52,8 +52,8 @@ extern "C" void libmssilk_init();
#ifdef HAVE_G729
extern "C" void libmsbcg729_init();
#endif
-#ifdef HAVE_ISAC
-extern "C" void libmsisac_init();
+#ifdef HAVE_WEBRTC
+extern "C" void libmswebrtc_init();
#endif
#endif /*ANDROID*/
@@ -121,7 +121,13 @@ static void linphone_android_ortp_log_handler(OrtpLogLevel lev, const char *fmt,
}
if (handler_obj){
JNIEnv *env=ms_get_jni_env();
- env->CallVoidMethod(handler_obj,loghandler_id,env->NewStringUTF(LogDomain),(jint)lev,env->NewStringUTF(levname),env->NewStringUTF(str),NULL);
+ jstring jdomain=env->NewStringUTF(LogDomain);
+ jstring jlevname=env->NewStringUTF(levname);
+ jstring jstr=env->NewStringUTF(str);
+ env->CallVoidMethod(handler_obj,loghandler_id,jdomain,(jint)lev,jlevname,jstr,NULL);
+ if (jdomain) env->DeleteLocalRef(jdomain);
+ if (jlevname) env->DeleteLocalRef(jlevname);
+ if (jstr) env->DeleteLocalRef(jstr);
}else
linphone_android_log_handler(prio, str);
}
@@ -781,8 +787,8 @@ extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_newLinphoneCore(JNIEnv*
#ifdef HAVE_G729
libmsbcg729_init();
#endif
-#ifdef HAVE_ISAC
- libmsisac_init();
+#ifdef HAVE_WEBRTC
+ libmswebrtc_init();
#endif
jlong nativePtr = (jlong)linphone_core_new( &ldata->vTable
@@ -2624,6 +2630,15 @@ static void chat_room_impl_callback(LinphoneChatMessage* msg, LinphoneChatMessag
linphone_chat_message_set_user_data(msg,NULL);
}
}
+
+extern "C" jobject Java_org_linphone_core_LinphoneChatRoomImpl_getCore(JNIEnv* env
+ ,jobject thiz
+ ,jlong chatroom_ptr){
+ LinphoneCore *lc=linphone_chat_room_get_core((LinphoneChatRoom*)chatroom_ptr);
+ LinphoneCoreData *lcd=(LinphoneCoreData*)linphone_core_get_user_data(lc);
+ return lcd->core;
+}
+
extern "C" void Java_org_linphone_core_LinphoneChatRoomImpl_sendMessage2(JNIEnv* env
,jobject thiz
,jlong chatroom_ptr
@@ -2774,7 +2789,7 @@ extern "C" jboolean Java_org_linphone_core_LinphoneCallParamsImpl_getVideoEnable
}
extern "C" jboolean Java_org_linphone_core_LinphoneCallParamsImpl_localConferenceMode(JNIEnv *env, jobject thiz, jlong lcp){
- return (jboolean)linphone_call_params_local_conference_mode((LinphoneCallParams*)lcp);
+ return (jboolean)linphone_call_params_get_local_conference_mode((LinphoneCallParams*)lcp);
}
extern "C" jstring Java_org_linphone_core_LinphoneCallParamsImpl_getCustomHeader(JNIEnv *env, jobject thiz, jlong lcp, jstring jheader_name){
@@ -2938,6 +2953,22 @@ extern "C" jint Java_org_linphone_core_LinphoneProxyConfigImpl_getPrivacy(JNIEnv
return linphone_proxy_config_get_privacy((LinphoneProxyConfig *) ptr);
}
+JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_enableAvpf(JNIEnv *env, jobject thiz, jlong ptr, jboolean enable) {
+ linphone_proxy_config_enable_avpf((LinphoneProxyConfig *)ptr, (bool)enable);
+}
+
+JNIEXPORT jboolean JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_avpfEnabled(JNIEnv *env, jobject thiz, jlong ptr) {
+ return linphone_proxy_config_avpf_enabled((LinphoneProxyConfig *)ptr);
+}
+
+JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_setAvpfRRInterval(JNIEnv *env, jobject thiz, jlong ptr, jint interval) {
+ linphone_proxy_config_set_avpf_rr_interval((LinphoneProxyConfig *)ptr, (uint8_t)interval);
+}
+
+JNIEXPORT jint JNICALL Java_org_linphone_core_LinphoneProxyConfigImpl_getAvpfRRInterval(JNIEnv *env, jobject thiz, jlong ptr) {
+ return (jint)linphone_proxy_config_get_avpf_rr_interval((LinphoneProxyConfig *)ptr);
+}
+
extern "C" jint Java_org_linphone_core_LinphoneCallImpl_getDuration(JNIEnv* env,jobject thiz,jlong ptr) {
return (jint)linphone_call_get_duration((LinphoneCall *) ptr);
}
@@ -3647,6 +3678,12 @@ JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneCoreFactoryImpl__1setLogHa
}
}
+JNIEXPORT jobject JNICALL Java_org_linphone_core_LinphoneEventImpl_getCore(JNIEnv *env, jobject jobj, jlong evptr){
+ LinphoneCore *lc=linphone_event_get_core((LinphoneEvent*)evptr);
+ LinphoneCoreData *lcd=(LinphoneCoreData*)linphone_core_get_user_data(lc);
+ return lcd->core;
+}
+
/*
* Class: org_linphone_core_LinphoneEventImpl
* Method: getEventName
diff --git a/coreapi/linphonepresence.h b/coreapi/linphonepresence.h
index 851ccf63e..780ae22b6 100644
--- a/coreapi/linphonepresence.h
+++ b/coreapi/linphonepresence.h
@@ -426,7 +426,7 @@ LINPHONE_PUBLIC int linphone_presence_model_clear_persons(LinphonePresenceModel
*
* The created presence service has the basic status 'closed'.
*/
-LINPHONE_PUBLIC LinphonePresenceService * linphone_presence_service_new(const char *id, LinphonePresenceBasicStatus, const char *contact);
+LINPHONE_PUBLIC LinphonePresenceService * linphone_presence_service_new(const char *id, LinphonePresenceBasicStatus basic_status, const char *contact);
/**
* Gets the id of a presence service.
diff --git a/coreapi/lpconfig.c b/coreapi/lpconfig.c
index 0ac692cde..9dcce9f4d 100644
--- a/coreapi/lpconfig.c
+++ b/coreapi/lpconfig.c
@@ -49,6 +49,7 @@
typedef struct _LpItem{
char *key;
char *value;
+ int is_comment;
} LpItem;
typedef struct _LpSectionParam{
@@ -78,6 +79,13 @@ LpItem * lp_item_new(const char *key, const char *value){
return item;
}
+LpItem * lp_comment_new(const char *comment){
+ LpItem *item=lp_new0(LpItem,1);
+ item->value=ortp_strdup(comment);
+ item->is_comment=TRUE;
+ return item;
+}
+
LpSectionParam *lp_section_param_new(const char *key, const char *value){
LpSectionParam *param = lp_new0(LpSectionParam, 1);
param->key = ortp_strdup(key);
@@ -93,7 +101,7 @@ LpSection *lp_section_new(const char *name){
void lp_item_destroy(void *pitem){
LpItem *item=(LpItem*)pitem;
- ortp_free(item->key);
+ if (item->key) ortp_free(item->key);
ortp_free(item->value);
free(item);
}
@@ -138,6 +146,14 @@ static bool_t is_first_char(const char *start, const char *pos){
return TRUE;
}
+static int is_a_comment(const char *str){
+ while (*str==' '){
+ str++;
+ }
+ if (*str=='#') return 1;
+ return 0;
+}
+
LpSection *lp_config_find_section(const LpConfig *lpconfig, const char *name){
LpSection *sec;
MSList *elem;
@@ -170,7 +186,7 @@ LpItem *lp_section_find_item(const LpSection *sec, const char *name){
/*printf("Looking for item %s\n",name);*/
for (elem=sec->items;elem!=NULL;elem=ms_list_next(elem)){
item=(LpItem*)elem->data;
- if (strcmp(item->key,name)==0) {
+ if (!item->is_comment && strcmp(item->key,name)==0) {
/*printf("Item %s found\n",name);*/
return item;
}
@@ -182,9 +198,10 @@ static LpSection* lp_config_parse_line(LpConfig* lpconfig, const char* line, LpS
LpSectionParam *params = NULL;
char *pos1,*pos2;
int nbs;
- static char secname[MAX_LEN];
- static char key[MAX_LEN];
- static char value[MAX_LEN];
+ int size=strlen(line)+1;
+ char *secname=ms_malloc(size);
+ char *key=ms_malloc(size);
+ char *value=ms_malloc(size);
LpItem *item;
pos1=strchr(line,'[');
@@ -230,43 +247,53 @@ static LpSection* lp_config_parse_line(LpConfig* lpconfig, const char* line, LpS
}
}
}else {
- pos1=strchr(line,'=');
- if (pos1!=NULL){
- key[0]='\0';
+ if (is_a_comment(line)){
+ if (cur){
+ LpItem *comment=lp_comment_new(line);
+ lp_section_add_item(cur,comment);
+ }
+ }else{
+ pos1=strchr(line,'=');
+ if (pos1!=NULL){
+ key[0]='\0';
- *pos1='\0';
- if (sscanf(line,"%s",key)>0){
+ *pos1='\0';
+ if (sscanf(line,"%s",key)>0){
- pos1++;
- pos2=strchr(pos1,'\r');
- if (pos2==NULL)
- pos2=strchr(pos1,'\n');
- if (pos2==NULL) pos2=pos1+strlen(pos1);
- else {
- *pos2='\0'; /*replace the '\n' */
- }
- /* remove ending white spaces */
- for (; pos2>pos1 && pos2[-1]==' ';pos2--) pos2[-1]='\0';
+ pos1++;
+ pos2=strchr(pos1,'\r');
+ if (pos2==NULL)
+ pos2=strchr(pos1,'\n');
+ if (pos2==NULL) pos2=pos1+strlen(pos1);
+ else {
+ *pos2='\0'; /*replace the '\n' */
+ }
+ /* remove ending white spaces */
+ for (; pos2>pos1 && pos2[-1]==' ';pos2--) pos2[-1]='\0';
- if (pos2-pos1>=0){
- /* found a pair key,value */
+ if (pos2-pos1>=0){
+ /* found a pair key,value */
- if (cur!=NULL){
- item=lp_section_find_item(cur,key);
- if (item==NULL){
- lp_section_add_item(cur,lp_item_new(key,pos1));
+ if (cur!=NULL){
+ item=lp_section_find_item(cur,key);
+ if (item==NULL){
+ lp_section_add_item(cur,lp_item_new(key,pos1));
+ }else{
+ ortp_free(item->value);
+ item->value=ortp_strdup(pos1);
+ }
+ /*ms_message("Found %s=%s",key,pos1);*/
}else{
- ortp_free(item->value);
- item->value=ortp_strdup(pos1);
+ ms_warning("found key,item but no sections");
}
- /*ms_message("Found %s=%s",key,pos1);*/
- }else{
- ms_warning("found key,item but no sections");
}
}
}
}
}
+ ms_free(key);
+ ms_free(value);
+ ms_free(secname);
return cur;
}
@@ -425,13 +452,16 @@ bool_t lp_config_get_range(const LpConfig *lpconfig, const char *section, const
}
}
+
int lp_config_get_int(const LpConfig *lpconfig,const char *section, const char *key, int default_value){
const char *str=lp_config_get_string(lpconfig,section,key,NULL);
if (str!=NULL) {
int ret=0;
+
if (strstr(str,"0x")==str){
sscanf(str,"%x",&ret);
- }else ret=atoi(str);
+ }else
+ sscanf(str,"%i",&ret);
return ret;
}
else return default_value;
@@ -510,7 +540,10 @@ void lp_config_set_float(LpConfig *lpconfig,const char *section, const char *key
}
void lp_item_write(LpItem *item, FILE *file){
- fprintf(file,"%s=%s\n",item->key,item->value);
+ if (item->is_comment)
+ fprintf(file,"%s",item->value);
+ else
+ fprintf(file,"%s=%s\n",item->key,item->value);
}
void lp_section_param_write(LpSectionParam *param, FILE *file){
@@ -566,7 +599,8 @@ void lp_config_for_each_entry(const LpConfig *lpconfig, const char *section, voi
if (sec!=NULL){
for (elem=sec->items;elem!=NULL;elem=ms_list_next(elem)){
item=(LpItem*)elem->data;
- callback(item->key, ctx);
+ if (!item->is_comment)
+ callback(item->key, ctx);
}
}
}
diff --git a/coreapi/message_storage.c b/coreapi/message_storage.c
index 434b7e484..7caf4536b 100644
--- a/coreapi/message_storage.c
+++ b/coreapi/message_storage.c
@@ -1,440 +1,502 @@
-/*
-message_storage.c
-Copyright (C) 2012 Belledonne Communications, Grenoble, France
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "private.h"
-#include "linphonecore.h"
-
-#ifdef WIN32
-
-static inline char *my_ctime_r(const time_t *t, char *buf){
- strcpy(buf,ctime(t));
- return buf;
-}
-
-#else
-#define my_ctime_r ctime_r
-#endif
-
-#ifdef MSG_STORAGE_ENABLED
-
-#include "sqlite3.h"
-
-static inline LinphoneChatMessage* get_transient_message(LinphoneChatRoom* cr, unsigned int storage_id){
- MSList* transients = cr->transient_messages;
- LinphoneChatMessage* chat;
- while( transients ){
- chat = (LinphoneChatMessage*)transients->data;
- if(chat->storage_id == storage_id){
- return linphone_chat_message_ref(chat);
- }
- transients = transients->next;
- }
- return NULL;
-}
-
-static void create_chat_message(char **argv, void *data){
- LinphoneChatRoom *cr = (LinphoneChatRoom *)data;
- LinphoneAddress *from;
-
- unsigned int storage_id = atoi(argv[0]);
-
- // check if the message exists in the transient list, in which case we should return that one.
- LinphoneChatMessage* new_message = get_transient_message(cr, storage_id);
- if( new_message == NULL ){
- new_message = linphone_chat_room_create_message(cr, argv[4]);
-
- if(atoi(argv[3])==LinphoneChatMessageIncoming){
- new_message->dir=LinphoneChatMessageIncoming;
- from=linphone_address_new(argv[2]);
- } else {
- new_message->dir=LinphoneChatMessageOutgoing;
- from=linphone_address_new(argv[1]);
- }
- linphone_chat_message_set_from(new_message,from);
- linphone_address_destroy(from);
-
- if( argv[9] != NULL ){
- new_message->time = (time_t)atol(argv[9]);
- } else {
- new_message->time = time(NULL);
- }
-
- new_message->is_read=atoi(argv[6]);
- new_message->state=atoi(argv[7]);
- new_message->storage_id=storage_id;
- new_message->external_body_url=argv[8]?ms_strdup(argv[8]):NULL;
- }
- cr->messages_hist=ms_list_prepend(cr->messages_hist,new_message);
-}
-
-// Called when fetching all conversations from database
-static int callback_all(void *data, int argc, char **argv, char **colName){
- LinphoneCore* lc = (LinphoneCore*) data;
- char* address = argv[0];
- linphone_core_create_chat_room(lc, address);
- return 0;
-}
-
-static int callback(void *data, int argc, char **argv, char **colName){
- create_chat_message(argv,data);
- return 0;
-}
-
-void linphone_sql_request_message(sqlite3 *db,const char *stmt,LinphoneChatRoom *cr){
- char* errmsg=NULL;
- int ret;
- ret=sqlite3_exec(db,stmt,callback,cr,&errmsg);
- if(ret != SQLITE_OK) {
- ms_error("Error in creation: %s.\n", errmsg);
- sqlite3_free(errmsg);
- }
-}
-
-void linphone_sql_request(sqlite3* db,const char *stmt){
- char* errmsg=NULL;
- int ret;
- ret=sqlite3_exec(db,stmt,NULL,NULL,&errmsg);
- if(ret != SQLITE_OK) {
- ms_error("linphone_sql_request: error sqlite3_exec(): %s.\n", errmsg);
- sqlite3_free(errmsg);
- }
-}
-
-// Process the request to fetch all chat contacts
-void linphone_sql_request_all(sqlite3* db,const char *stmt, LinphoneCore* lc){
- char* errmsg=NULL;
- int ret;
- ret=sqlite3_exec(db,stmt,callback_all,lc,&errmsg);
- if(ret != SQLITE_OK) {
- ms_error("linphone_sql_request_all: error sqlite3_exec(): %s.\n", errmsg);
- sqlite3_free(errmsg);
- }
-}
-
-unsigned int linphone_chat_message_store(LinphoneChatMessage *msg){
- LinphoneCore *lc=linphone_chat_room_get_lc(msg->chat_room);
- int id=0;
-
- if (lc->db){
- char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(msg->chat_room));
- char *local_contact=linphone_address_as_string_uri_only(linphone_chat_message_get_local_address(msg));
- char *buf=sqlite3_mprintf("INSERT INTO history VALUES(NULL,%Q,%Q,%i,%Q,%Q,%i,%i,%Q,%i);",
- local_contact,
- peer,
- msg->dir,
- msg->message,
- "-1", /* use UTC field now */
- msg->is_read,
- msg->state,
- msg->external_body_url,
- msg->time);
- linphone_sql_request(lc->db,buf);
- sqlite3_free(buf);
- ms_free(local_contact);
- ms_free(peer);
- id = (unsigned int) sqlite3_last_insert_rowid (lc->db);
- }
- return id;
-}
-
-void linphone_chat_message_store_state(LinphoneChatMessage *msg){
- LinphoneCore *lc=msg->chat_room->lc;
- if (lc->db){
- char *buf=sqlite3_mprintf("UPDATE history SET status=%i WHERE message = %Q AND utc = %i;",
- msg->state,msg->message,msg->time);
- linphone_sql_request(lc->db,buf);
- sqlite3_free(buf);
-
-
- }
-
- if( msg->state == LinphoneChatMessageStateDelivered
- || msg->state == LinphoneChatMessageStateNotDelivered ){
- // message is not transient anymore, we can remove it from our transient list:
- msg->chat_room->transient_messages = ms_list_remove(msg->chat_room->transient_messages, msg);
- linphone_chat_message_unref(msg);
- }
-}
-
-void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr){
- LinphoneCore *lc=linphone_chat_room_get_lc(cr);
- int read=1;
-
- if (lc->db==NULL) return ;
-
- char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));
- char *buf=sqlite3_mprintf("UPDATE history SET read=%i WHERE remoteContact = %Q;",
- read,peer);
- linphone_sql_request(lc->db,buf);
- sqlite3_free(buf);
- ms_free(peer);
-}
-
-void linphone_chat_room_update_url(LinphoneChatRoom *cr, LinphoneChatMessage *msg) {
- LinphoneCore *lc=linphone_chat_room_get_lc(cr);
-
- if (lc->db==NULL) return ;
-
- char *buf=sqlite3_mprintf("UPDATE history SET url=%Q WHERE id=%i;",msg->external_body_url,msg->storage_id);
- linphone_sql_request(lc->db,buf);
- sqlite3_free(buf);
-}
-
-int linphone_chat_room_get_unread_messages_count(LinphoneChatRoom *cr){
- LinphoneCore *lc=linphone_chat_room_get_lc(cr);
- int numrows=0;
-
- if (lc->db==NULL) return 0;
-
- char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));
- char *buf=sqlite3_mprintf("SELECT count(*) FROM history WHERE remoteContact = %Q AND read = 0;",peer);
- sqlite3_stmt *selectStatement;
- int returnValue = sqlite3_prepare_v2(lc->db,buf,-1,&selectStatement,NULL);
- if (returnValue == SQLITE_OK){
- if(sqlite3_step(selectStatement) == SQLITE_ROW){
- numrows= sqlite3_column_int(selectStatement, 0);
- }
- }
- sqlite3_finalize(selectStatement);
- sqlite3_free(buf);
- ms_free(peer);
- return numrows;
-}
-
-void linphone_chat_room_delete_message(LinphoneChatRoom *cr, LinphoneChatMessage *msg) {
- LinphoneCore *lc=cr->lc;
-
- if (lc->db==NULL) return ;
-
- char *buf=sqlite3_mprintf("DELETE FROM history WHERE id = %i;", msg->storage_id);
- linphone_sql_request(lc->db,buf);
- sqlite3_free(buf);
-}
-
-void linphone_chat_room_delete_history(LinphoneChatRoom *cr){
- LinphoneCore *lc=cr->lc;
-
- if (lc->db==NULL) return ;
-
- char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));
- char *buf=sqlite3_mprintf("DELETE FROM history WHERE remoteContact = %Q;",peer);
- linphone_sql_request(lc->db,buf);
- sqlite3_free(buf);
- ms_free(peer);
-}
-
-MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message){
- LinphoneCore *lc=linphone_chat_room_get_lc(cr);
- MSList *ret;
- char *buf;
- char *peer;
-
- if (lc->db==NULL) return NULL;
- peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));
- cr->messages_hist = NULL;
- if (nb_message > 0)
- buf=sqlite3_mprintf("SELECT * FROM history WHERE remoteContact = %Q ORDER BY id DESC LIMIT %i ;",peer,nb_message);
- else
- buf=sqlite3_mprintf("SELECT * FROM history WHERE remoteContact = %Q ORDER BY id DESC;",peer);
- linphone_sql_request_message(lc->db,buf,cr);
- sqlite3_free(buf);
- ret=cr->messages_hist;
- cr->messages_hist=NULL;
- ms_free(peer);
- return ret;
-}
-
-void linphone_close_storage(sqlite3* db){
- sqlite3_close(db);
-}
-
-void linphone_create_table(sqlite3* db){
- char* errmsg=NULL;
- int ret;
- ret=sqlite3_exec(db,"CREATE TABLE IF NOT EXISTS history ("
- "id INTEGER PRIMARY KEY AUTOINCREMENT,"
- "localContact TEXT NOT NULL,"
- "remoteContact TEXT NOT NULL,"
- "direction INTEGER,"
- "message TEXT,"
- "time TEXT NOT NULL,"
- "read INTEGER,"
- "status INTEGER"
- ");",
- 0,0,&errmsg);
- if(ret != SQLITE_OK) {
- ms_error("Error in creation: %s.\n", errmsg);
- sqlite3_free(errmsg);
- }
-}
-
-
-static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
-static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
-static time_t parse_time_from_db( const char* time ){
- /* messages used to be stored in the DB by using string-based time */
- struct tm ret={0};
- char tmp1[80]={0};
- char tmp2[80]={0};
- int i,j;
- time_t parsed = 0;
-
- if( sscanf(time,"%3c %3c%d%d:%d:%d %d",tmp1,tmp2,&ret.tm_mday,
- &ret.tm_hour,&ret.tm_min,&ret.tm_sec,&ret.tm_year) == 7 ){
- ret.tm_year-=1900;
- for(i=0;i<7;i++) {
- if(strcmp(tmp1,days[i])==0) ret.tm_wday=i;
- }
- for(j=0;j<12;j++) {
- if(strcmp(tmp2,months[j])==0) ret.tm_mon=j;
- }
- ret.tm_isdst=-1;
- parsed = mktime(&ret);
- }
- return parsed;
-}
-
-
-static int migrate_messages(void* data,int argc, char** argv, char** column_names) {
- time_t new_time = parse_time_from_db(argv[1]);
- if( new_time ){
- /* replace 'time' by -1 and set 'utc' to the timestamp */
- char *buf = sqlite3_mprintf("UPDATE history SET utc=%i,time='-1' WHERE id=%i", new_time, atoi(argv[0]));
- if( buf) {
- linphone_sql_request((sqlite3*)data, buf);
- sqlite3_free(buf);
- }
- } else {
- printf("Cannot parse time %s from id %s", argv[1], argv[0]);
- }
- return 0;
-}
-
-static void linphone_migrate_timestamps(sqlite3* db){
- int ret;
- char* errmsg = NULL;
-
- ret = sqlite3_exec(db,"SELECT id,time,direction FROM history WHERE time != '-1'", migrate_messages, db, &errmsg);
- if( ret != SQLITE_OK ){
- printf("Error migrating outgoing messages: %s.\n", errmsg);
- sqlite3_free(errmsg);
- } else {
- printf("Migrated message timestamps to UTC\n");
- }
-}
-
-void linphone_update_table(sqlite3* db) {
- char* errmsg=NULL;
- int ret;
-
- // for image url storage
- ret=sqlite3_exec(db,"ALTER TABLE history ADD COLUMN url TEXT;",NULL,NULL,&errmsg);
- if(ret != SQLITE_OK) {
- ms_warning("Table already up to date: %s.\n", errmsg);
- sqlite3_free(errmsg);
- } else {
- ms_debug("Table updated successfully for URL.");
- }
-
- // for UTC timestamp storage
- ret = sqlite3_exec(db, "ALTER TABLE history ADD COLUMN utc INTEGER;", NULL,NULL,&errmsg);
- if( ret != SQLITE_OK ){
- ms_warning("Table already up to date: %s.\n", errmsg);
- sqlite3_free(errmsg);
- } else {
- ms_debug("Table updated successfully for UTC.");
- }
-
- // migrate from old text-based timestamps to unix time-based timestamps
- linphone_migrate_timestamps(db);
-}
-
-void linphone_message_storage_init_chat_rooms(LinphoneCore *lc) {
- char *buf;
-
- if (lc->db==NULL) return;
- buf=sqlite3_mprintf("SELECT remoteContact FROM history GROUP BY remoteContact;");
- linphone_sql_request_all(lc->db,buf,lc);
- sqlite3_free(buf);
-}
-
-void linphone_core_message_storage_init(LinphoneCore *lc){
- int ret;
- const char *errmsg;
- sqlite3 *db;
- ret=sqlite3_open(lc->chat_db_file,&db);
- if(ret != SQLITE_OK) {
- errmsg=sqlite3_errmsg(db);
- ms_error("Error in the opening: %s.\n", errmsg);
- sqlite3_close(db);
- }
- linphone_create_table(db);
- linphone_update_table(db);
- lc->db=db;
-
- // Create a chatroom for each contact in the chat history
- linphone_message_storage_init_chat_rooms(lc);
-}
-
-void linphone_core_message_storage_close(LinphoneCore *lc){
- if (lc->db){
- sqlite3_close(lc->db);
- lc->db=NULL;
- }
-}
-
-#else
-
-unsigned int linphone_chat_message_store(LinphoneChatMessage *cr){
- return 0;
-}
-
-void linphone_chat_message_store_state(LinphoneChatMessage *cr){
-}
-
-void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr){
-}
-
-MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message){
- return NULL;
-}
-
-void linphone_chat_room_delete_message(LinphoneChatRoom *cr, LinphoneChatMessage *msg) {
-}
-
-void linphone_chat_room_delete_history(LinphoneChatRoom *cr){
-}
-
-void linphone_message_storage_init_chat_rooms(LinphoneCore *lc) {
-}
-
-void linphone_core_message_storage_init(LinphoneCore *lc){
-}
-
-void linphone_core_message_storage_close(LinphoneCore *lc){
-}
-
-void linphone_chat_room_update_url(LinphoneChatRoom *cr, LinphoneChatMessage *msg) {
-}
-
-int linphone_chat_room_get_unread_messages_count(LinphoneChatRoom *cr){
- return 0;
-}
-
-#endif
+/*
+message_storage.c
+Copyright (C) 2012 Belledonne Communications, Grenoble, France
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include "private.h"
+#include "linphonecore.h"
+
+#ifdef MSG_STORAGE_ENABLED
+
+#include "sqlite3.h"
+
+static inline LinphoneChatMessage* get_transient_message(LinphoneChatRoom* cr, unsigned int storage_id){
+ MSList* transients = cr->transient_messages;
+ LinphoneChatMessage* chat;
+ while( transients ){
+ chat = (LinphoneChatMessage*)transients->data;
+ if(chat->storage_id == storage_id){
+ return linphone_chat_message_ref(chat);
+ }
+ transients = transients->next;
+ }
+ return NULL;
+}
+
+
+/* DB layout:
+ * | 0 | storage_id
+ * | 1 | localContact
+ * | 2 | remoteContact
+ * | 3 | direction flag
+ * | 4 | message
+ * | 5 | time (unused now, used to be string-based timestamp)
+ * | 6 | read flag
+ * | 7 | status
+ * | 8 | external body url
+ * | 9 | utc timestamp
+ * | 10 | app data text
+ */
+static void create_chat_message(char **argv, void *data){
+ LinphoneChatRoom *cr = (LinphoneChatRoom *)data;
+ LinphoneAddress *from;
+
+ unsigned int storage_id = atoi(argv[0]);
+
+ // check if the message exists in the transient list, in which case we should return that one.
+ LinphoneChatMessage* new_message = get_transient_message(cr, storage_id);
+ if( new_message == NULL ){
+ new_message = linphone_chat_room_create_message(cr, argv[4]);
+
+ if(atoi(argv[3])==LinphoneChatMessageIncoming){
+ new_message->dir=LinphoneChatMessageIncoming;
+ from=linphone_address_new(argv[2]);
+ } else {
+ new_message->dir=LinphoneChatMessageOutgoing;
+ from=linphone_address_new(argv[1]);
+ }
+ linphone_chat_message_set_from(new_message,from);
+ linphone_address_destroy(from);
+
+ if( argv[9] != NULL ){
+ new_message->time = (time_t)atol(argv[9]);
+ } else {
+ new_message->time = time(NULL);
+ }
+
+ new_message->is_read=atoi(argv[6]);
+ new_message->state=atoi(argv[7]);
+ new_message->storage_id=storage_id;
+ new_message->external_body_url= argv[8] ? ms_strdup(argv[8]) : NULL;
+ new_message->appdata = argv[10]? ms_strdup(argv[10]) : NULL;
+ }
+ cr->messages_hist=ms_list_prepend(cr->messages_hist,new_message);
+}
+
+// Called when fetching all conversations from database
+static int callback_all(void *data, int argc, char **argv, char **colName){
+ LinphoneCore* lc = (LinphoneCore*) data;
+ char* address = argv[0];
+ linphone_core_get_or_create_chat_room(lc, address);
+ return 0;
+}
+
+static int callback(void *data, int argc, char **argv, char **colName){
+ create_chat_message(argv,data);
+ return 0;
+}
+
+void linphone_sql_request_message(sqlite3 *db,const char *stmt,LinphoneChatRoom *cr){
+ char* errmsg=NULL;
+ int ret;
+ ret=sqlite3_exec(db,stmt,callback,cr,&errmsg);
+ if(ret != SQLITE_OK) {
+ ms_error("Error in creation: %s.\n", errmsg);
+ sqlite3_free(errmsg);
+ }
+}
+
+int linphone_sql_request(sqlite3* db,const char *stmt){
+ char* errmsg=NULL;
+ int ret;
+ ret=sqlite3_exec(db,stmt,NULL,NULL,&errmsg);
+ if(ret != SQLITE_OK) {
+ ms_error("linphone_sql_request: error sqlite3_exec(): %s.\n", errmsg);
+ sqlite3_free(errmsg);
+ }
+ return ret;
+}
+
+// Process the request to fetch all chat contacts
+void linphone_sql_request_all(sqlite3* db,const char *stmt, LinphoneCore* lc){
+ char* errmsg=NULL;
+ int ret;
+ ret=sqlite3_exec(db,stmt,callback_all,lc,&errmsg);
+ if(ret != SQLITE_OK) {
+ ms_error("linphone_sql_request_all: error sqlite3_exec(): %s.\n", errmsg);
+ sqlite3_free(errmsg);
+ }
+}
+
+unsigned int linphone_chat_message_store(LinphoneChatMessage *msg){
+ LinphoneCore *lc=linphone_chat_room_get_lc(msg->chat_room);
+ int id=0;
+
+ if (lc->db){
+ char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(msg->chat_room));
+ char *local_contact=linphone_address_as_string_uri_only(linphone_chat_message_get_local_address(msg));
+ char *buf=sqlite3_mprintf("INSERT INTO history VALUES(NULL,%Q,%Q,%i,%Q,%Q,%i,%i,%Q,%i,%Q);",
+ local_contact,
+ peer,
+ msg->dir,
+ msg->message,
+ "-1", /* use UTC field now */
+ msg->is_read,
+ msg->state,
+ msg->external_body_url,
+ msg->time,
+ msg->appdata);
+ linphone_sql_request(lc->db,buf);
+ sqlite3_free(buf);
+ ms_free(local_contact);
+ ms_free(peer);
+ id = (unsigned int) sqlite3_last_insert_rowid (lc->db);
+ }
+ return id;
+}
+
+void linphone_chat_message_store_state(LinphoneChatMessage *msg){
+ LinphoneCore *lc=msg->chat_room->lc;
+ if (lc->db){
+ char *buf=sqlite3_mprintf("UPDATE history SET status=%i WHERE (message = %Q OR url = %Q) AND utc = %i;",
+ msg->state,msg->message,msg->external_body_url,msg->time);
+ linphone_sql_request(lc->db,buf);
+ sqlite3_free(buf);
+ }
+
+ if( msg->state == LinphoneChatMessageStateDelivered
+ || msg->state == LinphoneChatMessageStateNotDelivered ){
+ // message is not transient anymore, we can remove it from our transient list:
+ msg->chat_room->transient_messages = ms_list_remove(msg->chat_room->transient_messages, msg);
+ linphone_chat_message_unref(msg);
+ }
+}
+
+void linphone_chat_message_store_appdata(LinphoneChatMessage* msg){
+ LinphoneCore *lc=msg->chat_room->lc;
+ if (lc->db){
+ char *buf=sqlite3_mprintf("UPDATE history SET appdata=%Q WHERE id=%i;",
+ msg->appdata,msg->storage_id);
+ linphone_sql_request(lc->db,buf);
+ sqlite3_free(buf);
+ }
+}
+
+void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr){
+ LinphoneCore *lc=linphone_chat_room_get_lc(cr);
+ int read=1;
+
+ if (lc->db==NULL) return ;
+
+ char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));
+ char *buf=sqlite3_mprintf("UPDATE history SET read=%i WHERE remoteContact = %Q;",
+ read,peer);
+ linphone_sql_request(lc->db,buf);
+ sqlite3_free(buf);
+ ms_free(peer);
+}
+
+void linphone_chat_room_update_url(LinphoneChatRoom *cr, LinphoneChatMessage *msg) {
+ LinphoneCore *lc=linphone_chat_room_get_lc(cr);
+
+ if (lc->db==NULL) return ;
+
+ char *buf=sqlite3_mprintf("UPDATE history SET url=%Q WHERE id=%i;",msg->external_body_url,msg->storage_id);
+ linphone_sql_request(lc->db,buf);
+ sqlite3_free(buf);
+}
+
+int linphone_chat_room_get_unread_messages_count(LinphoneChatRoom *cr){
+ LinphoneCore *lc=linphone_chat_room_get_lc(cr);
+ int numrows=0;
+
+ if (lc->db==NULL) return 0;
+
+ char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));
+ char *buf=sqlite3_mprintf("SELECT count(*) FROM history WHERE remoteContact = %Q AND read = 0;",peer);
+ sqlite3_stmt *selectStatement;
+ int returnValue = sqlite3_prepare_v2(lc->db,buf,-1,&selectStatement,NULL);
+ if (returnValue == SQLITE_OK){
+ if(sqlite3_step(selectStatement) == SQLITE_ROW){
+ numrows= sqlite3_column_int(selectStatement, 0);
+ }
+ }
+ sqlite3_finalize(selectStatement);
+ sqlite3_free(buf);
+ ms_free(peer);
+ return numrows;
+}
+
+void linphone_chat_room_delete_message(LinphoneChatRoom *cr, LinphoneChatMessage *msg) {
+ LinphoneCore *lc=cr->lc;
+
+ if (lc->db==NULL) return ;
+
+ char *buf=sqlite3_mprintf("DELETE FROM history WHERE id = %i;", msg->storage_id);
+ linphone_sql_request(lc->db,buf);
+ sqlite3_free(buf);
+}
+
+void linphone_chat_room_delete_history(LinphoneChatRoom *cr){
+ LinphoneCore *lc=cr->lc;
+
+ if (lc->db==NULL) return ;
+
+ char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));
+ char *buf=sqlite3_mprintf("DELETE FROM history WHERE remoteContact = %Q;",peer);
+ linphone_sql_request(lc->db,buf);
+ sqlite3_free(buf);
+ ms_free(peer);
+}
+
+MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message){
+ LinphoneCore *lc=linphone_chat_room_get_lc(cr);
+ MSList *ret;
+ char *buf;
+ char *peer;
+ uint64_t begin,end;
+
+ if (lc->db==NULL) return NULL;
+ peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));
+ cr->messages_hist = NULL;
+ if (nb_message > 0)
+ buf=sqlite3_mprintf("SELECT * FROM history WHERE remoteContact = %Q ORDER BY id DESC LIMIT %i ;",peer,nb_message);
+ else
+ buf=sqlite3_mprintf("SELECT * FROM history WHERE remoteContact = %Q ORDER BY id DESC;",peer);
+ begin=ortp_get_cur_time_ms();
+ linphone_sql_request_message(lc->db,buf,cr);
+ end=ortp_get_cur_time_ms();
+ ms_message("linphone_chat_room_get_history(): completed in %i ms",(int)(end-begin));
+ sqlite3_free(buf);
+ ret=cr->messages_hist;
+ cr->messages_hist=NULL;
+ ms_free(peer);
+ return ret;
+}
+
+void linphone_close_storage(sqlite3* db){
+ sqlite3_close(db);
+}
+
+void linphone_create_table(sqlite3* db){
+ char* errmsg=NULL;
+ int ret;
+ ret=sqlite3_exec(db,"CREATE TABLE IF NOT EXISTS history ("
+ "id INTEGER PRIMARY KEY AUTOINCREMENT,"
+ "localContact TEXT NOT NULL,"
+ "remoteContact TEXT NOT NULL,"
+ "direction INTEGER,"
+ "message TEXT,"
+ "time TEXT NOT NULL,"
+ "read INTEGER,"
+ "status INTEGER"
+ ");",
+ 0,0,&errmsg);
+ if(ret != SQLITE_OK) {
+ ms_error("Error in creation: %s.\n", errmsg);
+ sqlite3_free(errmsg);
+ }
+}
+
+
+static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
+static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
+static time_t parse_time_from_db( const char* time ){
+ /* messages used to be stored in the DB by using string-based time */
+ struct tm ret={0};
+ char tmp1[80]={0};
+ char tmp2[80]={0};
+ int i,j;
+ time_t parsed = 0;
+
+ if( sscanf(time,"%3c %3c%d%d:%d:%d %d",tmp1,tmp2,&ret.tm_mday,
+ &ret.tm_hour,&ret.tm_min,&ret.tm_sec,&ret.tm_year) == 7 ){
+ ret.tm_year-=1900;
+ for(i=0;i<7;i++) {
+ if(strcmp(tmp1,days[i])==0) ret.tm_wday=i;
+ }
+ for(j=0;j<12;j++) {
+ if(strcmp(tmp2,months[j])==0) ret.tm_mon=j;
+ }
+ ret.tm_isdst=-1;
+ parsed = mktime(&ret);
+ }
+ return parsed;
+}
+
+
+static int migrate_messages_timestamp(void* data,int argc, char** argv, char** column_names) {
+ time_t new_time = parse_time_from_db(argv[1]);
+ if( new_time ){
+ /* replace 'time' by -1 and set 'utc' to the timestamp */
+ char *buf = sqlite3_mprintf("UPDATE history SET utc=%i,time='-1' WHERE id=%i;", new_time, atoi(argv[0]));
+ if( buf) {
+ linphone_sql_request((sqlite3*)data, buf);
+ sqlite3_free(buf);
+ }
+ } else {
+ ms_warning("Cannot parse time %s from id %s", argv[1], argv[0]);
+ }
+ return 0;
+}
+
+static void linphone_migrate_timestamps(sqlite3* db){
+ int ret;
+ char* errmsg = NULL;
+ uint64_t begin=ortp_get_cur_time_ms();
+
+ linphone_sql_request(db,"BEGIN TRANSACTION");
+
+ ret = sqlite3_exec(db,"SELECT id,time,direction FROM history WHERE time != '-1';", migrate_messages_timestamp, db, &errmsg);
+ if( ret != SQLITE_OK ){
+ ms_warning("Error migrating outgoing messages: %s.\n", errmsg);
+ sqlite3_free(errmsg);
+ linphone_sql_request(db, "ROLLBACK");
+ } else {
+ linphone_sql_request(db, "COMMIT");
+ uint64_t end=ortp_get_cur_time_ms();
+ ms_message("Migrated message timestamps to UTC in %i ms",(int)(end-begin));
+ }
+}
+
+void linphone_update_table(sqlite3* db) {
+ char* errmsg=NULL;
+ int ret;
+
+ // for image url storage
+ ret=sqlite3_exec(db,"ALTER TABLE history ADD COLUMN url TEXT;",NULL,NULL,&errmsg);
+ if(ret != SQLITE_OK) {
+ ms_message("Table already up to date: %s.", errmsg);
+ sqlite3_free(errmsg);
+ } else {
+ ms_debug("Table updated successfully for URL.");
+ }
+
+ // for UTC timestamp storage
+ ret = sqlite3_exec(db, "ALTER TABLE history ADD COLUMN utc INTEGER;", NULL,NULL,&errmsg);
+ if( ret != SQLITE_OK ){
+ ms_message("Table already up to date: %s.", errmsg);
+ sqlite3_free(errmsg);
+ } else {
+ ms_debug("Table updated successfully for UTC.");
+ // migrate from old text-based timestamps to unix time-based timestamps
+ linphone_migrate_timestamps(db);
+ }
+
+ // new field for app-specific storage
+ ret=sqlite3_exec(db,"ALTER TABLE history ADD COLUMN appdata TEXT;",NULL,NULL,&errmsg);
+ if(ret != SQLITE_OK) {
+ ms_message("Table already up to date: %s.", errmsg);
+ sqlite3_free(errmsg);
+ } else {
+ ms_debug("Table updated successfully for app-specific data.");
+ }
+}
+
+void linphone_message_storage_init_chat_rooms(LinphoneCore *lc) {
+ char *buf;
+
+ if (lc->db==NULL) return;
+ buf=sqlite3_mprintf("SELECT remoteContact FROM history GROUP BY remoteContact;");
+ linphone_sql_request_all(lc->db,buf,lc);
+ sqlite3_free(buf);
+}
+
+static void _linphone_message_storage_profile(void*data,const char*statement, sqlite3_uint64 duration){
+ ms_warning("SQL statement '%s' took %" PRIu64 " microseconds", statement, (uint64_t)(duration / 1000LL) );
+}
+
+static void linphone_message_storage_activate_debug(sqlite3* db, bool_t debug){
+ if( debug ){
+ sqlite3_profile(db, _linphone_message_storage_profile, NULL );
+ } else {
+ sqlite3_profile(db, NULL, NULL );
+ }
+}
+
+void linphone_core_message_storage_set_debug(LinphoneCore *lc, bool_t debug){
+
+ lc->debug_storage = debug;
+
+ if( lc->db ){
+ linphone_message_storage_activate_debug(lc->db, debug);
+ }
+}
+
+void linphone_core_message_storage_init(LinphoneCore *lc){
+ int ret;
+ const char *errmsg;
+ sqlite3 *db;
+
+ linphone_core_message_storage_close(lc);
+
+ ret=sqlite3_open(lc->chat_db_file,&db);
+ if(ret != SQLITE_OK) {
+ errmsg=sqlite3_errmsg(db);
+ ms_error("Error in the opening: %s.\n", errmsg);
+ sqlite3_close(db);
+ }
+
+ linphone_message_storage_activate_debug(db, lc->debug_storage);
+
+ linphone_create_table(db);
+ linphone_update_table(db);
+ lc->db=db;
+
+ // Create a chatroom for each contact in the chat history
+ linphone_message_storage_init_chat_rooms(lc);
+}
+
+void linphone_core_message_storage_close(LinphoneCore *lc){
+ if (lc->db){
+ sqlite3_close(lc->db);
+ lc->db=NULL;
+ }
+}
+
+#else
+
+unsigned int linphone_chat_message_store(LinphoneChatMessage *cr){
+ return 0;
+}
+
+void linphone_chat_message_store_state(LinphoneChatMessage *cr){
+}
+
+void linphone_chat_message_store_appdata(LinphoneChatMessage *msg){
+}
+
+void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr){
+}
+
+MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message){
+ return NULL;
+}
+
+void linphone_chat_room_delete_message(LinphoneChatRoom *cr, LinphoneChatMessage *msg) {
+}
+
+void linphone_chat_room_delete_history(LinphoneChatRoom *cr){
+}
+
+void linphone_message_storage_init_chat_rooms(LinphoneCore *lc) {
+}
+
+void linphone_core_message_storage_init(LinphoneCore *lc){
+}
+
+void linphone_core_message_storage_close(LinphoneCore *lc){
+}
+
+void linphone_chat_room_update_url(LinphoneChatRoom *cr, LinphoneChatMessage *msg) {
+}
+
+int linphone_chat_room_get_unread_messages_count(LinphoneChatRoom *cr){
+ return 0;
+}
+
+#endif
diff --git a/coreapi/misc.c b/coreapi/misc.c
index 56383fa58..38b0efa5d 100644
--- a/coreapi/misc.c
+++ b/coreapi/misc.c
@@ -711,11 +711,11 @@ void linphone_core_update_local_media_description_from_ice(SalMediaDescription *
}
strncpy(desc->ice_pwd, ice_session_local_pwd(session), sizeof(desc->ice_pwd));
strncpy(desc->ice_ufrag, ice_session_local_ufrag(session), sizeof(desc->ice_ufrag));
- for (i = 0; i < desc->n_active_streams; i++) {
+ for (i = 0; i < desc->nb_streams; i++) {
SalStreamDescription *stream = &desc->streams[i];
IceCheckList *cl = ice_session_check_list(session, i);
nb_candidates = 0;
- if (cl == NULL) continue;
+ if (!sal_stream_description_active(stream) || (cl == NULL)) continue;
if (ice_check_list_state(cl) == ICL_Completed) {
stream->ice_completed = TRUE;
result = ice_check_list_selected_valid_local_candidate(ice_session_check_list(session, i), &rtp_addr, &stream->rtp_port, &rtcp_addr, &stream->rtcp_port);
@@ -803,6 +803,13 @@ static void get_default_addr_and_port(uint16_t componentID, const SalMediaDescri
if ((*addr)[0] == '\0') *addr = md->addr;
}
+static void clear_ice_check_list(LinphoneCall *call, IceCheckList *removed){
+ if (call->audiostream && call->audiostream->ms.ice_check_list==removed)
+ call->audiostream->ms.ice_check_list=NULL;
+ if (call->videostream && call->videostream->ms.ice_check_list==removed)
+ call->videostream->ms.ice_check_list=NULL;
+}
+
void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md)
{
bool_t ice_restarted = FALSE;
@@ -815,7 +822,7 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call,
ice_session_restart(call->ice_session);
ice_restarted = TRUE;
} else {
- for (i = 0; i < md->n_total_streams; i++) {
+ for (i = 0; i < md->nb_streams; i++) {
const SalStreamDescription *stream = &md->streams[i];
IceCheckList *cl = ice_session_check_list(call->ice_session, i);
if (cl && (strcmp(stream->rtp_addr, "0.0.0.0") == 0)) {
@@ -834,7 +841,7 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call,
}
ice_session_set_remote_credentials(call->ice_session, md->ice_ufrag, md->ice_pwd);
}
- for (i = 0; i < md->n_total_streams; i++) {
+ for (i = 0; i < md->nb_streams; i++) {
const SalStreamDescription *stream = &md->streams[i];
IceCheckList *cl = ice_session_check_list(call->ice_session, i);
if (cl && (stream->ice_pwd[0] != '\0') && (stream->ice_ufrag[0] != '\0')) {
@@ -850,9 +857,10 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call,
}
/* Create ICE check lists if needed and parse ICE attributes. */
- for (i = 0; i < md->n_total_streams; i++) {
+ for (i = 0; i < md->nb_streams; i++) {
const SalStreamDescription *stream = &md->streams[i];
IceCheckList *cl = ice_session_check_list(call->ice_session, i);
+ /*
if ((cl == NULL) && (i < md->n_active_streams)) {
cl = ice_check_list_new();
ice_session_add_check_list(call->ice_session, cl);
@@ -867,16 +875,13 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call,
break;
}
}
+ */
+ if (cl==NULL) continue;
if (stream->ice_mismatch == TRUE) {
ice_check_list_set_state(cl, ICL_Failed);
} else if (stream->rtp_port == 0) {
ice_session_remove_check_list(call->ice_session, cl);
-#ifdef VIDEO_ENABLED
- if (stream->type==SalVideo && call->videostream){
- video_stream_stop(call->videostream);
- call->videostream=NULL;
- }
-#endif
+ clear_ice_check_list(call,cl);
} else {
if ((stream->ice_pwd[0] != '\0') && (stream->ice_ufrag[0] != '\0'))
ice_check_list_set_remote_credentials(cl, stream->ice_ufrag, stream->ice_pwd);
@@ -913,13 +918,12 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call,
}
}
}
- for (i = ice_session_nb_check_lists(call->ice_session); i > md->n_active_streams; i--) {
- IceCheckList *removed=ice_session_check_list(call->ice_session, i - 1);
- ice_session_remove_check_list(call->ice_session, removed);
- if (call->audiostream && call->audiostream->ms.ice_check_list==removed)
- call->audiostream->ms.ice_check_list=NULL;
- if (call->videostream && call->videostream->ms.ice_check_list==removed)
- call->videostream->ms.ice_check_list=NULL;
+ for (i = 0; i < md->nb_streams; i++) {
+ IceCheckList * cl = ice_session_check_list(call->ice_session, i);
+ if (!sal_stream_description_active(&md->streams[i]) && (cl != NULL)) {
+ ice_session_remove_check_list_from_idx(call->ice_session, i);
+ clear_ice_check_list(call, cl);
+ }
}
ice_session_check_mismatch(call->ice_session);
} else {
@@ -932,12 +936,11 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call,
}
}
-bool_t linphone_core_media_description_contains_video_stream(const SalMediaDescription *md)
-{
+bool_t linphone_core_media_description_contains_video_stream(const SalMediaDescription *md){
int i;
- for (i = 0; i < md->n_active_streams; i++) {
- if (md->streams[i].type == SalVideo)
+ for (i = 0; i < md->nb_streams; i++) {
+ if (md->streams[i].type == SalVideo && md->streams[i].rtp_port!=0)
return TRUE;
}
return FALSE;
@@ -1471,3 +1474,71 @@ void linphone_core_set_tone(LinphoneCore *lc, LinphoneToneID id, const char *aud
_linphone_core_set_tone(lc, LinphoneReasonNone, id, audiofile);
}
+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");
+ char *tmp=ms_strdup(config);
+ char *sep;
+ char *pos;
+ char *nextpos;
+ char *params;
+ int found=0;
+ MSCryptoSuite *result=NULL;
+ pos=tmp;
+ do{
+ sep=strchr(pos,',');
+ if (!sep) {
+ sep=pos+strlen(pos);
+ nextpos=NULL;
+ }else {
+ *sep='\0';
+ nextpos=sep+1;
+ }
+ while(*pos==' ') ++pos; /*strip leading spaces*/
+ params=strchr(pos,' '); /*look for params that arrive after crypto suite name*/
+ if (params){
+ while(*params==' ') ++params; /*strip parameters leading space*/
+ }
+ if (sep-pos>0){
+ MSCryptoSuiteNameParams np;
+ MSCryptoSuite suite;
+ np.name=pos;
+ np.params=params;
+ suite=ms_crypto_suite_build_from_name_params(&np);
+ if (suite!=MS_CRYPTO_SUITE_INVALID){
+ result=ms_realloc(result,(found+2)*sizeof(MSCryptoSuite));
+ result[found]=suite;
+ result[found+1]=MS_CRYPTO_SUITE_INVALID;
+ found++;
+ ms_message("Configured srtp crypto suite: %s %s",np.name,np.params ? np.params : "");
+ }
+ }
+ pos=nextpos;
+ }while(pos);
+ ms_free(tmp);
+ if (lc->rtp_conf.srtp_suites){
+ ms_free(lc->rtp_conf.srtp_suites);
+ lc->rtp_conf.srtp_suites=NULL;
+ }
+ lc->rtp_conf.srtp_suites=result;
+ return result;
+}
+
+
+
+const char ** linphone_core_get_supported_file_formats(LinphoneCore *core){
+ static const char *mkv="mkv";
+ static const char *wav="wav";
+ if (core->supported_formats==NULL){
+ core->supported_formats=ms_malloc0(3*sizeof(char*));
+ core->supported_formats[0]=wav;
+ if (ms_factory_lookup_filter_by_id(ms_factory_get_fallback(),MS_MKV_RECORDER_ID)){
+ core->supported_formats[1]=mkv;
+ }
+ }
+ return core->supported_formats;
+}
+
+bool_t linphone_core_symmetric_rtp_enabled(LinphoneCore*lc){
+ return lp_config_get_int(lc->config,"rtp","symmetric",1);
+}
+
diff --git a/coreapi/offeranswer.c b/coreapi/offeranswer.c
index db2a28b76..d7d2e6e84 100644
--- a/coreapi/offeranswer.c
+++ b/coreapi/offeranswer.c
@@ -99,6 +99,14 @@ static MSList *match_payloads(const MSList *local, const MSList *remote, bool_t
if (p2->send_fmtp)
payload_type_set_send_fmtp(newp,p2->send_fmtp);
newp->flags|=PAYLOAD_TYPE_FLAG_CAN_RECV|PAYLOAD_TYPE_FLAG_CAN_SEND;
+ if (p2->flags & PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED) {
+ newp->flags |= PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED;
+ newp->avpf = payload_type_get_avpf_params(p2); /* Take remote AVPF features */
+ /* Take bigger AVPF trr interval */
+ if (p2->avpf.trr_interval < matched->avpf.trr_interval) {
+ newp->avpf.trr_interval = matched->avpf.trr_interval;
+ }
+ }
res=ms_list_append(res,newp);
/* we should use the remote numbering even when parsing a response */
payload_type_set_number(newp,remote_number);
@@ -156,17 +164,16 @@ static bool_t match_crypto_algo(const SalSrtpCryptoAlgo* local, const SalSrtpCry
result->algo = remote[i].algo;
/* We're answering an SDP offer. Supply our master key, associated with the remote supplied tag */
if (use_local_key) {
- strncpy(result->master_key, local[j].master_key, 41);
+ strncpy(result->master_key, local[j].master_key, sizeof(result->master_key) );
result->tag = remote[i].tag;
*choosen_local_tag = local[j].tag;
}
/* We received an answer to our SDP crypto proposal. Copy matching algo remote master key to result, and memorize local tag */
else {
- strncpy(result->master_key, remote[i].master_key, 41);
+ strncpy(result->master_key, remote[i].master_key, sizeof(result->master_key));
result->tag = local[j].tag;
*choosen_local_tag = local[j].tag;
}
- result->master_key[40] = '\0';
return TRUE;
}
}
@@ -234,7 +241,7 @@ static void initiate_outgoing(const SalStreamDescription *local_offer,
}else{
result->rtp_port=0;
}
- if (result->proto == SalProtoRtpSavp) {
+ if (sal_stream_description_has_srtp(result) == TRUE) {
/* verify crypto algo */
memset(result->crypto, 0, sizeof(result->crypto));
if (!match_crypto_algo(local_offer->crypto, remote_answer->crypto, &result->crypto[0], &result->crypto_local_tag, FALSE))
@@ -260,7 +267,7 @@ static void initiate_incoming(const SalStreamDescription *local_cap,
}else{
result->rtp_port=0;
}
- if (result->proto == SalProtoRtpSavp) {
+ if (sal_stream_description_has_srtp(result) == TRUE) {
/* select crypto algo */
memset(result->crypto, 0, sizeof(result->crypto));
if (!match_crypto_algo(local_cap->crypto, remote_offer->crypto, &result->crypto[0], &result->crypto_local_tag, TRUE))
@@ -286,7 +293,7 @@ int offer_answer_initiate_outgoing(const SalMediaDescription *local_offer,
int i,j;
const SalStreamDescription *ls,*rs;
- for(i=0,j=0;in_total_streams;++i){
+ for(i=0,j=0;inb_streams;++i){
ms_message("Processing for stream %i",i);
ls=&local_offer->streams[i];
rs=sal_media_description_find_stream((SalMediaDescription*)remote_answer,ls->proto,ls->type);
@@ -300,8 +307,7 @@ int offer_answer_initiate_outgoing(const SalMediaDescription *local_offer,
}
else ms_warning("No matching stream for %i",i);
}
- result->n_active_streams=j;
- result->n_total_streams=local_offer->n_total_streams;
+ result->nb_streams=local_offer->nb_streams;
result->bandwidth=remote_answer->bandwidth;
strcpy(result->addr,remote_answer->addr);
memcpy(&result->rtcp_xr, &local_offer->rtcp_xr, sizeof(result->rtcp_xr));
@@ -314,7 +320,7 @@ int offer_answer_initiate_outgoing(const SalMediaDescription *local_offer,
static bool_t local_stream_not_already_used(const SalMediaDescription *result, const SalStreamDescription *stream){
int i;
- for(i=0;in_total_streams;++i){
+ for(i=0;inb_streams;++i){
const SalStreamDescription *ss=&result->streams[i];
if (strcmp(ss->name,stream->name)==0){
ms_message("video stream already used in answer");
@@ -324,17 +330,19 @@ static bool_t local_stream_not_already_used(const SalMediaDescription *result, c
return TRUE;
}
-/*in answering mode, we consider that if we are able to make SAVP, then we can do AVP as well*/
-static bool_t proto_compatible(SalMediaProto local, SalMediaProto remote){
- if (local==remote) return TRUE;
- if (remote==SalProtoRtpAvp && local==SalProtoRtpSavp) return TRUE;
+/*in answering mode, we consider that if we are able to make AVPF/SAVP/SAVPF, then we can do AVP as well*/
+static bool_t proto_compatible(SalMediaProto local, SalMediaProto remote) {
+ if (local == remote) return TRUE;
+ if ((remote == SalProtoRtpAvp) && ((local == SalProtoRtpSavp) || (local == SalProtoRtpSavpf))) return TRUE;
+ if ((remote == SalProtoRtpAvpf) && (local == SalProtoRtpSavpf)) return TRUE;
return FALSE;
}
static const SalStreamDescription *find_local_matching_stream(const SalMediaDescription *result, const SalMediaDescription *local_capabilities, const SalStreamDescription *remote_stream){
int i;
- for(i=0;in_active_streams;++i){
+ for(i=0;inb_streams;++i){
const SalStreamDescription *ss=&local_capabilities->streams[i];
+ if (!sal_stream_description_active(ss)) continue;
if (ss->type==remote_stream->type && proto_compatible(ss->proto,remote_stream->proto)
&& local_stream_not_already_used(result,ss)) return ss;
}
@@ -352,15 +360,13 @@ int offer_answer_initiate_incoming(const SalMediaDescription *local_capabilities
int i;
const SalStreamDescription *ls=NULL,*rs;
- result->n_active_streams=0;
- for(i=0;in_total_streams;++i){
+ for(i=0;inb_streams;++i){
rs=&remote_offer->streams[i];
if (rs->proto!=SalProtoOther){
ls=find_local_matching_stream(result,local_capabilities,rs);
}else ms_warning("Unknown protocol for mline %i, declining",i);
if (ls){
initiate_incoming(ls,rs,&result->streams[i],one_matching_codec);
- if (result->streams[i].rtp_port!=0) result->n_active_streams++;
// Handle media RTCP XR attribute
memset(&result->streams[i].rtcp_xr, 0, sizeof(result->streams[i].rtcp_xr));
@@ -389,7 +395,7 @@ int offer_answer_initiate_incoming(const SalMediaDescription *local_capabilities
}
}
}
- result->n_total_streams=i;
+ result->nb_streams=i;
strcpy(result->username, local_capabilities->username);
strcpy(result->addr,local_capabilities->addr);
result->bandwidth=local_capabilities->bandwidth;
diff --git a/coreapi/presence.c b/coreapi/presence.c
index fa4b97014..183002b86 100644
--- a/coreapi/presence.c
+++ b/coreapi/presence.c
@@ -81,15 +81,17 @@ static const char *person_prefix = "/pidf:presence/dm:person";
/*****************************************************************************
* PRIVATE FUNCTIONS *
****************************************************************************/
-
-static char presence_id_valid_characters[] = "0123456789abcdefghijklmnopqrstuvwxyz";
+/*defined in http://www.w3.org/TR/REC-xml/*/
+static char presence_id_valid_characters[] = "0123456789abcdefghijklmnopqrstuvwxyz-.";
+/*NameStartChar (NameChar)**/
+static char presence_id_valid_start_characters[] = ":_abcdefghijklmnopqrstuvwxyz";
static char * generate_presence_id(void) {
char id[7];
int i;
-
- for (i = 0; i < 6; i++) {
- id[i] = presence_id_valid_characters[random() % sizeof(presence_id_valid_characters)];
+ id[0] = presence_id_valid_start_characters[random() % (sizeof(presence_id_valid_start_characters)-1)];
+ for (i = 1; i < 6; i++) {
+ id[i] = presence_id_valid_characters[random() % (sizeof(presence_id_valid_characters)-1)];
}
id[6] = '\0';
@@ -278,6 +280,7 @@ LinphonePresenceBasicStatus linphone_presence_model_get_basic_status(const Linph
int linphone_presence_model_set_basic_status(LinphonePresenceModel *model, LinphonePresenceBasicStatus basic_status) {
LinphonePresenceService *service;
+ int err = 0;
if (model == NULL) return -1;
@@ -285,8 +288,9 @@ int linphone_presence_model_set_basic_status(LinphonePresenceModel *model, Linph
service = linphone_presence_service_new(NULL, basic_status, NULL);
if (service == NULL) return -1;
- if (linphone_presence_model_add_service(model, service) < 0) return -1;
- return 0;
+ err = linphone_presence_model_add_service(model, service);
+ linphone_presence_service_unref(service);
+ return err;
}
static void presence_service_find_newer_timestamp(LinphonePresenceService *service, time_t *timestamp) {
@@ -363,6 +367,7 @@ LinphonePresenceActivity * linphone_presence_model_get_activity(const LinphonePr
int linphone_presence_model_set_activity(LinphonePresenceModel *model, LinphonePresenceActivityType acttype, const char *description) {
LinphonePresenceBasicStatus basic_status = LinphonePresenceBasicStatusOpen;
LinphonePresenceActivity *activity;
+ int err = 0;
if (model == NULL) return -1;
@@ -383,8 +388,9 @@ int linphone_presence_model_set_activity(LinphonePresenceModel *model, LinphoneP
linphone_presence_model_clear_activities(model);
activity = linphone_presence_activity_new(acttype, description);
if (activity == NULL) return -1;
- return linphone_presence_model_add_activity(model, activity);
-
+ err = linphone_presence_model_add_activity(model, activity);
+ linphone_presence_activity_unref(activity);
+ return err;
}
unsigned int linphone_presence_model_get_nb_activities(const LinphonePresenceModel *model) {
diff --git a/coreapi/private.h b/coreapi/private.h
index e3a97b8e5..b03365858 100644
--- a/coreapi/private.h
+++ b/coreapi/private.h
@@ -95,10 +95,18 @@ struct _LinphoneCallParams{
char *session_name;
SalCustomHeader *custom_headers;
bool_t has_video;
+ bool_t avpf_enabled; /* RTCP feedback messages are enabled */
bool_t real_early_media; /*send real media even during early media (for outgoing calls)*/
bool_t in_conference; /*in conference mode */
bool_t low_bandwidth;
LinphonePrivacyMask privacy;
+ uint16_t avpf_rr_interval;
+};
+
+struct _LinphoneQualityReporting{
+ reporting_session_report_t * reports[2]; /**Store information on audio and video media streams (RFC 6035) */
+ bool_t was_video_running; /*Keep video state since last check in order to detect its (de)activation*/
+ LinphoneQualityReportingReportSendCb on_report_sent;
};
struct _LinphoneCallLog{
@@ -117,10 +125,12 @@ struct _LinphoneCallLog{
time_t start_date_time; /**Start date of the call in seconds as expressed in a time_t */
char* call_id; /**unique id of a call*/
- reporting_session_report_t * reports[2]; /**=bw2;
}
-static inline int get_remaining_bandwidth_for_video(int total, int audio){
+static MS2_INLINE int get_remaining_bandwidth_for_video(int total, int audio){
if (total<=0) return 0;
return total-audio-10;
}
-static inline void set_string(char **dest, const char *src){
+static MS2_INLINE void set_string(char **dest, const char *src){
if (*dest){
ms_free(*dest);
*dest=NULL;
@@ -324,7 +338,7 @@ void linphone_subscription_closed(LinphoneCore *lc, SalOp *op);
void linphone_core_update_allocated_audio_bandwidth(LinphoneCore *lc);
void linphone_core_update_allocated_audio_bandwidth_in_call(LinphoneCall *call, const PayloadType *pt, int maxbw);
-int linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call);
+LINPHONE_PUBLIC int linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call);
void linphone_core_resolve_stun_server(LinphoneCore *lc);
const struct addrinfo *linphone_core_get_stun_server_addrinfo(LinphoneCore *lc);
void linphone_core_adapt_to_network(LinphoneCore *lc, int ping_time_ms, LinphoneCallParams *params);
@@ -334,7 +348,6 @@ void linphone_call_stats_fill(LinphoneCallStats *stats, MediaStream *ms, OrtpEve
void linphone_core_update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session);
void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md);
bool_t linphone_core_media_description_contains_video_stream(const SalMediaDescription *md);
-bool_t linphone_core_media_description_has_srtp(const SalMediaDescription *md);
void linphone_core_send_initial_subscribes(LinphoneCore *lc);
void linphone_core_write_friends_config(LinphoneCore* lc);
@@ -347,7 +360,7 @@ LinphoneProxyConfig * linphone_core_lookup_known_proxy(LinphoneCore *lc, const L
const char *linphone_core_find_best_identity(LinphoneCore *lc, const LinphoneAddress *to);
int linphone_core_get_local_ip_for(int type, const char *dest, char *result);
-LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(struct _LpConfig *config, int index);
+LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(LinphoneCore *lc, int index);
void linphone_proxy_config_write_to_config_file(struct _LpConfig* config,LinphoneProxyConfig *obj, int index);
int linphone_proxy_config_normalize_number(LinphoneProxyConfig *cfg, const char *username, char *result, size_t result_len);
@@ -362,8 +375,6 @@ void linphone_call_init_video_stream(LinphoneCall *call);
void linphone_call_init_media_streams(LinphoneCall *call);
void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_muted, bool_t send_ringbacktone);
void linphone_call_start_media_streams_for_ice_gathering(LinphoneCall *call);
-void linphone_call_stop_audio_stream(LinphoneCall *call);
-void linphone_call_stop_video_stream(LinphoneCall *call);
void linphone_call_stop_media_streams(LinphoneCall *call);
void linphone_call_delete_ice_session(LinphoneCall *call);
void linphone_call_delete_upnp_session(LinphoneCall *call);
@@ -371,6 +382,7 @@ void linphone_call_stop_media_streams_for_ice_gathering(LinphoneCall *call);
void linphone_call_update_crypto_parameters(LinphoneCall *call, SalMediaDescription *old_md, SalMediaDescription *new_md);
void linphone_call_update_remote_session_id_and_ver(LinphoneCall *call);
+
const char * linphone_core_get_identity(LinphoneCore *lc);
void linphone_core_start_waiting(LinphoneCore *lc, const char *purpose);
@@ -386,6 +398,7 @@ void linphone_core_notify_incoming_call(LinphoneCore *lc, LinphoneCall *call);
bool_t linphone_core_incompatible_security(LinphoneCore *lc, SalMediaDescription *md);
extern SalCallbacks linphone_sal_callbacks;
bool_t linphone_core_rtcp_enabled(const LinphoneCore *lc);
+bool_t linphone_core_symmetric_rtp_enabled(LinphoneCore*lc);
LinphoneCall * is_a_linphone_call(void *user_pointer);
LinphoneProxyConfig * is_a_linphone_proxy_config(void *user_pointer);
@@ -393,6 +406,9 @@ LinphoneProxyConfig * is_a_linphone_proxy_config(void *user_pointer);
void linphone_core_queue_task(LinphoneCore *lc, belle_sip_source_func_t task_fun, void *data, const char *task_description);
static const int linphone_proxy_config_magic=0x7979;
+LINPHONE_PUBLIC bool_t linphone_proxy_config_address_equal(const LinphoneAddress *a, const LinphoneAddress *b);
+LINPHONE_PUBLIC bool_t linphone_proxy_config_is_server_config_changed(const LinphoneProxyConfig* obj);
+void _linphone_proxy_config_unregister(LinphoneProxyConfig *obj);
/*chat*/
void linphone_chat_message_destroy(LinphoneChatMessage* msg);
@@ -405,7 +421,7 @@ struct _LinphoneProxyConfig
char *reg_proxy;
char *reg_identity;
char *reg_route;
- char *statistics_collector;
+ char *quality_reporting_collector;
char *realm;
char *contact_params;
char *contact_uri_params;
@@ -423,11 +439,19 @@ struct _LinphoneProxyConfig
bool_t publish;
bool_t dial_escape_plus;
bool_t send_publish;
- bool_t send_statistics;
- bool_t pad[3];
+ bool_t quality_reporting_enabled;
+ bool_t avpf_enabled;
+ bool_t pad;
+ uint8_t avpf_rr_interval;
+ uint8_t quality_reporting_interval;
void* user_data;
time_t deletion_date;
LinphonePrivacyMask privacy;
+ /*use to check if server config has changed between edit() and done()*/
+ LinphoneAddress *saved_proxy;
+ LinphoneAddress *saved_identity;
+ /*---*/
+
};
struct _LinphoneAuthInfo
@@ -511,6 +535,7 @@ typedef struct rtp_config
int video_jitt_comp; /*jitter compensation*/
int nortp_timeout;
int disable_upnp;
+ MSCryptoSuite *srtp_suites;
bool_t rtp_no_xmit_on_audio_mute;
/* stop rtp xmit when audio muted */
bool_t audio_adaptive_jitt_comp_enabled;
@@ -692,6 +717,7 @@ struct _LinphoneCore
char *chat_db_file;
#ifdef MSG_STORAGE_ENABLED
sqlite3 *db;
+ bool_t debug_storage;
#endif
#ifdef BUILD_UPNP
UpnpContext *upnp;
@@ -700,6 +726,8 @@ struct _LinphoneCore
belle_tls_verify_policy_t *http_verify_policy;
MSList *tones;
LinphoneReason chat_deny_code;
+ char *file_transfer_server;
+ const char **supported_formats;
};
@@ -732,6 +760,7 @@ int linphone_core_get_calls_nb(const LinphoneCore *lc);
void linphone_core_set_state(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message);
void linphone_call_make_local_media_description(LinphoneCore *lc, LinphoneCall *call);
+void linphone_call_increment_local_media_description(LinphoneCall *call);
void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMediaDescription *new_md);
bool_t linphone_core_is_payload_type_usable_for_bandwidth(LinphoneCore *lc, const PayloadType *pt, int bandwidth_limit);
@@ -804,8 +833,10 @@ sqlite3 * linphone_message_storage_init();
void linphone_message_storage_init_chat_rooms(LinphoneCore *lc);
#endif
void linphone_chat_message_store_state(LinphoneChatMessage *msg);
+void linphone_chat_message_store_appdata(LinphoneChatMessage* msg);
void linphone_core_message_storage_init(LinphoneCore *lc);
void linphone_core_message_storage_close(LinphoneCore *lc);
+void linphone_core_message_storage_set_debug(LinphoneCore *lc, bool_t debug);
void linphone_core_play_named_tone(LinphoneCore *lc, LinphoneToneID id);
bool_t linphone_core_tone_indications_enabled(LinphoneCore*lc);
@@ -815,6 +846,7 @@ void linphone_call_create_op(LinphoneCall *call);
int linphone_call_prepare_ice(LinphoneCall *call, bool_t incoming_offer);
void linphone_core_notify_info_message(LinphoneCore* lc,SalOp *op, const SalBody *body);
void linphone_content_uninit(LinphoneContent * obj);
+void linphone_content_copy(LinphoneContent *obj, const LinphoneContent *ref);
LinphoneContent *linphone_content_copy_from_sal_body(LinphoneContent *obj, const SalBody *ref);
SalBody *sal_body_from_content(SalBody *body, const LinphoneContent *lc);
SalReason linphone_reason_to_sal(LinphoneReason reason);
@@ -831,7 +863,6 @@ LinphoneSubscriptionState linphone_subscription_state_from_sal(SalSubscribeStatu
const LinphoneContent *linphone_content_from_sal_body(LinphoneContent *obj, const SalBody *ref);
void linphone_core_invalidate_friend_subscriptions(LinphoneCore *lc);
-
/*****************************************************************************
* REMOTE PROVISIONING FUNCTIONS *
****************************************************************************/
@@ -873,11 +904,12 @@ xmlXPathObjectPtr linphone_get_xml_xpath_object_for_node_list(xmlparsing_context
char * linphone_timestamp_to_rfc3339_string(time_t timestamp);
-static inline const LinphoneErrorInfo *linphone_error_info_from_sal_op(const SalOp *op){
+static MS2_INLINE const LinphoneErrorInfo *linphone_error_info_from_sal_op(const SalOp *op){
if (op==NULL) return (LinphoneErrorInfo*)sal_error_info_none();
return (const LinphoneErrorInfo*)sal_op_get_error_info(op);
}
+const MSCryptoSuite * linphone_core_get_srtp_crypto_suites(LinphoneCore *lc);
/** Belle Sip-based objects need unique ids
*/
diff --git a/coreapi/proxy.c b/coreapi/proxy.c
index 7827dcb82..a999d3b3c 100644
--- a/coreapi/proxy.c
+++ b/coreapi/proxy.c
@@ -26,6 +26,54 @@ Copyright (C) 2000 Simon MORLAT (simon.morlat@linphone.org)
#include
+/*store current config related to server location*/
+static void linphone_proxy_config_store_server_config(LinphoneProxyConfig* obj) {
+ if (obj->saved_identity) linphone_address_destroy(obj->saved_identity);
+ if (obj->reg_identity)
+ obj->saved_identity = linphone_address_new(obj->reg_identity);
+ else
+ obj->saved_identity = NULL;
+
+ if (obj->saved_proxy) linphone_address_destroy(obj->saved_proxy);
+ if (obj->reg_proxy)
+ obj->saved_proxy = linphone_address_new(obj->reg_proxy);
+ else
+ obj->saved_proxy = NULL;
+}
+
+bool_t linphone_proxy_config_address_equal(const LinphoneAddress *a, const LinphoneAddress *b) {
+ if (a == NULL && b == NULL)
+ return TRUE;
+ else if (!a || !b)
+ return FALSE;
+
+ if (linphone_address_weak_equal(a,b)) {
+ /*also check both transport and uri */
+ return linphone_address_is_secure(a) == linphone_address_is_secure(b) && linphone_address_get_transport(a) == linphone_address_get_transport(b);
+ } else
+ return FALSE; /*either username, domain or port ar not equals*/
+
+}
+
+bool_t linphone_proxy_config_is_server_config_changed(const LinphoneProxyConfig* obj) {
+ LinphoneAddress *current_identity=obj->reg_identity?linphone_address_new(obj->reg_identity):NULL;
+ LinphoneAddress *current_proxy=obj->reg_proxy?linphone_address_new(obj->reg_proxy):NULL;
+ bool_t result=FALSE;
+
+ if (!linphone_proxy_config_address_equal(obj->saved_identity,current_identity)){
+ result=TRUE;
+ goto end;
+ }
+ if (!linphone_proxy_config_address_equal(obj->saved_proxy,current_proxy)){
+ result=TRUE;
+ goto end;
+ }
+
+ end:
+ if (current_identity) linphone_address_destroy(current_identity);
+ if (current_proxy) linphone_address_destroy(current_proxy);
+ return result;
+}
void linphone_proxy_config_write_all_to_config_file(LinphoneCore *lc){
MSList *elem;
@@ -46,7 +94,7 @@ static void linphone_proxy_config_init(LinphoneCore* lc, LinphoneProxyConfig *ob
const char *identity = lc ? lp_config_get_default_string(lc->config, "proxy", "reg_identity", NULL) : NULL;
const char *proxy = lc ? lp_config_get_default_string(lc->config, "proxy", "reg_proxy", NULL) : NULL;
const char *route = lc ? lp_config_get_default_string(lc->config, "proxy", "reg_route", NULL) : NULL;
- const char *statistics_collector = lc ? lp_config_get_default_string(lc->config, "proxy", "statistics_collector", NULL) : NULL;
+ const char *quality_reporting_collector = lc ? lp_config_get_default_string(lc->config, "proxy", "quality_reporting_collector", NULL) : NULL;
const char *contact_params = lc ? lp_config_get_default_string(lc->config, "proxy", "contact_parameters", NULL) : NULL;
const char *contact_uri_params = lc ? lp_config_get_default_string(lc->config, "proxy", "contact_uri_parameters", NULL) : NULL;
@@ -60,10 +108,13 @@ static void linphone_proxy_config_init(LinphoneCore* lc, LinphoneProxyConfig *ob
obj->reg_identity = identity ? ms_strdup(identity) : NULL;
obj->reg_proxy = proxy ? ms_strdup(proxy) : NULL;
obj->reg_route = route ? ms_strdup(route) : NULL;
- obj->statistics_collector = statistics_collector ? ms_strdup(statistics_collector) : NULL;
- obj->send_statistics = lc ? lp_config_get_default_int(lc->config, "proxy", "send_statistics", 0) : 0;
+ obj->quality_reporting_enabled = lc ? lp_config_get_default_int(lc->config, "proxy", "quality_reporting_enabled", 0) : 0;
+ obj->quality_reporting_collector = quality_reporting_collector ? ms_strdup(quality_reporting_collector) : NULL;
+ obj->quality_reporting_interval = lc ? lp_config_get_default_int(lc->config, "proxy", "quality_reporting_interval", 0) : 0;
obj->contact_params = contact_params ? ms_strdup(contact_params) : NULL;
obj->contact_uri_params = contact_uri_params ? ms_strdup(contact_uri_params) : NULL;
+ obj->avpf_enabled = lc ? lp_config_get_default_int(lc->config, "proxy", "avpf", 0) : 0;
+ obj->avpf_rr_interval = lc ? lp_config_get_default_int(lc->config, "proxy", "avpf_rr_interval", 5) : 5;
obj->publish_expires=-1;
}
@@ -97,7 +148,7 @@ void linphone_proxy_config_destroy(LinphoneProxyConfig *obj){
if (obj->reg_proxy!=NULL) ms_free(obj->reg_proxy);
if (obj->reg_identity!=NULL) ms_free(obj->reg_identity);
if (obj->reg_route!=NULL) ms_free(obj->reg_route);
- if (obj->statistics_collector!=NULL) ms_free(obj->statistics_collector);
+ if (obj->quality_reporting_collector!=NULL) ms_free(obj->quality_reporting_collector);
if (obj->ssctx!=NULL) sip_setup_context_free(obj->ssctx);
if (obj->realm!=NULL) ms_free(obj->realm);
if (obj->type!=NULL) ms_free(obj->type);
@@ -106,6 +157,8 @@ void linphone_proxy_config_destroy(LinphoneProxyConfig *obj){
if (obj->publish_op) sal_op_release(obj->publish_op);
if (obj->contact_params) ms_free(obj->contact_params);
if (obj->contact_uri_params) ms_free(obj->contact_uri_params);
+ if (obj->saved_proxy!=NULL) linphone_address_destroy(obj->saved_proxy);
+ if (obj->saved_identity!=NULL) linphone_address_destroy(obj->saved_identity);
ms_free(obj);
}
@@ -254,6 +307,19 @@ void linphone_proxy_config_set_expires(LinphoneProxyConfig *obj, int val){
void linphone_proxy_config_enable_publish(LinphoneProxyConfig *obj, bool_t val){
obj->publish=val;
}
+
+/**
+ * Prevent a proxy config from refreshing its registration.
+ * This is useful to let registrations to expire naturally (or) when the application wants to keep control on when
+ * refreshes are sent.
+ * However, linphone_core_set_network_reachable(lc,TRUE) will always request the proxy configs to refresh their registrations.
+ * The refreshing operations can be resumed with linphone_proxy_config_refresh_register().
+ * @param obj the proxy config
+**/
+void linphone_proxy_config_pause_register(LinphoneProxyConfig *obj){
+ if (obj->op) sal_op_stop_refreshing(obj->op);
+}
+
/**
* Starts editing a proxy configuration.
*
@@ -265,21 +331,16 @@ void linphone_proxy_config_enable_publish(LinphoneProxyConfig *obj, bool_t val){
**/
void linphone_proxy_config_edit(LinphoneProxyConfig *obj){
if (obj->publish && obj->publish_op){
- /*unpublish*/
- sal_publish_presence(obj->publish_op,NULL,NULL,0,(SalPresenceModel *)NULL);
- sal_op_release(obj->publish_op);
- obj->publish_op=NULL;
- }
- if (obj->reg_sendregister){
- /* unregister */
- if (obj->state == LinphoneRegistrationOk
- || obj->state == LinphoneRegistrationProgress) {
- sal_unregister(obj->op);
- } else {
- /*stop refresher*/
- if (obj->op) sal_op_stop_refreshing(obj->op);
- }
+ /*unpublish*/
+ sal_publish_presence(obj->publish_op,NULL,NULL,0,(SalPresenceModel *)NULL);
+ sal_op_release(obj->publish_op);
+ obj->publish_op=NULL;
}
+ /*store current config related to server location*/
+ linphone_proxy_config_store_server_config(obj);
+
+ /*stop refresher in any case*/
+ linphone_proxy_config_pause_register(obj);
}
void linphone_proxy_config_apply(LinphoneProxyConfig *obj,LinphoneCore *lc){
@@ -336,13 +397,21 @@ LinphoneAddress *guess_contact_for_register(LinphoneProxyConfig *obj){
return ret;
}
+/**
+ * unregister without moving the register_enable flag
+ */
+void _linphone_proxy_config_unregister(LinphoneProxyConfig *obj) {
+ if (obj->state == LinphoneRegistrationOk) {
+ sal_unregister(obj->op);
+ }
+}
static void linphone_proxy_config_register(LinphoneProxyConfig *obj){
if (obj->reg_sendregister){
LinphoneAddress* proxy=linphone_address_new(obj->reg_proxy);
char* proxy_string;
LinphoneAddress *contact;
-
+ ms_message("LinphoneProxyConfig [%p] about to register (LinphoneCore version: %s)",obj,linphone_core_get_version());
proxy_string=linphone_address_as_string_uri_only(proxy);
linphone_address_destroy(proxy);
if (obj->op)
@@ -360,8 +429,14 @@ static void linphone_proxy_config_register(LinphoneProxyConfig *obj){
}
ms_free(proxy_string);
} else {
- /*stop refresher, just in case*/
- if (obj->op) sal_op_stop_refreshing(obj->op);
+ /* unregister if registered*/
+ if (obj->state == LinphoneRegistrationProgress) {
+ linphone_proxy_config_set_state(obj,LinphoneRegistrationCleared,"Registration cleared");
+ }
+ _linphone_proxy_config_unregister(obj);
+
+
+
}
}
@@ -419,33 +494,43 @@ bool_t linphone_proxy_config_get_dial_escape_plus(const LinphoneProxyConfig *cfg
return cfg->dial_escape_plus;
}
-void linphone_proxy_config_enable_statistics(LinphoneProxyConfig *cfg, bool_t val){
- cfg->send_statistics = val;
+void linphone_proxy_config_enable_quality_reporting(LinphoneProxyConfig *cfg, bool_t val){
+ cfg->quality_reporting_enabled = val;
}
-bool_t linphone_proxy_config_send_statistics_enabled(LinphoneProxyConfig *cfg){
+bool_t linphone_proxy_config_quality_reporting_enabled(LinphoneProxyConfig *cfg){
// ensure that collector address is set too!
- return cfg->send_statistics && cfg->statistics_collector != NULL;
+ return cfg->quality_reporting_enabled && cfg->quality_reporting_collector != NULL;
}
-void linphone_proxy_config_set_statistics_collector(LinphoneProxyConfig *cfg, const char *collector){
+void linphone_proxy_config_set_quality_reporting_interval(LinphoneProxyConfig *cfg, uint8_t interval) {
+ cfg->quality_reporting_interval = interval;
+}
+
+int linphone_proxy_config_get_quality_reporting_interval(LinphoneProxyConfig *cfg) {
+ return cfg->quality_reporting_interval;
+}
+
+void linphone_proxy_config_set_quality_reporting_collector(LinphoneProxyConfig *cfg, const char *collector){
if (collector!=NULL && strlen(collector)>0){
LinphoneAddress *addr=linphone_address_new(collector);
if (!addr || linphone_address_get_username(addr)==NULL){
- ms_warning("Invalid sip collector identity: %s",collector);
- if (addr)
- linphone_address_destroy(addr);
+ ms_error("Invalid SIP collector URI: %s. Quality reporting will be DISABLED.",collector);
} else {
- if (cfg->statistics_collector != NULL)
- ms_free(cfg->statistics_collector);
- cfg->statistics_collector = ms_strdup(collector);
+ if (cfg->quality_reporting_collector != NULL){
+ ms_free(cfg->quality_reporting_collector);
+ }
+ cfg->quality_reporting_collector = ms_strdup(collector);
+ }
+
+ if (addr){
linphone_address_destroy(addr);
}
}
}
-const char *linphone_proxy_config_get_statistics_collector(const LinphoneProxyConfig *cfg){
- return cfg->statistics_collector;
+const char *linphone_proxy_config_get_quality_reporting_collector(const LinphoneProxyConfig *cfg){
+ return cfg->quality_reporting_collector;
}
@@ -843,7 +928,19 @@ int linphone_proxy_config_normalize_number(LinphoneProxyConfig *proxy, const cha
**/
int linphone_proxy_config_done(LinphoneProxyConfig *obj)
{
- if (!linphone_proxy_config_check(obj->lc,obj)) return -1;
+ if (!linphone_proxy_config_check(obj->lc,obj))
+ return -1;
+
+ /*check if server address as changed*/
+ if (linphone_proxy_config_is_server_config_changed(obj)) {
+ /* server config has changed, need to unregister from previous first*/
+ if (obj->op) {
+ _linphone_proxy_config_unregister(obj);
+ sal_op_set_user_pointer(obj->op,NULL); /*we don't want to receive status for this un register*/
+ sal_op_unref(obj->op); /*but we keep refresher to handle authentication if needed*/
+ obj->op=NULL;
+ }
+ }
obj->commit=TRUE;
linphone_proxy_config_write_all_to_config_file(obj->lc);
return 0;
@@ -908,7 +1005,7 @@ bool_t linphone_proxy_config_publish_enabled(const LinphoneProxyConfig *obj){
/**
* Returns the proxy's SIP address.
**/
-const char *linphone_proxy_config_get_addr(const LinphoneProxyConfig *obj){
+const char *linphone_proxy_config_get_server_addr(const LinphoneProxyConfig *obj){
return obj->reg_proxy;
}
@@ -947,7 +1044,7 @@ void linphone_proxy_config_set_contact_parameters(LinphoneProxyConfig *obj, cons
/**
* Set optional contact parameters that will be added to the contact information sent in the registration, inside the URI.
* @param obj the proxy config object
- * @param contact_params a string contaning the additional parameters in text form, like "myparam=something;myparam2=something_else"
+ * @param contact_uri_params a string containing the additional parameters in text form, like "myparam=something;myparam2=something_else"
*
* The main use case for this function is provide the proxy additional information regarding the user agent, like for example unique identifier or apple push id.
* As an example, the contact address in the SIP register sent will look like .
@@ -1006,7 +1103,7 @@ int linphone_core_add_proxy_config(LinphoneCore *lc, LinphoneProxyConfig *cfg){
void linphone_core_remove_proxy_config(LinphoneCore *lc, LinphoneProxyConfig *cfg){
/* check this proxy config is in the list before doing more*/
if (ms_list_find(lc->sip_conf.proxies,cfg)==NULL){
- ms_error("linphone_core_remove_proxy_config: LinphoneProxyConfig %p is not known by LinphoneCore (programming error?)",cfg);
+ ms_error("linphone_core_remove_proxy_config: LinphoneProxyConfig [%p] is not known by LinphoneCore (programming error?)",cfg);
return;
}
lc->sip_conf.proxies=ms_list_remove(lc->sip_conf.proxies,cfg);
@@ -1014,8 +1111,11 @@ void linphone_core_remove_proxy_config(LinphoneCore *lc, LinphoneProxyConfig *cf
lc->sip_conf.deleted_proxies=ms_list_append(lc->sip_conf.deleted_proxies,cfg);
cfg->deletion_date=ms_time(NULL);
if (cfg->state==LinphoneRegistrationOk){
- /* this will unREGISTER */
+ /* unREGISTER */
linphone_proxy_config_edit(cfg);
+ linphone_proxy_config_enable_register(cfg,FALSE);
+ linphone_proxy_config_done(cfg);
+ linphone_proxy_config_update(cfg); /*so that it has an effect*/
}
if (lc->default_proxy==cfg){
lc->default_proxy=NULL;
@@ -1099,9 +1199,6 @@ void linphone_proxy_config_write_to_config_file(LpConfig *config, LinphoneProxyC
if (obj->reg_route!=NULL){
lp_config_set_string(config,key,"reg_route",obj->reg_route);
}
- if (obj->statistics_collector!=NULL){
- lp_config_set_string(config,key,"statistics_collector",obj->statistics_collector);
- }
if (obj->reg_identity!=NULL){
lp_config_set_string(config,key,"reg_identity",obj->reg_identity);
}
@@ -1111,24 +1208,41 @@ void linphone_proxy_config_write_to_config_file(LpConfig *config, LinphoneProxyC
if (obj->contact_uri_params!=NULL){
lp_config_set_string(config,key,"contact_uri_parameters",obj->contact_uri_params);
}
+ if (obj->quality_reporting_collector!=NULL){
+ lp_config_set_string(config,key,"quality_reporting_collector",obj->quality_reporting_collector);
+ }
+ lp_config_set_int(config,key,"quality_reporting_enabled",obj->quality_reporting_enabled);
+ lp_config_set_int(config,key,"quality_reporting_interval",obj->quality_reporting_interval);
lp_config_set_int(config,key,"reg_expires",obj->expires);
lp_config_set_int(config,key,"reg_sendregister",obj->reg_sendregister);
lp_config_set_int(config,key,"publish",obj->publish);
+ lp_config_set_int(config, key, "avpf", obj->avpf_enabled);
+ lp_config_set_int(config, key, "avpf_rr_interval", obj->avpf_rr_interval);
lp_config_set_int(config,key,"dial_escape_plus",obj->dial_escape_plus);
- lp_config_set_int(config,key,"send_statistics",obj->send_statistics);
lp_config_set_string(config,key,"dial_prefix",obj->dial_prefix);
lp_config_set_int(config,key,"privacy",obj->privacy);
}
+#define CONFIGURE_STRING_VALUE(obj,config,key,param,param_name) \
+ {\
+ char* default_value = linphone_proxy_config_get_##param(obj)?ms_strdup(linphone_proxy_config_get_##param(obj)):NULL;\
+ linphone_proxy_config_set_##param(obj,lp_config_get_string(config,key,param_name,default_value)); \
+ if ( default_value) ms_free(default_value); \
+ }
-LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(LpConfig *config, int index)
+#define CONFIGURE_BOOL_VALUE(obj,config,key,param,param_name) \
+ linphone_proxy_config_enable_##param(obj,lp_config_get_int(config,key,param_name,linphone_proxy_config_##param##_enabled(obj)));
+
+#define CONFIGURE_INT_VALUE(obj,config,key,param,param_name) \
+ linphone_proxy_config_set_##param(obj,lp_config_get_int(config,key,param_name,linphone_proxy_config_get_##param(obj)));
+
+LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(LinphoneCore* lc, int index)
{
const char *tmp;
- const char *identity;
- const char *proxy;
LinphoneProxyConfig *cfg;
char key[50];
+ LpConfig *config=lc->config;
sprintf(key,"proxy_%i",index);
@@ -1136,39 +1250,33 @@ LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(LpConfig *config
return NULL;
}
- cfg=linphone_proxy_config_new();
+ cfg=linphone_core_create_proxy_config(lc);
- identity=lp_config_get_string(config,key,"reg_identity",NULL);
- proxy=lp_config_get_string(config,key,"reg_proxy",NULL);
+ CONFIGURE_STRING_VALUE(cfg,config,key,identity,"reg_identity")
+ CONFIGURE_STRING_VALUE(cfg,config,key,server_addr,"reg_proxy")
+ CONFIGURE_STRING_VALUE(cfg,config,key,route,"reg_route")
- linphone_proxy_config_set_identity(cfg,identity);
- linphone_proxy_config_set_server_addr(cfg,proxy);
+ CONFIGURE_BOOL_VALUE(cfg,config,key,quality_reporting,"quality_reporting_enabled")
- tmp=lp_config_get_string(config,key,"reg_route",NULL);
- if (tmp!=NULL) linphone_proxy_config_set_route(cfg,tmp);
+ CONFIGURE_STRING_VALUE(cfg,config,key,quality_reporting_collector,"quality_reporting_collector")
- tmp=lp_config_get_string(config,key,"statistics_collector",NULL);
- if (tmp!=NULL) linphone_proxy_config_set_statistics_collector(cfg,tmp);
- linphone_proxy_config_enable_statistics(cfg,lp_config_get_int(config,key,"send_statistics",0));
+ CONFIGURE_INT_VALUE(cfg,config,key,quality_reporting_interval,"quality_reporting_interval")
- linphone_proxy_config_set_contact_parameters(cfg,lp_config_get_string(config,key,"contact_parameters",NULL));
+ CONFIGURE_STRING_VALUE(cfg,config,key,contact_parameters,"contact_parameters")
+ CONFIGURE_STRING_VALUE(cfg,config,key,contact_uri_parameters,"contact_uri_parameters")
- linphone_proxy_config_set_contact_uri_parameters(cfg,lp_config_get_string(config,key,"contact_uri_parameters",NULL));
-
- linphone_proxy_config_expires(cfg,lp_config_get_int(config,key,"reg_expires",lp_config_get_default_int(config,"proxy","reg_expires",600)));
- linphone_proxy_config_enableregister(cfg,lp_config_get_int(config,key,"reg_sendregister",0));
-
- linphone_proxy_config_enable_publish(cfg,lp_config_get_int(config,key,"publish",0));
-
- linphone_proxy_config_set_dial_escape_plus(cfg,lp_config_get_int(config,key,"dial_escape_plus",lp_config_get_default_int(config,"proxy","dial_escape_plus",0)));
- linphone_proxy_config_set_dial_prefix(cfg,lp_config_get_string(config,key,"dial_prefix",lp_config_get_default_string(config,"proxy","dial_prefix",NULL)));
+ CONFIGURE_INT_VALUE(cfg,config,key,expires,"reg_expires")
+ CONFIGURE_BOOL_VALUE(cfg,config,key,register,"reg_sendregister")
+ CONFIGURE_BOOL_VALUE(cfg,config,key,publish,"publish")
+ CONFIGURE_BOOL_VALUE(cfg,config,key,avpf,"avpf")
+ CONFIGURE_INT_VALUE(cfg,config,key,avpf_rr_interval,"avpf_rr_interval")
+ CONFIGURE_INT_VALUE(cfg,config,key,dial_escape_plus,"dial_escape_plus")
+ CONFIGURE_STRING_VALUE(cfg,config,key,dial_prefix,"dial_prefix")
tmp=lp_config_get_string(config,key,"type",NULL);
if (tmp!=NULL && strlen(tmp)>0)
linphone_proxy_config_set_sip_setup(cfg,tmp);
-
- linphone_proxy_config_set_privacy(cfg,lp_config_get_int(config,key,"privacy",lp_config_get_default_int(config,"proxy","privacy",LinphonePrivacyDefault)));
-
+ CONFIGURE_INT_VALUE(cfg,config,key,privacy,"privacy")
return cfg;
}
@@ -1472,3 +1580,20 @@ int linphone_proxy_config_get_publish_expires(const LinphoneProxyConfig *obj) {
}
}
+
+void linphone_proxy_config_enable_avpf(LinphoneProxyConfig *cfg, bool_t enable) {
+ cfg->avpf_enabled = enable;
+}
+
+bool_t linphone_proxy_config_avpf_enabled(LinphoneProxyConfig *cfg) {
+ return cfg->avpf_enabled;
+}
+
+void linphone_proxy_config_set_avpf_rr_interval(LinphoneProxyConfig *cfg, uint8_t interval) {
+ if (interval > 5) interval = 5;
+ cfg->avpf_rr_interval = interval;
+}
+
+uint8_t linphone_proxy_config_get_avpf_rr_interval(const LinphoneProxyConfig *cfg) {
+ return cfg->avpf_rr_interval;
+}
diff --git a/coreapi/quality_reporting.c b/coreapi/quality_reporting.c
index 7da31f3d1..63944e55d 100644
--- a/coreapi/quality_reporting.c
+++ b/coreapi/quality_reporting.c
@@ -28,18 +28,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include
-/***************************************************************************
- * TODO / REMINDER LIST
- ****************************************************************************/
-/*For codecs that are able to change sample rates, the lowest and highest sample rates MUST be reported (e.g., 8000;16000).
-moslq == moscq
-video: what happens if doing stop/resume?
-one time value: average? worst value?
-rlq value: need algo to compute it*/
-/***************************************************************************
- * END OF TODO / REMINDER LIST
- ****************************************************************************/
-
#define STR_REASSIGN(dest, src) {\
if (dest != NULL) \
ms_free(dest); \
@@ -73,13 +61,13 @@ static void append_to_buffer_valist(char **buff, size_t *buff_size, size_t *offs
/*if we are out of memory, we add some size to buffer*/
if (ret == BELLE_SIP_BUFFER_OVERFLOW) {
/*some compilers complain that size_t cannot be formatted as unsigned long, hence forcing cast*/
- ms_warning("Buffer was too small to contain the whole report - doubling its size from %lu to %lu",
- (unsigned long)*buff_size, (unsigned long)2 * *buff_size);
+ ms_warning("QualityReporting: Buffer was too small to contain the whole report - increasing its size from %lu to %lu",
+ (unsigned long)*buff_size, (unsigned long)*buff_size + 2048);
*buff_size += 2048;
*buff = (char *) ms_realloc(*buff, *buff_size);
*offset = prevoffset;
- /*recall myself since we did not write all things into the buffer but
+ /*recall itself since we did not write all things into the buffer but
only a part of it*/
append_to_buffer_valist(buff, buff_size, offset, fmt, args);
}
@@ -92,44 +80,84 @@ static void append_to_buffer(char **buff, size_t *buff_size, size_t *offset, con
va_end(args);
}
+static void reset_avg_metrics(reporting_session_report_t * report){
+ int i;
+ reporting_content_metrics_t * metrics[2] = {&report->local_metrics, &report->remote_metrics};
+
+ for (i = 0; i < 2; i++) {
+ metrics[i]->rtcp_sr_count = 0;
+ metrics[i]->rtcp_xr_count = 0;
+ metrics[i]->jitter_buffer.nominal = 0;
+ metrics[i]->jitter_buffer.max = 0;
+
+ metrics[i]->quality_estimates.moslq = 0;
+ metrics[i]->quality_estimates.moscq = 0;
+
+ metrics[i]->delay.round_trip_delay = 0;
+ }
+ report->last_report_date = ms_time(NULL);
+}
#define APPEND_IF_NOT_NULL_STR(buffer, size, offset, fmt, arg) if (arg != NULL) append_to_buffer(buffer, size, offset, fmt, arg)
#define APPEND_IF_NUM_IN_RANGE(buffer, size, offset, fmt, arg, inf, sup) if (inf <= arg && arg <= sup) append_to_buffer(buffer, size, offset, fmt, arg)
#define APPEND_IF(buffer, size, offset, fmt, arg, cond) if (cond) append_to_buffer(buffer, size, offset, fmt, arg)
#define IF_NUM_IN_RANGE(num, inf, sup, statement) if (inf <= num && num <= sup) statement
-static bool_t are_metrics_filled(const reporting_content_metrics_t rm) {
- IF_NUM_IN_RANGE(rm.packet_loss.network_packet_loss_rate, 0, 255, return TRUE);
- IF_NUM_IN_RANGE(rm.packet_loss.jitter_buffer_discard_rate, 0, 255, return TRUE);
- IF_NUM_IN_RANGE(rm.quality_estimates.moslq, 1, 5, return TRUE);
- IF_NUM_IN_RANGE(rm.quality_estimates.moscq, 1, 5, return TRUE);
+#define METRICS_PACKET_LOSS 1 << 0
+#define METRICS_QUALITY_ESTIMATES 1 << 1
+#define METRICS_SESSION_DESCRIPTION 1 << 2
+#define METRICS_JITTER_BUFFER 1 << 3
+#define METRICS_DELAY 1 << 4
+#define METRICS_SIGNAL 1 << 5
+#define METRICS_ADAPTIVE_ALGORITHM 1 << 6
- /*since these are same values than local ones, do not check them*/
- /*if (rm.session_description.payload_type != -1) return TRUE;*/
- /*if (rm.session_description.payload_desc != NULL) return TRUE;*/
- /*if (rm.session_description.sample_rate != -1) return TRUE;*/
- if (rm.session_description.frame_duration != -1) return TRUE;
- /*if (rm.session_description.fmtp != NULL) return TRUE;*/
- if (rm.session_description.packet_loss_concealment != -1) return TRUE;
+static uint8_t are_metrics_filled(const reporting_content_metrics_t rm) {
+ uint8_t ret = 0;
- IF_NUM_IN_RANGE(rm.jitter_buffer.adaptive, 0, 3, return TRUE);
- IF_NUM_IN_RANGE(rm.jitter_buffer.nominal, 0, 65535, return TRUE);
- IF_NUM_IN_RANGE(rm.jitter_buffer.max, 0, 65535, return TRUE);
- IF_NUM_IN_RANGE(rm.jitter_buffer.abs_max, 0, 65535, return TRUE);
+ IF_NUM_IN_RANGE(rm.packet_loss.network_packet_loss_rate, 0, 255, ret|=METRICS_PACKET_LOSS);
+ IF_NUM_IN_RANGE(rm.packet_loss.jitter_buffer_discard_rate, 0, 255, ret|=METRICS_PACKET_LOSS);
- IF_NUM_IN_RANGE(rm.delay.round_trip_delay, 0, 65535, return TRUE);
- IF_NUM_IN_RANGE(rm.delay.end_system_delay, 0, 65535, return TRUE);
- IF_NUM_IN_RANGE(rm.delay.symm_one_way_delay, 0, 65535, return TRUE);
- IF_NUM_IN_RANGE(rm.delay.interarrival_jitter, 0, 65535, return TRUE);
- IF_NUM_IN_RANGE(rm.delay.mean_abs_jitter, 0, 65535, return TRUE);
+ if (rm.session_description.payload_type != -1) ret|=METRICS_SESSION_DESCRIPTION;
+ if (rm.session_description.payload_desc != NULL) ret|=METRICS_SESSION_DESCRIPTION;
+ if (rm.session_description.sample_rate != -1) ret|=METRICS_SESSION_DESCRIPTION;
+ if (rm.session_description.fmtp != NULL) ret|=METRICS_SESSION_DESCRIPTION;
- if (rm.signal.level != 127) return TRUE;
- if (rm.signal.noise_level != 127) return TRUE;
+ IF_NUM_IN_RANGE(rm.jitter_buffer.adaptive, 0, 3, ret|=METRICS_JITTER_BUFFER);
+ IF_NUM_IN_RANGE(rm.jitter_buffer.abs_max, 0, 65535, ret|=METRICS_JITTER_BUFFER);
- IF_NUM_IN_RANGE(rm.quality_estimates.rlq, 1, 120, return TRUE);
- IF_NUM_IN_RANGE(rm.quality_estimates.rcq, 1, 120, return TRUE);
+ IF_NUM_IN_RANGE(rm.delay.end_system_delay, 0, 65535, ret|=METRICS_DELAY);
+ IF_NUM_IN_RANGE(rm.delay.interarrival_jitter, 0, 65535, ret|=METRICS_DELAY);
+ IF_NUM_IN_RANGE(rm.delay.mean_abs_jitter, 0, 65535, ret|=METRICS_DELAY);
- return FALSE;
+ if (rm.signal.level != 127) ret|=METRICS_SIGNAL;
+ if (rm.signal.noise_level != 127) ret|=METRICS_SIGNAL;
+
+ IF_NUM_IN_RANGE(rm.quality_estimates.moslq, 1, 5, ret|=METRICS_QUALITY_ESTIMATES);
+ IF_NUM_IN_RANGE(rm.quality_estimates.moscq, 1, 5, ret|=METRICS_QUALITY_ESTIMATES);
+
+ if (rm.rtcp_xr_count>0){
+ IF_NUM_IN_RANGE(rm.jitter_buffer.nominal/rm.rtcp_xr_count, 0, 65535, ret|=METRICS_JITTER_BUFFER);
+ IF_NUM_IN_RANGE(rm.jitter_buffer.max/rm.rtcp_xr_count, 0, 65535, ret|=METRICS_JITTER_BUFFER);
+ }
+ if (rm.rtcp_sr_count+rm.rtcp_xr_count>0){
+ IF_NUM_IN_RANGE(rm.delay.round_trip_delay/(rm.rtcp_sr_count+rm.rtcp_xr_count), 0, 65535, ret|=METRICS_DELAY);
+ }
+
+ return ret;
+}
+
+static bool_t quality_reporting_enabled(const LinphoneCall * call) {
+ return (call->dest_proxy != NULL && linphone_proxy_config_quality_reporting_enabled(call->dest_proxy));
+}
+
+static bool_t media_report_enabled(LinphoneCall * call, int stats_type){
+ if (! quality_reporting_enabled(call))
+ return FALSE;
+
+ if (stats_type == LINPHONE_CALL_STATS_VIDEO && !linphone_call_params_video_enabled(linphone_call_get_current_params(call)))
+ return FALSE;
+
+ return (call->log->reporting.reports[stats_type] != NULL);
}
static void append_metrics_to_buffer(char ** buffer, size_t * size, size_t * offset, const reporting_content_metrics_t rm) {
@@ -140,79 +168,83 @@ static void append_metrics_to_buffer(char ** buffer, size_t * size, size_t * off
/*char * gap_loss_density_str = NULL;*/
char * moslq_str = NULL;
char * moscq_str = NULL;
+ uint8_t available_metrics = are_metrics_filled(rm);
if (rm.timestamps.start > 0)
timestamps_start_str = linphone_timestamp_to_rfc3339_string(rm.timestamps.start);
if (rm.timestamps.stop > 0)
timestamps_stop_str = linphone_timestamp_to_rfc3339_string(rm.timestamps.stop);
- IF_NUM_IN_RANGE(rm.packet_loss.network_packet_loss_rate, 0, 255, network_packet_loss_rate_str = float_to_one_decimal_string(rm.packet_loss.network_packet_loss_rate / 256));
- IF_NUM_IN_RANGE(rm.packet_loss.jitter_buffer_discard_rate, 0, 255, jitter_buffer_discard_rate_str = float_to_one_decimal_string(rm.packet_loss.jitter_buffer_discard_rate / 256));
- /*IF_NUM_IN_RANGE(rm.burst_gap_loss.gap_loss_density, 0, 10, gap_loss_density_str = float_to_one_decimal_string(rm.burst_gap_loss.gap_loss_density));*/
- IF_NUM_IN_RANGE(rm.quality_estimates.moslq, 1, 5, moslq_str = float_to_one_decimal_string(rm.quality_estimates.moslq));
- IF_NUM_IN_RANGE(rm.quality_estimates.moscq, 1, 5, moscq_str = float_to_one_decimal_string(rm.quality_estimates.moscq));
-
append_to_buffer(buffer, size, offset, "Timestamps:");
APPEND_IF_NOT_NULL_STR(buffer, size, offset, " START=%s", timestamps_start_str);
APPEND_IF_NOT_NULL_STR(buffer, size, offset, " STOP=%s", timestamps_stop_str);
- append_to_buffer(buffer, size, offset, "\r\nSessionDesc:");
- APPEND_IF(buffer, size, offset, " PT=%d", rm.session_description.payload_type, rm.session_description.payload_type != -1);
- APPEND_IF_NOT_NULL_STR(buffer, size, offset, " PD=%s", rm.session_description.payload_desc);
- APPEND_IF(buffer, size, offset, " SR=%d", rm.session_description.sample_rate, rm.session_description.sample_rate != -1);
- APPEND_IF(buffer, size, offset, " FD=%d", rm.session_description.frame_duration, rm.session_description.frame_duration != -1);
- /*append_to_buffer(buffer, size, offset, " FO=%d", rm.session_description.frame_ocets);*/
- /*append_to_buffer(buffer, size, offset, " FPP=%d", rm.session_description.frames_per_sec);*/
- /*append_to_buffer(buffer, size, offset, " PPS=%d", rm.session_description.packets_per_sec);*/
- APPEND_IF_NOT_NULL_STR(buffer, size, offset, " FMTP=\"%s\"", rm.session_description.fmtp);
- APPEND_IF(buffer, size, offset, " PLC=%d", rm.session_description.packet_loss_concealment, rm.session_description.packet_loss_concealment != -1);
- /*APPEND_IF_NOT_NULL_STR(buffer, size, offset, " SSUP=%s", rm.session_description.silence_suppression_state);*/
+ if ((available_metrics & METRICS_SESSION_DESCRIPTION) != 0){
+ append_to_buffer(buffer, size, offset, "\r\nSessionDesc:");
+ APPEND_IF(buffer, size, offset, " PT=%d", rm.session_description.payload_type, rm.session_description.payload_type != -1);
+ APPEND_IF_NOT_NULL_STR(buffer, size, offset, " PD=%s", rm.session_description.payload_desc);
+ APPEND_IF(buffer, size, offset, " SR=%d", rm.session_description.sample_rate, rm.session_description.sample_rate != -1);
+ APPEND_IF(buffer, size, offset, " FD=%d", rm.session_description.frame_duration, rm.session_description.frame_duration != -1);
+ APPEND_IF_NOT_NULL_STR(buffer, size, offset, " FMTP=\"%s\"", rm.session_description.fmtp);
+ APPEND_IF(buffer, size, offset, " PLC=%d", rm.session_description.packet_loss_concealment, rm.session_description.packet_loss_concealment != -1);
+ }
- append_to_buffer(buffer, size, offset, "\r\nJitterBuffer:");
- APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " JBA=%d", rm.jitter_buffer.adaptive, 0, 3);
- /*APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " JBR=%d", rm.jitter_buffer.rate, 0, 15);*/
- APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " JBN=%d", rm.jitter_buffer.nominal, 0, 65535);
- APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " JBM=%d", rm.jitter_buffer.max, 0, 65535);
- APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " JBX=%d", rm.jitter_buffer.abs_max, 0, 65535);
+ if ((available_metrics & METRICS_JITTER_BUFFER) != 0){
+ append_to_buffer(buffer, size, offset, "\r\nJitterBuffer:");
+ APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " JBA=%d", rm.jitter_buffer.adaptive, 0, 3);
+ if (rm.rtcp_xr_count){
+ APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " JBN=%d", rm.jitter_buffer.nominal/rm.rtcp_xr_count, 0, 65535);
+ APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " JBM=%d", rm.jitter_buffer.max/rm.rtcp_xr_count, 0, 65535);
+ }
+ APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " JBX=%d", rm.jitter_buffer.abs_max, 0, 65535);
- append_to_buffer(buffer, size, offset, "\r\nPacketLoss:");
- APPEND_IF_NOT_NULL_STR(buffer, size, offset, " NLR=%s", network_packet_loss_rate_str);
- APPEND_IF_NOT_NULL_STR(buffer, size, offset, " JDR=%s", jitter_buffer_discard_rate_str);
+ append_to_buffer(buffer, size, offset, "\r\nPacketLoss:");
+ IF_NUM_IN_RANGE(rm.packet_loss.network_packet_loss_rate, 0, 255, network_packet_loss_rate_str = float_to_one_decimal_string(rm.packet_loss.network_packet_loss_rate / 256));
+ IF_NUM_IN_RANGE(rm.packet_loss.jitter_buffer_discard_rate, 0, 255, jitter_buffer_discard_rate_str = float_to_one_decimal_string(rm.packet_loss.jitter_buffer_discard_rate / 256));
- /*append_to_buffer(buffer, size, offset, "\r\nBurstGapLoss:");*/
- /* append_to_buffer(buffer, size, offset, " BLD=%d", rm.burst_gap_loss.burst_loss_density);*/
- /* append_to_buffer(buffer, size, offset, " BD=%d", rm.burst_gap_loss.burst_duration);*/
- /* APPEND_IF_NOT_NULL_STR(buffer, size, offset, " GLD=%s", gap_loss_density_str);*/
- /* append_to_buffer(buffer, size, offset, " GD=%d", rm.burst_gap_loss.gap_duration);*/
- /* append_to_buffer(buffer, size, offset, " GMIN=%d", rm.burst_gap_loss.min_gap_threshold);*/
+ APPEND_IF_NOT_NULL_STR(buffer, size, offset, " NLR=%s", network_packet_loss_rate_str);
+ APPEND_IF_NOT_NULL_STR(buffer, size, offset, " JDR=%s", jitter_buffer_discard_rate_str);
+ }
- append_to_buffer(buffer, size, offset, "\r\nDelay:");
- APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " RTD=%d", rm.delay.round_trip_delay, 0, 65535);
- APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " ESD=%d", rm.delay.end_system_delay, 0, 65535);
- /*APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " OWD=%d", rm.delay.one_way_delay, 0, 65535);*/
- APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " SOWD=%d", rm.delay.symm_one_way_delay, 0, 65535);
- APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " IAJ=%d", rm.delay.interarrival_jitter, 0, 65535);
- APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " MAJ=%d", rm.delay.mean_abs_jitter, 0, 65535);
+ /*append_to_buffer(buffer, size, offset, "\r\nBurstGapLoss:");*/
+ /*IF_NUM_IN_RANGE(rm.burst_gap_loss.gap_loss_density, 0, 10, gap_loss_density_str = float_to_one_decimal_string(rm.burst_gap_loss.gap_loss_density));*/
+ /* append_to_buffer(buffer, size, offset, " BLD=%d", rm.burst_gap_loss.burst_loss_density);*/
+ /* append_to_buffer(buffer, size, offset, " BD=%d", rm.burst_gap_loss.burst_duration);*/
+ /* APPEND_IF_NOT_NULL_STR(buffer, size, offset, " GLD=%s", gap_loss_density_str);*/
+ /* append_to_buffer(buffer, size, offset, " GD=%d", rm.burst_gap_loss.gap_duration);*/
+ /* append_to_buffer(buffer, size, offset, " GMIN=%d", rm.burst_gap_loss.min_gap_threshold);*/
- append_to_buffer(buffer, size, offset, "\r\nSignal:");
- APPEND_IF(buffer, size, offset, " SL=%d", rm.signal.level, rm.signal.level != 127);
- APPEND_IF(buffer, size, offset, " NL=%d", rm.signal.noise_level, rm.signal.noise_level != 127);
- /*append_to_buffer(buffer, size, offset, " RERL=%d", rm.signal.residual_echo_return_loss);*/
+ if ((available_metrics & METRICS_DELAY) != 0){
+ append_to_buffer(buffer, size, offset, "\r\nDelay:");
+ if (rm.rtcp_xr_count+rm.rtcp_sr_count){
+ APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " RTD=%d", rm.delay.round_trip_delay/(rm.rtcp_xr_count+rm.rtcp_sr_count), 0, 65535);
+ }
+ APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " ESD=%d", rm.delay.end_system_delay, 0, 65535);
+ APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " IAJ=%d", rm.delay.interarrival_jitter, 0, 65535);
+ APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " MAJ=%d", rm.delay.mean_abs_jitter, 0, 65535);
+ }
+
+ if ((available_metrics & METRICS_SIGNAL) != 0){
+ append_to_buffer(buffer, size, offset, "\r\nSignal:");
+ APPEND_IF(buffer, size, offset, " SL=%d", rm.signal.level, rm.signal.level != 127);
+ APPEND_IF(buffer, size, offset, " NL=%d", rm.signal.noise_level, rm.signal.noise_level != 127);
+ }
+
+ /*if quality estimates metrics are available, rtcp_xr_count should be always not null*/
+ if ((available_metrics & METRICS_QUALITY_ESTIMATES) != 0){
+ IF_NUM_IN_RANGE(rm.quality_estimates.moslq, 1, 5, moslq_str = float_to_one_decimal_string(rm.quality_estimates.moslq));
+ IF_NUM_IN_RANGE(rm.quality_estimates.moscq, 1, 5, moscq_str = float_to_one_decimal_string(rm.quality_estimates.moscq));
+
+ append_to_buffer(buffer, size, offset, "\r\nQualityEst:");
+ APPEND_IF_NOT_NULL_STR(buffer, size, offset, " MOSLQ=%s", moslq_str);
+ APPEND_IF_NOT_NULL_STR(buffer, size, offset, " MOSCQ=%s", moscq_str);
+ }
+
+ if (rm.user_agent!=NULL){
+ append_to_buffer(buffer, size, offset, "\r\nLinphoneExt:");
+ APPEND_IF_NOT_NULL_STR(buffer, size, offset, " UA=\"%s\"", rm.user_agent);
+ }
- append_to_buffer(buffer, size, offset, "\r\nQualityEst:");
- APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " RLQ=%d", rm.quality_estimates.rlq, 1, 120);
- /*APPEND_IF_NOT_NULL_STR(buffer, size, offset, " RLQEstAlg=%s", rm.quality_estimates.rlqestalg);*/
- APPEND_IF_NUM_IN_RANGE(buffer, size, offset, " RCQ=%d", rm.quality_estimates.rcq, 1, 120);
- /*APPEND_IF_NOT_NULL_STR(buffer, size, offset, " RCQEstAlgo=%s", rm.quality_estimates.rcqestalg);*/
- /*append_to_buffer(buffer, size, offset, " EXTRI=%d", rm.quality_estimates.extri);*/
- /*APPEND_IF_NOT_NULL_STR(buffer, size, offset, " ExtRIEstAlg=%s", rm.quality_estimates.extriestalg);*/
- /*append_to_buffer(buffer, size, offset, " EXTRO=%d", rm.quality_estimates.extro);*/
- /*APPEND_IF_NOT_NULL_STR(buffer, size, offset, " ExtROEstAlg=%s", rm.quality_estimates.extroutestalg);*/
- APPEND_IF_NOT_NULL_STR(buffer, size, offset, " MOSLQ=%s", moslq_str);
- /*APPEND_IF_NOT_NULL_STR(buffer, size, offset, " MOSLQEstAlgo=%s", rm.quality_estimates.moslqestalg);*/
- APPEND_IF_NOT_NULL_STR(buffer, size, offset, " MOSCQ=%s", moscq_str);
- /*APPEND_IF_NOT_NULL_STR(buffer, size, offset, " MOSCQEstAlgo=%s", rm.quality_estimates.moscqestalg);*/
- /*APPEND_IF_NOT_NULL_STR(buffer, size, offset, " QoEEstAlg=%s", rm.quality_estimates.qoestalg);*/
append_to_buffer(buffer, size, offset, "\r\n");
ms_free(timestamps_start_str);
@@ -224,151 +256,252 @@ static void append_metrics_to_buffer(char ** buffer, size_t * size, size_t * off
ms_free(moscq_str);
}
-static void reporting_publish(const LinphoneCall* call, const reporting_session_report_t * report) {
+static int send_report(LinphoneCall* call, reporting_session_report_t * report, const char * report_event) {
LinphoneContent content = {0};
LinphoneAddress *addr;
int expires = -1;
size_t offset = 0;
size_t size = 2048;
char * buffer;
+ int ret = 0;
+
+ /*if we are on a low bandwidth network, do not send reports to not overload it*/
+ if (linphone_call_params_low_bandwidth_enabled(linphone_call_get_current_params(call))){
+ ms_warning("QualityReporting[%p]: Avoid sending reports on low bandwidth network", call);
+ ret = 1;
+ goto end;
+ }
/*if the call was hung up too early, we might have invalid IPs information
in that case, we abort the report since it's not useful data*/
if (report->info.local_addr.ip == NULL || strlen(report->info.local_addr.ip) == 0
|| report->info.remote_addr.ip == NULL || strlen(report->info.remote_addr.ip) == 0) {
- ms_warning("The call was hang up too early (duration: %d sec) and IP could "
- "not be retrieved so dropping this report", linphone_call_get_duration(call));
- return;
+ ms_warning("QualityReporting[%p]: Trying to submit a %s too early (call duration: %d sec) but %s IP could "
+ "not be retrieved so dropping this report"
+ , call
+ , report_event
+ , linphone_call_get_duration(call)
+ , (report->info.local_addr.ip == NULL || strlen(report->info.local_addr.ip) == 0) ? "local" : "remote");
+ ret = 2;
+ goto end;
+ }
+
+ addr = linphone_address_new(linphone_proxy_config_get_quality_reporting_collector(call->dest_proxy));
+ if (addr == NULL) {
+ ms_warning("QualityReporting[%p]: Asked to submit reporting statistics but no collector address found"
+ , call);
+ ret = 3;
+ goto end;
}
buffer = (char *) ms_malloc(size);
content.type = ms_strdup("application");
content.subtype = ms_strdup("vq-rtcpxr");
- append_to_buffer(&buffer, &size, &offset, "VQSessionReport: CallTerm\r\n");
+ append_to_buffer(&buffer, &size, &offset, "%s\r\n", report_event);
append_to_buffer(&buffer, &size, &offset, "CallID: %s\r\n", report->info.call_id);
- append_to_buffer(&buffer, &size, &offset, "LocalID: %s\r\n", report->info.local_id);
- append_to_buffer(&buffer, &size, &offset, "RemoteID: %s\r\n", report->info.remote_id);
+ append_to_buffer(&buffer, &size, &offset, "LocalID: %s\r\n", report->info.local_addr.id);
+ append_to_buffer(&buffer, &size, &offset, "RemoteID: %s\r\n", report->info.remote_addr.id);
append_to_buffer(&buffer, &size, &offset, "OrigID: %s\r\n", report->info.orig_id);
- APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, "LocalGroup: %s\r\n", report->info.local_group);
- APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, "RemoteGroup: %s\r\n", report->info.remote_group);
- append_to_buffer(&buffer, &size, &offset, "LocalAddr: IP=%s PORT=%d SSRC=%d\r\n", report->info.local_addr.ip, report->info.local_addr.port, report->info.local_addr.ssrc);
- APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, "LocalMAC: %s\r\n", report->info.local_mac_addr);
- append_to_buffer(&buffer, &size, &offset, "RemoteAddr: IP=%s PORT=%d SSRC=%d\r\n", report->info.remote_addr.ip, report->info.remote_addr.port, report->info.remote_addr.ssrc);
- APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, "RemoteMAC: %s\r\n", report->info.remote_mac_addr);
+ APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, "LocalGroup: %s\r\n", report->info.local_addr.group);
+ APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, "RemoteGroup: %s\r\n", report->info.remote_addr.group);
+ append_to_buffer(&buffer, &size, &offset, "LocalAddr: IP=%s PORT=%d SSRC=%u\r\n", report->info.local_addr.ip, report->info.local_addr.port, report->info.local_addr.ssrc);
+ APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, "LocalMAC: %s\r\n", report->info.local_addr.mac);
+ append_to_buffer(&buffer, &size, &offset, "RemoteAddr: IP=%s PORT=%d SSRC=%u\r\n", report->info.remote_addr.ip, report->info.remote_addr.port, report->info.remote_addr.ssrc);
+ APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, "RemoteMAC: %s\r\n", report->info.remote_addr.mac);
append_to_buffer(&buffer, &size, &offset, "LocalMetrics:\r\n");
append_metrics_to_buffer(&buffer, &size, &offset, report->local_metrics);
- if (are_metrics_filled(report->remote_metrics)) {
+ if (are_metrics_filled(report->remote_metrics)!=0) {
append_to_buffer(&buffer, &size, &offset, "RemoteMetrics:\r\n");
append_metrics_to_buffer(&buffer, &size, &offset, report->remote_metrics);
}
APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, "DialogID: %s\r\n", report->dialog_id);
- content.data = buffer;
- content.size = strlen((char*)content.data);
-
-
- addr = linphone_address_new(call->dest_proxy->statistics_collector);
- if (addr != NULL) {
- linphone_core_publish(call->core, addr, "vq-rtcpxr", expires, &content);
- linphone_address_destroy(addr);
- } else {
- ms_warning("Asked to submit reporting statistics but no collector address found");
+ if (report->qos_analyzer.timestamp!=NULL){
+ append_to_buffer(&buffer, &size, &offset, "AdaptiveAlg:");
+ APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, " NAME=\"%s\"", report->qos_analyzer.name);
+ APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, " TS=\"%s\"", report->qos_analyzer.timestamp);
+ APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, " IN_LEG=\"%s\"", report->qos_analyzer.input_leg);
+ APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, " IN=\"%s\"", report->qos_analyzer.input);
+ APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, " OUT_LEG=\"%s\"", report->qos_analyzer.output_leg);
+ APPEND_IF_NOT_NULL_STR(&buffer, &size, &offset, " OUT=\"%s\"", report->qos_analyzer.output);
+ append_to_buffer(&buffer, &size, &offset, "\r\n");
}
+ content.data = buffer;
+ content.size = strlen(buffer);
+
+ if (call->log->reporting.on_report_sent != NULL){
+ call->log->reporting.on_report_sent(
+ call,
+ (report==call->log->reporting.reports[0])?LINPHONE_CALL_STATS_AUDIO:LINPHONE_CALL_STATS_VIDEO,
+ &content);
+ }
+
+ if (! linphone_core_publish(call->core, addr, "vq-rtcpxr", expires, &content)){
+ ret=4;
+ } else {
+ reset_avg_metrics(report);
+ STR_REASSIGN(report->qos_analyzer.timestamp, NULL);
+ STR_REASSIGN(report->qos_analyzer.input_leg, NULL);
+ STR_REASSIGN(report->qos_analyzer.input, NULL);
+ STR_REASSIGN(report->qos_analyzer.output_leg, NULL);
+ STR_REASSIGN(report->qos_analyzer.output, NULL);
+ }
+
+ linphone_address_destroy(addr);
+
linphone_content_uninit(&content);
+
+ end:
+ ms_message("QualityReporting[%p]: Send '%s' with status %d",
+ call,
+ report_event,
+ ret
+ );
+
+ return ret;
}
static const SalStreamDescription * get_media_stream_for_desc(const SalMediaDescription * smd, SalStreamType sal_stream_type) {
int count;
if (smd != NULL) {
- for (count = 0; count < smd->n_total_streams; ++count) {
+ for (count = 0; count < smd->nb_streams; ++count) {
if (smd->streams[count].type == sal_stream_type) {
return &smd->streams[count];
}
}
}
- if (smd == NULL || count == smd->n_total_streams) {
- ms_warning("Could not find the associated stream of type %d", sal_stream_type);
- }
-
return NULL;
}
-static void reporting_update_ip(LinphoneCall * call, int stats_type) {
+static void update_ip(LinphoneCall * call, int stats_type) {
SalStreamType sal_stream_type = (stats_type == LINPHONE_CALL_STATS_AUDIO) ? SalAudio : SalVideo;
- if (call->log->reports[stats_type] != NULL) {
- const SalStreamDescription * local_desc = get_media_stream_for_desc(call->localdesc, sal_stream_type);
- const SalStreamDescription * remote_desc = get_media_stream_for_desc(sal_call_get_remote_media_description(call->op), sal_stream_type);
+ const SalStreamDescription * local_desc = get_media_stream_for_desc(call->localdesc, sal_stream_type);
+ const SalStreamDescription * remote_desc = get_media_stream_for_desc(sal_call_get_remote_media_description(call->op), sal_stream_type);
- /*local info are always up-to-date and correct*/
- if (local_desc != NULL) {
- call->log->reports[stats_type]->info.local_addr.port = local_desc->rtp_port;
- STR_REASSIGN(call->log->reports[stats_type]->info.local_addr.ip, ms_strdup(local_desc->rtp_addr));
+ if (local_desc != NULL) {
+ /*since this function might be called for video stream AFTER it has been uninitialized, local description might
+ be invalid. In any other case, IP/port should be always filled and valid*/
+ if (local_desc->rtp_addr != NULL && strlen(local_desc->rtp_addr) > 0) {
+ call->log->reporting.reports[stats_type]->info.local_addr.port = local_desc->rtp_port;
+ STR_REASSIGN(call->log->reporting.reports[stats_type]->info.local_addr.ip, ms_strdup(local_desc->rtp_addr));
}
+ }
- if (remote_desc != NULL) {
- /*port is always stored in stream description struct*/
- call->log->reports[stats_type]->info.remote_addr.port = remote_desc->rtp_port;
+ if (remote_desc != NULL) {
+ /*port is always stored in stream description struct*/
+ call->log->reporting.reports[stats_type]->info.remote_addr.port = remote_desc->rtp_port;
- /*for IP it can be not set if we are using a direct route*/
- if (remote_desc->rtp_addr != NULL && strlen(remote_desc->rtp_addr) > 0) {
- STR_REASSIGN(call->log->reports[stats_type]->info.remote_addr.ip, ms_strdup(remote_desc->rtp_addr));
- } else {
- STR_REASSIGN(call->log->reports[stats_type]->info.remote_addr.ip, ms_strdup(sal_call_get_remote_media_description(call->op)->addr));
+ /*for IP it can be not set if we are using a direct route*/
+ if (remote_desc->rtp_addr != NULL && strlen(remote_desc->rtp_addr) > 0) {
+ STR_REASSIGN(call->log->reporting.reports[stats_type]->info.remote_addr.ip, ms_strdup(remote_desc->rtp_addr));
+ } else {
+ STR_REASSIGN(call->log->reporting.reports[stats_type]->info.remote_addr.ip, ms_strdup(sal_call_get_remote_media_description(call->op)->addr));
+ }
+ }
+}
+
+typedef struct on_action_suggested_struct{
+ LinphoneCall *call;
+ int stats_type;
+}on_action_suggested_struct_t;
+
+static void qos_analyzer_on_action_suggested(void *user_data, int datac, const char** datav){
+ on_action_suggested_struct_t * oass = (on_action_suggested_struct_t *)user_data;
+ LinphoneCall *call = oass->call;
+ reporting_session_report_t *report = call->log->reporting.reports[oass->stats_type];
+ char * appendbuf;
+ int i;
+ int ptime = -1;
+ int bitrate[2] = {-1, -1};
+ int up_bw[2] = {-1, -1};
+ int down_bw[2] = {-1, -1};
+ MediaStream *streams[2] = {(MediaStream*) call->audiostream, (MediaStream *) call->videostream};
+ for (i=0;i<2;i++){
+ if (streams[i]!=NULL){
+ if (streams[i]->encoder!=NULL){
+ if (ms_filter_has_method(streams[i]->encoder,MS_FILTER_GET_BITRATE)){
+ ms_filter_call_method(streams[i]->encoder,MS_FILTER_GET_BITRATE,&bitrate[i]);
+ bitrate[i] /= 1000.f;
+ }
+ }
+ up_bw[i] = media_stream_get_up_bw(streams[i])/1000.f;
+ down_bw[i] = media_stream_get_down_bw(streams[i])/1000.f;
+ }
+ }
+ if (call->audiostream!=NULL){
+ if (call->audiostream->ms.encoder!=NULL){
+ if(ms_filter_has_method(call->audiostream->ms.encoder,MS_AUDIO_ENCODER_GET_PTIME)){
+ ms_filter_call_method(call->audiostream->ms.encoder,MS_AUDIO_ENCODER_GET_PTIME,&ptime);
}
}
}
-}
-static bool_t reporting_enabled(const LinphoneCall * call) {
- return (call->dest_proxy != NULL && linphone_proxy_config_send_statistics_enabled(call->dest_proxy));
+ appendbuf=ms_strdup_printf("%s%d;", report->qos_analyzer.timestamp?report->qos_analyzer.timestamp:"", ms_time(0));
+ STR_REASSIGN(report->qos_analyzer.timestamp,appendbuf);
+
+ STR_REASSIGN(report->qos_analyzer.input_leg, ms_strdup_printf("%s aenc_ptime aenc_br a_dbw a_ubw venc_br v_dbw v_ubw", datav[0]));
+ appendbuf=ms_strdup_printf("%s%s %d %d %d %d %d %d %d;", report->qos_analyzer.input?report->qos_analyzer.input:"", datav[1],
+ ptime, bitrate[0], down_bw[0], up_bw[0], bitrate[1], down_bw[1], up_bw[1] );
+ STR_REASSIGN(report->qos_analyzer.input,appendbuf);
+ STR_REASSIGN(report->qos_analyzer.output_leg, ms_strdup(datav[2]));
+ appendbuf=ms_strdup_printf("%s%s;", report->qos_analyzer.output?report->qos_analyzer.output:"", datav[3]);
+ STR_REASSIGN(report->qos_analyzer.output, appendbuf);
}
void linphone_reporting_update_ip(LinphoneCall * call) {
- /*This function can be called in two different cases:
- - 1) at start when call is starting, remote ip/port info might be the proxy ones to which callee is registered
- - 2) later, if we found a direct route between caller and callee with ICE/Stun, ip/port are updated for the direct route access*/
- if (! reporting_enabled(call))
- return;
-
- reporting_update_ip(call, LINPHONE_CALL_STATS_AUDIO);
-
- if (linphone_call_params_video_enabled(linphone_call_get_current_params(call))) {
- reporting_update_ip(call, LINPHONE_CALL_STATS_VIDEO);
- }
+ update_ip(call, LINPHONE_CALL_STATS_AUDIO);
+ update_ip(call, LINPHONE_CALL_STATS_VIDEO);
}
-void linphone_reporting_update(LinphoneCall * call, int stats_type) {
- reporting_session_report_t * report = call->log->reports[stats_type];
+void linphone_reporting_update_media_info(LinphoneCall * call, int stats_type) {
MediaStream * stream = NULL;
const PayloadType * local_payload = NULL;
const PayloadType * remote_payload = NULL;
const LinphoneCallParams * current_params = linphone_call_get_current_params(call);
+ reporting_session_report_t * report = call->log->reporting.reports[stats_type];
+ char * dialog_id;
- if (! reporting_enabled(call))
+ if (!media_report_enabled(call, stats_type))
return;
+ dialog_id = sal_op_get_dialog_id(call->op);
+
STR_REASSIGN(report->info.call_id, ms_strdup(call->log->call_id));
- STR_REASSIGN(report->info.local_group, ms_strdup_printf("linphone-%s-%s-%s", (stats_type == LINPHONE_CALL_STATS_AUDIO ? "audio" : "video"),
- linphone_core_get_user_agent_name(), report->info.call_id));
- STR_REASSIGN(report->info.remote_group, ms_strdup_printf("linphone-%s-%s-%s", (stats_type == LINPHONE_CALL_STATS_AUDIO ? "audio" : "video"),
- linphone_call_get_remote_user_agent(call), report->info.call_id));
+
+ STR_REASSIGN(report->local_metrics.user_agent, ms_strdup(linphone_core_get_user_agent(call->core)));
+ STR_REASSIGN(report->remote_metrics.user_agent, ms_strdup(linphone_call_get_remote_user_agent(call)));
+
+ // RFC states: "LocalGroupID provides the identification for the purposes
+ // of aggregation for the local endpoint.".
+ STR_REASSIGN(report->info.local_addr.group, ms_strdup_printf("%s-%s-%s"
+ , dialog_id
+ , "local"
+ , report->local_metrics.user_agent
+ )
+ );
+ STR_REASSIGN(report->info.remote_addr.group, ms_strdup_printf("%s-%s-%s"
+ , dialog_id
+ , "remote"
+ , report->remote_metrics.user_agent
+ )
+ );
+
if (call->dir == LinphoneCallIncoming) {
- STR_REASSIGN(report->info.remote_id, linphone_address_as_string(call->log->from));
- STR_REASSIGN(report->info.local_id, linphone_address_as_string(call->log->to));
- STR_REASSIGN(report->info.orig_id, ms_strdup(report->info.remote_id));
+ STR_REASSIGN(report->info.remote_addr.id, linphone_address_as_string(call->log->from));
+ STR_REASSIGN(report->info.local_addr.id, linphone_address_as_string(call->log->to));
+ STR_REASSIGN(report->info.orig_id, ms_strdup(report->info.remote_addr.id));
} else {
- STR_REASSIGN(report->info.remote_id, linphone_address_as_string(call->log->to));
- STR_REASSIGN(report->info.local_id, linphone_address_as_string(call->log->from));
- STR_REASSIGN(report->info.orig_id, ms_strdup(report->info.local_id));
+ STR_REASSIGN(report->info.remote_addr.id, linphone_address_as_string(call->log->to));
+ STR_REASSIGN(report->info.local_addr.id, linphone_address_as_string(call->log->from));
+ STR_REASSIGN(report->info.orig_id, ms_strdup(report->info.local_addr.id));
}
- STR_REASSIGN(report->dialog_id, sal_op_get_dialog_id(call->op));
report->local_metrics.timestamps.start = call->log->start_date_time;
report->local_metrics.timestamps.stop = call->log->start_date_time + linphone_call_get_duration(call);
@@ -377,6 +510,7 @@ void linphone_reporting_update(LinphoneCall * call, int stats_type) {
report->remote_metrics.timestamps.start = call->log->start_date_time;
report->remote_metrics.timestamps.stop = call->log->start_date_time + linphone_call_get_duration(call);
+
/*yet we use the same payload config for local and remote, since this is the largest use case*/
if (stats_type == LINPHONE_CALL_STATS_AUDIO && call->audiostream != NULL) {
stream = &call->audiostream->ms;
@@ -393,13 +527,22 @@ void linphone_reporting_update(LinphoneCall * call, int stats_type) {
report->info.local_addr.ssrc = rtp_session_get_send_ssrc(session);
report->info.remote_addr.ssrc = rtp_session_get_recv_ssrc(session);
+
+ if (stream->qi != NULL){
+ report->local_metrics.quality_estimates.moslq = ms_quality_indicator_get_average_lq_rating(stream->qi) >= 0 ?
+ MAX(1, ms_quality_indicator_get_average_lq_rating(stream->qi)) : -1;
+ report->local_metrics.quality_estimates.moscq = ms_quality_indicator_get_average_rating(stream->qi) >= 0 ?
+ MAX(1, ms_quality_indicator_get_average_rating(stream->qi)) : -1;
+ }
}
+ STR_REASSIGN(report->dialog_id, ms_strdup_printf("%s;%u", dialog_id, report->info.local_addr.ssrc));
+
if (local_payload != NULL) {
report->local_metrics.session_description.payload_type = local_payload->type;
- STR_REASSIGN(report->local_metrics.session_description.payload_desc, ms_strdup(local_payload->mime_type));
+ if (local_payload->mime_type!=NULL) STR_REASSIGN(report->local_metrics.session_description.payload_desc, ms_strdup(local_payload->mime_type));
report->local_metrics.session_description.sample_rate = local_payload->clock_rate;
- STR_REASSIGN(report->local_metrics.session_description.fmtp, ms_strdup(local_payload->recv_fmtp));
+ if (local_payload->recv_fmtp!=NULL) STR_REASSIGN(report->local_metrics.session_description.fmtp, ms_strdup(local_payload->recv_fmtp));
}
if (remote_payload != NULL) {
@@ -408,120 +551,218 @@ void linphone_reporting_update(LinphoneCall * call, int stats_type) {
report->remote_metrics.session_description.sample_rate = remote_payload->clock_rate;
STR_REASSIGN(report->remote_metrics.session_description.fmtp, ms_strdup(remote_payload->recv_fmtp));
}
+
+ ms_free(dialog_id);
}
-void linphone_reporting_call_stats_updated(LinphoneCall *call, int stats_type) {
- reporting_session_report_t * report = call->log->reports[stats_type];
- reporting_content_metrics_t * metrics = NULL;
+/* generate random float in interval ] 0.9 t ; 1.1 t [*/
+static float reporting_rand(float t){
+ return t * (.2f * (rand() / (RAND_MAX * 1.0f)) + 0.9f);
+}
+void linphone_reporting_on_rtcp_update(LinphoneCall *call, int stats_type) {
+ reporting_session_report_t * report = call->log->reporting.reports[stats_type];
+ reporting_content_metrics_t * metrics = NULL;
LinphoneCallStats stats = call->stats[stats_type];
mblk_t *block = NULL;
+ int report_interval;
- if (! reporting_enabled(call))
+ if (! media_report_enabled(call,stats_type))
return;
+ report_interval = linphone_proxy_config_get_quality_reporting_interval(call->dest_proxy);
+
if (stats.updated == LINPHONE_CALL_STATS_RECEIVED_RTCP_UPDATE) {
metrics = &report->remote_metrics;
- if (rtcp_is_XR(stats.received_rtcp) == TRUE) {
- block = stats.received_rtcp;
- }
+ block = stats.received_rtcp;
} else if (stats.updated == LINPHONE_CALL_STATS_SENT_RTCP_UPDATE) {
metrics = &report->local_metrics;
- if (rtcp_is_XR(stats.sent_rtcp) == TRUE) {
- block = stats.sent_rtcp;
- }
+ block = stats.sent_rtcp;
}
- if (block != NULL) {
- switch (rtcp_XR_get_block_type(block)) {
- case RTCP_XR_VOIP_METRICS: {
- uint8_t config;
+ do{
+ if (rtcp_is_XR(block) && (rtcp_XR_get_block_type(block) == RTCP_XR_VOIP_METRICS)){
- metrics->quality_estimates.rcq = rtcp_XR_voip_metrics_get_r_factor(block);
- metrics->quality_estimates.moslq = rtcp_XR_voip_metrics_get_mos_lq(block) / 10.f;
- metrics->quality_estimates.moscq = rtcp_XR_voip_metrics_get_mos_cq(block) / 10.f;
+ uint8_t config = rtcp_XR_voip_metrics_get_rx_config(block);
- metrics->jitter_buffer.nominal = rtcp_XR_voip_metrics_get_jb_nominal(block);
- metrics->jitter_buffer.max = rtcp_XR_voip_metrics_get_jb_maximum(block);
- metrics->jitter_buffer.abs_max = rtcp_XR_voip_metrics_get_jb_abs_max(block);
- metrics->packet_loss.network_packet_loss_rate = rtcp_XR_voip_metrics_get_loss_rate(block);
- metrics->packet_loss.jitter_buffer_discard_rate = rtcp_XR_voip_metrics_get_discard_rate(block);
+ metrics->rtcp_xr_count++;
- config = rtcp_XR_voip_metrics_get_rx_config(block);
- metrics->session_description.packet_loss_concealment = (config >> 6) & 0x3;
- metrics->jitter_buffer.adaptive = (config >> 4) & 0x3;
- break;
- } default: {
- break;
+ // for local mos rating, we'll use the quality indicator directly
+ // because rtcp XR might not be enabled
+ if (stats.updated == LINPHONE_CALL_STATS_RECEIVED_RTCP_UPDATE){
+ metrics->quality_estimates.moslq = (rtcp_XR_voip_metrics_get_mos_lq(block)==127) ?
+ 127 : rtcp_XR_voip_metrics_get_mos_lq(block) / 10.f;
+ metrics->quality_estimates.moscq = (rtcp_XR_voip_metrics_get_mos_cq(block)==127) ?
+ 127 : rtcp_XR_voip_metrics_get_mos_cq(block) / 10.f;
+ }
+
+ metrics->jitter_buffer.nominal += rtcp_XR_voip_metrics_get_jb_nominal(block);
+ metrics->jitter_buffer.max += rtcp_XR_voip_metrics_get_jb_maximum(block);
+ metrics->jitter_buffer.abs_max = rtcp_XR_voip_metrics_get_jb_abs_max(block);
+ metrics->jitter_buffer.adaptive = (config >> 4) & 0x3;
+ metrics->packet_loss.network_packet_loss_rate = rtcp_XR_voip_metrics_get_loss_rate(block);
+ metrics->packet_loss.jitter_buffer_discard_rate = rtcp_XR_voip_metrics_get_discard_rate(block);
+
+ metrics->session_description.packet_loss_concealment = (config >> 6) & 0x3;
+
+ metrics->delay.round_trip_delay += rtcp_XR_voip_metrics_get_round_trip_delay(block);
+ }else if (rtcp_is_SR(block)){
+ MediaStream *ms=(stats_type==0 ? &call->audiostream->ms : &call->videostream->ms);
+ float rtt = rtp_session_get_round_trip_propagation(ms->sessions.rtp_session);
+
+ if (rtt > 1e-6){
+ metrics->rtcp_sr_count++;
+ metrics->delay.round_trip_delay += 1000*rtt;
}
}
+ }while(rtcp_next_packet(block));
+
+ /* check if we should send an interval report - use a random sending time to
+ dispatch reports and avoid sending them too close from each other */
+ if (report_interval>0 && ms_time(NULL)-report->last_report_date>reporting_rand(report_interval)){
+ linphone_reporting_update_media_info(call, stats_type);
+ send_report(call, report, "VQIntervalReport");
}
}
-void linphone_reporting_publish(LinphoneCall* call) {
- if (! reporting_enabled(call))
- return;
-
-
- if (call->log->reports[LINPHONE_CALL_STATS_AUDIO] != NULL) {
- reporting_publish(call, call->log->reports[LINPHONE_CALL_STATS_AUDIO]);
+static int publish_report(LinphoneCall *call, const char *event_type){
+ int ret = 0;
+ int i;
+ for (i = 0; i < 2; i++){
+ if (media_report_enabled(call, i)){
+ int sndret;
+ linphone_reporting_update_media_info(call, i);
+ sndret=send_report(call, call->log->reporting.reports[i], event_type);
+ if (sndret>0){
+ ret += 10+(i+1)*sndret;
+ }
+ } else{
+ ret += i+1;
+ }
}
+ return ret;
+}
- if (call->log->reports[LINPHONE_CALL_STATS_VIDEO] != NULL
- && linphone_call_params_video_enabled(linphone_call_get_current_params(call))) {
- reporting_publish(call, call->log->reports[LINPHONE_CALL_STATS_VIDEO]);
+int linphone_reporting_publish_session_report(LinphoneCall* call, bool_t call_term) {
+ char * session_type = call_term?"VQSessionReport: CallTerm":"VQSessionReport";
+ return publish_report(call, session_type);
+}
+
+int linphone_reporting_publish_interval_report(LinphoneCall* call) {
+ return publish_report(call, "VQIntervalReport");
+}
+
+void linphone_reporting_call_state_updated(LinphoneCall *call){
+ LinphoneCallState state=linphone_call_get_state(call);
+
+ if (! quality_reporting_enabled(call)){
+ return;
+ }
+ switch (state){
+ case LinphoneCallStreamsRunning:{
+ bool_t video_enabled=media_report_enabled(call, LINPHONE_CALL_STATS_VIDEO);
+ int i;
+ MediaStream *streams[2] = {(MediaStream*) call->audiostream, (MediaStream *) call->videostream};
+ MSQosAnalyzer *analyzer;
+ for (i=0;i<2;i++){
+
+ if (streams[i]==NULL||streams[i]->rc==NULL){
+ ms_message("QualityReporting[%p] Cannot set on_action_suggested"
+ " callback for %s stream because something is null", call, i?"video":"audio");
+ continue;
+ }
+
+ analyzer=ms_bitrate_controller_get_qos_analyzer(streams[i]->rc);
+ if (analyzer){
+ on_action_suggested_struct_t * oass = ms_new0(on_action_suggested_struct_t, 1);
+ oass->call = call;
+ oass->stats_type = i;
+ STR_REASSIGN(call->log->reporting.reports[i]->qos_analyzer.name, ms_strdup(ms_qos_analyzer_get_name(analyzer)));
+
+ ms_qos_analyzer_set_on_action_suggested(analyzer,
+ qos_analyzer_on_action_suggested,
+ oass);
+ }
+ }
+ linphone_reporting_update_ip(call);
+ if (!video_enabled && call->log->reporting.was_video_running){
+ send_report(call, call->log->reporting.reports[LINPHONE_CALL_STATS_VIDEO], "VQSessionReport");
+ }
+ call->log->reporting.was_video_running=video_enabled;
+ break;
+ }
+ case LinphoneCallEnd:{
+ if (call->log->status==LinphoneCallSuccess || call->log->status==LinphoneCallAborted){
+ linphone_reporting_publish_session_report(call, TRUE);
+ }
+ break;
+ }
+ default:{
+ break;
+ }
}
}
reporting_session_report_t * linphone_reporting_new() {
int i;
reporting_session_report_t * rm = ms_new0(reporting_session_report_t,1);
-
reporting_content_metrics_t * metrics[2] = {&rm->local_metrics, &rm->remote_metrics};
+
+ memset(rm, 0, sizeof(reporting_session_report_t));
+
for (i = 0; i < 2; i++) {
metrics[i]->session_description.payload_type = -1;
metrics[i]->session_description.sample_rate = -1;
metrics[i]->session_description.frame_duration = -1;
+ metrics[i]->session_description.packet_loss_concealment = -1;
metrics[i]->packet_loss.network_packet_loss_rate = -1;
metrics[i]->packet_loss.jitter_buffer_discard_rate = -1;
- metrics[i]->session_description.packet_loss_concealment = -1;
metrics[i]->jitter_buffer.adaptive = -1;
- /*metrics[i]->jitter_buffer.rate = -1;*/
- metrics[i]->jitter_buffer.nominal = -1;
- metrics[i]->jitter_buffer.max = -1;
metrics[i]->jitter_buffer.abs_max = -1;
- metrics[i]->delay.round_trip_delay = -1;
metrics[i]->delay.end_system_delay = -1;
- /*metrics[i]->delay.one_way_delay = -1;*/
- metrics[i]->delay.symm_one_way_delay = -1;
metrics[i]->delay.interarrival_jitter = -1;
metrics[i]->delay.mean_abs_jitter = -1;
metrics[i]->signal.level = 127;
metrics[i]->signal.noise_level = 127;
}
+
+ reset_avg_metrics(rm);
return rm;
}
void linphone_reporting_destroy(reporting_session_report_t * report) {
- if (report->info.call_id != NULL) ms_free(report->info.call_id);
- if (report->info.local_id != NULL) ms_free(report->info.local_id);
- if (report->info.remote_id != NULL) ms_free(report->info.remote_id);
- if (report->info.orig_id != NULL) ms_free(report->info.orig_id);
- if (report->info.local_addr.ip != NULL) ms_free(report->info.local_addr.ip);
- if (report->info.remote_addr.ip != NULL) ms_free(report->info.remote_addr.ip);
- if (report->info.local_group != NULL) ms_free(report->info.local_group);
- if (report->info.remote_group != NULL) ms_free(report->info.remote_group);
- if (report->info.local_mac_addr != NULL) ms_free(report->info.local_mac_addr);
- if (report->info.remote_mac_addr != NULL) ms_free(report->info.remote_mac_addr);
- if (report->dialog_id != NULL) ms_free(report->dialog_id);
- if (report->local_metrics.session_description.fmtp != NULL) ms_free(report->local_metrics.session_description.fmtp);
- if (report->local_metrics.session_description.payload_desc != NULL) ms_free(report->local_metrics.session_description.payload_desc);
- if (report->remote_metrics.session_description.fmtp != NULL) ms_free(report->remote_metrics.session_description.fmtp);
- if (report->remote_metrics.session_description.payload_desc != NULL) ms_free(report->remote_metrics.session_description.payload_desc);
+ STR_REASSIGN(report->info.call_id, NULL);
+ STR_REASSIGN(report->info.local_addr.id, NULL);
+ STR_REASSIGN(report->info.remote_addr.id, NULL);
+ STR_REASSIGN(report->info.orig_id, NULL);
+ STR_REASSIGN(report->info.local_addr.ip, NULL);
+ STR_REASSIGN(report->info.remote_addr.ip, NULL);
+ STR_REASSIGN(report->info.local_addr.group, NULL);
+ STR_REASSIGN(report->info.remote_addr.group, NULL);
+ STR_REASSIGN(report->info.local_addr.mac, NULL);
+ STR_REASSIGN(report->info.remote_addr.mac, NULL);
+ STR_REASSIGN(report->dialog_id, NULL);
+ STR_REASSIGN(report->local_metrics.session_description.fmtp, NULL);
+ STR_REASSIGN(report->local_metrics.session_description.payload_desc, NULL);
+ STR_REASSIGN(report->local_metrics.user_agent, NULL);
+ STR_REASSIGN(report->remote_metrics.session_description.fmtp, NULL);
+ STR_REASSIGN(report->remote_metrics.session_description.payload_desc, NULL);
+ STR_REASSIGN(report->remote_metrics.user_agent, NULL);
+ STR_REASSIGN(report->qos_analyzer.name, NULL);
+ STR_REASSIGN(report->qos_analyzer.timestamp, NULL);
+ STR_REASSIGN(report->qos_analyzer.input_leg, NULL);
+ STR_REASSIGN(report->qos_analyzer.input, NULL);
+ STR_REASSIGN(report->qos_analyzer.output_leg, NULL);
+ STR_REASSIGN(report->qos_analyzer.output, NULL);
ms_free(report);
}
+
+
+void linphone_reporting_set_on_report_send(LinphoneCall *call, LinphoneQualityReportingReportSendCb cb){
+ call->log->reporting.on_report_sent = cb;
+}
diff --git a/coreapi/quality_reporting.h b/coreapi/quality_reporting.h
index c182a4210..319353fc0 100644
--- a/coreapi/quality_reporting.h
+++ b/coreapi/quality_reporting.h
@@ -28,12 +28,16 @@ extern "C"{
/**
- * Linphone quality report sub object storing address related information (ip / port / MAC).
+ * Linphone quality report sub object storing address related information.
*/
typedef struct reporting_addr {
+ char * id;
char * ip;
int port;
uint32_t ssrc;
+
+ char * group;
+ char * mac; // optional
} reporting_addr_t;
/**
@@ -50,19 +54,19 @@ typedef struct reporting_content_metrics {
// session description - optional
struct {
int payload_type;
- char * payload_desc; // mime type
- int sample_rate; // clock rate
- int frame_duration; // to check (ptime?) - audio only
+ char * payload_desc;
+ int sample_rate;
+ int frame_duration;
char * fmtp;
- int packet_loss_concealment; // in voip metrics - audio only
+ int packet_loss_concealment;
} session_description;
// jitter buffet - optional
struct {
- int adaptive; // constant
- int nominal; // no may vary during the call <- average? worst score?
- int max; // no may vary during the call <- average?
- int abs_max; // constant
+ int adaptive;
+ int nominal;
+ int max;
+ int abs_max;
} jitter_buffer;
// packet loss - optional
@@ -73,26 +77,32 @@ typedef struct reporting_content_metrics {
// delay - optional
struct {
- int round_trip_delay; // no - vary
- int end_system_delay; // no - not implemented yet
- int symm_one_way_delay; // no - vary (depends on round_trip_delay) + not implemented (depends on end_system_delay)
- int interarrival_jitter; // no - not implemented yet
- int mean_abs_jitter; // to check
+ int round_trip_delay;
+ int end_system_delay;
+ int symm_one_way_delay;
+ int interarrival_jitter;
+ int mean_abs_jitter;
} delay;
// signal - optional
struct {
- int level; // no - vary
- int noise_level; // no - vary
+ int level;
+ int noise_level;
} signal;
// quality estimates - optional
struct {
- int rlq; // linked to moslq - in [0..120]
- int rcq; //voip metrics R factor - no - vary or avg in [0..120]
- float moslq; // no - vary or avg - voip metrics - in [0..4.9]
- float moscq; // no - vary or avg - voip metrics - in [0..4.9]
+ float moslq;
+ float moscq;
} quality_estimates;
+
+ // custom extension
+ char * user_agent;
+
+ // for internal processing
+ uint8_t rtcp_xr_count; // number of RTCP XR packets received since last report, used to compute average of instantaneous parameters as stated in the RFC 6035 (4.5)
+ uint8_t rtcp_sr_count; // number of RTCP SR packets received since last report, used to compute RTT average values in case RTCP XR voip metrics is not enabled
+
} reporting_content_metrics_t;
@@ -103,24 +113,35 @@ typedef struct reporting_content_metrics {
typedef struct reporting_session_report {
struct {
char * call_id;
- char * local_id;
- char * remote_id;
char * orig_id;
reporting_addr_t local_addr;
reporting_addr_t remote_addr;
- char * local_group;
- char * remote_group;
-
- char * local_mac_addr; // optional
- char * remote_mac_addr; // optional
} info;
reporting_content_metrics_t local_metrics;
reporting_content_metrics_t remote_metrics; // optional
char * dialog_id; // optional
+
+ // Quality of Service analyzer - custom extension
+ /* This should allow us to analysis bad network conditions and quality adaptation
+ on server side*/
+ struct {
+ char * name; /*type of the QoS analyzer used*/
+ char* timestamp; /*time of each decision in seconds*/
+ char* input_leg; /*input parameters' name*/
+ char* input; /*set of inputs for each semicolon separated decision*/
+ char* output_leg; /*output parameters' name*/
+ char* output; /*set of outputs for each semicolon separated decision*/
+ } qos_analyzer;
+
+ // for internal processing
+ time_t last_report_date;
} reporting_session_report_t;
+
+typedef void (*LinphoneQualityReportingReportSendCb)(const LinphoneCall *call, int stream_type, const LinphoneContent *content);
+
reporting_session_report_t * linphone_reporting_new();
void linphone_reporting_destroy(reporting_session_report_t * report);
@@ -131,31 +152,60 @@ void linphone_reporting_destroy(reporting_session_report_t * report);
* @param stats_type the media type (LINPHONE_CALL_STATS_AUDIO or LINPHONE_CALL_STATS_VIDEO)
*
*/
-void linphone_reporting_update(LinphoneCall * call, int stats_type);
+void linphone_reporting_update_media_info(LinphoneCall * call, int stats_type);
/**
* Fill IP information about a given call. This function must be called each
- * time state is 'LinphoneCallStreamsRunning' since IP might be updated (if we
+ * time call state is 'LinphoneCallStreamsRunning' since IP might be updated (if we
* found a direct route between caller and callee for example).
+ * When call is starting, remote IP/port might be the proxy ones to which callee is registered
* @param call #LinphoneCall object to consider
*
*/
void linphone_reporting_update_ip(LinphoneCall * call);
/**
- * Publish the report on the call end.
+ * Publish a session report. This function should be called when session terminates,
+ * media change (codec change or session fork), session terminates due to no media packets being received.
* @param call #LinphoneCall object to consider
+ * @param call_term whether the call has ended or is continuing
*
+ * @return error code. 0 for success, positive value otherwise.
*/
-void linphone_reporting_publish(LinphoneCall* call);
+int linphone_reporting_publish_session_report(LinphoneCall* call, bool_t call_term);
/**
- * Update publish report data with fresh RTCP stats, if needed.
+ * Publish an interval report. This function should be used for periodic interval
+ * @param call #LinphoneCall object to consider
+ * @return error code. 0 for success, positive value otherwise.
+ *
+ */
+int linphone_reporting_publish_interval_report(LinphoneCall* call);
+
+/**
+ * Update publish reports with newly sent/received RTCP-XR packets (if available).
* @param call #LinphoneCall object to consider
* @param stats_type the media type (LINPHONE_CALL_STATS_AUDIO or LINPHONE_CALL_STATS_VIDEO)
*
*/
-void linphone_reporting_call_stats_updated(LinphoneCall *call, int stats_type);
+void linphone_reporting_on_rtcp_update(LinphoneCall *call, int stats_type);
+
+/**
+ * Update publish reports on call state change.
+ * @param call #LinphoneCall object to consider
+ *
+ */
+void linphone_reporting_call_state_updated(LinphoneCall *call);
+
+/**
+ * Setter of the #LinphoneQualityReportingReportSendCb callback method which is
+ * notified each time a report will be submitted to the collector, if quality
+ * reporting is enabled
+ * @param call #LinphoneCall object to consider
+ * @param cb #LinphoneQualityReportingReportSendCb callback function to notify
+ *
+ */
+LINPHONE_PUBLIC void linphone_reporting_set_on_report_send(LinphoneCall *call, LinphoneQualityReportingReportSendCb cb);
#ifdef __cplusplus
}
diff --git a/coreapi/sal.c b/coreapi/sal.c
index cb94d675c..24da751b6 100644
--- a/coreapi/sal.c
+++ b/coreapi/sal.c
@@ -84,26 +84,72 @@ void sal_media_description_unref(SalMediaDescription *md){
SalStreamDescription *sal_media_description_find_stream(SalMediaDescription *md,
SalMediaProto proto, SalStreamType type){
int i;
- for(i=0;in_active_streams;++i){
+ for(i=0;inb_streams;++i){
SalStreamDescription *ss=&md->streams[i];
+ if (!sal_stream_description_active(ss)) continue;
if (ss->proto==proto && ss->type==type) return ss;
}
return NULL;
}
+unsigned int sal_media_description_nb_active_streams_of_type(SalMediaDescription *md, SalStreamType type) {
+ unsigned int i;
+ unsigned int nb = 0;
+ for (i = 0; i < md->nb_streams; ++i) {
+ if (!sal_stream_description_active(&md->streams[i])) continue;
+ if (md->streams[i].type == type) nb++;
+ }
+ return nb;
+}
+
+SalStreamDescription * sal_media_description_get_active_stream_of_type(SalMediaDescription *md, SalStreamType type, unsigned int idx) {
+ unsigned int i;
+ for (i = 0; i < md->nb_streams; ++i) {
+ if (!sal_stream_description_active(&md->streams[i])) continue;
+ if (md->streams[i].type == type) {
+ if (idx-- == 0) return &md->streams[i];
+ }
+ }
+ return NULL;
+}
+
+SalStreamDescription * sal_media_description_find_secure_stream_of_type(SalMediaDescription *md, SalStreamType type) {
+ SalStreamDescription *desc = sal_media_description_find_stream(md, SalProtoRtpSavpf, type);
+ if (desc == NULL) desc = sal_media_description_find_stream(md, SalProtoRtpSavp, type);
+ return desc;
+}
+
+SalStreamDescription * sal_media_description_find_best_stream(SalMediaDescription *md, SalStreamType type) {
+ SalStreamDescription *desc = sal_media_description_find_stream(md, SalProtoRtpSavpf, type);
+ if (desc == NULL) desc = sal_media_description_find_stream(md, SalProtoRtpSavp, type);
+ if (desc == NULL) desc = sal_media_description_find_stream(md, SalProtoRtpAvpf, type);
+ if (desc == NULL) desc = sal_media_description_find_stream(md, SalProtoRtpAvp, type);
+ return desc;
+}
+
bool_t sal_media_description_empty(const SalMediaDescription *md){
- if (md->n_active_streams > 0) return FALSE;
+ if (sal_media_description_get_nb_active_streams(md) > 0) return FALSE;
return TRUE;
}
void sal_media_description_set_dir(SalMediaDescription *md, SalStreamDir stream_dir){
int i;
- for(i=0;in_active_streams;++i){
+ for(i=0;inb_streams;++i){
SalStreamDescription *ss=&md->streams[i];
+ if (!sal_stream_description_active(ss)) continue;
ss->dir=stream_dir;
}
}
+int sal_media_description_get_nb_active_streams(const SalMediaDescription *md) {
+ int i;
+ int nb = 0;
+ for (i = 0; i < md->nb_streams; i++) {
+ if (sal_stream_description_active(&md->streams[i])) nb++;
+ }
+ return nb;
+}
+
static bool_t is_null_address(const char *addr){
return strcmp(addr,"0.0.0.0")==0 || strcmp(addr,"::0")==0;
@@ -114,8 +160,9 @@ static bool_t has_dir(const SalMediaDescription *md, SalStreamDir stream_dir){
int i;
/* we are looking for at least one stream with requested direction, inactive streams are ignored*/
- for(i=0;in_active_streams;++i){
+ for(i=0;inb_streams;++i){
const SalStreamDescription *ss=&md->streams[i];
+ if (!sal_stream_description_active(ss)) continue;
if (ss->dir==stream_dir) return TRUE;
/*compatibility check for phones that only used the null address and no attributes */
if (ss->dir==SalStreamSendRecv && stream_dir==SalStreamSendOnly && (is_null_address(md->addr) || is_null_address(ss->rtp_addr)))
@@ -142,6 +189,38 @@ bool_t sal_media_description_has_dir(const SalMediaDescription *md, SalStreamDir
return FALSE;
}
+bool_t sal_stream_description_active(const SalStreamDescription *sd) {
+ return (sd->rtp_port > 0);
+}
+
+bool_t sal_stream_description_has_avpf(const SalStreamDescription *sd) {
+ return ((sd->proto == SalProtoRtpAvpf) || (sd->proto == SalProtoRtpSavpf));
+}
+
+bool_t sal_stream_description_has_srtp(const SalStreamDescription *sd) {
+ return ((sd->proto == SalProtoRtpSavp) || (sd->proto == SalProtoRtpSavpf));
+}
+
+bool_t sal_media_description_has_avpf(const SalMediaDescription *md) {
+ int i;
+ if (md->nb_streams == 0) return FALSE;
+ for (i = 0; i < md->nb_streams; i++) {
+ if (!sal_stream_description_active(&md->streams[i])) continue;
+ if (sal_stream_description_has_avpf(&md->streams[i]) != TRUE) return FALSE;
+ }
+ return TRUE;
+}
+
+bool_t sal_media_description_has_srtp(const SalMediaDescription *md) {
+ int i;
+ if (md->nb_streams == 0) return FALSE;
+ for (i = 0; i < md->nb_streams; i++) {
+ if (!sal_stream_description_active(&md->streams[i])) continue;
+ if (sal_stream_description_has_srtp(&md->streams[i]) != TRUE) return FALSE;
+ }
+ return TRUE;
+}
+
/*
static bool_t fmtp_equals(const char *p1, const char *p2){
if (p1 && p2 && strcmp(p1,p2)==0) return TRUE;
@@ -228,9 +307,9 @@ int sal_media_description_equals(const SalMediaDescription *md1, const SalMediaD
int i;
if (strcmp(md1->addr, md2->addr) != 0) result |= SAL_MEDIA_DESCRIPTION_NETWORK_CHANGED;
- if (md1->n_total_streams != md2->n_total_streams) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
+ if (md1->nb_streams != md2->nb_streams) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
if (md1->bandwidth != md2->bandwidth) result |= SAL_MEDIA_DESCRIPTION_CODEC_CHANGED;
- for(i = 0; i < md1->n_total_streams; ++i){
+ for(i = 0; i < md1->nb_streams; ++i){
result |= sal_stream_description_equals(&md1->streams[i], &md2->streams[i]);
}
return result;
@@ -515,6 +594,8 @@ const char* sal_media_proto_to_string(SalMediaProto type) {
switch (type) {
case SalProtoRtpAvp:return "RTP/AVP";
case SalProtoRtpSavp:return "RTP/SAVP";
+ case SalProtoRtpAvpf:return "RTP/AVPF";
+ case SalProtoRtpSavpf:return "RTP/SAVPF";
default: return "unknown";
}
}
diff --git a/coreapi/upnp.c b/coreapi/upnp.c
index 7feaaa30c..5fcbbe065 100644
--- a/coreapi/upnp.c
+++ b/coreapi/upnp.c
@@ -731,7 +731,7 @@ int linphone_core_update_upnp_from_remote_media_description(LinphoneCall *call,
int i;
const SalStreamDescription *stream;
- for (i = 0; i < md->n_total_streams; i++) {
+ for (i = 0; i < md->nb_streams; i++) {
stream = &md->streams[i];
if(stream->type == SalAudio) {
audio = TRUE;
@@ -1058,8 +1058,9 @@ int linphone_core_update_local_media_description_from_upnp(SalMediaDescription *
SalStreamDescription *stream;
UpnpStream *upnpStream;
- for (i = 0; i < desc->n_active_streams; i++) {
+ for (i = 0; i < desc->nb_streams; i++) {
stream = &desc->streams[i];
+ if (!sal_stream_description_active(stream)) continue;
upnpStream = NULL;
if(stream->type == SalAudio) {
upnpStream = session->audio;
diff --git a/gtk/call_statistics.ui b/gtk/call_statistics.ui
index 2412d9793..d53c93a1f 100644
--- a/gtk/call_statistics.ui
+++ b/gtk/call_statistics.ui
@@ -1,115 +1,67 @@
-
+
diff --git a/include/sal/sal.h b/include/sal/sal.h
index 2d7e4eec8..5533182ed 100644
--- a/include/sal/sal.h
+++ b/include/sal/sal.h
@@ -123,6 +123,8 @@ const char* sal_stream_type_to_string(SalStreamType type);
typedef enum{
SalProtoRtpAvp,
SalProtoRtpSavp,
+ SalProtoRtpAvpf,
+ SalProtoRtpSavpf,
SalProtoOther
}SalMediaProto;
const char* sal_media_proto_to_string(SalMediaProto type);
@@ -166,7 +168,7 @@ typedef struct SalIceRemoteCandidate {
#define SAL_MEDIA_DESCRIPTION_MAX_ICE_PWD_LEN 256
/*sufficient for 256bit keys encoded in base 64*/
-#define SAL_SRTP_KEY_SIZE 64
+#define SAL_SRTP_KEY_SIZE 128
typedef struct SalSrtpCryptoAlgo {
unsigned int tag;
@@ -213,8 +215,7 @@ typedef struct SalMediaDescription{
char name[64];
char addr[64];
char username[64];
- int n_active_streams;
- int n_total_streams;
+ int nb_streams;
int bandwidth;
unsigned int session_ver;
unsigned int session_id;
@@ -233,6 +234,7 @@ typedef struct SalMessage{
const char *text;
const char *url;
const char *message_id;
+ const char *content_type;
time_t time;
}SalMessage;
@@ -251,7 +253,17 @@ int sal_media_description_equals(const SalMediaDescription *md1, const SalMediaD
bool_t sal_media_description_has_dir(const SalMediaDescription *md, SalStreamDir dir);
SalStreamDescription *sal_media_description_find_stream(SalMediaDescription *md,
SalMediaProto proto, SalStreamType type);
+unsigned int sal_media_description_nb_active_streams_of_type(SalMediaDescription *md, SalStreamType type);
+SalStreamDescription * sal_media_description_get_active_stream_of_type(SalMediaDescription *md, SalStreamType type, unsigned int idx);
+SalStreamDescription * sal_media_description_find_secure_stream_of_type(SalMediaDescription *md, SalStreamType type);
+SalStreamDescription * sal_media_description_find_best_stream(SalMediaDescription *md, SalStreamType type);
void sal_media_description_set_dir(SalMediaDescription *md, SalStreamDir stream_dir);
+bool_t sal_stream_description_active(const SalStreamDescription *sd);
+bool_t sal_stream_description_has_avpf(const SalStreamDescription *sd);
+bool_t sal_stream_description_has_srtp(const SalStreamDescription *sd);
+bool_t sal_media_description_has_avpf(const SalMediaDescription *md);
+bool_t sal_media_description_has_srtp(const SalMediaDescription *md);
+int sal_media_description_get_nb_active_streams(const SalMediaDescription *md);
/*this structure must be at the first byte of the SalOp structure defined by implementors*/
@@ -507,12 +519,16 @@ void sal_set_dscp(Sal *ctx, int dscp);
int sal_reset_transports(Sal *ctx);
ortp_socket_t sal_get_socket(Sal *ctx);
void sal_set_user_agent(Sal *ctx, const char *user_agent);
+const char* sal_get_user_agent(Sal *ctx);
void sal_append_stack_string_to_user_agent(Sal *ctx);
/*keepalive period in ms*/
void sal_set_keepalive_period(Sal *ctx,unsigned int value);
void sal_use_tcp_tls_keepalive(Sal *ctx, bool_t enabled);
int sal_enable_tunnel(Sal *ctx, void *tunnelclient);
void sal_disable_tunnel(Sal *ctx);
+/*Default value is true*/
+void sal_enable_sip_update_method(Sal *ctx,bool_t value);
+
/**
* returns keepalive period in ms
* 0 desactiaved
@@ -529,7 +545,7 @@ void sal_verify_server_certificates(Sal *ctx, bool_t verify);
void sal_verify_server_cn(Sal *ctx, bool_t verify);
void sal_set_uuid(Sal*ctx, const char *uuid);
int sal_create_uuid(Sal*ctx, char *uuid, size_t len);
-void sal_enable_test_features(Sal*ctx, bool_t enabled);
+LINPHONE_PUBLIC void sal_enable_test_features(Sal*ctx, bool_t enabled);
void sal_use_no_initial_route(Sal *ctx, bool_t enabled);
int sal_iterate(Sal *sal);
@@ -551,6 +567,9 @@ void sal_op_set_to_address(SalOp *op, const SalAddress *to);
SalOp *sal_op_ref(SalOp* h);
void sal_op_stop_refreshing(SalOp *op);
void sal_op_release(SalOp *h);
+/*same as release, but does not stop refresher if any*/
+void* sal_op_unref(SalOp* op);
+
void sal_op_authenticate(SalOp *h, const SalAuthInfo *info);
void sal_op_cancel_authentication(SalOp *h);
void sal_op_set_user_pointer(SalOp *h, void *up);
diff --git a/java/common/org/linphone/core/LinphoneChatRoom.java b/java/common/org/linphone/core/LinphoneChatRoom.java
index e84538269..c1e635c0a 100644
--- a/java/common/org/linphone/core/LinphoneChatRoom.java
+++ b/java/common/org/linphone/core/LinphoneChatRoom.java
@@ -114,4 +114,9 @@ public interface LinphoneChatRoom {
* @return LinphoneChatMessage object
*/
LinphoneChatMessage createLinphoneChatMessage(String message, String url, State state, long timestamp, boolean isRead, boolean isIncoming);
+ /**
+ * Returns a back pointer to the core managing the chat room.
+ * @return the LinphoneCore
+ */
+ LinphoneCore getCore();
}
diff --git a/java/common/org/linphone/core/LinphoneCoreFactory.java b/java/common/org/linphone/core/LinphoneCoreFactory.java
index 0a6efc305..5838594dc 100644
--- a/java/common/org/linphone/core/LinphoneCoreFactory.java
+++ b/java/common/org/linphone/core/LinphoneCoreFactory.java
@@ -66,7 +66,24 @@ abstract public class LinphoneCoreFactory {
* */
abstract public LinphoneAuthInfo createAuthInfo(String username, String userid, String passwd, String ha1, String realm, String domain);
+ /**
+ * Create a LinphoneCore object. The LinphoneCore is the root for all liblinphone operations. You need only one per application.
+ * @param listener listener to receive notifications from the core
+ * @param userConfig path where to read/write configuration (optional)
+ * @param factoryConfig path where to read factory configuration (optional)
+ * @param userdata any kind of application specific data
+ * @param context an application context, on android this MUST be the android.content.Context object used by the application.
+ * @return a LinphoneCore object.
+ * @throws LinphoneCoreException
+ */
abstract public LinphoneCore createLinphoneCore(LinphoneCoreListener listener, String userConfig,String factoryConfig,Object userdata, Object context) throws LinphoneCoreException;
+ /**
+ * Create a LinphoneCore object. The LinphoneCore is the root for all liblinphone operations. You need only one per application.
+ * @param listener listener to receive notifications from the core.
+ * @param context an application context, on android this MUST be the android.content.Context object used by the application.
+ * @return the LinphoneCore object.
+ * @throws LinphoneCoreException
+ */
abstract public LinphoneCore createLinphoneCore(LinphoneCoreListener listener, Object context) throws LinphoneCoreException;
diff --git a/java/common/org/linphone/core/LinphoneEvent.java b/java/common/org/linphone/core/LinphoneEvent.java
index dcdfcfc48..cca9a3f2d 100644
--- a/java/common/org/linphone/core/LinphoneEvent.java
+++ b/java/common/org/linphone/core/LinphoneEvent.java
@@ -100,4 +100,10 @@ public interface LinphoneEvent {
* @param body the new data to be published
*/
void sendPublish(LinphoneContent body);
+
+ /**
+ * Get a back pointer to the LinphoneCore object managing this LinphoneEvent.
+ * @return
+ */
+ LinphoneCore getCore();
}
diff --git a/java/common/org/linphone/core/LinphoneProxyConfig.java b/java/common/org/linphone/core/LinphoneProxyConfig.java
index 0ff1900a3..ded4f9457 100644
--- a/java/common/org/linphone/core/LinphoneProxyConfig.java
+++ b/java/common/org/linphone/core/LinphoneProxyConfig.java
@@ -163,6 +163,29 @@ public interface LinphoneProxyConfig {
*/
int getPrivacy();
+ /**
+ * Indicates whether AVPF/SAVPF must be used for calls using this proxy config.
+ * @param enable True to enable AVPF/SAVF, false to disable it.
+ */
+ void enableAvpf(boolean enable);
+
+ /**
+ * Set the interval between regular RTCP reports when using AVPF/SAVPF.
+ * @param interval The interval in seconds (between 0 and 5 seconds).
+ */
+ void setAvpfRRInterval(int interval);
+
+ /**
+ * Get the interval between regular RTCP reports when using AVPF/SAVPF.
+ * @return The interval in seconds.
+ */
+ int getAvpfRRInterval();
+
+ /**
+ * Whether AVPF is used for calls through this proxy.
+ * @return
+ */
+ boolean avpfEnabled();
/**
* Set optional contact parameters that will be added to the contact information sent in the registration.
diff --git a/java/impl/org/linphone/core/LinphoneChatRoomImpl.java b/java/impl/org/linphone/core/LinphoneChatRoomImpl.java
index 7901272c9..8aa9c258d 100644
--- a/java/impl/org/linphone/core/LinphoneChatRoomImpl.java
+++ b/java/impl/org/linphone/core/LinphoneChatRoomImpl.java
@@ -44,79 +44,110 @@ class LinphoneChatRoomImpl implements LinphoneChatRoom {
nativePtr = aNativePtr;
}
- public LinphoneAddress getPeerAddress() {
+ public synchronized LinphoneAddress getPeerAddress() {
return new LinphoneAddressImpl(getPeerAddress(nativePtr),LinphoneAddressImpl.WrapMode.FromConst);
}
- public void sendMessage(String message) {
- sendMessage(nativePtr,message);
- }
-
- @Override
- public void sendMessage(LinphoneChatMessage message, StateListener listener) {
- sendMessage2(nativePtr, message, ((LinphoneChatMessageImpl)message).getNativePtr(), listener);
- }
-
- @Override
- public LinphoneChatMessage createLinphoneChatMessage(String message) {
- return new LinphoneChatMessageImpl(createLinphoneChatMessage(nativePtr, message));
- }
-
- public LinphoneChatMessage[] getHistory() {
- return getHistory(0);
- }
-
- public LinphoneChatMessage[] getHistory(int limit) {
- long[] typesPtr = getHistory(nativePtr, limit);
- if (typesPtr == null) return null;
-
- LinphoneChatMessage[] messages = new LinphoneChatMessage[typesPtr.length];
- for (int i=0; i < messages.length; i++) {
- messages[i] = new LinphoneChatMessageImpl(typesPtr[i]);
+ public synchronized void sendMessage(String message) {
+ synchronized(getCore()){
+ sendMessage(nativePtr,message);
}
-
- return messages;
}
- public void destroy() {
+ @Override
+ public synchronized void sendMessage(LinphoneChatMessage message, StateListener listener) {
+ synchronized(getCore()){
+ sendMessage2(nativePtr, message, ((LinphoneChatMessageImpl)message).getNativePtr(), listener);
+ }
+ }
+
+ @Override
+ public synchronized LinphoneChatMessage createLinphoneChatMessage(String message) {
+ synchronized(getCore()){
+ return new LinphoneChatMessageImpl(createLinphoneChatMessage(nativePtr, message));
+ }
+ }
+
+ public synchronized LinphoneChatMessage[] getHistory() {
+ synchronized(getCore()){
+ return getHistory(0);
+ }
+ }
+
+ public synchronized LinphoneChatMessage[] getHistory(int limit) {
+ synchronized(getCore()){
+ long[] typesPtr = getHistory(nativePtr, limit);
+ if (typesPtr == null) return null;
+
+ LinphoneChatMessage[] messages = new LinphoneChatMessage[typesPtr.length];
+ for (int i=0; i < messages.length; i++) {
+ messages[i] = new LinphoneChatMessageImpl(typesPtr[i]);
+ }
+
+ return messages;
+ }
+ }
+
+ public synchronized void destroy() {
destroy(nativePtr);
}
- public int getUnreadMessagesCount() {
- return getUnreadMessagesCount(nativePtr);
+ public synchronized int getUnreadMessagesCount() {
+ synchronized(getCore()){
+ return getUnreadMessagesCount(nativePtr);
+ }
}
- public void deleteHistory() {
- deleteHistory(nativePtr);
+ public synchronized void deleteHistory() {
+ synchronized(getCore()){
+ deleteHistory(nativePtr);
+ }
}
- public void compose() {
- compose(nativePtr);
+ public synchronized void compose() {
+ synchronized(getCore()){
+ compose(nativePtr);
+ }
}
- public boolean isRemoteComposing() {
- return isRemoteComposing(nativePtr);
+ public synchronized boolean isRemoteComposing() {
+ synchronized(getCore()){
+ return isRemoteComposing(nativePtr);
+ }
}
- public void markAsRead() {
- markAsRead(nativePtr);
+ public synchronized void markAsRead() {
+ synchronized(getCore()){
+ markAsRead(nativePtr);
+ }
}
- public void deleteMessage(LinphoneChatMessage message) {
- if (message != null)
- deleteMessage(nativePtr, ((LinphoneChatMessageImpl)message).getNativePtr());
+ public synchronized void deleteMessage(LinphoneChatMessage message) {
+ synchronized(getCore()){
+ if (message != null)
+ deleteMessage(nativePtr, ((LinphoneChatMessageImpl)message).getNativePtr());
+ }
}
- public void updateUrl(LinphoneChatMessage message) {
- if (message != null)
- updateUrl(nativePtr, ((LinphoneChatMessageImpl)message).getNativePtr());
+ public synchronized void updateUrl(LinphoneChatMessage message) {
+ synchronized(getCore()){
+ if (message != null)
+ updateUrl(nativePtr, ((LinphoneChatMessageImpl)message).getNativePtr());
+ }
}
@Override
- public LinphoneChatMessage createLinphoneChatMessage(String message,
+ public synchronized LinphoneChatMessage createLinphoneChatMessage(String message,
String url, State state, long timestamp, boolean isRead,
boolean isIncoming) {
- return new LinphoneChatMessageImpl(createLinphoneChatMessage2(
- nativePtr, message, url, state.value(), timestamp / 1000, isRead, isIncoming));
+ synchronized(getCore()){
+ return new LinphoneChatMessageImpl(createLinphoneChatMessage2(
+ nativePtr, message, url, state.value(), timestamp / 1000, isRead, isIncoming));
+ }
+ }
+ private native Object getCore(long nativePtr);
+ @Override
+ public synchronized LinphoneCore getCore() {
+ return (LinphoneCore)getCore(nativePtr);
}
}
diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java
index 8cd5fe79e..bf43810a3 100644
--- a/java/impl/org/linphone/core/LinphoneCoreImpl.java
+++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java
@@ -610,13 +610,13 @@ class LinphoneCoreImpl implements LinphoneCore {
public synchronized void enableEchoLimiter(boolean val) {
enableEchoLimiter(nativePtr,val);
}
- public void setVideoDevice(int id) {
+ public synchronized void setVideoDevice(int id) {
Log.i("Setting camera id :", id);
if (setVideoDevice(nativePtr, id) != 0) {
Log.e("Failed to set video device to id:", id);
}
}
- public int getVideoDevice() {
+ public synchronized int getVideoDevice() {
return getVideoDevice(nativePtr);
}
@@ -847,7 +847,7 @@ class LinphoneCoreImpl implements LinphoneCore {
private native void tunnelSetHttpProxy(long nativePtr, String proxy_host, int port,
String username, String password);
@Override
- public void tunnelSetHttpProxy(String proxy_host, int port,
+ public synchronized void tunnelSetHttpProxy(String proxy_host, int port,
String username, String password) {
tunnelSetHttpProxy(nativePtr, proxy_host, port, username, password);
}
@@ -1185,17 +1185,17 @@ class LinphoneCoreImpl implements LinphoneCore {
}
@Override
- public void stopRinging() {
+ public synchronized void stopRinging() {
stopRinging(nativePtr);
}
private native void setPayloadTypeBitrate(long coreptr, long payload_ptr, int bitrate);
@Override
- public void setPayloadTypeBitrate(PayloadType pt, int bitrate) {
+ public synchronized void setPayloadTypeBitrate(PayloadType pt, int bitrate) {
setPayloadTypeBitrate(nativePtr, ((PayloadTypeImpl)pt).nativePtr, bitrate);
}
private native int getPayloadTypeBitrate(long coreptr, long payload_ptr);
@Override
- public int getPayloadTypeBitrate(PayloadType pt) {
+ public synchronized int getPayloadTypeBitrate(PayloadType pt) {
return getPayloadTypeBitrate(nativePtr, ((PayloadTypeImpl)pt).nativePtr);
}
diff --git a/java/impl/org/linphone/core/LinphoneEventImpl.java b/java/impl/org/linphone/core/LinphoneEventImpl.java
index 2b4c1a71b..ca9c2151c 100644
--- a/java/impl/org/linphone/core/LinphoneEventImpl.java
+++ b/java/impl/org/linphone/core/LinphoneEventImpl.java
@@ -11,71 +11,83 @@ public class LinphoneEventImpl implements LinphoneEvent {
private native String getEventName(long nativeptr);
@Override
- public String getEventName() {
+ public synchronized String getEventName() {
return getEventName(mNativePtr);
}
private native int acceptSubscription(long nativeptr);
@Override
- public void acceptSubscription() {
- acceptSubscription(mNativePtr);
+ public synchronized void acceptSubscription() {
+ synchronized(getCore()){
+ acceptSubscription(mNativePtr);
+ }
}
private native int denySubscription(long nativeptr, int reason);
@Override
- public void denySubscription(Reason reason) {
- denySubscription(mNativePtr,reason.mValue);
+ public synchronized void denySubscription(Reason reason) {
+ synchronized(getCore()){
+ denySubscription(mNativePtr,reason.mValue);
+ }
}
private native int notify(long nativeptr, String type, String subtype, byte data[], String encoding);
@Override
- public void notify(LinphoneContent content) {
- notify(mNativePtr,content.getType(),content.getSubtype(),content.getData(),content.getEncoding());
+ public synchronized void notify(LinphoneContent content) {
+ synchronized(getCore()){
+ notify(mNativePtr,content.getType(),content.getSubtype(),content.getData(),content.getEncoding());
+ }
}
private native int updateSubscribe(long nativePtr, String type, String subtype, byte data[], String encoding);
@Override
- public void updateSubscribe(LinphoneContent content) {
- updateSubscribe(mNativePtr,content.getType(), content.getSubtype(),content.getData(),content.getEncoding());
+ public synchronized void updateSubscribe(LinphoneContent content) {
+ synchronized(getCore()){
+ updateSubscribe(mNativePtr,content.getType(), content.getSubtype(),content.getData(),content.getEncoding());
+ }
}
private native int updatePublish(long nativePtr, String type, String subtype, byte data[], String encoding);
@Override
- public void updatePublish(LinphoneContent content) {
- updatePublish(mNativePtr,content.getType(), content.getSubtype(),content.getData(),content.getEncoding());
+ public synchronized void updatePublish(LinphoneContent content) {
+ synchronized(getCore()){
+ updatePublish(mNativePtr,content.getType(), content.getSubtype(),content.getData(),content.getEncoding());
+ }
}
private native int terminate(long nativePtr);
@Override
- public void terminate() {
- terminate(mNativePtr);
+ public synchronized void terminate() {
+ synchronized(getCore()){
+ terminate(mNativePtr);
+ }
}
private native int getReason(long nativePtr);
@Override
- public Reason getReason() {
+ public synchronized Reason getReason() {
return Reason.fromInt(getReason(mNativePtr));
}
@Override
- public void setUserContext(Object obj) {
+ public synchronized void setUserContext(Object obj) {
mUserContext=obj;
}
@Override
- public Object getUserContext() {
+ public synchronized Object getUserContext() {
return mUserContext;
}
private native int getSubscriptionDir(long nativeptr);
@Override
- public SubscriptionDir getSubscriptionDir() {
+ public synchronized SubscriptionDir getSubscriptionDir() {
return SubscriptionDir.fromInt(getSubscriptionDir(mNativePtr));
}
private native int getSubscriptionState(long nativeptr);
@Override
- public SubscriptionState getSubscriptionState() {
+ public synchronized SubscriptionState getSubscriptionState() {
try {
return SubscriptionState.fromInt(getSubscriptionState(mNativePtr));
} catch (LinphoneCoreException e) {
@@ -91,37 +103,47 @@ public class LinphoneEventImpl implements LinphoneEvent {
private native void addCustomHeader(long ptr, String name, String value);
@Override
- public void addCustomHeader(String name, String value) {
+ public synchronized void addCustomHeader(String name, String value) {
addCustomHeader(mNativePtr, name, value);
}
private native String getCustomHeader(long ptr, String name);
@Override
- public String getCustomHeader(String name) {
+ public synchronized String getCustomHeader(String name) {
return getCustomHeader(mNativePtr, name);
}
private native void sendSubscribe(long ptr, String type, String subtype, byte data [], String encoding);
@Override
- public void sendSubscribe(LinphoneContent body) {
- if (body != null)
- sendSubscribe(mNativePtr, body.getType(), body.getSubtype(), body.getData(), body.getEncoding());
- else
- sendSubscribe(mNativePtr, null, null, null, null);
+ public synchronized void sendSubscribe(LinphoneContent body) {
+ synchronized(getCore()){
+ if (body != null)
+ sendSubscribe(mNativePtr, body.getType(), body.getSubtype(), body.getData(), body.getEncoding());
+ else
+ sendSubscribe(mNativePtr, null, null, null, null);
+ }
}
private native void sendPublish(long ptr, String type, String subtype, byte data [], String encoding);
@Override
- public void sendPublish(LinphoneContent body) {
- if (body != null)
- sendPublish(mNativePtr, body.getType(), body.getSubtype(), body.getData(), body.getEncoding());
- else
- sendPublish(mNativePtr, null, null, null, null);
+ public synchronized void sendPublish(LinphoneContent body) {
+ synchronized(getCore()){
+ if (body != null)
+ sendPublish(mNativePtr, body.getType(), body.getSubtype(), body.getData(), body.getEncoding());
+ else
+ sendPublish(mNativePtr, null, null, null, null);
+ }
}
private native long getErrorInfo(long nativePtr);
@Override
- public ErrorInfo getErrorInfo() {
+ public synchronized ErrorInfo getErrorInfo() {
return new ErrorInfoImpl(getErrorInfo(mNativePtr));
}
+ private native Object getCore(long nativePtr);
+ @Override
+ public synchronized LinphoneCore getCore() {
+ return (LinphoneCore)getCore(mNativePtr);
+ }
+
}
diff --git a/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java b/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java
index a78819075..aface8e36 100644
--- a/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java
+++ b/java/impl/org/linphone/core/LinphoneProxyConfigImpl.java
@@ -198,6 +198,30 @@ class LinphoneProxyConfigImpl implements LinphoneProxyConfig {
return getPrivacy(nativePtr);
}
+ private native void enableAvpf(long nativePtr, boolean enable);
+ @Override
+ public void enableAvpf(boolean enable) {
+ enableAvpf(nativePtr, enable);
+ }
+
+ private native boolean avpfEnabled(long nativePtr);
+ @Override
+ public boolean avpfEnabled() {
+ return avpfEnabled(nativePtr);
+ }
+
+ private native void setAvpfRRInterval(long nativePtr, int interval);
+ @Override
+ public void setAvpfRRInterval(int interval) {
+ setAvpfRRInterval(nativePtr, interval);
+ }
+
+ private native int getAvpfRRInterval(long nativePtr);
+ @Override
+ public int getAvpfRRInterval() {
+ return getAvpfRRInterval(nativePtr);
+ }
+
private native String getContactParameters(long ptr);
@Override
public String getContactParameters() {
diff --git a/mediastreamer2 b/mediastreamer2
index 77022250a..5313bf3a5 160000
--- a/mediastreamer2
+++ b/mediastreamer2
@@ -1 +1 @@
-Subproject commit 77022250a04459648101c3b4152d83158bbe0e63
+Subproject commit 5313bf3a57474411efce3b8f60a8c7190554a619
diff --git a/oRTP b/oRTP
index 519fabfed..9d03c3aa1 160000
--- a/oRTP
+++ b/oRTP
@@ -1 +1 @@
-Subproject commit 519fabfed1b38c9cde977d4c7a8a7c2bb642e0cb
+Subproject commit 9d03c3aa1643f1cfae32de4abf04dc84ff3ad175
diff --git a/po/cs.po b/po/cs.po
index bfbfe77b8..048bb9624 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -18,7 +18,7 @@ msgid ""
msgstr ""
"Project-Id-Version: linphone-3.5.99.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2013-05-01 09:55+0200\n"
"Last-Translator: Petr Pisar \n"
"Language-Team: Czech \n"
@@ -28,38 +28,38 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "Volat komu: %s"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "Poslat text komu: %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, c-format
msgid "Recent calls (%i)"
msgstr "Nedávné hovory (%i)"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr "–"
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
msgid "Aborted"
msgstr "Přerušen"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
msgid "Missed"
msgstr "Zmeškán"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
msgid "Declined"
msgstr "Odmítnut"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
@@ -67,7 +67,7 @@ msgstr[0] "%i minuta"
msgstr[1] "%i minuty"
msgstr[2] "%i minut"
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
@@ -75,12 +75,12 @@ msgstr[0] "%i sekunda"
msgstr[1] "%i sekundy"
msgstr[2] "%i sekund"
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr "%s\t%s"
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
@@ -89,7 +89,7 @@ msgstr ""
"%s\tKvalita: %s\n"
"%s\t%s\t"
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -111,35 +111,35 @@ msgstr "Já"
msgid "Couldn't find pixmap file: %s"
msgstr "Nelze najít soubor s obrázkem: %s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "Neplatný sipový kontakt!"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
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:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr "Soubor, kam zapisovat protokol."
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr "Spustí linphone se zakázaným obrazem."
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
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:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr "Zavolá právě teď na tuto adresu"
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr "je-li nastaveno, automaticky zvedne příchozí hovor"
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
@@ -147,17 +147,22 @@ msgstr ""
"Zadejte pracovní adresář (měl by být základní instalační adresář, například "
"c:\\Program Files\\Linphone)"
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Potvrzení"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "Průvodce nastavením účtu"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "Hovor s %s"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -170,7 +175,7 @@ msgstr ""
"do svého adresáře?\n"
"Odpovíte-li ne, tato osobo bude dočasně blokována."
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
@@ -179,59 +184,59 @@ msgstr ""
"Prosím, zadejte heslo pro uživatele %s\n"
"v doméně %s:"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
msgid "Call error"
msgstr "Chyba hovoru"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "Hovor ukončen"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Příchozí hovor"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr "Odpovědět"
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "Odmítnout"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
msgid "Call paused"
msgstr "Hovor odložen"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, c-format
msgid "by %s"
msgstr "kým: %s"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr "%s navrhuje začít videohovor. Přijímáte?"
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "Odkaz na webovou stránku"
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Lipnhone – internetový videofon"
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (Výchozí)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr "Byly jsme přepojeni na %s"
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
msgid ""
"No sound cards have been detected on this computer.\n"
"You won't be able to send or receive audio calls."
@@ -239,7 +244,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:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "Volný SIP videofon"
@@ -251,7 +256,7 @@ msgstr "Přidat do adresáře"
msgid "Presence status"
msgstr "Stav"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Jméno"
@@ -268,142 +273,142 @@ msgstr "Diskuze"
msgid "Search in %s directory"
msgstr "Hledat v adresáři %s"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "Upravit kontakt „%s“"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "Odstranit kontakt „%s“"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, c-format
msgid "Delete chat history of '%s'"
msgstr "Odstranit historii diskuze u kontaktu „%s“"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "Přidat nový kontakt z adresáře %s"
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Kmitočet (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Stav"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Min. rychlost (kb/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Parametry"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "Povoleno"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Zakázáno"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "Účet"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "angličtina"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "francouzština"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "švédština"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "italština"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "španělština"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "brazilská portugalština"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "polština"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "němčina"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "ruština"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "japonština"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "dánština"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "maďarština"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "čeština"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "čínština"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr "tradiční čínština"
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr "norština"
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr "hebrejština"
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr "srbština"
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr "Aby se projevil výběr nového jazyka, je nutné znovu spustit linphone."
# Media encryption type:
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr "Žádné"
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr "SRTP"
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr "ZRTP"
@@ -547,40 +552,40 @@ msgstr ""
"zaslali e-mailem.\n"
"Pak se sem vraťte a stiskněte tlačítko Další."
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "Průvodce nastavením účtu"
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "Vítejte v průvodci nastavení účtu"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "Průvodce nastavením účtu"
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
msgid "Configure your account (step 1/1)"
msgstr "Nastavit účet (krok 1/1)"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr "Zadejte vaše sipové uživatelské jméno (krok 1/1)"
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr "Zadejte údaje o účtu (krok 1/2)"
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr "Ověření (krok 2/2)"
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr "Chyba"
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr "Ukončuje se"
@@ -589,64 +594,64 @@ msgstr "Ukončuje se"
msgid "Call #%i"
msgstr "Hovor č. %i"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr "Přepojit hovor č. %i s %s"
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
msgid "Not used"
msgstr "Nepoužito"
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr "ICE není zapnuto"
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
msgid "ICE failed"
msgstr "ICE selhalo"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr "Probíhá ICE"
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr "Prochází se jedním nebo více NATy"
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
msgid "Direct"
msgstr "Přímé"
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr "Skrze relay server"
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr "UPnP není zapnuto"
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
msgid "uPnP in progress"
msgstr "Probíhá UPnP"
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
msgid "uPnp not available"
msgstr "UPnP není nedostupné"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr "UPnP běží"
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
msgid "uPnP failed"
msgstr "UPnP selhalo"
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr "Přímé nebo skrze server"
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
@@ -655,115 +660,115 @@ msgstr ""
"příchozí: %f\n"
"odchozí: %f (kb/s)"
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr "%.3f sekund"
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr "Zavěsit"
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
msgid "Calling..."
msgstr "Volá se…"
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr "00:00:00"
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
msgid "Incoming call"
msgstr "Příchozí hovor"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr "dobrá"
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr "průměrná"
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr "slabá"
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr "velmi slabá"
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr "příliš špatná"
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr "nedostupná"
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr "Zabezpečeno pomocí SRTP"
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr "Zabezpečeno pomocí ZRTP – [ověřovací klíč: %s]"
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr "Nastavit na neověřeno"
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr "Nastavit na ověřeno"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr "Probíhá konference"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In call"
msgstr "Probíhá hovor"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
msgid "Paused call"
msgstr "Odložený hovor"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr "%02i:%02i:%02i"
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "Hovor skončil."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr "Probíhá přepojení"
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr "Přepojení dokončeno."
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
msgid "Transfer failed."
msgstr "Přepojení selhalo."
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr "Obnovit"
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr "Odložit"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
@@ -772,7 +777,7 @@ msgstr ""
"Nahrává se do\n"
"%s %s"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
msgid "(Paused)"
msgstr "(Odloženo)"
@@ -791,6 +796,88 @@ msgstr "Příchozí hovor od %s"
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"Vítejte!\n"
+"Tento průvodce vám pomůže používat sipový účet při vašich hovorech."
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Zařízení pro nahrávání:"
+
+#: ../gtk/audio_assistant.c:327
+#, fuzzy
+msgid "Recorded volume"
+msgstr "Zdroj nahrávání:"
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Zařízení pro přehrávání:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "Průvodce"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "Průvodce účtem"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
msgid "Callee name"
msgstr "Jméno volaného"
@@ -832,123 +919,123 @@ msgid "Call quality rating"
msgstr "Hodnocení kvality hovoru"
#: ../gtk/main.ui.h:17
+msgid "All users"
+msgstr "všech uživatelích"
+
+#: ../gtk/main.ui.h:18
+msgid "Online users"
+msgstr "připojených uživatelích"
+
+#: ../gtk/main.ui.h:19
+msgid "ADSL"
+msgstr "ADSL"
+
+#: ../gtk/main.ui.h:20
+msgid "Fiber Channel"
+msgstr "Fiber Channel"
+
+#: ../gtk/main.ui.h:21
+msgid "Default"
+msgstr "Výchozí"
+
+#: ../gtk/main.ui.h:22
msgid "_Options"
msgstr "V_olby"
-#: ../gtk/main.ui.h:18
+#: ../gtk/main.ui.h:23
#, fuzzy
msgid "Set configuration URI"
msgstr "Konfigurace proxy a registrace"
-#: ../gtk/main.ui.h:19
+#: ../gtk/main.ui.h:24
msgid "Always start video"
msgstr "Vždy spustit obraz"
-#: ../gtk/main.ui.h:20
+#: ../gtk/main.ui.h:25
msgid "Enable self-view"
msgstr "Zobrazovat sám sebe"
-#: ../gtk/main.ui.h:21
+#: ../gtk/main.ui.h:26
msgid "_Help"
msgstr "Nápo_věda"
-#: ../gtk/main.ui.h:22
+#: ../gtk/main.ui.h:27
msgid "Show debug window"
msgstr "Zobrazit ladicí okno"
-#: ../gtk/main.ui.h:23
+#: ../gtk/main.ui.h:28
msgid "_Homepage"
msgstr "_Domovská stránka"
-#: ../gtk/main.ui.h:24
+#: ../gtk/main.ui.h:29
msgid "Check _Updates"
msgstr "Vyhledat akt_ualizace"
-#: ../gtk/main.ui.h:25
+#: ../gtk/main.ui.h:30
msgid "Account assistant"
msgstr "Průvodce účtem"
-#: ../gtk/main.ui.h:26
+#: ../gtk/main.ui.h:32
msgid "SIP address or phone number:"
msgstr "SIP adresa nebo telefonní číslo:"
-#: ../gtk/main.ui.h:27
+#: ../gtk/main.ui.h:33
msgid "Initiate a new call"
msgstr "Zahájit nový hovor"
-#: ../gtk/main.ui.h:28
+#: ../gtk/main.ui.h:34
msgid "Contacts"
msgstr "Kontakty"
-#: ../gtk/main.ui.h:29
+#: ../gtk/main.ui.h:35
msgid "Search"
msgstr "Hledat"
-#: ../gtk/main.ui.h:30
+#: ../gtk/main.ui.h:36
msgid "Add contacts from directory"
msgstr "Přidat kontakty z adresáře"
-#: ../gtk/main.ui.h:31
+#: ../gtk/main.ui.h:37
msgid "Add contact"
msgstr "Přidat kontakt"
-#: ../gtk/main.ui.h:32
+#: ../gtk/main.ui.h:38
msgid "Recent calls"
msgstr "Nedávné hovory"
-#: ../gtk/main.ui.h:33
+#: ../gtk/main.ui.h:39
msgid "My current identity:"
msgstr "Moje současná totožnost:"
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
msgid "Username"
msgstr "Uživatelské jméno"
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
msgid "Password"
msgstr "Heslo"
-#: ../gtk/main.ui.h:36
+#: ../gtk/main.ui.h:42
msgid "Internet connection:"
msgstr "Připojení k Internetu:"
-#: ../gtk/main.ui.h:37
+#: ../gtk/main.ui.h:43
msgid "Automatically log me in"
msgstr "Přihlašovat mě automaticky"
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
msgid "UserID"
msgstr "Identifikátor uživatele"
-#: ../gtk/main.ui.h:39
+#: ../gtk/main.ui.h:45
msgid "Login information"
msgstr "Informace o přihlášení"
-#: ../gtk/main.ui.h:40
+#: ../gtk/main.ui.h:46
msgid "Welcome !"
msgstr "Vítejte!"
-#: ../gtk/main.ui.h:41
-msgid "All users"
-msgstr "všech uživatelích"
-
-#: ../gtk/main.ui.h:42
-msgid "Online users"
-msgstr "připojených uživatelích"
-
-#: ../gtk/main.ui.h:43
-msgid "ADSL"
-msgstr "ADSL"
-
-#: ../gtk/main.ui.h:44
-msgid "Fiber Channel"
-msgstr "Fiber Channel"
-
-#: ../gtk/main.ui.h:45
-msgid "Default"
-msgstr "Výchozí"
-
-#: ../gtk/main.ui.h:46
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr "Smazat"
@@ -1070,23 +1157,32 @@ msgid "Contact params (optional):"
msgstr "Směrování (volitelné):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Směrování (volitelné):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Přenos"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr "Zaregistrovat se"
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "Zveřejnit stav přítomnosti"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Povolit"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "Nastavit SIP účet"
@@ -1513,6 +1609,11 @@ msgid "Video resolution sent"
msgstr "Upřednostňované rozlišení obrazu:"
#: ../gtk/call_statistics.ui.h:11
+#, fuzzy
+msgid "RTP profile"
+msgstr "RTP vlastnosti"
+
+#: ../gtk/call_statistics.ui.h:12
msgid "Call statistics and information"
msgstr "Statistické a ostatní údaje o hovoru"
@@ -1719,19 +1820,19 @@ msgstr "Připojuje se…"
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "přerušen"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "dokončen"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "promeškán"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1746,77 +1847,77 @@ msgstr ""
"Stav: %s\n"
"Délka: %i min %i s\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Odchozí hovor"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "Připraven."
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Potvrzení"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Vyhledává se umístění čísla…"
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "Toto číslo nelze vyhledat."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "Navazuje se spojení"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
msgid "Could not call"
msgstr "Nelze volat"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
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:2952
+#: ../coreapi/linphonecore.c:3022
msgid "is contacting you"
msgstr "vás volá"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr " a požaduje automatickou zvednutí."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr "."
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr "Upravují se parametry hovoru…"
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Připojeno."
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
msgid "Call aborted"
msgstr "Hovor přerušen"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr "Hovor nebylo možné odložit"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr "Současný hovor se odkládá…"
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "Hledá se adresa pomocí STUN…"
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr "Shromažďují se místní kandidáti ICE…"
@@ -1873,7 +1974,7 @@ msgstr "Délka"
msgid "Unknown-bug"
msgstr "Neznámá chyba"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
@@ -1881,7 +1982,7 @@ msgstr ""
"Adresa SIP proxy, kterou jste zadali, není platná. Musí začínat na „sip:“ a "
"pak musí následovat jméno stroje."
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1889,128 +1990,124 @@ msgstr ""
"SIP identita, kterou jste zadali, není platná.\n"
"Měla by mít tvar sip:uživatel@proxydoména, například sip:alice@example.net"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "Nelze se přihlásit jako %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr "Vyzvání na druhé straně."
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
msgid "Remote ringing..."
msgstr "Vyzvání na druhé straně…"
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr "Časná média."
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr "Hovor s %s je odložen."
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr "Hovor přijat kým: %s – odložen."
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
msgid "Call resumed."
msgstr "Hovor obnoven."
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr "Hovor přijat kým: %s."
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr "Není slučitelné. Zkontrolujte nastavení kodeků a zabezpečení…"
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr "Byli jsme obnoveni."
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr "Byli jsme odloženi protistranou."
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr "Hovor byl aktualizován protistranou."
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "Hovor ukončen."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "Uživatel je zaneprázdněn."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "Uživatel je dočasně nedostupný."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "Uživatel si nepřeje být rušen."
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Volání odmítnuto."
-#: ../coreapi/callbacks.c:603
-msgid "No response."
-msgstr "Žádná odpověď."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
+msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr "Chyba protokolu."
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr "Přesměrováno"
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr "Neslučitelné parametry médií."
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
msgid "Call failed."
msgstr "Volání se nezdařilo."
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "Registrace na %s byla úspěšná."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "Odregistrování z %s hotovo."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "odpověď nedorazila včas"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "Registrace na %s selhala: %s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, c-format
msgid "Authentication token is %s"
msgstr "Klíč k ověření totožnosti je %s"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
@@ -2018,6 +2115,12 @@ msgstr[0] "Máte %i zmeškaný hovor."
msgstr[1] "Máte %i zmeškané hovory."
msgstr[2] "Máte %i zmeškaných hovorů."
+#~ msgid "No response."
+#~ msgstr "Žádná odpověď."
+
+#~ msgid "Protocol error."
+#~ msgstr "Chyba protokolu."
+
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
#~ "user@domain"
@@ -2373,9 +2476,6 @@ msgstr[2] "Máte %i zmeškaných hovorů."
#~ msgid "Call answered - connected."
#~ msgstr "Hovoř přijat – spojen."
-#~ msgid "Assistant"
-#~ msgstr "Průvodce"
-
#~ msgid "Show debug messages"
#~ msgstr "Zobrazit ladicí zprávy"
@@ -2693,9 +2793,6 @@ msgstr[2] "Máte %i zmeškaných hovorů."
#~ msgid "RTP port used for audio:"
#~ msgstr "RTP port pro zvuk:"
-#~ msgid "RTP properties"
-#~ msgstr "RTP vlastnosti"
-
#~ msgid "Use SIP INFO message instead of RTP rfc2833 for DTMF transmitting"
#~ msgstr "Místo RTP rfc2833 použít pro DTMF přenos SIP INFO zprávu"
@@ -2708,9 +2805,6 @@ msgstr[2] "Máte %i zmeškaných hovorů."
#~ msgid "micro"
#~ msgstr "mikrofon"
-#~ msgid "Recording source:"
-#~ msgstr "Zdroj nahrávání:"
-
#~ msgid "Enable echo-canceler (cancels the echo heard by the remote party)"
#~ msgstr "Potlačit ozvěnu (projeví se na druhém konci)"
diff --git a/po/de.po b/po/de.po
index 95a385def..baec9ff8d 100644
--- a/po/de.po
+++ b/po/de.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: linphone 0.7.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2012-11-07 19:27+0100\n"
"Last-Translator: Gerhard Stengel \n"
"Language-Team: German \n"
@@ -17,57 +17,57 @@ msgstr ""
"X-Generator: Lokalize 1.5\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "„%s“ anrufen"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "Text zu „%s“ schicken"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "Im Gespräch"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr "nicht verfügbar"
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
msgid "Aborted"
msgstr "Abgebrochen"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
msgid "Missed"
msgstr "Entgangen"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
msgid "Declined"
msgstr "Abgewiesen"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] "%i Minute"
msgstr[1] "%i Minuten"
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] "%i Sekunde"
msgstr[1] "%i Sekunden"
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, fuzzy, c-format
msgid ""
"%s\tQuality: %s\n"
@@ -76,7 +76,7 @@ msgstr ""
"%s\t%s\tQualität: %s\n"
"%s\t%s %s\t"
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -96,37 +96,37 @@ msgstr "Eigenes Telefon"
msgid "Couldn't find pixmap file: %s"
msgstr "Pixmapdatei %s kann nicht gefunden werden."
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "Ungültiger SIP-Kontakt!"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr "Ausgabe von Debug-Informationen auf stdout während der Laufzeit"
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr "Pfad zu einer Datei, in die Protokolle geschrieben werden."
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr "Linphone mit ausgeschaltetem Video starten."
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
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:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr "Im Moment anzurufende Adresse"
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr "Falls aktiviert, werden eingehende Anrufe automatisch beantwortet"
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
@@ -134,17 +134,22 @@ msgstr ""
"Geben Sie einen Arbeitsordner an (sollte der Installationsordner sein, z. B. "
"C:\\Programme\\Linphone)"
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Bestätigung"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "Konto-Einrichtungsassistent"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "Im Gespräch mit %s"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -157,7 +162,7 @@ msgstr ""
"Ihrer Kontaktliste hinzufügen?\n"
"Wenn Sie mit Nein antworten, wird diese Person vorläufig blockiert."
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
@@ -166,59 +171,59 @@ msgstr ""
"Geben Sie bitte Ihr Passwort für den Benutzernamen %s\n"
" auf der Domäne %s ein:"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
msgid "Call error"
msgstr "Anruf fehlgeschlagen"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "Anruf beendet"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Eingehender Anruf"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr "Annehmen"
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "Abweisen"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
msgid "Call paused"
msgstr "Anruf wird gehalten"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, c-format
msgid "by %s"
msgstr "von %s"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, 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:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "Website-Verknüpfung"
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Linphone - ein Internet-Video-Telefon"
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (Vorgabe)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr "Vermittlung nach %s"
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
msgid ""
"No sound cards have been detected on this computer.\n"
"You won't be able to send or receive audio calls."
@@ -226,7 +231,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:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "Ein freies SIP-Video-Telefon"
@@ -238,7 +243,7 @@ msgstr "Zum Adressbuch hinzufügen"
msgid "Presence status"
msgstr "Anwesenheitsstatus"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Name"
@@ -256,143 +261,143 @@ msgstr "Chat Raum"
msgid "Search in %s directory"
msgstr "Im %s-Verzeichnis suchen"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "Kontakt „%s“ bearbeiten"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "Kontakt „%s“ löschen"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, fuzzy, c-format
msgid "Delete chat history of '%s'"
msgstr "Kontakt „%s“ löschen"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "Einen neuen Kontakt aus dem %s-Verzeichnis hinzufügen"
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Rate (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Status"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Min. Bitrate (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Parameter"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "Freigegeben"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Gesperrt"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "Konto"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "Englisch"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "Französisch"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "Schwedisch"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "Italienisch"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "Spanisch"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "Brasilianisches Portugiesisch"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "Polnisch"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "Deutsch"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "Russisch"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "Japanisch"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "Niederländisch"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "Ungarisch"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "Tschechisch"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "Chinesisch"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr "Traditionelles Chinesisch"
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr "Norwegisch"
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr ""
"Linphone muss neu gestartet werden, damit die neue Spracheinstellung wirksam "
"wird."
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr "Keinen"
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -538,40 +543,40 @@ msgstr ""
"wir Ihnen soeben per E-Mail geschickt haben.\n"
"Danach gehen Sie hierher zurück und drücken auf „Vor“."
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "Konto-Einrichtungsassistent"
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "Willkommen zum Konto-Einrichtungsassistenten"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "Konto-Einrichtungsassistent"
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
msgid "Configure your account (step 1/1)"
msgstr "Konto einrichten (Schritt 1/1)"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr "Geben Sie Ihren SIP-Benutzernamen ein (Schritt 1/1)"
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr "Geben Sie Ihre Zugangsdaten ein (Schritt 1/2)"
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr "Bestätigung (Schritt 2/2)"
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr "Fehler"
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr "Fertigstellen"
@@ -580,68 +585,68 @@ msgstr "Fertigstellen"
msgid "Call #%i"
msgstr "Anruf #%i"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr "Vermittlung zum Anruf #%i mit %s"
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
msgid "Not used"
msgstr "Nicht verwendet"
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr "ICE nicht aktiviert"
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
msgid "ICE failed"
msgstr "ICE fehlgeschlagen"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr "ICE läuft"
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr "Ein oder mehrere NATs werden durchquert"
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
msgid "Direct"
msgstr "Direkt"
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr "Über einen Relay-Server"
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
#, fuzzy
msgid "uPnP not activated"
msgstr "ICE nicht aktiviert"
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
#, fuzzy
msgid "uPnP in progress"
msgstr "ICE läuft"
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
#, fuzzy
msgid "uPnp not available"
msgstr "nicht verfügbar"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "ICE fehlgeschlagen"
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
@@ -650,122 +655,122 @@ msgstr ""
"Herunterladen: %f\n"
"Hochladen: %f (kbit/s)"
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, fuzzy, c-format
msgid "%.3f seconds"
msgstr "%i Sekunde"
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
msgid "Calling..."
msgstr "Verbindungsaufbau..."
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr ""
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
msgid "Incoming call"
msgstr "Eingehender Anruf"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr "gut"
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr "durchschnittlich"
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr "schlecht"
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr "sehr schlecht"
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr "zu schlecht"
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr "nicht verfügbar"
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr "Gesichert durch SRTP"
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr "Gesichert durch ZRTP - [Auth.-Token: %s]"
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr "Auf „Ungeprüft“ setzen"
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr "Auf „Geprüft“ setzen"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr "In Konferenz"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In call"
msgstr "Im Gespräch"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
msgid "Paused call"
msgstr "Gehaltener Anruf"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr ""
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "Anruf beendet."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr "Vermittlung läuft"
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr "Vermittlung abgeschlossen."
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
msgid "Transfer failed."
msgstr "Vermittlung fehlgeschlagen."
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr "Fortsetzen"
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr "Halten"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, fuzzy
msgid "(Paused)"
msgstr "Halten"
@@ -785,6 +790,89 @@ msgstr "Eingehendes Gespr�h"
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"Willkommen!\n"
+"Dieser Assistent wird Ihnen dabei helfen, ein SIP-Konto für Ihre Anrufe zu "
+"verwenden."
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Aufnahmegerät:"
+
+#: ../gtk/audio_assistant.c:327
+#, fuzzy
+msgid "Recorded volume"
+msgstr "Aufnahmequelle:"
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Wiedergabegerät:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "Konto-Einrichtungsassistent"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "Konto-Einrichtungsassistent"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
msgid "Callee name"
msgstr "Name des Angerufenen"
@@ -827,123 +915,123 @@ msgid "Call quality rating"
msgstr "Bewertung der Verbindungsqualität"
#: ../gtk/main.ui.h:17
+msgid "All users"
+msgstr "Alle Teilnehmer"
+
+#: ../gtk/main.ui.h:18
+msgid "Online users"
+msgstr "Angemeldete Teilnehmer"
+
+#: ../gtk/main.ui.h:19
+msgid "ADSL"
+msgstr ""
+
+#: ../gtk/main.ui.h:20
+msgid "Fiber Channel"
+msgstr "Glasfaserkabel"
+
+#: ../gtk/main.ui.h:21
+msgid "Default"
+msgstr "Vorgabe"
+
+#: ../gtk/main.ui.h:22
msgid "_Options"
msgstr "_Optionen"
-#: ../gtk/main.ui.h:18
+#: ../gtk/main.ui.h:23
#, fuzzy
msgid "Set configuration URI"
msgstr "Proxy/Registrator Konfigurationsbox"
-#: ../gtk/main.ui.h:19
+#: ../gtk/main.ui.h:24
msgid "Always start video"
msgstr "Video immer starten"
-#: ../gtk/main.ui.h:20
+#: ../gtk/main.ui.h:25
msgid "Enable self-view"
msgstr "Selbstansicht ein"
-#: ../gtk/main.ui.h:21
+#: ../gtk/main.ui.h:26
msgid "_Help"
msgstr "_Hilfe"
-#: ../gtk/main.ui.h:22
+#: ../gtk/main.ui.h:27
msgid "Show debug window"
msgstr "Debug-Fenster anzeigen"
-#: ../gtk/main.ui.h:23
+#: ../gtk/main.ui.h:28
msgid "_Homepage"
msgstr ""
-#: ../gtk/main.ui.h:24
+#: ../gtk/main.ui.h:29
msgid "Check _Updates"
msgstr "Auf _Aktualisierungen überprüfen"
-#: ../gtk/main.ui.h:25
+#: ../gtk/main.ui.h:30
msgid "Account assistant"
msgstr "Konto-Einrichtungsassistent"
-#: ../gtk/main.ui.h:26
+#: ../gtk/main.ui.h:32
msgid "SIP address or phone number:"
msgstr "SIP-Adresse oder Telefonnummer:"
-#: ../gtk/main.ui.h:27
+#: ../gtk/main.ui.h:33
msgid "Initiate a new call"
msgstr "Einen neuen Anruf beginnen"
-#: ../gtk/main.ui.h:28
+#: ../gtk/main.ui.h:34
msgid "Contacts"
msgstr "Kontakte"
-#: ../gtk/main.ui.h:29
+#: ../gtk/main.ui.h:35
msgid "Search"
msgstr "Suchen"
-#: ../gtk/main.ui.h:30
+#: ../gtk/main.ui.h:36
msgid "Add contacts from directory"
msgstr "Kontakte aus einem Verzeichnis hinzufügen"
-#: ../gtk/main.ui.h:31
+#: ../gtk/main.ui.h:37
msgid "Add contact"
msgstr "Kontakt hinzufügen"
-#: ../gtk/main.ui.h:32
+#: ../gtk/main.ui.h:38
msgid "Recent calls"
msgstr "Letzte Gespräche"
-#: ../gtk/main.ui.h:33
+#: ../gtk/main.ui.h:39
msgid "My current identity:"
msgstr "Aktuelle Identität:"
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
msgid "Username"
msgstr "Benutzername"
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
msgid "Password"
msgstr "Passwort"
-#: ../gtk/main.ui.h:36
+#: ../gtk/main.ui.h:42
msgid "Internet connection:"
msgstr "Internetverbindung:"
-#: ../gtk/main.ui.h:37
+#: ../gtk/main.ui.h:43
msgid "Automatically log me in"
msgstr "Automatisch anmelden"
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
msgid "UserID"
msgstr "Benutzer-ID"
-#: ../gtk/main.ui.h:39
+#: ../gtk/main.ui.h:45
msgid "Login information"
msgstr "Anmeldeinformationen"
-#: ../gtk/main.ui.h:40
+#: ../gtk/main.ui.h:46
msgid "Welcome !"
msgstr "Willkommen !"
-#: ../gtk/main.ui.h:41
-msgid "All users"
-msgstr "Alle Teilnehmer"
-
-#: ../gtk/main.ui.h:42
-msgid "Online users"
-msgstr "Angemeldete Teilnehmer"
-
-#: ../gtk/main.ui.h:43
-msgid "ADSL"
-msgstr ""
-
-#: ../gtk/main.ui.h:44
-msgid "Fiber Channel"
-msgstr "Glasfaserkabel"
-
-#: ../gtk/main.ui.h:45
-msgid "Default"
-msgstr "Vorgabe"
-
-#: ../gtk/main.ui.h:46
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1068,23 +1156,32 @@ msgid "Contact params (optional):"
msgstr "Route (optional):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Route (optional):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Übertragung"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr "Registrieren"
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "Anwesenheitsstatus veröffentlichen"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Freigeben"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "SIP-Konto einrichten"
@@ -1517,6 +1614,11 @@ msgid "Video resolution sent"
msgstr "Bevorzugte Video-Auflösung:"
#: ../gtk/call_statistics.ui.h:11
+#, fuzzy
+msgid "RTP profile"
+msgstr "RTP-Eingabefilter"
+
+#: ../gtk/call_statistics.ui.h:12
msgid "Call statistics and information"
msgstr "Anrufstatistik und -informationen"
@@ -1723,19 +1825,19 @@ msgstr "Verbinden..."
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "abgebrochen"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "beendet"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "entgangen"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1750,77 +1852,77 @@ msgstr ""
"Status: %s\n"
"Dauer: %i min %i sec\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Abgehender Anruf"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "Bereit"
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Bestätigung"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Telefonnummernziel wird gesucht..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "Diese Nummer kann nicht aufgelöst werden."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "Verbindungsaufbau"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
msgid "Could not call"
msgstr "Anruf kann nicht getätigt werden."
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr "Die maximale Anzahl der gleichzeitigen Anrufe ist erreicht."
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
msgid "is contacting you"
msgstr "ruft Sie an"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr " und fragt nach automatischer Antwort."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr ""
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr "Die Anrufparameter werden verändert..."
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Verbunden."
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
msgid "Call aborted"
msgstr "Anruf abgebrochen"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr "Anruf kann nicht gehalten werden"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr "Aktueller Anruf wird gehalten..."
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "STUN-Ermittlung läuft..."
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr "Lokale Kandidaten für ICE werden zusammengestellt..."
@@ -1877,7 +1979,7 @@ msgstr "Dauer"
msgid "Unknown-bug"
msgstr "Unbekannter Fehler"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
@@ -1885,7 +1987,7 @@ msgstr ""
"Die von Ihnen eingegebene SIP-Proxy-Adresse ist ungültig, sie muss mit "
"„sip:“ gefolgt vom Hostnamen beginnen."
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1894,135 +1996,137 @@ msgstr ""
"Sie sollte wie sip:benutzername@proxydomain aussehen, also z.B. sip:"
"alice@beispiel.net"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "Anmeldung als %s fehlgeschlagen"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr "Klingeln bei der Gegenseite."
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
msgid "Remote ringing..."
msgstr "Klingeln bei der Gegenseite..."
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr ""
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr "Anruf mit %s wird gehalten."
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr "Der von %s entgegengenommene Anruf wird gehalten."
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
msgid "Call resumed."
msgstr "Anruf fortgesetzt."
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr "Anruf wird von %s entgegengenommen."
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
#, fuzzy
msgid "Incompatible, check codecs or security settings..."
msgstr "Inkompatibel, überprüfen Sie die Codecs..."
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr "Anruf wird fortgesetzt."
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr "Anruf wird von der Gegenseite gehalten."
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr "Anruf ist von der Gegenseite aktualisiert worden."
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "Anruf beendet."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "Teilnehmer ist besetzt."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "Teilnehmer zur Zeit nicht verfügbar."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "Teilnehmer möchte nicht gestört werden."
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Anruf abgewiesen"
-#: ../coreapi/callbacks.c:603
-msgid "No response."
-msgstr "Keine Antwort."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
+msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr "Protokollfehler"
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr "Umgeleitet"
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr "Inkompatible Medienparameter."
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
msgid "Call failed."
msgstr "Anruf fehlgeschlagen."
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "Registrierung auf %s erfolgreich."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "Abmeldung von %s ist erfolgt."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "Zeitüberschreitung bei der Antwort"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "Registrierung auf %s fehlgeschlagen: %s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, c-format
msgid "Authentication token is %s"
msgstr "Authentifizierungs-Token ist %s"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
msgstr[0] "Sie haben %i Anruf in Abwesenheit."
msgstr[1] "Sie haben %i Anrufe in Abwesenheit."
+#~ msgid "No response."
+#~ msgstr "Keine Antwort."
+
+#~ msgid "Protocol error."
+#~ msgstr "Protokollfehler"
+
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
#~ "user@domain"
@@ -2208,9 +2312,6 @@ msgstr[1] "Sie haben %i Anrufe in Abwesenheit."
#~ msgid "RTP output filter"
#~ msgstr "RTP-Ausgabefilter"
-#~ msgid "RTP input filter"
-#~ msgstr "RTP-Eingabefilter"
-
#~ msgid "The free and wonderful speex codec"
#~ msgstr "Der freie und herrliche Speex-Codec"
@@ -2623,9 +2724,6 @@ msgstr[1] "Sie haben %i Anrufe in Abwesenheit."
#~ msgid "micro"
#~ msgstr "Mikrofon"
-#~ msgid "Recording source:"
-#~ msgstr "Aufnahmequelle:"
-
#~ msgid "Enable echo-canceler (cancels the echo heard by the remote party)"
#~ msgstr ""
#~ "Echounterdrückung einschalten (eliminiert das von Gesprächspartnet "
diff --git a/po/es.po b/po/es.po
index 92bfad869..37021a332 100644
--- a/po/es.po
+++ b/po/es.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Linphone 0.9.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2012-12-06 15:54+0100\n"
"Last-Translator: BERAUDO Guillaume \n"
"Language-Team: es \n"
@@ -15,62 +15,62 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "Llamar a %s"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "Enviar mensaje a %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "En llamada "
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr "n/a"
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "abortada"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
#, fuzzy
msgid "Missed"
msgstr "perdida"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "Rechazar"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] "%i minuto"
msgstr[1] "%i minutos"
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] "%i segundo"
msgstr[1] "%i segundos"
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, fuzzy, c-format
msgid "%s\t%s"
msgstr ""
"%s\t%s\tCalidad: %s\n"
"%s\t%s %s\t"
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, fuzzy, c-format
msgid ""
"%s\tQuality: %s\n"
@@ -79,7 +79,7 @@ msgstr ""
"%s\t%s\tCalidad: %s\n"
"%s\t%s %s\t"
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, fuzzy, c-format
msgid ""
"%s\t\n"
@@ -101,36 +101,36 @@ msgstr "Yo"
msgid "Couldn't find pixmap file: %s"
msgstr "No se pudo encontrar el archivo pixmap: %s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "¡Contacto SIP no válido!"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
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:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr "ruta a un fichero donde escribir logs."
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
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:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr "dirección a la que llamar inmediatamente"
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr "si está activo, responder a llamadas entrantes automáticamente"
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
@@ -138,17 +138,22 @@ 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:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Confirmación"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "Asistente de configuración de cuenta"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "Llamar con %s"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -161,7 +166,7 @@ msgstr ""
"contactos?\n"
"Si responde no, esta persona será bloqueada temporalmente."
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
@@ -170,63 +175,63 @@ msgstr ""
"Por favor, introduzca la contraseña para el usuario %s\n"
" en el dominio %s:"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
#, fuzzy
msgid "Call error"
msgstr "Error en la llamada."
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
#, fuzzy
msgid "Call ended"
msgstr "Llamada terminada"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Llamada entrante"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr "Contestar"
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
#, fuzzy
msgid "Decline"
msgstr "Rechazar"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy
msgid "Call paused"
msgstr "Llamada en pausa"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "Puertos"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "Enlace a la Web"
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Linphone - un video-teléfono a través de Internet"
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (Opción predeterminada)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr "Somos transferidos a %s"
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
msgid ""
"No sound cards have been detected on this computer.\n"
"You won't be able to send or receive audio calls."
@@ -234,7 +239,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:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "Un video-teléfono SIP gratuito"
@@ -248,7 +253,7 @@ msgstr "Añadir a la agenda"
msgid "Presence status"
msgstr "Estado de Presencia"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Nombre"
@@ -266,142 +271,142 @@ msgstr ""
msgid "Search in %s directory"
msgstr "Buscar en el directorio %s"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, fuzzy, c-format
msgid "Edit contact '%s'"
msgstr "Editar contacto '%s'"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "Eliminar contacto '%s'"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, fuzzy, c-format
msgid "Delete chat history of '%s'"
msgstr "Eliminar contacto '%s'"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "Añadir nuevo contacto desde el directorio %s"
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Frecuencia (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Estado"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Bitrate mínimo (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Parámetros"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "Activado"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Desactivado"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "Cuenta"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "Inglés"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "Francés"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "Sueco"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "Italiano"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "Español"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "Portugués de Brasil"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "Polaco"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "Alemán"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "Ruso"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "Japonés"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "Holandés"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "Húngaro"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "Checo"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "Chino"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr "Chino Tradicional"
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr "Noruego"
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr "Deberá reiniciar linphone para aplicar la nueva selección de lenguaje"
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
#, fuzzy
msgid "None"
msgstr "Ninguno."
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr "SRTP"
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr "ZRTP"
@@ -550,41 +555,41 @@ msgid ""
"Then come back here and press Next button."
msgstr ""
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "Asistente de configuración de cuenta"
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "Bienvenido al asistente de configuración de cuenta"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "Asistente de configuración de cuenta"
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
#, fuzzy
msgid "Configure your account (step 1/1)"
msgstr "Configurar una cuenta SIP"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr ""
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr ""
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr ""
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr ""
@@ -593,199 +598,199 @@ msgstr ""
msgid "Call #%i"
msgstr "Llamar a #%i"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr "Transferir a llamada #%i con %s"
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
#, fuzzy
msgid "Not used"
msgstr "No encontrado"
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "La llamada ha fallado."
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
#, fuzzy
msgid "Direct"
msgstr "Redigirida"
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
#, fuzzy
msgid "uPnP in progress"
msgstr "Búsqueda STUN en proceso…"
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
#, fuzzy
msgid "uPnp not available"
msgstr "no disponible"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "La llamada ha fallado."
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, fuzzy, c-format
msgid "%.3f seconds"
msgstr "%i segundo"
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
#, fuzzy
msgid "Calling..."
msgstr " Llamando..."
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr "00::00::00"
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
#, fuzzy
msgid "Incoming call"
msgstr "Llamada entrante"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr "buena"
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr "media"
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr "mala"
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr "muy mala"
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr "demasiado mala"
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr "no disponible"
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr "Cifrada con SRTP"
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr "Cifrada con ZRTP - [token de autenticación: %s]"
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr "Set sin verificar"
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr "Set verificado"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr "En conferencia"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
#, fuzzy
msgid "In call"
msgstr "En llamada "
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
#, fuzzy
msgid "Paused call"
msgstr "Llamada en pausa"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr "%02i::%02i::%02i"
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
#, fuzzy
msgid "Call ended."
msgstr "Llamada finalizada."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
#, fuzzy
msgid "Transfer done."
msgstr "Transferir"
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "Transferir"
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr "Reanudar"
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr "Pausar"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, fuzzy
msgid "(Paused)"
msgstr "Pausar"
@@ -805,6 +810,88 @@ msgstr ""
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"¡Bienvenido/a !\n"
+"Este asistente le ayudará a utilizar una cuenta SIP para sus llamadas."
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Dispositivo de captura:"
+
+#: ../gtk/audio_assistant.c:327
+#, fuzzy
+msgid "Recorded volume"
+msgstr "Fuente de grabación:"
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Dispositivo de reproducción:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "Asistente de configuración de cuenta"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "Asistente de configuración de cuenta"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
#, fuzzy
msgid "Callee name"
@@ -851,138 +938,138 @@ msgid "Call quality rating"
msgstr "Calidad de la llamada"
#: ../gtk/main.ui.h:17
-msgid "_Options"
-msgstr "_Opciones"
-
-#: ../gtk/main.ui.h:18
-#, fuzzy
-msgid "Set configuration URI"
-msgstr "Confirmación"
-
-#: ../gtk/main.ui.h:19
-msgid "Always start video"
-msgstr ""
-
-#: ../gtk/main.ui.h:20
-#, fuzzy
-msgid "Enable self-view"
-msgstr "Activar vista propia"
-
-#: ../gtk/main.ui.h:21
-msgid "_Help"
-msgstr "_Ayuda"
-
-#: ../gtk/main.ui.h:22
-#, fuzzy
-msgid "Show debug window"
-msgstr "Mostrar ventana de depuración"
-
-#: ../gtk/main.ui.h:23
-msgid "_Homepage"
-msgstr "_Pagina_de_Inicio"
-
-#: ../gtk/main.ui.h:24
-msgid "Check _Updates"
-msgstr "Buscar_Actualizaciones"
-
-#: ../gtk/main.ui.h:25
-#, fuzzy
-msgid "Account assistant"
-msgstr "Asistente de configuración de cuenta"
-
-#: ../gtk/main.ui.h:26
-#, fuzzy
-msgid "SIP address or phone number:"
-msgstr "Dirección SIP o número de teléfono"
-
-#: ../gtk/main.ui.h:27
-msgid "Initiate a new call"
-msgstr "Iniciar nueva llamada"
-
-#: ../gtk/main.ui.h:28
-#, fuzzy
-msgid "Contacts"
-msgstr "Contactos"
-
-#: ../gtk/main.ui.h:29
-msgid "Search"
-msgstr "Buscar"
-
-#: ../gtk/main.ui.h:30
-#, fuzzy
-msgid "Add contacts from directory"
-msgstr "Añadir contactos desde un directorio"
-
-#: ../gtk/main.ui.h:31
-#, fuzzy
-msgid "Add contact"
-msgstr "Añadir contacto"
-
-#: ../gtk/main.ui.h:32
-#, fuzzy
-msgid "Recent calls"
-msgstr "Llamadas recientes "
-
-#: ../gtk/main.ui.h:33
-#, fuzzy
-msgid "My current identity:"
-msgstr "Mi identidad actual:"
-
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
-#, fuzzy
-msgid "Username"
-msgstr "Nombre de usuario"
-
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
-#, fuzzy
-msgid "Password"
-msgstr "Contraseña:"
-
-#: ../gtk/main.ui.h:36
-msgid "Internet connection:"
-msgstr "Conexión a Internet"
-
-#: ../gtk/main.ui.h:37
-msgid "Automatically log me in"
-msgstr "Iniciar sesión automáticamente"
-
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
-msgid "UserID"
-msgstr "UserID"
-
-#: ../gtk/main.ui.h:39
-#, fuzzy
-msgid "Login information"
-msgstr "Datos de inicio de sesión"
-
-#: ../gtk/main.ui.h:40
-#, fuzzy
-msgid "Welcome !"
-msgstr "¡Bienvenido/a!"
-
-#: ../gtk/main.ui.h:41
msgid "All users"
msgstr "Todos los usuarios"
-#: ../gtk/main.ui.h:42
+#: ../gtk/main.ui.h:18
#, fuzzy
msgid "Online users"
msgstr "Usuarios conectados"
-#: ../gtk/main.ui.h:43
+#: ../gtk/main.ui.h:19
msgid "ADSL"
msgstr "ADSL"
-#: ../gtk/main.ui.h:44
+#: ../gtk/main.ui.h:20
msgid "Fiber Channel"
msgstr "Canal de Fibra"
-#: ../gtk/main.ui.h:45
+#: ../gtk/main.ui.h:21
#, fuzzy
msgid "Default"
msgstr "Predeterminado"
+#: ../gtk/main.ui.h:22
+msgid "_Options"
+msgstr "_Opciones"
+
+#: ../gtk/main.ui.h:23
+#, fuzzy
+msgid "Set configuration URI"
+msgstr "Confirmación"
+
+#: ../gtk/main.ui.h:24
+msgid "Always start video"
+msgstr ""
+
+#: ../gtk/main.ui.h:25
+#, fuzzy
+msgid "Enable self-view"
+msgstr "Activar vista propia"
+
+#: ../gtk/main.ui.h:26
+msgid "_Help"
+msgstr "_Ayuda"
+
+#: ../gtk/main.ui.h:27
+#, fuzzy
+msgid "Show debug window"
+msgstr "Mostrar ventana de depuración"
+
+#: ../gtk/main.ui.h:28
+msgid "_Homepage"
+msgstr "_Pagina_de_Inicio"
+
+#: ../gtk/main.ui.h:29
+msgid "Check _Updates"
+msgstr "Buscar_Actualizaciones"
+
+#: ../gtk/main.ui.h:30
+#, fuzzy
+msgid "Account assistant"
+msgstr "Asistente de configuración de cuenta"
+
+#: ../gtk/main.ui.h:32
+#, fuzzy
+msgid "SIP address or phone number:"
+msgstr "Dirección SIP o número de teléfono"
+
+#: ../gtk/main.ui.h:33
+msgid "Initiate a new call"
+msgstr "Iniciar nueva llamada"
+
+#: ../gtk/main.ui.h:34
+#, fuzzy
+msgid "Contacts"
+msgstr "Contactos"
+
+#: ../gtk/main.ui.h:35
+msgid "Search"
+msgstr "Buscar"
+
+#: ../gtk/main.ui.h:36
+#, fuzzy
+msgid "Add contacts from directory"
+msgstr "Añadir contactos desde un directorio"
+
+#: ../gtk/main.ui.h:37
+#, fuzzy
+msgid "Add contact"
+msgstr "Añadir contacto"
+
+#: ../gtk/main.ui.h:38
+#, fuzzy
+msgid "Recent calls"
+msgstr "Llamadas recientes "
+
+#: ../gtk/main.ui.h:39
+#, fuzzy
+msgid "My current identity:"
+msgstr "Mi identidad actual:"
+
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
+#, fuzzy
+msgid "Username"
+msgstr "Nombre de usuario"
+
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
+#, fuzzy
+msgid "Password"
+msgstr "Contraseña:"
+
+#: ../gtk/main.ui.h:42
+msgid "Internet connection:"
+msgstr "Conexión a Internet"
+
+#: ../gtk/main.ui.h:43
+msgid "Automatically log me in"
+msgstr "Iniciar sesión automáticamente"
+
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
+msgid "UserID"
+msgstr "UserID"
+
+#: ../gtk/main.ui.h:45
+#, fuzzy
+msgid "Login information"
+msgstr "Datos de inicio de sesión"
+
#: ../gtk/main.ui.h:46
+#, fuzzy
+msgid "Welcome !"
+msgstr "¡Bienvenido/a!"
+
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1115,24 +1202,33 @@ msgid "Contact params (optional):"
msgstr "Ruta (opcional):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Ruta (opcional):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Transporte "
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr "Registrarse"
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
#, fuzzy
msgid "Publish presence information"
msgstr "Publicar información de presencia"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Activar"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "Configurar una cuenta SIP"
@@ -1594,6 +1690,10 @@ msgid "Video resolution sent"
msgstr "Resolución de vídeo preferida:"
#: ../gtk/call_statistics.ui.h:11
+msgid "RTP profile"
+msgstr ""
+
+#: ../gtk/call_statistics.ui.h:12
#, fuzzy
msgid "Call statistics and information"
msgstr "Información de contacto"
@@ -1801,19 +1901,19 @@ msgstr "Conectando..."
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "abortada"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "completada"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "perdida"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1828,82 +1928,82 @@ msgstr ""
"Estado: %s\n"
"Duración: %i min %i seg\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Llamada saliente"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
#, fuzzy
msgid "Ready"
msgstr "Preparado"
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Confirmación"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Buscando el número de teléfono del destinatario…"
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "No se ha podido resolver este número."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
#, fuzzy
msgid "Contacting"
msgstr "Contactando"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
#, fuzzy
msgid "Could not call"
msgstr "No se pudo llamar"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
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:2952
+#: ../coreapi/linphonecore.c:3022
#, fuzzy
msgid "is contacting you"
msgstr "le está llamando"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr "y ha solicitado auto respuesta."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr "."
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr "Modificando parámetros de llamada…"
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Conectado."
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
#, fuzzy
msgid "Call aborted"
msgstr "Llamada abortada"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr "No se pudo pausar la llamada"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr "Pausando la llamada actual..."
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "Búsqueda STUN en proceso…"
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1964,7 +2064,7 @@ msgstr "Duración"
msgid "Unknown-bug"
msgstr "Bug-desconocido"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
@@ -1972,7 +2072,7 @@ msgstr ""
"La dirección del Proxy SIP que ha introducido no es válida, debe empezar con "
"\"sip:\" seguido del hostname."
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1981,141 +2081,143 @@ msgstr ""
"Debe ser del tipo sip:username@proxydomain, como por ejemplo sip:"
"alice@example.net"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, fuzzy, c-format
msgid "Could not login as %s"
msgstr "No se pudo iniciar sesión como %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
#, fuzzy
msgid "Remote ringing."
msgstr "El destinatario está sonando..."
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
#, fuzzy
msgid "Remote ringing..."
msgstr "El destinatario está sonando..."
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr "Medios iniciales."
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr "La llamada con %s está puesta en pausa."
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr "Llamada respondida por %s - en espera."
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
#, fuzzy
msgid "Call resumed."
msgstr "Llamada reanudada."
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, fuzzy, c-format
msgid "Call answered by %s."
msgstr "Llamada respondida por %s."
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
#, fuzzy
msgid "We have been resumed."
msgstr "Nos han reanudado..."
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
#, fuzzy
msgid "Call is updated by remote."
msgstr "La llamada ha sido actualizada por el destinatario..."
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
#, fuzzy
msgid "Call terminated."
msgstr "Llamada finalizada."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "El usuario está ocupado."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "El usuario no está disponible temporalmente."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "El usuario no quiere que le molesten."
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Llamada rechazada."
-#: ../coreapi/callbacks.c:603
-msgid "No response."
-msgstr "No hay respuesta."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
+msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr "Error de protocolo."
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr "Redigirida"
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr ""
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
#, fuzzy
msgid "Call failed."
msgstr "La llamada ha fallado."
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, fuzzy, c-format
msgid "Registration on %s successful."
msgstr "Se ha registrado con éxito en %s."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, fuzzy, c-format
msgid "Unregistration on %s done."
msgstr "Cancelación de registro en %s completada."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "timeout sin respuesta"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, fuzzy, c-format
msgid "Registration on %s failed: %s"
msgstr "El registro en %s ha fallado."
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, fuzzy, c-format
msgid "Authentication token is %s"
msgstr "El tóken de autenticación es%s"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
msgstr[0] "Tiene %i llamada perdida."
msgstr[1] "Tiene %i llamadas perdidas."
+#~ msgid "No response."
+#~ msgstr "No hay respuesta."
+
+#~ msgid "Protocol error."
+#~ msgstr "Error de protocolo."
+
#, fuzzy
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
@@ -2389,9 +2491,6 @@ msgstr[1] "Tiene %i llamadas perdidas."
#~ msgid "micro"
#~ msgstr "micrófono"
-#~ msgid "Recording source:"
-#~ msgstr "Fuente de grabación:"
-
#~ msgid "Run sip user agent on port:"
#~ msgstr "Ejecutar el agente de usuario SIP en el puerto:"
diff --git a/po/fr.po b/po/fr.po
index 9f45b8dbc..892b7f1c9 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Linphone 0.9.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2013-04-09 13:57+0100\n"
"Last-Translator: Simon Morlat \n"
"Language-Team: french \n"
@@ -15,57 +15,57 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "Appeler %s"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "Chatter avec %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, c-format
msgid "Recent calls (%i)"
msgstr "Appels récents (%i)"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr "inconnu"
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
msgid "Aborted"
msgstr "Abandonné"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
msgid "Missed"
msgstr "Manqué"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
msgid "Declined"
msgstr "Refusé"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] "%i seconde"
msgstr[1] "%i secondes"
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
@@ -74,7 +74,7 @@ msgstr ""
"%s\tQualité: %s\n"
"%s\t%s\t"
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -94,35 +94,35 @@ msgstr "Moi"
msgid "Couldn't find pixmap file: %s"
msgstr "Icone non trouvée: %s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "Contact sip invalide !"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr "affiche des informations de debogage"
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr "chemin vers le fichier de logs."
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr "Démarrer linphone avec la vidéo désactivée."
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr "Démarre iconifié, sans interface principale."
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr "adresse à appeler maintenant"
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr "si positionné, répond automatiquement aux appels entrants"
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
@@ -130,16 +130,20 @@ 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:151
+#: ../gtk/main.c:156
msgid "Configuration file"
msgstr "Ficher de configuration"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+msgid "Run the audio assistant"
+msgstr "Démarre l'assistant audio"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "Appel avec %s"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -153,7 +157,8 @@ msgstr ""
"Si vous répondez non, cette personne sera mise temporairement sur liste "
"noire."
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
+#, c-format
msgid ""
"Please enter your password for username %s\n"
" at realm %s:"
@@ -161,59 +166,59 @@ msgstr ""
"Entrez le mot de passe pour %s\n"
" sur le domaine %s:"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
msgid "Call error"
msgstr "Erreur lors de l'appel"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "Appel terminé."
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Appel entrant"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr "Répondre"
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "Refuser"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
msgid "Call paused"
msgstr "Appel en pause"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, c-format
msgid "by %s"
msgstr "b>par %s"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, 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:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "Lien site web"
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Linphone - un téléphone video pour l'internet"
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (par défaut)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr "Transfert vers %s"
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
msgid ""
"No sound cards have been detected on this computer.\n"
"You won't be able to send or receive audio calls."
@@ -221,7 +226,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:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "Un visiophone libre"
@@ -233,7 +238,7 @@ msgstr "Ajouter au carnet d'adresse"
msgid "Presence status"
msgstr "Info de présence"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Nom"
@@ -250,142 +255,142 @@ msgstr ""
msgid "Search in %s directory"
msgstr "Rechercher dans l'annuaire de %s"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "Editer le contact '%s'"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "Supprimer le contact '%s'"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, c-format
msgid "Delete chat history of '%s'"
msgstr "Supprimer l'historique de chat de '%s'"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "Ajouter un contact depuis l'annuaire %s"
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Fréquence (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Etat"
-#: ../gtk/propertybox.c:574
-msgid "Bitrate (kbit/s)"
-msgstr "Débit (kbit/s)"
+#: ../gtk/propertybox.c:568
+msgid "IP Bitrate (kbit/s)"
+msgstr "Débit IP (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Paramètres"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "Activé"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Désactivé"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "Compte"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "Anglais"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "Français"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "Suédois"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "Italien"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "Espagnol"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "Portugais brésilien"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "Polonais"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "Allemand"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "Russe"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "日本語"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "Néérlandais"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "Hongrois"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "Tchèque"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "简体中文"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr "Chinois traditionnel"
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr "Norvégien"
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr "Hébreu"
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr "Serbe"
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr ""
"La nouvelle selection de langue prendra effet au prochain démarrage de "
"linphone."
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr "Aucun"
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -529,40 +534,39 @@ msgstr ""
"par email.\n"
"Puis appuyez sur suivant."
-#: ../gtk/setupwizard.c:572
-#, fuzzy
+#: ../gtk/setupwizard.c:564
msgid "SIP account configuration assistant"
msgstr "Assistant de configuration de compte."
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "Bienvenue dans l'assistant de configuration de compte."
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "Assistant de configuration de compte."
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
msgid "Configure your account (step 1/1)"
msgstr "Configurez votre compte (étape 1/1)"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr "Entrez votre identifiant sip (étape 1/1)"
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr "Entrez les informations concernant votre compte (étape 1/2)"
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr "Validation (étape 2/2)"
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr "Erreur"
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr "En cours d’arrêt."
@@ -571,186 +575,186 @@ msgstr "En cours d’arrêt."
msgid "Call #%i"
msgstr "Appel #%i"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr "Transférer vers l'appel #%i avec %s"
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
msgid "Not used"
msgstr "Non utilisé"
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr "ICE non activé"
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
msgid "ICE failed"
msgstr "Erreur ICE"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr "Négociation ICE en cours"
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr "Via un ou plusieurs NATs"
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
msgid "Direct"
msgstr "En direct"
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr "Via un serveur relais"
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr "uPnP non activé"
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
msgid "uPnP in progress"
msgstr "uPnP en cours"
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
msgid "uPnp not available"
msgstr "uPnP est indisponible"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr "uPnP en cours d’exécution"
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
msgid "uPnP failed"
msgstr "uPnP a échoué."
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr "Directe ou via un serveur"
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr ""
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr "Raccrocher"
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
msgid "Calling..."
msgstr "Tentative d'appel..."
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr ""
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
msgid "Incoming call"
msgstr "Appel entrant"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr "bon"
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr "moyen"
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr "faible"
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr "très faible"
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr "nulle"
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr "indisponible"
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr "Sécurisé par SRTP"
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr "Sécurisé par ZRTP- [jeton: %s]"
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr "Marquer comme non vérifié"
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr "Marquer comme vérifié"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr "En conférence"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In call"
msgstr "Appel en cours"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
msgid "Paused call"
msgstr "Appel en attente"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr ""
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "Appel terminé."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr "Transfert en cours"
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr "Transfert terminé"
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
msgid "Transfer failed."
msgstr "Transfert échoué"
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr "Reprendre"
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr "Pause"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
msgid "(Paused)"
msgstr "(en attente)"
@@ -769,6 +773,82 @@ msgstr "chargement depuis %s"
msgid "Downloading of remote configuration from %s failed."
msgstr "Le chargement de la configuration depuis %s a échoué."
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"Bienvenue!\n"
+"Cet assistant va vous aider à régler les paramètres audio de votre ordinateur pour une utilisation optimale avec Linphone."
+
+#: ../gtk/audio_assistant.c:326
+msgid "Capture device"
+msgstr "Périphérique de capture"
+
+#: ../gtk/audio_assistant.c:327
+msgid "Recorded volume"
+msgstr "Volume enregistré"
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr "Silencieux"
+
+#: ../gtk/audio_assistant.c:367
+msgid "Playback device"
+msgstr "Périphérique d'écoute"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr "Joue trois bips"
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr "Appuyer sur le bouton enregistrer et dites quelques mots"
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr "Ecoutez votre voix enregistrée"
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr "Démarrons Linphone maintenant"
+
+#: ../gtk/audio_assistant.c:488
+msgid "Audio Assistant"
+msgstr "Assistant audio"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+msgid "Audio assistant"
+msgstr "Assistant audio"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr "Calibration du gain du microphone"
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr "Calibration du volume du haut parleur"
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr "Enregistrer et joue"
+
#: ../gtk/main.ui.h:1
msgid "Callee name"
msgstr "Nom du correspondant"
@@ -810,122 +890,122 @@ msgid "Call quality rating"
msgstr "Qualité de l'appel"
#: ../gtk/main.ui.h:17
-msgid "_Options"
-msgstr ""
-
-#: ../gtk/main.ui.h:18
-msgid "Set configuration URI"
-msgstr "URI de configuration"
-
-#: ../gtk/main.ui.h:19
-msgid "Always start video"
-msgstr "Toujours démarrer la vidéo"
-
-#: ../gtk/main.ui.h:20
-msgid "Enable self-view"
-msgstr "Se voir"
-
-#: ../gtk/main.ui.h:21
-msgid "_Help"
-msgstr "_Aide"
-
-#: ../gtk/main.ui.h:22
-msgid "Show debug window"
-msgstr "Fenêtre de débogage"
-
-#: ../gtk/main.ui.h:23
-msgid "_Homepage"
-msgstr "_Site web"
-
-#: ../gtk/main.ui.h:24
-msgid "Check _Updates"
-msgstr ""
-
-#: ../gtk/main.ui.h:25
-msgid "Account assistant"
-msgstr "Assistant de compte"
-
-#: ../gtk/main.ui.h:26
-msgid "SIP address or phone number:"
-msgstr "Adresse SIP ou numéro"
-
-#: ../gtk/main.ui.h:27
-msgid "Initiate a new call"
-msgstr "Démarrer un nouvel appel"
-
-#: ../gtk/main.ui.h:28
-msgid "Contacts"
-msgstr "Contacts"
-
-#: ../gtk/main.ui.h:29
-msgid "Search"
-msgstr "Rechercher"
-
-#: ../gtk/main.ui.h:30
-msgid "Add contacts from directory"
-msgstr "Ajouter un contact depuis l'annuaire"
-
-#: ../gtk/main.ui.h:31
-msgid "Add contact"
-msgstr "Ajouter un contact."
-
-#: ../gtk/main.ui.h:32
-msgid "Recent calls"
-msgstr "Appels récents"
-
-#: ../gtk/main.ui.h:33
-msgid "My current identity:"
-msgstr "Mon identité sip:"
-
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
-msgid "Username"
-msgstr "Nom d'utilisateur"
-
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
-msgid "Password"
-msgstr "Mot de passe"
-
-#: ../gtk/main.ui.h:36
-msgid "Internet connection:"
-msgstr "Connexion internet:"
-
-#: ../gtk/main.ui.h:37
-msgid "Automatically log me in"
-msgstr "Me connecter automatiquement"
-
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
-msgid "UserID"
-msgstr ""
-
-#: ../gtk/main.ui.h:39
-msgid "Login information"
-msgstr "Information de login"
-
-#: ../gtk/main.ui.h:40
-msgid "Welcome !"
-msgstr "Bienvenue !"
-
-#: ../gtk/main.ui.h:41
msgid "All users"
msgstr "Tous"
-#: ../gtk/main.ui.h:42
+#: ../gtk/main.ui.h:18
msgid "Online users"
msgstr "En ligne"
-#: ../gtk/main.ui.h:43
+#: ../gtk/main.ui.h:19
msgid "ADSL"
msgstr ""
-#: ../gtk/main.ui.h:44
+#: ../gtk/main.ui.h:20
msgid "Fiber Channel"
msgstr ""
-#: ../gtk/main.ui.h:45
+#: ../gtk/main.ui.h:21
msgid "Default"
msgstr "Par défaut"
+#: ../gtk/main.ui.h:22
+msgid "_Options"
+msgstr ""
+
+#: ../gtk/main.ui.h:23
+msgid "Set configuration URI"
+msgstr "URI de configuration"
+
+#: ../gtk/main.ui.h:24
+msgid "Always start video"
+msgstr "Toujours démarrer la vidéo"
+
+#: ../gtk/main.ui.h:25
+msgid "Enable self-view"
+msgstr "Se voir"
+
+#: ../gtk/main.ui.h:26
+msgid "_Help"
+msgstr "_Aide"
+
+#: ../gtk/main.ui.h:27
+msgid "Show debug window"
+msgstr "Fenêtre de débogage"
+
+#: ../gtk/main.ui.h:28
+msgid "_Homepage"
+msgstr "_Site web"
+
+#: ../gtk/main.ui.h:29
+msgid "Check _Updates"
+msgstr ""
+
+#: ../gtk/main.ui.h:30
+msgid "Account assistant"
+msgstr "Assistant de compte"
+
+#: ../gtk/main.ui.h:32
+msgid "SIP address or phone number:"
+msgstr "Adresse SIP ou numéro"
+
+#: ../gtk/main.ui.h:33
+msgid "Initiate a new call"
+msgstr "Démarrer un nouvel appel"
+
+#: ../gtk/main.ui.h:34
+msgid "Contacts"
+msgstr "Contacts"
+
+#: ../gtk/main.ui.h:35
+msgid "Search"
+msgstr "Rechercher"
+
+#: ../gtk/main.ui.h:36
+msgid "Add contacts from directory"
+msgstr "Ajouter un contact depuis l'annuaire"
+
+#: ../gtk/main.ui.h:37
+msgid "Add contact"
+msgstr "Ajouter un contact."
+
+#: ../gtk/main.ui.h:38
+msgid "Recent calls"
+msgstr "Appels récents"
+
+#: ../gtk/main.ui.h:39
+msgid "My current identity:"
+msgstr "Mon identité sip:"
+
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
+msgid "Password"
+msgstr "Mot de passe"
+
+#: ../gtk/main.ui.h:42
+msgid "Internet connection:"
+msgstr "Connexion internet:"
+
+#: ../gtk/main.ui.h:43
+msgid "Automatically log me in"
+msgstr "Me connecter automatiquement"
+
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
+msgid "UserID"
+msgstr ""
+
+#: ../gtk/main.ui.h:45
+msgid "Login information"
+msgstr "Information de login"
+
#: ../gtk/main.ui.h:46
+msgid "Welcome !"
+msgstr "Bienvenue !"
+
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr "Supprimer"
@@ -1034,22 +1114,30 @@ msgid "Contact params (optional):"
msgstr "Paramètres de contact (optionnel):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Route (optionnel):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
msgid "Transport"
msgstr "Transport"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr "S'enregistrer"
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "Publier la présence"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+msgid "Enable AVPF"
+msgstr "Activer AVPF"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "Configurer un compte SIP"
@@ -1446,18 +1534,16 @@ msgid "Audio IP bandwidth usage"
msgstr "Bande passante audio"
#: ../gtk/call_statistics.ui.h:5
-#, fuzzy
msgid "Audio Media connectivity"
-msgstr "Type d'encryption media"
+msgstr "Connectivité audio"
#: ../gtk/call_statistics.ui.h:6
msgid "Video IP bandwidth usage"
msgstr "Bande passante video"
#: ../gtk/call_statistics.ui.h:7
-#, fuzzy
msgid "Video Media connectivity"
-msgstr "Type d'encryption media"
+msgstr "Connectivité video"
#: ../gtk/call_statistics.ui.h:8
msgid "Round trip time"
@@ -1472,6 +1558,10 @@ msgid "Video resolution sent"
msgstr "Taille de video envoyée"
#: ../gtk/call_statistics.ui.h:11
+msgid "RTP profile"
+msgstr "Profil RTP"
+
+#: ../gtk/call_statistics.ui.h:12
msgid "Call statistics and information"
msgstr "Statistiques de l'appel et informations"
@@ -1481,7 +1571,7 @@ msgstr "Configuer le mode tunnel"
#: ../gtk/tunnel_config.ui.h:2
msgid "Host"
-msgstr ""
+msgstr "Hôte"
#: ../gtk/tunnel_config.ui.h:3
msgid "Port"
@@ -1489,11 +1579,11 @@ msgstr ""
#: ../gtk/tunnel_config.ui.h:6
msgid "Configure tunnel"
-msgstr ""
+msgstr "Configuration du tunnel"
#: ../gtk/tunnel_config.ui.h:9
msgid "Configure http proxy (optional)"
-msgstr ""
+msgstr "Configuration d'un proxy http (optionel)"
#: ../gtk/keypad.ui.h:1
msgid "D"
@@ -1556,23 +1646,20 @@ msgid "1"
msgstr ""
#: ../gtk/ldap.ui.h:1
-#, fuzzy
msgid "LDAP Settings"
-msgstr "Réglages"
+msgstr "Paramètres LDAP"
#: ../gtk/ldap.ui.h:6
msgid "Use TLS Connection"
-msgstr ""
+msgstr "Utiliser TLS"
#: ../gtk/ldap.ui.h:7
-#, fuzzy
msgid "Not yet available"
-msgstr "uPnP est indisponible"
+msgstr "Non disponible"
#: ../gtk/ldap.ui.h:8
-#, fuzzy
msgid "Connection"
-msgstr "Codecs"
+msgstr "Connexion"
#: ../gtk/ldap.ui.h:9
msgid "Bind DN"
@@ -1587,9 +1674,8 @@ msgid "Realm"
msgstr ""
#: ../gtk/ldap.ui.h:12
-#, fuzzy
msgid "SASL"
-msgstr "Son"
+msgstr "SASL"
#: ../gtk/ldap.ui.h:13
msgid "Base object:"
@@ -1605,35 +1691,32 @@ msgid "Name Attribute:"
msgstr ""
#: ../gtk/ldap.ui.h:17
-#, fuzzy
msgid "SIP address attribute:"
-msgstr "Adresse SIP ou numéro"
+msgstr "Attribut pour l'addresse SIP:"
#: ../gtk/ldap.ui.h:18
msgid "Attributes to query:"
-msgstr ""
+msgstr "Attributs à chercher:"
#: ../gtk/ldap.ui.h:19
-#, fuzzy
msgid "Search"
-msgstr "Rechercher une personne"
+msgstr "Rechercher"
#: ../gtk/ldap.ui.h:20
msgid "Timeout for search:"
-msgstr ""
+msgstr "Temps de recherche maximum:"
#: ../gtk/ldap.ui.h:21
msgid "Max results:"
-msgstr ""
+msgstr "Nombre de résultats maximum:"
#: ../gtk/ldap.ui.h:22
msgid "Follow Aliases"
-msgstr ""
+msgstr "Suivre les alias"
#: ../gtk/ldap.ui.h:23
-#, fuzzy
msgid "Miscellaneous"
-msgstr "Video"
+msgstr "Divers"
#: ../gtk/ldap.ui.h:24
msgid "ANONYMOUS"
@@ -1653,7 +1736,7 @@ msgstr ""
#: ../gtk/config-uri.ui.h:1
msgid "Specifying a remote configuration URI"
-msgstr ""
+msgstr "Spécifier une URI de configuration"
#: ../gtk/config-uri.ui.h:2
msgid ""
@@ -1662,8 +1745,11 @@ msgid ""
"Please enter or modify the configuration URI below. After clicking OK, "
"Linphone will restart automatically in order to fetch and take into account "
"the new configuration. "
-msgstr "Cette boite de dialogue vous permet de spécifier une address http ou https où la configuration doit être téléchargée au démarrage\n"
-"Entry l'URI ci dessous. Après avoir validé, Linphone va redémarrer automatiquement pour charger et prendre en compte la nouvelle configuration."
+msgstr ""
+"Cette boite de dialogue vous permet de spécifier une addresse http ou https "
+"où la configuration doit être téléchargée au démarrage.\n"
+"Veuillez entrer l'URI http(s) ci dessous. Après avoir validé, Linphone va redémarrer "
+"automatiquement pour charger et prendre en compte la nouvelle configuration."
#: ../gtk/config-uri.ui.h:4
msgid "https://"
@@ -1675,21 +1761,23 @@ msgstr "Configuration en cours"
#: ../gtk/provisioning-fetch.ui.h:2
msgid "Please wait while fetching configuration from server..."
-msgstr "Veuillez patenter un instant pendant le chargement de la configuration distante..."
+msgstr ""
+"Veuillez patenter un instant pendant le chargement de la configuration "
+"distante..."
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "abandonné"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "terminé"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "manqué"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1704,76 +1792,76 @@ msgstr ""
"Etat: %s\n"
"Durée: %i mn %i sec\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Appel sortant"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "Prêt."
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
msgid "Configuring"
msgstr "Configuration en cours"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Recherche de la destination du numéro de téléphone..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "La destination n'a pu être trouvée."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "Appel de"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
msgid "Could not call"
msgstr "Echec de l'appel"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
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:2952
+#: ../coreapi/linphonecore.c:3022
msgid "is contacting you"
msgstr "vous appelle"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr "et sollicite un décrochage automatique."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr ""
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr "Modifications des paramètres d'appels..."
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "En ligne."
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
msgid "Call aborted"
msgstr "Appel abandonné"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr "La mise en attente a échoué"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr "Mise en attente de l'appel..."
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "Découverte STUN en cours"
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1829,7 +1917,7 @@ msgstr "En congé"
msgid "Unknown-bug"
msgstr "Bug inconnu"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
@@ -1837,7 +1925,7 @@ msgstr ""
"L'adresse SIP du proxy est invalide. Elle doit commencer par \"sip:\" suivie "
"par un nom de domaine."
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1846,135 +1934,137 @@ msgstr ""
"Elle doit être de la forme sip:username@domain, comme par example sip:"
"alice@example.net"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "Echec de la connexion en tant que %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr "Sonnerie distante."
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
msgid "Remote ringing..."
msgstr "Sonnerie distante..."
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr "Prise d'appel anticipée."
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr "%s est maintenant en attente."
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr "Appel répondu par %s - en attente"
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
msgid "Call resumed."
msgstr "Appel repris."
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr "Appel répondu par %s."
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr "Appel repris."
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr "L'appel a été mis en attente."
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
#, fuzzy
msgid "Call is updated by remote."
-msgstr "L'appel a été repris par le correspondant."
+msgstr "Mise à jour de l'appel par le correspondant."
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "Appel terminé."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "Occupé..."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "L'usager est temporairement indisponible."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "L'usager ne souhaite pas être dérangé"
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Appel décliné."
-#: ../coreapi/callbacks.c:603
-msgid "No response."
-msgstr "Pas de réponse."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
+msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr "Erreur de protocole"
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr "Redirection"
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr "Paramètres media incompatibles."
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
msgid "Call failed."
msgstr "L'appel a échoué."
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "Enregistrement sur %s effectué."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "Désenregistrement sur %s effectué."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "Pas de réponse"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "Echec de l'enregistrement sur %s: %s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, c-format
msgid "Authentication token is %s"
msgstr "Le jeton d'authentification est %s"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
msgstr[0] "Vous avez manqué %i appel"
msgstr[1] "Vous avez manqué %i appels"
+#~ msgid "No response."
+#~ msgstr "Pas de réponse."
+
+#~ msgid "Protocol error."
+#~ msgstr "Erreur de protocole"
+
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
#~ "user@domain"
diff --git a/po/he.po b/po/he.po
index bcbfa9161..878ac3e4a 100644
--- a/po/he.po
+++ b/po/he.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Linphone 3.5.99.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2013-04-24 21:31+0200\n"
"Last-Translator: Isratine Citizen \n"
"Language-Team: Rahut Project \n"
@@ -20,57 +20,57 @@ msgstr ""
"X-Generator: Poedit 1.5.4\n"
# צור קשר עם
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "התקשר אל %s"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "שלח טקסט אל %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, c-format
msgid "Recent calls (%i)"
msgstr "שיחות אחרונות (%i)"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr "לא זמין (n/a)"
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
msgid "Aborted"
msgstr "ננטשה"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
msgid "Missed"
msgstr "הוחמצה"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
msgid "Declined"
msgstr "נדחתה"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] "דקה %i"
msgstr[1] "%i דקות"
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] "שניה %i"
msgstr[1] "%i שניות"
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
@@ -79,7 +79,7 @@ msgstr ""
"%s\tאיכות: %s\n"
"%s\t%s\t"
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -100,48 +100,48 @@ msgid "Couldn't find pixmap file: %s"
msgstr "לא ניתן למצוא קובץ pixmap: %s"
# איש־קשר
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "כתובת sip לא תקפה !"
# cli
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
#, fuzzy
msgid "log to stdout some debug information while running."
msgstr "רשום אל stdout מידע ניפוי שגיאות מסוים בזמן ביצוע."
# cli
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
#, fuzzy
msgid "path to a file to write logs into."
msgstr "נתיב אל קובץ שברצונך לרשום אליו את הרשומות."
# cli
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
#, fuzzy
msgid "Start linphone with video disabled."
msgstr "התחל את לינפון עם וידאו מנוטרל."
# cli
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
#, fuzzy
msgid "Start only in the system tray, do not show the main interface."
msgstr "התחל במגש המערכת בלבד, אל תציג את הממשק הראשי."
# cli
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
#, fuzzy
msgid "address to call right now"
msgstr "כתובת להתקשרות ברגע זה"
# cli
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
#, fuzzy
msgid "if set automatically answer incoming calls"
msgstr "באם אפשרות זו נקבעת ענה אוטומטית לקריאות נכנסות"
# cli
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
#, fuzzy
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
@@ -151,19 +151,24 @@ msgstr ""
"\\Linphone)"
# וידוא
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "אימות"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "אשף הגדרת חשבון"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "התקשרות באמצעות %s"
# הקשר שלהם
# אם התשובה
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -176,7 +181,7 @@ msgstr ""
"שלך ?\n"
"היה ותשובתך תהיה לא, אדם זה יהיה מסומן באופן זמני ברשימה השחורה."
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
@@ -186,65 +191,65 @@ msgstr ""
" בתחום %s:"
# שיחה
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
msgid "Call error"
msgstr "שגיאת קריאה"
# Conversation ended
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "שיחה הסתיימה"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "קריאה נכנסת"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr "לענות"
# דחיה
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "לדחות"
# Conversation paused
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
msgid "Call paused"
msgstr "שיחה הושהתה"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, c-format
msgid "by %s"
msgstr "על ידי %s"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr "%s רוצה להתחיל וידאו. האם אתה מסכים ?"
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "קישור אתר רשת"
# Linphone - וידאופון במרשתת
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Linphone - וידאופון אינטרנטי"
# משתמטת
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (ברירת מחדל)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr "אנחנו מועברים אל %s"
# קריאות שמע
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
msgid ""
"No sound cards have been detected on this computer.\n"
"You won't be able to send or receive audio calls."
@@ -252,7 +257,7 @@ msgstr ""
"לא אותרו כרטיסי קול במחשב זה.\n"
"לא תהיה ביכולתך לשלוח או לקבל שיחות אודיו."
-#: ../gtk/main.c:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "וידאופון SIP חופשי"
@@ -264,7 +269,7 @@ msgstr "הוסף אל ספר כתובות"
msgid "Presence status"
msgstr "מצב נוכחות"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "שם"
@@ -282,148 +287,148 @@ msgstr "שיחה"
msgid "Search in %s directory"
msgstr "חיפוש במדור %s"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "ערוך איש קשר '%s'"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "מחק איש קשר '%s'"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, c-format
msgid "Delete chat history of '%s'"
msgstr "מחק היסטוריית שיחה של '%s'"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "הוסף איש קשר חדש מן מדור %s"
# קצב תדר תדירות מהירות
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "שיעור (הרץ)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "מצב"
# שיעור סיביות מינימלי
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "קצב נתונים מינימלי (קי״ב/שנ׳)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "פרמטרים"
# מאופשר
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "מופעל"
# מנוטרל
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "לא מופעל"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "חשבון"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "English"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "Français"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "Svenska"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "Italiano"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "Español"
# português do Brasil
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "português brasileiro"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "Polski"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "Deutsch"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "Русский"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "日本語"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "Nederlands"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "Magyar"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "Česky"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "中文"
# 繁体字
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr "繁體字"
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr "norsk"
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr "עברית"
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr "српски srpski"
# selected הנבחרת
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr "עליך לאתחל את לינפון כדי שהשפה החדשה תיכנס לתוקף."
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr "ללא"
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -570,44 +575,44 @@ msgstr ""
"נא לאמת את חשבונך באמצעות הקלקה על הקישור ששלחנו לך עתה באמצעות דוא״ל.\n"
"אחרי כן נא לחזור לכאן וללחוץ על הלחצן 'קדימה'."
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "אשף הגדרת חשבון"
# Wizard אשף
# סייע
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "ברוך בואך אל אשף הגדרת החשבון"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "אשף הגדרת חשבון"
# שלב
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
msgid "Configure your account (step 1/1)"
msgstr "הגדרת חשבונך (צעד 1/1)"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr "הזנת שם משתמש sip (צעד 1/1)"
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr "הזנת מידע חשבון (צעד 1/2)"
# תקפות
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr "אימות (צעד 2/2)"
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr "שגיאה"
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr "מסיים כעת"
@@ -616,64 +621,64 @@ msgstr "מסיים כעת"
msgid "Call #%i"
msgstr "שיחה מס׳ %i"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr "העברה אל שיחה מס׳ %i עם %s"
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
msgid "Not used"
msgstr "לא בשימוש"
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr "ICE לא מופעלת"
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
msgid "ICE failed"
msgstr "ICE נכשלה"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr "ICE מצויה כעת בעיצומה"
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr "עובר דרך NAT אחד או יותר"
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
msgid "Direct"
msgstr "ישיר"
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr "דרך שרת ממסר"
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr "uPnP לא מופעלת"
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
msgid "uPnP in progress"
msgstr "uPnP מצויה כעת בעיצומה"
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
msgid "uPnp not available"
msgstr "uPnp לא זמינה"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr "uPnP מורצת כעת"
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
msgid "uPnP failed"
msgstr "uPnP נכשלה"
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr "ישיר או דרך שרת"
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
@@ -682,122 +687,122 @@ msgstr ""
"הורדה: %f\n"
"העלאה: %f (קי״ב/שנ׳)"
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr "%.3f שניות"
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr "נתק"
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
msgid "Calling..."
msgstr "מתקשר כעת..."
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr "00::00::00"
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
msgid "Incoming call"
msgstr "קריאה נכנסת"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr "טובה"
# רגילה
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr "ממוצעת"
# weak חלשה חלושה רפויה רופפת
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr "דלה"
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr "דלה מאוד"
# רעה
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr "גרועה מדי"
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr "לא זמינה"
# באמצעות
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr "מאובטחת על ידי SRTP"
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr "מאובטחת על ידי ZRTP - [אות אימות: %s]"
# set or unset verification state of ZRTP SAS.
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr "הגדר כלא מאומתת"
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr "הגדר כמאומתת"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr "בשיחת ועידה"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In call"
msgstr "בשיחה כעת"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
msgid "Paused call"
msgstr "שיחה מושהית"
# שעות %02i דקות %02i שניות %02i
# Force LTR time format (hours::minutes::seconds) with LRO chatacter (U+202D)
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr "%02i::%02i::%02i"
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "שיחה הסתיימה."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr "העברה מצויה כעת בעיצומה"
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr "העברה הסתיימה."
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
msgid "Transfer failed."
msgstr "העברה נכשלה."
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr "חזור"
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr "השהה"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
@@ -806,7 +811,7 @@ msgstr ""
"מקליט אל תוך\n"
"%s %s"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
msgid "(Paused)"
msgstr "(מושהה)"
@@ -825,6 +830,87 @@ msgstr ""
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"ברוך בואך !\n"
+"אשף זה יסייע לך לעשות שימוש בחשבון SIP עבור שיחותייך."
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "התקן לכידה:"
+
+#: ../gtk/audio_assistant.c:327
+msgid "Recorded volume"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "התקן פס קול:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "אשף חשבון"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "אשף חשבון"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
# מתקשר Caller
# זה ש: נתקשר או מתוקשר או הותקשר?
#: ../gtk/main.ui.h:1
@@ -869,128 +955,128 @@ msgid "Call quality rating"
msgstr "אומדן איכות שיחה"
#: ../gtk/main.ui.h:17
-msgid "_Options"
-msgstr "_אפשרויות"
-
-# וידוא
-#: ../gtk/main.ui.h:18
-#, fuzzy
-msgid "Set configuration URI"
-msgstr "אימות"
-
-#: ../gtk/main.ui.h:19
-msgid "Always start video"
-msgstr "התחל תמיד וידאו"
-
-#: ../gtk/main.ui.h:20
-msgid "Enable self-view"
-msgstr "אפשר ראות-עצמית"
-
-#: ../gtk/main.ui.h:21
-msgid "_Help"
-msgstr "_עזרה"
-
-#: ../gtk/main.ui.h:22
-msgid "Show debug window"
-msgstr "הצג חלון ניפוי שגיאות"
-
-#: ../gtk/main.ui.h:23
-msgid "_Homepage"
-msgstr "_עמוד הבית"
-
-#: ../gtk/main.ui.h:24
-msgid "Check _Updates"
-msgstr "בדיקת _עדכונים"
-
-#: ../gtk/main.ui.h:25
-msgid "Account assistant"
-msgstr "אשף חשבון"
-
-#: ../gtk/main.ui.h:26
-msgid "SIP address or phone number:"
-msgstr "כתובת SIP או מספר טלפון"
-
-#: ../gtk/main.ui.h:27
-msgid "Initiate a new call"
-msgstr "התחל שיחה חדשה"
-
-#: ../gtk/main.ui.h:28
-msgid "Contacts"
-msgstr "אנשי קשר"
-
-#: ../gtk/main.ui.h:29
-msgid "Search"
-msgstr "חיפוש"
-
-#: ../gtk/main.ui.h:30
-msgid "Add contacts from directory"
-msgstr "הוסף אנשי קשר מן מדור"
-
-#: ../gtk/main.ui.h:31
-msgid "Add contact"
-msgstr "הוסף איש קשר"
-
-# קריאות אחרונות
-#: ../gtk/main.ui.h:32
-msgid "Recent calls"
-msgstr "שיחות אחרונות"
-
-# הזהות הנוכחית שלי
-#: ../gtk/main.ui.h:33
-msgid "My current identity:"
-msgstr "זהותי הנוכחית:"
-
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
-msgid "Username"
-msgstr "שם משתמש"
-
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
-msgid "Password"
-msgstr "סיסמה"
-
-# מרשתת
-#: ../gtk/main.ui.h:36
-msgid "Internet connection:"
-msgstr "חיבור אינטרנט:"
-
-#: ../gtk/main.ui.h:37
-msgid "Automatically log me in"
-msgstr "חבר אותי אוטומטית"
-
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
-msgid "UserID"
-msgstr "מזהה משתמש"
-
-#: ../gtk/main.ui.h:39
-msgid "Login information"
-msgstr "מידע התחברות"
-
-#: ../gtk/main.ui.h:40
-msgid "Welcome !"
-msgstr "ברוך בואך !"
-
-#: ../gtk/main.ui.h:41
msgid "All users"
msgstr "כל המשתמשים"
-#: ../gtk/main.ui.h:42
+#: ../gtk/main.ui.h:18
msgid "Online users"
msgstr "משתמשים מקוונים"
-#: ../gtk/main.ui.h:43
+#: ../gtk/main.ui.h:19
msgid "ADSL"
msgstr "ADSL"
-#: ../gtk/main.ui.h:44
+#: ../gtk/main.ui.h:20
msgid "Fiber Channel"
msgstr "ערוץ סיב"
# משתמט
-#: ../gtk/main.ui.h:45
+#: ../gtk/main.ui.h:21
msgid "Default"
msgstr "ברירת מחדל"
+#: ../gtk/main.ui.h:22
+msgid "_Options"
+msgstr "_אפשרויות"
+
+# וידוא
+#: ../gtk/main.ui.h:23
+#, fuzzy
+msgid "Set configuration URI"
+msgstr "אימות"
+
+#: ../gtk/main.ui.h:24
+msgid "Always start video"
+msgstr "התחל תמיד וידאו"
+
+#: ../gtk/main.ui.h:25
+msgid "Enable self-view"
+msgstr "אפשר ראות-עצמית"
+
+#: ../gtk/main.ui.h:26
+msgid "_Help"
+msgstr "_עזרה"
+
+#: ../gtk/main.ui.h:27
+msgid "Show debug window"
+msgstr "הצג חלון ניפוי שגיאות"
+
+#: ../gtk/main.ui.h:28
+msgid "_Homepage"
+msgstr "_עמוד הבית"
+
+#: ../gtk/main.ui.h:29
+msgid "Check _Updates"
+msgstr "בדיקת _עדכונים"
+
+#: ../gtk/main.ui.h:30
+msgid "Account assistant"
+msgstr "אשף חשבון"
+
+#: ../gtk/main.ui.h:32
+msgid "SIP address or phone number:"
+msgstr "כתובת SIP או מספר טלפון"
+
+#: ../gtk/main.ui.h:33
+msgid "Initiate a new call"
+msgstr "התחל שיחה חדשה"
+
+#: ../gtk/main.ui.h:34
+msgid "Contacts"
+msgstr "אנשי קשר"
+
+#: ../gtk/main.ui.h:35
+msgid "Search"
+msgstr "חיפוש"
+
+#: ../gtk/main.ui.h:36
+msgid "Add contacts from directory"
+msgstr "הוסף אנשי קשר מן מדור"
+
+#: ../gtk/main.ui.h:37
+msgid "Add contact"
+msgstr "הוסף איש קשר"
+
+# קריאות אחרונות
+#: ../gtk/main.ui.h:38
+msgid "Recent calls"
+msgstr "שיחות אחרונות"
+
+# הזהות הנוכחית שלי
+#: ../gtk/main.ui.h:39
+msgid "My current identity:"
+msgstr "זהותי הנוכחית:"
+
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
+msgid "Username"
+msgstr "שם משתמש"
+
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
+msgid "Password"
+msgstr "סיסמה"
+
+# מרשתת
+#: ../gtk/main.ui.h:42
+msgid "Internet connection:"
+msgstr "חיבור אינטרנט:"
+
+#: ../gtk/main.ui.h:43
+msgid "Automatically log me in"
+msgstr "חבר אותי אוטומטית"
+
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
+msgid "UserID"
+msgstr "מזהה משתמש"
+
+#: ../gtk/main.ui.h:45
+msgid "Login information"
+msgstr "מידע התחברות"
+
#: ../gtk/main.ui.h:46
+msgid "Welcome !"
+msgstr "ברוך בואך !"
+
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr "מחק"
@@ -1105,24 +1191,33 @@ msgid "Contact params (optional):"
msgstr "ניתוב (רשות):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "ניתוב (רשות):"
# מוביל
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "טרנספורט"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr "רישום"
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "פרסם מידע נוכחות"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "אפשר"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "הגדרת חשבון SIP"
@@ -1567,6 +1662,10 @@ msgid "Video resolution sent"
msgstr "רזולוציית וידאו מועדפת:"
#: ../gtk/call_statistics.ui.h:11
+msgid "RTP profile"
+msgstr ""
+
+#: ../gtk/call_statistics.ui.h:12
msgid "Call statistics and information"
msgstr "סטטיסטיקות ומידע שיחה"
@@ -1773,20 +1872,20 @@ msgstr "מתחבר כעת..."
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "ננטשה"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "הסתיימה"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "הוחמצה"
# needs to be tested
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1801,81 +1900,81 @@ msgstr ""
"מצב: %s\n"
"משך: %i mn %i sec\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "קריאה יוצאת"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "מוכן"
# וידוא
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "אימות"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "מחפש כעת עבור יעד מספר טלפון..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "לא ניתן לפתור את מספר זה."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "מתקשר כעת"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
msgid "Could not call"
msgstr "לא ניתן להתקשר"
# מספר השיחות המקבילות המרבי
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr "הגענו אל המספר המרבי של שיחות מקבילות, עמך הסליחה"
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
msgid "is contacting you"
msgstr "מתקשר/ת אליך"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr " ומבקש/ת מענה אוטומטי."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr ""
# פרמטרי קריאה
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr "מתאים כעת פרמטרים של שיחה..."
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "מקושר."
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
msgid "Call aborted"
msgstr "קריאה בוטלה"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr "לא ניתן להשהות את השיחה"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr "משהה כעת שיחה נוכחית..."
# במהלך (או) באמצע חיפוש...
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "בדיקת STUN מצויה כעת בעיצומה..."
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr "צבירת מועמדים מקומיים של ICE מצויה כעת בעיצומה..."
@@ -1937,7 +2036,7 @@ msgstr "משך זמן"
msgid "Unknown-bug"
msgstr "תקלה לא מוכרת"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
@@ -1945,7 +2044,7 @@ msgstr ""
"כתובת sip proxy שהזנת הינה שגויה, זו צריכה להתחיל עם\"sip:\" לאחר שם מארח."
# כמו למשל
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1954,40 +2053,40 @@ msgstr ""
"זו צריכה להיראות כמו sip:username@proxydomain, למשל sip:alice@example.net"
# בשם כ־
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "לא ניתן להתחבר בזהות %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr "צלצול מרוחק."
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
msgid "Remote ringing..."
msgstr "צלצול מרוחק..."
# A SIP state
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr "מדיה מוקדמת."
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr "שיחה עם %s מושהית."
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr "קריאה נענתה על ידי %s - בהמתנה."
# renewed
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
msgid "Call resumed."
msgstr "קריאה חודשה."
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr "קריאה נענתה על ידי %s."
@@ -1995,106 +2094,108 @@ msgstr "קריאה נענתה על ידי %s."
# לא תואם
# אי תאימות
# אי התאמה
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr "חוסר תאימות, בדוק קודקים או הגדרות אבטחה..."
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr "חזרנו."
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr "אנו מושהים על ידי צד אחר."
# באופן מרוחק
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr "שיחה עודכנה מרחוק."
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "קריאה הסתיימה."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "משתמש עסוק כעת."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "משתמש לא זמין זמנית."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "משתמש לא מעוניין שיפריעו לו."
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "קריאה סורבה."
-#: ../coreapi/callbacks.c:603
-msgid "No response."
-msgstr "אין תגובה."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
+msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr "שגיאת פרוטוקול."
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr "מכוון מחדש"
# לא תואם
# אי תאימות
# אי התאמה
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr "פרמטריי מדיה חסרי תואמים."
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
msgid "Call failed."
msgstr "קריאה נכשלה."
# הרשמה אצל %s הושלמה בהצלחה.
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "רישום אצל %s הושלם בהצלחה."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "אי רישום אצל %s סוים."
# Pas de réponse
# no response in defined time
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "אין היענות תוך זמן מוגדר"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "רישום אצל %s נכשל: %s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, c-format
msgid "Authentication token is %s"
msgstr "אות האימות הינה %s"
# האם כדאי לחקות את הטלפונים הניידים? שיחות של נענו
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
msgstr[0] "החמצת שיחה %i."
msgstr[1] "החמצת %i שיחות."
+#~ msgid "No response."
+#~ msgstr "אין תגובה."
+
+#~ msgid "Protocol error."
+#~ msgstr "שגיאת פרוטוקול."
+
# לרוב
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
diff --git a/po/hu.po b/po/hu.po
index fb2e08033..d69f7e8bc 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Linphone\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2013-03-26 19:00+0100\n"
"Last-Translator: Viktor \n"
"Language-Team: \n"
@@ -17,57 +17,57 @@ msgstr ""
"X-Generator: Poedit 1.5.4\n"
"Plural-Forms: nplurals=1; plural=1 == 1 ? 0 : 1;\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "%s hívása"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "Szöveg küldése a következőnek: %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "vonalban"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr "-"
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
msgid "Aborted"
msgstr "Megszakítva"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
msgid "Missed"
msgstr "Nem fogadott"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
msgid "Declined"
msgstr "Elutasítva"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] "%i perc"
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] "%i másodperc"
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, fuzzy, c-format
msgid "%s\t%s"
msgstr ""
"%s\t%s\t\n"
"%s\t%s"
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, fuzzy, c-format
msgid ""
"%s\tQuality: %s\n"
@@ -76,7 +76,7 @@ msgstr ""
"%s\t%s\tMinőség: %s\n"
"%s\t%s %s\t"
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, fuzzy, c-format
msgid ""
"%s\t\n"
@@ -98,35 +98,35 @@ msgstr "én"
msgid "Couldn't find pixmap file: %s"
msgstr "Nemtalálható a pixmap fájl: %s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "Érvénytelen sip partner !"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
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:109
+#: ../gtk/main.c:114
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:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr "Linphone indítása, videó kikpacsolva. "
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
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:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr "Cím azonnali híváshoz"
-#: ../gtk/main.c:137
+#: ../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:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
@@ -134,17 +134,22 @@ 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:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Információk"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "Fiók beállítása varázsló"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "Hívás %s -el"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -157,7 +162,7 @@ msgstr ""
"szeretné adni a partnerlistához?\n"
"Ha nemmel válaszol, ez a személy átmenetileg tiltólistára kerül."
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
@@ -166,59 +171,59 @@ msgstr ""
"Kérem, adja meg jelszavát a következő felhasználónévhez: %s\n"
"tartomány %s:"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
msgid "Call error"
msgstr "Hiba a hívás közben"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "Hívás vége"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Beérkező hívás"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr "Hívás fogadása"
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "Elutasítás"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
msgid "Call paused"
msgstr "Hívás várakoztatva"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, c-format
msgid "by %s"
msgstr "a következő által: %s"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr "%s szerené elidítani a videót. Elfogadja?"
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "Internetes oldal"
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Linphone - internetes videó telefon"
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (Alapértelmezett)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr "Át vagyunk irányítva ide: %s"
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
msgid ""
"No sound cards have been detected on this computer.\n"
"You won't be able to send or receive audio calls."
@@ -226,7 +231,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:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "Egy ingyenes SIP video-telefon"
@@ -238,7 +243,7 @@ msgstr "Hozzáadás címjegyzékhez"
msgid "Presence status"
msgstr "Jelenlét státusz"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Név"
@@ -255,143 +260,143 @@ msgstr "Csevegés"
msgid "Search in %s directory"
msgstr "Keresés ebben a könyvtárban: %s"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "Kapcsolatinformációk szerkesztése: '%s'"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "'%s' partner törlése"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, fuzzy, c-format
msgid "Delete chat history of '%s'"
msgstr "'%s' partner törlése"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "Új partner hozzáadása ebből a könyvtárból: %s"
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Érték (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Állapot"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Min bitrate (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Paraméterek"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "Engedélyezve"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Tiltva"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "Hozzáférés"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "angol"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "francia"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "svéd"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "olasz"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "spanyol"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "brazil-portugál"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "lengyel"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "német"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "orosz"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "japán"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "holland"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "magyar"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "cseh"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "egyszerúsített kínai"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr "tradícionális kínai"
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr "norvég"
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr "héber"
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr ""
"Újra kell indítania a linphone-t, hogy az új nyelv kiválasztása érvényre "
"jusson. "
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr "Nincs"
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr "SRTP"
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr "ZRTP"
@@ -533,40 +538,40 @@ msgstr ""
"hivatkozásra kattintva.\n"
"Azután térjen vissza ide és kattintson a Következő gombra."
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "Fiók beállítása varázsló"
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "A fiók beállítása varázsló üdvözli Önt"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "Fiók beállítása varázsló"
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
msgid "Configure your account (step 1/1)"
msgstr "Az Ön fiókjának beállítása (1/1 lépés)"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr "Adja meg sip felhasználónevét (1/2 lépés)"
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr "Adja meg a fiókinformációt (1/2 lépés)"
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr "Érvényesítés (2/2 lépés)"
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr "Hiba"
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr "Befejezés"
@@ -575,64 +580,64 @@ msgstr "Befejezés"
msgid "Call #%i"
msgstr "Hívás #%i"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr "Átirányítás #%i híváshoz ezzel: %s "
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
msgid "Not used"
msgstr "Nem használt"
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr "ICE nincs aktiválva"
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
msgid "ICE failed"
msgstr "ICE nem sikerült"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr "ICE folyamatban"
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr "Átmegy egy vagy több NAT-on"
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
msgid "Direct"
msgstr "Közvetlen"
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr "Közvetítő kiszolgálón keresztül"
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr "uPnP nincs aktiválva"
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
msgid "uPnP in progress"
msgstr "uPnP folyamatban"
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
msgid "uPnp not available"
msgstr "uPnP nem elérhető"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr "uPnP fut"
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
msgid "uPnP failed"
msgstr "uPnP nem sikerült"
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr "közvetlen vagy kiszolgálón keresztül"
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
@@ -641,115 +646,115 @@ msgstr ""
"letöltés: %f\n"
"feltöltés: %f (kbit/mp)"
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr "%.3f másodperc"
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr "Befejezés"
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
msgid "Calling..."
msgstr "Hívás folyamatban..."
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr "00::00::00"
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
msgid "Incoming call"
msgstr "Beérkező hívás"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr "jó"
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr "közepes"
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr "gyenge"
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr "nagyon gyenge"
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr "rossz"
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr "nem elérhető"
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr "SRTP-vel titkosítva"
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr "ZRTP-vel titkosítva - [hitelesítési jel: %s]"
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr "Beállítás ellenőrizetlenként"
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr "Beállítás ellenőrzöttként"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr "Konferencián"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In call"
msgstr "vonalban"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
msgid "Paused call"
msgstr "Várakoztatott hívás"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr "%02i::%02i::%02i"
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "Hívás vége."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr "Átvitel folyamatban"
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr "Átvitel befejezve."
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
msgid "Transfer failed."
msgstr "Az átvitel sikertelen."
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr "Visszatérés"
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr "Várakoztatás"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
@@ -758,7 +763,7 @@ msgstr ""
"Felvétel a következőbe\n"
"%s %s"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
msgid "(Paused)"
msgstr "(Várakoztatva)"
@@ -777,6 +782,88 @@ msgstr "Beérkező hívás"
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"Üdvözöljük !\n"
+"Ez a varázsló segít Önnek, hogy sip fiókot használjon hívásaihoz."
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Felvevő hang eszköz:"
+
+#: ../gtk/audio_assistant.c:327
+#, fuzzy
+msgid "Recorded volume"
+msgstr "Felvételi forrás:"
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Lejátszó hang eszköz:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "Fiók varázsló"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "Fiók varázsló"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
msgid "Callee name"
msgstr "Hívott neve"
@@ -818,123 +905,123 @@ msgid "Call quality rating"
msgstr "Hívásminőség"
#: ../gtk/main.ui.h:17
+msgid "All users"
+msgstr "Minden felhasználó"
+
+#: ../gtk/main.ui.h:18
+msgid "Online users"
+msgstr "Elérhető"
+
+#: ../gtk/main.ui.h:19
+msgid "ADSL"
+msgstr "ADSL"
+
+#: ../gtk/main.ui.h:20
+msgid "Fiber Channel"
+msgstr "Fiber csatorna"
+
+#: ../gtk/main.ui.h:21
+msgid "Default"
+msgstr "Alapértelmezett"
+
+#: ../gtk/main.ui.h:22
msgid "_Options"
msgstr "_Beállítások"
-#: ../gtk/main.ui.h:18
+#: ../gtk/main.ui.h:23
#, fuzzy
msgid "Set configuration URI"
msgstr "Proxy/Regisztráció konfigurációs doboz"
-#: ../gtk/main.ui.h:19
+#: ../gtk/main.ui.h:24
msgid "Always start video"
msgstr "Videó indítása mindig"
-#: ../gtk/main.ui.h:20
+#: ../gtk/main.ui.h:25
msgid "Enable self-view"
msgstr "Saját nézet"
-#: ../gtk/main.ui.h:21
+#: ../gtk/main.ui.h:26
msgid "_Help"
msgstr "_Segítség"
-#: ../gtk/main.ui.h:22
+#: ../gtk/main.ui.h:27
msgid "Show debug window"
msgstr "Hibakeresési ablak mutatása"
-#: ../gtk/main.ui.h:23
+#: ../gtk/main.ui.h:28
msgid "_Homepage"
msgstr "_Honlap"
-#: ../gtk/main.ui.h:24
+#: ../gtk/main.ui.h:29
msgid "Check _Updates"
msgstr "Frissítések keresése"
-#: ../gtk/main.ui.h:25
+#: ../gtk/main.ui.h:30
msgid "Account assistant"
msgstr "Fiók varázsló"
-#: ../gtk/main.ui.h:26
+#: ../gtk/main.ui.h:32
msgid "SIP address or phone number:"
msgstr "Adja meg a SIP címet vagy a telefonszámot:"
-#: ../gtk/main.ui.h:27
+#: ../gtk/main.ui.h:33
msgid "Initiate a new call"
msgstr "Új hívás kezdeményezése"
-#: ../gtk/main.ui.h:28
+#: ../gtk/main.ui.h:34
msgid "Contacts"
msgstr "Partnerek"
-#: ../gtk/main.ui.h:29
+#: ../gtk/main.ui.h:35
msgid "Search"
msgstr "Keresés"
-#: ../gtk/main.ui.h:30
+#: ../gtk/main.ui.h:36
msgid "Add contacts from directory"
msgstr "Partnerek hozzáadása könyvtárból"
-#: ../gtk/main.ui.h:31
+#: ../gtk/main.ui.h:37
msgid "Add contact"
msgstr "Partner hozzáadása"
-#: ../gtk/main.ui.h:32
+#: ../gtk/main.ui.h:38
msgid "Recent calls"
msgstr "Legutóbbi hívások"
-#: ../gtk/main.ui.h:33
+#: ../gtk/main.ui.h:39
msgid "My current identity:"
msgstr "Jelenlegi identitásom:"
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
msgid "Username"
msgstr "Felhasználónév"
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
msgid "Password"
msgstr "Jelszó"
-#: ../gtk/main.ui.h:36
+#: ../gtk/main.ui.h:42
msgid "Internet connection:"
msgstr "Internet kapcsolat:"
-#: ../gtk/main.ui.h:37
+#: ../gtk/main.ui.h:43
msgid "Automatically log me in"
msgstr "Jelentkeztessen be automatikusan"
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
msgid "UserID"
msgstr "Felhasználó azonosító"
-#: ../gtk/main.ui.h:39
+#: ../gtk/main.ui.h:45
msgid "Login information"
msgstr "Bejelentkezési információ"
-#: ../gtk/main.ui.h:40
+#: ../gtk/main.ui.h:46
msgid "Welcome !"
msgstr "Üdvözöljük !"
-#: ../gtk/main.ui.h:41
-msgid "All users"
-msgstr "Minden felhasználó"
-
-#: ../gtk/main.ui.h:42
-msgid "Online users"
-msgstr "Elérhető"
-
-#: ../gtk/main.ui.h:43
-msgid "ADSL"
-msgstr "ADSL"
-
-#: ../gtk/main.ui.h:44
-msgid "Fiber Channel"
-msgstr "Fiber csatorna"
-
-#: ../gtk/main.ui.h:45
-msgid "Default"
-msgstr "Alapértelmezett"
-
-#: ../gtk/main.ui.h:46
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr "Törlés"
@@ -1058,23 +1145,32 @@ msgid "Contact params (optional):"
msgstr "Út (nem kötelező):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Út (nem kötelező):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Átvitel"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr "Regisztráció"
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "Jelenléti információ közlése"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Engedélyezés"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "SIP fiók beállítása"
@@ -1500,6 +1596,10 @@ msgid "Video resolution sent"
msgstr "Kívánt videó felbontás:"
#: ../gtk/call_statistics.ui.h:11
+msgid "RTP profile"
+msgstr ""
+
+#: ../gtk/call_statistics.ui.h:12
msgid "Call statistics and information"
msgstr "Hívási statisztika és információ"
@@ -1706,19 +1806,19 @@ msgstr "Kapcsolódás..."
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "megszakítva"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "befejezve"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "elhibázva"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1733,77 +1833,77 @@ msgstr ""
"Állapot: %s\n"
"Időtartam: %i perc %i másodperc\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Kimenő hívás"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "Kész"
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Információk"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Telefonszám-cél keresése..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "Nem sikkerült értelmezni a számot."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "Kapcsolódás"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
msgid "Could not call"
msgstr "Nem sikerült hívni"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
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:2952
+#: ../coreapi/linphonecore.c:3022
msgid "is contacting you"
msgstr "kapcsolatba lépett veled."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr "és automatikus választ kért."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr "."
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr "A hívási jellemzők módosítása..."
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Kapcsolódva."
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
msgid "Call aborted"
msgstr "Hívás megszakítva"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr "Nem sikerült várakoztatni a hívást"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr "Jelenlegi hívás várakoztatásának aktiválása..."
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "Stun keresés folyamatban..."
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr "ICE helyi jelentkezők begyűjtése folyamatban..."
@@ -1860,7 +1960,7 @@ msgstr "Időtartam"
msgid "Unknown-bug"
msgstr "Ismeretlen programhiba"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
@@ -1868,7 +1968,7 @@ msgstr ""
"Az Ön által megadott SIP proxy cím érvénytelen. \"sip:\"-tal kell kezdődnie, "
"ezt egy hosztnév követi."
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1877,134 +1977,136 @@ msgstr ""
"Így kéne kinéznie: sip:felhasznalonev@proxytartomany, például sip:"
"aladar@pelda.hu"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "Nem sikerült belépni ezzel: %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr "Távoli csengés."
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
msgid "Remote ringing..."
msgstr "Távoli csengés..."
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr "Korai médiák."
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr "A hívás a következővel: %s várakoztatva"
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr "%s fogadta a hívást - várakoztatva."
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
msgid "Call resumed."
msgstr "Hívás visszatért"
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr "%s válaszolt a hívásra."
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
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:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr "Visszatértünk."
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr "Megállítva a másik fél által."
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr "A hívás távolról frissítve."
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "A hívás befejezve."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "A felhasználó foglalt."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "A felhasználó ideiglenesen nem elérhető"
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "A felhasználó nem akarja, hogy zavarják."
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Hívás elutasítva"
-#: ../coreapi/callbacks.c:603
-msgid "No response."
-msgstr "Nincs válasz."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
+msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr "Protokol hiba."
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr "Átirányítva"
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr "Nem kompatibilis médiajellemzők."
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
msgid "Call failed."
msgstr "Nem sikerült a hívás."
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "A regisztáció a %s -n sikerült."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "A kiregisztrálás kész a következőn: %s ."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "időtúllépés után nincs válasz"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "A regisztáció a %s -n nem sikerült: %s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, c-format
msgid "Authentication token is %s"
msgstr "Hitelesítési jel: %s"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
msgstr[0] "Van %i nem fogadott hivás."
+#~ msgid "No response."
+#~ msgstr "Nincs válasz."
+
+#~ msgid "Protocol error."
+#~ msgstr "Protokol hiba."
+
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
#~ "user@domain"
@@ -2390,9 +2492,6 @@ msgstr[0] "Van %i nem fogadott hivás."
#~ msgid "micro"
#~ msgstr "mikrofon"
-#~ msgid "Recording source:"
-#~ msgstr "Felvételi forrás:"
-
#~ msgid "Enable echo-canceler (cancels the echo heard by the remote party)"
#~ msgstr ""
#~ "Visszhang törlés engedélyezése (törli a visszhangot, amit hall a távoli "
diff --git a/po/it.po b/po/it.po
index 7328350ac..a04f95573 100644
--- a/po/it.po
+++ b/po/it.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Linphone 3.2.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2002-10-15 HO:MI+ZONE\n"
"Last-Translator: Matteo Piazza \n"
"Language-Team: it \n"
@@ -15,67 +15,67 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "Chiamata %s"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "Invia testo a %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "In chiamata con"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr ""
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "annullato"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
#, fuzzy
msgid "Missed"
msgstr "mancante"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "Rifiuta"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
"%s\t%s\t"
msgstr ""
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -98,51 +98,56 @@ msgstr ""
msgid "Couldn't find pixmap file: %s"
msgstr ""
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "Contatto SIP non valido"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr ""
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr ""
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr ""
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr ""
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr ""
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
msgstr ""
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Informazioni"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "Configuratore di account"
+
+#: ../gtk/main.c:590
#, fuzzy, c-format
msgid "Call with %s"
msgstr "Chat con %s"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -154,74 +159,74 @@ msgstr ""
"veda il tuo stato o aggiungerlo alla tua lista dei contatti Se rispondi no "
"questo utente sarà momentaneamente bloccato."
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
" at realm %s:"
msgstr "Prego inserire la password per username %s e dominio %s"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
#, fuzzy
msgid "Call error"
msgstr "Cronologia"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "Chiamata terminata"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Chimata in entrata"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr ""
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "Rifiuta"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy
msgid "Call paused"
msgstr "annullato"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "Porte"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr ""
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr ""
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (Default)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr ""
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
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:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr ""
@@ -233,7 +238,7 @@ msgstr ""
msgid "Presence status"
msgstr "Presenza"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Nome"
@@ -251,141 +256,141 @@ msgstr ""
msgid "Search in %s directory"
msgstr "Cerca contatti nella directory %s"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "Modifica contatto %s"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "Elimina contatto %s"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, fuzzy, c-format
msgid "Delete chat history of '%s'"
msgstr "Elimina contatto %s"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "Aggiungi nuovo contatto dalla directory %s"
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr ""
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Stato"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Bitrate Min (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Parametri"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "Attivato"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Disattivato"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "Account"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "Inglese"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "Francese"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "Svedese"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "Italiano"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "Spagnolo"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr ""
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "Polacco"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "Tedesco"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "Russo"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "Giapponese"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "Olandese"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "Ungherese"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "Ceco"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr ""
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr "Riavviare il software per utilizzare la nuova lingua selezionata"
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr ""
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -529,41 +534,41 @@ msgid ""
"Then come back here and press Next button."
msgstr ""
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "Configuratore di account"
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "Benvenuto nel configuratore di account"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "Configuratore di account"
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
#, fuzzy
msgid "Configure your account (step 1/1)"
msgstr "Configurazione SIP account"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr ""
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr ""
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr ""
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
#, fuzzy
msgid "Terminating"
msgstr "Termina chiamata"
@@ -573,195 +578,195 @@ msgstr "Termina chiamata"
msgid "Call #%i"
msgstr "Chiamata %s"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr ""
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
msgid "Not used"
msgstr ""
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "Filtro ICE"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
#, fuzzy
msgid "Direct"
msgstr "Rediretto verso %s..."
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
#, fuzzy
msgid "uPnP in progress"
msgstr "Ricerca Stun in progresso ..."
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
msgid "uPnp not available"
msgstr ""
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "Filtro ICE"
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr ""
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
#, fuzzy
msgid "Calling..."
msgstr "Linguaggio"
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr ""
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
#, fuzzy
msgid "Incoming call"
msgstr "Chimata in entrata"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr ""
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr ""
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr ""
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr ""
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr ""
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr ""
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr ""
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr ""
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr ""
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
#, fuzzy
msgid "In call"
msgstr "In chiamata con"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
#, fuzzy
msgid "Paused call"
msgstr "Termina chiamata"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr ""
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "Chiamata terminata."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr ""
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "Chiamata rifiutata"
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr ""
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
msgid "(Paused)"
msgstr ""
@@ -780,6 +785,87 @@ msgstr "Chiamata proveniente da %s"
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"Benvenuti !\n"
+"La procedura vi aiutera a configurare un account SIP."
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Dispositivo microfono:"
+
+#: ../gtk/audio_assistant.c:327
+msgid "Recorded volume"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Dispositivo uscita audio:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "Configuratore"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "Configuratore di account"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
#, fuzzy
msgid "Callee name"
@@ -822,135 +908,135 @@ msgid "Call quality rating"
msgstr ""
#: ../gtk/main.ui.h:17
-msgid "_Options"
-msgstr ""
-
-#: ../gtk/main.ui.h:18
-#, fuzzy
-msgid "Set configuration URI"
-msgstr "Informazioni"
-
-#: ../gtk/main.ui.h:19
-msgid "Always start video"
-msgstr ""
-
-#: ../gtk/main.ui.h:20
-msgid "Enable self-view"
-msgstr "Self-view abilitato"
-
-#: ../gtk/main.ui.h:21
-msgid "_Help"
-msgstr ""
-
-#: ../gtk/main.ui.h:22
-#, fuzzy
-msgid "Show debug window"
-msgstr "Linphone debug window"
-
-#: ../gtk/main.ui.h:23
-msgid "_Homepage"
-msgstr ""
-
-#: ../gtk/main.ui.h:24
-msgid "Check _Updates"
-msgstr ""
-
-#: ../gtk/main.ui.h:25
-#, fuzzy
-msgid "Account assistant"
-msgstr "Configuratore di account"
-
-#: ../gtk/main.ui.h:26
-msgid "SIP address or phone number:"
-msgstr "Indirizzo sip o numero."
-
-#: ../gtk/main.ui.h:27
-msgid "Initiate a new call"
-msgstr ""
-
-#: ../gtk/main.ui.h:28
-#, fuzzy
-msgid "Contacts"
-msgstr "In connessione"
-
-#: ../gtk/main.ui.h:29
-msgid "Search"
-msgstr ""
-
-#: ../gtk/main.ui.h:30
-#, fuzzy
-msgid "Add contacts from directory"
-msgstr "Aggiungi nuovo contatto dalla directory %s"
-
-#: ../gtk/main.ui.h:31
-#, fuzzy
-msgid "Add contact"
-msgstr "Trovato %i contatto"
-
-#: ../gtk/main.ui.h:32
-#, fuzzy
-msgid "Recent calls"
-msgstr "In chiamata"
-
-#: ../gtk/main.ui.h:33
-msgid "My current identity:"
-msgstr "Identità corrente"
-
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
-msgid "Username"
-msgstr "Username"
-
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
-msgid "Password"
-msgstr "Password"
-
-#: ../gtk/main.ui.h:36
-msgid "Internet connection:"
-msgstr "Connessione Internet:"
-
-#: ../gtk/main.ui.h:37
-msgid "Automatically log me in"
-msgstr "Login Automatico"
-
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
-msgid "UserID"
-msgstr ""
-
-#: ../gtk/main.ui.h:39
-msgid "Login information"
-msgstr "Credenziali di accesso"
-
-#: ../gtk/main.ui.h:40
-msgid "Welcome !"
-msgstr "Benvenuto !"
-
-#: ../gtk/main.ui.h:41
msgid "All users"
msgstr ""
-#: ../gtk/main.ui.h:42
+#: ../gtk/main.ui.h:18
#, fuzzy
msgid "Online users"
msgstr ""
"Tutti gli utenti\n"
"Utenti Online"
-#: ../gtk/main.ui.h:43
+#: ../gtk/main.ui.h:19
msgid "ADSL"
msgstr ""
-#: ../gtk/main.ui.h:44
+#: ../gtk/main.ui.h:20
#, fuzzy
msgid "Fiber Channel"
msgstr ""
"ADSL\n"
"Fibra Ottica"
-#: ../gtk/main.ui.h:45
+#: ../gtk/main.ui.h:21
msgid "Default"
msgstr "Default"
+#: ../gtk/main.ui.h:22
+msgid "_Options"
+msgstr ""
+
+#: ../gtk/main.ui.h:23
+#, fuzzy
+msgid "Set configuration URI"
+msgstr "Informazioni"
+
+#: ../gtk/main.ui.h:24
+msgid "Always start video"
+msgstr ""
+
+#: ../gtk/main.ui.h:25
+msgid "Enable self-view"
+msgstr "Self-view abilitato"
+
+#: ../gtk/main.ui.h:26
+msgid "_Help"
+msgstr ""
+
+#: ../gtk/main.ui.h:27
+#, fuzzy
+msgid "Show debug window"
+msgstr "Linphone debug window"
+
+#: ../gtk/main.ui.h:28
+msgid "_Homepage"
+msgstr ""
+
+#: ../gtk/main.ui.h:29
+msgid "Check _Updates"
+msgstr ""
+
+#: ../gtk/main.ui.h:30
+#, fuzzy
+msgid "Account assistant"
+msgstr "Configuratore di account"
+
+#: ../gtk/main.ui.h:32
+msgid "SIP address or phone number:"
+msgstr "Indirizzo sip o numero."
+
+#: ../gtk/main.ui.h:33
+msgid "Initiate a new call"
+msgstr ""
+
+#: ../gtk/main.ui.h:34
+#, fuzzy
+msgid "Contacts"
+msgstr "In connessione"
+
+#: ../gtk/main.ui.h:35
+msgid "Search"
+msgstr ""
+
+#: ../gtk/main.ui.h:36
+#, fuzzy
+msgid "Add contacts from directory"
+msgstr "Aggiungi nuovo contatto dalla directory %s"
+
+#: ../gtk/main.ui.h:37
+#, fuzzy
+msgid "Add contact"
+msgstr "Trovato %i contatto"
+
+#: ../gtk/main.ui.h:38
+#, fuzzy
+msgid "Recent calls"
+msgstr "In chiamata"
+
+#: ../gtk/main.ui.h:39
+msgid "My current identity:"
+msgstr "Identità corrente"
+
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
+msgid "Username"
+msgstr "Username"
+
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
+msgid "Password"
+msgstr "Password"
+
+#: ../gtk/main.ui.h:42
+msgid "Internet connection:"
+msgstr "Connessione Internet:"
+
+#: ../gtk/main.ui.h:43
+msgid "Automatically log me in"
+msgstr "Login Automatico"
+
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
+msgid "UserID"
+msgstr ""
+
+#: ../gtk/main.ui.h:45
+msgid "Login information"
+msgstr "Credenziali di accesso"
+
#: ../gtk/main.ui.h:46
+msgid "Welcome !"
+msgstr "Benvenuto !"
+
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1063,23 +1149,32 @@ msgid "Contact params (optional):"
msgstr "Rotta (opzionale)"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Rotta (opzionale)"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Transporto"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr ""
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "Pubblica stato della presenza"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Attivato"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "Configurazione SIP account"
@@ -1525,6 +1620,11 @@ msgstr "Risoluzione video preferita"
#: ../gtk/call_statistics.ui.h:11
#, fuzzy
+msgid "RTP profile"
+msgstr "RTP imput filter"
+
+#: ../gtk/call_statistics.ui.h:12
+#, fuzzy
msgid "Call statistics and information"
msgstr "Contact informazioni"
@@ -1730,19 +1830,19 @@ msgstr "In connessione..."
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "annullato"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "comletato"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "mancante"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1757,82 +1857,82 @@ msgstr ""
"Stato: %s\n"
"Durata: %i mn %i sec\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Chiamata in uscita"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "Pronto"
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Informazioni"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Ricerca numero destinazione..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "Impossibile risolvere il numero."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "In connessione"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
#, fuzzy
msgid "Could not call"
msgstr "chiamata fallita"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr ""
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
#, fuzzy
msgid "is contacting you"
msgstr "ti sta conttatando."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr ""
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr ""
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr ""
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Connessione"
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
#, fuzzy
msgid "Call aborted"
msgstr "annullato"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
#, fuzzy
msgid "Could not pause the call"
msgstr "chiamata fallita"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
#, fuzzy
msgid "Pausing the current call..."
msgstr "Mostra chiamata corrente"
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "Ricerca Stun in progresso ..."
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1889,7 +1989,7 @@ msgstr "Durata"
msgid "Unknown-bug"
msgstr "Bug-sconosciuto"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
@@ -1897,7 +1997,7 @@ msgstr ""
"L'indirizzo sip proxy utilizzato è invalido, deve iniziare con \"sip:\" "
"seguito dall' hostaname."
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1905,138 +2005,137 @@ msgstr ""
"L'identità sip utilizza è invalida.\n"
"Dovrebbre essere sip:username@proxydomain, esempio: sip:alice@example.net"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "impossibile login come %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr ""
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
msgid "Remote ringing..."
msgstr ""
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr ""
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, fuzzy, c-format
msgid "Call with %s is paused."
msgstr "Chat con %s"
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr ""
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
#, fuzzy
msgid "Call resumed."
msgstr "Chiamata terminata"
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr ""
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr ""
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr ""
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "Chiamata terminata."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "Utente occupato"
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "Utente non disponibile"
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "L'utente non vuole essere disturbato"
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Chiamata rifiutata"
-#: ../coreapi/callbacks.c:603
-#, fuzzy
-msgid "No response."
-msgstr "timeout no risposta"
-
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
msgstr ""
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
#, fuzzy
msgid "Redirected"
msgstr "Rediretto verso %s..."
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr ""
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
#, fuzzy
msgid "Call failed."
msgstr "Chiamata rifiutata"
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "Registrazione su %s attiva"
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "Unregistrazione su %s"
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "timeout no risposta"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "Registrazione su %s fallita: %s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, fuzzy, c-format
msgid "Authentication token is %s"
msgstr "Linphone - Autenticazione richiesta"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
msgstr[0] ""
msgstr[1] ""
+#, fuzzy
+#~ msgid "No response."
+#~ msgstr "timeout no risposta"
+
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
#~ "user@domain"
@@ -2194,9 +2293,6 @@ msgstr[1] ""
#~ msgid "RTP output filter"
#~ msgstr "RTP output filter"
-#~ msgid "RTP input filter"
-#~ msgstr "RTP imput filter"
-
#~ msgid "The free and wonderful speex codec"
#~ msgstr "The free and wonderful speex codec"
@@ -2345,9 +2441,6 @@ msgstr[1] ""
#~ msgid "Sound playback filter for MacOS X Core Audio drivers"
#~ msgstr "Sound playback filter for MacOS X Core Audio drivers"
-#~ msgid "Assistant"
-#~ msgstr "Configuratore"
-
#~ msgid "Start call"
#~ msgstr "Inizia chiamata"
diff --git a/po/ja.po b/po/ja.po
index 900fc6cc3..3cb7d0a36 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: linphone 0.10\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2003-01-21 00:05+9000\n"
"Last-Translator: YAMAGUCHI YOSHIYA \n"
"Language-Team: \n"
@@ -17,66 +17,66 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr ""
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr ""
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "接続中"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr ""
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "通話はキャンセルされました。"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
msgid "Missed"
msgstr ""
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "ライン入力"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
"%s\t%s\t"
msgstr ""
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -96,51 +96,55 @@ msgstr ""
msgid "Couldn't find pixmap file: %s"
msgstr "pixmapファイルが見つかりません %s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr ""
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr ""
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr ""
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr ""
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr ""
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr ""
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
msgstr ""
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "情報"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+msgid "Run the audio assistant"
+msgstr ""
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr ""
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -149,76 +153,76 @@ msgid ""
"If you answer no, this person will be temporarily blacklisted."
msgstr ""
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, c-format
msgid ""
"Please enter your password for username %s\n"
" at realm %s:"
msgstr ""
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
#, fuzzy
msgid "Call error"
msgstr "通話はキャンセルされました。"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
#, fuzzy
msgid "Call ended"
msgstr "通話は拒否されました。"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr ""
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr ""
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
#, fuzzy
msgid "Decline"
msgstr "ライン入力"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy
msgid "Call paused"
msgstr "通話はキャンセルされました。"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "接続中"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr ""
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr ""
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr ""
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr ""
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
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:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr ""
@@ -232,7 +236,7 @@ msgstr "電話帳"
msgid "Presence status"
msgstr "状態"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "名前"
@@ -250,142 +254,142 @@ msgstr ""
msgid "Search in %s directory"
msgstr ""
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, fuzzy, c-format
msgid "Edit contact '%s'"
msgstr "(接続するための情報がありません!)"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr ""
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, c-format
msgid "Delete chat history of '%s'"
msgstr ""
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr ""
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr ""
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "状態"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "最低限のビットレート (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "パラメーター"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "使用する"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "使用しない"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr ""
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr ""
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "Français"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr ""
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr ""
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr ""
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr ""
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr ""
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr ""
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr ""
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "日本語"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr ""
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "Magyar"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "čeština"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "简体中文"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr ""
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr ""
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
#, fuzzy
msgid "None"
msgstr "ありません。"
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -526,39 +530,39 @@ msgid ""
"Then come back here and press Next button."
msgstr ""
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
msgid "SIP account configuration assistant"
msgstr ""
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr ""
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr ""
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
msgid "Configure your account (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr ""
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr ""
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr ""
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr ""
@@ -567,195 +571,195 @@ msgstr ""
msgid "Call #%i"
msgstr "通話はキャンセルされました。"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr ""
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
msgid "Not used"
msgstr ""
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "通話はキャンセルされました。"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
msgid "Direct"
msgstr ""
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
msgid "uPnP in progress"
msgstr ""
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
#, fuzzy
msgid "uPnp not available"
msgstr "特に情報はありません"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "通話はキャンセルされました。"
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr ""
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
#, fuzzy
msgid "Calling..."
msgstr "接続中"
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr ""
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
#, fuzzy
msgid "Incoming call"
msgstr "接続中"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr ""
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr ""
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr ""
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr ""
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr ""
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr ""
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr ""
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr ""
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr ""
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
#, fuzzy
msgid "In call"
msgstr "接続中"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
#, fuzzy
msgid "Paused call"
msgstr "接続中"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr ""
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
#, fuzzy
msgid "Call ended."
msgstr "通話は拒否されました。"
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr ""
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "通話はキャンセルされました。"
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr ""
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
msgid "(Paused)"
msgstr ""
@@ -774,6 +778,83 @@ msgstr ""
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "使用するサウンドデバイス"
+
+#: ../gtk/audio_assistant.c:327
+#, fuzzy
+msgid "Recorded volume"
+msgstr "録音する音源"
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "使用するサウンドデバイス"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+msgid "Audio Assistant"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+msgid "Audio assistant"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
#, fuzzy
msgid "Callee name"
@@ -819,136 +900,136 @@ msgid "Call quality rating"
msgstr ""
#: ../gtk/main.ui.h:17
-msgid "_Options"
+msgid "All users"
msgstr ""
#: ../gtk/main.ui.h:18
#, fuzzy
-msgid "Set configuration URI"
-msgstr "情報"
-
-#: ../gtk/main.ui.h:19
-msgid "Always start video"
-msgstr ""
-
-#: ../gtk/main.ui.h:20
-#, fuzzy
-msgid "Enable self-view"
-msgstr "使用する"
-
-#: ../gtk/main.ui.h:21
-msgid "_Help"
-msgstr ""
-
-#: ../gtk/main.ui.h:22
-msgid "Show debug window"
-msgstr ""
-
-#: ../gtk/main.ui.h:23
-msgid "_Homepage"
-msgstr ""
-
-#: ../gtk/main.ui.h:24
-msgid "Check _Updates"
-msgstr ""
-
-#: ../gtk/main.ui.h:25
-msgid "Account assistant"
-msgstr ""
-
-#: ../gtk/main.ui.h:26
-#, fuzzy
-msgid "SIP address or phone number:"
-msgstr "レジストラサーバーのSIPアドレス"
-
-#: ../gtk/main.ui.h:27
-msgid "Initiate a new call"
-msgstr ""
-
-#: ../gtk/main.ui.h:28
-#, fuzzy
-msgid "Contacts"
-msgstr "接続中"
-
-#: ../gtk/main.ui.h:29
-msgid "Search"
-msgstr ""
-
-#: ../gtk/main.ui.h:30
-#, fuzzy
-msgid "Add contacts from directory"
-msgstr "コーデックの情報"
-
-#: ../gtk/main.ui.h:31
-#, fuzzy
-msgid "Add contact"
-msgstr "(接続するための情報がありません!)"
-
-#: ../gtk/main.ui.h:32
-#, fuzzy
-msgid "Recent calls"
-msgstr "接続中"
-
-#: ../gtk/main.ui.h:33
-#, fuzzy
-msgid "My current identity:"
-msgstr "個人情報"
-
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
-#, fuzzy
-msgid "Username"
-msgstr "ユーザーマニュアル"
-
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
-#, fuzzy
-msgid "Password"
-msgstr "パスワード"
-
-#: ../gtk/main.ui.h:36
-msgid "Internet connection:"
-msgstr ""
-
-#: ../gtk/main.ui.h:37
-msgid "Automatically log me in"
-msgstr ""
-
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
-msgid "UserID"
-msgstr ""
-
-#: ../gtk/main.ui.h:39
-#, fuzzy
-msgid "Login information"
-msgstr "コーデックの情報"
-
-#: ../gtk/main.ui.h:40
-#, fuzzy
-msgid "Welcome !"
-msgstr "接続中"
-
-#: ../gtk/main.ui.h:41
-msgid "All users"
-msgstr ""
-
-#: ../gtk/main.ui.h:42
-#, fuzzy
msgid "Online users"
msgstr "ライン入力"
-#: ../gtk/main.ui.h:43
+#: ../gtk/main.ui.h:19
msgid "ADSL"
msgstr ""
-#: ../gtk/main.ui.h:44
+#: ../gtk/main.ui.h:20
msgid "Fiber Channel"
msgstr ""
-#: ../gtk/main.ui.h:45
+#: ../gtk/main.ui.h:21
#, fuzzy
msgid "Default"
msgstr "個人情報"
+#: ../gtk/main.ui.h:22
+msgid "_Options"
+msgstr ""
+
+#: ../gtk/main.ui.h:23
+#, fuzzy
+msgid "Set configuration URI"
+msgstr "情報"
+
+#: ../gtk/main.ui.h:24
+msgid "Always start video"
+msgstr ""
+
+#: ../gtk/main.ui.h:25
+#, fuzzy
+msgid "Enable self-view"
+msgstr "使用する"
+
+#: ../gtk/main.ui.h:26
+msgid "_Help"
+msgstr ""
+
+#: ../gtk/main.ui.h:27
+msgid "Show debug window"
+msgstr ""
+
+#: ../gtk/main.ui.h:28
+msgid "_Homepage"
+msgstr ""
+
+#: ../gtk/main.ui.h:29
+msgid "Check _Updates"
+msgstr ""
+
+#: ../gtk/main.ui.h:30
+msgid "Account assistant"
+msgstr ""
+
+#: ../gtk/main.ui.h:32
+#, fuzzy
+msgid "SIP address or phone number:"
+msgstr "レジストラサーバーのSIPアドレス"
+
+#: ../gtk/main.ui.h:33
+msgid "Initiate a new call"
+msgstr ""
+
+#: ../gtk/main.ui.h:34
+#, fuzzy
+msgid "Contacts"
+msgstr "接続中"
+
+#: ../gtk/main.ui.h:35
+msgid "Search"
+msgstr ""
+
+#: ../gtk/main.ui.h:36
+#, fuzzy
+msgid "Add contacts from directory"
+msgstr "コーデックの情報"
+
+#: ../gtk/main.ui.h:37
+#, fuzzy
+msgid "Add contact"
+msgstr "(接続するための情報がありません!)"
+
+#: ../gtk/main.ui.h:38
+#, fuzzy
+msgid "Recent calls"
+msgstr "接続中"
+
+#: ../gtk/main.ui.h:39
+#, fuzzy
+msgid "My current identity:"
+msgstr "個人情報"
+
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
+#, fuzzy
+msgid "Username"
+msgstr "ユーザーマニュアル"
+
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
+#, fuzzy
+msgid "Password"
+msgstr "パスワード"
+
+#: ../gtk/main.ui.h:42
+msgid "Internet connection:"
+msgstr ""
+
+#: ../gtk/main.ui.h:43
+msgid "Automatically log me in"
+msgstr ""
+
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
+msgid "UserID"
+msgstr ""
+
+#: ../gtk/main.ui.h:45
+#, fuzzy
+msgid "Login information"
+msgstr "コーデックの情報"
+
#: ../gtk/main.ui.h:46
+#, fuzzy
+msgid "Welcome !"
+msgstr "接続中"
+
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1064,24 +1145,33 @@ msgid "Contact params (optional):"
msgstr ""
#: ../gtk/sip_account.ui.h:9
-msgid "Route (optional):"
+msgid "AVPF regular RTCP interval (sec):"
msgstr ""
#: ../gtk/sip_account.ui.h:10
+msgid "Route (optional):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "接続中"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr ""
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
#, fuzzy
msgid "Publish presence information"
msgstr "コーデックの情報"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "使用する"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr ""
@@ -1534,6 +1624,10 @@ msgid "Video resolution sent"
msgstr ""
#: ../gtk/call_statistics.ui.h:11
+msgid "RTP profile"
+msgstr ""
+
+#: ../gtk/call_statistics.ui.h:12
#, fuzzy
msgid "Call statistics and information"
msgstr "コーデックの情報"
@@ -1740,19 +1834,19 @@ msgstr "コネクション"
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr ""
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr ""
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr ""
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1762,82 +1856,82 @@ msgid ""
"Duration: %i mn %i sec\n"
msgstr ""
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr ""
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
#, fuzzy
msgid "Ready"
msgstr "準備完了。"
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "情報"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr ""
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr ""
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
#, fuzzy
msgid "Contacting"
msgstr "接続中"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
#, fuzzy
msgid "Could not call"
msgstr "pixmapファイルが見つかりません %s"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr ""
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
#, fuzzy
msgid "is contacting you"
msgstr "から電話です。"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr ""
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr ""
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr ""
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "接続しました。"
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
#, fuzzy
msgid "Call aborted"
msgstr "通話はキャンセルされました。"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr ""
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr ""
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr ""
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1898,147 +1992,143 @@ msgstr "情報"
msgid "Unknown-bug"
msgstr ""
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
msgstr ""
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
msgstr ""
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, fuzzy, c-format
msgid "Could not login as %s"
msgstr "pixmapファイルが見つかりません %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
#, fuzzy
msgid "Remote ringing."
msgstr "登録中……"
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
#, fuzzy
msgid "Remote ringing..."
msgstr "登録中……"
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr ""
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr ""
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr ""
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
#, fuzzy
msgid "Call resumed."
msgstr "通話は拒否されました。"
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, fuzzy, c-format
msgid "Call answered by %s."
msgstr ""
"電話をかける\n"
"電話に出る"
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr ""
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr ""
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
#, fuzzy
msgid "Call terminated."
msgstr "通話は拒否されました。"
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "ユーザーはビジーです"
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "ユーザーは、今出られません。"
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "ユーザーは手が離せないようです。"
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "通話は拒否されました。"
-#: ../coreapi/callbacks.c:603
-msgid "No response."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr ""
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr ""
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr ""
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
#, fuzzy
msgid "Call failed."
msgstr "通話はキャンセルされました。"
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, fuzzy, c-format
msgid "Registration on %s successful."
msgstr "登録しました。"
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, fuzzy, c-format
msgid "Unregistration on %s done."
msgstr "登録しました。"
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr ""
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, fuzzy, c-format
msgid "Registration on %s failed: %s"
msgstr "登録しました。"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, fuzzy, c-format
msgid "Authentication token is %s"
msgstr "コーデックの情報"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
@@ -2233,9 +2323,6 @@ msgstr[1] ""
#~ msgid "micro"
#~ msgstr "マイク入力"
-#~ msgid "Recording source:"
-#~ msgstr "録音する音源"
-
#~ msgid "Run sip user agent on port:"
#~ msgstr "SIPユーザーエージェントが起動するポート"
diff --git a/po/nb_NO.po b/po/nb_NO.po
index d6eeac5c0..d135aecc6 100644
--- a/po/nb_NO.po
+++ b/po/nb_NO.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2011-04-05 01:56+0200\n"
"Last-Translator: Øyvind Sæther \n"
"Language-Team: Norwegian Bokmål \n"
@@ -17,67 +17,67 @@ msgstr ""
"X-Generator: Lokalize 1.2\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "Ring %s"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "Send tekst til %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "I samtale med"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr ""
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "avbrutt"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
#, fuzzy
msgid "Missed"
msgstr "ubesvart"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "Avvis"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
"%s\t%s\t"
msgstr ""
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -98,35 +98,35 @@ msgstr "Skru mikrofonen av"
msgid "Couldn't find pixmap file: %s"
msgstr "Fant ikke pixmap fli: %s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "Ugyldig SIP kontakt !"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr "skriv logg-informasjon under kjøring"
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr ""
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr "Start skjult i systemkurven, ikke vis programbildet."
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr "address som skal ringes nå"
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr "besvarer innkommende samtaler automatisk om valgt"
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
@@ -134,17 +134,22 @@ msgstr ""
"Spesifiser arbeidsmappe (bør være base for installasjonen, f.eks: c:"
"\\Programfiler\\Linphone)"
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Bekreftelse"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "Brukerkontoveiviser"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "Ring med %s"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -157,7 +162,7 @@ msgstr ""
"din kontaktliste?\n"
"Hvis du svarer nei vil personen bli svartelyst midlertidig."
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
@@ -166,61 +171,61 @@ msgstr ""
"Skriv inn ditt passord for brukernavn %s\n"
" på domene %s:i>:"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
#, fuzzy
msgid "Call error"
msgstr "Samtalehistorikk"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "Samtale avsluttet"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Innkommende samtale"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr "Svarer"
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "Avvis"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy
msgid "Call paused"
msgstr "Samtale avbrutt"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "Porter"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "Peker til nettsted"
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Linphone - en video Internet telefon"
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (Standard)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr "Vi er overført til %s"
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
msgid ""
"No sound cards have been detected on this computer.\n"
"You won't be able to send or receive audio calls."
@@ -228,7 +233,7 @@ msgstr ""
"Klarte ikke å finne noe lydkort på denne datamaskinen.\n"
"Du vil ikke kunne sende eller motta lydsamtaler."
-#: ../gtk/main.c:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "En gratis SIP video-telefon"
@@ -240,7 +245,7 @@ msgstr ""
msgid "Presence status"
msgstr "Tilstedestatus"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Navn"
@@ -258,141 +263,141 @@ msgstr ""
msgid "Search in %s directory"
msgstr "Søk i %s katalogen"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "Rediger kontakt '%s'"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "Slett kontakt '%s'"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, fuzzy, c-format
msgid "Delete chat history of '%s'"
msgstr "Slett kontakt '%s'"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "Legg til kontakt fra %s katalogen"
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Frekvens (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Status"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Min. datahastighet (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Parametere"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "På"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Av"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "Konto"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "Engelsk"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "Fransk"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "Svensk"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "Italisensk"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "Spansk"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "Portugisisk"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "Polsk"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "Tysk"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "Russisk"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "Japansk"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "Nederlandsk"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "Ungarsk"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "Tjekkisk"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "Kinesisk"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr ""
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr "Du må restarte linphone for at det nye språkvalget skal iverksettes."
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr ""
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -536,41 +541,41 @@ msgid ""
"Then come back here and press Next button."
msgstr ""
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "Brukerkontoveiviser"
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "Velkommen til brukerkontoveiviseren"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "Brukerkontoveiviser"
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
#, fuzzy
msgid "Configure your account (step 1/1)"
msgstr "Konfigurer en SIP konto"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr ""
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr ""
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr ""
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
#, fuzzy
msgid "Terminating"
msgstr "Lägg på"
@@ -580,193 +585,193 @@ msgstr "Lägg på"
msgid "Call #%i"
msgstr "Ring %s"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr ""
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
#, fuzzy
msgid "Not used"
msgstr "Ikke funnet"
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "ICE filter"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
#, fuzzy
msgid "Direct"
msgstr "Omdirigert"
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
#, fuzzy
msgid "uPnP in progress"
msgstr "STUN oppslag pågår..."
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
msgid "uPnp not available"
msgstr ""
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "ICE filter"
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr ""
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
msgid "Calling..."
msgstr "Ringer..."
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr "00:00:00"
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
msgid "Incoming call"
msgstr "Innkommende samtale"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr ""
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr ""
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr ""
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr ""
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr ""
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr ""
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr ""
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr ""
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr ""
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In call"
msgstr "I samtale med"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
msgid "Paused call"
msgstr "Pauset samtale"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr "%02i:%02i:%02i"
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "Samtale avsluttet."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
#, fuzzy
msgid "Transfer done."
msgstr "Overfører"
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "Overfører"
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr "Fortsett"
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr "Pause"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, fuzzy
msgid "(Paused)"
msgstr "Pause"
@@ -786,6 +791,87 @@ msgstr "Inkommande samtal från %s"
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"Velkommen\n"
+"Denne veiviseren vil hjelpe deg sette opp en SIP-konto for dine samtaler."
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Mikrofonenhet:"
+
+#: ../gtk/audio_assistant.c:327
+msgid "Recorded volume"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Avspillingsenhet:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "Assistent"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "Brukerkontoveiviser"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
#, fuzzy
msgid "Callee name"
@@ -828,125 +914,125 @@ msgid "Call quality rating"
msgstr ""
#: ../gtk/main.ui.h:17
+msgid "All users"
+msgstr "Alle brukere"
+
+#: ../gtk/main.ui.h:18
+msgid "Online users"
+msgstr "Tilkoblede brukere"
+
+#: ../gtk/main.ui.h:19
+msgid "ADSL"
+msgstr "ADSL"
+
+#: ../gtk/main.ui.h:20
+msgid "Fiber Channel"
+msgstr "Fiber Kanal"
+
+#: ../gtk/main.ui.h:21
+msgid "Default"
+msgstr "Standard"
+
+#: ../gtk/main.ui.h:22
msgid "_Options"
msgstr "_Alternativer"
-#: ../gtk/main.ui.h:18
+#: ../gtk/main.ui.h:23
#, fuzzy
msgid "Set configuration URI"
msgstr "Bekreftelse"
-#: ../gtk/main.ui.h:19
+#: ../gtk/main.ui.h:24
msgid "Always start video"
msgstr ""
-#: ../gtk/main.ui.h:20
+#: ../gtk/main.ui.h:25
msgid "Enable self-view"
msgstr "Vis video av deg selv"
-#: ../gtk/main.ui.h:21
+#: ../gtk/main.ui.h:26
msgid "_Help"
msgstr "_Hjelp"
-#: ../gtk/main.ui.h:22
+#: ../gtk/main.ui.h:27
msgid "Show debug window"
msgstr "Vis avlusningsvindu"
-#: ../gtk/main.ui.h:23
+#: ../gtk/main.ui.h:28
msgid "_Homepage"
msgstr "H_jemmeside"
-#: ../gtk/main.ui.h:24
+#: ../gtk/main.ui.h:29
msgid "Check _Updates"
msgstr "Sjekk _Oppdateringer"
-#: ../gtk/main.ui.h:25
+#: ../gtk/main.ui.h:30
#, fuzzy
msgid "Account assistant"
msgstr "Brukerkontoveiviser"
-#: ../gtk/main.ui.h:26
+#: ../gtk/main.ui.h:32
msgid "SIP address or phone number:"
msgstr "Sip adresse eller telefonnummer:"
-#: ../gtk/main.ui.h:27
+#: ../gtk/main.ui.h:33
msgid "Initiate a new call"
msgstr "Start en ny samtale"
-#: ../gtk/main.ui.h:28
+#: ../gtk/main.ui.h:34
msgid "Contacts"
msgstr "Kontakter"
-#: ../gtk/main.ui.h:29
+#: ../gtk/main.ui.h:35
msgid "Search"
msgstr "Søk"
-#: ../gtk/main.ui.h:30
+#: ../gtk/main.ui.h:36
msgid "Add contacts from directory"
msgstr "Legg til kontakter fra katalogen"
-#: ../gtk/main.ui.h:31
+#: ../gtk/main.ui.h:37
msgid "Add contact"
msgstr "Legg til kontakt"
-#: ../gtk/main.ui.h:32
+#: ../gtk/main.ui.h:38
#, fuzzy
msgid "Recent calls"
msgstr "I samtale"
-#: ../gtk/main.ui.h:33
+#: ../gtk/main.ui.h:39
msgid "My current identity:"
msgstr "Min nåværende identitet:"
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
msgid "Username"
msgstr "Brukernavn"
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
msgid "Password"
msgstr "Passord"
-#: ../gtk/main.ui.h:36
+#: ../gtk/main.ui.h:42
msgid "Internet connection:"
msgstr "Internet forbindelse:"
-#: ../gtk/main.ui.h:37
+#: ../gtk/main.ui.h:43
msgid "Automatically log me in"
msgstr "Logg meg på automatisk"
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
msgid "UserID"
msgstr "BrukerID"
-#: ../gtk/main.ui.h:39
+#: ../gtk/main.ui.h:45
msgid "Login information"
msgstr "Innlogginsinformasjon"
-#: ../gtk/main.ui.h:40
+#: ../gtk/main.ui.h:46
msgid "Welcome !"
msgstr "Velkommen!"
-#: ../gtk/main.ui.h:41
-msgid "All users"
-msgstr "Alle brukere"
-
-#: ../gtk/main.ui.h:42
-msgid "Online users"
-msgstr "Tilkoblede brukere"
-
-#: ../gtk/main.ui.h:43
-msgid "ADSL"
-msgstr "ADSL"
-
-#: ../gtk/main.ui.h:44
-msgid "Fiber Channel"
-msgstr "Fiber Kanal"
-
-#: ../gtk/main.ui.h:45
-msgid "Default"
-msgstr "Standard"
-
-#: ../gtk/main.ui.h:46
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1070,23 +1156,32 @@ msgid "Contact params (optional):"
msgstr "Route (valgfritt):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Route (valgfritt):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Transport"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr ""
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "Publiser tilstedestatus"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Aktiver"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "Konfigurer en SIP konto"
@@ -1519,6 +1614,11 @@ msgstr "Foretrukke video-oppløsning:"
#: ../gtk/call_statistics.ui.h:11
#, fuzzy
+msgid "RTP profile"
+msgstr "RTP inn-filter"
+
+#: ../gtk/call_statistics.ui.h:12
+#, fuzzy
msgid "Call statistics and information"
msgstr "Kontaktinformasjon"
@@ -1724,19 +1824,19 @@ msgstr "Tilknytter..."
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "avbrutt"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "Fullført"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "ubesvart"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1751,77 +1851,77 @@ msgstr ""
"Status: %s\n"
"Lengde: %i min %i sek\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Utgående samtale"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "Klar"
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Bekreftelse"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Ser etter telefonnummer for destinasjonen..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "Kan ikke tilkoble dette nummeret."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "Tilknytter"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
msgid "Could not call"
msgstr "Kunne ikke ringe"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr "Beklager, du har nådd maksimalt antall samtidige samtaler"
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
msgid "is contacting you"
msgstr "Kontakter deg."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr " og ba om autosvar."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr "."
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr "Endrer ringeparametre..."
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Tilkoblet"
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
msgid "Call aborted"
msgstr "Samtale avbrutt"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr "Kunne ikke pause samtalen"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr "Pauser nåværende samtale"
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "STUN oppslag pågår..."
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1878,7 +1978,7 @@ msgstr "Varighet"
msgid "Unknown-bug"
msgstr "Ukjent feil"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
@@ -1886,7 +1986,7 @@ msgstr ""
"SIP proxy adressen du har angitt er ugyldig, den må begynne med \"sip:\" "
"etterfult av vertsnavn."
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1894,136 +1994,138 @@ msgstr ""
"SIP adressen du har angitt er feil. Adressen bør se ut som sip: "
"brukernavn@domenenavn, f.eks sip:ola@eksempel.no"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "Ikke ikke logge inn som %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr "Ringer hos motparten."
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
#, fuzzy
msgid "Remote ringing..."
msgstr "Ringer hos motparten."
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr "Tidlig media"
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr "Samtalen med %s er pauset."
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr "Samtale besvart av %s - på vent."
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
msgid "Call resumed."
msgstr "Samtale gjenopptatt."
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr "Samtale besvart av %s."
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
#, fuzzy
msgid "We have been resumed."
msgstr "Vi har blitt gjenopptatt..."
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr ""
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "Samtale avsluttet."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "Brukeren er opptatt."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "Brukeren er midlertidig ikke tilgjengelig."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "Brukeren vil ikke bli forstyrret."
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Samtale avvist."
-#: ../coreapi/callbacks.c:603
-msgid "No response."
-msgstr "Ikke noe svar."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
+msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr "Protokollfeil."
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr "Omdirigert"
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr ""
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
msgid "Call failed."
msgstr "Samtale feilet."
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "Registrering hos %s lykkes."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "Avregistrering hos %s lykkes."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "ingen svar innen angitt tid"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "Registrering hos %s mislykkes: %s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, fuzzy, c-format
msgid "Authentication token is %s"
msgstr "Autorisering kreves"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
msgstr[0] "Du har %i ubesvarte anrop."
msgstr[1] "Du har %i missade samtal"
+#~ msgid "No response."
+#~ msgstr "Ikke noe svar."
+
+#~ msgid "Protocol error."
+#~ msgstr "Protokollfeil."
+
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
#~ "user@domain"
@@ -2217,9 +2319,6 @@ msgstr[1] "Du har %i missade samtal"
#~ msgid "RTP output filter"
#~ msgstr "RTP ut-filter"
-#~ msgid "RTP input filter"
-#~ msgstr "RTP inn-filter"
-
#~ msgid "The free and wonderful speex codec"
#~ msgstr "En fri og fantatisk speex kodek"
@@ -2386,9 +2485,6 @@ msgstr[1] "Du har %i missade samtal"
#~ "Din dator er tilkoblet ett IPv6 nettverk. Linphone bruker IPv6 som "
#~ "standard. Oppdater oppsettet om du vil bruke IPv6. "
-#~ msgid "Assistant"
-#~ msgstr "Assistent"
-
#~ msgid "Show debug messages"
#~ msgstr "Visa debugfönstret"
diff --git a/po/nl.po b/po/nl.po
index 26b7a31f5..21a4523cd 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: nl\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2007-09-05 10:40+0200\n"
"Last-Translator: Hendrik-Jan Heins \n"
"Language-Team: Nederlands \n"
@@ -19,67 +19,67 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, fuzzy, c-format
msgid "Call %s"
msgstr "Oproepgeschiedenis"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr ""
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "Contactlijst"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr ""
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "afgebroken"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
#, fuzzy
msgid "Missed"
msgstr "gemist"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "lijn"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
"%s\t%s\t"
msgstr ""
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -99,51 +99,55 @@ msgstr ""
msgid "Couldn't find pixmap file: %s"
msgstr "Kon pixmap bestand %s niet vinden"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr ""
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr ""
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr ""
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr ""
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr ""
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr ""
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
msgstr ""
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Informatie"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+msgid "Run the audio assistant"
+msgstr ""
+
+#: ../gtk/main.c:590
#, fuzzy, c-format
msgid "Call with %s"
msgstr "Chat met %s"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -152,75 +156,75 @@ msgid ""
"If you answer no, this person will be temporarily blacklisted."
msgstr ""
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, c-format
msgid ""
"Please enter your password for username %s\n"
" at realm %s:"
msgstr ""
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
#, fuzzy
msgid "Call error"
msgstr "Linphone - Oproepgeschiedenis"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "Oproep beeindigd"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Inkomende oproep"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr ""
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
#, fuzzy
msgid "Decline"
msgstr "lijn"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy
msgid "Call paused"
msgstr "afgebroken"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "Contactlijst"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr ""
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr ""
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr ""
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr ""
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
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:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "Een Vrije SIP video-telefoon"
@@ -233,7 +237,7 @@ msgstr "Adresboek"
msgid "Presence status"
msgstr "Aanwezigheidsstatus"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Naam"
@@ -252,141 +256,141 @@ msgstr "Chat box"
msgid "Search in %s directory"
msgstr ""
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, fuzzy, c-format
msgid "Edit contact '%s'"
msgstr "Bewerk contactgegevens"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr ""
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, c-format
msgid "Delete chat history of '%s'"
msgstr ""
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr ""
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Frequentie (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Status"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Minimale bitrate (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Parameters"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "Aan"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Uit"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "Account"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr ""
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr ""
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr ""
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr ""
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr ""
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr ""
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr ""
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr ""
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr ""
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr ""
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr ""
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr ""
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr ""
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr ""
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr ""
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr "Geen"
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -527,39 +531,39 @@ msgid ""
"Then come back here and press Next button."
msgstr ""
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
msgid "SIP account configuration assistant"
msgstr ""
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr ""
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr ""
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
msgid "Configure your account (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr ""
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr ""
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr ""
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr ""
@@ -568,197 +572,197 @@ msgstr ""
msgid "Call #%i"
msgstr "Oproepgeschiedenis"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr ""
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
msgid "Not used"
msgstr ""
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "Oproep geannuleerd."
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
#, fuzzy
msgid "Direct"
msgstr "Doorgeschakeld naar %s..."
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
#, fuzzy
msgid "uPnP in progress"
msgstr "STUN adres wordt opgezocht..."
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
#, fuzzy
msgid "uPnp not available"
msgstr "Geen informatie beschikbaar"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "Oproep geannuleerd."
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr ""
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
#, fuzzy
msgid "Calling..."
msgstr "Contactlijst"
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr ""
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
#, fuzzy
msgid "Incoming call"
msgstr "Inkomende oproep"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr ""
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr ""
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr ""
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr ""
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr ""
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr ""
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr ""
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr ""
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr ""
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
#, fuzzy
msgid "In call"
msgstr "Contactlijst"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
#, fuzzy
msgid "Paused call"
msgstr "Contactlijst"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr ""
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
#, fuzzy
msgid "Call ended."
msgstr "Oproep beeindigd"
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr ""
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "Oproep geannuleerd."
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr ""
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
msgid "(Paused)"
msgstr ""
@@ -777,6 +781,83 @@ msgstr "Inkomende oproep"
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Geluidsapparaat gebruiken:"
+
+#: ../gtk/audio_assistant.c:327
+#, fuzzy
+msgid "Recorded volume"
+msgstr "Bron voor opname:"
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Geluidsapparaat gebruiken:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+msgid "Audio Assistant"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+msgid "Audio assistant"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
#, fuzzy
msgid "Callee name"
@@ -822,138 +903,138 @@ msgid "Call quality rating"
msgstr ""
#: ../gtk/main.ui.h:17
-msgid "_Options"
+msgid "All users"
msgstr ""
#: ../gtk/main.ui.h:18
#, fuzzy
-msgid "Set configuration URI"
-msgstr "Proxy/registratieserver registratieveld"
-
-#: ../gtk/main.ui.h:19
-msgid "Always start video"
-msgstr ""
-
-#: ../gtk/main.ui.h:20
-#, fuzzy
-msgid "Enable self-view"
-msgstr "Video aan"
-
-#: ../gtk/main.ui.h:21
-#, fuzzy
-msgid "_Help"
-msgstr "Help"
-
-#: ../gtk/main.ui.h:22
-msgid "Show debug window"
-msgstr ""
-
-#: ../gtk/main.ui.h:23
-msgid "_Homepage"
-msgstr ""
-
-#: ../gtk/main.ui.h:24
-msgid "Check _Updates"
-msgstr ""
-
-#: ../gtk/main.ui.h:25
-msgid "Account assistant"
-msgstr ""
-
-#: ../gtk/main.ui.h:26
-#, fuzzy
-msgid "SIP address or phone number:"
-msgstr "Geef het SIP adres of telefoonnummer in"
-
-#: ../gtk/main.ui.h:27
-msgid "Initiate a new call"
-msgstr ""
-
-#: ../gtk/main.ui.h:28
-#, fuzzy
-msgid "Contacts"
-msgstr "Verbinden"
-
-#: ../gtk/main.ui.h:29
-msgid "Search"
-msgstr ""
-
-#: ../gtk/main.ui.h:30
-#, fuzzy
-msgid "Add contacts from directory"
-msgstr "Contact informatie"
-
-#: ../gtk/main.ui.h:31
-#, fuzzy
-msgid "Add contact"
-msgstr "Bewerk contactgegevens"
-
-#: ../gtk/main.ui.h:32
-#, fuzzy
-msgid "Recent calls"
-msgstr "Inkomende oproep"
-
-#: ../gtk/main.ui.h:33
-#, fuzzy
-msgid "My current identity:"
-msgstr "SIP-identiteit:"
-
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
-#, fuzzy
-msgid "Username"
-msgstr "gebruikersnaam:"
-
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
-#, fuzzy
-msgid "Password"
-msgstr "wachtwoord:"
-
-#: ../gtk/main.ui.h:36
-msgid "Internet connection:"
-msgstr ""
-
-#: ../gtk/main.ui.h:37
-#, fuzzy
-msgid "Automatically log me in"
-msgstr "Automatisch een geldige hostnaam raden"
-
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
-msgid "UserID"
-msgstr ""
-
-#: ../gtk/main.ui.h:39
-#, fuzzy
-msgid "Login information"
-msgstr "Contact informatie"
-
-#: ../gtk/main.ui.h:40
-#, fuzzy
-msgid "Welcome !"
-msgstr "Contactlijst"
-
-#: ../gtk/main.ui.h:41
-msgid "All users"
-msgstr ""
-
-#: ../gtk/main.ui.h:42
-#, fuzzy
msgid "Online users"
msgstr "Aanwezig"
-#: ../gtk/main.ui.h:43
+#: ../gtk/main.ui.h:19
msgid "ADSL"
msgstr ""
-#: ../gtk/main.ui.h:44
+#: ../gtk/main.ui.h:20
msgid "Fiber Channel"
msgstr ""
-#: ../gtk/main.ui.h:45
+#: ../gtk/main.ui.h:21
#, fuzzy
msgid "Default"
msgstr "SIP-identiteit:"
+#: ../gtk/main.ui.h:22
+msgid "_Options"
+msgstr ""
+
+#: ../gtk/main.ui.h:23
+#, fuzzy
+msgid "Set configuration URI"
+msgstr "Proxy/registratieserver registratieveld"
+
+#: ../gtk/main.ui.h:24
+msgid "Always start video"
+msgstr ""
+
+#: ../gtk/main.ui.h:25
+#, fuzzy
+msgid "Enable self-view"
+msgstr "Video aan"
+
+#: ../gtk/main.ui.h:26
+#, fuzzy
+msgid "_Help"
+msgstr "Help"
+
+#: ../gtk/main.ui.h:27
+msgid "Show debug window"
+msgstr ""
+
+#: ../gtk/main.ui.h:28
+msgid "_Homepage"
+msgstr ""
+
+#: ../gtk/main.ui.h:29
+msgid "Check _Updates"
+msgstr ""
+
+#: ../gtk/main.ui.h:30
+msgid "Account assistant"
+msgstr ""
+
+#: ../gtk/main.ui.h:32
+#, fuzzy
+msgid "SIP address or phone number:"
+msgstr "Geef het SIP adres of telefoonnummer in"
+
+#: ../gtk/main.ui.h:33
+msgid "Initiate a new call"
+msgstr ""
+
+#: ../gtk/main.ui.h:34
+#, fuzzy
+msgid "Contacts"
+msgstr "Verbinden"
+
+#: ../gtk/main.ui.h:35
+msgid "Search"
+msgstr ""
+
+#: ../gtk/main.ui.h:36
+#, fuzzy
+msgid "Add contacts from directory"
+msgstr "Contact informatie"
+
+#: ../gtk/main.ui.h:37
+#, fuzzy
+msgid "Add contact"
+msgstr "Bewerk contactgegevens"
+
+#: ../gtk/main.ui.h:38
+#, fuzzy
+msgid "Recent calls"
+msgstr "Inkomende oproep"
+
+#: ../gtk/main.ui.h:39
+#, fuzzy
+msgid "My current identity:"
+msgstr "SIP-identiteit:"
+
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
+#, fuzzy
+msgid "Username"
+msgstr "gebruikersnaam:"
+
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
+#, fuzzy
+msgid "Password"
+msgstr "wachtwoord:"
+
+#: ../gtk/main.ui.h:42
+msgid "Internet connection:"
+msgstr ""
+
+#: ../gtk/main.ui.h:43
+#, fuzzy
+msgid "Automatically log me in"
+msgstr "Automatisch een geldige hostnaam raden"
+
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
+msgid "UserID"
+msgstr ""
+
+#: ../gtk/main.ui.h:45
+#, fuzzy
+msgid "Login information"
+msgstr "Contact informatie"
+
#: ../gtk/main.ui.h:46
+#, fuzzy
+msgid "Welcome !"
+msgstr "Contactlijst"
+
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1072,24 +1153,33 @@ msgid "Contact params (optional):"
msgstr "Route (optioneel):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Route (optioneel):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Contactlijst"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr ""
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
#, fuzzy
msgid "Publish presence information"
msgstr "Toon informatie over aanwezigheid:"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Aan"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr ""
@@ -1546,6 +1636,10 @@ msgid "Video resolution sent"
msgstr ""
#: ../gtk/call_statistics.ui.h:11
+msgid "RTP profile"
+msgstr ""
+
+#: ../gtk/call_statistics.ui.h:12
#, fuzzy
msgid "Call statistics and information"
msgstr "Contact informatie"
@@ -1753,19 +1847,19 @@ msgstr "Verbinden"
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "afgebroken"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "voltooid"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "gemist"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1780,82 +1874,82 @@ msgstr ""
"Status: %s\n"
"Tijdsduur: %i mins %i secs\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Uitgaande oproep"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "Gereed."
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Informatie"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Zoekt de lokatie van het telefoonnummer..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "Kon dit nummer niet vinden."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "Verbinden"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
#, fuzzy
msgid "Could not call"
msgstr "Kon niet oproepen"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr ""
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
#, fuzzy
msgid "is contacting you"
msgstr "belt u."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr ""
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr ""
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr ""
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Verbonden."
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
#, fuzzy
msgid "Call aborted"
msgstr "afgebroken"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
#, fuzzy
msgid "Could not pause the call"
msgstr "Kon niet oproepen"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
#, fuzzy
msgid "Pausing the current call..."
msgstr "Kon niet oproepen"
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "STUN adres wordt opgezocht..."
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1917,147 +2011,143 @@ msgstr "Informatie"
msgid "Unknown-bug"
msgstr ""
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
msgstr ""
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
msgstr ""
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, fuzzy, c-format
msgid "Could not login as %s"
msgstr "Kon pixmap bestand %s niet vinden"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
#, fuzzy
msgid "Remote ringing."
msgstr "Externe diensten"
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
#, fuzzy
msgid "Remote ringing..."
msgstr "Externe diensten"
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr ""
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, fuzzy, c-format
msgid "Call with %s is paused."
msgstr "Chat met %s"
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr ""
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
#, fuzzy
msgid "Call resumed."
msgstr "Oproep beeindigd"
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, fuzzy, c-format
msgid "Call answered by %s."
msgstr ""
"Oproepen of\n"
"beantwoorden"
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr ""
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr ""
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "Oproep beeindigd."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "Gebruiker is bezet."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "Gebruiker is tijdelijk niet beschikbaar."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "De gebruiker wenst niet gestoord te worden."
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Oproep geweigerd."
-#: ../coreapi/callbacks.c:603
-msgid "No response."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr ""
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
#, fuzzy
msgid "Redirected"
msgstr "Doorgeschakeld naar %s..."
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr ""
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
#, fuzzy
msgid "Call failed."
msgstr "Oproep geannuleerd."
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "Registratie op %s gelukt."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, fuzzy, c-format
msgid "Unregistration on %s done."
msgstr "Registratie op %s gelukt."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr ""
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, fuzzy, c-format
msgid "Registration on %s failed: %s"
msgstr "Registratie op %s mislukt (time-out)."
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, fuzzy, c-format
msgid "Authentication token is %s"
msgstr "Authorisatie gegevens"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, fuzzy, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
@@ -2452,9 +2542,6 @@ msgstr[1] "U heeft %i oproep(en) gemist."
#~ msgid "micro"
#~ msgstr "microfoon"
-#~ msgid "Recording source:"
-#~ msgstr "Bron voor opname:"
-
#~ msgid "Enable echo-canceler (cancels the echo heard by the remote party)"
#~ msgstr ""
#~ "Activeer de echo-onderdrukking (onderdrukt de echo die de andere partij "
diff --git a/po/pl.po b/po/pl.po
index fbcbdbd6d..819c7ab7e 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: linphone 0.7.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2003-08-22 12:50+0200\n"
"Last-Translator: Robert Nasiadek \n"
"Language-Team: Polski \n"
@@ -15,66 +15,66 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8-bit\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr ""
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr ""
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "Dzwonie do "
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr ""
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "Połączenie odwołane."
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
msgid "Missed"
msgstr ""
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "linia"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
"%s\t%s\t"
msgstr ""
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -94,51 +94,55 @@ msgstr ""
msgid "Couldn't find pixmap file: %s"
msgstr "Nie można znaleźć pixmapy: %s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr ""
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr ""
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr ""
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr ""
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr ""
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr ""
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
msgstr ""
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Informacja"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+msgid "Run the audio assistant"
+msgstr ""
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr ""
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -147,76 +151,76 @@ msgid ""
"If you answer no, this person will be temporarily blacklisted."
msgstr ""
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, c-format
msgid ""
"Please enter your password for username %s\n"
" at realm %s:"
msgstr ""
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
#, fuzzy
msgid "Call error"
msgstr "Połączenie odwołane."
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
#, fuzzy
msgid "Call ended"
msgstr "Rozmowa odrzucona."
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr ""
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr ""
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
#, fuzzy
msgid "Decline"
msgstr "linia"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy
msgid "Call paused"
msgstr "Połączenie odwołane."
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "Dzwonie do "
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr ""
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr ""
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr ""
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr ""
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
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:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr ""
@@ -230,7 +234,7 @@ msgstr "Książka adresowa"
msgid "Presence status"
msgstr "Obecność"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Nazwa"
@@ -248,142 +252,142 @@ msgstr ""
msgid "Search in %s directory"
msgstr ""
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, fuzzy, c-format
msgid "Edit contact '%s'"
msgstr "(Brak informacji kontaktowych !)"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr ""
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, c-format
msgid "Delete chat history of '%s'"
msgstr ""
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr ""
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Jakość (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Status"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Min przepustowość (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Parametr"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "Włączone"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Wyłączone"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr ""
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr ""
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr ""
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr ""
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr ""
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr ""
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr ""
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr ""
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr ""
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr ""
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr ""
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr ""
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr ""
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr ""
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr ""
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr ""
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
#, fuzzy
msgid "None"
msgstr "Brak."
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -524,39 +528,39 @@ msgid ""
"Then come back here and press Next button."
msgstr ""
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
msgid "SIP account configuration assistant"
msgstr ""
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr ""
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr ""
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
msgid "Configure your account (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr ""
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr ""
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr ""
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr ""
@@ -565,195 +569,195 @@ msgstr ""
msgid "Call #%i"
msgstr "Połączenie odwołane."
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr ""
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
msgid "Not used"
msgstr ""
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "Połączenie odwołane."
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
msgid "Direct"
msgstr ""
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
msgid "uPnP in progress"
msgstr ""
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
#, fuzzy
msgid "uPnp not available"
msgstr "Brak informacji"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "Połączenie odwołane."
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr ""
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
#, fuzzy
msgid "Calling..."
msgstr "Dzwonie do "
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr ""
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
#, fuzzy
msgid "Incoming call"
msgstr "Dzwonie do "
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr ""
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr ""
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr ""
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr ""
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr ""
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr ""
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr ""
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr ""
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr ""
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
#, fuzzy
msgid "In call"
msgstr "Dzwonie do "
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
#, fuzzy
msgid "Paused call"
msgstr "Dzwonie do "
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr ""
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
#, fuzzy
msgid "Call ended."
msgstr "Rozmowa odrzucona."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr ""
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "Połączenie odwołane."
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr ""
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
msgid "(Paused)"
msgstr ""
@@ -772,6 +776,83 @@ msgstr ""
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Użyj tego urządzenia dźwięku:"
+
+#: ../gtk/audio_assistant.c:327
+#, fuzzy
+msgid "Recorded volume"
+msgstr "Źródło nagrywania:"
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Użyj tego urządzenia dźwięku:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+msgid "Audio Assistant"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+msgid "Audio assistant"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
#, fuzzy
msgid "Callee name"
@@ -817,136 +898,136 @@ msgid "Call quality rating"
msgstr ""
#: ../gtk/main.ui.h:17
-msgid "_Options"
+msgid "All users"
msgstr ""
#: ../gtk/main.ui.h:18
#, fuzzy
-msgid "Set configuration URI"
-msgstr "Informacja"
-
-#: ../gtk/main.ui.h:19
-msgid "Always start video"
-msgstr ""
-
-#: ../gtk/main.ui.h:20
-#, fuzzy
-msgid "Enable self-view"
-msgstr "Włączone"
-
-#: ../gtk/main.ui.h:21
-msgid "_Help"
-msgstr ""
-
-#: ../gtk/main.ui.h:22
-msgid "Show debug window"
-msgstr ""
-
-#: ../gtk/main.ui.h:23
-msgid "_Homepage"
-msgstr ""
-
-#: ../gtk/main.ui.h:24
-msgid "Check _Updates"
-msgstr ""
-
-#: ../gtk/main.ui.h:25
-msgid "Account assistant"
-msgstr ""
-
-#: ../gtk/main.ui.h:26
-#, fuzzy
-msgid "SIP address or phone number:"
-msgstr "Adres serwera rejestracji sip"
-
-#: ../gtk/main.ui.h:27
-msgid "Initiate a new call"
-msgstr ""
-
-#: ../gtk/main.ui.h:28
-#, fuzzy
-msgid "Contacts"
-msgstr "Dzwonie do "
-
-#: ../gtk/main.ui.h:29
-msgid "Search"
-msgstr ""
-
-#: ../gtk/main.ui.h:30
-#, fuzzy
-msgid "Add contacts from directory"
-msgstr "Informacje o kodeku"
-
-#: ../gtk/main.ui.h:31
-#, fuzzy
-msgid "Add contact"
-msgstr "(Brak informacji kontaktowych !)"
-
-#: ../gtk/main.ui.h:32
-#, fuzzy
-msgid "Recent calls"
-msgstr "Dzwonie do "
-
-#: ../gtk/main.ui.h:33
-#, fuzzy
-msgid "My current identity:"
-msgstr "Tożsamość"
-
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
-#, fuzzy
-msgid "Username"
-msgstr "Podręcznik"
-
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
-#, fuzzy
-msgid "Password"
-msgstr "Twoje hasło:"
-
-#: ../gtk/main.ui.h:36
-msgid "Internet connection:"
-msgstr ""
-
-#: ../gtk/main.ui.h:37
-msgid "Automatically log me in"
-msgstr ""
-
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
-msgid "UserID"
-msgstr ""
-
-#: ../gtk/main.ui.h:39
-#, fuzzy
-msgid "Login information"
-msgstr "Informacje o kodeku"
-
-#: ../gtk/main.ui.h:40
-#, fuzzy
-msgid "Welcome !"
-msgstr "Dzwonie do "
-
-#: ../gtk/main.ui.h:41
-msgid "All users"
-msgstr ""
-
-#: ../gtk/main.ui.h:42
-#, fuzzy
msgid "Online users"
msgstr "linia"
-#: ../gtk/main.ui.h:43
+#: ../gtk/main.ui.h:19
msgid "ADSL"
msgstr ""
-#: ../gtk/main.ui.h:44
+#: ../gtk/main.ui.h:20
msgid "Fiber Channel"
msgstr ""
-#: ../gtk/main.ui.h:45
+#: ../gtk/main.ui.h:21
#, fuzzy
msgid "Default"
msgstr "Tożsamość"
+#: ../gtk/main.ui.h:22
+msgid "_Options"
+msgstr ""
+
+#: ../gtk/main.ui.h:23
+#, fuzzy
+msgid "Set configuration URI"
+msgstr "Informacja"
+
+#: ../gtk/main.ui.h:24
+msgid "Always start video"
+msgstr ""
+
+#: ../gtk/main.ui.h:25
+#, fuzzy
+msgid "Enable self-view"
+msgstr "Włączone"
+
+#: ../gtk/main.ui.h:26
+msgid "_Help"
+msgstr ""
+
+#: ../gtk/main.ui.h:27
+msgid "Show debug window"
+msgstr ""
+
+#: ../gtk/main.ui.h:28
+msgid "_Homepage"
+msgstr ""
+
+#: ../gtk/main.ui.h:29
+msgid "Check _Updates"
+msgstr ""
+
+#: ../gtk/main.ui.h:30
+msgid "Account assistant"
+msgstr ""
+
+#: ../gtk/main.ui.h:32
+#, fuzzy
+msgid "SIP address or phone number:"
+msgstr "Adres serwera rejestracji sip"
+
+#: ../gtk/main.ui.h:33
+msgid "Initiate a new call"
+msgstr ""
+
+#: ../gtk/main.ui.h:34
+#, fuzzy
+msgid "Contacts"
+msgstr "Dzwonie do "
+
+#: ../gtk/main.ui.h:35
+msgid "Search"
+msgstr ""
+
+#: ../gtk/main.ui.h:36
+#, fuzzy
+msgid "Add contacts from directory"
+msgstr "Informacje o kodeku"
+
+#: ../gtk/main.ui.h:37
+#, fuzzy
+msgid "Add contact"
+msgstr "(Brak informacji kontaktowych !)"
+
+#: ../gtk/main.ui.h:38
+#, fuzzy
+msgid "Recent calls"
+msgstr "Dzwonie do "
+
+#: ../gtk/main.ui.h:39
+#, fuzzy
+msgid "My current identity:"
+msgstr "Tożsamość"
+
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
+#, fuzzy
+msgid "Username"
+msgstr "Podręcznik"
+
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
+#, fuzzy
+msgid "Password"
+msgstr "Twoje hasło:"
+
+#: ../gtk/main.ui.h:42
+msgid "Internet connection:"
+msgstr ""
+
+#: ../gtk/main.ui.h:43
+msgid "Automatically log me in"
+msgstr ""
+
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
+msgid "UserID"
+msgstr ""
+
+#: ../gtk/main.ui.h:45
+#, fuzzy
+msgid "Login information"
+msgstr "Informacje o kodeku"
+
#: ../gtk/main.ui.h:46
+#, fuzzy
+msgid "Welcome !"
+msgstr "Dzwonie do "
+
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1062,24 +1143,33 @@ msgid "Contact params (optional):"
msgstr ""
#: ../gtk/sip_account.ui.h:9
-msgid "Route (optional):"
+msgid "AVPF regular RTCP interval (sec):"
msgstr ""
#: ../gtk/sip_account.ui.h:10
+msgid "Route (optional):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Dzwonie do "
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr ""
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
#, fuzzy
msgid "Publish presence information"
msgstr "Informacje o kodeku"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Włączony"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr ""
@@ -1533,6 +1623,10 @@ msgid "Video resolution sent"
msgstr ""
#: ../gtk/call_statistics.ui.h:11
+msgid "RTP profile"
+msgstr ""
+
+#: ../gtk/call_statistics.ui.h:12
#, fuzzy
msgid "Call statistics and information"
msgstr "Informacje o kodeku"
@@ -1739,19 +1833,19 @@ msgstr "Lącze"
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr ""
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr ""
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr ""
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1761,82 +1855,82 @@ msgid ""
"Duration: %i mn %i sec\n"
msgstr ""
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr ""
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
#, fuzzy
msgid "Ready"
msgstr "Gotowy."
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Informacja"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr ""
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr ""
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
#, fuzzy
msgid "Contacting"
msgstr "Dzwonie do "
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
#, fuzzy
msgid "Could not call"
msgstr "Nie można znaleźć pixmapy: %s"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr ""
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
#, fuzzy
msgid "is contacting you"
msgstr "dzwoni do Ciebie."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr ""
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr ""
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr ""
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Połączony"
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
#, fuzzy
msgid "Call aborted"
msgstr "Połączenie odwołane."
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr ""
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr ""
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr ""
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1897,147 +1991,143 @@ msgstr "Informacja"
msgid "Unknown-bug"
msgstr ""
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
msgstr ""
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
msgstr ""
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, fuzzy, c-format
msgid "Could not login as %s"
msgstr "Nie można znaleźć pixmapy: %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
#, fuzzy
msgid "Remote ringing."
msgstr "Rejestruje..."
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
#, fuzzy
msgid "Remote ringing..."
msgstr "Rejestruje..."
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr ""
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr ""
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr ""
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
#, fuzzy
msgid "Call resumed."
msgstr "Rozmowa odrzucona."
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, fuzzy, c-format
msgid "Call answered by %s."
msgstr ""
"Zadzwoń lub\n"
"Odpowiedz"
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr ""
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr ""
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
#, fuzzy
msgid "Call terminated."
msgstr "Rozmowa odrzucona."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "Osoba jest zajęta."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "Osoba jest tymczasowo niedostępna."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "Osoba nie chce, aby jej przeszkadzać."
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Rozmowa odrzucona."
-#: ../coreapi/callbacks.c:603
-msgid "No response."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr ""
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr ""
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr ""
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
#, fuzzy
msgid "Call failed."
msgstr "Połączenie odwołane."
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, fuzzy, c-format
msgid "Registration on %s successful."
msgstr "Rejestracja powiodła się."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, fuzzy, c-format
msgid "Unregistration on %s done."
msgstr "Rejestracja powiodła się."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr ""
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, fuzzy, c-format
msgid "Registration on %s failed: %s"
msgstr "Rejestracja powiodła się."
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, fuzzy, c-format
msgid "Authentication token is %s"
msgstr "Informacje o kodeku"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
@@ -2236,9 +2326,6 @@ msgstr[1] ""
#~ msgid "micro"
#~ msgstr "mikrofon"
-#~ msgid "Recording source:"
-#~ msgstr "Źródło nagrywania:"
-
#~ msgid "Run sip user agent on port:"
#~ msgstr "Uruchom agenta sip na porcie:"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index de51d73d7..21b309da3 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: linphone-1.1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2006-07-11 23:30+0200\n"
"Last-Translator: Rafael Caesar Lenzi \n"
"Language-Team: pt_BR \n"
@@ -17,67 +17,67 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, fuzzy, c-format
msgid "Call %s"
msgstr "Histórico de chamadas"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr ""
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "Contatando "
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr ""
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "Abortado"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
#, fuzzy
msgid "Missed"
msgstr "Perdido"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "linha"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
"%s\t%s\t"
msgstr ""
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -97,51 +97,55 @@ msgstr ""
msgid "Couldn't find pixmap file: %s"
msgstr "Não é possível achar arquivo pixmap: %s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr ""
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr ""
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr ""
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr ""
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr ""
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr ""
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
msgstr ""
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Informações"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+msgid "Run the audio assistant"
+msgstr ""
+
+#: ../gtk/main.c:590
#, fuzzy, c-format
msgid "Call with %s"
msgstr "Bate-papo com %s"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -150,76 +154,76 @@ msgid ""
"If you answer no, this person will be temporarily blacklisted."
msgstr ""
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, c-format
msgid ""
"Please enter your password for username %s\n"
" at realm %s:"
msgstr ""
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
#, fuzzy
msgid "Call error"
msgstr "Linphone - Histórico de chamadas"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
#, fuzzy
msgid "Call ended"
msgstr "Chamada cancelada."
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Camadas recebidas"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr ""
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
#, fuzzy
msgid "Decline"
msgstr "linha"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy
msgid "Call paused"
msgstr "Abortado"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "Contatando "
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr ""
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr ""
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr ""
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr ""
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
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:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr ""
@@ -232,7 +236,7 @@ msgstr "Catálogo de endereços"
msgid "Presence status"
msgstr "Status de presença"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Nome"
@@ -251,142 +255,142 @@ msgstr "Sala de bate-papo"
msgid "Search in %s directory"
msgstr ""
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, fuzzy, c-format
msgid "Edit contact '%s'"
msgstr "Edicar informação de contato"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr ""
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, c-format
msgid "Delete chat history of '%s'"
msgstr ""
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr ""
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Taxa (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr ""
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Bitrate mínimo (kbits/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Parâmetros"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "Ativado"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Desativado"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
#, fuzzy
msgid "Account"
msgstr "Aceitar"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr ""
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr ""
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr ""
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr ""
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr ""
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr ""
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr ""
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr ""
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr ""
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr ""
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr ""
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr ""
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr ""
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr ""
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr ""
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr "Nenhum"
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -527,39 +531,39 @@ msgid ""
"Then come back here and press Next button."
msgstr ""
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
msgid "SIP account configuration assistant"
msgstr ""
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr ""
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr ""
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
msgid "Configure your account (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr ""
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr ""
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr ""
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr ""
@@ -568,196 +572,196 @@ msgstr ""
msgid "Call #%i"
msgstr "Histórico de chamadas"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr ""
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
msgid "Not used"
msgstr ""
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "Histórico de chamadas"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
#, fuzzy
msgid "Direct"
msgstr "Redirecionado para %s..."
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
msgid "uPnP in progress"
msgstr ""
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
#, fuzzy
msgid "uPnp not available"
msgstr "Informações não disponíveis"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "Histórico de chamadas"
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr ""
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
#, fuzzy
msgid "Calling..."
msgstr "Contatando "
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr ""
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
#, fuzzy
msgid "Incoming call"
msgstr "Camadas recebidas"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr ""
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr ""
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr ""
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr ""
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr ""
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr ""
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr ""
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr ""
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr ""
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
#, fuzzy
msgid "In call"
msgstr "Contatando "
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
#, fuzzy
msgid "Paused call"
msgstr "Contatando "
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr ""
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
#, fuzzy
msgid "Call ended."
msgstr "Chamada cancelada."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr ""
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "Histórico de chamadas"
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr ""
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
msgid "(Paused)"
msgstr ""
@@ -776,6 +780,83 @@ msgstr "Camadas recebidas"
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Dispositivo de captura de som:"
+
+#: ../gtk/audio_assistant.c:327
+#, fuzzy
+msgid "Recorded volume"
+msgstr "Origem de gravação:"
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Dispositivo de som:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+msgid "Audio Assistant"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+msgid "Audio assistant"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
#, fuzzy
msgid "Callee name"
@@ -821,136 +902,136 @@ msgid "Call quality rating"
msgstr ""
#: ../gtk/main.ui.h:17
-msgid "_Options"
+msgid "All users"
msgstr ""
#: ../gtk/main.ui.h:18
#, fuzzy
-msgid "Set configuration URI"
-msgstr "Configuração de proxy/registrador"
-
-#: ../gtk/main.ui.h:19
-msgid "Always start video"
-msgstr ""
-
-#: ../gtk/main.ui.h:20
-#, fuzzy
-msgid "Enable self-view"
-msgstr "Ativado"
-
-#: ../gtk/main.ui.h:21
-msgid "_Help"
-msgstr ""
-
-#: ../gtk/main.ui.h:22
-msgid "Show debug window"
-msgstr ""
-
-#: ../gtk/main.ui.h:23
-msgid "_Homepage"
-msgstr ""
-
-#: ../gtk/main.ui.h:24
-msgid "Check _Updates"
-msgstr ""
-
-#: ../gtk/main.ui.h:25
-msgid "Account assistant"
-msgstr ""
-
-#: ../gtk/main.ui.h:26
-msgid "SIP address or phone number:"
-msgstr ""
-
-#: ../gtk/main.ui.h:27
-msgid "Initiate a new call"
-msgstr ""
-
-#: ../gtk/main.ui.h:28
-#, fuzzy
-msgid "Contacts"
-msgstr "Contatando "
-
-#: ../gtk/main.ui.h:29
-msgid "Search"
-msgstr ""
-
-#: ../gtk/main.ui.h:30
-#, fuzzy
-msgid "Add contacts from directory"
-msgstr "Informação de contato"
-
-#: ../gtk/main.ui.h:31
-#, fuzzy
-msgid "Add contact"
-msgstr "Edicar informação de contato"
-
-#: ../gtk/main.ui.h:32
-#, fuzzy
-msgid "Recent calls"
-msgstr "Camadas recebidas"
-
-#: ../gtk/main.ui.h:33
-#, fuzzy
-msgid "My current identity:"
-msgstr "Identificação SIP:"
-
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
-#, fuzzy
-msgid "Username"
-msgstr "Usuário"
-
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
-#, fuzzy
-msgid "Password"
-msgstr "Senha:"
-
-#: ../gtk/main.ui.h:36
-msgid "Internet connection:"
-msgstr ""
-
-#: ../gtk/main.ui.h:37
-#, fuzzy
-msgid "Automatically log me in"
-msgstr "Adquirir automaticamente um nome de servidor válido."
-
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
-msgid "UserID"
-msgstr ""
-
-#: ../gtk/main.ui.h:39
-#, fuzzy
-msgid "Login information"
-msgstr "Informação de contato"
-
-#: ../gtk/main.ui.h:40
-#, fuzzy
-msgid "Welcome !"
-msgstr "Contatando "
-
-#: ../gtk/main.ui.h:41
-msgid "All users"
-msgstr ""
-
-#: ../gtk/main.ui.h:42
-#, fuzzy
msgid "Online users"
msgstr "linha"
-#: ../gtk/main.ui.h:43
+#: ../gtk/main.ui.h:19
msgid "ADSL"
msgstr ""
-#: ../gtk/main.ui.h:44
+#: ../gtk/main.ui.h:20
msgid "Fiber Channel"
msgstr ""
-#: ../gtk/main.ui.h:45
+#: ../gtk/main.ui.h:21
#, fuzzy
msgid "Default"
msgstr "Identificação SIP:"
+#: ../gtk/main.ui.h:22
+msgid "_Options"
+msgstr ""
+
+#: ../gtk/main.ui.h:23
+#, fuzzy
+msgid "Set configuration URI"
+msgstr "Configuração de proxy/registrador"
+
+#: ../gtk/main.ui.h:24
+msgid "Always start video"
+msgstr ""
+
+#: ../gtk/main.ui.h:25
+#, fuzzy
+msgid "Enable self-view"
+msgstr "Ativado"
+
+#: ../gtk/main.ui.h:26
+msgid "_Help"
+msgstr ""
+
+#: ../gtk/main.ui.h:27
+msgid "Show debug window"
+msgstr ""
+
+#: ../gtk/main.ui.h:28
+msgid "_Homepage"
+msgstr ""
+
+#: ../gtk/main.ui.h:29
+msgid "Check _Updates"
+msgstr ""
+
+#: ../gtk/main.ui.h:30
+msgid "Account assistant"
+msgstr ""
+
+#: ../gtk/main.ui.h:32
+msgid "SIP address or phone number:"
+msgstr ""
+
+#: ../gtk/main.ui.h:33
+msgid "Initiate a new call"
+msgstr ""
+
+#: ../gtk/main.ui.h:34
+#, fuzzy
+msgid "Contacts"
+msgstr "Contatando "
+
+#: ../gtk/main.ui.h:35
+msgid "Search"
+msgstr ""
+
+#: ../gtk/main.ui.h:36
+#, fuzzy
+msgid "Add contacts from directory"
+msgstr "Informação de contato"
+
+#: ../gtk/main.ui.h:37
+#, fuzzy
+msgid "Add contact"
+msgstr "Edicar informação de contato"
+
+#: ../gtk/main.ui.h:38
+#, fuzzy
+msgid "Recent calls"
+msgstr "Camadas recebidas"
+
+#: ../gtk/main.ui.h:39
+#, fuzzy
+msgid "My current identity:"
+msgstr "Identificação SIP:"
+
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
+#, fuzzy
+msgid "Username"
+msgstr "Usuário"
+
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
+#, fuzzy
+msgid "Password"
+msgstr "Senha:"
+
+#: ../gtk/main.ui.h:42
+msgid "Internet connection:"
+msgstr ""
+
+#: ../gtk/main.ui.h:43
+#, fuzzy
+msgid "Automatically log me in"
+msgstr "Adquirir automaticamente um nome de servidor válido."
+
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
+msgid "UserID"
+msgstr ""
+
+#: ../gtk/main.ui.h:45
+#, fuzzy
+msgid "Login information"
+msgstr "Informação de contato"
+
#: ../gtk/main.ui.h:46
+#, fuzzy
+msgid "Welcome !"
+msgstr "Contatando "
+
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1068,24 +1149,33 @@ msgid "Contact params (optional):"
msgstr "Rota (opcional):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Rota (opcional):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Contatando "
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr ""
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
#, fuzzy
msgid "Publish presence information"
msgstr "Informar informação de presença"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Ativado"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr ""
@@ -1539,6 +1629,10 @@ msgid "Video resolution sent"
msgstr ""
#: ../gtk/call_statistics.ui.h:11
+msgid "RTP profile"
+msgstr ""
+
+#: ../gtk/call_statistics.ui.h:12
#, fuzzy
msgid "Call statistics and information"
msgstr "Informação de contato"
@@ -1745,19 +1839,19 @@ msgstr "Contatando "
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "Abortado"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "Competado"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "Perdido"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, fuzzy, c-format
msgid ""
"%s at %s\n"
@@ -1771,82 +1865,82 @@ msgstr ""
"Status: %s\n"
"Duração: %i min %i seg\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Chamadas efetuadas"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
#, fuzzy
msgid "Ready"
msgstr "Pronto."
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Informações"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Procurando por telefone de destino..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
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:2609
+#: ../coreapi/linphonecore.c:2695
#, fuzzy
msgid "Contacting"
msgstr "Contatando "
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
#, fuzzy
msgid "Could not call"
msgstr "Não é possível achar arquivo pixmap: %s"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr ""
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
#, fuzzy
msgid "is contacting you"
msgstr "está chamado você."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr ""
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr ""
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr ""
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Conectado."
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
#, fuzzy
msgid "Call aborted"
msgstr "Abortado"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr ""
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr ""
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr ""
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1905,147 +1999,143 @@ msgstr "Informações"
msgid "Unknown-bug"
msgstr ""
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
msgstr ""
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
msgstr ""
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, fuzzy, c-format
msgid "Could not login as %s"
msgstr "Não é possível achar arquivo pixmap: %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
#, fuzzy
msgid "Remote ringing."
msgstr "Serviços remotos"
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
#, fuzzy
msgid "Remote ringing..."
msgstr "Serviços remotos"
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr ""
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, fuzzy, c-format
msgid "Call with %s is paused."
msgstr "Bate-papo com %s"
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr ""
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
#, fuzzy
msgid "Call resumed."
msgstr "Chamada cancelada."
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, fuzzy, c-format
msgid "Call answered by %s."
msgstr ""
"Ligar ou\n"
"atender"
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr ""
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr ""
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr ""
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "Usuário está ocupado."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "Usuário está temporáriamente indisponível."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr ""
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr ""
-#: ../coreapi/callbacks.c:603
-msgid "No response."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr ""
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
#, fuzzy
msgid "Redirected"
msgstr "Redirecionado para %s..."
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr ""
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
#, fuzzy
msgid "Call failed."
msgstr "Histórico de chamadas"
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, fuzzy, c-format
msgid "Registration on %s successful."
msgstr "Registro em %s efetuado."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, fuzzy, c-format
msgid "Unregistration on %s done."
msgstr "Registro em %s efetuado."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr ""
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, fuzzy, c-format
msgid "Registration on %s failed: %s"
msgstr "Registro falhou (tempo esgotado)."
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, fuzzy, c-format
msgid "Authentication token is %s"
msgstr "Informações de autenticação"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, fuzzy, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
@@ -2254,9 +2344,6 @@ msgstr[1] "Você perdeu %i ligação(ões)."
#~ msgid "micro"
#~ msgstr "microfone"
-#~ msgid "Recording source:"
-#~ msgstr "Origem de gravação:"
-
#~ msgid "Listen"
#~ msgstr "Escutar"
diff --git a/po/ru.po b/po/ru.po
index cd4da5d08..d2a440a31 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: linphone 0.7.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2010-01-22 18:43+0300\n"
"Last-Translator: Maxim Prokopyev \n"
"Language-Team: Russian \n"
@@ -17,41 +17,41 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "Набрать %s"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "Послать текст к %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "Соединен с"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr "н/д"
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "отмененный"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
#, fuzzy
msgid "Missed"
msgstr "пропущенный"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "Отклонить"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
@@ -59,7 +59,7 @@ msgstr[0] "%i минута"
msgstr[1] "%i минуты"
msgstr[2] "%i минут"
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
@@ -67,14 +67,14 @@ msgstr[0] "%i секунда"
msgstr[1] "%i секунды"
msgstr[2] "%i секунд"
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, fuzzy, c-format
msgid "%s\t%s"
msgstr ""
"%s\t%s\tКачество: %s\n"
"%s\t%s %s\t"
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, fuzzy, c-format
msgid ""
"%s\tQuality: %s\n"
@@ -83,7 +83,7 @@ msgstr ""
"%s\t%s\tКачество: %s\n"
"%s\t%s %s\t"
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, fuzzy, c-format
msgid ""
"%s\t\n"
@@ -105,37 +105,37 @@ msgstr "Я"
msgid "Couldn't find pixmap file: %s"
msgstr "Невозможно найти графический файл: %s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "Неверный sip-контакт!"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr ""
"Вывод некоторой отладочной информации на устройство стандартного вывода во "
"время работы"
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr "путь к файлу для записи журнала работы."
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr "Запускать только в системном лотке, не показывая главное окно"
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr "адрес для звонка"
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr "автоматически принимать входящие вызовы, если включено"
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
@@ -143,17 +143,22 @@ msgstr ""
"Укажите рабочий каталог (должен содержать установленные файлы приложения, "
"например: c:\\Program Files\\Linphone)"
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Подтверждение"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "Помощник настройки учётной записи"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "Чат с %s"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -166,7 +171,7 @@ msgstr ""
"его(её) в свой контактный лист?\n"
"Если вы ответите Нет, этот человек будет временно заблокирован."
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
@@ -175,59 +180,59 @@ msgstr ""
"Пожалуйста, введите пароль для пользователя %s\n"
" в домене %s:"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
msgid "Call error"
msgstr "Ошибка вызова"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "Разговор окончен"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Входящий вызов"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr "Ответить"
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "Отклонить"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
msgid "Call paused"
msgstr "Вызов приостановлен"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "Порты"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "Ссылка на сайт"
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Linphone - видео-телефон для интернета"
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (По умолчанию)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr "Мы переведены на %s"
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
msgid ""
"No sound cards have been detected on this computer.\n"
"You won't be able to send or receive audio calls."
@@ -235,7 +240,7 @@ msgstr ""
"На этом компьютере не обнаружено ни одной звуковой карты.\n"
"Вы не сможете совершать или принимать аудио-вызовы."
-#: ../gtk/main.c:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "Свободный SIP видео-телефон"
@@ -247,7 +252,7 @@ msgstr "Добавить в адресную книгу"
msgid "Presence status"
msgstr "Статус присутствия"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Имя"
@@ -265,143 +270,143 @@ msgstr "Комната чата"
msgid "Search in %s directory"
msgstr "Поиск в директории %s"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "Редактировать контакт '%s'"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "Удалить контакт '%s'"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, fuzzy, c-format
msgid "Delete chat history of '%s'"
msgstr "Удалить контакт '%s'"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "Добавить новый контакт из директории '%s'"
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Частота (Гц)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Статус"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Минимальный битрейт (кбит/с)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Параметры"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "Включен"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Отключен"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "Учетная запись"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "Английский"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "Французский"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "Шведский"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "Итальянский"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "Испанский"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "Бразильский португальский"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "Польский"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "Немецкий"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "Русский"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "Японский"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "Нидерландский"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "Венгерский"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "Чешский"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "Китайский"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr "Традиционный китайский"
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr "Норвежский"
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr ""
"Вы должны перезапустить Linphone для того, чтобы языковые настройки вступили "
"в силу."
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr "Нет"
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr "SRTP"
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr "ZRTP"
@@ -546,40 +551,40 @@ msgstr ""
"только что выслали вам на электронную почту.\n"
"Затем вернитесь и нажмите на кнопку Далее."
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "Помощник настройки учётной записи"
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "Добро пожаловать в помощник настройки учётной записи"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "Помощник настройки учётной записи"
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
msgid "Configure your account (step 1/1)"
msgstr "Настройте свою учётную запись (шаг 1/1)"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr "Введите ваше имя пользователя SIP (шаг 1/1)"
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr "Введи информация об учётной записи (шаг 1/2)"
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr "Проверка (шаг 2/2)"
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr "Ошибка"
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr "Завершение"
@@ -588,194 +593,194 @@ msgstr "Завершение"
msgid "Call #%i"
msgstr "Вызов #%i"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr "Перевести на #%i с %s"
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
#, fuzzy
msgid "Not used"
msgstr "Не найден"
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "ICE фильтр"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
#, fuzzy
msgid "Direct"
msgstr "Переадресован"
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
#, fuzzy
msgid "uPnP in progress"
msgstr "Идет поиск Stun..."
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
#, fuzzy
msgid "uPnp not available"
msgstr "недоступно"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "ICE фильтр"
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, fuzzy, c-format
msgid "%.3f seconds"
msgstr "%i секунда"
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
msgid "Calling..."
msgstr "Вызов..."
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr "00::00::00"
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
msgid "Incoming call"
msgstr "Входящий вызов"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr "хорошее"
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr "среднее"
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr "плохое"
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr "очень плохое"
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr "слишком плохое"
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr "недоступно"
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr "Защищено SRTP"
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr "Защищено ZRTP - [токен: %s]"
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr "Не проверен"
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr "Проверен"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr "В конференции"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In call"
msgstr "Соединен с"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
msgid "Paused call"
msgstr "Приостановленный вызов"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr "%02i::%02i::%02i"
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "Звонок закончен."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
#, fuzzy
msgid "Transfer done."
msgstr "Перевести"
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "Перевести"
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr "Продолжить"
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr "Пауза"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, fuzzy
msgid "(Paused)"
msgstr "Пауза"
@@ -795,6 +800,88 @@ msgstr "Входящий звонок от %s"
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"Добро пожаловать!\n"
+"Этот помощник поможет вам использовать учётную запись SIP для ваших звонков."
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Устройство захвата:"
+
+#: ../gtk/audio_assistant.c:327
+#, fuzzy
+msgid "Recorded volume"
+msgstr "Источник записи:"
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Устройство воспроизведения:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "Помощник"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "Помощник настройки учётной записи"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
msgid "Callee name"
msgstr "Имя вызываемого абонента"
@@ -837,123 +924,123 @@ msgid "Call quality rating"
msgstr "Уровень качества звонка"
#: ../gtk/main.ui.h:17
+msgid "All users"
+msgstr "Все пользователи"
+
+#: ../gtk/main.ui.h:18
+msgid "Online users"
+msgstr "Пользователи в сети"
+
+#: ../gtk/main.ui.h:19
+msgid "ADSL"
+msgstr "ADSL"
+
+#: ../gtk/main.ui.h:20
+msgid "Fiber Channel"
+msgstr "Оптоволокно"
+
+#: ../gtk/main.ui.h:21
+msgid "Default"
+msgstr "По умолчанию"
+
+#: ../gtk/main.ui.h:22
msgid "_Options"
msgstr "_Настройки"
-#: ../gtk/main.ui.h:18
+#: ../gtk/main.ui.h:23
#, fuzzy
msgid "Set configuration URI"
msgstr "Прокси/Регистратор конфигуратор"
-#: ../gtk/main.ui.h:19
+#: ../gtk/main.ui.h:24
msgid "Always start video"
msgstr ""
-#: ../gtk/main.ui.h:20
+#: ../gtk/main.ui.h:25
msgid "Enable self-view"
msgstr "Включить своё видео"
-#: ../gtk/main.ui.h:21
+#: ../gtk/main.ui.h:26
msgid "_Help"
msgstr "_Помощь"
-#: ../gtk/main.ui.h:22
+#: ../gtk/main.ui.h:27
msgid "Show debug window"
msgstr "Показать окно отладки"
-#: ../gtk/main.ui.h:23
+#: ../gtk/main.ui.h:28
msgid "_Homepage"
msgstr "_Домашняя страница"
-#: ../gtk/main.ui.h:24
+#: ../gtk/main.ui.h:29
msgid "Check _Updates"
msgstr "Проверить _Обновления"
-#: ../gtk/main.ui.h:25
+#: ../gtk/main.ui.h:30
msgid "Account assistant"
msgstr "Помощник настройки учётной записи"
-#: ../gtk/main.ui.h:26
+#: ../gtk/main.ui.h:32
msgid "SIP address or phone number:"
msgstr "SIP-адрес или номер телефона:"
-#: ../gtk/main.ui.h:27
+#: ../gtk/main.ui.h:33
msgid "Initiate a new call"
msgstr "Совершить новый вызов"
-#: ../gtk/main.ui.h:28
+#: ../gtk/main.ui.h:34
msgid "Contacts"
msgstr "Контакты"
-#: ../gtk/main.ui.h:29
+#: ../gtk/main.ui.h:35
msgid "Search"
msgstr "Поиск"
-#: ../gtk/main.ui.h:30
+#: ../gtk/main.ui.h:36
msgid "Add contacts from directory"
msgstr "Добавить контакты из директории"
-#: ../gtk/main.ui.h:31
+#: ../gtk/main.ui.h:37
msgid "Add contact"
msgstr "Добавить контакт"
-#: ../gtk/main.ui.h:32
+#: ../gtk/main.ui.h:38
msgid "Recent calls"
msgstr "Недавние вызовы"
-#: ../gtk/main.ui.h:33
+#: ../gtk/main.ui.h:39
msgid "My current identity:"
msgstr "Мой текущий идентификатор:"
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
msgid "Username"
msgstr "Имя пользователя"
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
msgid "Password"
msgstr "Пароль"
-#: ../gtk/main.ui.h:36
+#: ../gtk/main.ui.h:42
msgid "Internet connection:"
msgstr "Интернет-соединение:"
-#: ../gtk/main.ui.h:37
+#: ../gtk/main.ui.h:43
msgid "Automatically log me in"
msgstr "Входить автоматически"
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
msgid "UserID"
msgstr "UserID"
-#: ../gtk/main.ui.h:39
+#: ../gtk/main.ui.h:45
msgid "Login information"
msgstr "Информация для входа"
-#: ../gtk/main.ui.h:40
+#: ../gtk/main.ui.h:46
msgid "Welcome !"
msgstr "Добро пожаловать!"
-#: ../gtk/main.ui.h:41
-msgid "All users"
-msgstr "Все пользователи"
-
-#: ../gtk/main.ui.h:42
-msgid "Online users"
-msgstr "Пользователи в сети"
-
-#: ../gtk/main.ui.h:43
-msgid "ADSL"
-msgstr "ADSL"
-
-#: ../gtk/main.ui.h:44
-msgid "Fiber Channel"
-msgstr "Оптоволокно"
-
-#: ../gtk/main.ui.h:45
-msgid "Default"
-msgstr "По умолчанию"
-
-#: ../gtk/main.ui.h:46
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1076,23 +1163,32 @@ msgid "Contact params (optional):"
msgstr "Маршрут (необязательно):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Маршрут (необязательно):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Транспорт"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr "Зарегистрироваться"
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "Опубликовывать статус присутствия"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Включить"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "Настроить учётную запись SIP"
@@ -1531,6 +1627,11 @@ msgstr "Предпочтительное разрешение видео:"
#: ../gtk/call_statistics.ui.h:11
#, fuzzy
+msgid "RTP profile"
+msgstr "RTP свойства"
+
+#: ../gtk/call_statistics.ui.h:12
+#, fuzzy
msgid "Call statistics and information"
msgstr "Контактная информация"
@@ -1738,19 +1839,19 @@ msgstr "Подключение..."
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "отмененный"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "завершённый"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "пропущенный"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1765,77 +1866,77 @@ msgstr ""
"Статус: %s\n"
"Длительность: %i мин %i сек\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Исходящий звонок"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "Готов"
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Подтверждение"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Поиск адреса для телефонного номера..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "Не могу найти этот номер."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "Соединение"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
msgid "Could not call"
msgstr "Не удалось позвонить"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr "Извините, мы превысили максимальное количество одновременных вызовов"
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
msgid "is contacting you"
msgstr "пытается связаться с вами"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr " и ответил автоответчик."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr "."
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr "Изменение параметров вызова..."
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Соединён."
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
msgid "Call aborted"
msgstr "Вызов отменён"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr "Не удалось приостановить вызов"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr "Приостановление текущего вызова..."
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "Идет поиск Stun..."
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1892,7 +1993,7 @@ msgstr "Продолжительность"
msgid "Unknown-bug"
msgstr "Неизвестная ошибка"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
@@ -1900,7 +2001,7 @@ msgstr ""
"Введеный адрес SIP-прокси является недействительным, он должен выглядеть как "
"\"sip:имя_хоста\""
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1909,132 +2010,128 @@ msgstr ""
"Они должны выглядеть как sip:username@proxydomain, например such as sip:"
"alice@example.net"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "Невозможно зайти как %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr "Абонент вызывается."
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
msgid "Remote ringing..."
msgstr "Абонент вызывается..."
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr "Гудки."
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr "Вызов %s приостановлен."
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr "Вызов отвечен %s - в ожидании."
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
msgid "Call resumed."
msgstr "Разговор продолжен."
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr "Вызов отвечен %s."
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
#, fuzzy
msgid "Incompatible, check codecs or security settings..."
msgstr "Несовместимо, проверьте кодеки..."
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
#, fuzzy
msgid "We have been resumed."
msgstr "Наш вызов продолжен..."
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
#, fuzzy
msgid "Call is updated by remote."
msgstr "Вызов обновлён вызываемым абонентом..."
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "Звонок прерван."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "Пользователь занят."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "Пользователь временно недоступен."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "Абонент не хочет отвечать."
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Звонок отклонён."
-#: ../coreapi/callbacks.c:603
-msgid "No response."
-msgstr "Нет ответа."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
+msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr "Ошибка протокола."
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr "Переадресован"
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
#, fuzzy
msgid "Incompatible media parameters."
msgstr "Несовместимо, проверьте кодеки..."
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
msgid "Call failed."
msgstr "Не удалось совершить вызов."
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "Регистрация на %s прошла успешно."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "Отмена регистрации на %s завершена."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "время ожидания истекло"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "Регистрация на %s не удалась: %s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, c-format
msgid "Authentication token is %s"
msgstr "Аутентификационный токен: %s"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
@@ -2042,6 +2139,12 @@ msgstr[0] "У вас пропущен %i звонок."
msgstr[1] "У вас пропущено %i звонка."
msgstr[2] "У вас пропущено %i звонков."
+#~ msgid "No response."
+#~ msgstr "Нет ответа."
+
+#~ msgid "Protocol error."
+#~ msgstr "Ошибка протокола."
+
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
#~ "user@domain"
@@ -2271,9 +2374,6 @@ msgstr[2] "У вас пропущено %i звонков."
#~ "Ваш компьютер подключен по IPv6. Linphone по умолчанию использует IPv4. "
#~ "Пожалуйста, обновите настройки если хотите использовать IPv6."
-#~ msgid "Assistant"
-#~ msgstr "Помощник"
-
#, fuzzy
#~ msgid "Show debug messages"
#~ msgstr "Показать окно ошибок"
@@ -2602,9 +2702,6 @@ msgstr[2] "У вас пропущено %i звонков."
#~ msgid "RTP port used for audio:"
#~ msgstr "RTP порт для аудио:"
-#~ msgid "RTP properties"
-#~ msgstr "RTP свойства"
-
#~ msgid "Use SIP INFO message instead of RTP rfc2833 for DTMF transmitting"
#~ msgstr ""
#~ "Используйте SIP INFO сообщения вместо RTP rfc2833 для DTMF препровождения"
@@ -2618,9 +2715,6 @@ msgstr[2] "У вас пропущено %i звонков."
#~ msgid "micro"
#~ msgstr "Микрофон"
-#~ msgid "Recording source:"
-#~ msgstr "Источник записи:"
-
#~ msgid "Enable echo-canceler (cancels the echo heard by the remote party)"
#~ msgstr ""
#~ "Включить подавление эхо (подавляет эхо слышимое с удалённого устройства)"
diff --git a/po/sr.po b/po/sr.po
index 46e362a45..ed088ef14 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: linphone 0.7.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2013-02-11 19:03+0200\n"
"Last-Translator: Мирослав Николић \n"
"Language-Team: Serbian \n"
@@ -16,41 +16,41 @@ msgstr ""
"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n"
"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "Позови „%s“"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "Пошаљи текст за %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "У позиву"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr "н/д"
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "прекинути"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
#, fuzzy
msgid "Missed"
msgstr "пропуштени"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "Одбиј"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
@@ -59,7 +59,7 @@ msgstr[1] "%i минута"
msgstr[2] "%i минута"
msgstr[3] "Један минут"
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
@@ -68,14 +68,14 @@ msgstr[1] "%i секунде"
msgstr[2] "%i секунде"
msgstr[3] "Једна секунда"
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, fuzzy, c-format
msgid "%s\t%s"
msgstr ""
"%s\t%s\tКвалитет: %s\n"
"%s\t%s %s\t"
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, fuzzy, c-format
msgid ""
"%s\tQuality: %s\n"
@@ -84,7 +84,7 @@ msgstr ""
"%s\t%s\tКвалитет: %s\n"
"%s\t%s %s\t"
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, fuzzy, c-format
msgid ""
"%s\t\n"
@@ -106,35 +106,35 @@ msgstr "Ја"
msgid "Couldn't find pixmap file: %s"
msgstr "Не могу да пронађем датотеку сличице: %s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "Неисправан сип контакт !"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr "бележи у стандардни излаз неке податке за уклањање грешака док ради."
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr "путања до датотеке за уписивање бележака."
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr "Покреће се само у системској фиоци, не приказује главно сучеље."
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr "адреса за позивање управо сада"
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr "ако је подешено сам ће се јављати на долазне позиве"
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
@@ -142,17 +142,22 @@ msgstr ""
"Наводи радни директоријум (треба да буде основа инсталације, нпр: c:"
"\\Program Files\\Linphone)"
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Потврђујем"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "Помоћник подешавања налога"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "Позив са корисником %s"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -165,7 +170,7 @@ msgstr ""
"на ваш списак пријатеља ?\n"
"Ако одговорите са не, ова особа ће привремено бити стављена на црни списак."
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
@@ -174,59 +179,59 @@ msgstr ""
"Унесите вашу лозинку за корисничко име %s\n"
" на домену %s:"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
msgid "Call error"
msgstr "Грешка позива"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "Позив је завршен"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Долазни позив"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr "Јави се"
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "Одбиј"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
msgid "Call paused"
msgstr "Позив је заустављен"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "Кодеци"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "Веза веб сајта"
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Линфон — интернет телефон са снимком"
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (основно)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr "Преселили смо се на %s"
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
msgid ""
"No sound cards have been detected on this computer.\n"
"You won't be able to send or receive audio calls."
@@ -234,7 +239,7 @@ msgstr ""
"Ниједна звучна картица није откривен ана овом рачунару.\n"
"Нећете бити у могућности да шаљете или да примате звучне позиве."
-#: ../gtk/main.c:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "Слободан СИП телефон са снимком"
@@ -246,7 +251,7 @@ msgstr "Додајте у адресар"
msgid "Presence status"
msgstr "Стање присуства"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Име"
@@ -263,142 +268,142 @@ msgstr ""
msgid "Search in %s directory"
msgstr "Тражи у директоријуму „%s“"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "Уредите контакт „%s“"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "Обришите контакт „%s“"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, fuzzy, c-format
msgid "Delete chat history of '%s'"
msgstr "Обришите контакт „%s“"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "Додајте нови контакт из директоријума „%s“"
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Проток (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Стање"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Најмањи проток бита (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Параметри"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "Укључено"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Искључено"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "Налог"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "Енглески"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "Француски"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "Шведски"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "Италијански"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "Шпански"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "Бразилски португалски"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "Пољски"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "Немачки"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "Руски"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "Јапански"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "Холандски"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "Мађарски"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "Чешки"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "Кинески"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr "Традиционални кинески"
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr "Норвешки"
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr ""
"Трба поново да покренете линфон да би нови изабрани језик ступио на снагу."
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr "Ништа"
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr "СРТП"
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr "ЗРТП"
@@ -544,41 +549,41 @@ msgid ""
"Then come back here and press Next button."
msgstr ""
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "Помоћник подешавања налога"
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "Добродошли у помоћника подешавања налога"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "Помоћник подешавања налога"
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
#, fuzzy
msgid "Configure your account (step 1/1)"
msgstr "Подесите СИП налог"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr ""
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr ""
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr ""
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr ""
@@ -587,194 +592,194 @@ msgstr ""
msgid "Call #%i"
msgstr "Позови #%i"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr "Пребаци позив #%i са %s"
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
#, fuzzy
msgid "Not used"
msgstr "Нисам нашао"
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "Позив није успео."
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
#, fuzzy
msgid "Direct"
msgstr "Преусмерен"
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
#, fuzzy
msgid "uPnP in progress"
msgstr "У току је тражење стуна..."
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
#, fuzzy
msgid "uPnp not available"
msgstr "недоступно"
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "Позив није успео."
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, fuzzy, c-format
msgid "%.3f seconds"
msgstr "%i секунда"
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
msgid "Calling..."
msgstr "Позивам..."
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr "00::00::00"
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
msgid "Incoming call"
msgstr "Долазни позив"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr "добро"
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr "просечно"
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr "оскудно"
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr "јадно"
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr "много лоше"
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr "недоступно"
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr "Осигурано СРТП-ом"
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr "Осигурано ЗРТП-ом [потврђивање идентитета: %s]"
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr "Непроверено подешавање"
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr "Проверено подешавање"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr "На конференцији"
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In call"
msgstr "У позиву"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
msgid "Paused call"
msgstr "Заустављен позив"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr "%02i::%02i::%02i"
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "Позив је завршен."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
#, fuzzy
msgid "Transfer done."
msgstr "Пребаци"
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "Пребаци"
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr "Настави"
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr "Застани"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, fuzzy
msgid "(Paused)"
msgstr "Застани"
@@ -794,6 +799,87 @@ msgstr ""
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"Добродошли !\n"
+"Овај помоћник ће вам помоћи да користите СИП налог за ваше позиве."
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Уређај за снимање:"
+
+#: ../gtk/audio_assistant.c:327
+msgid "Recorded volume"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Уређај за пуштање:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "Помоћник подешавања налога"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "Помоћник подешавања налога"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
msgid "Callee name"
msgstr "Име позивника"
@@ -836,124 +922,124 @@ msgid "Call quality rating"
msgstr "Оцена квалитета позива"
#: ../gtk/main.ui.h:17
+msgid "All users"
+msgstr "Сви корисници"
+
+#: ../gtk/main.ui.h:18
+msgid "Online users"
+msgstr "Корисницима на мрежи"
+
+#: ../gtk/main.ui.h:19
+msgid "ADSL"
+msgstr "АДСЛ"
+
+#: ../gtk/main.ui.h:20
+msgid "Fiber Channel"
+msgstr "Оптички канал"
+
+#: ../gtk/main.ui.h:21
+msgid "Default"
+msgstr "Основно"
+
+#: ../gtk/main.ui.h:22
msgid "_Options"
msgstr "_Могућности"
-#: ../gtk/main.ui.h:18
+#: ../gtk/main.ui.h:23
#, fuzzy
msgid "Set configuration URI"
msgstr "Потврђујем"
-#: ../gtk/main.ui.h:19
+#: ../gtk/main.ui.h:24
msgid "Always start video"
msgstr ""
-#: ../gtk/main.ui.h:20
+#: ../gtk/main.ui.h:25
msgid "Enable self-view"
msgstr "Укључи самовиђење"
-#: ../gtk/main.ui.h:21
+#: ../gtk/main.ui.h:26
msgid "_Help"
msgstr "По_моћ"
-#: ../gtk/main.ui.h:22
+#: ../gtk/main.ui.h:27
msgid "Show debug window"
msgstr "Прикажи прозорче прочишћавања"
-#: ../gtk/main.ui.h:23
+#: ../gtk/main.ui.h:28
msgid "_Homepage"
msgstr "_Матична страница"
-#: ../gtk/main.ui.h:24
+#: ../gtk/main.ui.h:29
msgid "Check _Updates"
msgstr "Провери _ажурирања"
-#: ../gtk/main.ui.h:25
+#: ../gtk/main.ui.h:30
#, fuzzy
msgid "Account assistant"
msgstr "Помоћник подешавања налога"
-#: ../gtk/main.ui.h:26
+#: ../gtk/main.ui.h:32
msgid "SIP address or phone number:"
msgstr "СИП адреса или број телефона:"
-#: ../gtk/main.ui.h:27
+#: ../gtk/main.ui.h:33
msgid "Initiate a new call"
msgstr "Започните нови позив"
-#: ../gtk/main.ui.h:28
+#: ../gtk/main.ui.h:34
msgid "Contacts"
msgstr "Пријатељи"
-#: ../gtk/main.ui.h:29
+#: ../gtk/main.ui.h:35
msgid "Search"
msgstr "Тражи"
-#: ../gtk/main.ui.h:30
+#: ../gtk/main.ui.h:36
msgid "Add contacts from directory"
msgstr "Додај пријатеље из директоријума"
-#: ../gtk/main.ui.h:31
+#: ../gtk/main.ui.h:37
msgid "Add contact"
msgstr "Додај пријатеља"
-#: ../gtk/main.ui.h:32
+#: ../gtk/main.ui.h:38
msgid "Recent calls"
msgstr "Скорашњи позиви"
-#: ../gtk/main.ui.h:33
+#: ../gtk/main.ui.h:39
msgid "My current identity:"
msgstr "Мој тренутни идентитет:"
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
msgid "Username"
msgstr "Корисничко име"
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
msgid "Password"
msgstr "Лозинка"
-#: ../gtk/main.ui.h:36
+#: ../gtk/main.ui.h:42
msgid "Internet connection:"
msgstr "Интернет веза:"
-#: ../gtk/main.ui.h:37
+#: ../gtk/main.ui.h:43
msgid "Automatically log me in"
msgstr "Сам ме пријави"
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
msgid "UserID"
msgstr "ИБ корисника"
-#: ../gtk/main.ui.h:39
+#: ../gtk/main.ui.h:45
msgid "Login information"
msgstr "Подаци пријављивања"
-#: ../gtk/main.ui.h:40
+#: ../gtk/main.ui.h:46
msgid "Welcome !"
msgstr "Добродошли !"
-#: ../gtk/main.ui.h:41
-msgid "All users"
-msgstr "Сви корисници"
-
-#: ../gtk/main.ui.h:42
-msgid "Online users"
-msgstr "Корисницима на мрежи"
-
-#: ../gtk/main.ui.h:43
-msgid "ADSL"
-msgstr "АДСЛ"
-
-#: ../gtk/main.ui.h:44
-msgid "Fiber Channel"
-msgstr "Оптички канал"
-
-#: ../gtk/main.ui.h:45
-msgid "Default"
-msgstr "Основно"
-
-#: ../gtk/main.ui.h:46
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1076,23 +1162,32 @@ msgid "Contact params (optional):"
msgstr "Рута (изборно):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Рута (изборно):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Пренос"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr "Упиши се"
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "Објави податке о присуству"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Укључи"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "Подесите СИП налог"
@@ -1523,6 +1618,10 @@ msgid "Video resolution sent"
msgstr "Жељена резолуција снимка:"
#: ../gtk/call_statistics.ui.h:11
+msgid "RTP profile"
+msgstr ""
+
+#: ../gtk/call_statistics.ui.h:12
#, fuzzy
msgid "Call statistics and information"
msgstr "Подаци о пријатељу"
@@ -1730,19 +1829,19 @@ msgstr "Повезујем се..."
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "прекинути"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "завршени"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "пропуштени"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1757,77 +1856,77 @@ msgstr ""
"Стање: %s\n"
"Трајање: %i мин %i сек\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Одлазни позив"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "Спреман"
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Потврђујем"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Тражим одредиште телефонског броја..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "Не могу да решим овај број."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "Ступам у везу"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
msgid "Could not call"
msgstr "Не могу да позовем"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr "Извините, достигли смо највећи број истовремених позива"
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
msgid "is contacting you"
msgstr "вам се обраћа"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr " и затражени само-одговор."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr "."
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr "Мењам параметре позива..."
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Повезан сам."
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
msgid "Call aborted"
msgstr "Позив је прекинут"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr "Не могу да зауставим позив"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr "Заустављам тренутни позив..."
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "У току је тражење стуна..."
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1884,7 +1983,7 @@ msgstr "Трајање"
msgid "Unknown-bug"
msgstr "Непозната грешка"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
@@ -1892,7 +1991,7 @@ msgstr ""
"Адреса сип посредника коју сте унели је неисправна, мора почети на „sip:“ за "
"којим следи назив домаћина."
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1901,130 +2000,126 @@ msgstr ""
"Треба да изгледа као „sip:корисник@домен-посредника, као што је „sip:"
"alice@example.net“"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "Не могу да се пријавим као %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr "Удаљено звоњење."
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
msgid "Remote ringing..."
msgstr "Удаљено звоњење..."
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr "Ранији медиј."
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr "Позив са „%s“ је заустављен."
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr "Позив на који је одговорио „%s“ — на чекању."
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
msgid "Call resumed."
msgstr "Позив је настављен."
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr "На позив је одговорио „%s“."
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
#, fuzzy
msgid "We have been resumed."
msgstr "Позив нам је настављен..."
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
#, fuzzy
msgid "Call is updated by remote."
msgstr "Позив је ажуриран удаљеним..."
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "Позив је завршен."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "Корисник је заузет."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "Корисник је привремено недоступан."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "Корисник не жели да буде узнемираван."
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Позив је одбијен."
-#: ../coreapi/callbacks.c:603
-msgid "No response."
-msgstr "Нема одговора."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
+msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr "Грешка у протоколу."
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr "Преусмерен"
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr ""
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
msgid "Call failed."
msgstr "Позив није успео."
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "Уписивање на „%s“ је успело."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "Исписивање са „%s“ је обављено."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "нема ограничења одговора"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "Уписивање на „%s“ није успело: %s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, c-format
msgid "Authentication token is %s"
msgstr "Симбол потврђивања идентитета је „%s“"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
@@ -2033,6 +2128,12 @@ msgstr[1] "Пропустили сте %i позива."
msgstr[2] "Пропустили сте %i позива."
msgstr[3] "Пропустили сте један позив."
+#~ msgid "No response."
+#~ msgstr "Нема одговора."
+
+#~ msgid "Protocol error."
+#~ msgstr "Грешка у протоколу."
+
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
#~ "user@domain"
diff --git a/po/sv.po b/po/sv.po
index 7d5421323..67e07eab8 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2009-02-17 15:22+0100\n"
"Last-Translator: Emmanuel Frécon \n"
"Language-Team: SWEDISH \n"
@@ -16,67 +16,67 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "Ringer %s"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "Skicka text till %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "I samtal med"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr ""
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "avbrytade"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
#, fuzzy
msgid "Missed"
msgstr "missade"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "Avböj"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] ""
msgstr[1] ""
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
"%s\t%s\t"
msgstr ""
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -97,35 +97,35 @@ msgstr "Mikrofon av"
msgid "Couldn't find pixmap file: %s"
msgstr "Kunde inte hitta pixmap filen: %s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "ogiltig SIP kontakt!"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr "skriv loggning information under körning"
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr ""
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr "Starta ikonifierat, visa inte huvudfönstret"
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr "Samtalsmottagare"
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr "Om på, besvara automatisk alla inkommande samtal"
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
msgid ""
"Specifiy a working directory (should be the base of the installation, eg: c:"
"\\Program Files\\Linphone)"
@@ -133,17 +133,22 @@ msgstr ""
"Välj en arbetskatalog som ska vara basen för installationen, såsom C:"
"\\Program\\Linphone"
-#: ../gtk/main.c:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "Bekräftelse"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "Kontoinstallationsassistenten"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "Samtal med %s"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -156,7 +161,7 @@ msgstr ""
"henne till din kontaktlista?\n"
"Om du svarar nej, personen kommer att vara bannlyst."
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
@@ -165,67 +170,67 @@ msgstr ""
"Mata in ditt lösenord för användaren %s\n"
"vid domänen %s:"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
#, fuzzy
msgid "Call error"
msgstr "Samtalshistorik"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "Samtalet slut"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "Inkommande samtal"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr ""
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "Avböj"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy
msgid "Call paused"
msgstr "avbrytade"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "Portar"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "Webbsajt"
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Linphone - en video Internet telefon"
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (Default)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr ""
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
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:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "En gratis SIP video-telefon"
@@ -237,7 +242,7 @@ msgstr ""
msgid "Presence status"
msgstr "Närvarostatus"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "Namn"
@@ -255,141 +260,141 @@ msgstr ""
msgid "Search in %s directory"
msgstr "Sök i %s katalogen"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "Ändra kontakt '%s'"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "Ta bort kontakt '%s'"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, fuzzy, c-format
msgid "Delete chat history of '%s'"
msgstr "Ta bort kontakt '%s'"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "Lägg till kontakt ifrån %s katalogen"
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "Frekvens (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "Status"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "Min. datahastighet (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "Parametrar"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "På"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "Av"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "Konto"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "Engelska"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "Fransk"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "Svenska"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "Italiensk"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "Spanska"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "Portugisiska"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "Polska"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "Tyska"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "Ryska"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "Japanska"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "Nederländksa"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "Hungerska"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "Tjekiska"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "Kinesiska"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr ""
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr "Du behöver starta om programmet för att det nya språket ska synas."
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr ""
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -533,41 +538,41 @@ msgid ""
"Then come back here and press Next button."
msgstr ""
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "Kontoinstallationsassistenten"
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "Välkommen till kontoinstallationsassistenten"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "Kontoinstallationsassistenten"
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
#, fuzzy
msgid "Configure your account (step 1/1)"
msgstr "Konfigurera ett SIP konto"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr ""
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr ""
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr ""
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
#, fuzzy
msgid "Terminating"
msgstr "Lägg på"
@@ -577,194 +582,194 @@ msgstr "Lägg på"
msgid "Call #%i"
msgstr "Ringer %s"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr ""
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
msgid "Not used"
msgstr ""
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "Samtalet avböjdes."
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
#, fuzzy
msgid "Direct"
msgstr "Omdirigerat till %s..."
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
#, fuzzy
msgid "uPnP in progress"
msgstr "STUN uppslagning pågår..."
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
msgid "uPnp not available"
msgstr ""
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "Samtalet avböjdes."
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr ""
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
msgid "Calling..."
msgstr "Ringer..."
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr "00:00:00"
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
#, fuzzy
msgid "Incoming call"
msgstr "Inkommande samtal"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr ""
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr ""
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr ""
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr ""
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr ""
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr ""
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr ""
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr ""
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr ""
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
#, fuzzy
msgid "In call"
msgstr "I samtal med"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
#, fuzzy
msgid "Paused call"
msgstr "Lägg på"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr "%02i:%02i:%02i"
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "Samtalet slut."
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr ""
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "Samtalet avböjdes."
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr ""
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
msgid "(Paused)"
msgstr ""
@@ -783,6 +788,87 @@ msgstr "Inkommande samtal från %s"
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"Välkommen!\n"
+"Assistenten kommer att hjälpa dig använda ett SIP konto för dina samtal:"
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "Mikrofon enhet:"
+
+#: ../gtk/audio_assistant.c:327
+msgid "Recorded volume"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "Uppspelningsenhet:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "Assistent"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "Kontoinstallationsassistenten"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
#, fuzzy
msgid "Callee name"
@@ -825,137 +911,137 @@ msgid "Call quality rating"
msgstr ""
#: ../gtk/main.ui.h:17
-msgid "_Options"
-msgstr ""
-
-#: ../gtk/main.ui.h:18
-#, fuzzy
-msgid "Set configuration URI"
-msgstr "Bekräftelse"
-
-#: ../gtk/main.ui.h:19
-msgid "Always start video"
-msgstr ""
-
-#: ../gtk/main.ui.h:20
-msgid "Enable self-view"
-msgstr "Själv bild"
-
-#: ../gtk/main.ui.h:21
-msgid "_Help"
-msgstr ""
-
-#: ../gtk/main.ui.h:22
-#, fuzzy
-msgid "Show debug window"
-msgstr "Linphone debug fönster"
-
-#: ../gtk/main.ui.h:23
-#, fuzzy
-msgid "_Homepage"
-msgstr "Hemsidan"
-
-#: ../gtk/main.ui.h:24
-#, fuzzy
-msgid "Check _Updates"
-msgstr "Letar efter uppdateringar"
-
-#: ../gtk/main.ui.h:25
-#, fuzzy
-msgid "Account assistant"
-msgstr "Kontoinstallationsassistenten"
-
-#: ../gtk/main.ui.h:26
-msgid "SIP address or phone number:"
-msgstr "Användarnamn"
-
-#: ../gtk/main.ui.h:27
-msgid "Initiate a new call"
-msgstr ""
-
-#: ../gtk/main.ui.h:28
-#, fuzzy
-msgid "Contacts"
-msgstr "Kontaktar"
-
-#: ../gtk/main.ui.h:29
-msgid "Search"
-msgstr "Sök"
-
-#: ../gtk/main.ui.h:30
-msgid "Add contacts from directory"
-msgstr "Lägg till kontakt ifrån katalogen"
-
-#: ../gtk/main.ui.h:31
-#, fuzzy
-msgid "Add contact"
-msgstr "Hittat kontakt %i"
-
-#: ../gtk/main.ui.h:32
-#, fuzzy
-msgid "Recent calls"
-msgstr "I samtal"
-
-#: ../gtk/main.ui.h:33
-msgid "My current identity:"
-msgstr "Min nuvarande identitet"
-
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
-msgid "Username"
-msgstr "Användarnamn"
-
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
-msgid "Password"
-msgstr "Lösenord"
-
-#: ../gtk/main.ui.h:36
-msgid "Internet connection:"
-msgstr "Internet förbindelse:"
-
-#: ../gtk/main.ui.h:37
-msgid "Automatically log me in"
-msgstr "Logga mig automatiskt"
-
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
-msgid "UserID"
-msgstr "AnvändarID"
-
-#: ../gtk/main.ui.h:39
-msgid "Login information"
-msgstr "Login information"
-
-#: ../gtk/main.ui.h:40
-msgid "Welcome !"
-msgstr "Välkommen!"
-
-#: ../gtk/main.ui.h:41
msgid "All users"
msgstr ""
-#: ../gtk/main.ui.h:42
+#: ../gtk/main.ui.h:18
#, fuzzy
msgid "Online users"
msgstr ""
"Alla användare\n"
"Online användare"
-#: ../gtk/main.ui.h:43
+#: ../gtk/main.ui.h:19
msgid "ADSL"
msgstr ""
-#: ../gtk/main.ui.h:44
+#: ../gtk/main.ui.h:20
#, fuzzy
msgid "Fiber Channel"
msgstr ""
"ADSL\n"
"Fiber"
-#: ../gtk/main.ui.h:45
+#: ../gtk/main.ui.h:21
#, fuzzy
msgid "Default"
msgstr "%s (Default)"
+#: ../gtk/main.ui.h:22
+msgid "_Options"
+msgstr ""
+
+#: ../gtk/main.ui.h:23
+#, fuzzy
+msgid "Set configuration URI"
+msgstr "Bekräftelse"
+
+#: ../gtk/main.ui.h:24
+msgid "Always start video"
+msgstr ""
+
+#: ../gtk/main.ui.h:25
+msgid "Enable self-view"
+msgstr "Själv bild"
+
+#: ../gtk/main.ui.h:26
+msgid "_Help"
+msgstr ""
+
+#: ../gtk/main.ui.h:27
+#, fuzzy
+msgid "Show debug window"
+msgstr "Linphone debug fönster"
+
+#: ../gtk/main.ui.h:28
+#, fuzzy
+msgid "_Homepage"
+msgstr "Hemsidan"
+
+#: ../gtk/main.ui.h:29
+#, fuzzy
+msgid "Check _Updates"
+msgstr "Letar efter uppdateringar"
+
+#: ../gtk/main.ui.h:30
+#, fuzzy
+msgid "Account assistant"
+msgstr "Kontoinstallationsassistenten"
+
+#: ../gtk/main.ui.h:32
+msgid "SIP address or phone number:"
+msgstr "Användarnamn"
+
+#: ../gtk/main.ui.h:33
+msgid "Initiate a new call"
+msgstr ""
+
+#: ../gtk/main.ui.h:34
+#, fuzzy
+msgid "Contacts"
+msgstr "Kontaktar"
+
+#: ../gtk/main.ui.h:35
+msgid "Search"
+msgstr "Sök"
+
+#: ../gtk/main.ui.h:36
+msgid "Add contacts from directory"
+msgstr "Lägg till kontakt ifrån katalogen"
+
+#: ../gtk/main.ui.h:37
+#, fuzzy
+msgid "Add contact"
+msgstr "Hittat kontakt %i"
+
+#: ../gtk/main.ui.h:38
+#, fuzzy
+msgid "Recent calls"
+msgstr "I samtal"
+
+#: ../gtk/main.ui.h:39
+msgid "My current identity:"
+msgstr "Min nuvarande identitet"
+
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
+msgid "Username"
+msgstr "Användarnamn"
+
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
+msgid "Password"
+msgstr "Lösenord"
+
+#: ../gtk/main.ui.h:42
+msgid "Internet connection:"
+msgstr "Internet förbindelse:"
+
+#: ../gtk/main.ui.h:43
+msgid "Automatically log me in"
+msgstr "Logga mig automatiskt"
+
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
+msgid "UserID"
+msgstr "AnvändarID"
+
+#: ../gtk/main.ui.h:45
+msgid "Login information"
+msgstr "Login information"
+
#: ../gtk/main.ui.h:46
+msgid "Welcome !"
+msgstr "Välkommen!"
+
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1067,23 +1153,32 @@ msgid "Contact params (optional):"
msgstr "Route (tillval):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "Route (tillval):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "Transport"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr ""
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "Publicera närvaro information"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "Möjliggör"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "Konfigurera ett SIP konto"
@@ -1522,6 +1617,10 @@ msgid "Video resolution sent"
msgstr "Video upplösning:"
#: ../gtk/call_statistics.ui.h:11
+msgid "RTP profile"
+msgstr ""
+
+#: ../gtk/call_statistics.ui.h:12
#, fuzzy
msgid "Call statistics and information"
msgstr "Kontakt information"
@@ -1728,19 +1827,19 @@ msgstr "Kontaktar"
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "avbrytade"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "avslutade"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "missade"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1755,82 +1854,82 @@ msgstr ""
"Status: %s\n"
"Längd: %i min %i sek\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "Utgående samtal"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "Redo"
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "Bekräftelse"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "Leta efter telefonnummer för destinationen..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "Kan inte nå dett nummer."
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "Kontaktar"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
#, fuzzy
msgid "Could not call"
msgstr "Kunde inte ringa"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr ""
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
#, fuzzy
msgid "is contacting you"
msgstr "kontaktar dig."
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr ""
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr ""
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr ""
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "Kopplad"
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
#, fuzzy
msgid "Call aborted"
msgstr "avbrytade"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
#, fuzzy
msgid "Could not pause the call"
msgstr "Kunde inte ringa"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
#, fuzzy
msgid "Pausing the current call..."
msgstr "Nuvarande samtal"
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "STUN uppslagning pågår..."
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1887,7 +1986,7 @@ msgstr "Förlopp"
msgid "Unknown-bug"
msgstr "Okänd bug"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
@@ -1895,7 +1994,7 @@ msgstr ""
"SIP proxy adressen som du matade in är inte rätt, adressen måste starta med "
"\"sip:\", följd av ett hostnamn"
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1903,139 +2002,138 @@ msgstr ""
"SIP adressen som du matade in är inte rätt. Adressen borde se ut som sip:"
"namn@domän, såsom sip:peter@exempel.se"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "Kunde inte logga in som %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr "Ringer hos motparten."
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
#, fuzzy
msgid "Remote ringing..."
msgstr "Ringer hos motparten."
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr "Tidig media"
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, fuzzy, c-format
msgid "Call with %s is paused."
msgstr "Samtal med %s"
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr ""
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
#, fuzzy
msgid "Call resumed."
msgstr "Samtalet slut"
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr ""
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr ""
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr ""
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "Samtalet slut."
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "Användare upptagen."
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "Användaren temporärt inte tillgänglig."
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "Användaren vill inte bli störd."
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "Samtalet avböjdes."
-#: ../coreapi/callbacks.c:603
-#, fuzzy
-msgid "No response."
-msgstr "Inget svar inom angiven tid"
-
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
msgstr ""
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
#, fuzzy
msgid "Redirected"
msgstr "Omdirigerat till %s..."
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr ""
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
#, fuzzy
msgid "Call failed."
msgstr "Samtalet avböjdes."
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "Registrering hos %s lyckades."
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "Avregistrering hos %s lyckades."
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "Inget svar inom angiven tid"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "Registrering hos %s mislyckades: %s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, fuzzy, c-format
msgid "Authentication token is %s"
msgstr "Linphone - Autentisering krävs"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
msgstr[0] "Du har %i missat samtal"
msgstr[1] "Du har %i missade samtal"
+#, fuzzy
+#~ msgid "No response."
+#~ msgstr "Inget svar inom angiven tid"
+
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
#~ "user@domain"
@@ -2342,9 +2440,6 @@ msgstr[1] "Du har %i missade samtal"
#~ "Din dator verkar vara kopplad till ett IPv6 nätverk. Default, använder "
#~ "linphone IPv4. Uppdatera din konfiguration om du vill använda IPv6."
-#~ msgid "Assistant"
-#~ msgstr "Assistent"
-
#~ msgid "Show debug messages"
#~ msgstr "Visa debugfönstret"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index f55f87dfd..af5a7d776 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: linphone 3.3.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2011-01-08 23:51+0800\n"
"Last-Translator: Aron Xu \n"
"Language-Team: Chinese (simplified) \n"
@@ -18,65 +18,65 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "呼叫 %s"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "发送消息给 %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "正在呼叫"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr ""
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "中断"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
#, fuzzy
msgid "Missed"
msgstr "丢失"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "拒绝"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] ""
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] ""
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
"%s\t%s\t"
msgstr ""
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -97,51 +97,56 @@ msgstr "静音"
msgid "Couldn't find pixmap file: %s"
msgstr "无法打开位图文件:%s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "无效的 SIP 联系人!"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr "运行时向标准输出记录调试信息。"
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr ""
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr "启动到系统托盘,不显示主界面。"
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr "现在呼叫的地址"
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr "是否设置呼叫自动应答"
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
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:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "确认"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "帐户设置向导"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "与 %s 通话"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -153,68 +158,68 @@ msgstr ""
"您是否允许他看到您的在线状态或者将它加为您的联系人允许?\n"
"如果您回答否,则会将该人临时性的放入黑名单"
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
" at realm %s:"
msgstr "请输入 %s@%s 的密码:"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
#, fuzzy
msgid "Call error"
msgstr "呼叫历史"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "呼叫结束"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "呼入"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr ""
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "拒绝"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy
msgid "Call paused"
msgstr "中断"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "端口"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "网站"
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Linphone - 互联网视频电话"
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (默认)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr ""
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
msgid ""
"No sound cards have been detected on this computer.\n"
"You won't be able to send or receive audio calls."
@@ -222,7 +227,7 @@ msgstr ""
"未在此计算机上检测到声卡。\n"
"您无法发送或接收音频呼叫。"
-#: ../gtk/main.c:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "免费的 SIP 视频电话"
@@ -234,7 +239,7 @@ msgstr ""
msgid "Presence status"
msgstr "在线状态"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "名称"
@@ -252,141 +257,141 @@ msgstr ""
msgid "Search in %s directory"
msgstr "在 %s 目录中查找 "
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "编辑联系人 %s"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "删除联系人 %s"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, fuzzy, c-format
msgid "Delete chat history of '%s'"
msgstr "删除联系人 %s"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "从 %s 目录增加联系人 "
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "采样率(Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "状态"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "最小比特率(kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "参数"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "启用"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "禁用"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "帐户"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "英语"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "法语"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "瑞典语"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "意大利语"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "西班牙语"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "巴西葡萄牙语"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "波兰语"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "德语"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "俄语"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "日语"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "荷兰语"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "匈牙利语"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "捷克语"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "中文"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr ""
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr "您需要重启 linphone 以使语言选择生效。"
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr ""
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -529,41 +534,41 @@ msgid ""
"Then come back here and press Next button."
msgstr ""
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "帐户设置向导"
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "欢迎使用帐户设置向导"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "帐户设置向导"
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
#, fuzzy
msgid "Configure your account (step 1/1)"
msgstr "配置 SIP 帐户"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr ""
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr ""
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr ""
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
#, fuzzy
msgid "Terminating"
msgstr "终止呼叫"
@@ -573,195 +578,195 @@ msgstr "终止呼叫"
msgid "Call #%i"
msgstr "呼叫 %s"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr ""
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
#, fuzzy
msgid "Not used"
msgstr "未找到"
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "ICE 过滤器"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
#, fuzzy
msgid "Direct"
msgstr "已重定向"
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
#, fuzzy
msgid "uPnP in progress"
msgstr "正在进行 Stun 查找..."
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
msgid "uPnp not available"
msgstr ""
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "ICE 过滤器"
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr ""
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
msgid "Calling..."
msgstr "正在呼叫..."
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr "00::00::00"
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
#, fuzzy
msgid "Incoming call"
msgstr "呼入"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr ""
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr ""
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr ""
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr ""
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr ""
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr ""
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr ""
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr ""
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr ""
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
#, fuzzy
msgid "In call"
msgstr "正在呼叫"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
#, fuzzy
msgid "Paused call"
msgstr "正在呼叫"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr "%02i::%02i::%02i"
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "通话结束。"
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
msgid "Transfer done."
msgstr ""
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "呼叫失败。"
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr ""
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
msgid "(Paused)"
msgstr ""
@@ -780,6 +785,87 @@ msgstr "来自 %s 的呼叫"
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"欢迎使用 Linphone!\n"
+"设置向导将帮助您配置打网络电话的 SIP 帐户。"
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "录音设备:"
+
+#: ../gtk/audio_assistant.c:327
+msgid "Recorded volume"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "回放设备:"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "配置向导"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "帐户设置向导"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
#, fuzzy
msgid "Callee name"
@@ -822,135 +908,135 @@ msgid "Call quality rating"
msgstr ""
#: ../gtk/main.ui.h:17
-msgid "_Options"
-msgstr ""
-
-#: ../gtk/main.ui.h:18
-#, fuzzy
-msgid "Set configuration URI"
-msgstr "确认"
-
-#: ../gtk/main.ui.h:19
-msgid "Always start video"
-msgstr ""
-
-#: ../gtk/main.ui.h:20
-msgid "Enable self-view"
-msgstr "启用自视"
-
-#: ../gtk/main.ui.h:21
-msgid "_Help"
-msgstr ""
-
-#: ../gtk/main.ui.h:22
-#, fuzzy
-msgid "Show debug window"
-msgstr "Linphone 调试窗口"
-
-#: ../gtk/main.ui.h:23
-#, fuzzy
-msgid "_Homepage"
-msgstr "主页"
-
-#: ../gtk/main.ui.h:24
-#, fuzzy
-msgid "Check _Updates"
-msgstr "检查更新"
-
-#: ../gtk/main.ui.h:25
-#, fuzzy
-msgid "Account assistant"
-msgstr "帐户设置向导"
-
-#: ../gtk/main.ui.h:26
-msgid "SIP address or phone number:"
-msgstr "SIP 地址或电话号码:"
-
-#: ../gtk/main.ui.h:27
-msgid "Initiate a new call"
-msgstr ""
-
-#: ../gtk/main.ui.h:28
-msgid "Contacts"
-msgstr "联系人"
-
-#: ../gtk/main.ui.h:29
-msgid "Search"
-msgstr "搜索"
-
-#: ../gtk/main.ui.h:30
-msgid "Add contacts from directory"
-msgstr "从目录增加联系人"
-
-#: ../gtk/main.ui.h:31
-#, fuzzy
-msgid "Add contact"
-msgstr "找到 %i 联系方式"
-
-#: ../gtk/main.ui.h:32
-#, fuzzy
-msgid "Recent calls"
-msgstr "呼入"
-
-#: ../gtk/main.ui.h:33
-msgid "My current identity:"
-msgstr "当前地址:"
-
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
-msgid "Username"
-msgstr "用户名"
-
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
-msgid "Password"
-msgstr "密码"
-
-#: ../gtk/main.ui.h:36
-msgid "Internet connection:"
-msgstr "网络连接:"
-
-#: ../gtk/main.ui.h:37
-msgid "Automatically log me in"
-msgstr "自动登录"
-
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
-msgid "UserID"
-msgstr "用户 ID"
-
-#: ../gtk/main.ui.h:39
-msgid "Login information"
-msgstr "登录信息"
-
-#: ../gtk/main.ui.h:40
-msgid "Welcome !"
-msgstr "欢迎!"
-
-#: ../gtk/main.ui.h:41
msgid "All users"
msgstr ""
-#: ../gtk/main.ui.h:42
+#: ../gtk/main.ui.h:18
#, fuzzy
msgid "Online users"
msgstr ""
"全部用户\n"
"在线用户"
-#: ../gtk/main.ui.h:43
+#: ../gtk/main.ui.h:19
msgid "ADSL"
msgstr ""
-#: ../gtk/main.ui.h:44
+#: ../gtk/main.ui.h:20
#, fuzzy
msgid "Fiber Channel"
msgstr ""
"ADSL\n"
"光纤"
-#: ../gtk/main.ui.h:45
+#: ../gtk/main.ui.h:21
msgid "Default"
msgstr "默认"
+#: ../gtk/main.ui.h:22
+msgid "_Options"
+msgstr ""
+
+#: ../gtk/main.ui.h:23
+#, fuzzy
+msgid "Set configuration URI"
+msgstr "确认"
+
+#: ../gtk/main.ui.h:24
+msgid "Always start video"
+msgstr ""
+
+#: ../gtk/main.ui.h:25
+msgid "Enable self-view"
+msgstr "启用自视"
+
+#: ../gtk/main.ui.h:26
+msgid "_Help"
+msgstr ""
+
+#: ../gtk/main.ui.h:27
+#, fuzzy
+msgid "Show debug window"
+msgstr "Linphone 调试窗口"
+
+#: ../gtk/main.ui.h:28
+#, fuzzy
+msgid "_Homepage"
+msgstr "主页"
+
+#: ../gtk/main.ui.h:29
+#, fuzzy
+msgid "Check _Updates"
+msgstr "检查更新"
+
+#: ../gtk/main.ui.h:30
+#, fuzzy
+msgid "Account assistant"
+msgstr "帐户设置向导"
+
+#: ../gtk/main.ui.h:32
+msgid "SIP address or phone number:"
+msgstr "SIP 地址或电话号码:"
+
+#: ../gtk/main.ui.h:33
+msgid "Initiate a new call"
+msgstr ""
+
+#: ../gtk/main.ui.h:34
+msgid "Contacts"
+msgstr "联系人"
+
+#: ../gtk/main.ui.h:35
+msgid "Search"
+msgstr "搜索"
+
+#: ../gtk/main.ui.h:36
+msgid "Add contacts from directory"
+msgstr "从目录增加联系人"
+
+#: ../gtk/main.ui.h:37
+#, fuzzy
+msgid "Add contact"
+msgstr "找到 %i 联系方式"
+
+#: ../gtk/main.ui.h:38
+#, fuzzy
+msgid "Recent calls"
+msgstr "呼入"
+
+#: ../gtk/main.ui.h:39
+msgid "My current identity:"
+msgstr "当前地址:"
+
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
+msgid "Username"
+msgstr "用户名"
+
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
+msgid "Password"
+msgstr "密码"
+
+#: ../gtk/main.ui.h:42
+msgid "Internet connection:"
+msgstr "网络连接:"
+
+#: ../gtk/main.ui.h:43
+msgid "Automatically log me in"
+msgstr "自动登录"
+
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
+msgid "UserID"
+msgstr "用户 ID"
+
+#: ../gtk/main.ui.h:45
+msgid "Login information"
+msgstr "登录信息"
+
#: ../gtk/main.ui.h:46
+msgid "Welcome !"
+msgstr "欢迎!"
+
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1075,23 +1161,32 @@ msgid "Contact params (optional):"
msgstr "路由(可选):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "路由(可选):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "传输协议"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr ""
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "发布在线状态"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "启用"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "配置 SIP 帐户"
@@ -1535,6 +1630,11 @@ msgstr "视频分辨率:"
#: ../gtk/call_statistics.ui.h:11
#, fuzzy
+msgid "RTP profile"
+msgstr "RTP 输入过滤器"
+
+#: ../gtk/call_statistics.ui.h:12
+#, fuzzy
msgid "Call statistics and information"
msgstr "联系人信息"
@@ -1740,19 +1840,19 @@ msgstr "正在连接..."
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "中断"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "完成"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "丢失"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1767,80 +1867,80 @@ msgstr ""
"状态:%s\n"
"状态:%i 分 %i 秒\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "呼出"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "就绪"
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "确认"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "查询电话号码目的地..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "该号码无法解析。"
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "联系中"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
#, fuzzy
msgid "Could not call"
msgstr "无法呼叫"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr ""
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
msgid "is contacting you"
msgstr "正在联系您"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr " 并询问了自动回答。"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr "."
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr ""
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "已连接。"
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
#, fuzzy
msgid "Call aborted"
msgstr "中断"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
#, fuzzy
msgid "Could not pause the call"
msgstr "无法呼叫"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr ""
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "正在进行 Stun 查找..."
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1897,13 +1997,13 @@ msgstr "通话时间"
msgid "Unknown-bug"
msgstr "未知错误"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
msgstr "您输入的 SIP 代理地址无效,它必须是以“sip:”开头,并紧随一个主机名。"
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1911,135 +2011,137 @@ msgstr ""
"您输入的地址无效。\n"
"它应具有“sip:用户名@代理域”的形式,例如 sip:alice@example.net"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "无法登录为 %s"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr "响铃。"
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
#, fuzzy
msgid "Remote ringing..."
msgstr "响铃。"
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr ""
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, fuzzy, c-format
msgid "Call with %s is paused."
msgstr "与 %s 通话"
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr ""
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
#, fuzzy
msgid "Call resumed."
msgstr "呼叫结束"
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr ""
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
msgid "We have been resumed."
msgstr ""
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr ""
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "通话结束。"
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "被叫正忙。"
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "您呼叫的用户暂时无法接通。"
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "用户已开启免打扰功能。"
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "呼叫被拒绝。"
-#: ../coreapi/callbacks.c:603
-msgid "No response."
-msgstr "没有响应。"
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
+msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr "协议错误。"
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr "已重定向"
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr ""
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
msgid "Call failed."
msgstr "呼叫失败。"
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "成功注册到 %s"
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "已在 %s 解除注册。"
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "没有响应,超时"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "注册到 %s 失败: %s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, fuzzy, c-format
msgid "Authentication token is %s"
msgstr "Linphone - 需要认证"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
msgstr[0] "您错过了 %i 个呼叫。"
+#~ msgid "No response."
+#~ msgstr "没有响应。"
+
+#~ msgid "Protocol error."
+#~ msgstr "协议错误。"
+
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
#~ "user@domain"
@@ -2199,9 +2301,6 @@ msgstr[0] "您错过了 %i 个呼叫。"
#~ msgid "RTP output filter"
#~ msgstr "RTP 输出过滤器"
-#~ msgid "RTP input filter"
-#~ msgstr "RTP 输入过滤器"
-
#~ msgid "The free and wonderful speex codec"
#~ msgstr "优秀的自由软件编解码器 Speex"
@@ -2339,9 +2438,6 @@ msgstr[0] "您错过了 %i 个呼叫。"
#~ msgid "Sound playback filter for MacOS X Core Audio drivers"
#~ msgstr "MacOS X 核心声音驱动音频回放过滤器"
-#~ msgid "Assistant"
-#~ msgstr "配置向导"
-
#~ msgid "Show debug messages"
#~ msgstr "显示调试信息"
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 52db94544..e44590a16 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: linphone 3.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-02-14 14:57+0100\n"
+"POT-Creation-Date: 2014-07-01 21:24+0200\n"
"PO-Revision-Date: 2011-04-06 21:24+0800\n"
"Last-Translator: Chao-Hsiung Liao \n"
"Language-Team: \n"
@@ -17,65 +17,65 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: ../gtk/calllogs.c:139 ../gtk/friendlist.c:969
+#: ../gtk/calllogs.c:148 ../gtk/friendlist.c:973
#, c-format
msgid "Call %s"
msgstr "播打給 %s"
-#: ../gtk/calllogs.c:140 ../gtk/friendlist.c:970
+#: ../gtk/calllogs.c:149 ../gtk/friendlist.c:974
#, c-format
msgid "Send text to %s"
msgstr "傳送文字給 %s"
-#: ../gtk/calllogs.c:223
+#: ../gtk/calllogs.c:232
#, fuzzy, c-format
msgid "Recent calls (%i)"
msgstr "通話中"
-#: ../gtk/calllogs.c:300
+#: ../gtk/calllogs.c:312
msgid "n/a"
msgstr ""
-#: ../gtk/calllogs.c:303
+#: ../gtk/calllogs.c:315
#, fuzzy
msgid "Aborted"
msgstr "已放棄"
-#: ../gtk/calllogs.c:306
+#: ../gtk/calllogs.c:318
#, fuzzy
msgid "Missed"
msgstr "未接"
-#: ../gtk/calllogs.c:309
+#: ../gtk/calllogs.c:321
#, fuzzy
msgid "Declined"
msgstr "拒接"
-#: ../gtk/calllogs.c:315
+#: ../gtk/calllogs.c:327
#, c-format
msgid "%i minute"
msgid_plural "%i minutes"
msgstr[0] ""
-#: ../gtk/calllogs.c:318
+#: ../gtk/calllogs.c:330
#, c-format
msgid "%i second"
msgid_plural "%i seconds"
msgstr[0] ""
-#: ../gtk/calllogs.c:321 ../gtk/calllogs.c:327
+#: ../gtk/calllogs.c:333 ../gtk/calllogs.c:339
#, c-format
msgid "%s\t%s"
msgstr ""
-#: ../gtk/calllogs.c:323
+#: ../gtk/calllogs.c:335
#, c-format
msgid ""
"%s\tQuality: %s\n"
"%s\t%s\t"
msgstr ""
-#: ../gtk/calllogs.c:329
+#: ../gtk/calllogs.c:341
#, c-format
msgid ""
"%s\t\n"
@@ -96,52 +96,57 @@ msgstr "靜音"
msgid "Couldn't find pixmap file: %s"
msgstr "找不到 pixmap 檔:%s"
-#: ../gtk/chat.c:363 ../gtk/friendlist.c:919
+#: ../gtk/chat.c:363 ../gtk/friendlist.c:923
msgid "Invalid sip contact !"
msgstr "無效的 sip 連絡人!"
-#: ../gtk/main.c:102
+#: ../gtk/main.c:107
msgid "log to stdout some debug information while running."
msgstr "執行時將一些除錯資訊記錄到標準輸出。"
-#: ../gtk/main.c:109
+#: ../gtk/main.c:114
msgid "path to a file to write logs into."
msgstr ""
-#: ../gtk/main.c:116
+#: ../gtk/main.c:121
msgid "Start linphone with video disabled."
msgstr ""
-#: ../gtk/main.c:123
+#: ../gtk/main.c:128
msgid "Start only in the system tray, do not show the main interface."
msgstr "只在系統匣啟動,不要顯示主要介面。"
-#: ../gtk/main.c:130
+#: ../gtk/main.c:135
msgid "address to call right now"
msgstr "現在要打電話的位址"
-#: ../gtk/main.c:137
+#: ../gtk/main.c:142
msgid "if set automatically answer incoming calls"
msgstr "如啟用此項,將會自動接聽來電"
-#: ../gtk/main.c:144
+#: ../gtk/main.c:149
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:151
+#: ../gtk/main.c:156
#, fuzzy
msgid "Configuration file"
msgstr "確認"
-#: ../gtk/main.c:573
+#: ../gtk/main.c:163
+#, fuzzy
+msgid "Run the audio assistant"
+msgstr "帳號設定助理"
+
+#: ../gtk/main.c:590
#, c-format
msgid "Call with %s"
msgstr "和 %s 通話"
-#: ../gtk/main.c:1150
+#: ../gtk/main.c:1171
#, c-format
msgid ""
"%s would like to add you to his contact list.\n"
@@ -153,7 +158,7 @@ msgstr ""
"您是否要允許他看見您的上線狀態或將他加入您的連絡人清單?\n"
"如果您回答否,這個人會被暫時列入黑名單。"
-#: ../gtk/main.c:1227
+#: ../gtk/main.c:1248
#, fuzzy, c-format
msgid ""
"Please enter your password for username %s\n"
@@ -162,61 +167,61 @@ msgstr ""
"請輸入您使用者名稱 %s\n"
"於網域 %s 的密碼:"
-#: ../gtk/main.c:1339
+#: ../gtk/main.c:1364
#, fuzzy
msgid "Call error"
msgstr "通話紀錄"
-#: ../gtk/main.c:1342 ../coreapi/linphonecore.c:3408
+#: ../gtk/main.c:1367 ../coreapi/linphonecore.c:3515
msgid "Call ended"
msgstr "通話已結束"
-#: ../gtk/main.c:1345 ../coreapi/linphonecore.c:250
+#: ../gtk/main.c:1370 ../coreapi/linphonecore.c:254
msgid "Incoming call"
msgstr "來電"
-#: ../gtk/main.c:1347 ../gtk/incall_view.c:508 ../gtk/main.ui.h:5
+#: ../gtk/main.c:1372 ../gtk/incall_view.c:513 ../gtk/main.ui.h:5
msgid "Answer"
msgstr "接聽"
-#: ../gtk/main.c:1349 ../gtk/main.ui.h:6
+#: ../gtk/main.c:1374 ../gtk/main.ui.h:6
msgid "Decline"
msgstr "拒接"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy
msgid "Call paused"
msgstr "通話已放棄"
-#: ../gtk/main.c:1355
+#: ../gtk/main.c:1380
#, fuzzy, c-format
msgid "by %s"
msgstr "連接埠"
-#: ../gtk/main.c:1422
+#: ../gtk/main.c:1447
#, c-format
msgid "%s proposed to start video. Do you accept ?"
msgstr ""
-#: ../gtk/main.c:1584
+#: ../gtk/main.c:1609
msgid "Website link"
msgstr "網站連結"
-#: ../gtk/main.c:1633
+#: ../gtk/main.c:1658
msgid "Linphone - a video internet phone"
msgstr "Linphone - 網路視訊電話"
-#: ../gtk/main.c:1725
+#: ../gtk/main.c:1750
#, c-format
msgid "%s (Default)"
msgstr "%s (預設值)"
-#: ../gtk/main.c:2061 ../coreapi/callbacks.c:827
+#: ../gtk/main.c:2086 ../coreapi/callbacks.c:927
#, c-format
msgid "We are transferred to %s"
msgstr "我們被轉接到 %s"
-#: ../gtk/main.c:2071
+#: ../gtk/main.c:2096
msgid ""
"No sound cards have been detected on this computer.\n"
"You won't be able to send or receive audio calls."
@@ -224,7 +229,7 @@ msgstr ""
"在這臺電腦中偵測不到音效卡。\n"
"您將無法傳送或接收語音電話。"
-#: ../gtk/main.c:2207
+#: ../gtk/main.c:2237
msgid "A free SIP video-phone"
msgstr "自由的 SIP 視訊電話"
@@ -236,7 +241,7 @@ msgstr ""
msgid "Presence status"
msgstr "上線狀態"
-#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:556 ../gtk/contact.ui.h:1
+#: ../gtk/friendlist.c:709 ../gtk/propertybox.c:550 ../gtk/contact.ui.h:1
msgid "Name"
msgstr "名稱"
@@ -254,141 +259,141 @@ msgstr ""
msgid "Search in %s directory"
msgstr "在 %s 目錄中搜尋"
-#: ../gtk/friendlist.c:971
+#: ../gtk/friendlist.c:975
#, c-format
msgid "Edit contact '%s'"
msgstr "編輯連絡人「%s」"
-#: ../gtk/friendlist.c:972
+#: ../gtk/friendlist.c:976
#, c-format
msgid "Delete contact '%s'"
msgstr "刪除連絡人「%s」"
-#: ../gtk/friendlist.c:973
+#: ../gtk/friendlist.c:977
#, fuzzy, c-format
msgid "Delete chat history of '%s'"
msgstr "刪除連絡人「%s」"
-#: ../gtk/friendlist.c:1024
+#: ../gtk/friendlist.c:1028
#, c-format
msgid "Add new contact from %s directory"
msgstr "從 %s 目錄加入新的連絡人"
-#: ../gtk/propertybox.c:562
+#: ../gtk/propertybox.c:556
msgid "Rate (Hz)"
msgstr "頻率 (Hz)"
-#: ../gtk/propertybox.c:568
+#: ../gtk/propertybox.c:562
msgid "Status"
msgstr "狀態"
-#: ../gtk/propertybox.c:574
+#: ../gtk/propertybox.c:568
#, fuzzy
-msgid "Bitrate (kbit/s)"
+msgid "IP Bitrate (kbit/s)"
msgstr "最小頻寬 (kbit/s)"
-#: ../gtk/propertybox.c:581
+#: ../gtk/propertybox.c:575
msgid "Parameters"
msgstr "參數"
-#: ../gtk/propertybox.c:624 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:618 ../gtk/propertybox.c:761
msgid "Enabled"
msgstr "已啟用"
-#: ../gtk/propertybox.c:626 ../gtk/propertybox.c:767
+#: ../gtk/propertybox.c:620 ../gtk/propertybox.c:761
msgid "Disabled"
msgstr "已停用"
-#: ../gtk/propertybox.c:813
+#: ../gtk/propertybox.c:807
msgid "Account"
msgstr "帳號"
-#: ../gtk/propertybox.c:1057
+#: ../gtk/propertybox.c:1061
msgid "English"
msgstr "英語"
-#: ../gtk/propertybox.c:1058
+#: ../gtk/propertybox.c:1062
msgid "French"
msgstr "法語"
-#: ../gtk/propertybox.c:1059
+#: ../gtk/propertybox.c:1063
msgid "Swedish"
msgstr "瑞典語"
-#: ../gtk/propertybox.c:1060
+#: ../gtk/propertybox.c:1064
msgid "Italian"
msgstr "義大利語"
-#: ../gtk/propertybox.c:1061
+#: ../gtk/propertybox.c:1065
msgid "Spanish"
msgstr "西班牙語"
-#: ../gtk/propertybox.c:1062
+#: ../gtk/propertybox.c:1066
msgid "Brazilian Portugese"
msgstr "巴西葡萄牙語"
-#: ../gtk/propertybox.c:1063
+#: ../gtk/propertybox.c:1067
msgid "Polish"
msgstr "波蘭語"
-#: ../gtk/propertybox.c:1064
+#: ../gtk/propertybox.c:1068
msgid "German"
msgstr "德語"
-#: ../gtk/propertybox.c:1065
+#: ../gtk/propertybox.c:1069
msgid "Russian"
msgstr "俄語"
-#: ../gtk/propertybox.c:1066
+#: ../gtk/propertybox.c:1070
msgid "Japanese"
msgstr "日語"
-#: ../gtk/propertybox.c:1067
+#: ../gtk/propertybox.c:1071
msgid "Dutch"
msgstr "荷蘭語"
-#: ../gtk/propertybox.c:1068
+#: ../gtk/propertybox.c:1072
msgid "Hungarian"
msgstr "匈牙利語"
-#: ../gtk/propertybox.c:1069
+#: ../gtk/propertybox.c:1073
msgid "Czech"
msgstr "捷克語"
-#: ../gtk/propertybox.c:1070
+#: ../gtk/propertybox.c:1074
msgid "Chinese"
msgstr "中文"
-#: ../gtk/propertybox.c:1071
+#: ../gtk/propertybox.c:1075
msgid "Traditional Chinese"
msgstr ""
-#: ../gtk/propertybox.c:1072
+#: ../gtk/propertybox.c:1076
msgid "Norwegian"
msgstr ""
-#: ../gtk/propertybox.c:1073
+#: ../gtk/propertybox.c:1077
msgid "Hebrew"
msgstr ""
-#: ../gtk/propertybox.c:1074
+#: ../gtk/propertybox.c:1078
msgid "Serbian"
msgstr ""
-#: ../gtk/propertybox.c:1141
+#: ../gtk/propertybox.c:1145
msgid ""
"You need to restart linphone for the new language selection to take effect."
msgstr "您需要重新啟動 linphone 才能讓新選擇的語言生效。"
-#: ../gtk/propertybox.c:1219
+#: ../gtk/propertybox.c:1223
msgid "None"
msgstr ""
-#: ../gtk/propertybox.c:1223
+#: ../gtk/propertybox.c:1227
msgid "SRTP"
msgstr ""
-#: ../gtk/propertybox.c:1229
+#: ../gtk/propertybox.c:1233
msgid "ZRTP"
msgstr ""
@@ -531,41 +536,41 @@ msgid ""
"Then come back here and press Next button."
msgstr ""
-#: ../gtk/setupwizard.c:572
+#: ../gtk/setupwizard.c:564
#, fuzzy
msgid "SIP account configuration assistant"
msgstr "帳號設定助理"
-#: ../gtk/setupwizard.c:590
+#: ../gtk/setupwizard.c:582
msgid "Welcome to the account setup assistant"
msgstr "歡迎使用帳號設定助理"
-#: ../gtk/setupwizard.c:595
+#: ../gtk/setupwizard.c:587
msgid "Account setup assistant"
msgstr "帳號設定助理"
-#: ../gtk/setupwizard.c:601
+#: ../gtk/setupwizard.c:593
#, fuzzy
msgid "Configure your account (step 1/1)"
msgstr "設定 SIP 帳號"
-#: ../gtk/setupwizard.c:606
+#: ../gtk/setupwizard.c:598
msgid "Enter your sip username (step 1/1)"
msgstr ""
-#: ../gtk/setupwizard.c:610
+#: ../gtk/setupwizard.c:602
msgid "Enter account information (step 1/2)"
msgstr ""
-#: ../gtk/setupwizard.c:619
+#: ../gtk/setupwizard.c:611
msgid "Validation (step 2/2)"
msgstr ""
-#: ../gtk/setupwizard.c:624
+#: ../gtk/setupwizard.c:616
msgid "Error"
msgstr ""
-#: ../gtk/setupwizard.c:628
+#: ../gtk/setupwizard.c:620 ../gtk/audio_assistant.c:519
msgid "Terminating"
msgstr ""
@@ -574,193 +579,193 @@ msgstr ""
msgid "Call #%i"
msgstr "播打給 %s"
-#: ../gtk/incall_view.c:154
+#: ../gtk/incall_view.c:155
#, c-format
msgid "Transfer to call #%i with %s"
msgstr ""
-#: ../gtk/incall_view.c:210 ../gtk/incall_view.c:213
+#: ../gtk/incall_view.c:211 ../gtk/incall_view.c:214
#, fuzzy
msgid "Not used"
msgstr "找不到"
-#: ../gtk/incall_view.c:220
+#: ../gtk/incall_view.c:221
msgid "ICE not activated"
msgstr ""
-#: ../gtk/incall_view.c:222
+#: ../gtk/incall_view.c:223
#, fuzzy
msgid "ICE failed"
msgstr "ICE 過濾器"
-#: ../gtk/incall_view.c:224
+#: ../gtk/incall_view.c:225
msgid "ICE in progress"
msgstr ""
-#: ../gtk/incall_view.c:226
+#: ../gtk/incall_view.c:227
msgid "Going through one or more NATs"
msgstr ""
-#: ../gtk/incall_view.c:228
+#: ../gtk/incall_view.c:229
#, fuzzy
msgid "Direct"
msgstr "已重新導向"
-#: ../gtk/incall_view.c:230
+#: ../gtk/incall_view.c:231
msgid "Through a relay server"
msgstr ""
-#: ../gtk/incall_view.c:238
+#: ../gtk/incall_view.c:239
msgid "uPnP not activated"
msgstr ""
-#: ../gtk/incall_view.c:240
+#: ../gtk/incall_view.c:241
#, fuzzy
msgid "uPnP in progress"
msgstr "正在進行 Stun 搜尋..."
-#: ../gtk/incall_view.c:242
+#: ../gtk/incall_view.c:243
msgid "uPnp not available"
msgstr ""
-#: ../gtk/incall_view.c:244
+#: ../gtk/incall_view.c:245
msgid "uPnP is running"
msgstr ""
-#: ../gtk/incall_view.c:246
+#: ../gtk/incall_view.c:247
#, fuzzy
msgid "uPnP failed"
msgstr "ICE 過濾器"
-#: ../gtk/incall_view.c:256 ../gtk/incall_view.c:257
+#: ../gtk/incall_view.c:257 ../gtk/incall_view.c:258
msgid "Direct or through server"
msgstr ""
-#: ../gtk/incall_view.c:261 ../gtk/incall_view.c:272
+#: ../gtk/incall_view.c:266 ../gtk/incall_view.c:276
#, c-format
msgid ""
"download: %f\n"
"upload: %f (kbit/s)"
msgstr ""
-#: ../gtk/incall_view.c:267 ../gtk/incall_view.c:268
+#: ../gtk/incall_view.c:271 ../gtk/incall_view.c:272
#, c-format
msgid "%ix%i"
msgstr ""
-#: ../gtk/incall_view.c:297
+#: ../gtk/incall_view.c:301
#, c-format
msgid "%.3f seconds"
msgstr ""
-#: ../gtk/incall_view.c:395 ../gtk/main.ui.h:12
+#: ../gtk/incall_view.c:399 ../gtk/main.ui.h:12
msgid "Hang up"
msgstr ""
-#: ../gtk/incall_view.c:487
+#: ../gtk/incall_view.c:492
msgid "Calling..."
msgstr "播打..."
-#: ../gtk/incall_view.c:490 ../gtk/incall_view.c:700
+#: ../gtk/incall_view.c:495 ../gtk/incall_view.c:698
msgid "00::00::00"
msgstr "00::00::00"
-#: ../gtk/incall_view.c:501
+#: ../gtk/incall_view.c:506
msgid "Incoming call"
msgstr "來電"
-#: ../gtk/incall_view.c:538
+#: ../gtk/incall_view.c:543
msgid "good"
msgstr ""
-#: ../gtk/incall_view.c:540
+#: ../gtk/incall_view.c:545
msgid "average"
msgstr ""
-#: ../gtk/incall_view.c:542
+#: ../gtk/incall_view.c:547
msgid "poor"
msgstr ""
-#: ../gtk/incall_view.c:544
+#: ../gtk/incall_view.c:549
msgid "very poor"
msgstr ""
-#: ../gtk/incall_view.c:546
+#: ../gtk/incall_view.c:551
msgid "too bad"
msgstr ""
-#: ../gtk/incall_view.c:547 ../gtk/incall_view.c:563
+#: ../gtk/incall_view.c:552 ../gtk/incall_view.c:568
msgid "unavailable"
msgstr ""
-#: ../gtk/incall_view.c:662
+#: ../gtk/incall_view.c:660
msgid "Secured by SRTP"
msgstr ""
-#: ../gtk/incall_view.c:668
+#: ../gtk/incall_view.c:666
#, c-format
msgid "Secured by ZRTP - [auth token: %s]"
msgstr ""
-#: ../gtk/incall_view.c:674
+#: ../gtk/incall_view.c:672
msgid "Set unverified"
msgstr ""
-#: ../gtk/incall_view.c:674 ../gtk/main.ui.h:4
+#: ../gtk/incall_view.c:672 ../gtk/main.ui.h:4
msgid "Set verified"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In conference"
msgstr ""
-#: ../gtk/incall_view.c:695
+#: ../gtk/incall_view.c:693
msgid "In call"
msgstr "通話中"
-#: ../gtk/incall_view.c:731
+#: ../gtk/incall_view.c:729
msgid "Paused call"
msgstr "暫停通話"
-#: ../gtk/incall_view.c:744
+#: ../gtk/incall_view.c:742
#, c-format
msgid "%02i::%02i::%02i"
msgstr "%02i::%02i::%02i"
-#: ../gtk/incall_view.c:762
+#: ../gtk/incall_view.c:760
msgid "Call ended."
msgstr "通話結束。"
-#: ../gtk/incall_view.c:793
+#: ../gtk/incall_view.c:791
msgid "Transfer in progress"
msgstr ""
-#: ../gtk/incall_view.c:796
+#: ../gtk/incall_view.c:794
#, fuzzy
msgid "Transfer done."
msgstr "轉接"
-#: ../gtk/incall_view.c:799
+#: ../gtk/incall_view.c:797
#, fuzzy
msgid "Transfer failed."
msgstr "轉接"
-#: ../gtk/incall_view.c:843
+#: ../gtk/incall_view.c:841
msgid "Resume"
msgstr "繼續"
-#: ../gtk/incall_view.c:850 ../gtk/main.ui.h:9
+#: ../gtk/incall_view.c:848 ../gtk/main.ui.h:9
msgid "Pause"
msgstr "暫停"
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, c-format
msgid ""
"Recording into\n"
"%s %s"
msgstr ""
-#: ../gtk/incall_view.c:915
+#: ../gtk/incall_view.c:913
#, fuzzy
msgid "(Paused)"
msgstr "暫停"
@@ -780,6 +785,87 @@ msgstr ""
msgid "Downloading of remote configuration from %s failed."
msgstr ""
+#: ../gtk/audio_assistant.c:98
+msgid "No voice detected"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:99
+msgid "Too low"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:100
+msgid "Good"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:101
+msgid "Too loud"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:316
+#, fuzzy
+msgid ""
+"Welcome !\n"
+"This assistant will help you to configure audio settings for Linphone"
+msgstr ""
+"歡迎!\n"
+"這個助理會協助您使用電話的 SIP 帳號。"
+
+#: ../gtk/audio_assistant.c:326
+#, fuzzy
+msgid "Capture device"
+msgstr "捕捉裝置:"
+
+#: ../gtk/audio_assistant.c:327
+msgid "Recorded volume"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:331
+msgid "No voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:367
+#, fuzzy
+msgid "Playback device"
+msgstr "播放裝置"
+
+#: ../gtk/audio_assistant.c:368
+msgid "Play three beeps"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:400
+msgid "Press the record button and say some words"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:401
+msgid "Listen to your record voice"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:430
+msgid "Let's start Linphone now"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:488
+#, fuzzy
+msgid "Audio Assistant"
+msgstr "帳號設定助理"
+
+#: ../gtk/audio_assistant.c:498 ../gtk/main.ui.h:31
+#, fuzzy
+msgid "Audio assistant"
+msgstr "帳號設定助理"
+
+#: ../gtk/audio_assistant.c:503
+msgid "Mic Gain calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:509
+msgid "Speaker volume calibration"
+msgstr ""
+
+#: ../gtk/audio_assistant.c:514
+msgid "Record and Play"
+msgstr ""
+
#: ../gtk/main.ui.h:1
#, fuzzy
msgid "Callee name"
@@ -822,125 +908,125 @@ msgid "Call quality rating"
msgstr ""
#: ../gtk/main.ui.h:17
+msgid "All users"
+msgstr "所有使用者"
+
+#: ../gtk/main.ui.h:18
+msgid "Online users"
+msgstr "線上使用者"
+
+#: ../gtk/main.ui.h:19
+msgid "ADSL"
+msgstr "ADSL"
+
+#: ../gtk/main.ui.h:20
+msgid "Fiber Channel"
+msgstr "光纖通道"
+
+#: ../gtk/main.ui.h:21
+msgid "Default"
+msgstr "預設值"
+
+#: ../gtk/main.ui.h:22
msgid "_Options"
msgstr "選項(_O)"
-#: ../gtk/main.ui.h:18
+#: ../gtk/main.ui.h:23
#, fuzzy
msgid "Set configuration URI"
msgstr "確認"
-#: ../gtk/main.ui.h:19
+#: ../gtk/main.ui.h:24
msgid "Always start video"
msgstr ""
-#: ../gtk/main.ui.h:20
+#: ../gtk/main.ui.h:25
msgid "Enable self-view"
msgstr "啟用自拍檢視"
-#: ../gtk/main.ui.h:21
+#: ../gtk/main.ui.h:26
msgid "_Help"
msgstr "求助(_H)"
-#: ../gtk/main.ui.h:22
+#: ../gtk/main.ui.h:27
msgid "Show debug window"
msgstr "顯示除錯視窗"
-#: ../gtk/main.ui.h:23
+#: ../gtk/main.ui.h:28
msgid "_Homepage"
msgstr "官方網頁(_H)"
-#: ../gtk/main.ui.h:24
+#: ../gtk/main.ui.h:29
msgid "Check _Updates"
msgstr "檢查更新(_U)"
-#: ../gtk/main.ui.h:25
+#: ../gtk/main.ui.h:30
#, fuzzy
msgid "Account assistant"
msgstr "帳號設定助理"
-#: ../gtk/main.ui.h:26
+#: ../gtk/main.ui.h:32
msgid "SIP address or phone number:"
msgstr "SIP 位址或電話號碼:"
-#: ../gtk/main.ui.h:27
+#: ../gtk/main.ui.h:33
msgid "Initiate a new call"
msgstr "打出新電話"
-#: ../gtk/main.ui.h:28
+#: ../gtk/main.ui.h:34
msgid "Contacts"
msgstr "連絡人"
-#: ../gtk/main.ui.h:29
+#: ../gtk/main.ui.h:35
msgid "Search"
msgstr "搜尋"
-#: ../gtk/main.ui.h:30
+#: ../gtk/main.ui.h:36
msgid "Add contacts from directory"
msgstr "從目錄加入連絡人"
-#: ../gtk/main.ui.h:31
+#: ../gtk/main.ui.h:37
msgid "Add contact"
msgstr "加入聯絡人"
-#: ../gtk/main.ui.h:32
+#: ../gtk/main.ui.h:38
#, fuzzy
msgid "Recent calls"
msgstr "通話中"
-#: ../gtk/main.ui.h:33
+#: ../gtk/main.ui.h:39
msgid "My current identity:"
msgstr "我目前的使用者識別:"
-#: ../gtk/main.ui.h:34 ../gtk/tunnel_config.ui.h:7
+#: ../gtk/main.ui.h:40 ../gtk/tunnel_config.ui.h:7
msgid "Username"
msgstr "使用者名稱"
-#: ../gtk/main.ui.h:35 ../gtk/tunnel_config.ui.h:8
+#: ../gtk/main.ui.h:41 ../gtk/tunnel_config.ui.h:8
msgid "Password"
msgstr "密碼"
-#: ../gtk/main.ui.h:36
+#: ../gtk/main.ui.h:42
msgid "Internet connection:"
msgstr "網路連線:"
-#: ../gtk/main.ui.h:37
+#: ../gtk/main.ui.h:43
msgid "Automatically log me in"
msgstr "將我自動登入"
-#: ../gtk/main.ui.h:38 ../gtk/password.ui.h:3
+#: ../gtk/main.ui.h:44 ../gtk/password.ui.h:3
msgid "UserID"
msgstr "使用者ID"
-#: ../gtk/main.ui.h:39
+#: ../gtk/main.ui.h:45
msgid "Login information"
msgstr "登入資訊"
-#: ../gtk/main.ui.h:40
+#: ../gtk/main.ui.h:46
msgid "Welcome !"
msgstr "歡迎使用!"
-#: ../gtk/main.ui.h:41
-msgid "All users"
-msgstr "所有使用者"
-
-#: ../gtk/main.ui.h:42
-msgid "Online users"
-msgstr "線上使用者"
-
-#: ../gtk/main.ui.h:43
-msgid "ADSL"
-msgstr "ADSL"
-
-#: ../gtk/main.ui.h:44
-msgid "Fiber Channel"
-msgstr "光纖通道"
-
-#: ../gtk/main.ui.h:45
-msgid "Default"
-msgstr "預設值"
-
-#: ../gtk/main.ui.h:46
+#: ../gtk/main.ui.h:47
msgid "Delete"
msgstr ""
@@ -1062,23 +1148,32 @@ msgid "Contact params (optional):"
msgstr "路由 (選擇性):"
#: ../gtk/sip_account.ui.h:9
+msgid "AVPF regular RTCP interval (sec):"
+msgstr ""
+
+#: ../gtk/sip_account.ui.h:10
msgid "Route (optional):"
msgstr "路由 (選擇性):"
-#: ../gtk/sip_account.ui.h:10
+#: ../gtk/sip_account.ui.h:11
#, fuzzy
msgid "Transport"
msgstr "傳輸"
-#: ../gtk/sip_account.ui.h:11
+#: ../gtk/sip_account.ui.h:12
msgid "Register"
msgstr ""
-#: ../gtk/sip_account.ui.h:12
+#: ../gtk/sip_account.ui.h:13
msgid "Publish presence information"
msgstr "發布上線資訊"
-#: ../gtk/sip_account.ui.h:13
+#: ../gtk/sip_account.ui.h:14
+#, fuzzy
+msgid "Enable AVPF"
+msgstr "啟用"
+
+#: ../gtk/sip_account.ui.h:15
msgid "Configure a SIP account"
msgstr "設定 SIP 帳號"
@@ -1510,6 +1605,11 @@ msgstr "偏好的視訊解析度:"
#: ../gtk/call_statistics.ui.h:11
#, fuzzy
+msgid "RTP profile"
+msgstr "RTP 輸入過濾隱器"
+
+#: ../gtk/call_statistics.ui.h:12
+#, fuzzy
msgid "Call statistics and information"
msgstr "連絡人資訊"
@@ -1715,19 +1815,19 @@ msgstr "連線中..."
msgid "Please wait while fetching configuration from server..."
msgstr ""
-#: ../coreapi/linphonecore.c:238
+#: ../coreapi/linphonecore.c:242
msgid "aborted"
msgstr "已放棄"
-#: ../coreapi/linphonecore.c:241
+#: ../coreapi/linphonecore.c:245
msgid "completed"
msgstr "已完成"
-#: ../coreapi/linphonecore.c:244
+#: ../coreapi/linphonecore.c:248
msgid "missed"
msgstr "未接"
-#: ../coreapi/linphonecore.c:249
+#: ../coreapi/linphonecore.c:253
#, c-format
msgid ""
"%s at %s\n"
@@ -1742,77 +1842,77 @@ msgstr ""
"狀態:%s\n"
"持續時間:%i 分 %i 秒\n"
-#: ../coreapi/linphonecore.c:250
+#: ../coreapi/linphonecore.c:254
msgid "Outgoing call"
msgstr "去電"
-#: ../coreapi/linphonecore.c:1264
+#: ../coreapi/linphonecore.c:1287
msgid "Ready"
msgstr "準備就緒"
-#: ../coreapi/linphonecore.c:1372
+#: ../coreapi/linphonecore.c:2248
#, fuzzy
msgid "Configuring"
msgstr "確認"
-#: ../coreapi/linphonecore.c:2331
+#: ../coreapi/linphonecore.c:2410
msgid "Looking for telephone number destination..."
msgstr "尋找電話號碼目的端..."
-#: ../coreapi/linphonecore.c:2334
+#: ../coreapi/linphonecore.c:2413
msgid "Could not resolve this number."
msgstr "無法解析這個號碼。"
#. must be known at that time
-#: ../coreapi/linphonecore.c:2609
+#: ../coreapi/linphonecore.c:2695
msgid "Contacting"
msgstr "正在連絡"
-#: ../coreapi/linphonecore.c:2616
+#: ../coreapi/linphonecore.c:2702
msgid "Could not call"
msgstr "無法通話"
-#: ../coreapi/linphonecore.c:2765
+#: ../coreapi/linphonecore.c:2852
msgid "Sorry, we have reached the maximum number of simultaneous calls"
msgstr "抱歉,我們已達瀏同步通話的最大數目"
-#: ../coreapi/linphonecore.c:2952
+#: ../coreapi/linphonecore.c:3022
msgid "is contacting you"
msgstr "正在連絡您"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid " and asked autoanswer."
msgstr "並要求自動接聽。"
-#: ../coreapi/linphonecore.c:2953
+#: ../coreapi/linphonecore.c:3023
msgid "."
msgstr "."
-#: ../coreapi/linphonecore.c:3020
+#: ../coreapi/linphonecore.c:3139
msgid "Modifying call parameters..."
msgstr "修改通話參數..."
-#: ../coreapi/linphonecore.c:3362
+#: ../coreapi/linphonecore.c:3469
msgid "Connected."
msgstr "已連線。"
-#: ../coreapi/linphonecore.c:3388
+#: ../coreapi/linphonecore.c:3495
msgid "Call aborted"
msgstr "通話已放棄"
-#: ../coreapi/linphonecore.c:3581
+#: ../coreapi/linphonecore.c:3685
msgid "Could not pause the call"
msgstr "無法暫停通話"
-#: ../coreapi/linphonecore.c:3586
+#: ../coreapi/linphonecore.c:3690
msgid "Pausing the current call..."
msgstr "暫停目前的通話..."
-#: ../coreapi/misc.c:394
+#: ../coreapi/misc.c:425
msgid "Stun lookup in progress..."
msgstr "正在進行 Stun 搜尋..."
-#: ../coreapi/misc.c:576
+#: ../coreapi/misc.c:607
msgid "ICE local candidates gathering in progress..."
msgstr ""
@@ -1869,14 +1969,14 @@ msgstr "時間長度"
msgid "Unknown-bug"
msgstr "不明錯誤"
-#: ../coreapi/proxy.c:209
+#: ../coreapi/proxy.c:279
msgid ""
"The sip proxy address you entered is invalid, it must start with \"sip:\" "
"followed by a hostname."
msgstr ""
"您輸入的 sip 代理位址是無效的,它必須要以「sip:」開頭,後面接主機名稱。"
-#: ../coreapi/proxy.c:215
+#: ../coreapi/proxy.c:285
msgid ""
"The sip identity you entered is invalid.\n"
"It should look like sip:username@proxydomain, such as sip:alice@example.net"
@@ -1884,134 +1984,136 @@ msgstr ""
"您輸入的 sip 身分是無效的。\n"
"它應該看起來像 sip:使用者名稱@代理網域,像是 sip:alice@example.net"
-#: ../coreapi/proxy.c:1125
+#: ../coreapi/proxy.c:1299
#, c-format
msgid "Could not login as %s"
msgstr "無法以 %s 登入"
-#: ../coreapi/callbacks.c:289
+#: ../coreapi/callbacks.c:354
msgid "Remote ringing."
msgstr "遠端響鈴。"
-#: ../coreapi/callbacks.c:305
+#: ../coreapi/callbacks.c:370
msgid "Remote ringing..."
msgstr "遠端響鈴..."
-#: ../coreapi/callbacks.c:316
+#: ../coreapi/callbacks.c:381
msgid "Early media."
msgstr "早期媒體。"
-#: ../coreapi/callbacks.c:367
+#: ../coreapi/callbacks.c:432
#, c-format
msgid "Call with %s is paused."
msgstr "和 %s 的通話已暫停。"
-#: ../coreapi/callbacks.c:380
+#: ../coreapi/callbacks.c:445
#, c-format
msgid "Call answered by %s - on hold."
msgstr "通話由 %s 接聽 - 保留中。"
-#: ../coreapi/callbacks.c:391
+#: ../coreapi/callbacks.c:456
msgid "Call resumed."
msgstr "通話已繼續。"
-#: ../coreapi/callbacks.c:396
+#: ../coreapi/callbacks.c:461
#, c-format
msgid "Call answered by %s."
msgstr "通話由 %s 接聽。"
-#: ../coreapi/callbacks.c:414
+#: ../coreapi/callbacks.c:480
msgid "Incompatible, check codecs or security settings..."
msgstr ""
-#: ../coreapi/callbacks.c:463
+#: ../coreapi/callbacks.c:531
#, fuzzy
msgid "We have been resumed."
msgstr "我們要繼續了..."
-#: ../coreapi/callbacks.c:471
+#: ../coreapi/callbacks.c:541
msgid "We are paused by other party."
msgstr ""
-#: ../coreapi/callbacks.c:487
+#: ../coreapi/callbacks.c:558
msgid "Call is updated by remote."
msgstr ""
-#: ../coreapi/callbacks.c:558
+#: ../coreapi/callbacks.c:637
msgid "Call terminated."
msgstr "通話已終止。"
-#: ../coreapi/callbacks.c:586
+#: ../coreapi/callbacks.c:666
msgid "User is busy."
msgstr "使用者現正忙碌。"
-#: ../coreapi/callbacks.c:587
+#: ../coreapi/callbacks.c:667
msgid "User is temporarily unavailable."
msgstr "使用者暫時無法聯繫。"
#. char *retrymsg=_("%s. Retry after %i minute(s).");
-#: ../coreapi/callbacks.c:589
+#: ../coreapi/callbacks.c:669
msgid "User does not want to be disturbed."
msgstr "使用者不想要被打擾。"
-#: ../coreapi/callbacks.c:590
+#: ../coreapi/callbacks.c:670
msgid "Call declined."
msgstr "通話被拒接。"
-#: ../coreapi/callbacks.c:603
-msgid "No response."
-msgstr "沒有回應。"
+#: ../coreapi/callbacks.c:685
+msgid "Request timeout."
+msgstr ""
-#: ../coreapi/callbacks.c:607
-msgid "Protocol error."
-msgstr "通訊協定錯誤。"
-
-#: ../coreapi/callbacks.c:623
+#: ../coreapi/callbacks.c:716
msgid "Redirected"
msgstr "已重新導向"
-#: ../coreapi/callbacks.c:665
+#: ../coreapi/callbacks.c:766
msgid "Incompatible media parameters."
msgstr ""
-#: ../coreapi/callbacks.c:677
+#: ../coreapi/callbacks.c:777
msgid "Call failed."
msgstr "通話失敗。"
-#: ../coreapi/callbacks.c:751
+#: ../coreapi/callbacks.c:852
#, c-format
msgid "Registration on %s successful."
msgstr "在 %s 註冊成功。"
-#: ../coreapi/callbacks.c:752
+#: ../coreapi/callbacks.c:853
#, c-format
msgid "Unregistration on %s done."
msgstr "在 %s 取消註冊完成。"
-#: ../coreapi/callbacks.c:772
+#: ../coreapi/callbacks.c:875
msgid "no response timeout"
msgstr "沒有回應逾時"
-#: ../coreapi/callbacks.c:775
+#: ../coreapi/callbacks.c:878
#, c-format
msgid "Registration on %s failed: %s"
msgstr "在 %s 註冊失敗:%s"
-#: ../coreapi/callbacks.c:785
+#: ../coreapi/callbacks.c:885
msgid "Service unavailable, retrying"
msgstr ""
-#: ../coreapi/linphonecall.c:142
+#: ../coreapi/linphonecall.c:175
#, fuzzy, c-format
msgid "Authentication token is %s"
msgstr "驗證失敗"
-#: ../coreapi/linphonecall.c:2678
+#: ../coreapi/linphonecall.c:2994
#, c-format
msgid "You have missed %i call."
msgid_plural "You have missed %i calls."
msgstr[0] "您有 %i 通未接來電。"
+#~ msgid "No response."
+#~ msgstr "沒有回應。"
+
+#~ msgid "Protocol error."
+#~ msgstr "通訊協定錯誤。"
+
#~ msgid ""
#~ "Could not parse given sip address. A sip url usually looks like sip:"
#~ "user@domain"
@@ -2203,9 +2305,6 @@ msgstr[0] "您有 %i 通未接來電。"
#~ msgid "RTP output filter"
#~ msgstr "RTP 輸出過濾隱器"
-#~ msgid "RTP input filter"
-#~ msgstr "RTP 輸入過濾隱器"
-
#~ msgid "The free and wonderful speex codec"
#~ msgstr "免費好用的 speex 編解碼器"
diff --git a/tester/Makefile.am b/tester/Makefile.am
index 1cda152c7..348306bca 100644
--- a/tester/Makefile.am
+++ b/tester/Makefile.am
@@ -20,26 +20,27 @@ liblinphonetester_la_SOURCES = tester.c \
eventapi_tester.c \
flexisip_tester.c \
stun_tester.c \
- remote_provisioning_tester.c
+ remote_provisioning_tester.c \
+ quality_reporting_tester.c
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) -DIN_LINPHONE $(ORTP_CFLAGS) $(MEDIASTREAMER_CFLAGS) $(CUNIT_CFLAGS) $(BELLESIP_CFLAGS) $(LIBXML2_CFLAGS)
+AM_CFLAGS = $(STRICT_OPTIONS) -DIN_LINPHONE $(ORTP_CFLAGS) $(MEDIASTREAMER_CFLAGS) $(CUNIT_CFLAGS) $(BELLESIP_CFLAGS) $(LIBXML2_CFLAGS) $(SQLITE3_CFLAGS)
if !BUILD_IOS
noinst_PROGRAMS = liblinphone_tester
-liblinphone_tester_SOURCES = liblinphone_tester.c
-liblinphone_tester_LDADD = $(top_builddir)/coreapi/liblinphone.la liblinphonetester.la
+liblinphone_tester_SOURCES = liblinphone_tester.c
+liblinphone_tester_LDADD = $(top_builddir)/coreapi/liblinphone.la liblinphonetester.la -lm
endif
test: liblinphone_tester
- ./liblinphone_tester --config $(abs_srcdir)
+ ./liblinphone_tester --config $(abs_srcdir)
else !BUILD_CUNIT_TESTS
diff --git a/tester/call_tester.c b/tester/call_tester.c
index d20cf1fd6..7e3780279 100644
--- a/tester/call_tester.c
+++ b/tester/call_tester.c
@@ -1,19 +1,19 @@
/*
- liblinphone_tester - liblinphone test suite
- Copyright (C) 2013 Belledonne Communications SARL
+ liblinphone_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 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.
+ 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 .
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
*/
@@ -239,15 +239,176 @@ bool_t call(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr){
return call_with_params(caller_mgr,callee_mgr,NULL,NULL);
}
-static void simple_call(void) {
- LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
- LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+static void end_call(LinphoneCoreManager *m1, LinphoneCoreManager *m2){
+ linphone_core_terminate_all_calls(m1->lc);
+ CU_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m1->stat.number_of_LinphoneCallEnd,1));
+ CU_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m2->stat.number_of_LinphoneCallEnd,1));
+}
+static void simple_call(void) {
+ int begin;
+ int leaked_objects;
+ LinphoneCoreManager* marie;
+ LinphoneCoreManager* pauline;
+
+ belle_sip_object_enable_leak_detector(TRUE);
+ begin=belle_sip_object_get_object_count();
+
+ marie = linphone_core_manager_new( "marie_rc");
+ pauline = linphone_core_manager_new( "pauline_rc");
CU_ASSERT_TRUE(call(pauline,marie));
liblinphone_tester_check_rtcp(marie,pauline);
-
+ end_call(marie,pauline);
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
+
+ leaked_objects=belle_sip_object_get_object_count()-begin;
+ CU_ASSERT_TRUE(leaked_objects==0);
+ if (leaked_objects>0){
+ belle_sip_object_dump_active_objects();
+ }
+}
+
+static void call_outbound_with_multiple_proxy() {
+ LinphoneCoreManager* pauline = linphone_core_manager_new2( "pauline_rc", FALSE);
+ LinphoneCoreManager* marie = linphone_core_manager_new2( "marie_rc", FALSE);
+
+ LinphoneProxyConfig* lpc = NULL;
+ LinphoneProxyConfig* registered_lpc = linphone_proxy_config_new();
+
+ linphone_core_get_default_proxy(marie->lc, &lpc);
+ linphone_core_set_default_proxy(marie->lc,NULL);
+
+ CU_ASSERT_FATAL(lpc != NULL);
+ CU_ASSERT_FATAL(registered_lpc != NULL);
+
+ // create new LPC that will successfully register
+ linphone_proxy_config_set_identity(registered_lpc, linphone_proxy_config_get_identity(lpc));
+ linphone_proxy_config_set_server_addr(registered_lpc, linphone_proxy_config_get_addr(lpc));
+ linphone_proxy_config_set_route(registered_lpc, linphone_proxy_config_get_route(lpc));
+ linphone_proxy_config_enable_register(registered_lpc, TRUE);
+
+ linphone_core_add_proxy_config(marie->lc, registered_lpc);
+
+ // set first LPC to unreacheable proxy addr
+ linphone_proxy_config_edit(lpc);
+ linphone_proxy_config_set_server_addr(lpc,"12.13.14.15:5223;transport=udp");
+ linphone_proxy_config_set_route(lpc, "12.13.14.15:5223;transport=udp;lr");
+ linphone_proxy_config_done(lpc);
+
+ CU_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &pauline->stat.number_of_LinphoneRegistrationOk, 1, 2000));
+
+ CU_ASSERT_TRUE(wait_for_until(marie->lc, NULL, &marie->stat.number_of_LinphoneRegistrationProgress, 2, 200));
+ CU_ASSERT_TRUE(wait_for_until(marie->lc, NULL, &marie->stat.number_of_LinphoneRegistrationOk, 1, 2000));
+
+ // calling marie should go through the second proxy config
+ CU_ASSERT_TRUE(call(marie, pauline));
+
+}
+
+#if 0 /* TODO: activate test when the implementation is ready */
+static void multiple_answers_call() {
+ /* Scenario is this: pauline calls marie, which is registered 2 times.
+ Both linphones answer at the same time, and only one should get the
+ call running, the other should be terminated */
+ char ringbackpath[256];
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc" );
+ LinphoneCoreManager* marie1 = linphone_core_manager_new( "marie_rc" );
+ LinphoneCoreManager* marie2 = linphone_core_manager_new( "marie_rc" );
+
+ LinphoneCall* call1, *call2;
+
+ MSList* lcs = ms_list_append(NULL,pauline->lc);
+ lcs = ms_list_append(lcs,marie1->lc);
+ lcs = ms_list_append(lcs,marie2->lc);
+
+ linphone_core_use_files(pauline->lc, TRUE);
+ linphone_core_use_files(marie1->lc, TRUE);
+ linphone_core_use_files(marie2->lc, TRUE);
+
+ snprintf(ringbackpath,sizeof(ringbackpath), "%s/sounds/hello8000.wav" /*use hello because rinback is too short*/, liblinphone_tester_file_prefix);
+
+ CU_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &pauline->stat.number_of_LinphoneRegistrationOk, 1, 2000));
+
+ CU_ASSERT_PTR_NOT_NULL( linphone_core_invite_address(pauline->lc, marie1->identity ) );
+
+ CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallIncomingReceived, 1, 2000));
+ CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived, 1, 2000));
+ CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingProgress, 1, 2000));
+
+ // marie 1 and 2 answer at the same time
+ call1 = linphone_core_get_current_call(marie1->lc);
+ call2 = linphone_core_get_current_call(marie2->lc);
+
+ CU_ASSERT_PTR_NOT_NULL_FATAL(call1);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(call2);
+
+ CU_ASSERT_EQUAL( linphone_core_accept_call(marie1->lc, call1), 0);
+ CU_ASSERT_EQUAL( linphone_core_accept_call(marie2->lc, call2), 0);
+
+ CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) );
+ CU_ASSERT_TRUE( wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) );
+ CU_ASSERT_TRUE( wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallEnd, 1, 2000) );
+
+
+ linphone_core_manager_destroy(pauline);
+ linphone_core_manager_destroy(marie1);
+ linphone_core_manager_destroy(marie2);
+}
+#endif
+
+static void multiple_answers_call_with_media_relay() {
+
+ /* Scenario is this: pauline calls marie, which is registered 2 times.
+ * Both linphones answer at the same time, and only one should get the
+ * call running, the other should be terminated */
+ char ringbackpath[256];
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc" );
+ LinphoneCoreManager* marie1 = linphone_core_manager_new( "marie_rc" );
+ LinphoneCoreManager* marie2 = linphone_core_manager_new( "marie_rc" );
+
+ LinphoneCall* call1, *call2;
+
+ MSList* lcs = ms_list_append(NULL,pauline->lc);
+ lcs = ms_list_append(lcs,marie1->lc);
+ lcs = ms_list_append(lcs,marie2->lc);
+
+ linphone_core_use_files(pauline->lc, TRUE);
+ linphone_core_use_files(marie1->lc, TRUE);
+ linphone_core_use_files(marie2->lc, TRUE);
+
+ linphone_core_set_user_agent(pauline->lc, "Natted Linphone", NULL);
+ linphone_core_set_user_agent(marie1->lc, "Natted Linphone", NULL);
+ linphone_core_set_user_agent(marie2->lc, "Natted Linphone", NULL);
+
+ snprintf(ringbackpath,sizeof(ringbackpath), "%s/sounds/hello8000.wav" /*use hello because rinback is too short*/, liblinphone_tester_file_prefix);
+
+ CU_ASSERT_TRUE(wait_for_until(pauline->lc, NULL, &pauline->stat.number_of_LinphoneRegistrationOk, 1, 2000));
+
+ CU_ASSERT_PTR_NOT_NULL( linphone_core_invite_address(pauline->lc, marie1->identity ) );
+
+ CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallIncomingReceived, 1, 2000));
+ CU_ASSERT_TRUE(wait_for_list(lcs,&marie2->stat.number_of_LinphoneCallIncomingReceived, 1, 2000));
+ CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallOutgoingProgress, 1, 2000));
+
+ // marie 1 and 2 answer at the same time
+ call1 = linphone_core_get_current_call(marie1->lc);
+ call2 = linphone_core_get_current_call(marie2->lc);
+
+ CU_ASSERT_PTR_NOT_NULL_FATAL(call1);
+ CU_ASSERT_PTR_NOT_NULL_FATAL(call2);
+
+ CU_ASSERT_EQUAL( linphone_core_accept_call(marie1->lc, call1), 0);
+ CU_ASSERT_EQUAL( linphone_core_accept_call(marie2->lc, call2), 0);
+
+ CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) );
+ CU_ASSERT_TRUE( wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallStreamsRunning, 1, 2000) );
+ CU_ASSERT_TRUE( wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallEnd, 1, 2000) );
+
+
+ linphone_core_manager_destroy(pauline);
+ linphone_core_manager_destroy(marie1);
+ linphone_core_manager_destroy(marie2);
}
static void call_with_specified_codec_bitrate(void) {
@@ -259,17 +420,17 @@ static void call_with_specified_codec_bitrate(void) {
ms_warning("opus codec not supported, test skipped.");
goto end;
}
-
+
disable_all_codecs_except_one(marie->lc,"opus");
disable_all_codecs_except_one(pauline->lc,"opus");
-
+
linphone_core_set_payload_type_bitrate(marie->lc,
linphone_core_find_payload_type(marie->lc,"opus",48000,-1),
50);
linphone_core_set_payload_type_bitrate(pauline->lc,
linphone_core_find_payload_type(pauline->lc,"opus",48000,-1),
24);
-
+
CU_ASSERT_TRUE((call_ok=call(pauline,marie)));
if (!call_ok) goto end;
liblinphone_tester_check_rtcp(marie,pauline);
@@ -552,20 +713,23 @@ static void call_with_no_sdp(void) {
static bool_t check_ice(LinphoneCoreManager* caller, LinphoneCoreManager* callee, LinphoneIceState state) {
LinphoneCall *c1,*c2;
- bool_t success=FALSE;
+ bool_t audio_success=FALSE;
+ bool_t video_success=FALSE;
int i;
+ bool_t video_enabled;
c1=linphone_core_get_current_call(caller->lc);
c2=linphone_core_get_current_call(callee->lc);
CU_ASSERT_PTR_NOT_NULL(c1);
CU_ASSERT_PTR_NOT_NULL(c2);
-
+ CU_ASSERT_EQUAL(linphone_call_params_video_enabled(linphone_call_get_current_params(c1)),linphone_call_params_video_enabled(linphone_call_get_current_params(c2)));
+ video_enabled=linphone_call_params_video_enabled(linphone_call_get_current_params(c1));
for (i=0;i<200;i++){
if ((c1 != NULL) && (c2 != NULL)) {
- if (linphone_call_get_audio_stats(c1)->ice_state==LinphoneIceStateHostConnection &&
- linphone_call_get_audio_stats(c2)->ice_state==LinphoneIceStateHostConnection ){
- success=TRUE;
+ if (linphone_call_get_audio_stats(c1)->ice_state==state &&
+ linphone_call_get_audio_stats(c2)->ice_state==state ){
+ audio_success=TRUE;
break;
}
linphone_core_iterate(caller->lc);
@@ -574,6 +738,21 @@ static bool_t check_ice(LinphoneCoreManager* caller, LinphoneCoreManager* callee
ms_usleep(50000);
}
+ if (video_enabled){
+ for (i=0;i<200;i++){
+ if ((c1 != NULL) && (c2 != NULL)) {
+ if (linphone_call_get_video_stats(c1)->ice_state==state &&
+ linphone_call_get_video_stats(c2)->ice_state==state ){
+ video_success=TRUE;
+ break;
+ }
+ linphone_core_iterate(caller->lc);
+ linphone_core_iterate(callee->lc);
+ }
+ ms_usleep(50000);
+ }
+ }
+
/*make sure encryption mode are preserved*/
if (c1) {
const LinphoneCallParams* call_param = linphone_call_get_current_params(c1);
@@ -584,7 +763,7 @@ static bool_t check_ice(LinphoneCoreManager* caller, LinphoneCoreManager* callee
CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(call_param),linphone_core_get_media_encryption(callee->lc));
}
- return success;
+ return video_enabled ? audio_success && video_success : audio_success;
}
static void _call_with_ice_base(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t caller_with_ice, bool_t callee_with_ice, bool_t random_ports) {
@@ -645,9 +824,9 @@ static void call_with_ice_no_sdp(void){
linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce);
linphone_core_set_stun_server(pauline->lc,"stun.linphone.org");
-
+
call(pauline,marie);
-
+
liblinphone_tester_check_rtcp(marie,pauline);
linphone_core_manager_destroy(marie);
@@ -677,11 +856,11 @@ static void call_with_custom_headers(void) {
*pauline_remote_contact,
*marie_remote_contact,
*marie_remote_contact_header;
-
+ LinphoneAddress* marie_identity;
char* tmp=linphone_address_as_string_uri_only(marie->identity);
char tmp2[256];
snprintf(tmp2,sizeof(tmp2),"%s?uriHeader=myUriHeader",tmp);
- LinphoneAddress* marie_identity=linphone_address_new(tmp2);
+ marie_identity=linphone_address_new(tmp2);
ms_free(tmp);
linphone_address_destroy(marie->identity);
marie->identity=marie_identity;
@@ -950,6 +1129,9 @@ static void video_call_base(LinphoneCoreManager* pauline,LinphoneCoreManager* ma
marie_call=linphone_core_get_current_call(marie->lc);
pauline_call=linphone_core_get_current_call(pauline->lc);
+ linphone_call_params_destroy(caller_params);
+ linphone_call_params_destroy(callee_params);
+
if (marie_call && pauline_call ) {
CU_ASSERT_TRUE(linphone_call_log_video_enabled(linphone_call_get_call_log(marie_call)));
CU_ASSERT_TRUE(linphone_call_log_video_enabled(linphone_call_get_call_log(pauline_call)));
@@ -982,6 +1164,80 @@ static void video_call_no_sdp(void) {
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
}
+
+static void call_with_ice_video_to_novideo(void) {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneVideoPolicy vpol={0};
+ vpol.automatically_initiate=TRUE;
+ linphone_core_set_video_policy(pauline->lc,&vpol);
+ vpol.automatically_initiate=FALSE;
+ linphone_core_set_video_policy(marie->lc,&vpol);
+ _call_with_ice_base(pauline,marie,TRUE,TRUE,TRUE);
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+static void call_with_ice_video_added(void) {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneVideoPolicy vpol={0};
+ linphone_core_set_video_policy(pauline->lc,&vpol);
+ linphone_core_set_video_policy(marie->lc,&vpol);
+
+ linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce);
+ linphone_core_set_stun_server(marie->lc,"stun.linphone.org");
+
+
+ linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce);
+ linphone_core_set_stun_server(pauline->lc,"stun.linphone.org");
+
+
+ if (1){
+ linphone_core_set_audio_port(marie->lc,-1);
+ linphone_core_set_video_port(marie->lc,-1);
+ linphone_core_set_audio_port(pauline->lc,-1);
+ linphone_core_set_video_port(pauline->lc,-1);
+ }
+
+ CU_ASSERT_TRUE(call(pauline,marie));
+ CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection));
+ /*wait for ICE reINVITEs to complete*/
+ CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2)
+ &&
+ wait_for(pauline->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2));
+ CU_ASSERT_TRUE(add_video(pauline,marie));
+ CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection));
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+static void video_call_with_ice_no_matching_audio_codecs(void) {
+ LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc");
+ LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_rc");
+ LinphoneCall *out_call;
+
+ linphone_core_enable_payload_type(marie->lc, linphone_core_find_payload_type(marie->lc, "PCMU", 8000, 1), FALSE); /* Disable PCMU */
+ linphone_core_enable_payload_type(marie->lc, linphone_core_find_payload_type(marie->lc, "PCMA", 8000, 1), TRUE); /* Enable PCMA */
+ linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce);
+ linphone_core_set_stun_server(marie->lc, "stun.linphone.org");
+ linphone_core_set_firewall_policy(pauline->lc, LinphonePolicyUseIce);
+ linphone_core_set_stun_server(pauline->lc, "stun.linphone.org");
+
+ out_call = linphone_core_invite(marie->lc, "pauline");
+ linphone_call_ref(out_call);
+ CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingInit, 1));
+
+ /* flexisip will retain the 488 until the "urgent reply" timeout arrives. */
+ CU_ASSERT_TRUE(wait_for_until(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallError, 1, 6000));
+ CU_ASSERT_EQUAL(linphone_call_get_reason(out_call), LinphoneReasonNotAcceptable);
+ CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallIncomingReceived, 0);
+
+ linphone_call_unref(out_call);
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
#endif /*VIDEO_ENABLED*/
static void _call_with_media_relay(bool_t random_ports) {
@@ -1142,6 +1398,7 @@ static void call_waiting_indication_with_param(bool_t enable_caller_privacy) {
LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc");
char hellopath[256];
MSList *iterator;
+ MSList* lcs;
LinphoneCall* pauline_called_by_marie;
LinphoneCall* pauline_called_by_laure=NULL;
LinphoneCallParams *laure_params=linphone_core_create_default_call_parameters(laure->lc);
@@ -1150,7 +1407,7 @@ static void call_waiting_indication_with_param(bool_t enable_caller_privacy) {
if (enable_caller_privacy)
linphone_call_params_set_privacy(marie_params,LinphonePrivacyId);
- MSList* lcs=ms_list_append(NULL,marie->lc);
+ lcs=ms_list_append(NULL,marie->lc);
lcs=ms_list_append(lcs,pauline->lc);
lcs=ms_list_append(lcs,laure->lc);
@@ -1200,7 +1457,8 @@ static void call_waiting_indication_with_param(bool_t enable_caller_privacy) {
if (pauline_called_by_laure && enable_caller_privacy )
CU_ASSERT_EQUAL(linphone_call_params_get_privacy(linphone_call_get_current_params(pauline_called_by_laure)),LinphonePrivacyId);
-
+ /*wait a bit for ACK to be sent*/
+ wait_for_list(lcs,NULL,0,1000);
linphone_core_terminate_all_calls(pauline->lc);
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000));
@@ -1221,10 +1479,8 @@ static void call_waiting_indication_with_privacy(void) {
call_waiting_indication_with_param(TRUE);
}
-static void simple_conference(void) {
- LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
- LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
- LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc");
+static void simple_conference_base(LinphoneCoreManager* marie, LinphoneCoreManager* pauline, LinphoneCoreManager* laure) {
+
stats initial_marie_stat;
stats initial_pauline_stat;
stats initial_laure_stat;
@@ -1266,6 +1522,18 @@ static void simple_conference(void) {
CU_ASSERT_TRUE(linphone_core_is_in_conference(marie->lc));
CU_ASSERT_EQUAL(linphone_core_get_conference_size(marie->lc),3)
+ /*
+ * FIXME: check_ice cannot work as it is today because there is no current call for the party that hosts the conference
+ if (linphone_core_get_firewall_policy(marie->lc) == LinphonePolicyUseIce) {
+ if (linphone_core_get_firewall_policy(pauline->lc) == LinphonePolicyUseIce) {
+ check_ice(marie,pauline,LinphoneIceStateHostConnection);
+ }
+ if (linphone_core_get_firewall_policy(laure->lc) == LinphonePolicyUseIce) {
+ check_ice(marie,laure,LinphoneIceStateHostConnection);
+ }
+ }
+ */
+
linphone_core_terminate_conference(marie->lc);
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000));
@@ -1273,10 +1541,35 @@ static void simple_conference(void) {
CU_ASSERT_TRUE(wait_for_list(lcs,&laure->stat.number_of_LinphoneCallEnd,1,2000));
+
+ ms_list_free(lcs);
+}
+static void simple_conference(void) {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc");
+ simple_conference_base(marie,pauline,laure);
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+ linphone_core_manager_destroy(laure);
+}
+
+static void simple_conference_with_ice(void) {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc");
+
+ linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce);
+ linphone_core_set_stun_server(marie->lc,"stun.linphone.org");
+ linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce);
+ linphone_core_set_stun_server(pauline->lc,"stun.linphone.org");
+ linphone_core_set_firewall_policy(laure->lc,LinphonePolicyUseIce);
+ linphone_core_set_stun_server(laure->lc,"stun.linphone.org");
+
+ simple_conference_base(marie,pauline,laure);
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
linphone_core_manager_destroy(laure);
- ms_list_free(lcs);
}
static void srtp_call() {
@@ -2034,100 +2327,203 @@ static void call_rejected_without_403_because_wrong_credentials_no_auth_req_cb()
call_rejected_because_wrong_credentials_with_params("tester-no-403",FALSE);
}
-void create_call_for_statistics_tests(
- LinphoneCoreManager* marie,
- LinphoneCoreManager* pauline,
- LinphoneCall** call_marie,
- LinphoneCall** call_pauline) {
- CU_ASSERT_TRUE(call(pauline,marie));
- *call_marie = linphone_core_get_current_call(marie->lc);
- *call_pauline = linphone_core_get_current_call(pauline->lc);
- CU_ASSERT_PTR_NOT_NULL(*call_marie);
- CU_ASSERT_PTR_NOT_NULL(*call_pauline);
-}
+#ifdef VIDEO_ENABLED
+/*this is call forking with early media managed at client side (not by flexisip server)*/
+static void multiple_early_media(void) {
+ LinphoneCoreManager* marie1 = linphone_core_manager_new("marie_early_rc");
+ LinphoneCoreManager* marie2 = linphone_core_manager_new("marie_early_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new("pauline_tcp_rc");
+ MSList *lcs=NULL;
+ LinphoneCallParams *params=linphone_core_create_default_call_parameters(pauline->lc);
+ LinphoneVideoPolicy pol;
+ LinphoneCall *marie1_call;
+ LinphoneCall *marie2_call;
+ LinphoneCall *pauline_call;
+ LinphoneInfoMessage *info;
+ int dummy=0;
+ char ringbackpath[256];
+ snprintf(ringbackpath,sizeof(ringbackpath), "%s/sounds/hello8000.wav" /*use hello because rinback is too short*/, liblinphone_tester_file_prefix);
-static void statistics_not_used_without_config() {
- LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
- LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
- LinphoneCall* call_marie = NULL;
- LinphoneCall* call_pauline = NULL;
+ pol.automatically_accept=1;
+ pol.automatically_initiate=1;
- create_call_for_statistics_tests(marie, pauline, &call_marie, &call_pauline);
+ linphone_core_enable_video(pauline->lc,TRUE,TRUE);
- // marie has stats collection enabled since pauline has not
- CU_ASSERT_TRUE(linphone_proxy_config_send_statistics_enabled(call_marie->dest_proxy));
- CU_ASSERT_FALSE(linphone_proxy_config_send_statistics_enabled(call_pauline->dest_proxy));
+ linphone_core_enable_video(marie1->lc,TRUE,TRUE);
+ linphone_core_set_video_policy(marie1->lc,&pol);
+ /*use playfile for marie1 to avoid locking on capture card*/
+ linphone_core_use_files(marie1->lc,TRUE);
+ linphone_core_set_play_file(marie1->lc,ringbackpath);
- CU_ASSERT_EQUAL(strcmp("sip:collector@sip.example.org",
- linphone_proxy_config_get_statistics_collector(call_marie->dest_proxy)), 0);
+ 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);
+ /*use playfile for marie2 to avoid locking on capture card*/
+ linphone_core_use_files(marie2->lc,TRUE);
+ linphone_core_set_play_file(marie2->lc,ringbackpath);
- // this field should be already filled
- CU_ASSERT_PTR_NOT_NULL(call_marie->log->reports[0]->info.local_addr.ip);
- CU_ASSERT_PTR_NULL(call_pauline->log->reports[0]->info.local_addr.ip);
- // but not this one since it is updated at the end of call
- CU_ASSERT_PTR_NULL(call_marie->log->reports[0]->dialog_id);
+ lcs=ms_list_append(lcs,marie1->lc);
+ lcs=ms_list_append(lcs,marie2->lc);
+ lcs=ms_list_append(lcs,pauline->lc);
- linphone_core_manager_destroy(marie);
+ 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);
+
+ CU_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallIncomingEarlyMedia,1,3000));
+ 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));
+
+ 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>70);
+ CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>70);
+ CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie2_call)->download_bandwidth>70);
+
+ 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,1000);
+ CU_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth>71);
+ CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth>71);
+
+ /*send an INFO in reverse side to check that dialogs are properly established*/
+ info=linphone_core_create_info_message(marie1->lc);
+ linphone_call_send_info_message(marie1_call,info);
+ CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_inforeceived,1,2000));
+
+ linphone_core_terminate_all_calls(pauline->lc);
+ CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000));
+ CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallEnd,1,2000));
+
+ ms_list_free(lcs);
+ linphone_core_manager_destroy(marie1);
+ linphone_core_manager_destroy(marie2);
linphone_core_manager_destroy(pauline);
}
-static void statistics_not_sent_if_call_not_started() {
- LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
- LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
- LinphoneCallLog* out_call_log;
- LinphoneCall* out_call;
+#endif
- linphone_core_set_max_calls(pauline->lc,0);
- out_call = linphone_core_invite(marie->lc,"pauline");
- linphone_call_ref(out_call);
+static void profile_call(bool_t avpf1, bool_t srtp1, bool_t avpf2, bool_t srtp2, const char *expected_profile) {
+ LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc");
+ LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_rc");
+ LinphoneProxyConfig *lpc;
+ const LinphoneCallParams *params;
- CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallError,1, 10000));
- CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1);
-
- if (ms_list_size(linphone_core_get_call_logs(marie->lc))>0) {
- CU_ASSERT_PTR_NOT_NULL(out_call_log=(LinphoneCallLog*)(linphone_core_get_call_logs(marie->lc)->data));
- CU_ASSERT_EQUAL(linphone_call_log_get_status(out_call_log),LinphoneCallAborted);
+ if (avpf1) {
+ linphone_core_get_default_proxy(marie->lc, &lpc);
+ linphone_proxy_config_enable_avpf(lpc, TRUE);
+ linphone_proxy_config_set_avpf_rr_interval(lpc, 3);
+ }
+ if (avpf2) {
+ linphone_core_get_default_proxy(pauline->lc, &lpc);
+ linphone_proxy_config_enable_avpf(lpc, TRUE);
+ linphone_proxy_config_set_avpf_rr_interval(lpc, 3);
+ }
+ if (srtp1) {
+ if (linphone_core_media_encryption_supported(marie->lc, LinphoneMediaEncryptionSRTP)) {
+ linphone_core_set_media_encryption(marie->lc, LinphoneMediaEncryptionSRTP);
+ }
+ }
+ if (srtp2) {
+ if (linphone_core_media_encryption_supported(pauline->lc, LinphoneMediaEncryptionSRTP)) {
+ linphone_core_set_media_encryption(pauline->lc, LinphoneMediaEncryptionSRTP);
+ }
}
- linphone_call_unref(out_call);
- // wait a few time...
- wait_for(marie->lc,NULL,NULL,0);
- // since the callee was busy, there should be no publish to do
- CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0);
- CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0);
-
- linphone_core_manager_destroy(marie);
- linphone_core_manager_destroy(pauline);
-}
-static void statistics_sent_at_call_termination() {
- // int return_code = -1;
- LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
- LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
- LinphoneCall* call_marie = NULL;
- LinphoneCall* call_pauline = NULL;
-
- create_call_for_statistics_tests(marie, pauline, &call_marie, &call_pauline);
+ CU_ASSERT_TRUE(call(marie, pauline));
+ CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 1));
+ CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1));
+ params = linphone_call_get_current_params(linphone_core_get_current_call(marie->lc));
+ CU_ASSERT_STRING_EQUAL(linphone_call_params_get_rtp_profile(params), expected_profile);
+ params = linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc));
+ CU_ASSERT_STRING_EQUAL(linphone_call_params_get_rtp_profile(params), expected_profile);
linphone_core_terminate_all_calls(marie->lc);
- CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallReleased,1, 10000));
- CU_ASSERT_TRUE(wait_for_until(pauline->lc,NULL,&pauline->stat.number_of_LinphoneCallReleased,1, 10000));
+ CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallEnd, 1));
+ CU_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1));
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallConnected, 1);
+ CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallConnected, 1);
- CU_ASSERT_PTR_NULL(linphone_core_get_current_call(marie->lc));
- CU_ASSERT_PTR_NULL(linphone_core_get_current_call(pauline->lc));
-
- // now dialog id should be filled
- CU_ASSERT_PTR_NOT_NULL(call_marie->log->reports[0]->dialog_id);
-
- // PUBLISH submission to the collector should be ok
- CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishProgress,1));
- CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishOk,1));
-
- linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
+ linphone_core_manager_destroy(marie);
}
-#ifdef VIDEO_ENABLED
-#endif
+static void avp_to_avp_call(void) {
+ profile_call(FALSE, FALSE, FALSE, FALSE, "RTP/AVP");
+}
+
+static void avp_to_avpf_call(void) {
+ profile_call(FALSE, FALSE, TRUE, FALSE, "RTP/AVP");
+}
+
+static void avp_to_savp_call(void) {
+ profile_call(FALSE, FALSE, FALSE, TRUE, "RTP/AVP");
+}
+
+static void avp_to_savpf_call(void) {
+ profile_call(FALSE, FALSE, TRUE, TRUE, "RTP/AVP");
+}
+
+static void avpf_to_avp_call(void) {
+ profile_call(TRUE, FALSE, FALSE, FALSE, "RTP/AVPF");
+}
+
+static void avpf_to_avpf_call(void) {
+ profile_call(TRUE, FALSE, TRUE, FALSE, "RTP/AVPF");
+}
+
+static void avpf_to_savp_call(void) {
+ profile_call(TRUE, FALSE, FALSE, TRUE, "RTP/AVPF");
+}
+
+static void avpf_to_savpf_call(void) {
+ profile_call(TRUE, FALSE, TRUE, TRUE, "RTP/AVPF");
+}
+
+static void savp_to_avp_call(void) {
+ profile_call(FALSE, TRUE, FALSE, FALSE, "RTP/SAVP");
+}
+
+static void savp_to_avpf_call(void) {
+ profile_call(FALSE, TRUE, TRUE, FALSE, "RTP/SAVP");
+}
+
+static void savp_to_savp_call(void) {
+ profile_call(FALSE, TRUE, FALSE, TRUE, "RTP/SAVP");
+}
+
+static void savp_to_savpf_call(void) {
+ profile_call(FALSE, TRUE, TRUE, TRUE, "RTP/SAVP");
+}
+
+static void savpf_to_avp_call(void) {
+ profile_call(TRUE, TRUE, FALSE, FALSE, "RTP/SAVPF");
+}
+
+static void savpf_to_avpf_call(void) {
+ profile_call(TRUE, TRUE, TRUE, FALSE, "RTP/SAVPF");
+}
+
+static void savpf_to_savp_call(void) {
+ profile_call(TRUE, TRUE, FALSE, TRUE, "RTP/SAVPF");
+}
+
+static void savpf_to_savpf_call(void) {
+ profile_call(TRUE, TRUE, TRUE, TRUE, "RTP/SAVPF");
+}
test_t call_tests[] = {
{ "Early declined call", early_declined_call },
@@ -2138,6 +2534,11 @@ test_t call_tests[] = {
{ "Cancelled ringing call", cancelled_ringing_call },
{ "Call failed because of codecs", call_failed_because_of_codecs },
{ "Simple call", simple_call },
+ { "Outbound call with multiple proxy possible", call_outbound_with_multiple_proxy },
+#if 0 /* not yet activated because not implemented */
+ { "Multiple answers to a call", multiple_answers_call },
+#endif
+ { "Multiple answers to a call with media relay", multiple_answers_call_with_media_relay },
{ "Call with media relay", call_with_media_relay},
{ "Call with media relay (random ports)", call_with_media_relay_random_ports},
{ "Simple call compatibility mode", simple_call_compatibility_mode },
@@ -2161,6 +2562,10 @@ test_t call_tests[] = {
{ "Call with video added", call_with_video_added },
{ "Call with video added (random ports)", call_with_video_added_random_ports },
{ "Call with video declined",call_with_declined_video},
+ { "Call with multiple early media", multiple_early_media },
+ { "Call with ICE from video to non-video", call_with_ice_video_to_novideo},
+ { "Call with ICE and video added", call_with_ice_video_added },
+ { "Video call with ICE no matching audio codecs", video_call_with_ice_no_matching_audio_codecs },
#endif
{ "SRTP ice call", srtp_ice_call },
{ "ZRTP ice call", zrtp_ice_call },
@@ -2173,6 +2578,7 @@ test_t call_tests[] = {
{ "Call waiting indication", call_waiting_indication },
{ "Call waiting indication with privacy", call_waiting_indication_with_privacy },
{ "Simple conference", simple_conference },
+ { "Simple conference with ICE",simple_conference_with_ice},
{ "Simple call transfer", simple_call_transfer },
{ "Unattended call transfer", unattended_call_transfer },
{ "Unattended call transfer with error", unattended_call_transfer_with_error },
@@ -2188,10 +2594,23 @@ test_t call_tests[] = {
{ "Call established with rejected incoming RE-INVITE", call_established_with_rejected_incoming_reinvite },
{ "Call established with rejected RE-INVITE in error", call_established_with_rejected_reinvite_with_error},
{ "Call redirected by callee", call_redirect},
- { "Call statistics not used if no config", statistics_not_used_without_config},
- { "Call statistics not sent if call did not start", statistics_not_sent_if_call_not_started},
- { "Call statistics sent if call ended normally", statistics_sent_at_call_termination},
- { "Call with specified codec bitrate", call_with_specified_codec_bitrate}
+ { "Call with specified codec bitrate", call_with_specified_codec_bitrate},
+ { "AVP to AVP call", avp_to_avp_call },
+ { "AVP to AVPF call", avp_to_avpf_call },
+ { "AVP to SAVP call", avp_to_savp_call },
+ { "AVP to SAVPF call", avp_to_savpf_call },
+ { "AVPF to AVP call", avpf_to_avp_call },
+ { "AVPF to AVPF call", avpf_to_avpf_call },
+ { "AVPF to SAVP call", avpf_to_savp_call },
+ { "AVPF to SAVPF call", avpf_to_savpf_call },
+ { "SAVP to AVP call", savp_to_avp_call },
+ { "SAVP to AVPF call", savp_to_avpf_call },
+ { "SAVP to SAVP call", savp_to_savp_call },
+ { "SAVP to SAVPF call", savp_to_savpf_call },
+ { "SAVPF to AVP call", savpf_to_avp_call },
+ { "SAVPF to AVPF call", savpf_to_avpf_call },
+ { "SAVPF to SAVP call", savpf_to_savp_call },
+ { "SAVPF to SAVPF call", savpf_to_savpf_call }
};
test_suite_t call_test_suite = {
diff --git a/tester/eventapi_tester.c b/tester/eventapi_tester.c
index e5c459489..1d4b07e59 100644
--- a/tester/eventapi_tester.c
+++ b/tester/eventapi_tester.c
@@ -38,9 +38,10 @@ const char *liblinphone_tester_get_notify_content(void){
}
void linphone_notify_received(LinphoneCore *lc, LinphoneEvent *lev, const char *eventname, const LinphoneContent *content){
+ LinphoneCoreManager *mgr;
CU_ASSERT_PTR_NOT_NULL_FATAL(content);
CU_ASSERT_TRUE(strcmp(notify_content,(const char*)content->data)==0);
- LinphoneCoreManager *mgr=get_manager(lc);
+ mgr=get_manager(lc);
mgr->stat.number_of_NotifyReceived++;
}
diff --git a/tester/flexisip.conf b/tester/flexisip.conf
index 48f4a054b..c4b2a5894 100755
--- a/tester/flexisip.conf
+++ b/tester/flexisip.conf
@@ -432,6 +432,10 @@ sdp-port-range-max=65535
# Default value: 1
#h264-iframe-decim=1
+# Sends a ACK and BYE to 200 Ok for INVITEs not belonging to any established call.
+bye-orphan-dialogs=true
+
+
##
## The purpose of the Transcoder module is to transparently transcode
## from one audio codec to another to make the communication possible
diff --git a/tester/flexisip_tester.c b/tester/flexisip_tester.c
index 89c2dfe4b..a91811538 100644
--- a/tester/flexisip_tester.c
+++ b/tester/flexisip_tester.c
@@ -376,13 +376,14 @@ static void call_forking_declined_localy(void){
static void call_forking_with_push_notification_single(void){
char hellopath[256];
+ 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);
- MSList* lcs=ms_list_append(NULL,pauline->lc);
+ lcs=ms_list_append(NULL,pauline->lc);
lcs=ms_list_append(lcs,marie->lc);
diff --git a/tester/liblinphone_tester.c b/tester/liblinphone_tester.c
index f47a556b9..b11cbefaf 100644
--- a/tester/liblinphone_tester.c
+++ b/tester/liblinphone_tester.c
@@ -119,7 +119,7 @@ static void liblinphone_tester_qnx_log_handler(OrtpLogLevel lev, const char *fmt
void helper(const char *name) {
- fprintf(stderr,"%s \t--help\n"
+ fprintf(stderr,"%s --help\n"
"\t\t\t--verbose\n"
"\t\t\t--silent\n"
"\t\t\t--list-suites\n"
@@ -147,7 +147,7 @@ return -1; \
int main (int argc, char *argv[])
{
- int i,j;
+ int i;
int ret;
const char *suite_name=NULL;
const char *test_name=NULL;
@@ -189,39 +189,20 @@ int main (int argc, char *argv[])
CHECK_ARG("--suite", ++i, argc);
suite_name=argv[i];
} else if (strcmp(argv[i],"--list-suites")==0){
- for(j=0;j.
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
*/
@@ -23,7 +23,12 @@
#include "private.h"
#include "liblinphone_tester.h"
-static char* message_external_body_url;
+#ifdef MSG_STORAGE_ENABLED
+#include
+#endif
+
+
+static char* message_external_body_url=NULL;
void text_message_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from_address, const char *message) {
stats* counters = get_stats(lc);
@@ -41,12 +46,94 @@ void message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMess
ms_free(from);
counters = get_stats(lc);
counters->number_of_LinphoneMessageReceived++;
+ if (linphone_chat_message_get_file_transfer_information(message))
+ counters->number_of_LinphoneMessageReceivedWithFile++;
+ if (counters->last_received_chat_message) linphone_chat_message_unref(counters->last_received_chat_message);
+ linphone_chat_message_ref(counters->last_received_chat_message=message);
if (linphone_chat_message_get_external_body_url(message)) {
counters->number_of_LinphoneMessageExtBodyReceived++;
- CU_ASSERT_STRING_EQUAL(linphone_chat_message_get_external_body_url(message),message_external_body_url);
+ if (message_external_body_url) {
+ CU_ASSERT_STRING_EQUAL(linphone_chat_message_get_external_body_url(message),message_external_body_url);
+ message_external_body_url=NULL;
+ }
}
}
+/**
+ * function invoked when a file transfer is received.
+ * */
+void file_transfer_received(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, const char* buff, size_t size){
+ FILE* file=NULL;
+ char receive_file[256];
+ snprintf(receive_file,sizeof(receive_file), "%s/receive_file.dump", liblinphone_tester_writable_dir_prefix);
+
+ if (!linphone_chat_message_get_user_data(message)) {
+ /*first chunk, creating file*/
+ file = fopen("receive_file.dump","wb");
+ linphone_chat_message_set_user_data(message,(void*)file); /*store fd for next chunks*/
+ } else {
+ /*next chunk*/
+ file = (FILE*)linphone_chat_message_get_user_data(message);
+
+ if (size==0) { /* tranfer complerte */
+ stats* counters = get_stats(lc);
+ linphone_chat_room_destroy(linphone_chat_message_get_chat_room(message));
+ linphone_chat_message_destroy(message);
+ counters->number_of_LinphoneMessageExtBodyReceived++;
+ fclose(file);
+ } else { /* store content on a file*/
+ if (fwrite(buff,size,1,file)==-1){
+ ms_error("file_transfer_received(): write() failed: %s",strerror(errno));
+ }
+ }
+ }
+}
+
+static char big_file [128000]; /* a buffer to simulate a big file for the file transfer message test */
+
+/*
+ * function called when the file transfer is initiated. file content should be feed into object LinphoneContent
+ * */
+void file_transfer_send(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, char* buff, size_t* size){
+ int offset=-1;
+
+ if (!linphone_chat_message_get_user_data(message)) {
+ /*first chunk*/
+ offset=0;
+ } else {
+ /*subsequent chunk*/
+ offset = (int)((long)(linphone_chat_message_get_user_data(message))&0x00000000FFFFFFFF);
+ }
+ *size = MIN(*size,sizeof(big_file)-offset); /*updating content->size with minimun between remaining data and requested size*/
+
+ if (*size==0) {
+ /*end of file*/
+ return;
+ }
+ memcpy(buff,big_file+offset,*size);
+
+ /*store offset for next chunk*/
+ linphone_chat_message_set_user_data(message,(void*)(offset+*size));
+}
+
+/**
+ * function invoked to report file transfer progress.
+ * */
+void file_transfer_progress_indication(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, size_t progress) {
+ const LinphoneAddress* from_address = linphone_chat_message_get_from(message);
+ const LinphoneAddress* to_address = linphone_chat_message_get_to(message);
+ char *address = linphone_chat_message_is_outgoing(message)?linphone_address_as_string(to_address):linphone_address_as_string(from_address);
+ stats* counters = get_stats(lc);
+ printf(" File transfer [%d%%] %s of type [%s/%s] %s [%s] \n", (int)progress
+ ,(linphone_chat_message_is_outgoing(message)?"sent":"received")
+ , content->type
+ , content->subtype
+ ,(linphone_chat_message_is_outgoing(message)?"to":"from")
+ , address);
+ counters->progress_of_LinphoneFileTransfer = progress;
+ free(address);
+}
+
void is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room) {
stats *counters = get_stats(lc);
if (room->remote_is_composing == LinphoneIsComposingActive) {
@@ -95,17 +182,19 @@ static void text_message(void) {
}
static void text_message_within_dialog(void) {
+ char* to;
+ LinphoneChatRoom* chat_room;
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
-
+
lp_config_set_int(pauline->lc->config,"sip","chat_use_call_dialogs",1);
- char* to = linphone_address_as_string(marie->identity);
- LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc,to);
+ to = linphone_address_as_string(marie->identity);
+ chat_room = linphone_core_create_chat_room(pauline->lc,to);
ms_free(to);
CU_ASSERT_TRUE(call(marie,pauline));
-
+
linphone_chat_room_send_message(chat_room,"Bla bla bla bla");
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1));
@@ -128,6 +217,8 @@ static void text_message_with_credential_from_auth_cb_auth_info_requested(Linpho
static void text_message_with_credential_from_auth_cb(void) {
+ char* to;
+ LinphoneChatRoom* chat_room;
LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
text_message_with_credential_from_auth_cb_auth_info=linphone_auth_info_clone((LinphoneAuthInfo*)(linphone_core_get_auth_info_list(marie->lc)->data));
@@ -136,8 +227,8 @@ static void text_message_with_credential_from_auth_cb(void) {
linphone_core_clear_all_auth_info(marie->lc);
marie->lc->vtable.auth_info_requested=text_message_with_credential_from_auth_cb_auth_info_requested;
- char* to = linphone_address_as_string(marie->identity);
- LinphoneChatRoom* chat_room = linphone_core_create_chat_room(pauline->lc,to);
+ to = linphone_address_as_string(marie->identity);
+ chat_room = linphone_core_create_chat_room(pauline->lc,to);
ms_free(to);
@@ -234,12 +325,116 @@ static void text_message_with_external_body(void) {
LinphoneChatMessage* message = linphone_chat_room_create_message(chat_room,"Bli bli bli \n blu");
linphone_chat_message_set_external_body_url(message,message_external_body_url="http://www.linphone.org");
linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc);
+
+ /* check transient message list: the message should be in it, and should be the only one */
+ CU_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 1);
+ CU_ASSERT_EQUAL(ms_list_nth_data(chat_room->transient_messages,0), message);
+
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceived,1));
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageDelivered,1));
CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1);
CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,1);
+ CU_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 0);
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+static void file_transfer_message(void) {
+ int i;
+ char* to;
+ LinphoneChatRoom* chat_room;
+ LinphoneChatMessage* message;
+ LinphoneContent content;
+ const char* big_file_content="big file"; /* setting dummy file content to something */
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ reset_counters(&marie->stat);
+ reset_counters(&pauline->stat);
+
+ for (i=0;ilc,"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 */
+ memset(&content,0,sizeof(content));
+ content.type="text";
+ content.subtype="plain";
+ content.size=sizeof(big_file); /*total size to be transfered*/
+ content.name = "bigfile.txt";
+ message = linphone_chat_room_create_file_transfer_message(chat_room, &content);
+
+ linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc);
+ CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1));
+ if (marie->stat.last_received_info_message ) {
+ linphone_chat_message_start_file_download((const LinphoneChatMessage*)marie->stat.last_received_info_message);
+ }
+ CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageDelivered,1));
+
+ CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,1);
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,1);
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+static void file_transfer_message_io_error(void) {
+ int i;
+ char* to;
+ LinphoneChatRoom* chat_room;
+ LinphoneChatMessage* message;
+ LinphoneContent content;
+ const char* big_file_content="big file"; /* setting dummy file content to something */
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ reset_counters(&marie->stat);
+ reset_counters(&pauline->stat);
+
+ /* setting dummy file content to something */
+ for (i=0;ilc,"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);
+
+ /* create a file transfer message */
+ memset(&content,0,sizeof(content));
+ content.type="text";
+ content.subtype="plain";
+ content.size=sizeof(big_file); /*total size to be transfered*/
+ content.name = "bigfile.txt";
+ message = linphone_chat_room_create_file_transfer_message(chat_room, &content);
+
+ linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,pauline->lc);
+
+ /*wait for file to be 25% uploaded and simultate a network error*/
+ CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.progress_of_LinphoneFileTransfer,25));
+ sal_set_send_error(pauline->lc->sal, -1);
+
+ CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageNotDelivered,1));
+
+ CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageNotDelivered,1);
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageExtBodyReceived,0);
+
+ sal_set_send_error(pauline->lc->sal, 0);
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
}
@@ -250,14 +445,25 @@ static void text_message_with_send_error(void) {
char* to = linphone_address_as_string(pauline->identity);
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(marie->lc,to);
LinphoneChatMessage* message = linphone_chat_room_create_message(chat_room,"Bli bli bli \n blu");
+ reset_counters(&marie->stat);
+ reset_counters(&pauline->stat);
+
/*simultate a network error*/
sal_set_send_error(marie->lc->sal, -1);
linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,marie->lc);
+ /* check transient message list: the message should be in it, and should be the only one */
+ CU_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 1);
+ CU_ASSERT_EQUAL(ms_list_nth_data(chat_room->transient_messages,0), message);
+
+
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageNotDelivered,1));
/*CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneMessageInProgress,1);*/
CU_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageReceived,0);
+ /* the message should have been discarded from transient list after an error */
+ CU_ASSERT_EQUAL(ms_list_size(chat_room->transient_messages), 0);
+
sal_set_send_error(marie->lc->sal, 0);
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
@@ -269,10 +475,12 @@ static void text_message_denied(void) {
char* to = linphone_address_as_string(pauline->identity);
LinphoneChatRoom* chat_room = linphone_core_create_chat_room(marie->lc,to);
LinphoneChatMessage* message = linphone_chat_room_create_message(chat_room,"Bli bli bli \n blu");
+ reset_counters(&marie->stat);
+ reset_counters(&pauline->stat);
/*pauline doesn't want to be disturbed*/
linphone_core_disable_chat(pauline->lc,LinphoneReasonDoNotDisturb);
-
+
linphone_chat_room_send_message2(chat_room,message,liblinphone_tester_chat_message_state_change,marie->lc);
CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageNotDelivered,1));
@@ -370,6 +578,89 @@ static void is_composing_notification(void) {
linphone_core_manager_destroy(pauline);
}
+#ifdef MSG_STORAGE_ENABLED
+
+/*
+ * Copy file "from" to file "to".
+ * Destination file is truncated if existing.
+ * Return 1 on success, 0 on error (printing an error).
+ */
+static int
+message_tester_copy_file(const char *from, const char *to)
+{
+ char message[256];
+ FILE *in, *out;
+ char buf[256];
+ size_t n;
+
+ /* Open "from" file for reading */
+ in=fopen(from, "r");
+ if ( in == NULL )
+ {
+ snprintf(message, 255, "Can't open %s for reading: %s\n",
+ from, strerror(errno));
+ fprintf(stderr, "%s", message);
+ return 0;
+ }
+
+ /* Open "to" file for writing (will truncate existing files) */
+ out=fopen(to, "w");
+ if ( out == NULL )
+ {
+ snprintf(message, 255, "Can't open %s for writing: %s\n",
+ to, strerror(errno));
+ fprintf(stderr, "%s", message);
+ fclose(in);
+ return 0;
+ }
+
+ /* Copy data from "in" to "out" */
+ while ( (n=fread(buf, 1, sizeof buf, in)) > 0 )
+ {
+ if ( ! fwrite(buf, 1, n, out) )
+ {
+ fclose(in);
+ fclose(out);
+ return 0;
+ }
+ }
+
+ fclose(in);
+ fclose(out);
+
+ return 1;
+}
+
+static int check_no_strange_time(void* data,int argc, char** argv,char** cNames) {
+ CU_ASSERT_EQUAL(argc, 0);
+ return 0;
+}
+
+static void message_storage_migration() {
+ LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc");
+ char src_db[256];
+ char tmp_db[256];
+ snprintf(src_db,sizeof(src_db), "%s/messages.db", liblinphone_tester_file_prefix);
+ snprintf(tmp_db,sizeof(tmp_db), "%s/tmp.db", liblinphone_tester_writable_dir_prefix);
+
+ CU_ASSERT_EQUAL_FATAL(message_tester_copy_file(src_db, tmp_db), 1);
+
+ // enable to test the performances of the migration step
+ //linphone_core_message_storage_set_debug(marie->lc, TRUE);
+
+ // the messages.db has 10000 dummy messages with the very first DB scheme.
+ // This will test the migration procedure
+ linphone_core_set_chat_database_path(marie->lc, tmp_db);
+
+ MSList* chatrooms = linphone_core_get_chat_rooms(marie->lc);
+ CU_ASSERT(ms_list_size(chatrooms) > 0);
+
+ // check that all messages have been migrated to the UTC time storage
+ CU_ASSERT(sqlite3_exec(marie->lc->db, "SELECT * FROM history WHERE time != '-1';", check_no_strange_time, NULL, NULL) == SQLITE_OK );
+}
+
+#endif
+
test_t message_tests[] = {
{ "Text message", text_message },
{ "Text message within call's dialog", text_message_within_dialog},
@@ -379,10 +670,15 @@ test_t message_tests[] = {
{ "Text message with ack", text_message_with_ack },
{ "Text message with send error", text_message_with_send_error },
{ "Text message with external body", text_message_with_external_body },
+ { "File transfer message", file_transfer_message },
+ { "File transfer message with io error", file_transfer_message_io_error },
{ "Text message denied", text_message_denied },
{ "Info message", info_message },
{ "Info message with body", info_message_with_body },
{ "IsComposing notification", is_composing_notification }
+#ifdef MSG_STORAGE_ENABLED
+ ,{ "Database migration", message_storage_migration }
+#endif
};
test_suite_t message_test_suite = {
diff --git a/tester/messages.db b/tester/messages.db
new file mode 100644
index 000000000..072aed397
Binary files /dev/null and b/tester/messages.db differ
diff --git a/tester/quality_reporting_tester.c b/tester/quality_reporting_tester.c
new file mode 100644
index 000000000..b6b449b91
--- /dev/null
+++ b/tester/quality_reporting_tester.c
@@ -0,0 +1,336 @@
+/*
+ liblinphone_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 .
+*/
+
+#include
+#include "CUnit/Basic.h"
+#include "linphonecore.h"
+#include "private.h"
+#include "liblinphone_tester.h"
+
+/*avoid crash if x is NULL on libc versions <4.5.26 */
+#define __strstr(x, y) ((x==NULL)?NULL:strstr(x,y))
+
+void on_report_send_mandatory(const LinphoneCall *call, int stream_type, const LinphoneContent *content){
+ char * body = (char *)content->data;
+ char * remote_metrics_start = __strstr(body, "RemoteMetrics:");
+ reporting_session_report_t * report = call->log->reporting.reports[stream_type];
+ MediaStream * ms;
+ if (stream_type == LINPHONE_CALL_STATS_AUDIO){
+ ms = (MediaStream*)call->audiostream;
+ }else{
+ ms = (MediaStream*)call->videostream;
+ }
+ CU_ASSERT_TRUE(
+ __strstr(body, "VQIntervalReport\r\n") == body ||
+ __strstr(body, "VQSessionReport\r\n") == body ||
+ __strstr(body, "VQSessionReport: CallTerm\r\n") == body
+ );
+
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "CallID:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalID:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteID:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "OrigID:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalGroup:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteGroup:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalAddr:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "IP="));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PORT="));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SSRC="));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteAddr:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "IP="));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PORT="));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SSRC="));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalMetrics:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "Timestamps:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "START="));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "STOP="));
+
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SessionDesc:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PT="));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PD="));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SR="));
+
+ /* We should have not reached RemoteMetrics section yet */
+ CU_ASSERT_TRUE(!remote_metrics_start || body < remote_metrics_start);
+
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "DialogID:"));
+
+ if (report->remote_metrics.rtcp_sr_count&&ms!=NULL&&ms->rc!=NULL){
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "AdaptiveAlg:"));
+ }
+}
+
+char * on_report_send_verify_metrics(const reporting_content_metrics_t *metrics, char * body){
+ if (metrics->rtcp_xr_count){
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "SessionDesc:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "JitterBuffer:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "PacketLoss:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "QualityEst:"));
+ }
+ if (metrics->rtcp_sr_count+metrics->rtcp_xr_count>0){
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "Delay:"));
+ }
+
+ return body;
+}
+
+void on_report_send_with_rtcp_xr_local(const LinphoneCall *call, int stream_type, const LinphoneContent *content){
+ char * body = (char*)content->data;
+ char * remote_metrics_start = __strstr(body, "RemoteMetrics:");
+ reporting_session_report_t * report = call->log->reporting.reports[stream_type];
+ on_report_send_mandatory(call,stream_type,content);
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "LocalMetrics:"));
+ CU_ASSERT_TRUE(!remote_metrics_start || on_report_send_verify_metrics(&report->local_metrics,body) < remote_metrics_start);
+}
+void on_report_send_with_rtcp_xr_remote(const LinphoneCall *call, int stream_type, const LinphoneContent *content){
+ char * body = (char*)content->data;
+ reporting_session_report_t * report = call->log->reporting.reports[stream_type];
+
+ on_report_send_mandatory(call,stream_type,content);
+ if (report->remote_metrics.rtcp_sr_count+report->remote_metrics.rtcp_xr_count>0){
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "RemoteMetrics:"));
+ CU_ASSERT_PTR_NOT_NULL(body=__strstr(body, "Timestamps:"));
+ on_report_send_verify_metrics(&report->remote_metrics,body);
+ }
+}
+void on_report_send_with_rtcp_xr_both(const LinphoneCall *call, int stream_type, const LinphoneContent *content){
+ on_report_send_with_rtcp_xr_local(call,stream_type,content);
+ on_report_send_with_rtcp_xr_remote(call,stream_type,content);
+}
+
+void create_call_for_quality_reporting_tests(
+ LinphoneCoreManager* marie,
+ LinphoneCoreManager* pauline,
+ LinphoneCall** call_marie,
+ LinphoneCall** call_pauline) {
+ CU_ASSERT_TRUE(call(pauline,marie));
+ *call_marie = linphone_core_get_current_call(marie->lc);
+ *call_pauline = linphone_core_get_current_call(pauline->lc);
+ CU_ASSERT_PTR_NOT_NULL(*call_marie);
+ CU_ASSERT_PTR_NOT_NULL(*call_pauline);
+}
+
+static void quality_reporting_not_used_without_config() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCall* call_marie = NULL;
+ LinphoneCall* call_pauline = NULL;
+
+ create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline);
+
+ // marie has stats collection enabled but pauline has not
+ CU_ASSERT_TRUE(linphone_proxy_config_quality_reporting_enabled(call_marie->dest_proxy));
+ CU_ASSERT_FALSE(linphone_proxy_config_quality_reporting_enabled(call_pauline->dest_proxy));
+
+ CU_ASSERT_EQUAL(strcmp("sip:collector@sip.example.org",
+ linphone_proxy_config_get_quality_reporting_collector(call_marie->dest_proxy)), 0);
+
+ // this field should be already filled
+ CU_ASSERT_PTR_NOT_NULL(call_marie->log->reporting.reports[0]->info.local_addr.ip);
+
+ // but not this one since it is updated at the end of call
+ CU_ASSERT_PTR_NULL(call_marie->log->reporting.reports[0]->dialog_id);
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+static void quality_reporting_not_sent_if_call_not_started() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCallLog* out_call_log;
+ LinphoneCall* out_call;
+
+ linphone_core_set_max_calls(pauline->lc,0);
+ out_call = linphone_core_invite(marie->lc,"pauline");
+ linphone_call_ref(out_call);
+
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallError,1, 10000));
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1);
+
+ if (ms_list_size(linphone_core_get_call_logs(marie->lc))>0) {
+ out_call_log=(LinphoneCallLog*)(linphone_core_get_call_logs(marie->lc)->data);
+ CU_ASSERT_PTR_NOT_NULL(out_call_log);
+ CU_ASSERT_EQUAL(linphone_call_log_get_status(out_call_log),LinphoneCallAborted);
+ }
+ linphone_call_unref(out_call);
+
+ // wait a few time...
+ wait_for_until(marie->lc,NULL,NULL,0,1000);
+
+ // since the callee was busy, there should be no publish to do
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0);
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0);
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+static void quality_reporting_not_sent_if_low_bandwidth() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCallParams* marie_params;
+
+ marie_params=linphone_core_create_default_call_parameters(marie->lc);
+ linphone_call_params_enable_low_bandwidth(marie_params,TRUE);
+
+ CU_ASSERT_TRUE(call_with_params(marie,pauline,marie_params,NULL));
+
+ linphone_core_terminate_all_calls(marie->lc);
+
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0);
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0);
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+void on_report_send_remove_fields(const LinphoneCall *call, int stream_type, const LinphoneContent *content){
+ char *body = (char*)content->data;
+ /*corrupt start of the report*/
+ strncpy(body, "corrupted report is corrupted", strlen("corrupted report is corrupted"));
+}
+
+static void quality_reporting_invalid_report() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCall* call_marie = NULL;
+ LinphoneCall* call_pauline = NULL;
+
+ create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline);
+ linphone_reporting_set_on_report_send(call_marie, on_report_send_remove_fields);
+
+ linphone_core_terminate_all_calls(marie->lc);
+
+ CU_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,1));
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishError,1,3000));
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0);
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+static void quality_reporting_at_call_termination() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc_rtcp_xr");
+ LinphoneCall* call_marie = NULL;
+ LinphoneCall* call_pauline = NULL;
+
+ create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline);
+ linphone_reporting_set_on_report_send(call_marie, on_report_send_with_rtcp_xr_remote);
+
+ linphone_core_terminate_all_calls(marie->lc);
+
+ // now dialog id should be filled
+ CU_ASSERT_PTR_NOT_NULL(call_marie->log->reporting.reports[0]->dialog_id);
+
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallReleased,1, 10000));
+ CU_ASSERT_TRUE(wait_for_until(pauline->lc,NULL,&pauline->stat.number_of_LinphoneCallReleased,1, 10000));
+
+ CU_ASSERT_PTR_NULL(linphone_core_get_current_call(marie->lc));
+ CU_ASSERT_PTR_NULL(linphone_core_get_current_call(pauline->lc));
+
+ // PUBLISH submission to the collector should be ok
+ CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishProgress,1));
+ CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishOk,1));
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+static void quality_reporting_interval_report() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc_rtcp_xr");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc_rtcp_xr");
+ LinphoneCall* call_marie = NULL;
+ LinphoneCall* call_pauline = NULL;
+
+ create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline);
+ linphone_reporting_set_on_report_send(call_marie, on_report_send_mandatory);
+ linphone_proxy_config_set_quality_reporting_interval(call_marie->dest_proxy, 3);
+
+ CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(marie->lc));
+ CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(pauline->lc));
+
+ // PUBLISH submission to the collector should be ok
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,3,25000));
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,3,25000));
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+static void quality_reporting_session_report_if_video_stopped() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc_rtcp_xr");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCall* call_pauline = NULL;
+ LinphoneCallParams* pauline_params;
+ LinphoneCallParams* marie_params;
+
+ linphone_core_enable_video_capture(marie->lc, TRUE);
+ linphone_core_enable_video_display(marie->lc, FALSE);
+ linphone_core_enable_video_capture(pauline->lc, TRUE);
+ linphone_core_enable_video_display(pauline->lc, FALSE);
+ marie_params=linphone_core_create_default_call_parameters(marie->lc);
+ linphone_call_params_enable_video(marie_params,TRUE);
+ pauline_params=linphone_core_create_default_call_parameters(pauline->lc);
+ linphone_call_params_enable_video(pauline_params,TRUE);
+ CU_ASSERT_TRUE(call_with_params(pauline,marie,pauline_params,marie_params));
+ call_pauline=linphone_core_get_current_call(pauline->lc);
+ linphone_reporting_set_on_report_send(linphone_core_get_current_call(marie->lc), on_report_send_with_rtcp_xr_local);
+
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0);
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0);
+
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,NULL,0,3000));
+ CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(call_pauline)));
+
+ /*remove video*/
+ linphone_call_params_enable_video(pauline_params,FALSE);
+ linphone_core_update_call(pauline->lc,call_pauline,pauline_params);
+
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,1,5000));
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,1,5000));
+
+ CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(call_pauline)));
+
+ linphone_core_terminate_all_calls(marie->lc);
+
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,2,5000));
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,2,5000));
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+test_t quality_reporting_tests[] = {
+ { "Not used if no config", quality_reporting_not_used_without_config},
+ { "Call term session report not sent if call did not start", quality_reporting_not_sent_if_call_not_started},
+ { "Call term session report not sent if low bandwidth", quality_reporting_not_sent_if_low_bandwidth},
+ { "Call term session report invalid if missing mandatory fields", quality_reporting_invalid_report},
+ { "Call term session report sent if call ended normally", quality_reporting_at_call_termination},
+ { "Interval report if interval is configured", quality_reporting_interval_report},
+ { "Session report sent if video stopped during call", quality_reporting_session_report_if_video_stopped},
+};
+
+test_suite_t quality_reporting_test_suite = {
+ "QualityReporting",
+ NULL,
+ NULL,
+ sizeof(quality_reporting_tests) / sizeof(quality_reporting_tests[0]),
+ quality_reporting_tests
+};
diff --git a/tester/rcfiles/marie_early_rc b/tester/rcfiles/marie_early_rc
index 844959eae..079a81879 100644
--- a/tester/rcfiles/marie_early_rc
+++ b/tester/rcfiles/marie_early_rc
@@ -30,8 +30,8 @@ subscribe=0
[rtp]
-audio_rtp_port=8070
-video_rtp_port=8072
+audio_rtp_port=18070
+video_rtp_port=19072
[video]
display=0
diff --git a/tester/rcfiles/marie_rc b/tester/rcfiles/marie_rc
index e5cd7a3b5..f4f9aa793 100644
--- a/tester/rcfiles/marie_rc
+++ b/tester/rcfiles/marie_rc
@@ -22,8 +22,8 @@ reg_expires=3600
reg_sendregister=1
publish=0
dial_escape_plus=0
-statistics_collector=sip:collector@sip.example.org
-send_statistics=1
+quality_reporting_collector=sip:collector@sip.example.org
+quality_reporting_enabled=1
[friend_0]
url="Paupoche"
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/marie_rc b/tester/rcfiles/marie_rc_rtcp_xr
similarity index 60%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/marie_rc
rename to tester/rcfiles/marie_rc_rtcp_xr
index 56c96bc98..93f8e5bd0 100644
--- a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/marie_rc
+++ b/tester/rcfiles/marie_rc_rtcp_xr
@@ -1,16 +1,17 @@
[sip]
-sip_port=5082
-sip_tcp_port=5082
-sip_tls_port=5083
+sip_port=-1
+sip_tcp_port=-1
+sip_tls_port=-1
default_proxy=0
ping_with_options=0
register_only_when_network_is_up=0
+composing_idle_timeout=1
[auth_info_0]
username=marie
userid=marie
passwd=secret
-realm="sip.example.org"
+realm=sip.example.org
[proxy_0]
@@ -21,6 +22,8 @@ reg_expires=3600
reg_sendregister=1
publish=0
dial_escape_plus=0
+quality_reporting_collector=sip:collector@sip.example.org
+quality_reporting_enabled=1
[friend_0]
url="Paupoche"
@@ -30,7 +33,12 @@ subscribe=0
[rtp]
audio_rtp_port=8070
-video_rtp_port=8072
+video_rtp_port=9072
+rtcp_xr_enabled=1
+rtcp_xr_rcvr_rtt_mode=all
+rtcp_xr_rcvr_rtt_max_size=10000
+rtcp_xr_stat_summary_enabled=1
+rtcp_xr_voip_metrics_enabled=1
[video]
display=0
@@ -44,4 +52,4 @@ automatically_accept=0
device=StaticImage: Static picture
[sound]
-echocancellation=0 #to not overload cpu in case of VG
\ No newline at end of file
+echocancellation=0 #to not overload cpu in case of VG
diff --git a/tester/rcfiles/marie_remote_default_values_rc b/tester/rcfiles/marie_remote_default_values_rc
index ec5e4f633..966d116fd 100644
--- a/tester/rcfiles/marie_remote_default_values_rc
+++ b/tester/rcfiles/marie_remote_default_values_rc
@@ -1,2 +1,5 @@
[misc]
config-uri=http://smtp.linphone.org/marie_default
+
+[app]
+toto=titi
diff --git a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/pauline_rc b/tester/rcfiles/pauline_rc_rtcp_xr
similarity index 66%
rename from build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/pauline_rc
rename to tester/rcfiles/pauline_rc_rtcp_xr
index 4ff876cf7..331f942ef 100644
--- a/build/vsx/LibLinphoneTester-wp8/LibLinphoneTester-wp8/Assets/pauline_rc
+++ b/tester/rcfiles/pauline_rc_rtcp_xr
@@ -1,16 +1,17 @@
[sip]
-sip_port=5072
-sip_tcp_port=5072
-sip_tls_port=5073
+sip_port=-1
+sip_tcp_port=-1
+sip_tls_port=-1
default_proxy=0
ping_with_options=0
register_only_when_network_is_up=0
+composing_idle_timeout=1
[auth_info_0]
username=pauline
userid=pauline
passwd=secret
-realm="sip.example.org"
+realm=sip.example.org
[proxy_0]
@@ -29,7 +30,12 @@ dial_escape_plus=0
[rtp]
audio_rtp_port=8090
-video_rtp_port=8092
+video_rtp_port=9092
+rtcp_xr_enabled=1
+rtcp_xr_rcvr_rtt_mode=all
+rtcp_xr_rcvr_rtt_max_size=10000
+rtcp_xr_stat_summary_enabled=1
+rtcp_xr_voip_metrics_enabled=1
[video]
display=0
@@ -43,4 +49,4 @@ automatically_accept=0
device=StaticImage: Static picture
[sound]
-echocancellation=0 #to not overload cpu in case of VG
\ No newline at end of file
+echocancellation=0 #to not overload cpu in case of VG
diff --git a/tester/register_tester.c b/tester/register_tester.c
index 0798bd61f..2e7d330ff 100644
--- a/tester/register_tester.c
+++ b/tester/register_tester.c
@@ -119,7 +119,8 @@ static void register_with_refresh_base_3(LinphoneCore* lc
linphone_core_add_proxy_config(lc,proxy_cfg);
linphone_core_set_default_proxy(lc,proxy_cfg);
- while (counters->number_of_LinphoneRegistrationOk<1+(refresh!=0) && retry++ <310) {
+ while (counters->number_of_LinphoneRegistrationOk<1+(refresh!=0)
+ && retry++ <(110 /*only wait 11 s if final state is progress*/+(expected_final_state==LinphoneRegistrationProgress?0:200))) {
linphone_core_iterate(lc);
if (counters->number_of_auth_info_requested>0 && linphone_proxy_config_get_state(proxy_cfg) == LinphoneRegistrationFailed && late_auth_info) {
if (!linphone_core_get_auth_info_list(lc)) {
@@ -197,6 +198,52 @@ static void simple_register(){
linphone_core_manager_destroy(lcm);
}
+static void simple_unregister(){
+ LinphoneCoreManager* lcm = create_lcm();
+ stats* counters = &lcm->stat;
+ LinphoneProxyConfig* proxy_config;
+ register_with_refresh_base(lcm->lc,FALSE,NULL,NULL);
+
+ linphone_core_get_default_proxy(lcm->lc,&proxy_config);
+
+ linphone_proxy_config_edit(proxy_config);
+ reset_counters(counters); /*clear stats*/
+
+ /*nothing is supposed to arrive until done*/
+ CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000));
+ linphone_proxy_config_enable_register(proxy_config,FALSE);
+ linphone_proxy_config_done(proxy_config);
+ CU_ASSERT_TRUE(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1));
+ linphone_core_manager_destroy(lcm);
+}
+
+static void change_expires(){
+ LinphoneCoreManager* lcm = create_lcm();
+ stats* counters = &lcm->stat;
+ LinphoneProxyConfig* proxy_config;
+ register_with_refresh_base(lcm->lc,FALSE,NULL,NULL);
+
+ linphone_core_get_default_proxy(lcm->lc,&proxy_config);
+
+ linphone_proxy_config_edit(proxy_config);
+ reset_counters(counters); /*clear stats*/
+
+ /*nothing is supposed to arrive until done*/
+ CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000));
+
+ linphone_proxy_config_set_expires(proxy_config,3);
+
+ linphone_proxy_config_done(proxy_config);
+ CU_ASSERT_TRUE(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,1));
+ /*wait 2s without receive refresh*/
+ CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,2,2000));
+ /* now, it should be ok*/
+ CU_ASSERT_TRUE(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,2));
+
+
+ linphone_core_manager_destroy(lcm);
+}
+
/*take care of min expires configuration from server*/
static void simple_register_with_refresh() {
LinphoneCoreManager* lcm = create_lcm();
@@ -467,6 +514,101 @@ static void transport_change(){
linphone_core_manager_destroy(mgr);
}
+static void proxy_transport_change(){
+ LinphoneCoreManager* lcm = create_lcm();
+ stats* counters = &lcm->stat;
+ LinphoneProxyConfig* proxy_config;
+ LinphoneAddress* addr;
+ char* addr_as_string;
+ LinphoneAuthInfo *info=linphone_auth_info_new(test_username,NULL,test_password,NULL,auth_domain,NULL); /*create authentication structure from identity*/
+ linphone_core_add_auth_info(lcm->lc,info); /*add authentication info to LinphoneCore*/
+
+ register_with_refresh_base(lcm->lc,FALSE,auth_domain,NULL);
+
+ linphone_core_get_default_proxy(lcm->lc,&proxy_config);
+ reset_counters(counters); /*clear stats*/
+ linphone_proxy_config_edit(proxy_config);
+
+ CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000));
+ addr = linphone_address_new(linphone_proxy_config_get_addr(proxy_config));
+
+ if (LinphoneTransportTcp == linphone_address_get_transport(addr)) {
+ linphone_address_set_transport(addr,LinphoneTransportUdp);
+ } else {
+ linphone_address_set_transport(addr,LinphoneTransportTcp);
+ }
+ linphone_proxy_config_set_server_addr(proxy_config,addr_as_string=linphone_address_as_string(addr));
+
+ linphone_proxy_config_done(proxy_config);
+
+ CU_ASSERT(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,1));
+ /*as we change p[roxy server destination, we should'nt be notified about the clear*/
+ CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0);
+ ms_free(addr_as_string);
+ linphone_address_destroy(addr);
+ linphone_core_manager_destroy(lcm);
+
+}
+static void proxy_transport_change_with_wrong_port() {
+ LinphoneCoreManager* lcm = create_lcm();
+ stats* counters = &lcm->stat;
+ LinphoneProxyConfig* proxy_config;
+ LinphoneAuthInfo *info=linphone_auth_info_new(test_username,NULL,test_password,NULL,auth_domain,NULL); /*create authentication structure from identity*/
+ char route[256];
+ LCSipTransports transport= {LC_SIP_TRANSPORT_RANDOM,LC_SIP_TRANSPORT_RANDOM,LC_SIP_TRANSPORT_RANDOM,LC_SIP_TRANSPORT_RANDOM};
+ sprintf(route,"sip:%s",test_route);
+
+ linphone_core_add_auth_info(lcm->lc,info); /*add authentication info to LinphoneCore*/
+
+ register_with_refresh_base_3(lcm->lc, FALSE, auth_domain, "sip2.linphone.org:5987", 0,transport,LinphoneRegistrationProgress);
+
+ linphone_core_get_default_proxy(lcm->lc,&proxy_config);
+ linphone_proxy_config_edit(proxy_config);
+
+ CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000));
+ linphone_proxy_config_set_server_addr(proxy_config,route);
+ linphone_proxy_config_done(proxy_config);
+
+ CU_ASSERT(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationOk,1));
+ /*as we change proxy server destination, we should'nt be notified about the clear*/
+ CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0);
+ CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationOk,1);
+ CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationProgress,1);
+ CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0);
+
+ linphone_core_manager_destroy(lcm);
+
+}
+
+static void proxy_transport_change_with_wrong_port_givin_up() {
+ LinphoneCoreManager* lcm = create_lcm();
+ stats* counters = &lcm->stat;
+ LinphoneProxyConfig* proxy_config;
+ LinphoneAuthInfo *info=linphone_auth_info_new(test_username,NULL,test_password,NULL,auth_domain,NULL); /*create authentication structure from identity*/
+ char route[256];
+ LCSipTransports transport= {LC_SIP_TRANSPORT_RANDOM,LC_SIP_TRANSPORT_RANDOM,LC_SIP_TRANSPORT_RANDOM,LC_SIP_TRANSPORT_RANDOM};
+ sprintf(route,"sip:%s",test_route);
+
+ linphone_core_add_auth_info(lcm->lc,info); /*add authentication info to LinphoneCore*/
+
+ register_with_refresh_base_3(lcm->lc, FALSE, auth_domain, "sip2.linphone.org:5987", 0,transport,LinphoneRegistrationProgress);
+
+ linphone_core_get_default_proxy(lcm->lc,&proxy_config);
+ linphone_proxy_config_edit(proxy_config);
+
+ CU_ASSERT_FALSE(wait_for_until(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1,3000));
+ linphone_proxy_config_enableregister(proxy_config,FALSE);
+ linphone_proxy_config_done(proxy_config);
+
+ CU_ASSERT(wait_for(lcm->lc,lcm->lc,&counters->number_of_LinphoneRegistrationCleared,1));
+ CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationOk,0);
+ CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationProgress,1);
+ CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0);
+
+ linphone_core_manager_destroy(lcm);
+
+}
+
static void io_recv_error(){
LinphoneCoreManager *mgr;
LinphoneCore* lc;
@@ -539,7 +681,7 @@ static void io_recv_error_late_recovery(){
CU_ASSERT_TRUE(wait_for(lc,NULL,&counters->number_of_LinphoneRegistrationProgress,(register_ok-number_of_udp_proxy)+register_ok /*because 1 udp*/));
CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0)
- CU_ASSERT_TRUE(wait_for_list(lcs=ms_list_append(NULL,lc),&counters->number_of_LinphoneRegistrationFailed,(register_ok-number_of_udp_proxy),sal_get_refresher_retry_after(lc->sal)+1000));
+ CU_ASSERT_TRUE(wait_for_list(lcs=ms_list_append(NULL,lc),&counters->number_of_LinphoneRegistrationFailed,(register_ok-number_of_udp_proxy),sal_get_refresher_retry_after(lc->sal)+3000));
sal_set_recv_error(lc->sal, 1); /*reset*/
sal_set_send_error(lc->sal, 0);
@@ -567,22 +709,17 @@ static void io_recv_error_without_active_register(){
for (proxys=ms_list_copy(linphone_core_get_proxy_config_list(lc));proxys!=NULL;proxys=proxys->next) {
LinphoneProxyConfig* proxy_cfg=(LinphoneProxyConfig*)proxys->data;
linphone_proxy_config_edit(proxy_cfg);
+ linphone_proxy_config_enableregister(proxy_cfg,FALSE);
+ linphone_proxy_config_done(proxy_cfg);
}
ms_list_free(proxys);
/*wait for unregistrations*/
CU_ASSERT_TRUE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationCleared,register_ok /*because 1 udp*/));
- for (proxys=ms_list_copy(linphone_core_get_proxy_config_list(lc));proxys!=NULL;proxys=proxys->next) {
- LinphoneProxyConfig* proxy_cfg=(LinphoneProxyConfig*)proxys->data;
- linphone_proxy_config_enable_register(proxy_cfg,FALSE);
- linphone_proxy_config_done(proxy_cfg);
- }
- ms_list_free(proxys);
-
sal_set_recv_error(lc->sal, 0);
/*nothing should happen because no active registration*/
- CU_ASSERT_FALSE(wait_for(lc,lc,&counters->number_of_LinphoneRegistrationProgress,2*(register_ok-number_of_udp_proxy) /*because 1 udp*/));
+ CU_ASSERT_FALSE(wait_for_until(lc,lc,&counters->number_of_LinphoneRegistrationProgress,2*(register_ok-number_of_udp_proxy) /*because 1 udp*/,3000));
CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationFailed,0)
@@ -669,6 +806,7 @@ static void tls_wildcard_register(){
test_t register_tests[] = {
{ "Simple register", simple_register },
+ { "Simple register unregister", simple_unregister },
{ "TCP register", simple_tcp_register },
{ "TCP register compatibility mode", simple_tcp_register_compatibility_mode },
{ "TLS register", simple_tls_register },
@@ -688,7 +826,11 @@ test_t register_tests[] = {
{ "Authenticated register with refresh", simple_auth_register_with_refresh },
{ "Register with refresh and send error", register_with_refresh_with_send_error },
{ "Multi account", multiple_proxy },
- { "Transport change", transport_change },
+ { "Transport changes", transport_change },
+ { "Proxy transport changes", proxy_transport_change},
+ { "Proxy transport changes with wrong address at first", proxy_transport_change_with_wrong_port},
+ { "Proxy transport changes with wrong address, giving up",proxy_transport_change_with_wrong_port_givin_up},
+ { "Change expires", change_expires},
{ "Network state change", network_state_change },
{ "Io recv error", io_recv_error },
{ "Io recv error with recovery", io_recv_error_retry_immediatly},
diff --git a/tester/remote_provisioning_tester.c b/tester/remote_provisioning_tester.c
index 365673ff6..21e9a3f6a 100644
--- a/tester/remote_provisioning_tester.c
+++ b/tester/remote_provisioning_tester.c
@@ -23,9 +23,10 @@
#include "liblinphone_tester.h"
void linphone_configuration_status(LinphoneCore *lc, LinphoneConfiguringState status, const char *message) {
+ stats* counters;
ms_message("Configuring state = %i with message %s", status, message?message:"");
- stats* counters = get_stats(lc);
+ counters = get_stats(lc);
if (status == LinphoneConfiguringSkipped) {
counters->number_of_LinphoneConfiguringSkipped++;
} else if (status == LinphoneConfiguringFailed) {
@@ -83,9 +84,14 @@ static void remote_provisioning_default_values(void) {
lpc = linphone_core_create_proxy_config(marie->lc);
CU_ASSERT_TRUE(lpc->reg_sendregister == TRUE);
CU_ASSERT_TRUE(lpc->expires == 604800);
- CU_ASSERT_TRUE(strcmp(lpc->reg_proxy, "") == 0);
- CU_ASSERT_TRUE(strcmp(lpc->reg_route, "") == 0);
- CU_ASSERT_TRUE(strcmp(lpc->reg_identity, "sip:?@sip.linphone.org") == 0);
+ CU_ASSERT_STRING_EQUAL(lpc->reg_proxy, "");
+ CU_ASSERT_STRING_EQUAL(lpc->reg_route, "");
+ CU_ASSERT_STRING_EQUAL(lpc->reg_identity, "sip:?@sip.linphone.org");
+ {
+ LpConfig* lp = linphone_core_get_config(marie->lc);
+ CU_ASSERT_STRING_EQUAL(lp_config_get_string(lp,"app","toto","empty"),"titi");
+ }
+
linphone_core_manager_destroy(marie);
}
diff --git a/tester/setup_tester.c b/tester/setup_tester.c
index dc30e058e..760cdf6bd 100644
--- a/tester/setup_tester.c
+++ b/tester/setup_tester.c
@@ -21,7 +21,7 @@
#include "linphonecore.h"
#include "liblinphone_tester.h"
#include "lpconfig.h"
-
+#include "private.h"
static void core_init_test(void) {
LinphoneCoreVTable v_table;
@@ -104,10 +104,70 @@ static void linphone_lpconfig_from_buffer(){
lp_config_destroy(conf);
}
+void linphone_proxy_config_address_equal_test() {
+ LinphoneAddress *a = linphone_address_new("sip:toto@titi");
+ LinphoneAddress *b = linphone_address_new("sips:toto@titi");
+ LinphoneAddress *c = linphone_address_new("sip:toto@titi;transport=tcp");
+ LinphoneAddress *d = linphone_address_new("sip:toto@titu");
+ LinphoneAddress *e = linphone_address_new("sip:toto@titi;transport=udp");
+ CU_ASSERT_FALSE(linphone_proxy_config_address_equal(a,NULL));
+ CU_ASSERT_FALSE(linphone_proxy_config_address_equal(a,b));
+ CU_ASSERT_FALSE(linphone_proxy_config_address_equal(a,c));
+ CU_ASSERT_FALSE(linphone_proxy_config_address_equal(a,d));
+ CU_ASSERT_TRUE(linphone_proxy_config_address_equal(a,e));
+ CU_ASSERT_TRUE(linphone_proxy_config_address_equal(NULL,NULL));
+
+ linphone_address_destroy(a);
+ linphone_address_destroy(b);
+ linphone_address_destroy(c);
+ linphone_address_destroy(d);
+}
+
+void linphone_proxy_config_is_server_config_changed_test() {
+ LinphoneProxyConfig* proxy_config = linphone_proxy_config_new();
+
+ linphone_proxy_config_set_identity(proxy_config,"sip:toto@titi");
+ linphone_proxy_config_edit(proxy_config);
+ linphone_proxy_config_set_identity(proxy_config,"sips:toto@titi");
+ CU_ASSERT_TRUE(linphone_proxy_config_is_server_config_changed(proxy_config));
+
+ linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org");
+ linphone_proxy_config_edit(proxy_config);
+ linphone_proxy_config_set_server_addr(proxy_config,"sip:toto.com");
+ CU_ASSERT_TRUE(linphone_proxy_config_is_server_config_changed(proxy_config));
+
+ linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org");
+ linphone_proxy_config_edit(proxy_config);
+ linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org:4444");
+ CU_ASSERT_TRUE(linphone_proxy_config_is_server_config_changed(proxy_config));
+
+ linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org");
+ linphone_proxy_config_edit(proxy_config);
+ linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org;transport=tcp");
+ CU_ASSERT_TRUE(linphone_proxy_config_is_server_config_changed(proxy_config));
+
+ linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org");
+ linphone_proxy_config_edit(proxy_config);
+ linphone_proxy_config_set_server_addr(proxy_config,"sip:sip.linphone.org;param=blue");
+ CU_ASSERT_FALSE(linphone_proxy_config_is_server_config_changed(proxy_config));
+
+
+ linphone_proxy_config_edit(proxy_config);
+ linphone_proxy_config_set_contact_parameters(proxy_config,"blabla=blue");
+ CU_ASSERT_FALSE(linphone_proxy_config_is_server_config_changed(proxy_config));
+
+ linphone_proxy_config_edit(proxy_config);
+ linphone_proxy_config_enable_register(proxy_config,TRUE);
+ CU_ASSERT_FALSE(linphone_proxy_config_is_server_config_changed(proxy_config));
+
+ linphone_proxy_config_destroy(proxy_config);
+}
test_t setup_tests[] = {
{ "Linphone Address", linphone_address_test },
+ { "Linphone proxy config address equal (internal api)", linphone_proxy_config_address_equal_test},
+ { "Linphone proxy config server address change (internal api)", linphone_proxy_config_is_server_config_changed_test},
{ "Linphone core init/uninit", core_init_test },
{ "Linphone random transport port",core_sip_transport_test},
{ "Linphone interpret url", linphone_interpret_url_test },
diff --git a/tester/stun_tester.c b/tester/stun_tester.c
index d19650f06..99b1190ed 100644
--- a/tester/stun_tester.c
+++ b/tester/stun_tester.c
@@ -61,7 +61,7 @@ static void linphone_stun_test_encode()
len = test_stun_encode(bigBuff, bigLen, TRUE);
CU_ASSERT(len > 0);
- ms_message("STUN message encoded in %zu bytes", len);
+ ms_message("STUN message encoded in %i bytes", (int)len);
}
diff --git a/tester/tester.c b/tester/tester.c
index 3623073e4..268a0f302 100644
--- a/tester/tester.c
+++ b/tester/tester.c
@@ -49,6 +49,9 @@ const char *liblinphone_tester_file_prefix="./app/native/assets/";
const char *liblinphone_tester_file_prefix=".";
#endif
+/* TODO: have the same "static" for QNX and windows as above? */
+const char *liblinphone_tester_writable_dir_prefix = ".";
+
const char *userhostsfile = "tester_hosts";
void liblinphone_tester_clock_start(MSTimeSpec *start){
@@ -80,8 +83,8 @@ LinphoneAddress * create_linphone_address(const char * domain) {
static void auth_info_requested(LinphoneCore *lc, const char *realm, const char *username, const char *domain) {
stats* counters;
ms_message("Auth info requested for user id [%s] at realm [%s]\n"
- ,username
- ,realm);
+ ,username
+ ,realm);
counters = get_stats(lc);
counters->number_of_auth_info_requested++;
}
@@ -147,7 +150,7 @@ bool_t wait_for(LinphoneCore* lc_1, LinphoneCore* lc_2,int* counter,int value) {
bool_t wait_for_list(MSList* lcs,int* counter,int value,int timeout_ms) {
MSList* iterator;
MSTimeSpec start;
-
+
liblinphone_tester_clock_start(&start);
while ((counter==NULL || *counternext) {
@@ -164,7 +167,7 @@ static void set_codec_enable(LinphoneCore* lc,const char* type,int rate,bool_t e
MSList* codecs_it;
PayloadType* pt;
for (codecs_it=codecs;codecs_it!=NULL;codecs_it=codecs_it->next) {
- linphone_core_enable_payload_type(lc,(PayloadType*)codecs_it->data,0);
+ linphone_core_enable_payload_type(lc,(PayloadType*)codecs_it->data,0);
}
if((pt = linphone_core_find_payload_type(lc,type,rate,1))) {
linphone_core_enable_payload_type(lc,pt, enable);
@@ -196,6 +199,9 @@ LinphoneCoreManager* linphone_core_manager_new2(const char* rc_file, int check_f
mgr->v_table.call_state_changed=call_state_changed;
mgr->v_table.text_received=text_message_received;
mgr->v_table.message_received=message_received;
+ mgr->v_table.file_transfer_received=file_transfer_received;
+ mgr->v_table.file_transfer_send=file_transfer_send;
+ mgr->v_table.file_transfer_progress_indication=file_transfer_progress_indication;
mgr->v_table.is_composing_received=is_composing_received;
mgr->v_table.new_subscription_requested=new_subscription_requested;
mgr->v_table.notify_presence_received=notify_presence_received;
@@ -285,6 +291,21 @@ int liblinphone_tester_test_suite_index(const char *suite_name) {
return -1;
}
+void liblinphone_tester_list_suites() {
+ int j;
+ for(j=0;jtests[test_index].name;
}
+void liblinphone_tester_set_fileprefix(const char* file_prefix){
+ liblinphone_tester_file_prefix = file_prefix;
+}
+
+void liblinphone_tester_set_writable_dir_prefix(const char* writable_dir_prefix){
+ liblinphone_tester_writable_dir_prefix = writable_dir_prefix;
+}
+
+
void liblinphone_tester_init(void) {
add_test_suite(&setup_test_suite);
add_test_suite(®ister_test_suite);
@@ -335,6 +365,7 @@ void liblinphone_tester_init(void) {
add_test_suite(&event_test_suite);
add_test_suite(&flexisip_test_suite);
add_test_suite(&remote_provisioning_test_suite);
+ add_test_suite(&quality_reporting_test_suite);
}
void liblinphone_tester_uninit(void) {
@@ -359,13 +390,25 @@ int liblinphone_tester_run_tests(const char *suite_name, const char *test_name)
if (suite_name){
CU_pSuite suite;
CU_basic_set_mode(CU_BRM_VERBOSE);
- suite=CU_get_suite_by_name(suite_name, CU_get_registry());
- if (test_name) {
+ suite=CU_get_suite(suite_name);
+ if (!suite) {
+ ms_error("Could not find suite '%s'. Available suites are:", suite_name);
+ liblinphone_tester_list_suites();
+ return -1;
+ } else if (test_name) {
CU_pTest test=CU_get_test_by_name(test_name, suite);
- CU_ErrorCode err= CU_basic_run_test(suite, test);
- if (err != CUE_SUCCESS) ms_error("CU_basic_run_test error %d", err);
- } else
+ if (!test) {
+ ms_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 sentisitive
+ liblinphone_tester_list_suite_tests(suite->pName);
+ return -2;
+ } else {
+ CU_ErrorCode err= CU_basic_run_test(suite, test);
+ if (err != CUE_SUCCESS) ms_error("CU_basic_run_test error %d", err);
+ }
+ } else {
CU_basic_run_suite(suite);
+ }
} else
{
#if HAVE_CU_CURSES
@@ -383,6 +426,13 @@ int liblinphone_tester_run_tests(const char *suite_name, const char *test_name)
}
ret=CU_get_number_of_tests_failed()!=0;
+
+ /* Redisplay list of failed tests on end */
+ if (CU_get_number_of_failure_records()){
+ CU_basic_show_failures(CU_get_failure_list());
+ printf("\n");
+ }
+
CU_cleanup_registry();
return ret;
}