diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2009-08-11 12:42:38 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2009-08-11 12:42:38 +0000 |
commit | 6f204c13ce8519524eb4da79359ac9b2aea08252 (patch) | |
tree | fd03248a6aa6c121822cbca2507113cf5b86b0f0 | |
parent | 04fbadef1554da3b61c412e030081d1f05c6a99a (diff) |
Ticket #833:
- Initial version of Session Timers (RFC 4028).
- Added new options in pjsua app to configure Session Timers settings.
- Added python tests for Session Timers.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2858 74dad513-b988-da41-8d7b-12977e46ad98
21 files changed, 2023 insertions, 335 deletions
diff --git a/pjsip-apps/src/pjsua/pjsua_app.c b/pjsip-apps/src/pjsua/pjsua_app.c index 41630132..94782173 100644 --- a/pjsip-apps/src/pjsua/pjsua_app.c +++ b/pjsip-apps/src/pjsua/pjsua_app.c @@ -190,6 +190,9 @@ static void usage(void) puts (" --password=string Set authentication password"); puts (" --publish Send presence PUBLISH for this account"); puts (" --use-100rel Require reliable provisional response (100rel)"); + puts (" --use-timer Require session timers"); + puts (" --timer-se Session timers expiration period, in secs (def:1800)"); + puts (" --timer-min-se Session timers minimum expiration period, in secs (def:90)"); puts (" --auto-update-nat=N Where N is 0 or 1 to enable/disable SIP traversal behind"); puts (" symmetric NAT (default 1)"); puts (" --next-cred Add another credentials"); @@ -498,7 +501,8 @@ static pj_status_t parse_args(int argc, char *argv[], OPT_STDOUT_NO_BUF, #endif OPT_AUTO_UPDATE_NAT,OPT_USE_COMPACT_FORM,OPT_DIS_CODEC, - OPT_NO_FORCE_LR + OPT_NO_FORCE_LR, + OPT_TIMER, OPT_TIMER_SE, OPT_TIMER_MIN_SE }; struct pj_getopt_option long_options[] = { { "config-file",1, 0, OPT_CONFIG_FILE}, @@ -609,6 +613,9 @@ static pj_status_t parse_args(int argc, char *argv[], #if defined(PJ_HAS_IPV6) && PJ_HAS_IPV6 { "ipv6", 0, 0, OPT_IPV6}, #endif + { "use-timer", 0, 0, OPT_TIMER}, + { "timer-se", 1, 0, OPT_TIMER_SE}, + { "timer-min-se", 1, 0, OPT_TIMER_MIN_SE}, { NULL, 0, 0, 0} }; pj_status_t status; @@ -825,6 +832,33 @@ static pj_status_t parse_args(int argc, char *argv[], cfg->cfg.require_100rel = PJ_TRUE; break; + case OPT_TIMER: /** session timer */ + cur_acc->require_timer = PJ_TRUE; + cfg->cfg.require_timer = PJ_TRUE; + break; + + case OPT_TIMER_SE: /** session timer session expiration */ + cur_acc->timer_se = pj_strtoul(pj_cstr(&tmp, pj_optarg)); + if (cur_acc->timer_se < 90) { + PJ_LOG(1,(THIS_FILE, + "Error: invalid value for --timer-se " + "(expecting higher than 90)")); + return PJ_EINVAL; + } + cfg->cfg.timer_se = cur_acc->timer_se; + break; + + case OPT_TIMER_MIN_SE: /** session timer minimum session expiration */ + cur_acc->timer_min_se = pj_strtoul(pj_cstr(&tmp, pj_optarg)); + if (cur_acc->timer_min_se < 90) { + PJ_LOG(1,(THIS_FILE, + "Error: invalid value for --timer-min-se " + "(expecting higher than 90)")); + return PJ_EINVAL; + } + cfg->cfg.timer_min_se = cur_acc->timer_min_se; + break; + case OPT_USE_IMS: /* Activate IMS settings */ cur_acc->auth_pref.initial_auth = PJ_TRUE; break; diff --git a/pjsip-apps/src/python/_pjsua.h b/pjsip-apps/src/python/_pjsua.h index d3958d76..931fcbe6 100644 --- a/pjsip-apps/src/python/_pjsua.h +++ b/pjsip-apps/src/python/_pjsua.h @@ -1656,6 +1656,9 @@ typedef struct PyObject *contact_params; PyObject *contact_uri_params; int require_100rel; + int require_timer; + unsigned timer_se; + unsigned timer_min_se; int allow_contact_rewrite; int ka_interval; PyObject *ka_data; @@ -1730,6 +1733,9 @@ static void PyObj_pjsua_acc_config_import(PyObj_pjsua_acc_config *obj, Py_XDECREF(obj->contact_uri_params); obj->contact_uri_params = PyString_FromPJ(&cfg->contact_uri_params); obj->require_100rel = cfg->require_100rel; + obj->require_timer = cfg->require_timer; + obj->timer_se = cfg->timer_se; + obj->timer_min_se = cfg->timer_min_se; obj->allow_contact_rewrite = cfg->allow_contact_rewrite; obj->ka_interval = cfg->ka_interval; Py_XDECREF(obj->ka_data); @@ -1776,6 +1782,9 @@ static void PyObj_pjsua_acc_config_export(pjsua_acc_config *cfg, cfg->contact_params = PyString_ToPJ(obj->contact_params); cfg->contact_uri_params = PyString_ToPJ(obj->contact_uri_params); cfg->require_100rel = obj->require_100rel; + cfg->require_timer = obj->require_timer; + cfg->timer_se = obj->timer_se; + cfg->timer_min_se = obj->timer_min_se; cfg->allow_contact_rewrite = obj->allow_contact_rewrite; cfg->ka_interval = obj->ka_interval; cfg->ka_data = PyString_ToPJ(obj->ka_data); @@ -1921,6 +1930,21 @@ static PyMemberDef PyObj_pjsua_acc_config_members[] = "Require reliable provisional response." }, { + "require_timer", T_INT, + offsetof(PyObj_pjsua_acc_config, require_timer), 0, + "Require session timer." + }, + { + "timer_se", T_INT, + offsetof(PyObj_pjsua_acc_config, timer_se), 0, + "Session timer expiration period, in seconds." + }, + { + "timer_min_se", T_INT, + offsetof(PyObj_pjsua_acc_config, timer_min_se), 0, + "Session timer minimum expiration period, in seconds." + }, + { "allow_contact_rewrite", T_INT, offsetof(PyObj_pjsua_acc_config, allow_contact_rewrite), 0, "Re-REGISTER if behind symmetric NAT." diff --git a/pjsip/build/pjsip_ua.vcproj b/pjsip/build/pjsip_ua.vcproj index 904bae4e..6a011444 100644 --- a/pjsip/build/pjsip_ua.vcproj +++ b/pjsip/build/pjsip_ua.vcproj @@ -34,11 +34,11 @@ <Configurations>
<Configuration
Name="Release|Win32"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-release-defaults.vsprops"
UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
@@ -57,8 +57,8 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -72,7 +72,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -92,10 +92,10 @@ </Configuration>
<Configuration
Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -114,9 +114,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -130,7 +130,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -158,10 +158,10 @@ </Configuration>
<Configuration
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -180,9 +180,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -196,7 +196,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -223,12 +223,11 @@ />
</Configuration>
<Configuration
- Name="Debug|Win32"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
+ Name="Release|Pocket PC 2003 (ARMV4)"
ConfigurationType="4"
- UseOfMFC="0"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -247,8 +246,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
+ ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -262,7 +262,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -274,18 +274,26 @@ Name="VCBscMakeTool"
/>
<Tool
- Name="VCFxCopTool"
+ Name="VCCodeSignTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
+ <DeploymentTool
+ ForceDirty="-1"
+ RemoteDirectory=""
+ RegisterOutput="0"
+ AdditionalFiles=""
+ />
+ <DebuggerTool
+ />
</Configuration>
<Configuration
- Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release|Smartphone 2003 (ARMV4)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -304,9 +312,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -320,7 +328,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -347,11 +355,11 @@ />
</Configuration>
<Configuration
- Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -370,9 +378,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -386,7 +394,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -413,12 +421,11 @@ />
</Configuration>
<Configuration
- Name="Debug-Static|Win32"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
+ Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"
ConfigurationType="4"
- UseOfMFC="0"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -437,8 +444,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
+ ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -452,7 +460,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -464,18 +472,27 @@ Name="VCBscMakeTool"
/>
<Tool
- Name="VCFxCopTool"
+ Name="VCCodeSignTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
+ <DeploymentTool
+ ForceDirty="-1"
+ RemoteDirectory=""
+ RegisterOutput="0"
+ AdditionalFiles=""
+ />
+ <DebuggerTool
+ />
</Configuration>
<Configuration
- Name="Debug-Static|Windows Mobile 6 Standard SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug|Win32"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-common-defaults.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
@@ -494,9 +511,8 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
- ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -510,7 +526,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -522,26 +538,18 @@ Name="VCBscMakeTool"
/>
<Tool
- Name="VCCodeSignTool"
+ Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
- <DeploymentTool
- ForceDirty="-1"
- RemoteDirectory=""
- RegisterOutput="0"
- AdditionalFiles=""
- />
- <DebuggerTool
- />
</Configuration>
<Configuration
- Name="Debug-Static|Windows Mobile 6 Professional SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -560,9 +568,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -576,7 +584,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -603,12 +611,11 @@ />
</Configuration>
<Configuration
- Name="Release-Dynamic|Win32"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
+ Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
ConfigurationType="4"
- UseOfMFC="0"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -627,8 +634,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
+ ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -642,7 +650,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -654,18 +662,26 @@ Name="VCBscMakeTool"
/>
<Tool
- Name="VCFxCopTool"
+ Name="VCCodeSignTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
+ <DeploymentTool
+ ForceDirty="-1"
+ RemoteDirectory=""
+ RegisterOutput="0"
+ AdditionalFiles=""
+ />
+ <DebuggerTool
+ />
</Configuration>
<Configuration
- Name="Release-Dynamic|Windows Mobile 6 Standard SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug|Pocket PC 2003 (ARMV4)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -684,9 +700,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -700,7 +716,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -727,11 +743,11 @@ />
</Configuration>
<Configuration
- Name="Release-Dynamic|Windows Mobile 6 Professional SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug|Smartphone 2003 (ARMV4)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -750,9 +766,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -766,7 +782,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -793,12 +809,11 @@ />
</Configuration>
<Configuration
- Name="Debug-Dynamic|Win32"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
+ Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
ConfigurationType="4"
- UseOfMFC="0"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -817,8 +832,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
+ ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -832,7 +848,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -844,18 +860,26 @@ Name="VCBscMakeTool"
/>
<Tool
- Name="VCFxCopTool"
+ Name="VCCodeSignTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
+ <DeploymentTool
+ ForceDirty="-1"
+ RemoteDirectory=""
+ RegisterOutput="0"
+ AdditionalFiles=""
+ />
+ <DebuggerTool
+ />
</Configuration>
<Configuration
- Name="Debug-Dynamic|Windows Mobile 6 Standard SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -874,9 +898,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -890,7 +914,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -917,11 +941,12 @@ />
</Configuration>
<Configuration
- Name="Debug-Dynamic|Windows Mobile 6 Professional SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Static|Win32"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-common-defaults.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
@@ -940,9 +965,8 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
- ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -956,7 +980,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -968,27 +992,18 @@ Name="VCBscMakeTool"
/>
<Tool
- Name="VCCodeSignTool"
+ Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
- <DeploymentTool
- ForceDirty="-1"
- RemoteDirectory=""
- RegisterOutput="0"
- AdditionalFiles=""
- />
- <DebuggerTool
- />
</Configuration>
<Configuration
- Name="Release-Static|Win32"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
+ Name="Debug-Static|Windows Mobile 6 Standard SDK (ARMV4I)"
ConfigurationType="4"
- UseOfMFC="0"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1007,8 +1022,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
+ ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1022,7 +1038,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1034,18 +1050,26 @@ Name="VCBscMakeTool"
/>
<Tool
- Name="VCFxCopTool"
+ Name="VCCodeSignTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
+ <DeploymentTool
+ ForceDirty="-1"
+ RemoteDirectory=""
+ RegisterOutput="0"
+ AdditionalFiles=""
+ />
+ <DebuggerTool
+ />
</Configuration>
<Configuration
- Name="Release-Static|Windows Mobile 6 Standard SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Static|Windows Mobile 6 Professional SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1064,9 +1088,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1080,7 +1104,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1107,11 +1131,11 @@ />
</Configuration>
<Configuration
- Name="Release-Static|Windows Mobile 6 Professional SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Static|Pocket PC 2003 (ARMV4)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1130,9 +1154,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1146,7 +1170,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1173,11 +1197,11 @@ />
</Configuration>
<Configuration
- Name="Release|Pocket PC 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Static|Smartphone 2003 (ARMV4)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1196,9 +1220,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1212,7 +1236,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1239,11 +1263,11 @@ />
</Configuration>
<Configuration
- Name="Debug|Pocket PC 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Static|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1262,9 +1286,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1278,7 +1302,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1305,11 +1329,11 @@ />
</Configuration>
<Configuration
- Name="Debug-Static|Pocket PC 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Static|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1328,9 +1352,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1344,7 +1368,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1371,11 +1395,12 @@ />
</Configuration>
<Configuration
- Name="Release-Dynamic|Pocket PC 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Dynamic|Win32"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-release-defaults.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1394,9 +1419,8 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
- ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1410,7 +1434,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1422,26 +1446,18 @@ Name="VCBscMakeTool"
/>
<Tool
- Name="VCCodeSignTool"
+ Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
- <DeploymentTool
- ForceDirty="-1"
- RemoteDirectory=""
- RegisterOutput="0"
- AdditionalFiles=""
- />
- <DebuggerTool
- />
</Configuration>
<Configuration
- Name="Debug-Dynamic|Pocket PC 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Dynamic|Windows Mobile 6 Standard SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1460,9 +1476,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1476,7 +1492,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1503,11 +1519,11 @@ />
</Configuration>
<Configuration
- Name="Release-Static|Pocket PC 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Dynamic|Windows Mobile 6 Professional SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1526,9 +1542,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1542,7 +1558,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1569,11 +1585,11 @@ />
</Configuration>
<Configuration
- Name="Release|Smartphone 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Dynamic|Pocket PC 2003 (ARMV4)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1592,9 +1608,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1608,7 +1624,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1635,11 +1651,11 @@ />
</Configuration>
<Configuration
- Name="Debug|Smartphone 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Dynamic|Smartphone 2003 (ARMV4)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1658,9 +1674,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1674,7 +1690,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1701,11 +1717,11 @@ />
</Configuration>
<Configuration
- Name="Debug-Static|Smartphone 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1724,9 +1740,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1740,7 +1756,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1767,11 +1783,11 @@ />
</Configuration>
<Configuration
- Name="Release-Dynamic|Smartphone 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Dynamic|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1790,9 +1806,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1806,7 +1822,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1833,11 +1849,12 @@ />
</Configuration>
<Configuration
- Name="Debug-Dynamic|Smartphone 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Dynamic|Win32"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-common-defaults.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1856,9 +1873,8 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
- ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1872,7 +1888,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1884,26 +1900,18 @@ Name="VCBscMakeTool"
/>
<Tool
- Name="VCCodeSignTool"
+ Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
- <DeploymentTool
- ForceDirty="-1"
- RemoteDirectory=""
- RegisterOutput="0"
- AdditionalFiles=""
- />
- <DebuggerTool
- />
</Configuration>
<Configuration
- Name="Release-Static|Smartphone 2003 (ARMV4)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Dynamic|Windows Mobile 6 Standard SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1922,9 +1930,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -1938,7 +1946,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -1965,11 +1973,11 @@ />
</Configuration>
<Configuration
- Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Dynamic|Windows Mobile 6 Professional SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -1988,9 +1996,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2004,7 +2012,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2031,11 +2039,11 @@ />
</Configuration>
<Configuration
- Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Dynamic|Pocket PC 2003 (ARMV4)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -2054,9 +2062,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2070,7 +2078,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2097,11 +2105,11 @@ />
</Configuration>
<Configuration
- Name="Debug-Static|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Dynamic|Smartphone 2003 (ARMV4)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -2120,9 +2128,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2136,7 +2144,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2163,11 +2171,11 @@ />
</Configuration>
<Configuration
- Name="Release-Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -2186,9 +2194,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2202,7 +2210,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2229,11 +2237,11 @@ />
</Configuration>
<Configuration
- Name="Debug-Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Debug-Dynamic|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -2252,9 +2260,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2268,7 +2276,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2295,11 +2303,12 @@ />
</Configuration>
<Configuration
- Name="Release-Static|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Static|Win32"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-win32-release-defaults.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
@@ -2318,9 +2327,8 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
- ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2334,7 +2342,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-$(PlatformName)-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2346,26 +2354,18 @@ Name="VCBscMakeTool"
/>
<Tool
- Name="VCCodeSignTool"
+ Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
- <DeploymentTool
- ForceDirty="-1"
- RemoteDirectory=""
- RegisterOutput="0"
- AdditionalFiles=""
- />
- <DebuggerTool
- />
</Configuration>
<Configuration
- Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Static|Windows Mobile 6 Standard SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -2384,9 +2384,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2400,7 +2400,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6std-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2427,11 +2427,11 @@ />
</Configuration>
<Configuration
- Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Static|Windows Mobile 6 Professional SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm6-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -2450,9 +2450,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2466,7 +2466,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm6pro-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2493,11 +2493,11 @@ />
</Configuration>
<Configuration
- Name="Debug-Static|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Static|Pocket PC 2003 (ARMV4)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -2516,9 +2516,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2532,7 +2532,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2559,11 +2559,11 @@ />
</Configuration>
<Configuration
- Name="Release-Dynamic|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Static|Smartphone 2003 (ARMV4)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm2003-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -2582,9 +2582,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2598,7 +2598,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm2003sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2625,11 +2625,11 @@ />
</Configuration>
<Configuration
- Name="Debug-Dynamic|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-debug-dynamic-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-common-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
+ Name="Release-Static|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -2648,9 +2648,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2664,7 +2664,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5ppc-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2692,10 +2692,10 @@ </Configuration>
<Configuration
Name="Release-Static|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"
- InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="1"
ConfigurationType="4"
+ InheritedPropertySheets="..\..\build\vs\pjproject-vs8-release-static-defaults.vsprops;..\..\build\vs\pjproject-vs8-wm5-release-defaults.vsprops"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
@@ -2714,9 +2714,9 @@ />
<Tool
Name="VCCLCompilerTool"
- PreprocessorDefinitions="_LIB;"
ExecutionBucket="7"
AdditionalIncludeDirectories="../include,../../pjlib/include,../../pjlib-util/include,../../pjmedia/include"
+ PreprocessorDefinitions="_LIB;"
PrecompiledHeaderFile=""
/>
<Tool
@@ -2730,7 +2730,7 @@ />
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
+ OutputFile="..\lib\pjsip-ua-$(TargetCPU)-wm5sp-vc$(VSVer)-$(ConfigurationName).lib"
/>
<Tool
Name="VCALinkTool"
@@ -2943,6 +2943,10 @@ </FileConfiguration>
</File>
<File
+ RelativePath="..\src\pjsip-ua\sip_timer.c"
+ >
+ </File>
+ <File
RelativePath="..\src\pjsip-ua\sip_xfer.c"
>
<FileConfiguration
@@ -3026,6 +3030,10 @@ >
</File>
<File
+ RelativePath="..\include\pjsip-ua\sip_timer.h"
+ >
+ </File>
+ <File
RelativePath="..\include\pjsip-ua\sip_xfer.h"
>
</File>
diff --git a/pjsip/include/pjsip-ua/sip_inv.h b/pjsip/include/pjsip-ua/sip_inv.h index 60a62388..e85b00b0 100644 --- a/pjsip/include/pjsip-ua/sip_inv.h +++ b/pjsip/include/pjsip-ua/sip_inv.h @@ -305,8 +305,16 @@ enum pjsip_inv_option */ PJSIP_INV_REQUIRE_TIMER = 64, + /** + * Session timer extension will always be used even when peer doesn't + * support/want session timer. + */ + PJSIP_INV_ALWAYS_USE_TIMER = 128, + }; +/* Forward declaration of Session Timers */ +struct pjsip_timer; /** * This structure describes the invite session. @@ -331,6 +339,7 @@ struct pjsip_inv_session pjsip_tx_data *last_ack; /**< Last ACK request */ pj_int32_t last_ack_cseq; /**< CSeq of last ACK */ void *mod_data[PJSIP_MAX_MODULE];/**< Modules data. */ + struct pjsip_timer *timer; /**< Session Timers. */ }; diff --git a/pjsip/include/pjsip-ua/sip_timer.h b/pjsip/include/pjsip-ua/sip_timer.h new file mode 100644 index 00000000..cb77fae7 --- /dev/null +++ b/pjsip/include/pjsip-ua/sip_timer.h @@ -0,0 +1,256 @@ +/* $Id$ */ +/* + * Copyright (C) 2009 Teluu Inc. (http://www.teluu.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __PJSIP_TIMER_H__ +#define __PJSIP_TIMER_H__ + + +/** + * @file sip_timer.h + * @brief SIP Session Timers support (RFC 4028 - Session Timer in SIP) + */ + +#include <pjsip-ua/sip_inv.h> +#include <pjsip/sip_msg.h> + +/** + * @defgroup PJSIP_TIMER SIP Session Timers support (RFC 4028 - Session Timers in SIP) + * @ingroup PJSIP_HIGH_UA + * @brief SIP Session Timers support (RFC 4028 - Session Timers in SIP) + * @{ + * + * \section PJSIP_TIMER_REFERENCE References + * + * References: + * - <A HREF="http://www.ietf.org/rfc/rfc4028.txt">RFC 4028: Session Timers + * in the Session Initiation Protocol (SIP)</A> + */ + +PJ_BEGIN_DECL + +/** + * Opaque declaration of Session Timers. + */ +typedef struct pjsip_timer pjsip_timer; + + +/** + * This structure describes Session Timers settings in an invite session. + */ +typedef struct pjsip_timer_setting +{ + /** + * Specify minimum session expiration period, in seconds. Must not be + * lower than 90. Default is 90. + */ + unsigned min_se; + + /** + * Specify session expiration period, in seconds. Must not be lower than + * #min_se. Default is 1800. + */ + unsigned sess_expires; + +} pjsip_timer_setting; + + +/** + * SIP Session-Expires header (RFC 4028). + */ +typedef struct pjsip_sess_expires_hdr +{ + /** Standard header field. */ + PJSIP_DECL_HDR_MEMBER(struct pjsip_sess_expires_hdr); + + /** Session expiration period */ + unsigned sess_expires; + + /** Refresher */ + pj_str_t refresher; + + /** Other parameters */ + pjsip_param other_param; + +} pjsip_sess_expires_hdr; + + +/** + * SIP Min-SE header (RFC 4028). + */ +typedef struct pjsip_min_se_hdr +{ + /** Standard header field. */ + PJSIP_DECL_HDR_MEMBER(struct pjsip_min_se_hdr); + + /** Minimum session expiration period */ + unsigned min_se; + + /** Other parameters */ + pjsip_param other_param; + +} pjsip_min_se_hdr; + + + +/** + * Initialize Session Timers module. This function must be called once during + * application initialization, to register this module to SIP endpoint. + * + * @param endpt The SIP endpoint instance. + * + * @return PJ_SUCCESS if module is successfully initialized. + */ +PJ_DECL(pj_status_t) pjsip_timer_init_module(pjsip_endpoint *endpt); + + +/** + * Initialize Session Timers setting with default values. + * + * @param setting Session Timers setting to be initialized. + * + * @return PJ_SUCCESS on successful. + */ +PJ_DECL(pj_status_t) pjsip_timer_default_setting(pjsip_timer_setting *setting); + + +/** + * Initialize Session Timers for an invite session. This function should be + * called by application to apply Session Timers setting, otherwise invite + * session will apply default setting to the Session Timers. + * + * @param inv The invite session. + * @param setting Session Timers setting, see @pjsip_timer_setting. + * If setting is NULL, default setting will be applied. + * + * @return PJ_SUCCESS on successful. + */ +PJ_DECL(pj_status_t) pjsip_timer_init_session( + pjsip_inv_session *inv, + const pjsip_timer_setting *setting); + + +/** + * Create Session-Expires header. + * + * @param pool Pool to allocate the header instance from. + * + * @return An empty Session-Expires header instance. + */ +PJ_DECL(pjsip_sess_expires_hdr*) pjsip_sess_expires_hdr_create( + pj_pool_t *pool); + + +/** + * Create Min-SE header. + * + * @param pool Pool to allocate the header instance from. + * + * @return An empty Min-SE header instance. + */ +PJ_DECL(pjsip_min_se_hdr*) pjsip_min_se_hdr_create(pj_pool_t *pool); + + +/** + * Update outgoing request to insert Session Timers headers and also + * signal Session Timers capability in Supported and/or Require headers. + * + * This function will be called internally by the invite session if it + * detects that the session needs Session Timers support. + * + * @param inv The invite session. + * @param tdata Outgoing INVITE or UPDATE request. + * + * @return PJ_SUCCESS on successful. + */ +PJ_DECL(pj_status_t) pjsip_timer_update_req(pjsip_inv_session *inv, + pjsip_tx_data *tdata); + + +/** + * Process Session Timers headers in incoming response, this function + * will only process incoming response with status code 422 (Session + * Interval Too Small) or 2xx (final response). + * + * This function will be called internally by the invite session if it + * detects that the session needs Session Timers support. + * + * @param inv The invite session. + * @param rdata Incoming response data. + * + * @return PJ_SUCCESS on successful. + */ +PJ_DECL(pj_status_t) pjsip_timer_process_resp(pjsip_inv_session *inv, + const pjsip_rx_data *rdata); + + +/** + * Process Session Timers headers in incoming request, this function + * will only process incoming INVITE and UPDATE request. + * + * This function will be called internally by the invite session if it + * detects that the session needs Session Timers support. + * + * @param inv The invite session. + * @param rdata Incoming INVITE or UPDATE request. + * + * @return PJ_SUCCESS on successful. + */ +PJ_DECL(pj_status_t) pjsip_timer_process_req(pjsip_inv_session *inv, + const pjsip_rx_data *rdata); + + +/** + * Update outgoing response to insert Session Timers headers and also + * signal Session Timers capability in Supported and/or Require headers. + * This function will only update outgoing response with status code + * 422 (Session Interval Too Small) or 2xx (final response). + * + * This function will be called internally by the invite session if it + * detects that the session needs Session Timers support. + * + * @param inv The invite session. + * @param tdata Outgoing 422/2xx response. + * + * @return PJ_SUCCESS on successful. + */ +PJ_DECL(pj_status_t) pjsip_timer_update_resp(pjsip_inv_session *inv, + pjsip_tx_data *tdata); + +/** + * End Session Timers in an invite session. + * + * This function will be called internally by the invite session if it + * detects that the session needs Session Timers support. + * + * @param inv The invite session. + * + * @return PJ_SUCCESS on successful. + */ +PJ_DECL(pj_status_t) pjsip_timer_end_session(pjsip_inv_session *inv); + + + +PJ_END_DECL + + +/** + * @} + */ + + +#endif /* __PJSIP_TIMER_H__ */ diff --git a/pjsip/include/pjsip/sip_config.h b/pjsip/include/pjsip/sip_config.h index 293c3c14..22eb0614 100644 --- a/pjsip/include/pjsip/sip_config.h +++ b/pjsip/include/pjsip/sip_config.h @@ -657,7 +657,7 @@ PJ_INLINE(pjsip_cfg_t*) pjsip_cfg(void) #define PJSIP_POOL_INC_DIALOG 512 /* Maximum header types. */ -#define PJSIP_MAX_HEADER_TYPES 64 +#define PJSIP_MAX_HEADER_TYPES 72 /* Maximum URI types. */ #define PJSIP_MAX_URI_TYPES 4 diff --git a/pjsip/include/pjsip_ua.h b/pjsip/include/pjsip_ua.h index 57f95ff1..ce519f83 100644 --- a/pjsip/include/pjsip_ua.h +++ b/pjsip/include/pjsip_ua.h @@ -25,6 +25,7 @@ #include <pjsip-ua/sip_replaces.h> #include <pjsip-ua/sip_xfer.h> #include <pjsip-ua/sip_100rel.h> +#include <pjsip-ua/sip_timer.h> #endif /* __PJSIP_UA_H__ */ diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index e06019d9..0b257c7c 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -926,6 +926,33 @@ typedef struct pjsua_config */ pj_bool_t require_100rel; + /** + * Specify whether support for Session Timers should be required by + * default. Note that this setting can be further customized in account + * configuration (#pjsua_acc_config). + * + * Default: PJ_FALSE + */ + pj_bool_t require_timer; + + /** + * Specify session expiration period of Session Timers, in seconds. + * Note that this setting can be further customized in account + * configuration (#pjsua_acc_config). + * + * Default: 1800 (seconds) + */ + unsigned timer_se; + + /** + * Specify minimum session expiration period of Session Timers, + * in seconds. Note that this setting can be further customized in + * account configuration (#pjsua_acc_config). + * + * Default: 90 (seconds) + */ + unsigned timer_min_se; + /** * Number of credentials in the credential array. */ @@ -1698,6 +1725,30 @@ typedef struct pjsua_acc_config pj_bool_t require_100rel; /** + * Specify whether support for Session Timers should be required for all + * sessions of this account. + * + * Default: PJ_FALSE + */ + pj_bool_t require_timer; + + /** + * Specify session expiration period of Session Timers, in seconds, + * for this account. + * + * Default: 1800 (seconds) + */ + unsigned timer_se; + + /** + * Specify minimum session expiration period of Session Timers, + * in seconds, for this account. + * + * Default: 90 (seconds) + */ + unsigned timer_min_se; + + /** * Number of proxies in the proxy array below. */ unsigned proxy_cnt; diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c index ae1011ef..80ae9718 100644 --- a/pjsip/src/pjsip-ua/sip_inv.c +++ b/pjsip/src/pjsip-ua/sip_inv.c @@ -19,6 +19,7 @@ */ #include <pjsip-ua/sip_inv.h> #include <pjsip-ua/sip_100rel.h> +#include <pjsip-ua/sip_timer.h> #include <pjsip/sip_module.h> #include <pjsip/sip_endpoint.h> #include <pjsip/sip_event.h> @@ -231,6 +232,7 @@ void inv_set_state(pjsip_inv_session *inv, pjsip_inv_state state, inv->invite_req = NULL; } pjsip_100rel_end_session(inv); + pjsip_timer_end_session(inv); pjsip_dlg_dec_session(inv->dlg, &mod_inv.mod); } } @@ -481,6 +483,7 @@ static pj_bool_t mod_inv_on_rx_response(pjsip_rx_data *rdata) pjsip_dialog *dlg; pjsip_inv_session *inv; pjsip_msg *msg = rdata->msg_info.msg; + pj_status_t status; dlg = pjsip_rdata_get_dlg(rdata); @@ -508,6 +511,23 @@ static pj_bool_t mod_inv_on_rx_response(pjsip_rx_data *rdata) } + /* Pass response to timer session module */ + status = pjsip_timer_process_resp(inv, rdata); + if (status != PJ_SUCCESS) { + pjsip_event e; + pjsip_tx_data *tdata; + + PJSIP_EVENT_INIT_RX_MSG(e, rdata); + inv_send_ack(inv, &e); + + status = pjsip_inv_end_session(inv, PJSIP_ERRNO_TO_SIP_STATUS(status), + NULL, &tdata); + if (tdata && status == PJ_SUCCESS) + pjsip_inv_send_msg(inv, tdata); + + return PJ_TRUE; + } + /* No other processing needs to be done here. */ return PJ_FALSE; } @@ -634,7 +654,6 @@ PJ_DEF(pj_status_t) pjsip_inv_create_uac( pjsip_dialog *dlg, /* Normalize options */ if (options & PJSIP_INV_REQUIRE_100REL) options |= PJSIP_INV_SUPPORT_100REL; - if (options & PJSIP_INV_REQUIRE_TIMER) options |= PJSIP_INV_SUPPORT_TIMER; @@ -716,7 +735,6 @@ PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, /* Normalize options */ if (*options & PJSIP_INV_REQUIRE_100REL) *options |= PJSIP_INV_SUPPORT_100REL; - if (*options & PJSIP_INV_REQUIRE_TIMER) *options |= PJSIP_INV_SUPPORT_TIMER; @@ -867,13 +885,13 @@ PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, pjsip_msg_find_hdr(msg, PJSIP_H_SUPPORTED, NULL); if (sup_hdr) { unsigned i; - pj_str_t STR_100REL = { "100rel", 6}; - pj_str_t STR_TIMER = { "timer", 5 }; + const pj_str_t STR_100REL = { "100rel", 6}; + const pj_str_t STR_TIMER = { "timer", 5}; for (i=0; i<sup_hdr->count; ++i) { if (pj_stricmp(&sup_hdr->values[i], &STR_100REL)==0) rem_option |= PJSIP_INV_SUPPORT_100REL; - else if (pj_stricmp(&sup_hdr->values[i], &STR_TIMER)==0) + if (pj_stricmp(&sup_hdr->values[i], &STR_TIMER)==0) rem_option |= PJSIP_INV_SUPPORT_TIMER; } } @@ -884,8 +902,8 @@ PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, if (req_hdr) { unsigned i; const pj_str_t STR_100REL = { "100rel", 6}; - const pj_str_t STR_TIMER = { "timer", 5 }; const pj_str_t STR_REPLACES = { "replaces", 8 }; + const pj_str_t STR_TIMER = { "timer", 5 }; unsigned unsupp_cnt = 0; pj_str_t unsupp_tags[PJSIP_GENERIC_ARRAY_MAX_COUNT]; @@ -895,8 +913,8 @@ PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, { rem_option |= PJSIP_INV_REQUIRE_100REL; - } else if ((*options && PJSIP_INV_SUPPORT_TIMER) && - pj_stricmp(&req_hdr->values[i], &STR_TIMER)==0) + } else if ((*options & PJSIP_INV_SUPPORT_TIMER) && + pj_stricmp(&req_hdr->values[i], &STR_TIMER)==0) { rem_option |= PJSIP_INV_REQUIRE_TIMER; @@ -956,8 +974,8 @@ PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, */ if ( ((*options & PJSIP_INV_REQUIRE_100REL)!=0 && (rem_option & PJSIP_INV_SUPPORT_100REL)==0) || - ((*options & PJSIP_INV_REQUIRE_TIMER)!=0 && - (rem_option & PJSIP_INV_SUPPORT_TIMER)==0)) + ((*options & PJSIP_INV_REQUIRE_100REL)!=0 && + (rem_option & PJSIP_INV_SUPPORT_100REL)==0)) { code = PJSIP_SC_EXTENSION_REQUIRED; status = PJSIP_ERRNO_FROM_SIP_STATUS(code); @@ -971,7 +989,6 @@ PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, if (*options & PJSIP_INV_REQUIRE_100REL) req_hdr->values[req_hdr->count++] = pj_str("100rel"); - if (*options & PJSIP_INV_REQUIRE_TIMER) req_hdr->values[req_hdr->count++] = pj_str("timer"); @@ -1097,7 +1114,6 @@ PJ_DEF(pj_status_t) pjsip_inv_create_uas( pjsip_dialog *dlg, /* Normalize options */ if (options & PJSIP_INV_REQUIRE_100REL) options |= PJSIP_INV_SUPPORT_100REL; - if (options & PJSIP_INV_REQUIRE_TIMER) options |= PJSIP_INV_SUPPORT_TIMER; @@ -1169,7 +1185,7 @@ PJ_DEF(pj_status_t) pjsip_inv_create_uas( pjsip_dialog *dlg, /* Create 100rel handler */ if (inv->options & PJSIP_INV_REQUIRE_100REL) { - pjsip_100rel_attach(inv); + pjsip_100rel_attach(inv); } /* Done */ @@ -1394,16 +1410,25 @@ PJ_DEF(pj_status_t) pjsip_inv_invite( pjsip_inv_session *inv, } /* Add Require header. */ - if (inv->options & PJSIP_INV_REQUIRE_100REL) { - const pj_str_t HREQ = { "Require", 7 }; - const pj_str_t tag_100rel = { "100rel", 6 }; - pjsip_generic_string_hdr *hreq; + if ((inv->options & PJSIP_INV_REQUIRE_100REL) || + (inv->options & PJSIP_INV_REQUIRE_TIMER)) + { + pjsip_require_hdr *hreq; + + hreq = pjsip_require_hdr_create(tdata->pool); - hreq = pjsip_generic_string_hdr_create(tdata->pool, &HREQ, - &tag_100rel); - pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*) hreq); + if (inv->options & PJSIP_INV_REQUIRE_100REL) + hreq->values[hreq->count++] = pj_str("100rel"); + if (inv->options & PJSIP_INV_REQUIRE_TIMER) + hreq->values[hreq->count++] = pj_str("timer"); + + pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*) hreq); } + status = pjsip_timer_update_req(inv, tdata); + if (status != PJ_SUCCESS) + goto on_return; + /* Done. */ *p_tdata = tdata; @@ -1745,6 +1770,27 @@ PJ_DEF(pj_status_t) pjsip_inv_initial_answer( pjsip_inv_session *inv, if (status != PJ_SUCCESS) goto on_return; + /* Invoke Session Timers module */ + status = pjsip_timer_process_req(inv, rdata); + if (status != PJ_SUCCESS) { + pj_status_t status2; + + status2 = pjsip_dlg_modify_response(inv->dlg, tdata, + PJSIP_ERRNO_TO_SIP_STATUS(status), + NULL); + if (status2 != PJ_SUCCESS) { + pjsip_tx_data_dec_ref(tdata); + goto on_return; + } + status2 = pjsip_timer_update_resp(inv, tdata); + if (status2 == PJ_SUCCESS) + *p_tdata = tdata; + else + pjsip_tx_data_dec_ref(tdata); + + goto on_return; + } + /* Process SDP in answer */ status = process_answer(inv, st_code, tdata, sdp); if (status != PJ_SUCCESS) { @@ -1758,6 +1804,9 @@ PJ_DEF(pj_status_t) pjsip_inv_initial_answer( pjsip_inv_session *inv, PJ_LOG(5,(inv->dlg->obj_name, "Initial answer %s", pjsip_tx_data_get_info(inv->last_answer))); + /* Invoke Session Timers */ + pjsip_timer_update_resp(inv, tdata); + *p_tdata = tdata; on_return: @@ -1808,6 +1857,8 @@ PJ_DEF(pj_status_t) pjsip_inv_answer( pjsip_inv_session *inv, goto on_return; } + /* Invoke Session Timers */ + pjsip_timer_update_resp(inv, last_res); *p_tdata = last_res; @@ -1912,6 +1963,9 @@ PJ_DEF(pj_status_t) pjsip_inv_end_session( pjsip_inv_session *inv, case PJSIP_INV_STATE_CONNECTING: case PJSIP_INV_STATE_CONFIRMED: + /* End Session Timer */ + pjsip_timer_end_session(inv); + /* For established dialog, send BYE */ status = pjsip_dlg_create_request(inv->dlg, pjsip_get_bye_method(), -1, &tdata); @@ -2300,6 +2354,10 @@ PJ_DEF(pj_status_t) pjsip_inv_update ( pjsip_inv_session *inv, /* Unlock dialog. */ pjsip_dlg_dec_lock(inv->dlg); + status = pjsip_timer_update_req(inv, tdata); + if (status != PJ_SUCCESS) + goto on_error; + *p_tdata = tdata; return PJ_SUCCESS; @@ -2581,6 +2639,15 @@ static void inv_respond_incoming_update(pjsip_inv_session *inv, pj_status_t status; pjsip_tx_data *tdata = NULL; + /* Invoke Session Timers module */ + status = pjsip_timer_process_req(inv, rdata); + if (status != PJ_SUCCESS) { + status = pjsip_dlg_create_response(inv->dlg, rdata, + PJSIP_ERRNO_TO_SIP_STATUS(status), + NULL, &tdata); + goto on_return; + } + neg_state = pjmedia_sdp_neg_get_state(inv->neg); /* Send 491 if we receive UPDATE while we're waiting for an answer */ @@ -2634,6 +2701,11 @@ static void inv_respond_incoming_update(pjsip_inv_session *inv, } } +on_return: + /* Invoke Session Timers */ + if (status == PJ_SUCCESS) + status = pjsip_timer_update_resp(inv, tdata); + if (status != PJ_SUCCESS) { if (tdata != NULL) { pjsip_tx_data_dec_ref(tdata); @@ -3609,6 +3681,20 @@ static void inv_on_state_confirmed( pjsip_inv_session *inv, pjsip_event *e) /* Save the invite transaction. */ inv->invite_tsx = tsx; + /* Process session timers headers in the re-INVITE */ + status = pjsip_timer_process_req(inv, rdata); + if (status != PJ_SUCCESS) { + status = pjsip_dlg_create_response(inv->dlg, rdata, + PJSIP_ERRNO_TO_SIP_STATUS(status), + NULL, &tdata); + if (status != PJ_SUCCESS) + return; + + pjsip_timer_update_resp(inv, tdata); + status = pjsip_dlg_send_response(dlg, tsx, tdata); + return; + } + /* Process SDP in incoming message. */ status = inv_check_sdp_in_incoming_msg(inv, tsx, rdata); @@ -3716,6 +3802,9 @@ static void inv_on_state_confirmed( pjsip_inv_session *inv, pjsip_event *e) return; } + /* Invoke Session Timers */ + pjsip_timer_update_resp(inv, tdata); + /* Send 2xx regardless of the status of negotiation */ status = pjsip_inv_send_msg(inv, tdata); diff --git a/pjsip/src/pjsip-ua/sip_timer.c b/pjsip/src/pjsip-ua/sip_timer.c new file mode 100644 index 00000000..628e0e2c --- /dev/null +++ b/pjsip/src/pjsip-ua/sip_timer.c @@ -0,0 +1,917 @@ +/* $Id$ */ +/* + * Copyright (C) 2009 Teluu Inc. (http://www.teluu.com) + * + * 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 <pjsip-ua/sip_timer.h> +#include <pjsip/print_util.h> +#include <pjsip/sip_endpoint.h> +#include <pj/log.h> +#include <pj/math.h> +#include <pj/os.h> +#include <pj/pool.h> + +#define THIS_FILE "sip_timer.c" + + +/* Constant values of Session Timers */ +#define ABS_MIN_SE 90 /* Absolute Min-SE, in seconds */ +#define DEF_SE 1800 /* Default SE, in seconds */ + + +/* String definitions */ +static const pj_str_t STR_SE = {"Session-Expires", 15}; +static const pj_str_t STR_SHORT_SE = {"x", 1}; +static const pj_str_t STR_MIN_SE = {"Min-SE", 6}; +static const pj_str_t STR_REFRESHER = {"refresher", 9}; +static const pj_str_t STR_UAC = {"uac", 3}; +static const pj_str_t STR_UAS = {"uas", 3}; +static const pj_str_t STR_TIMER = {"timer", 5}; + + +/* Enumeration of refresher */ +enum timer_refresher { + TR_UNKNOWN, + TR_UAC, + TR_UAS +}; + +/* Structure definition of Session Timers */ +typedef struct pjsip_timer +{ + pj_bool_t active; /**< Active/inactive flag */ + pjsip_timer_setting setting; /**< Session Timers setting */ + enum timer_refresher refresher; /**< Session refresher */ + pj_time_val last_refresh; /**< Timestamp of last + refresh */ + pj_timer_entry timer; /**< Timer entry */ + pj_bool_t use_update; /**< Use UPDATE method to + refresh the session */ + +} pjsip_timer; + +/* External global vars */ +extern pj_bool_t pjsip_use_compact_form; +extern const pjsip_method pjsip_update_method; + +/* Local functions & vars */ +static void stop_timer(pjsip_inv_session *inv); +static void start_timer(pjsip_inv_session *inv); +static pj_bool_t is_initialized; + +/* + * Session-Expires header vptr. + */ +static int se_hdr_print(pjsip_sess_expires_hdr *hdr, + char *buf, pj_size_t size); +static pjsip_sess_expires_hdr* se_hdr_clone(pj_pool_t *pool, + const pjsip_sess_expires_hdr *hdr); +static pjsip_sess_expires_hdr* se_hdr_shallow_clone( + pj_pool_t *pool, + const pjsip_sess_expires_hdr* hdr); + +static pjsip_hdr_vptr se_hdr_vptr = +{ + (pjsip_hdr_clone_fptr) &se_hdr_clone, + (pjsip_hdr_clone_fptr) &se_hdr_shallow_clone, + (pjsip_hdr_print_fptr) &se_hdr_print, +}; + +/* + * Min-SE header vptr. + */ +static int min_se_hdr_print(pjsip_min_se_hdr *hdr, + char *buf, pj_size_t size); +static pjsip_min_se_hdr* min_se_hdr_clone(pj_pool_t *pool, + const pjsip_min_se_hdr *hdr); +static pjsip_min_se_hdr* min_se_hdr_shallow_clone( + pj_pool_t *pool, + const pjsip_min_se_hdr* hdr); + +static pjsip_hdr_vptr min_se_hdr_vptr = +{ + (pjsip_hdr_clone_fptr) &min_se_hdr_clone, + (pjsip_hdr_clone_fptr) &min_se_hdr_shallow_clone, + (pjsip_hdr_print_fptr) &min_se_hdr_print, +}; + +/* + * Session-Expires header vptr. + */ +static int se_hdr_print(pjsip_sess_expires_hdr *hdr, + char *buf, pj_size_t size) +{ + char *p = buf; + char *endbuf = buf+size; + int printed; + const pjsip_parser_const_t *pc = pjsip_parser_const(); + const pj_str_t *hname = pjsip_use_compact_form? &hdr->sname : &hdr->name; + + copy_advance(p, (*hname)); + *p++ = ':'; + *p++ = ' '; + + printed = pj_utoa(hdr->sess_expires, p); + p += printed; + + if (hdr->refresher.slen && (endbuf-p) > (hdr->refresher.slen + 2)) + { + *p++ = ';'; + copy_advance(p, STR_REFRESHER); + *p++ = '='; + copy_advance(p, hdr->refresher); + } + + printed = pjsip_param_print_on(&hdr->other_param, p, endbuf-p, + &pc->pjsip_TOKEN_SPEC, + &pc->pjsip_TOKEN_SPEC, ';'); + if (printed < 0) + return printed; + + p += printed; + return p - buf; +} + +static pjsip_sess_expires_hdr* se_hdr_clone(pj_pool_t *pool, + const pjsip_sess_expires_hdr *hsrc) +{ + pjsip_sess_expires_hdr *hdr = pjsip_sess_expires_hdr_create(pool); + hdr->sess_expires = hsrc->sess_expires; + pj_strdup(pool, &hdr->refresher, &hsrc->refresher); + pjsip_param_clone(pool, &hdr->other_param, &hsrc->other_param); + return hdr; +} + +static pjsip_sess_expires_hdr* se_hdr_shallow_clone( + pj_pool_t *pool, + const pjsip_sess_expires_hdr* hsrc) +{ + pjsip_sess_expires_hdr *hdr = PJ_POOL_ALLOC_T(pool,pjsip_sess_expires_hdr); + pj_memcpy(hdr, hsrc, sizeof(*hdr)); + pjsip_param_shallow_clone(pool, &hdr->other_param, &hsrc->other_param); + return hdr; +} + +/* + * Min-SE header vptr. + */ +static int min_se_hdr_print(pjsip_min_se_hdr *hdr, + char *buf, pj_size_t size) +{ + char *p = buf; + char *endbuf = buf+size; + int printed; + const pjsip_parser_const_t *pc = pjsip_parser_const(); + + copy_advance(p, hdr->name); + *p++ = ':'; + *p++ = ' '; + + printed = pj_utoa(hdr->min_se, p); + p += printed; + + printed = pjsip_param_print_on(&hdr->other_param, p, endbuf-p, + &pc->pjsip_TOKEN_SPEC, + &pc->pjsip_TOKEN_SPEC, ';'); + if (printed < 0) + return printed; + + p += printed; + return p - buf; +} + +static pjsip_min_se_hdr* min_se_hdr_clone(pj_pool_t *pool, + const pjsip_min_se_hdr *hsrc) +{ + pjsip_min_se_hdr *hdr = pjsip_min_se_hdr_create(pool); + hdr->min_se = hsrc->min_se; + pjsip_param_clone(pool, &hdr->other_param, &hsrc->other_param); + return hdr; +} + +static pjsip_min_se_hdr* min_se_hdr_shallow_clone( + pj_pool_t *pool, + const pjsip_min_se_hdr* hsrc) +{ + pjsip_min_se_hdr *hdr = PJ_POOL_ALLOC_T(pool, pjsip_min_se_hdr); + pj_memcpy(hdr, hsrc, sizeof(*hdr)); + pjsip_param_shallow_clone(pool, &hdr->other_param, &hsrc->other_param); + return hdr; +} + + +/* + * Parse Session-Expires header. + */ +static pjsip_hdr *parse_hdr_se(pjsip_parse_ctx *ctx) +{ + pjsip_sess_expires_hdr *hdr = pjsip_sess_expires_hdr_create(ctx->pool); + const pjsip_parser_const_t *pc = pjsip_parser_const(); + pj_str_t token; + + pj_scan_get(ctx->scanner, &pc->pjsip_DIGIT_SPEC, &token); + hdr->sess_expires = pj_strtoul(&token); + + while (*ctx->scanner->curptr == ';') { + pj_str_t pname, pvalue; + + pj_scan_get_char(ctx->scanner); + pjsip_parse_param_imp(ctx->scanner, ctx->pool, &pname, &pvalue, 0); + + if (pj_stricmp(&pname, &STR_REFRESHER)==0) { + hdr->refresher = pvalue; + } else { + pjsip_param *param = PJ_POOL_ALLOC_T(ctx->pool, pjsip_param); + param->name = pname; + param->value = pvalue; + pj_list_push_back(&hdr->other_param, param); + } + } + pjsip_parse_end_hdr_imp( ctx->scanner ); + return (pjsip_hdr*)hdr; +} + +/* + * Parse Min-SE header. + */ +static pjsip_hdr *parse_hdr_min_se(pjsip_parse_ctx *ctx) +{ + pjsip_min_se_hdr *hdr = pjsip_min_se_hdr_create(ctx->pool); + const pjsip_parser_const_t *pc = pjsip_parser_const(); + pj_str_t token; + + pj_scan_get(ctx->scanner, &pc->pjsip_DIGIT_SPEC, &token); + hdr->min_se = pj_strtoul(&token); + + while (*ctx->scanner->curptr == ';') { + pj_str_t pname, pvalue; + pjsip_param *param = PJ_POOL_ALLOC_T(ctx->pool, pjsip_param); + + pj_scan_get_char(ctx->scanner); + pjsip_parse_param_imp(ctx->scanner, ctx->pool, &pname, &pvalue, 0); + + param->name = pname; + param->value = pvalue; + pj_list_push_back(&hdr->other_param, param); + } + pjsip_parse_end_hdr_imp( ctx->scanner ); + return (pjsip_hdr*)hdr; +} + + +/* Add "Session-Expires" and "Min-SE" headers. Note that "Min-SE" header + * can only be added to INVITE/UPDATE request and 422 response. + */ +static void add_timer_headers(pjsip_inv_session *inv, pjsip_tx_data *tdata, + pj_bool_t add_se, pj_bool_t add_min_se) +{ + pjsip_timer *timer = inv->timer; + + /* Add Session-Expires header */ + if (add_se) { + pjsip_sess_expires_hdr *hdr; + + hdr = pjsip_sess_expires_hdr_create(tdata->pool); + hdr->sess_expires = timer->setting.sess_expires; + if (timer->refresher != TR_UNKNOWN) + hdr->refresher = (timer->refresher == TR_UAC? STR_UAC : STR_UAS); + + pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*) hdr); + } + + /* Add Min-SE header */ + if (add_min_se) { + pjsip_min_se_hdr *hdr; + + hdr = pjsip_min_se_hdr_create(tdata->pool); + hdr->min_se = timer->setting.min_se; + + pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*) hdr); + } +} + +/* Timer callback. When the timer is fired, it can be time to refresh + * the session if UA is the refresher, otherwise it is time to end + * the session. + */ +void timer_cb(pj_timer_heap_t *timer_heap, struct pj_timer_entry *entry) +{ + pjsip_inv_session *inv = (pjsip_inv_session*) entry->user_data; + pjsip_tx_data *tdata = NULL; + pj_status_t status; + pj_bool_t as_refresher; + + pj_assert(inv); + + PJ_UNUSED_ARG(timer_heap); + + /* Lock dialog. */ + pjsip_dlg_inc_lock(inv->dlg); + + /* Check our role */ + as_refresher = + (inv->timer->refresher == TR_UAC && inv->role == PJSIP_ROLE_UAC) || + (inv->timer->refresher == TR_UAS && inv->role == PJSIP_ROLE_UAS); + + /* Do action based on role, refresher or refreshee */ + if (as_refresher) { + + pj_time_val now; + + /* Refresher, refresh the session */ + if (inv->timer->use_update) { + /* Create UPDATE request without offer */ + status = pjsip_inv_update(inv, NULL, NULL, &tdata); + } else { + /* Create re-INVITE without modifying session */ + pjsip_msg_body *body; + const pjmedia_sdp_session *offer = NULL; + + pj_assert(pjmedia_sdp_neg_get_state(inv->neg) == + PJMEDIA_SDP_NEG_STATE_DONE); + + status = pjsip_inv_invite(inv, &tdata); + if (status == PJ_SUCCESS) + status = pjmedia_sdp_neg_send_local_offer(inv->pool, + inv->neg, &offer); + if (status == PJ_SUCCESS) + status = pjmedia_sdp_neg_get_neg_local(inv->neg, &offer); + if (status == PJ_SUCCESS) { + status = pjsip_create_sdp_body(tdata->pool, + (pjmedia_sdp_session*)offer, &body); + tdata->msg->body = body; + } + } + + pj_gettimeofday(&now); + PJ_LOG(4, (inv->pool->obj_name, + "Refresh session after %ds (expiration period=%ds)", + (now.sec-inv->timer->last_refresh.sec), + inv->timer->setting.sess_expires)); + } else { + + pj_time_val now; + + /* Refreshee, terminate the session */ + status = pjsip_inv_end_session(inv, PJSIP_SC_REQUEST_TIMEOUT, + NULL, &tdata); + + pj_gettimeofday(&now); + PJ_LOG(3, (inv->pool->obj_name, + "No session refresh received after %ds " + "(expiration period=%ds), stopping session now!", + (now.sec-inv->timer->last_refresh.sec), + inv->timer->setting.sess_expires)); + } + + /* Unlock dialog. */ + pjsip_dlg_dec_lock(inv->dlg); + + /* Send message, if any */ + if (tdata && status == PJ_SUCCESS) { + status = pjsip_inv_send_msg(inv, tdata); + } + + /* Print error message, if any */ + if (status != PJ_SUCCESS) { + char errmsg[PJ_ERR_MSG_SIZE]; + + if (tdata) + pjsip_tx_data_dec_ref(tdata); + + pj_strerror(status, errmsg, sizeof(errmsg)); + PJ_LOG(2, (inv->pool->obj_name, "Session timer fails in %s session, " + "err code=%d (%s)", + (as_refresher? "refreshing" : + "terminating"), + status, errmsg)); + } +} + +/* Start Session Timers */ +static void start_timer(pjsip_inv_session *inv) +{ + pjsip_timer *timer = inv->timer; + pj_time_val delay = {0}; + + pj_assert(inv->timer->active == PJ_TRUE); + + stop_timer(inv); + + pj_timer_entry_init(&timer->timer, + 1, /* id */ + inv, /* user data */ + timer_cb); /* callback */ + + /* Set delay based on role, refresher or refreshee */ + if ((timer->refresher == TR_UAC && inv->role == PJSIP_ROLE_UAC) || + (timer->refresher == TR_UAS && inv->role == PJSIP_ROLE_UAS)) + { + /* Next refresh, the delay is half of session expire */ + delay.sec = timer->setting.sess_expires / 2; + } else { + /* Send BYE if no refresh received until this timer fired, delay + * is the minimum of 32 seconds and one third of the session interval + * before session expiration. + */ + delay.sec = timer->setting.sess_expires - + timer->setting.sess_expires/3; + delay.sec = PJ_MAX((long)timer->setting.sess_expires-32, delay.sec); + } + + /* Schedule the timer */ + pjsip_endpt_schedule_timer(inv->dlg->endpt, &timer->timer, &delay); + + /* Update last refresh time */ + pj_gettimeofday(&timer->last_refresh); +} + +/* Stop Session Timers */ +static void stop_timer(pjsip_inv_session *inv) +{ + if (inv->timer->timer.id != 0) { + pjsip_endpt_cancel_timer(inv->dlg->endpt, &inv->timer->timer); + inv->timer->timer.id = 0; + } +} + +/* + * Initialize Session Timers support in PJSIP. + */ +PJ_DEF(pj_status_t) pjsip_timer_init_module(pjsip_endpoint *endpt) +{ + pj_status_t status; + + PJ_ASSERT_RETURN(endpt, PJ_EINVAL); + + if (is_initialized) + return PJ_SUCCESS; + + /* Register Session-Expires header parser */ + status = pjsip_register_hdr_parser( STR_SE.ptr, STR_SHORT_SE.ptr, + &parse_hdr_se); + if (status != PJ_SUCCESS) + return status; + + /* Register Min-SE header parser */ + status = pjsip_register_hdr_parser( STR_MIN_SE.ptr, NULL, + &parse_hdr_min_se); + if (status != PJ_SUCCESS) + return status; + + /* Register 'timer' capability to endpoint */ + status = pjsip_endpt_add_capability(endpt, NULL, PJSIP_H_SUPPORTED, + NULL, 1, &STR_TIMER); + if (status != PJ_SUCCESS) + return status; + + is_initialized = PJ_TRUE; + + return PJ_SUCCESS; +} + + +/* + * Initialize Session Timers setting with default values. + */ +PJ_DEF(pj_status_t) pjsip_timer_default_setting(pjsip_timer_setting *setting) +{ + pj_bzero(setting, sizeof(pjsip_timer_setting)); + + setting->sess_expires = DEF_SE; + setting->min_se = ABS_MIN_SE; + + return PJ_SUCCESS; +} + +/* + * Initialize Session Timers in an INVITE session. + */ +PJ_DEF(pj_status_t) pjsip_timer_init_session( + pjsip_inv_session *inv, + const pjsip_timer_setting *setting) +{ + pjsip_timer_setting *s; + + pj_assert(is_initialized); + PJ_ASSERT_RETURN(inv, PJ_EINVAL); + + /* Allocate and/or reset Session Timers structure */ + if (!inv->timer) + inv->timer = PJ_POOL_ZALLOC_T(inv->pool, pjsip_timer); + else + pj_bzero(inv->timer, sizeof(pjsip_timer)); + + s = &inv->timer->setting; + + /* Init Session Timers setting */ + if (setting) { + PJ_ASSERT_RETURN(setting->min_se >= ABS_MIN_SE, + PJ_ETOOSMALL); + PJ_ASSERT_RETURN(setting->sess_expires >= setting->min_se, + PJ_EINVAL); + + pj_memcpy(s, setting, sizeof(*s)); + } else { + pjsip_timer_default_setting(s); + } + + return PJ_SUCCESS; +} + + +/* + * Create Session-Expires header. + */ +PJ_DEF(pjsip_sess_expires_hdr*) pjsip_sess_expires_hdr_create( + pj_pool_t *pool) +{ + pjsip_sess_expires_hdr *hdr = PJ_POOL_ZALLOC_T(pool, + pjsip_sess_expires_hdr); + + pj_assert(is_initialized); + + hdr->type = PJSIP_H_OTHER; + hdr->name = STR_SE; + hdr->sname = STR_SHORT_SE; + hdr->vptr = &se_hdr_vptr; + pj_list_init(hdr); + pj_list_init(&hdr->other_param); + return hdr; +} + + +/* + * Create Min-SE header. + */ +PJ_DEF(pjsip_min_se_hdr*) pjsip_min_se_hdr_create(pj_pool_t *pool) +{ + pjsip_min_se_hdr *hdr = PJ_POOL_ZALLOC_T(pool, pjsip_min_se_hdr); + + pj_assert(is_initialized); + + hdr->type = PJSIP_H_OTHER; + hdr->name = STR_MIN_SE; + hdr->vptr = &min_se_hdr_vptr; + pj_list_init(hdr); + pj_list_init(&hdr->other_param); + return hdr; +} + + +/* + * This function generates headers for Session Timers for intial and + * refresh INVITE or UPDATE. + */ +PJ_DEF(pj_status_t) pjsip_timer_update_req(pjsip_inv_session *inv, + pjsip_tx_data *tdata) +{ + PJ_ASSERT_RETURN(inv && tdata, PJ_EINVAL); + + /* Check if Session Timers is supported */ + if ((inv->options & PJSIP_INV_SUPPORT_TIMER) == 0) + return PJ_SUCCESS; + + pj_assert(is_initialized); + + /* Make sure Session Timers is initialized */ + if (inv->timer == NULL) + pjsip_timer_init_session(inv, NULL); + + /* Add Session Timers headers */ + add_timer_headers(inv, tdata, PJ_TRUE, PJ_TRUE); + + return PJ_SUCCESS; +} + +/* + * This function will handle Session Timers part of INVITE/UPDATE + * responses with code: + * - 422 (Session Interval Too Small) + * - 2xx final response + */ +PJ_DEF(pj_status_t) pjsip_timer_process_resp(pjsip_inv_session *inv, + const pjsip_rx_data *rdata) +{ + const pjsip_msg *msg; + + PJ_ASSERT_RETURN(inv && rdata, PJ_EINVAL); + + /* Check if Session Timers is supported */ + if ((inv->options & PJSIP_INV_SUPPORT_TIMER) == 0) + return PJ_SUCCESS; + + pj_assert(is_initialized); + + msg = rdata->msg_info.msg; + pj_assert(msg->type == PJSIP_RESPONSE_MSG); + + /* Only process response of INVITE or UPDATE */ + if (rdata->msg_info.cseq->method.id != PJSIP_INVITE_METHOD && + pjsip_method_cmp(&rdata->msg_info.cseq->method, &pjsip_update_method)) + { + return PJ_SUCCESS; + } + + if (msg->line.status.code == PJSIP_SC_SESSION_TIMER_TOO_SMALL) { + /* Our Session-Expires is too small, let's update it based on + * Min-SE header in the response. + */ + pjsip_tx_data *tdata; + pjsip_min_se_hdr *min_se_hdr; + pjsip_hdr *hdr; + pjsip_via_hdr *via; + + /* Get Min-SE value from response */ + min_se_hdr = (pjsip_min_se_hdr*) + pjsip_msg_find_hdr_by_name(msg, &STR_MIN_SE, NULL); + if (min_se_hdr == NULL) { + /* Response 422 should contain Min-SE header */ + return PJ_SUCCESS; + } + + /* Session Timers should have been initialized here */ + pj_assert(inv->timer); + + /* Update Min-SE */ + inv->timer->setting.min_se = PJ_MAX(min_se_hdr->min_se, + inv->timer->setting.min_se); + + /* Update Session Timers setting */ + if (inv->timer->setting.sess_expires < inv->timer->setting.min_se) + inv->timer->setting.sess_expires = inv->timer->setting.min_se; + + /* Prepare to restart the request */ + + /* Get the original INVITE request. */ + tdata = inv->invite_req; + + /* Remove branch param in Via header. */ + via = (pjsip_via_hdr*) pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL); + pj_assert(via); + via->branch_param.slen = 0; + + /* Restore strict route set. + * See http://trac.pjsip.org/repos/ticket/492 + */ + pjsip_restore_strict_route_set(tdata); + + /* Must invalidate the message! */ + pjsip_tx_data_invalidate_msg(tdata); + + pjsip_tx_data_add_ref(tdata); + + /* Update Session Timers headers */ + hdr = (pjsip_hdr*) pjsip_msg_find_hdr_by_name(tdata->msg, + &STR_MIN_SE, NULL); + if (hdr != NULL) pj_list_erase(hdr); + + hdr = (pjsip_hdr*) pjsip_msg_find_hdr_by_names(tdata->msg, &STR_SE, + &STR_SHORT_SE, NULL); + if (hdr != NULL) pj_list_erase(hdr); + + add_timer_headers(inv, tdata, PJ_TRUE, PJ_TRUE); + + /* Restart UAC */ + pjsip_inv_uac_restart(inv, PJ_FALSE); + pjsip_inv_send_msg(inv, tdata); + + return PJ_SUCCESS; + + } else if (msg->line.status.code/100 == 2) { + + pjsip_sess_expires_hdr *se_hdr; + + /* Find Session-Expires header */ + se_hdr = (pjsip_sess_expires_hdr*) pjsip_msg_find_hdr_by_names( + msg, &STR_SE, + &STR_SHORT_SE, NULL); + if (se_hdr == NULL) { + /* Remote doesn't support/want Session Timers, check if local + * require or force to use Session Timers. + */ + if (inv->options & PJSIP_INV_REQUIRE_TIMER) { + pjsip_timer_end_session(inv); + return PJSIP_ERRNO_FROM_SIP_STATUS( + PJSIP_SC_EXTENSION_REQUIRED); + } + + if ((inv->options & PJSIP_INV_ALWAYS_USE_TIMER) == 0) { + /* Session Timers not forced */ + pjsip_timer_end_session(inv); + return PJ_SUCCESS; + } + } + + /* Make sure Session Timers is initialized */ + if (inv->timer == NULL) + pjsip_timer_init_session(inv, NULL); + + /* Session expiration period specified by remote is lower than our + * Min-SE. + */ + if (se_hdr && + se_hdr->sess_expires < inv->timer->setting.min_se) + { + pjsip_timer_end_session(inv); + return PJSIP_ERRNO_FROM_SIP_STATUS( + PJSIP_SC_SESSION_TIMER_TOO_SMALL); + } + + /* Update SE. Session-Expires in response cannot be lower than Min-SE. + * Session-Expires in response can only be equal or lower than in + * request. + */ + if (se_hdr && + se_hdr->sess_expires <= inv->timer->setting.sess_expires && + se_hdr->sess_expires >= inv->timer->setting.min_se) + { + /* Good SE from remote, update local SE */ + inv->timer->setting.sess_expires = se_hdr->sess_expires; + } + + /* Set the refresher */ + if (se_hdr && pj_stricmp(&se_hdr->refresher, &STR_UAC) == 0) + inv->timer->refresher = TR_UAC; + else if (se_hdr && pj_stricmp(&se_hdr->refresher, &STR_UAS) == 0) + inv->timer->refresher = TR_UAS; + else + /* UAS should set the refresher, however, there is a case that + * UAS doesn't support/want Session Timers but the UAC insists + * to use Session Timers. + */ + inv->timer->refresher = TR_UAC; + + PJ_TODO(CHECK_IF_REMOTE_SUPPORT_UPDATE); + + /* Finally, set active flag and start the Session Timers */ + inv->timer->active = PJ_TRUE; + start_timer(inv); + } + + return PJ_SUCCESS; +} + +/* + * Handle incoming INVITE or UPDATE request. + */ +PJ_DEF(pj_status_t) pjsip_timer_process_req(pjsip_inv_session *inv, + const pjsip_rx_data *rdata) +{ + pjsip_min_se_hdr *min_se_hdr; + pjsip_sess_expires_hdr *se_hdr; + const pjsip_msg *msg; + unsigned min_se; + + PJ_ASSERT_RETURN(inv && rdata, PJ_EINVAL); + + /* Check if Session Timers is supported */ + if ((inv->options & PJSIP_INV_SUPPORT_TIMER) == 0) + return PJ_SUCCESS; + + pj_assert(is_initialized); + + msg = rdata->msg_info.msg; + pj_assert(msg->type == PJSIP_REQUEST_MSG); + + /* Only process INVITE or UPDATE request */ + if (msg->line.req.method.id != PJSIP_INVITE_METHOD && + pjsip_method_cmp(&rdata->msg_info.cseq->method, &pjsip_update_method)) + { + return PJ_SUCCESS; + } + + /* Find Session-Expires header */ + se_hdr = (pjsip_sess_expires_hdr*) pjsip_msg_find_hdr_by_names( + msg, &STR_SE, &STR_SHORT_SE, NULL); + if (se_hdr == NULL) { + /* Remote doesn't support/want Session Timers, check if local + * require or force to use Session Timers. Note that Supported and + * Require headers negotiation should have been verified by invite + * session. + */ + if ((inv->options & + (PJSIP_INV_REQUIRE_TIMER | PJSIP_INV_ALWAYS_USE_TIMER)) == 0) + { + /* Session Timers not forced/required */ + pjsip_timer_end_session(inv); + return PJ_SUCCESS; + } + } + + /* Make sure Session Timers is initialized */ + if (inv->timer == NULL) + pjsip_timer_init_session(inv, NULL); + + /* Find Min-SE header */ + min_se_hdr = (pjsip_min_se_hdr*) pjsip_msg_find_hdr_by_name(msg, + &STR_MIN_SE, NULL); + /* Update Min-SE */ + min_se = inv->timer->setting.min_se; + if (min_se_hdr) + min_se = PJ_MAX(min_se_hdr->min_se, min_se); + + /* Validate SE. Session-Expires cannot be lower than Min-SE + * (or 90 seconds if Min-SE is not set). + */ + if (se_hdr && se_hdr->sess_expires < min_se) + return PJSIP_ERRNO_FROM_SIP_STATUS(PJSIP_SC_SESSION_TIMER_TOO_SMALL); + + /* Update SE. Note that there is a case that SE is not available in the + * request (which means remote doesn't want/support it), but local insists + * to use Session Timers. + */ + if (se_hdr) { + /* Update SE as specified by peer. */ + inv->timer->setting.sess_expires = se_hdr->sess_expires; + } else if (inv->timer->setting.sess_expires < min_se) { + /* There is no SE in the request (remote support Session Timers but + * doesn't want to use it, it just specify Min-SE) and local SE is + * lower than Min-SE specified by remote. + */ + inv->timer->setting.sess_expires = min_se; + } + + /* Set the refresher */ + if (se_hdr && pj_stricmp(&se_hdr->refresher, &STR_UAC) == 0) + inv->timer->refresher = TR_UAC; + else if (se_hdr && pj_stricmp(&se_hdr->refresher, &STR_UAS) == 0) + inv->timer->refresher = TR_UAS; + else + /* If UAC support timer (currently check the existance of + * Session-Expires header in the request), set UAC as refresher. + */ + inv->timer->refresher = se_hdr? TR_UAC : TR_UAS; + + /* Set active flag */ + inv->timer->active = PJ_TRUE; + + return PJ_SUCCESS; +} + +/* + * Handle outgoing response with status code 2xx & 422. + */ +PJ_DEF(pj_status_t) pjsip_timer_update_resp(pjsip_inv_session *inv, + pjsip_tx_data *tdata) +{ + pjsip_msg *msg; + + /* Check if Session Timers is supported */ + if ((inv->options & PJSIP_INV_SUPPORT_TIMER) == 0) + return PJ_SUCCESS; + + pj_assert(is_initialized); + PJ_ASSERT_RETURN(inv && tdata, PJ_EINVAL); + + msg = tdata->msg; + + if (msg->line.status.code/100 == 2) + { + /* Add Session-Expires header and start the timer */ + if (inv->timer && inv->timer->active) { + add_timer_headers(inv, tdata, PJ_TRUE, PJ_FALSE); + start_timer(inv); + } + } + else if (msg->line.status.code == PJSIP_SC_SESSION_TIMER_TOO_SMALL) + { + /* Add Min-SE header */ + add_timer_headers(inv, tdata, PJ_FALSE, PJ_TRUE); + } + + return PJ_SUCCESS; +} + + +/* + * End the Session Timers. + */ +PJ_DEF(pj_status_t) pjsip_timer_end_session(pjsip_inv_session *inv) +{ + PJ_ASSERT_RETURN(inv, PJ_EINVAL); + + if (inv->timer) { + /* Reset active flag */ + inv->timer->active = PJ_FALSE; + + /* Stop Session Timers */ + stop_timer(inv); + } + + return PJ_SUCCESS; +} + diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index 19d516bb..013a249e 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -479,8 +479,11 @@ PJ_DEF(pj_status_t) pjsua_call_make_call( pjsua_acc_id acc_id, /* Create the INVITE session: */ options |= PJSIP_INV_SUPPORT_100REL; + options |= PJSIP_INV_SUPPORT_TIMER; if (acc->cfg.require_100rel) options |= PJSIP_INV_REQUIRE_100REL; + if (acc->cfg.require_timer) + options |= PJSIP_INV_REQUIRE_TIMER; status = pjsip_inv_create_uac( dlg, offer, options, &inv); if (status != PJ_SUCCESS) { @@ -488,6 +491,20 @@ PJ_DEF(pj_status_t) pjsua_call_make_call( pjsua_acc_id acc_id, goto on_error; } + /* Init Session Timers */ + { + pjsip_timer_setting timer_setting; + + pjsip_timer_default_setting(&timer_setting); + timer_setting.sess_expires = acc->cfg.timer_se; + timer_setting.min_se = acc->cfg.timer_min_se; + + status = pjsip_timer_init_session(inv, &timer_setting); + if (status != PJ_SUCCESS) { + pjsua_perror(THIS_FILE, "Session Timer init failed", status); + goto on_error; + } + } /* Create and associate our data in the session. */ call->acc_id = acc_id; @@ -805,8 +822,11 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata) /* Verify that we can handle the request. */ options |= PJSIP_INV_SUPPORT_100REL; + options |= PJSIP_INV_SUPPORT_TIMER; if (pjsua_var.acc[acc_id].cfg.require_100rel) options |= PJSIP_INV_REQUIRE_100REL; + if (pjsua_var.acc[acc_id].cfg.require_timer) + options |= PJSIP_INV_REQUIRE_TIMER; status = pjsip_inv_verify_request2(rdata, &options, offer, answer, NULL, pjsua_var.endpt, &response); @@ -895,6 +915,29 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata) return PJ_TRUE; } + /* Init Session Timers */ + { + pjsip_timer_setting timer_setting; + + pjsip_timer_default_setting(&timer_setting); + timer_setting.sess_expires = pjsua_var.acc[acc_id].cfg.timer_se; + timer_setting.min_se = pjsua_var.acc[acc_id].cfg.timer_min_se; + + status = pjsip_timer_init_session(inv, &timer_setting); + if (status != PJ_SUCCESS) { + pjsua_perror(THIS_FILE, "Session Timer init failed", status); + status = pjsip_inv_end_session(inv, PJSIP_SC_INTERNAL_SERVER_ERROR, + NULL, &response); + if (status == PJ_SUCCESS && response) + status = pjsip_inv_send_msg(inv, response); + + pjsua_media_channel_deinit(call->index); + + PJSUA_UNLOCK(); + return PJ_TRUE; + } + } + /* Update NAT type of remote endpoint, only when there is SDP in * incoming INVITE! */ @@ -928,11 +971,16 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata) status = pjsip_inv_initial_answer(inv, rdata, 100, NULL, NULL, &response); if (status != PJ_SUCCESS) { - pjsua_perror(THIS_FILE, "Unable to send answer to incoming INVITE", - status); - - pjsip_dlg_respond(dlg, rdata, 500, NULL, NULL, NULL); - pjsip_inv_terminate(inv, 500, PJ_FALSE); + if (response == NULL) { + pjsua_perror(THIS_FILE, "Unable to send answer to incoming INVITE", + status); + pjsip_dlg_respond(dlg, rdata, 500, NULL, NULL, NULL); + pjsip_inv_terminate(inv, 500, PJ_FALSE); + } else { + pjsip_inv_send_msg(inv, response); + pjsip_inv_terminate(inv, PJSIP_ERRNO_TO_SIP_STATUS(status), + PJ_FALSE); + } pjsua_media_channel_deinit(call->index); PJSUA_UNLOCK(); return PJ_TRUE; diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c index 30ae00e7..6cd9cac5 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -87,6 +87,8 @@ PJ_DEF(void) pjsua_logging_config_dup(pj_pool_t *pool, PJ_DEF(void) pjsua_config_default(pjsua_config *cfg) { + pjsip_timer_setting timer_setting; + pj_bzero(cfg, sizeof(*cfg)); cfg->max_calls = ((PJSUA_MAX_CALLS) < 4) ? (PJSUA_MAX_CALLS) : 4; @@ -98,6 +100,10 @@ PJ_DEF(void) pjsua_config_default(pjsua_config *cfg) cfg->srtp_secure_signaling = PJSUA_DEFAULT_SRTP_SECURE_SIGNALING; #endif cfg->hangup_forked_call = PJ_TRUE; + + pjsip_timer_default_setting(&timer_setting); + cfg->timer_se = timer_setting.sess_expires; + cfg->timer_min_se = timer_setting.min_se; } PJ_DEF(void) pjsua_config_dup(pj_pool_t *pool, @@ -150,6 +156,9 @@ PJ_DEF(void) pjsua_acc_config_default(pjsua_acc_config *cfg) cfg->transport_id = PJSUA_INVALID_ID; cfg->allow_contact_rewrite = PJ_TRUE; cfg->require_100rel = pjsua_var.ua_cfg.require_100rel; + cfg->require_timer = pjsua_var.ua_cfg.require_timer; + cfg->timer_se = pjsua_var.ua_cfg.timer_se; + cfg->timer_min_se = pjsua_var.ua_cfg.timer_min_se; cfg->ka_interval = 15; cfg->ka_data = pj_str("\r\n"); #if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0) @@ -721,6 +730,10 @@ PJ_DEF(pj_status_t) pjsua_init( const pjsua_config *ua_cfg, status = pjsip_100rel_init_module(pjsua_var.endpt); PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); + /* Initialize session timer support */ + status = pjsip_timer_init_module(pjsua_var.endpt); + PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); + /* Initialize and register PJSUA application module. */ { const pjsip_module mod_initializer = diff --git a/tests/pjsua/scripts-recvfrom/300_timer_good.py b/tests/pjsua/scripts-recvfrom/300_timer_good.py new file mode 100644 index 00000000..75dd1bd8 --- /dev/null +++ b/tests/pjsua/scripts-recvfrom/300_timer_good.py @@ -0,0 +1,17 @@ +# $Id$ +import inc_sip as sip +import inc_sdp as sdp + +# INVITE session using session timer + +pjsua = "--null-audio sip:127.0.0.1:$PORT --use-timer --timer-min-se 100 --timer-se 2000" + +req = sip.RecvfromTransaction("INVITE with session timer", 200, + include=["Session-Expires:\s*2000", "Min-SE:\s*100"], + exclude=[], + resp_hdr=["Session-Expires: 1000;refresher=uac"] + ) + +recvfrom_cfg = sip.RecvfromCfg("INVITE session using session timer", + pjsua, [req]) + diff --git a/tests/pjsua/scripts-recvfrom/301_timer_good_retry_after_422.py b/tests/pjsua/scripts-recvfrom/301_timer_good_retry_after_422.py new file mode 100644 index 00000000..c3bbac7e --- /dev/null +++ b/tests/pjsua/scripts-recvfrom/301_timer_good_retry_after_422.py @@ -0,0 +1,28 @@ +# $Id$ +import inc_sip as sip +import inc_sdp as sdp + +# Session timers retry after 422 + + +pjsua = "--null-audio sip:127.0.0.1:$PORT --timer-min-se 100 --timer-se 1000" + +# First INVITE with timer rejected with 422 +req1 = sip.RecvfromTransaction("INVITE with SE too small", 422, + include=["Session-Expires:\s*1000"], + exclude=[], + resp_hdr=["Min-SE: 2000"], + expect="ACK sip" + ) + +# New INVITE with SE >= Min-SE +req2 = sip.RecvfromTransaction("Retrying with acceptable SE", 200, + include=["Session-Expires:\s*2000", "Min-SE:\s*2000"], + exclude=[], + resp_hdr=["Session-Expires: 2000;refresher=uac"] + ) + + +recvfrom_cfg = sip.RecvfromCfg("Session timers retry after 422", + pjsua, [req1, req2]) + diff --git a/tests/pjsua/scripts-sendto/170_timer_required.py b/tests/pjsua/scripts-sendto/170_timer_required.py new file mode 100644 index 00000000..b9bea968 --- /dev/null +++ b/tests/pjsua/scripts-sendto/170_timer_required.py @@ -0,0 +1,27 @@ +# $Id$ +import inc_sip as sip +import inc_sdp as sdp + +sdp = \ +""" +v=0 +o=- 0 0 IN IP4 127.0.0.1 +s=pjmedia +c=IN IP4 127.0.0.1 +t=0 0 +m=audio 4000 RTP/AVP 0 101 +a=rtpmap:0 PCMU/8000 +a=sendrecv +a=rtpmap:101 telephone-event/8000 +a=fmtp:101 0-15 +""" + +pjsua_args = "--null-audio --auto-answer 200 --use-timer --timer-min-se 90 --timer-se 1800" +extra_headers = "Require: timer\nSupported: timer\nSession-Expires: 1800\n" +include = ["Session-Expires: .*;refresher=.*"] +exclude = [] +sendto_cfg = sip.SendtoCfg("Session Timer required", pjsua_args, sdp, 200, + extra_headers=extra_headers, + resp_inc=include, resp_exc=exclude) + + diff --git a/tests/pjsua/scripts-sendto/171_timer_initiated_by_uas.py b/tests/pjsua/scripts-sendto/171_timer_initiated_by_uas.py new file mode 100644 index 00000000..393a0012 --- /dev/null +++ b/tests/pjsua/scripts-sendto/171_timer_initiated_by_uas.py @@ -0,0 +1,36 @@ +# $Id$ +import inc_sip as sip +import inc_sdp as sdp + +sdp = \ +""" +v=0 +o=- 0 0 IN IP4 127.0.0.1 +s=pjmedia +c=IN IP4 127.0.0.1 +t=0 0 +m=audio 4000 RTP/AVP 0 101 +a=rtpmap:0 PCMU/8000 +a=sendrecv +a=rtpmap:101 telephone-event/8000 +a=fmtp:101 0-15 +""" + +# RFC 4028 Section 9: +# If the incoming request contains a Supported header field with a +# value 'timer' but does not contain a Session-Expires header, it means +# that the UAS is indicating support for timers but is not requesting +# one. The UAS may request a session timer in the 2XX response by +# including a Session-Expires header field. The value MUST NOT be set +# to a duration lower than the value in the Min-SE header field in the +# request, if it is present. + +pjsua_args = "--null-audio --auto-answer 200 --use-timer --timer-min-se 90 --timer-se 1800" +extra_headers = "Supported: timer\n" +include = ["Session-Expires: .*;refresher=.*"] +exclude = [] +sendto_cfg = sip.SendtoCfg("Session Timer initiated by UAS", pjsua_args, sdp, 200, + extra_headers=extra_headers, + resp_inc=include, resp_exc=exclude) + + diff --git a/tests/pjsua/scripts-sendto/172_timer_supported_but_not_used.py b/tests/pjsua/scripts-sendto/172_timer_supported_but_not_used.py new file mode 100644 index 00000000..69b0c900 --- /dev/null +++ b/tests/pjsua/scripts-sendto/172_timer_supported_but_not_used.py @@ -0,0 +1,26 @@ +# $Id$ +import inc_sip as sip +import inc_sdp as sdp + +sdp = \ +""" +v=0 +o=- 0 0 IN IP4 127.0.0.1 +s=pjmedia +c=IN IP4 127.0.0.1 +t=0 0 +m=audio 4000 RTP/AVP 0 101 +a=rtpmap:0 PCMU/8000 +a=sendrecv +a=rtpmap:101 telephone-event/8000 +a=fmtp:101 0-15 +""" + +pjsua_args = "--null-audio --auto-answer 200" +extra_headers = "Supported: timer\n" +include = [] +exclude = ["Session-Expires:"] +sendto_cfg = sip.SendtoCfg("Session Timer supported but not used", pjsua_args, sdp, 200, + extra_headers=extra_headers, + resp_inc=include, resp_exc=exclude) + diff --git a/tests/pjsua/scripts-sendto/173_timer_offer_no_refresher.py b/tests/pjsua/scripts-sendto/173_timer_offer_no_refresher.py new file mode 100644 index 00000000..a0005d3e --- /dev/null +++ b/tests/pjsua/scripts-sendto/173_timer_offer_no_refresher.py @@ -0,0 +1,26 @@ +# $Id$ +import inc_sip as sip +import inc_sdp as sdp + +sdp = \ +""" +v=0 +o=- 0 0 IN IP4 127.0.0.1 +s=pjmedia +c=IN IP4 127.0.0.1 +t=0 0 +m=audio 4000 RTP/AVP 0 101 +a=rtpmap:0 PCMU/8000 +a=sendrecv +a=rtpmap:101 telephone-event/8000 +a=fmtp:101 0-15 +""" + +pjsua_args = "--null-audio --auto-answer 200 --timer-min-se 90" +extra_headers = "Supported: timer\nSession-Expires: 1800\n" +include = ["Session-Expires:.*;refresher=ua[cs]"] +exclude = [] +sendto_cfg = sip.SendtoCfg("Session Timer without specifying refresher", pjsua_args, sdp, 200, + extra_headers=extra_headers, + resp_inc=include, resp_exc=exclude) + diff --git a/tests/pjsua/scripts-sendto/173_timer_offer_refresher_uac.py b/tests/pjsua/scripts-sendto/173_timer_offer_refresher_uac.py new file mode 100644 index 00000000..13c24498 --- /dev/null +++ b/tests/pjsua/scripts-sendto/173_timer_offer_refresher_uac.py @@ -0,0 +1,26 @@ +# $Id$ +import inc_sip as sip +import inc_sdp as sdp + +sdp = \ +""" +v=0 +o=- 0 0 IN IP4 127.0.0.1 +s=pjmedia +c=IN IP4 127.0.0.1 +t=0 0 +m=audio 4000 RTP/AVP 0 101 +a=rtpmap:0 PCMU/8000 +a=sendrecv +a=rtpmap:101 telephone-event/8000 +a=fmtp:101 0-15 +""" + +pjsua_args = "--null-audio --auto-answer 200 --timer-min-se 90" +extra_headers = "Supported: timer\nSession-Expires: 1800;refresher=uac\n" +include = ["Session-Expires:.*;refresher=ua[cs]"] +exclude = [] +sendto_cfg = sip.SendtoCfg("Session Timer offer refresher uac", pjsua_args, sdp, 200, + extra_headers=extra_headers, + resp_inc=include, resp_exc=exclude) + diff --git a/tests/pjsua/scripts-sendto/173_timer_offer_refresher_uas.py b/tests/pjsua/scripts-sendto/173_timer_offer_refresher_uas.py new file mode 100644 index 00000000..2c270e1f --- /dev/null +++ b/tests/pjsua/scripts-sendto/173_timer_offer_refresher_uas.py @@ -0,0 +1,26 @@ +# $Id$ +import inc_sip as sip +import inc_sdp as sdp + +sdp = \ +""" +v=0 +o=- 0 0 IN IP4 127.0.0.1 +s=pjmedia +c=IN IP4 127.0.0.1 +t=0 0 +m=audio 4000 RTP/AVP 0 101 +a=rtpmap:0 PCMU/8000 +a=sendrecv +a=rtpmap:101 telephone-event/8000 +a=fmtp:101 0-15 +""" + +pjsua_args = "--null-audio --auto-answer 200 --timer-min-se 90" +extra_headers = "Supported: timer\nSession-Expires: 1800;refresher=uas\n" +include = ["Session-Expires:.*;refresher=ua[cs]"] +exclude = [] +sendto_cfg = sip.SendtoCfg("Session Timer offer refresher uas", pjsua_args, sdp, 200, + extra_headers=extra_headers, + resp_inc=include, resp_exc=exclude) + diff --git a/tests/pjsua/scripts-sendto/174_timer_se_too_small.py b/tests/pjsua/scripts-sendto/174_timer_se_too_small.py new file mode 100644 index 00000000..c607de6c --- /dev/null +++ b/tests/pjsua/scripts-sendto/174_timer_se_too_small.py @@ -0,0 +1,26 @@ +# $Id$ +import inc_sip as sip +import inc_sdp as sdp + +sdp = \ +""" +v=0 +o=- 0 0 IN IP4 127.0.0.1 +s=pjmedia +c=IN IP4 127.0.0.1 +t=0 0 +m=audio 4000 RTP/AVP 0 101 +a=rtpmap:0 PCMU/8000 +a=sendrecv +a=rtpmap:101 telephone-event/8000 +a=fmtp:101 0-15 +""" + +pjsua_args = "--null-audio --auto-answer 200 --timer-min-se 2000 --timer-se 2000" +extra_headers = "Supported: timer\nSession-Expires: 1800\n" +include = ["Min-SE:\s*2000"] +exclude = [] +sendto_cfg = sip.SendtoCfg("Session Timer SE too small", pjsua_args, sdp, 422, + extra_headers=extra_headers, + resp_inc=include, resp_exc=exclude) + |