diff --git a/.gitignore b/.gitignore
index 824abfc65f..adcfda37f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -108,5 +108,26 @@ libs/freetdm/testpri
libs/freetdm/testr2
libs/freetdm/testsangomaboost
libs/freetdm/testtones
+libs/esl/fs_cli
+libs/esl/ivrd
+libs/esl/testserver
+libs/esl/testclient
+libs/libcodec2/Makefile
+libs/libcodec2/Makefile.in
+libs/libcodec2/config.guess
+libs/libcodec2/config.sub
+libs/libcodec2/configure
+libs/libcodec2/depcomp
+libs/libcodec2/install-sh
+libs/libcodec2/libtool
+libs/libcodec2/ltmain.sh
+libs/libcodec2/missing
+libs/libcodec2/src/Makefile
+libs/libcodec2/src/Makefile.in
+libs/libcodec2/unittest/Makefile
+libs/libcodec2/unittest/Makefile.in
src/mod/applications/mod_osp/Makefile
-
+src/mod/applications/mod_osp/Makefile.in
+src/mod/applications/mod_hash/Makefile
+src/mod/applications/mod_hash/Makefile.in
+src/mod/applications/mod_hash/mod_hash.log
diff --git a/Freeswitch.2008.sln b/Freeswitch.2008.sln
index 8e6df5cc57..01a4cf43c1 100644
--- a/Freeswitch.2008.sln
+++ b/Freeswitch.2008.sln
@@ -2042,18 +2042,18 @@ Global
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64.Build.0 = Release|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.ActiveCfg = Debug|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.Build.0 = Debug|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.ActiveCfg = Debug|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.Build.0 = Debug|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.ActiveCfg = Debug|x64
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.Build.0 = Debug|x64
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.ActiveCfg = Release|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.Build.0 = Release|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.ActiveCfg = Release|Win32
- {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.Build.0 = Release|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.ActiveCfg = Release|x64
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.Build.0 = Release|x64
{7EB71250-F002-4ED8-92CA-CA218114537A}.All|Win32.ActiveCfg = Release|Win32
{7EB71250-F002-4ED8-92CA-CA218114537A}.All|x64.ActiveCfg = Release|Win32
{7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.ActiveCfg = Debug|Win32
- {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x64.ActiveCfg = Debug|Win32
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x64.ActiveCfg = Debug|x64
{7EB71250-F002-4ED8-92CA-CA218114537A}.Release|Win32.ActiveCfg = Release|Win32
- {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|x64.ActiveCfg = Release|Win32
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|x64.ActiveCfg = Release|x64
{6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.All|Win32.ActiveCfg = Release|Win32
{6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.All|x64.ActiveCfg = Release|Win32
{6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.Debug|Win32.ActiveCfg = Debug|Win32
@@ -2063,9 +2063,9 @@ Global
{464AAB78-5489-4916-BE51-BF8D61822311}.All|Win32.ActiveCfg = Release|Win32
{464AAB78-5489-4916-BE51-BF8D61822311}.All|x64.ActiveCfg = Release|Win32
{464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.ActiveCfg = Debug|Win32
- {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x64.ActiveCfg = Debug|Win32
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x64.ActiveCfg = Debug|x64
{464AAB78-5489-4916-BE51-BF8D61822311}.Release|Win32.ActiveCfg = Release|Win32
- {464AAB78-5489-4916-BE51-BF8D61822311}.Release|x64.ActiveCfg = Release|Win32
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Release|x64.ActiveCfg = Release|x64
{0AD1177E-1FD8-4643-9391-431467A11084}.All|Win32.ActiveCfg = Release|x64
{0AD1177E-1FD8-4643-9391-431467A11084}.All|x64.ActiveCfg = Release|x64
{0AD1177E-1FD8-4643-9391-431467A11084}.All|x64.Build.0 = Release|x64
@@ -2482,24 +2482,24 @@ Global
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64.Build.0 = Release|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.ActiveCfg = Debug|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.Build.0 = Debug|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.ActiveCfg = Debug|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.Build.0 = Debug|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.ActiveCfg = Debug|x64
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.Build.0 = Debug|x64
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.ActiveCfg = Release|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.Build.0 = Release|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.ActiveCfg = Release|Win32
- {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.Build.0 = Release|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.ActiveCfg = Release|x64
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.Build.0 = Release|x64
{BA599D0A-4310-4505-91DA-6A6447B3E289}.All|Win32.ActiveCfg = Release|Win32
{BA599D0A-4310-4505-91DA-6A6447B3E289}.All|x64.ActiveCfg = Release|Win32
{BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.ActiveCfg = Debug|Win32
- {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x64.ActiveCfg = Debug|Win32
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x64.ActiveCfg = Debug|x64
{BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|Win32.ActiveCfg = Release|Win32
- {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|x64.ActiveCfg = Release|Win32
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|x64.ActiveCfg = Release|x64
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|Win32.ActiveCfg = Release|Win32
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|x64.ActiveCfg = Release|Win32
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.ActiveCfg = Debug|Win32
- {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.ActiveCfg = Debug|Win32
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.ActiveCfg = Debug|x64
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|Win32.ActiveCfg = Release|Win32
- {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64.ActiveCfg = Release|Win32
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64.ActiveCfg = Release|x64
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|Win32.ActiveCfg = Release|x64
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64.ActiveCfg = Release|x64
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64.Build.0 = Release|x64
diff --git a/Freeswitch.2010.sln b/Freeswitch.2010.sln
index 4729745778..5722802839 100644
--- a/Freeswitch.2010.sln
+++ b/Freeswitch.2010.sln
@@ -705,1734 +705,2908 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_h323", "src\mod\endpoin
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_distributor", "src\mod\applications\mod_distributor\mod_distributor.2010.vcxproj", "{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}"
EndProject
+Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Setup", "w32\Setup\Setup.wixproj", "{47213370-B933-487D-9F45-BCA26D7E2B6F}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
All|Win32 = All|Win32
All|x64 = All|x64
+ All|x64 Setup = All|x64 Setup
+ All|x86 Setup = All|x86 Setup
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
+ Debug|x64 Setup = Debug|x64 Setup
+ Debug|x86 Setup = Debug|x86 Setup
Release|Win32 = Release|Win32
Release|x64 = Release|x64
+ Release|x64 Setup = Release|x64 Setup
+ Release|x86 Setup = Release|x86 Setup
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|Win32.ActiveCfg = Release|x64
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64.ActiveCfg = Release|x64
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64.Build.0 = Release|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64 Setup.ActiveCfg = Release|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x64 Setup.Build.0 = Release|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.All|x86 Setup.ActiveCfg = Release|x64
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.ActiveCfg = Debug|Win32
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|Win32.Build.0 = Debug|Win32
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x64.ActiveCfg = Debug|x64
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x64.Build.0 = Debug|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.ActiveCfg = Release|Win32
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|Win32.Build.0 = Release|Win32
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x64.ActiveCfg = Release|x64
{1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x64.Build.0 = Release|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x64 Setup.ActiveCfg = Release|x64
+ {1AF3A893-F7BE-43DD-B697-8AB2397C0D67}.Release|x86 Setup.ActiveCfg = Release|Win32
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|Win32.ActiveCfg = Release|x64
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64.ActiveCfg = Release|x64
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64.Build.0 = Release|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64 Setup.ActiveCfg = Release|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x64 Setup.Build.0 = Release|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.All|x86 Setup.ActiveCfg = Release|x64
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.ActiveCfg = Debug|Win32
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|Win32.Build.0 = Debug|Win32
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x64.ActiveCfg = Debug|x64
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x64.Build.0 = Debug|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.ActiveCfg = Release|Win32
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|Win32.Build.0 = Release|Win32
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x64.ActiveCfg = Release|x64
{202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x64.Build.0 = Release|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x64 Setup.ActiveCfg = Release|x64
+ {202D7A4E-760D-4D0E-AFA1-D7459CED30FF}.Release|x86 Setup.ActiveCfg = Release|Win32
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|Win32.ActiveCfg = Release Passthrough|x64
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64.ActiveCfg = Release Passthrough|x64
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64.Build.0 = Release Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64 Setup.ActiveCfg = Release Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x64 Setup.Build.0 = Release Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.All|x86 Setup.ActiveCfg = Release Passthrough|x64
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|Win32.Build.0 = Debug Passthrough|Win32
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x64.ActiveCfg = Debug Passthrough|x64
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x64.Build.0 = Debug Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x64 Setup.ActiveCfg = Debug Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Debug|x86 Setup.ActiveCfg = Debug Passthrough|Win32
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.ActiveCfg = Release Passthrough|Win32
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|Win32.Build.0 = Release Passthrough|Win32
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x64.ActiveCfg = Release Passthrough|x64
{1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x64.Build.0 = Release Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x64 Setup.ActiveCfg = Release Passthrough|x64
+ {1D95CD95-0DE2-48C3-AC23-D5C7D1C9C0F0}.Release|x86 Setup.ActiveCfg = Release Passthrough|Win32
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|Win32.ActiveCfg = Release|x64
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64.ActiveCfg = Release|x64
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64.Build.0 = Release|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64 Setup.ActiveCfg = Release|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x64 Setup.Build.0 = Release|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.All|x86 Setup.ActiveCfg = Release|x64
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.ActiveCfg = Debug|Win32
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|Win32.Build.0 = Debug|Win32
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x64.ActiveCfg = Debug|x64
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x64.Build.0 = Debug|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.ActiveCfg = Release|Win32
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|Win32.Build.0 = Release|Win32
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x64.ActiveCfg = Release|x64
{AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x64.Build.0 = Release|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x64 Setup.ActiveCfg = Release|x64
+ {AFAC0568-7548-42D5-9F6A-8D3400A1E4F6}.Release|x86 Setup.ActiveCfg = Release|Win32
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|Win32.ActiveCfg = Release|x64
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64.ActiveCfg = Release|x64
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64.Build.0 = Release|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64 Setup.ActiveCfg = Release|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x64 Setup.Build.0 = Release|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.All|x86 Setup.ActiveCfg = Release|x64
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.ActiveCfg = Debug|Win32
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|Win32.Build.0 = Debug|Win32
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x64.ActiveCfg = Debug|x64
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x64.Build.0 = Debug|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.ActiveCfg = Release|Win32
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|Win32.Build.0 = Release|Win32
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x64.ActiveCfg = Release|x64
{5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x64.Build.0 = Release|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x64 Setup.ActiveCfg = Release|x64
+ {5FD31A25-5D83-4794-8BEE-904DAD84CE71}.Release|x86 Setup.ActiveCfg = Release|Win32
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.All|Win32.ActiveCfg = Release|x64
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.All|x64.ActiveCfg = Release|x64
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.All|x64.Build.0 = Release|x64
+ {5580D60E-0F77-4716-9CD4-B8E5986FA375}.All|x64 Setup.ActiveCfg = Release|x64
+ {5580D60E-0F77-4716-9CD4-B8E5986FA375}.All|x64 Setup.Build.0 = Release|x64
+ {5580D60E-0F77-4716-9CD4-B8E5986FA375}.All|x86 Setup.ActiveCfg = Release|x64
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Debug|Win32.ActiveCfg = Debug|Win32
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Debug|Win32.Build.0 = Debug|Win32
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Debug|x64.ActiveCfg = Debug|x64
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Debug|x64.Build.0 = Debug|x64
+ {5580D60E-0F77-4716-9CD4-B8E5986FA375}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {5580D60E-0F77-4716-9CD4-B8E5986FA375}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Release|Win32.ActiveCfg = Release|Win32
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Release|Win32.Build.0 = Release|Win32
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Release|x64.ActiveCfg = Release|x64
{5580D60E-0F77-4716-9CD4-B8E5986FA375}.Release|x64.Build.0 = Release|x64
+ {5580D60E-0F77-4716-9CD4-B8E5986FA375}.Release|x64 Setup.ActiveCfg = Release|x64
+ {5580D60E-0F77-4716-9CD4-B8E5986FA375}.Release|x86 Setup.ActiveCfg = Release|Win32
{1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|Win32.ActiveCfg = Release|Win32
{1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|x64.ActiveCfg = Release|Win32
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|x64 Setup.ActiveCfg = Release|Win32
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.All|x86 Setup.ActiveCfg = Release|Win32
{1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|Win32.ActiveCfg = Debug|Win32
{1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|x64.ActiveCfg = Debug|Win32
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|Win32.ActiveCfg = Release|Win32
{1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|x64.ActiveCfg = Release|Win32
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {1A1FF289-4FD6-4285-A422-D31DD67A4723}.Release|x86 Setup.ActiveCfg = Release|Win32
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|Win32.ActiveCfg = Release|x64
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64.ActiveCfg = Release|x64
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64.Build.0 = Release|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64 Setup.ActiveCfg = Release|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x64 Setup.Build.0 = Release|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.All|x86 Setup.ActiveCfg = Release|x64
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.ActiveCfg = Debug|Win32
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|Win32.Build.0 = Debug|Win32
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x64.ActiveCfg = Debug|x64
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x64.Build.0 = Debug|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.ActiveCfg = Release|Win32
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|Win32.Build.0 = Release|Win32
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x64.ActiveCfg = Release|x64
{07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x64.Build.0 = Release|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x64 Setup.ActiveCfg = Release|x64
+ {07113B25-D3AF-4E04-BA77-4CD1171F022C}.Release|x86 Setup.ActiveCfg = Release|Win32
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|Win32.ActiveCfg = Release MS-LDAP|x64
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64.ActiveCfg = Release MS-LDAP|x64
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64.Build.0 = Release MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64 Setup.ActiveCfg = Release MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x64 Setup.Build.0 = Release MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.All|x86 Setup.ActiveCfg = Release MS-LDAP|x64
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.ActiveCfg = Debug MS-LDAP|Win32
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|Win32.Build.0 = Debug MS-LDAP|Win32
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x64.ActiveCfg = Debug MS-LDAP|x64
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x64.Build.0 = Debug MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x64 Setup.ActiveCfg = Debug MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Debug|x86 Setup.ActiveCfg = Debug MS-LDAP|Win32
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.ActiveCfg = Release MS-LDAP|Win32
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|Win32.Build.0 = Release MS-LDAP|Win32
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x64.ActiveCfg = Release MS-LDAP|x64
{EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x64.Build.0 = Release MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x64 Setup.ActiveCfg = Release MS-LDAP|x64
+ {EC3E5C7F-EE09-47E2-80FE-546363D14A98}.Release|x86 Setup.ActiveCfg = Release MS-LDAP|Win32
{A27CCA23-1541-4337-81A4-F0A6413078A0}.All|Win32.ActiveCfg = Release|x64
{A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64.ActiveCfg = Release|x64
{A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64.Build.0 = Release|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64 Setup.ActiveCfg = Release|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x64 Setup.Build.0 = Release|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.All|x86 Setup.ActiveCfg = Release|x64
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.ActiveCfg = Debug|Win32
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|Win32.Build.0 = Debug|Win32
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x64.ActiveCfg = Debug|x64
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x64.Build.0 = Debug|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.ActiveCfg = Release|Win32
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|Win32.Build.0 = Release|Win32
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x64.ActiveCfg = Release|x64
{A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x64.Build.0 = Release|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x64 Setup.ActiveCfg = Release|x64
+ {A27CCA23-1541-4337-81A4-F0A6413078A0}.Release|x86 Setup.ActiveCfg = Release|Win32
{784113EF-44D9-4949-835D-7065D3C7AD08}.All|Win32.ActiveCfg = Release|x64
{784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64.ActiveCfg = Release|x64
{784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64.Build.0 = Release|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64 Setup.ActiveCfg = Release|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.All|x64 Setup.Build.0 = Release|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.All|x86 Setup.ActiveCfg = Release|x64
{784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.ActiveCfg = Debug|Win32
{784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|Win32.Build.0 = Debug|Win32
{784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x64.ActiveCfg = Debug|x64
{784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x64.Build.0 = Debug|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.ActiveCfg = Release|Win32
{784113EF-44D9-4949-835D-7065D3C7AD08}.Release|Win32.Build.0 = Release|Win32
{784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x64.ActiveCfg = Release|x64
{784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x64.Build.0 = Release|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x64 Setup.ActiveCfg = Release|x64
+ {784113EF-44D9-4949-835D-7065D3C7AD08}.Release|x86 Setup.ActiveCfg = Release|Win32
{89385C74-5860-4174-9CAF-A39E7C48909C}.All|Win32.ActiveCfg = Release|x64
{89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64.ActiveCfg = Release|x64
{89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64.Build.0 = Release|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64 Setup.ActiveCfg = Release|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.All|x64 Setup.Build.0 = Release|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.All|x86 Setup.ActiveCfg = Release|x64
{89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.ActiveCfg = Debug|Win32
{89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|Win32.Build.0 = Debug|Win32
{89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x64.ActiveCfg = Debug|x64
{89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x64.Build.0 = Debug|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.ActiveCfg = Release|Win32
{89385C74-5860-4174-9CAF-A39E7C48909C}.Release|Win32.Build.0 = Release|Win32
{89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x64.ActiveCfg = Release|x64
{89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x64.Build.0 = Release|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x64 Setup.ActiveCfg = Release|x64
+ {89385C74-5860-4174-9CAF-A39E7C48909C}.Release|x86 Setup.ActiveCfg = Release|Win32
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.All|Win32.ActiveCfg = Release|x64
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.All|x64.ActiveCfg = Release|x64
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.All|x64.Build.0 = Release|x64
+ {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.All|x64 Setup.ActiveCfg = Release|x64
+ {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.All|x64 Setup.Build.0 = Release|x64
+ {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.All|x86 Setup.ActiveCfg = Release|x64
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Debug|Win32.ActiveCfg = Debug|Win32
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Debug|Win32.Build.0 = Debug|Win32
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Debug|x64.ActiveCfg = Debug|x64
+ {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Release|Win32.ActiveCfg = Release|Win32
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Release|Win32.Build.0 = Release|Win32
{1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Release|x64.ActiveCfg = Release|x64
+ {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Release|x64 Setup.ActiveCfg = Release|x64
+ {1AD3F51E-BBB6-4090-BA39-9DFAB1EF1F5F}.Release|x86 Setup.ActiveCfg = Release|Win32
{692F6330-4D87-4C82-81DF-40DB5892636E}.All|Win32.ActiveCfg = Release|x64
{692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64.ActiveCfg = Release|x64
{692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64.Build.0 = Release|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64 Setup.ActiveCfg = Release|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.All|x64 Setup.Build.0 = Release|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.All|x86 Setup.ActiveCfg = Release|x64
{692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|Win32.ActiveCfg = Debug|Win32
{692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|x64.ActiveCfg = Debug|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{692F6330-4D87-4C82-81DF-40DB5892636E}.Release|Win32.ActiveCfg = Release|Win32
{692F6330-4D87-4C82-81DF-40DB5892636E}.Release|x64.ActiveCfg = Release|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|x64 Setup.ActiveCfg = Release|x64
+ {692F6330-4D87-4C82-81DF-40DB5892636E}.Release|x86 Setup.ActiveCfg = Release|Win32
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|Win32.ActiveCfg = Release|x64
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64.ActiveCfg = Release|x64
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64.Build.0 = Release|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64 Setup.ActiveCfg = Release|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x64 Setup.Build.0 = Release|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.All|x86 Setup.ActiveCfg = Release|x64
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.ActiveCfg = Debug|Win32
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|Win32.Build.0 = Debug|Win32
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x64.ActiveCfg = Debug|x64
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x64.Build.0 = Debug|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.ActiveCfg = Release|Win32
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|Win32.Build.0 = Release|Win32
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.ActiveCfg = Release|x64
{D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64.Build.0 = Release|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x64 Setup.ActiveCfg = Release|x64
+ {D3EC0AFF-76FC-4210-A825-9A17410660A3}.Release|x86 Setup.ActiveCfg = Release|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|Win32.ActiveCfg = Release|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.ActiveCfg = Release|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64.Build.0 = Release|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64 Setup.ActiveCfg = Release|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x64 Setup.Build.0 = Release|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.All|x86 Setup.ActiveCfg = Release|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.ActiveCfg = Debug|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|Win32.Build.0 = Debug|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.ActiveCfg = Debug|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64.Build.0 = Debug|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.ActiveCfg = Release|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|Win32.Build.0 = Release|Win32
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.ActiveCfg = Release|x64
{FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64.Build.0 = Release|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x64 Setup.ActiveCfg = Release|x64
+ {FFAA4C52-3A53-4F99-90C1-D59D1F0427F3}.Release|x86 Setup.ActiveCfg = Release|Win32
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|Win32.ActiveCfg = Release|x64
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.ActiveCfg = Release|x64
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64.Build.0 = Release|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64 Setup.ActiveCfg = Release|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x64 Setup.Build.0 = Release|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.All|x86 Setup.ActiveCfg = Release|x64
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.ActiveCfg = Debug|Win32
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|Win32.Build.0 = Debug|Win32
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x64.ActiveCfg = Debug|x64
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x64.Build.0 = Debug|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.ActiveCfg = Release|Win32
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|Win32.Build.0 = Release|Win32
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x64.ActiveCfg = Release|x64
{30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x64.Build.0 = Release|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x64 Setup.ActiveCfg = Release|x64
+ {30A5B29C-983E-4580-9FD0-D647CCDCC7EB}.Release|x86 Setup.ActiveCfg = Release|Win32
{1C453396-D912-4213-89FD-9B489162B7B5}.All|Win32.ActiveCfg = Release|x64
{1C453396-D912-4213-89FD-9B489162B7B5}.All|x64.ActiveCfg = Release|x64
{1C453396-D912-4213-89FD-9B489162B7B5}.All|x64.Build.0 = Release|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.All|x64 Setup.ActiveCfg = Release|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.All|x64 Setup.Build.0 = Release|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.All|x86 Setup.ActiveCfg = Release|x64
{1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.ActiveCfg = Debug|Win32
{1C453396-D912-4213-89FD-9B489162B7B5}.Debug|Win32.Build.0 = Debug|Win32
{1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x64.ActiveCfg = Debug|x64
{1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x64.Build.0 = Debug|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.ActiveCfg = Release|Win32
{1C453396-D912-4213-89FD-9B489162B7B5}.Release|Win32.Build.0 = Release|Win32
{1C453396-D912-4213-89FD-9B489162B7B5}.Release|x64.ActiveCfg = Release|x64
{1C453396-D912-4213-89FD-9B489162B7B5}.Release|x64.Build.0 = Release|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Release|x64 Setup.ActiveCfg = Release|x64
+ {1C453396-D912-4213-89FD-9B489162B7B5}.Release|x86 Setup.ActiveCfg = Release|Win32
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|Win32.ActiveCfg = Release|x64
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64.ActiveCfg = Release|x64
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64.Build.0 = Release|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64 Setup.ActiveCfg = Release|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x64 Setup.Build.0 = Release|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.All|x86 Setup.ActiveCfg = Release|x64
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.ActiveCfg = Debug|Win32
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|Win32.Build.0 = Debug|Win32
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x64.ActiveCfg = Debug|x64
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x64.Build.0 = Debug|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.ActiveCfg = Release|Win32
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|Win32.Build.0 = Release|Win32
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x64.ActiveCfg = Release|x64
{CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x64.Build.0 = Release|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x64 Setup.ActiveCfg = Release|x64
+ {CBEC7225-0C21-4DA8-978E-1F158F8AD950}.Release|x86 Setup.ActiveCfg = Release|Win32
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|Win32.ActiveCfg = Release|x64
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64.ActiveCfg = Release|x64
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64.Build.0 = Release|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64 Setup.ActiveCfg = Release|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x64 Setup.Build.0 = Release|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.All|x86 Setup.ActiveCfg = Release|x64
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.ActiveCfg = Debug|Win32
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|Win32.Build.0 = Debug|Win32
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x64.ActiveCfg = Debug|x64
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x64.Build.0 = Debug|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.ActiveCfg = Release|Win32
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|Win32.Build.0 = Release|Win32
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x64.ActiveCfg = Release|x64
{B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x64.Build.0 = Release|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x64 Setup.ActiveCfg = Release|x64
+ {B69247FA-ECD6-40ED-8E44-5CA6C3BAF9A4}.Release|x86 Setup.ActiveCfg = Release|Win32
{C24FB505-05D7-4319-8485-7540B44C8603}.All|Win32.ActiveCfg = Release|x64
{C24FB505-05D7-4319-8485-7540B44C8603}.All|x64.ActiveCfg = Release|x64
{C24FB505-05D7-4319-8485-7540B44C8603}.All|x64.Build.0 = Release|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.All|x64 Setup.ActiveCfg = Release|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.All|x64 Setup.Build.0 = Release|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.All|x86 Setup.ActiveCfg = Release|x64
{C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.ActiveCfg = Debug|Win32
{C24FB505-05D7-4319-8485-7540B44C8603}.Debug|Win32.Build.0 = Debug|Win32
{C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x64.ActiveCfg = Debug|x64
{C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x64.Build.0 = Debug|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.ActiveCfg = Release|Win32
{C24FB505-05D7-4319-8485-7540B44C8603}.Release|Win32.Build.0 = Release|Win32
{C24FB505-05D7-4319-8485-7540B44C8603}.Release|x64.ActiveCfg = Release|x64
{C24FB505-05D7-4319-8485-7540B44C8603}.Release|x64.Build.0 = Release|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Release|x64 Setup.ActiveCfg = Release|x64
+ {C24FB505-05D7-4319-8485-7540B44C8603}.Release|x86 Setup.ActiveCfg = Release|Win32
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|Win32.ActiveCfg = Release|x64
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64.ActiveCfg = Release|x64
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64.Build.0 = Release|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64 Setup.ActiveCfg = Release|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x64 Setup.Build.0 = Release|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.All|x86 Setup.ActiveCfg = Release|x64
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.ActiveCfg = Debug|Win32
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|Win32.Build.0 = Debug|Win32
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x64.ActiveCfg = Debug|x64
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x64.Build.0 = Debug|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.ActiveCfg = Release|Win32
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|Win32.Build.0 = Release|Win32
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x64.ActiveCfg = Release|x64
{B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x64.Build.0 = Release|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x64 Setup.ActiveCfg = Release|x64
+ {B5881A85-FE70-4F64-8607-2CAAE52669C6}.Release|x86 Setup.ActiveCfg = Release|Win32
{05515420-16DE-4E63-BE73-85BE85BA5142}.All|Win32.ActiveCfg = Release|x64
{05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64.ActiveCfg = Release|x64
{05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64.Build.0 = Release|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64 Setup.ActiveCfg = Release|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.All|x64 Setup.Build.0 = Release|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.All|x86 Setup.ActiveCfg = Release|x64
{05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.ActiveCfg = Debug|Win32
{05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|Win32.Build.0 = Debug|Win32
{05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x64.ActiveCfg = Debug|x64
{05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x64.Build.0 = Debug|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.ActiveCfg = Release|Win32
{05515420-16DE-4E63-BE73-85BE85BA5142}.Release|Win32.Build.0 = Release|Win32
{05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.ActiveCfg = Release|x64
{05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64.Build.0 = Release|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x64 Setup.ActiveCfg = Release|x64
+ {05515420-16DE-4E63-BE73-85BE85BA5142}.Release|x86 Setup.ActiveCfg = Release|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.All|Win32.ActiveCfg = Release DLL|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.ActiveCfg = Release DLL|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64.Build.0 = Release DLL|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64 Setup.ActiveCfg = Release DLL|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.All|x64 Setup.Build.0 = Release DLL|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.All|x86 Setup.ActiveCfg = Release DLL|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.ActiveCfg = Debug|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|Win32.Build.0 = Debug|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.ActiveCfg = Debug|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64.Build.0 = Debug|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.ActiveCfg = Release|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Release|Win32.Build.0 = Release|Win32
{1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.ActiveCfg = Release|x64
{1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64.Build.0 = Release|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x64 Setup.ActiveCfg = Release|x64
+ {1906D736-08BD-4EE1-924F-B536249B9A54}.Release|x86 Setup.ActiveCfg = Release|Win32
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|Win32.ActiveCfg = Release Dll|x64
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.ActiveCfg = Release Dll|x64
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64.Build.0 = Release Dll|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64 Setup.ActiveCfg = Release Dll|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x64 Setup.Build.0 = Release Dll|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.All|x86 Setup.ActiveCfg = Release Dll|x64
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.ActiveCfg = Debug|Win32
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|Win32.Build.0 = Debug|Win32
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x64.ActiveCfg = Debug|x64
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x64.Build.0 = Debug|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.ActiveCfg = Release|Win32
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|Win32.Build.0 = Release|Win32
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x64.ActiveCfg = Release|x64
{EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x64.Build.0 = Release|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x64 Setup.ActiveCfg = Release|x64
+ {EEF031CB-FED8-451E-A471-91EC8D4F6750}.Release|x86 Setup.ActiveCfg = Release|Win32
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|Win32.ActiveCfg = Release DLL|x64
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64.ActiveCfg = Release DLL|x64
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64.Build.0 = Release DLL|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64 Setup.ActiveCfg = Release DLL|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x64 Setup.Build.0 = Release DLL|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.All|x86 Setup.ActiveCfg = Release DLL|x64
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.ActiveCfg = Debug|Win32
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|Win32.Build.0 = Debug|Win32
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x64.ActiveCfg = Debug|x64
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x64.Build.0 = Debug|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.ActiveCfg = Release|Win32
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|Win32.Build.0 = Release|Win32
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x64.ActiveCfg = Release|x64
{6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x64.Build.0 = Release|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x64 Setup.ActiveCfg = Release|x64
+ {6EDFEFD5-3596-4FA9-8EBA-B331547B35A3}.Release|x86 Setup.ActiveCfg = Release|Win32
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.All|Win32.ActiveCfg = Release DLL|x64
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.All|x64.ActiveCfg = Release DLL|x64
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.All|x64.Build.0 = Release DLL|x64
+ {8D04B550-D240-4A44-8A18-35DA3F7038D9}.All|x64 Setup.ActiveCfg = Release DLL|x64
+ {8D04B550-D240-4A44-8A18-35DA3F7038D9}.All|x64 Setup.Build.0 = Release DLL|x64
+ {8D04B550-D240-4A44-8A18-35DA3F7038D9}.All|x86 Setup.ActiveCfg = Release DLL|x64
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Debug|Win32.ActiveCfg = Debug|Win32
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Debug|Win32.Build.0 = Debug|Win32
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Debug|x64.ActiveCfg = Debug|x64
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Debug|x64.Build.0 = Debug|x64
+ {8D04B550-D240-4A44-8A18-35DA3F7038D9}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {8D04B550-D240-4A44-8A18-35DA3F7038D9}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Release|Win32.ActiveCfg = Release|Win32
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Release|Win32.Build.0 = Release|Win32
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Release|x64.ActiveCfg = Release|x64
{8D04B550-D240-4A44-8A18-35DA3F7038D9}.Release|x64.Build.0 = Release|x64
+ {8D04B550-D240-4A44-8A18-35DA3F7038D9}.Release|x64 Setup.ActiveCfg = Release|x64
+ {8D04B550-D240-4A44-8A18-35DA3F7038D9}.Release|x86 Setup.ActiveCfg = Release|Win32
{1CED5987-A529-46DC-B30F-870D85FF9C94}.All|Win32.ActiveCfg = Release|x64
{1CED5987-A529-46DC-B30F-870D85FF9C94}.All|x64.ActiveCfg = Release|x64
{1CED5987-A529-46DC-B30F-870D85FF9C94}.All|x64.Build.0 = Release|x64
+ {1CED5987-A529-46DC-B30F-870D85FF9C94}.All|x64 Setup.ActiveCfg = Release|x64
+ {1CED5987-A529-46DC-B30F-870D85FF9C94}.All|x64 Setup.Build.0 = Release|x64
+ {1CED5987-A529-46DC-B30F-870D85FF9C94}.All|x86 Setup.ActiveCfg = Release|x64
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|Win32.ActiveCfg = Debug|Win32
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|Win32.Build.0 = Debug|Win32
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|x64.ActiveCfg = Debug|x64
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|x64.Build.0 = Debug|x64
+ {1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {1CED5987-A529-46DC-B30F-870D85FF9C94}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Win32.ActiveCfg = Release|Win32
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|Win32.Build.0 = Release|Win32
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|x64.ActiveCfg = Release|x64
{1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|x64.Build.0 = Release|x64
+ {1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|x64 Setup.ActiveCfg = Release|x64
+ {1CED5987-A529-46DC-B30F-870D85FF9C94}.Release|x86 Setup.ActiveCfg = Release|Win32
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|Win32.ActiveCfg = Release|x64
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64.ActiveCfg = Release|x64
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64.Build.0 = Release|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64 Setup.ActiveCfg = Release|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x64 Setup.Build.0 = Release|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.All|x86 Setup.ActiveCfg = Release|x64
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.ActiveCfg = Debug|Win32
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|Win32.Build.0 = Debug|Win32
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x64.ActiveCfg = Debug|x64
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x64.Build.0 = Debug|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.ActiveCfg = Release|Win32
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|Win32.Build.0 = Release|Win32
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.ActiveCfg = Release|x64
{F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64.Build.0 = Release|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x64 Setup.ActiveCfg = Release|x64
+ {F6C55D93-B927-4483-BB69-15AEF3DD2DFF}.Release|x86 Setup.ActiveCfg = Release|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|Win32.ActiveCfg = Release|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.ActiveCfg = Release|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64.Build.0 = Release|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64 Setup.ActiveCfg = Release|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x64 Setup.Build.0 = Release|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.All|x86 Setup.ActiveCfg = Release|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.ActiveCfg = Debug|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|Win32.Build.0 = Debug|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.ActiveCfg = Debug|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64.Build.0 = Debug|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.ActiveCfg = Release|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|Win32.Build.0 = Release|Win32
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.ActiveCfg = Release|x64
{F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64.Build.0 = Release|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x64 Setup.ActiveCfg = Release|x64
+ {F057DA7F-79E5-4B00-845C-EF446EF055E3}.Release|x86 Setup.ActiveCfg = Release|Win32
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|Win32.ActiveCfg = Release|x64
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.ActiveCfg = Release|x64
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64.Build.0 = Release|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64 Setup.ActiveCfg = Release|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x64 Setup.Build.0 = Release|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.All|x86 Setup.ActiveCfg = Release|x64
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.ActiveCfg = Debug|Win32
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|Win32.Build.0 = Debug|Win32
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x64.ActiveCfg = Debug|x64
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x64.Build.0 = Debug|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.ActiveCfg = Release|Win32
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|Win32.Build.0 = Release|Win32
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.ActiveCfg = Release|x64
{E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64.Build.0 = Release|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x64 Setup.ActiveCfg = Release|x64
+ {E727E8F6-935D-46FE-8B0E-37834748A0E3}.Release|x86 Setup.ActiveCfg = Release|Win32
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.All|Win32.ActiveCfg = Release|x64
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.All|x64.ActiveCfg = Release|x64
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.All|x64.Build.0 = Release|x64
+ {3D0370CA-BED2-4657-A475-32375CBCB6E4}.All|x64 Setup.ActiveCfg = Release|x64
+ {3D0370CA-BED2-4657-A475-32375CBCB6E4}.All|x64 Setup.Build.0 = Release|x64
+ {3D0370CA-BED2-4657-A475-32375CBCB6E4}.All|x86 Setup.ActiveCfg = Release|x64
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|Win32.ActiveCfg = Debug|Win32
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|Win32.Build.0 = Debug|Win32
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|x64.ActiveCfg = Debug|x64
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|x64.Build.0 = Debug|x64
+ {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|Win32.ActiveCfg = Release|Win32
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|Win32.Build.0 = Release|Win32
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|x64.ActiveCfg = Release|x64
{3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|x64.Build.0 = Release|x64
+ {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|x64 Setup.ActiveCfg = Release|x64
+ {3D0370CA-BED2-4657-A475-32375CBCB6E4}.Release|x86 Setup.ActiveCfg = Release|Win32
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.All|Win32.ActiveCfg = Debug|x64
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.All|x64.ActiveCfg = Debug|x64
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.All|x64.Build.0 = Debug|x64
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588}.All|x64 Setup.ActiveCfg = Debug|x64
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588}.All|x64 Setup.Build.0 = Debug|x64
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588}.All|x86 Setup.ActiveCfg = Debug|x64
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Debug|Win32.ActiveCfg = Debug|Win32
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Debug|Win32.Build.0 = Debug|Win32
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Debug|x64.ActiveCfg = Debug|x64
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Debug|x64.Build.0 = Debug|x64
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Release|Win32.ActiveCfg = Release|Win32
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Release|Win32.Build.0 = Release|Win32
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Release|x64.ActiveCfg = Release|x64
{87EE9DA4-DE1E-4448-8324-183C98DCA588}.Release|x64.Build.0 = Release|x64
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588}.Release|x64 Setup.ActiveCfg = Release|x64
+ {87EE9DA4-DE1E-4448-8324-183C98DCA588}.Release|x86 Setup.ActiveCfg = Release|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|Win32.ActiveCfg = Debug|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.ActiveCfg = Debug|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64.Build.0 = Debug|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64 Setup.ActiveCfg = Debug|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x64 Setup.Build.0 = Debug|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.All|x86 Setup.ActiveCfg = Debug|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.ActiveCfg = Debug|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|Win32.Build.0 = Debug|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.ActiveCfg = Debug|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64.Build.0 = Debug|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.ActiveCfg = Release|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|Win32.Build.0 = Release|Win32
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.ActiveCfg = Release|x64
{155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64.Build.0 = Release|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x64 Setup.ActiveCfg = Release|x64
+ {155844C3-EC5F-407F-97A4-A2DDADED9B2F}.Release|x86 Setup.ActiveCfg = Release|Win32
{204FA0DE-305D-4414-AE2E-F195A23F390D}.All|Win32.ActiveCfg = Debug|x64
{204FA0DE-305D-4414-AE2E-F195A23F390D}.All|x64.ActiveCfg = Debug|x64
{204FA0DE-305D-4414-AE2E-F195A23F390D}.All|x64.Build.0 = Debug|x64
+ {204FA0DE-305D-4414-AE2E-F195A23F390D}.All|x64 Setup.ActiveCfg = Debug|x64
+ {204FA0DE-305D-4414-AE2E-F195A23F390D}.All|x64 Setup.Build.0 = Debug|x64
+ {204FA0DE-305D-4414-AE2E-F195A23F390D}.All|x86 Setup.ActiveCfg = Debug|x64
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Debug|Win32.ActiveCfg = Debug|Win32
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Debug|Win32.Build.0 = Debug|Win32
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Debug|x64.ActiveCfg = Debug|x64
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Debug|x64.Build.0 = Debug|x64
+ {204FA0DE-305D-4414-AE2E-F195A23F390D}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {204FA0DE-305D-4414-AE2E-F195A23F390D}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Release|Win32.ActiveCfg = Release|Win32
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Release|Win32.Build.0 = Release|Win32
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Release|x64.ActiveCfg = Release|x64
{204FA0DE-305D-4414-AE2E-F195A23F390D}.Release|x64.Build.0 = Release|x64
+ {204FA0DE-305D-4414-AE2E-F195A23F390D}.Release|x64 Setup.ActiveCfg = Release|x64
+ {204FA0DE-305D-4414-AE2E-F195A23F390D}.Release|x86 Setup.ActiveCfg = Release|Win32
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|Win32.ActiveCfg = Release|x64
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.ActiveCfg = Release|x64
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64.Build.0 = Release|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64 Setup.ActiveCfg = Release|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x64 Setup.Build.0 = Release|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.All|x86 Setup.ActiveCfg = Release|x64
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.ActiveCfg = Debug|Win32
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|Win32.Build.0 = Debug|Win32
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x64.ActiveCfg = Debug|x64
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x64.Build.0 = Debug|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.ActiveCfg = Release|Win32
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|Win32.Build.0 = Release|Win32
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x64.ActiveCfg = Release|x64
{0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x64.Build.0 = Release|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x64 Setup.ActiveCfg = Release|x64
+ {0DF3ABD0-DDC0-4265-B778-07C66780979B}.Release|x86 Setup.ActiveCfg = Release|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.All|Win32.ActiveCfg = Release|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.All|Win32.Build.0 = Release|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.All|x64.ActiveCfg = Release|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.All|x64.Build.0 = Release|Win32
+ {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.All|x64 Setup.ActiveCfg = Release|Win32
+ {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.All|x64 Setup.Build.0 = Release|Win32
+ {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.All|x86 Setup.ActiveCfg = Release|Win32
+ {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.All|x86 Setup.Build.0 = Release|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Debug|Win32.ActiveCfg = Debug|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Debug|Win32.Build.0 = Debug|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Debug|x64.ActiveCfg = Debug|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Debug|x64.Build.0 = Debug|Win32
+ {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Release|Win32.ActiveCfg = Release|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Release|Win32.Build.0 = Release|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Release|x64.ActiveCfg = Release|Win32
{8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Release|x64.Build.0 = Release|Win32
+ {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {8B3B4C4C-13C2-446C-BEB0-F412CC2CFB9A}.Release|x86 Setup.ActiveCfg = Release|Win32
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|Win32.ActiveCfg = Release DLL|x64
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64.ActiveCfg = Release DLL|x64
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64.Build.0 = Release DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64 Setup.ActiveCfg = Release DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x64 Setup.Build.0 = Release DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.All|x86 Setup.ActiveCfg = Release DLL|x64
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.ActiveCfg = Debug DLL|Win32
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|Win32.Build.0 = Debug DLL|Win32
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x64.ActiveCfg = Debug DLL|x64
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x64.Build.0 = Debug DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x64 Setup.ActiveCfg = Debug DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Debug|x86 Setup.ActiveCfg = Debug DLL|Win32
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.ActiveCfg = Release DLL|Win32
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|Win32.Build.0 = Release DLL|Win32
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x64.ActiveCfg = Release DLL|x64
{DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x64.Build.0 = Release DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x64 Setup.ActiveCfg = Release DLL|x64
+ {DF018947-0FFF-4EB3-BDEE-441DC81DA7A4}.Release|x86 Setup.ActiveCfg = Release DLL|Win32
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|Win32.ActiveCfg = Release Passthrough|x64
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64.ActiveCfg = Release Passthrough|x64
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64.Build.0 = Release Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64 Setup.ActiveCfg = Release Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x64 Setup.Build.0 = Release Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.All|x86 Setup.ActiveCfg = Release Passthrough|x64
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|Win32.Build.0 = Debug Passthrough|Win32
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x64.ActiveCfg = Debug Passthrough|x64
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x64.Build.0 = Debug Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x64 Setup.ActiveCfg = Debug Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Debug|x86 Setup.ActiveCfg = Debug Passthrough|Win32
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.ActiveCfg = Release Passthrough|Win32
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|Win32.Build.0 = Release Passthrough|Win32
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x64.ActiveCfg = Release Passthrough|x64
{FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x64.Build.0 = Release Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x64 Setup.ActiveCfg = Release Passthrough|x64
+ {FEA1EEF7-876F-48DE-88BF-C0E3E606D758}.Release|x86 Setup.ActiveCfg = Release Passthrough|Win32
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|Win32.ActiveCfg = Release|x64
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64.ActiveCfg = Release|x64
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64.Build.0 = Release|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64 Setup.ActiveCfg = Release|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x64 Setup.Build.0 = Release|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.All|x86 Setup.ActiveCfg = Release|x64
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.ActiveCfg = Debug|Win32
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|Win32.Build.0 = Debug|Win32
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x64.ActiveCfg = Debug|x64
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x64.Build.0 = Debug|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.ActiveCfg = Release|Win32
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|Win32.Build.0 = Release|Win32
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x64.ActiveCfg = Release|x64
{9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x64.Build.0 = Release|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x64 Setup.ActiveCfg = Release|x64
+ {9254C4B0-6F60-42B6-BB3A-36D63FC001C7}.Release|x86 Setup.ActiveCfg = Release|Win32
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.All|Win32.ActiveCfg = Release|x64
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.All|x64.ActiveCfg = Release|x64
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.All|x64.Build.0 = Release|x64
+ {ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.All|x64 Setup.ActiveCfg = Release|x64
+ {ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.All|x64 Setup.Build.0 = Release|x64
+ {ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.All|x86 Setup.ActiveCfg = Release|x64
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Debug|Win32.ActiveCfg = Debug|Win32
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Debug|Win32.Build.0 = Debug|Win32
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Debug|x64.ActiveCfg = Debug|x64
+ {ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Release|Win32.ActiveCfg = Release|Win32
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Release|Win32.Build.0 = Release|Win32
{ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Release|x64.ActiveCfg = Release|x64
+ {ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Release|x64 Setup.ActiveCfg = Release|x64
+ {ACFFF684-4D19-4D48-AF12-88EA1D778BDF}.Release|x86 Setup.ActiveCfg = Release|Win32
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.All|Win32.ActiveCfg = Release|x64
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.All|x64.ActiveCfg = Release|x64
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.All|x64.Build.0 = Release|x64
+ {8F992C49-6C51-412F-B2A3-34EAB708EB65}.All|x64 Setup.ActiveCfg = Release|x64
+ {8F992C49-6C51-412F-B2A3-34EAB708EB65}.All|x64 Setup.Build.0 = Release|x64
+ {8F992C49-6C51-412F-B2A3-34EAB708EB65}.All|x86 Setup.ActiveCfg = Release|x64
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Debug|Win32.ActiveCfg = Debug|Win32
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Debug|Win32.Build.0 = Debug|Win32
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Debug|x64.ActiveCfg = Debug|x64
+ {8F992C49-6C51-412F-B2A3-34EAB708EB65}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {8F992C49-6C51-412F-B2A3-34EAB708EB65}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|Win32.ActiveCfg = Release|Win32
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|Win32.Build.0 = Release|Win32
{8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|x64.ActiveCfg = Release|x64
+ {8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|x64 Setup.ActiveCfg = Release|x64
+ {8F992C49-6C51-412F-B2A3-34EAB708EB65}.Release|x86 Setup.ActiveCfg = Release|Win32
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|Win32.ActiveCfg = Release|x64
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.ActiveCfg = Release|x64
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64.Build.0 = Release|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64 Setup.ActiveCfg = Release|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x64 Setup.Build.0 = Release|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.All|x86 Setup.ActiveCfg = Release|x64
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|Win32.ActiveCfg = Debug|Win32
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|Win32.Build.0 = Debug|Win32
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64.ActiveCfg = Debug|x64
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64.Build.0 = Debug|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|Win32.ActiveCfg = Release|Win32
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|Win32.Build.0 = Release|Win32
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64.ActiveCfg = Release|x64
{4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64.Build.0 = Release|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x64 Setup.ActiveCfg = Release|x64
+ {4043FC6A-9A30-4577-8AD5-9B233C9575D8}.Release|x86 Setup.ActiveCfg = Release|Win32
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|Win32.ActiveCfg = Release|x64
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.ActiveCfg = Release|x64
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64.Build.0 = Release|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64 Setup.ActiveCfg = Release|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x64 Setup.Build.0 = Release|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.All|x86 Setup.ActiveCfg = Release|x64
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.ActiveCfg = Debug|Win32
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|Win32.Build.0 = Debug|Win32
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.ActiveCfg = Debug|x64
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64.Build.0 = Debug|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.ActiveCfg = Release|Win32
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|Win32.Build.0 = Release|Win32
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.ActiveCfg = Release|x64
{71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64.Build.0 = Release|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x64 Setup.ActiveCfg = Release|x64
+ {71A967D5-0E99-4CEF-A587-98836EE6F2EF}.Release|x86 Setup.ActiveCfg = Release|Win32
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.All|Win32.ActiveCfg = Release|x64
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.All|x64.ActiveCfg = Release|x64
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.All|x64.Build.0 = Release|x64
+ {0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.All|x64 Setup.ActiveCfg = Release|x64
+ {0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.All|x64 Setup.Build.0 = Release|x64
+ {0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.All|x86 Setup.ActiveCfg = Release|x64
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.Debug|Win32.ActiveCfg = Debug|Win32
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.Debug|Win32.Build.0 = Debug|Win32
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.Debug|x64.ActiveCfg = Debug|x64
+ {0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.Release|Win32.ActiveCfg = Release|Win32
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.Release|Win32.Build.0 = Release|Win32
{0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.Release|x64.ActiveCfg = Release|x64
+ {0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.Release|x64 Setup.ActiveCfg = Release|x64
+ {0A6B5EA5-6E9B-4A51-931F-ED25AA87B4DF}.Release|x86 Setup.ActiveCfg = Release|Win32
{AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|Win32.ActiveCfg = Release|x64
{AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64.ActiveCfg = Release|x64
{AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64.Build.0 = Release|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64 Setup.ActiveCfg = Release|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x64 Setup.Build.0 = Release|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.All|x86 Setup.ActiveCfg = Release|x64
{AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|Win32.ActiveCfg = Debug|Win32
{AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|Win32.Build.0 = Debug|Win32
{AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x64.ActiveCfg = Debug|x64
{AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x64.Build.0 = Debug|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|Win32.ActiveCfg = Release|Win32
{AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|Win32.Build.0 = Release|Win32
{AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x64.ActiveCfg = Release|x64
{AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x64.Build.0 = Release|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x64 Setup.ActiveCfg = Release|x64
+ {AB91A099-7690-4ECF-8994-E458F4EA1ED4}.Release|x86 Setup.ActiveCfg = Release|Win32
{988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|Win32.ActiveCfg = Release|x64
{988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64.ActiveCfg = Release|x64
{988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64.Build.0 = Release|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64 Setup.ActiveCfg = Release|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x64 Setup.Build.0 = Release|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.All|x86 Setup.ActiveCfg = Release|x64
{988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|Win32.ActiveCfg = Debug|Win32
{988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|Win32.Build.0 = Debug|Win32
{988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x64.ActiveCfg = Debug|x64
{988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x64.Build.0 = Debug|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|Win32.ActiveCfg = Release|Win32
{988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|Win32.Build.0 = Release|Win32
{988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x64.ActiveCfg = Release|x64
{988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x64.Build.0 = Release|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x64 Setup.ActiveCfg = Release|x64
+ {988CACF7-3FCB-4992-BE69-77872AE67DC8}.Release|x86 Setup.ActiveCfg = Release|Win32
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|Win32.ActiveCfg = Release DirectSound|x64
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64.ActiveCfg = Release DirectSound|x64
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64.Build.0 = Release DirectSound|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64 Setup.ActiveCfg = Release DirectSound|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64 Setup.Build.0 = Release DirectSound|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x86 Setup.ActiveCfg = Release DirectSound|x64
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.ActiveCfg = Debug|Win32
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.Build.0 = Debug|Win32
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.ActiveCfg = Debug|x64
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.Build.0 = Debug|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.ActiveCfg = Release|Win32
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.Build.0 = Release|Win32
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.ActiveCfg = Release|x64
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.Build.0 = Release|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64 Setup.ActiveCfg = Release|x64
+ {0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x86 Setup.ActiveCfg = Release|Win32
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|Win32.ActiveCfg = Release|x64
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.ActiveCfg = Release|x64
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.Build.0 = Release|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64 Setup.ActiveCfg = Release|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64 Setup.Build.0 = Release|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x86 Setup.ActiveCfg = Release|x64
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|Win32.ActiveCfg = Debug|Win32
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|Win32.Build.0 = Debug|Win32
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x64.ActiveCfg = Debug|x64
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x64.Build.0 = Debug|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|Win32.ActiveCfg = Release|Win32
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|Win32.Build.0 = Release|Win32
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x64.ActiveCfg = Release|x64
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x64.Build.0 = Release|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x64 Setup.ActiveCfg = Release|x64
+ {08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.Release|x86 Setup.ActiveCfg = Release|Win32
{8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|Win32.ActiveCfg = Release Passthrough|x64
{8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64.ActiveCfg = Release Passthrough|x64
{8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64.Build.0 = Release Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64 Setup.ActiveCfg = Release Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x64 Setup.Build.0 = Release Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.All|x86 Setup.ActiveCfg = Release Passthrough|x64
{8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|Win32.ActiveCfg = Debug Passthrough|Win32
{8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|Win32.Build.0 = Debug Passthrough|Win32
{8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x64.ActiveCfg = Debug Passthrough|x64
{8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x64.Build.0 = Debug Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x64 Setup.ActiveCfg = Debug Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Debug|x86 Setup.ActiveCfg = Debug Passthrough|Win32
{8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|Win32.ActiveCfg = Release Passthrough|Win32
{8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|Win32.Build.0 = Release Passthrough|Win32
{8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x64.ActiveCfg = Release Passthrough|x64
{8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x64.Build.0 = Release Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x64 Setup.ActiveCfg = Release Passthrough|x64
+ {8DEB383C-4091-4F42-A56F-C9E46D552D79}.Release|x86 Setup.ActiveCfg = Release Passthrough|Win32
{2C3C2423-234B-4772-8899-D3B137E5CA35}.All|Win32.ActiveCfg = Release|x64
{2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64.ActiveCfg = Release|x64
{2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64.Build.0 = Release|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64 Setup.ActiveCfg = Release|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x64 Setup.Build.0 = Release|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.All|x86 Setup.ActiveCfg = Release|x64
{2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|Win32.ActiveCfg = Debug|Win32
{2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|Win32.Build.0 = Debug|Win32
{2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x64.ActiveCfg = Debug|x64
{2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x64.Build.0 = Debug|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|Win32.ActiveCfg = Release|Win32
{2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|Win32.Build.0 = Release|Win32
{2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x64.ActiveCfg = Release|x64
{2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x64.Build.0 = Release|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x64 Setup.ActiveCfg = Release|x64
+ {2C3C2423-234B-4772-8899-D3B137E5CA35}.Release|x86 Setup.ActiveCfg = Release|Win32
{3850D93A-5F24-4922-BC1C-74D08C37C256}.All|Win32.ActiveCfg = Release|x64
{3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64.ActiveCfg = Release|x64
{3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64.Build.0 = Release|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64 Setup.ActiveCfg = Release|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x64 Setup.Build.0 = Release|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.All|x86 Setup.ActiveCfg = Release|x64
{3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|Win32.ActiveCfg = Debug|Win32
{3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|Win32.Build.0 = Debug|Win32
{3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x64.ActiveCfg = Debug|x64
{3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x64.Build.0 = Debug|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.ActiveCfg = Release|Win32
{3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|Win32.Build.0 = Release|Win32
{3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64.ActiveCfg = Release|x64
{3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64.Build.0 = Release|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x64 Setup.ActiveCfg = Release|x64
+ {3850D93A-5F24-4922-BC1C-74D08C37C256}.Release|x86 Setup.ActiveCfg = Release|Win32
{2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|Win32.ActiveCfg = Release|x64
{2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64.ActiveCfg = Release|x64
{2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64.Build.0 = Release|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64 Setup.ActiveCfg = Release|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x64 Setup.Build.0 = Release|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.All|x86 Setup.ActiveCfg = Release|x64
{2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.ActiveCfg = Debug|Win32
{2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|Win32.Build.0 = Debug|Win32
{2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64.ActiveCfg = Debug|x64
{2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64.Build.0 = Debug|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.ActiveCfg = Release|Win32
{2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|Win32.Build.0 = Release|Win32
{2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64.ActiveCfg = Release|x64
{2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64.Build.0 = Release|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x64 Setup.ActiveCfg = Release|x64
+ {2CA40887-1622-46A1-A7F9-17FD7E7E545B}.Release|x86 Setup.ActiveCfg = Release|Win32
{028C7278-05D7-4E18-82FE-BE231B844F41}.All|Win32.ActiveCfg = Release|x64
{028C7278-05D7-4E18-82FE-BE231B844F41}.All|x64.ActiveCfg = Release|x64
{028C7278-05D7-4E18-82FE-BE231B844F41}.All|x64.Build.0 = Release|x64
+ {028C7278-05D7-4E18-82FE-BE231B844F41}.All|x64 Setup.ActiveCfg = Release|x64
+ {028C7278-05D7-4E18-82FE-BE231B844F41}.All|x64 Setup.Build.0 = Release|x64
+ {028C7278-05D7-4E18-82FE-BE231B844F41}.All|x86 Setup.ActiveCfg = Release|x64
{028C7278-05D7-4E18-82FE-BE231B844F41}.Debug|Win32.ActiveCfg = Debug|Win32
{028C7278-05D7-4E18-82FE-BE231B844F41}.Debug|Win32.Build.0 = Debug|Win32
{028C7278-05D7-4E18-82FE-BE231B844F41}.Debug|x64.ActiveCfg = Debug|x64
+ {028C7278-05D7-4E18-82FE-BE231B844F41}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {028C7278-05D7-4E18-82FE-BE231B844F41}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{028C7278-05D7-4E18-82FE-BE231B844F41}.Release|Win32.ActiveCfg = Release|Win32
{028C7278-05D7-4E18-82FE-BE231B844F41}.Release|Win32.Build.0 = Release|Win32
{028C7278-05D7-4E18-82FE-BE231B844F41}.Release|x64.ActiveCfg = Release|x64
+ {028C7278-05D7-4E18-82FE-BE231B844F41}.Release|x64 Setup.ActiveCfg = Release|x64
+ {028C7278-05D7-4E18-82FE-BE231B844F41}.Release|x86 Setup.ActiveCfg = Release|Win32
{D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|Win32.ActiveCfg = Release|x64
{D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64.ActiveCfg = Release|x64
{D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64.Build.0 = Release|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64 Setup.ActiveCfg = Release|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x64 Setup.Build.0 = Release|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.All|x86 Setup.ActiveCfg = Release|x64
{D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.ActiveCfg = Debug|Win32
{D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|Win32.Build.0 = Debug|Win32
{D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64.ActiveCfg = Debug|x64
{D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64.Build.0 = Debug|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.ActiveCfg = Release|Win32
{D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|Win32.Build.0 = Release|Win32
{D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64.ActiveCfg = Release|x64
{D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64.Build.0 = Release|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x64 Setup.ActiveCfg = Release|x64
+ {D7F1E3F2-A3F4-474C-8555-15122571AF52}.Release|x86 Setup.ActiveCfg = Release|Win32
{5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|Win32.ActiveCfg = Release|x64
{5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64.ActiveCfg = Release|x64
{5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64.Build.0 = Release|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64 Setup.ActiveCfg = Release|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x64 Setup.Build.0 = Release|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.All|x86 Setup.ActiveCfg = Release|x64
{5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|Win32.ActiveCfg = Debug|Win32
{5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|Win32.Build.0 = Debug|Win32
{5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x64.ActiveCfg = Debug|x64
{5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x64.Build.0 = Debug|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|Win32.ActiveCfg = Release|Win32
{5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|Win32.Build.0 = Release|Win32
{5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x64.ActiveCfg = Release|x64
{5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x64.Build.0 = Release|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x64 Setup.ActiveCfg = Release|x64
+ {5BC072DB-3826-48EA-AF34-FE32AA01E83B}.Release|x86 Setup.ActiveCfg = Release|Win32
{FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|Win32.ActiveCfg = Release|x64
{FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64.ActiveCfg = Release|x64
{FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64.Build.0 = Release|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64 Setup.ActiveCfg = Release|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x64 Setup.Build.0 = Release|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.All|x86 Setup.ActiveCfg = Release|x64
{FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|Win32.ActiveCfg = Debug|Win32
{FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|Win32.Build.0 = Debug|Win32
{FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x64.ActiveCfg = Debug|x64
{FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x64.Build.0 = Debug|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|Win32.ActiveCfg = Release|Win32
{FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|Win32.Build.0 = Release|Win32
{FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x64.ActiveCfg = Release|x64
{FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x64.Build.0 = Release|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x64 Setup.ActiveCfg = Release|x64
+ {FA429E98-8B03-45E6-A096-A4BC5E821DE4}.Release|x86 Setup.ActiveCfg = Release|Win32
{06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|Win32.ActiveCfg = Release|x64
{06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64.ActiveCfg = Release|x64
{06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64.Build.0 = Release|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64 Setup.ActiveCfg = Release|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x64 Setup.Build.0 = Release|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.All|x86 Setup.ActiveCfg = Release|x64
{06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|Win32.ActiveCfg = Debug|Win32
{06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|Win32.Build.0 = Debug|Win32
{06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x64.ActiveCfg = Debug|x64
{06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x64.Build.0 = Debug|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|Win32.ActiveCfg = Release|Win32
{06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|Win32.Build.0 = Release|Win32
{06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x64.ActiveCfg = Release|x64
{06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x64.Build.0 = Release|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x64 Setup.ActiveCfg = Release|x64
+ {06E3A538-AB32-44F2-B477-755FF9CB5D37}.Release|x86 Setup.ActiveCfg = Release|Win32
{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|Win32.ActiveCfg = Release|x64
{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64.ActiveCfg = Release|x64
{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64.Build.0 = Release|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64 Setup.ActiveCfg = Release|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x64 Setup.Build.0 = Release|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.All|x86 Setup.ActiveCfg = Release|x64
{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|Win32.ActiveCfg = Debug|Win32
{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|Win32.Build.0 = Debug|Win32
{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x64.ActiveCfg = Debug|x64
{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x64.Build.0 = Debug|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|Win32.ActiveCfg = Release|Win32
{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|Win32.Build.0 = Release|Win32
{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x64.ActiveCfg = Release|x64
{6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x64.Build.0 = Release|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x64 Setup.ActiveCfg = Release|x64
+ {6D1BEC70-4DCD-4FE9-ADBD-4A43A67E4D05}.Release|x86 Setup.ActiveCfg = Release|Win32
{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|Win32.ActiveCfg = Release|x64
{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64.ActiveCfg = Release|x64
{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64.Build.0 = Release|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64 Setup.ActiveCfg = Release|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x64 Setup.Build.0 = Release|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.All|x86 Setup.ActiveCfg = Release|x64
{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|Win32.ActiveCfg = Debug|Win32
{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|Win32.Build.0 = Debug|Win32
{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x64.ActiveCfg = Debug|x64
{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x64.Build.0 = Debug|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|Win32.ActiveCfg = Release|Win32
{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|Win32.Build.0 = Release|Win32
{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x64.ActiveCfg = Release|x64
{A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x64.Build.0 = Release|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x64 Setup.ActiveCfg = Release|x64
+ {A4B122CF-5196-476B-8C0E-D8BD59AC3C14}.Release|x86 Setup.ActiveCfg = Release|Win32
{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|Win32.ActiveCfg = Release|x64
{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64.ActiveCfg = Release|x64
{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64.Build.0 = Release|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64 Setup.ActiveCfg = Release|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x64 Setup.Build.0 = Release|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.All|x86 Setup.ActiveCfg = Release|x64
{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|Win32.ActiveCfg = Debug|Win32
{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|Win32.Build.0 = Debug|Win32
{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x64.ActiveCfg = Debug|x64
{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x64.Build.0 = Debug|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|Win32.ActiveCfg = Release|Win32
{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|Win32.Build.0 = Release|Win32
{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x64.ActiveCfg = Release|x64
{75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x64.Build.0 = Release|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x64 Setup.ActiveCfg = Release|x64
+ {75DF7F29-2FBF-47F7-B5AF-5B4952DC1ABD}.Release|x86 Setup.ActiveCfg = Release|Win32
{F6A33240-8F29-48BD-98F0-826995911799}.All|Win32.ActiveCfg = Release|x64
{F6A33240-8F29-48BD-98F0-826995911799}.All|x64.ActiveCfg = Release|x64
{F6A33240-8F29-48BD-98F0-826995911799}.All|x64.Build.0 = Release|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.All|x64 Setup.ActiveCfg = Release|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.All|x64 Setup.Build.0 = Release|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.All|x86 Setup.ActiveCfg = Release|x64
{F6A33240-8F29-48BD-98F0-826995911799}.Debug|Win32.ActiveCfg = Debug|Win32
{F6A33240-8F29-48BD-98F0-826995911799}.Debug|Win32.Build.0 = Debug|Win32
{F6A33240-8F29-48BD-98F0-826995911799}.Debug|x64.ActiveCfg = Debug|x64
{F6A33240-8F29-48BD-98F0-826995911799}.Debug|x64.Build.0 = Debug|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{F6A33240-8F29-48BD-98F0-826995911799}.Release|Win32.ActiveCfg = Release|Win32
{F6A33240-8F29-48BD-98F0-826995911799}.Release|Win32.Build.0 = Release|Win32
{F6A33240-8F29-48BD-98F0-826995911799}.Release|x64.ActiveCfg = Release|x64
{F6A33240-8F29-48BD-98F0-826995911799}.Release|x64.Build.0 = Release|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.Release|x64 Setup.ActiveCfg = Release|x64
+ {F6A33240-8F29-48BD-98F0-826995911799}.Release|x86 Setup.ActiveCfg = Release|Win32
{65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|Win32.ActiveCfg = Release|x64
{65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64.ActiveCfg = Release|x64
{65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64.Build.0 = Release|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64 Setup.ActiveCfg = Release|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x64 Setup.Build.0 = Release|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.All|x86 Setup.ActiveCfg = Release|x64
{65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|Win32.ActiveCfg = Debug|Win32
{65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|Win32.Build.0 = Debug|Win32
{65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x64.ActiveCfg = Debug|x64
{65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x64.Build.0 = Debug|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|Win32.ActiveCfg = Release|Win32
{65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|Win32.Build.0 = Release|Win32
{65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x64.ActiveCfg = Release|x64
{65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x64.Build.0 = Release|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x64 Setup.ActiveCfg = Release|x64
+ {65A6273D-FCAB-4C55-B09E-65100141A5D4}.Release|x86 Setup.ActiveCfg = Release|Win32
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|Win32.ActiveCfg = Release|x64
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64.ActiveCfg = Release|x64
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64.Build.0 = Release|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64 Setup.ActiveCfg = Release|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x64 Setup.Build.0 = Release|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.All|x86 Setup.ActiveCfg = Release|x64
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|Win32.ActiveCfg = Debug|Win32
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|Win32.Build.0 = Debug|Win32
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x64.ActiveCfg = Debug|x64
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x64.Build.0 = Debug|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|Win32.ActiveCfg = Release|Win32
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|Win32.Build.0 = Release|Win32
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x64.ActiveCfg = Release|x64
{E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x64.Build.0 = Release|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x64 Setup.ActiveCfg = Release|x64
+ {E7BC026C-7CC5-45A3-BC7C-3B88EEF01F24}.Release|x86 Setup.ActiveCfg = Release|Win32
{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|Win32.ActiveCfg = Release|x64
{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64.ActiveCfg = Release|x64
{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64.Build.0 = Release|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64 Setup.ActiveCfg = Release|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x64 Setup.Build.0 = Release|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.All|x86 Setup.ActiveCfg = Release|x64
{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|Win32.ActiveCfg = Debug|Win32
{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|Win32.Build.0 = Debug|Win32
{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x64.ActiveCfg = Debug|x64
{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x64.Build.0 = Debug|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|Win32.ActiveCfg = Release|Win32
{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|Win32.Build.0 = Release|Win32
{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x64.ActiveCfg = Release|x64
{D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x64.Build.0 = Release|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x64 Setup.ActiveCfg = Release|x64
+ {D0BCAC02-D94B-46B8-9B49-CDDCC2BD7909}.Release|x86 Setup.ActiveCfg = Release|Win32
{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|Win32.ActiveCfg = Release|x64
{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64.ActiveCfg = Release|x64
{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64.Build.0 = Release|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64 Setup.ActiveCfg = Release|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x64 Setup.Build.0 = Release|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.All|x86 Setup.ActiveCfg = Release|x64
{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|Win32.ActiveCfg = Debug|Win32
{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|Win32.Build.0 = Debug|Win32
{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x64.ActiveCfg = Debug|x64
{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x64.Build.0 = Debug|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|Win32.ActiveCfg = Release|Win32
{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|Win32.Build.0 = Release|Win32
{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x64.ActiveCfg = Release|x64
{44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x64.Build.0 = Release|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x64 Setup.ActiveCfg = Release|x64
+ {44D7DEAF-FDA5-495E-8B9D-1439E4F4C21E}.Release|x86 Setup.ActiveCfg = Release|Win32
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|Win32.ActiveCfg = Release|x64
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64.ActiveCfg = Release|x64
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64.Build.0 = Release|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64 Setup.ActiveCfg = Release|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x64 Setup.Build.0 = Release|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.All|x86 Setup.ActiveCfg = Release|x64
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|Win32.ActiveCfg = Debug|Win32
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|Win32.Build.0 = Debug|Win32
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x64.ActiveCfg = Debug|x64
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x64.Build.0 = Debug|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|Win32.ActiveCfg = Release|Win32
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|Win32.Build.0 = Release|Win32
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x64.ActiveCfg = Release|x64
{6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x64.Build.0 = Release|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x64 Setup.ActiveCfg = Release|x64
+ {6FF941AC-82C5-429F-AA4C-AD2FB9E5DA52}.Release|x86 Setup.ActiveCfg = Release|Win32
{E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|Win32.ActiveCfg = Release|x64
{E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64.ActiveCfg = Release|x64
{E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64.Build.0 = Release|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64 Setup.ActiveCfg = Release|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x64 Setup.Build.0 = Release|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.All|x86 Setup.ActiveCfg = Release|x64
{E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|Win32.ActiveCfg = Debug|Win32
{E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|Win32.Build.0 = Debug|Win32
{E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x64.ActiveCfg = Debug|x64
{E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x64.Build.0 = Debug|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|Win32.ActiveCfg = Release|Win32
{E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|Win32.Build.0 = Release|Win32
{E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x64.ActiveCfg = Release|x64
{E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x64.Build.0 = Release|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x64 Setup.ActiveCfg = Release|x64
+ {E3246D17-E29B-4AB5-962A-C69B0C5837BB}.Release|x86 Setup.ActiveCfg = Release|Win32
{36E854E3-CE12-4348-A125-CCF3F9D74813}.All|Win32.ActiveCfg = Release|x64
{36E854E3-CE12-4348-A125-CCF3F9D74813}.All|x64.ActiveCfg = Release|x64
{36E854E3-CE12-4348-A125-CCF3F9D74813}.All|x64.Build.0 = Release|x64
+ {36E854E3-CE12-4348-A125-CCF3F9D74813}.All|x64 Setup.ActiveCfg = Release|x64
+ {36E854E3-CE12-4348-A125-CCF3F9D74813}.All|x64 Setup.Build.0 = Release|x64
+ {36E854E3-CE12-4348-A125-CCF3F9D74813}.All|x86 Setup.ActiveCfg = Release|x64
{36E854E3-CE12-4348-A125-CCF3F9D74813}.Debug|Win32.ActiveCfg = Debug|Win32
{36E854E3-CE12-4348-A125-CCF3F9D74813}.Debug|Win32.Build.0 = Debug|Win32
{36E854E3-CE12-4348-A125-CCF3F9D74813}.Debug|x64.ActiveCfg = Debug|x64
+ {36E854E3-CE12-4348-A125-CCF3F9D74813}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {36E854E3-CE12-4348-A125-CCF3F9D74813}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{36E854E3-CE12-4348-A125-CCF3F9D74813}.Release|Win32.ActiveCfg = Release|Win32
{36E854E3-CE12-4348-A125-CCF3F9D74813}.Release|Win32.Build.0 = Release|Win32
{36E854E3-CE12-4348-A125-CCF3F9D74813}.Release|x64.ActiveCfg = Release|x64
+ {36E854E3-CE12-4348-A125-CCF3F9D74813}.Release|x64 Setup.ActiveCfg = Release|x64
+ {36E854E3-CE12-4348-A125-CCF3F9D74813}.Release|x86 Setup.ActiveCfg = Release|Win32
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|Win32.ActiveCfg = Release|x64
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64.ActiveCfg = Release|x64
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64.Build.0 = Release|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64 Setup.ActiveCfg = Release|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x64 Setup.Build.0 = Release|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.All|x86 Setup.ActiveCfg = Release|x64
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Win32.ActiveCfg = Debug|Win32
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|Win32.Build.0 = Debug|Win32
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x64.ActiveCfg = Debug|x64
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x64.Build.0 = Debug|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Win32.ActiveCfg = Release|Win32
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|Win32.Build.0 = Release|Win32
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x64.ActiveCfg = Release|x64
{7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x64.Build.0 = Release|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x64 Setup.ActiveCfg = Release|x64
+ {7B077E7F-1BE7-4291-AB86-55E527B25CAC}.Release|x86 Setup.ActiveCfg = Release|Win32
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|Win32.ActiveCfg = Release|x64
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64.ActiveCfg = Release|x64
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64.Build.0 = Release|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64 Setup.ActiveCfg = Release|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x64 Setup.Build.0 = Release|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.All|x86 Setup.ActiveCfg = Release|x64
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|Win32.ActiveCfg = Debug|Win32
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|Win32.Build.0 = Debug|Win32
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x64.ActiveCfg = Debug|x64
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x64.Build.0 = Debug|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|Win32.ActiveCfg = Release|Win32
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|Win32.Build.0 = Release|Win32
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x64.ActiveCfg = Release|x64
{D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x64.Build.0 = Release|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x64 Setup.ActiveCfg = Release|x64
+ {D2396DD7-7D38-473A-ABB7-6F96D65AE1B9}.Release|x86 Setup.ActiveCfg = Release|Win32
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|Win32.ActiveCfg = Release|x64
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64.ActiveCfg = Release|x64
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64.Build.0 = Release|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64 Setup.ActiveCfg = Release|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x64 Setup.Build.0 = Release|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.All|x86 Setup.ActiveCfg = Release|x64
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|Win32.ActiveCfg = Debug|Win32
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|Win32.Build.0 = Debug|Win32
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x64.ActiveCfg = Debug|x64
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x64.Build.0 = Debug|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|Win32.ActiveCfg = Release|Win32
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|Win32.Build.0 = Release|Win32
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x64.ActiveCfg = Release|x64
{CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x64.Build.0 = Release|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x64 Setup.ActiveCfg = Release|x64
+ {CEE544A9-0303-44C2-8ECE-EFA7D7BCBBBA}.Release|x86 Setup.ActiveCfg = Release|Win32
{0D108721-EAE8-4BAF-8102-D8960EC93647}.All|Win32.ActiveCfg = Debug|x64
{0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64.ActiveCfg = Debug|x64
{0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64.Build.0 = Debug|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64 Setup.ActiveCfg = Debug|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x64 Setup.Build.0 = Debug|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.All|x86 Setup.ActiveCfg = Debug|x64
{0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|Win32.ActiveCfg = Debug|Win32
{0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|Win32.Build.0 = Debug|Win32
{0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x64.ActiveCfg = Debug|x64
{0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x64.Build.0 = Debug|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|Win32.ActiveCfg = Release|Win32
{0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|Win32.Build.0 = Release|Win32
{0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x64.ActiveCfg = Release|x64
{0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x64.Build.0 = Release|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x64 Setup.ActiveCfg = Release|x64
+ {0D108721-EAE8-4BAF-8102-D8960EC93647}.Release|x86 Setup.ActiveCfg = Release|Win32
{B535402E-38D2-4D54-8360-423ACBD17192}.All|Win32.ActiveCfg = Release|x64
{B535402E-38D2-4D54-8360-423ACBD17192}.All|x64.ActiveCfg = Release|x64
{B535402E-38D2-4D54-8360-423ACBD17192}.All|x64.Build.0 = Release|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.All|x64 Setup.ActiveCfg = Release|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.All|x64 Setup.Build.0 = Release|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.All|x86 Setup.ActiveCfg = Release|x64
{B535402E-38D2-4D54-8360-423ACBD17192}.Debug|Win32.ActiveCfg = Debug|Win32
{B535402E-38D2-4D54-8360-423ACBD17192}.Debug|Win32.Build.0 = Debug|Win32
{B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x64.ActiveCfg = Debug|x64
{B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x64.Build.0 = Debug|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{B535402E-38D2-4D54-8360-423ACBD17192}.Release|Win32.ActiveCfg = Release|Win32
{B535402E-38D2-4D54-8360-423ACBD17192}.Release|Win32.Build.0 = Release|Win32
{B535402E-38D2-4D54-8360-423ACBD17192}.Release|x64.ActiveCfg = Release|x64
{B535402E-38D2-4D54-8360-423ACBD17192}.Release|x64.Build.0 = Release|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Release|x64 Setup.ActiveCfg = Release|x64
+ {B535402E-38D2-4D54-8360-423ACBD17192}.Release|x86 Setup.ActiveCfg = Release|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.All|Win32.ActiveCfg = Release|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.All|Win32.Build.0 = Release|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.All|x64.ActiveCfg = Release|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.All|x64.Build.0 = Release|Win32
+ {4F92B672-DADB-4047-8D6A-4BB3796733FD}.All|x64 Setup.ActiveCfg = Release|Win32
+ {4F92B672-DADB-4047-8D6A-4BB3796733FD}.All|x64 Setup.Build.0 = Release|Win32
+ {4F92B672-DADB-4047-8D6A-4BB3796733FD}.All|x86 Setup.ActiveCfg = Release|Win32
+ {4F92B672-DADB-4047-8D6A-4BB3796733FD}.All|x86 Setup.Build.0 = Release|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.Debug|Win32.ActiveCfg = Debug|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.Debug|Win32.Build.0 = Debug|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.Debug|x64.ActiveCfg = Debug|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.Debug|x64.Build.0 = Debug|Win32
+ {4F92B672-DADB-4047-8D6A-4BB3796733FD}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {4F92B672-DADB-4047-8D6A-4BB3796733FD}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.Release|Win32.ActiveCfg = Release|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.Release|Win32.Build.0 = Release|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.Release|x64.ActiveCfg = Release|Win32
{4F92B672-DADB-4047-8D6A-4BB3796733FD}.Release|x64.Build.0 = Release|Win32
+ {4F92B672-DADB-4047-8D6A-4BB3796733FD}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {4F92B672-DADB-4047-8D6A-4BB3796733FD}.Release|x86 Setup.ActiveCfg = Release|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.All|Win32.ActiveCfg = Release|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.All|Win32.Build.0 = Release|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.All|x64.ActiveCfg = Release|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.All|x64.Build.0 = Release|Win32
+ {2DEE4895-1134-439C-B688-52203E57D878}.All|x64 Setup.ActiveCfg = Release|Win32
+ {2DEE4895-1134-439C-B688-52203E57D878}.All|x64 Setup.Build.0 = Release|Win32
+ {2DEE4895-1134-439C-B688-52203E57D878}.All|x86 Setup.ActiveCfg = Release|Win32
+ {2DEE4895-1134-439C-B688-52203E57D878}.All|x86 Setup.Build.0 = Release|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.Debug|Win32.ActiveCfg = Debug|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.Debug|Win32.Build.0 = Debug|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.Debug|x64.ActiveCfg = Debug|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.Debug|x64.Build.0 = Debug|Win32
+ {2DEE4895-1134-439C-B688-52203E57D878}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {2DEE4895-1134-439C-B688-52203E57D878}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.Release|Win32.ActiveCfg = Release|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.Release|Win32.Build.0 = Release|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.Release|x64.ActiveCfg = Release|Win32
{2DEE4895-1134-439C-B688-52203E57D878}.Release|x64.Build.0 = Release|Win32
+ {2DEE4895-1134-439C-B688-52203E57D878}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {2DEE4895-1134-439C-B688-52203E57D878}.Release|x86 Setup.ActiveCfg = Release|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.All|Win32.ActiveCfg = Release|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.All|Win32.Build.0 = Release|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.All|x64.ActiveCfg = Release|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.All|x64.Build.0 = Release|Win32
+ {AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.All|x64 Setup.ActiveCfg = Release|Win32
+ {AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.All|x64 Setup.Build.0 = Release|Win32
+ {AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.All|x86 Setup.ActiveCfg = Release|Win32
+ {AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.All|x86 Setup.Build.0 = Release|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Debug|Win32.ActiveCfg = Debug|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Debug|Win32.Build.0 = Debug|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Debug|x64.ActiveCfg = Debug|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Debug|x64.Build.0 = Debug|Win32
+ {AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Release|Win32.ActiveCfg = Release|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Release|Win32.Build.0 = Release|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Release|x64.ActiveCfg = Release|Win32
{AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Release|x64.Build.0 = Release|Win32
+ {AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {AF8163EE-FA76-4904-A11D-7D70A1B5BA2E}.Release|x86 Setup.ActiveCfg = Release|Win32
{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|Win32.ActiveCfg = Debug|x64
{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64.ActiveCfg = Debug|x64
{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64.Build.0 = Debug|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64 Setup.ActiveCfg = Debug|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x64 Setup.Build.0 = Debug|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.All|x86 Setup.ActiveCfg = Debug|x64
{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|Win32.ActiveCfg = Debug|Win32
{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|Win32.Build.0 = Debug|Win32
{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x64.ActiveCfg = Debug|x64
{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x64.Build.0 = Debug|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|Win32.ActiveCfg = Release|Win32
{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|Win32.Build.0 = Release|Win32
{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x64.ActiveCfg = Release|x64
{2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x64.Build.0 = Release|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x64 Setup.ActiveCfg = Release|x64
+ {2F025EAD-99BD-40F5-B2CC-F0A28CAD7F2D}.Release|x86 Setup.ActiveCfg = Release|Win32
{94001A0E-A837-445C-8004-F918F10D0226}.All|Win32.ActiveCfg = Debug|x64
{94001A0E-A837-445C-8004-F918F10D0226}.All|x64.ActiveCfg = Debug|x64
{94001A0E-A837-445C-8004-F918F10D0226}.All|x64.Build.0 = Debug|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.All|x64 Setup.ActiveCfg = Debug|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.All|x64 Setup.Build.0 = Debug|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.All|x86 Setup.ActiveCfg = Debug|x64
{94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.ActiveCfg = Debug|Win32
{94001A0E-A837-445C-8004-F918F10D0226}.Debug|Win32.Build.0 = Debug|Win32
{94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.ActiveCfg = Debug|x64
{94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64.Build.0 = Debug|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.ActiveCfg = Release|Win32
{94001A0E-A837-445C-8004-F918F10D0226}.Release|Win32.Build.0 = Release|Win32
{94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.ActiveCfg = Release|x64
{94001A0E-A837-445C-8004-F918F10D0226}.Release|x64.Build.0 = Release|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.Release|x64 Setup.ActiveCfg = Release|x64
+ {94001A0E-A837-445C-8004-F918F10D0226}.Release|x86 Setup.ActiveCfg = Release|Win32
{2286DA73-9FC5-45BC-A508-85994C3317AB}.All|Win32.ActiveCfg = Release|x64
{2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64.ActiveCfg = Release|x64
{2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64.Build.0 = Release|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64 Setup.ActiveCfg = Release|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x64 Setup.Build.0 = Release|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.All|x86 Setup.ActiveCfg = Release|x64
{2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|Win32.ActiveCfg = Debug|Win32
{2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|Win32.Build.0 = Debug|Win32
{2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x64.ActiveCfg = Debug|x64
{2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x64.Build.0 = Debug|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|Win32.ActiveCfg = Release|Win32
{2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|Win32.Build.0 = Release|Win32
{2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x64.ActiveCfg = Release|x64
{2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x64.Build.0 = Release|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x64 Setup.ActiveCfg = Release|x64
+ {2286DA73-9FC5-45BC-A508-85994C3317AB}.Release|x86 Setup.ActiveCfg = Release|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.All|Win32.ActiveCfg = Release|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.All|Win32.Build.0 = Release|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.All|x64.ActiveCfg = Release|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.All|x64.Build.0 = Release|Win32
+ {3CE1DC99-8246-4DB1-A709-74F19F08EC67}.All|x64 Setup.ActiveCfg = Release|Win32
+ {3CE1DC99-8246-4DB1-A709-74F19F08EC67}.All|x64 Setup.Build.0 = Release|Win32
+ {3CE1DC99-8246-4DB1-A709-74F19F08EC67}.All|x86 Setup.ActiveCfg = Release|Win32
+ {3CE1DC99-8246-4DB1-A709-74F19F08EC67}.All|x86 Setup.Build.0 = Release|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Debug|Win32.ActiveCfg = Debug|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Debug|Win32.Build.0 = Debug|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Debug|x64.ActiveCfg = Debug|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Debug|x64.Build.0 = Debug|Win32
+ {3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Release|Win32.ActiveCfg = Release|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Release|Win32.Build.0 = Release|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Release|x64.ActiveCfg = Release|Win32
{3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Release|x64.Build.0 = Release|Win32
+ {3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {3CE1DC99-8246-4DB1-A709-74F19F08EC67}.Release|x86 Setup.ActiveCfg = Release|Win32
{87A1FE3D-F410-4C8E-9591-8C625985BC70}.All|Win32.ActiveCfg = Release|Win32
{87A1FE3D-F410-4C8E-9591-8C625985BC70}.All|x64.ActiveCfg = Release|Win32
+ {87A1FE3D-F410-4C8E-9591-8C625985BC70}.All|x64 Setup.ActiveCfg = Release|Win32
+ {87A1FE3D-F410-4C8E-9591-8C625985BC70}.All|x86 Setup.ActiveCfg = Release|Win32
{87A1FE3D-F410-4C8E-9591-8C625985BC70}.Debug|Win32.ActiveCfg = Debug|Win32
{87A1FE3D-F410-4C8E-9591-8C625985BC70}.Debug|x64.ActiveCfg = Debug|Win32
+ {87A1FE3D-F410-4C8E-9591-8C625985BC70}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {87A1FE3D-F410-4C8E-9591-8C625985BC70}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{87A1FE3D-F410-4C8E-9591-8C625985BC70}.Release|Win32.ActiveCfg = Release|Win32
{87A1FE3D-F410-4C8E-9591-8C625985BC70}.Release|x64.ActiveCfg = Release|Win32
+ {87A1FE3D-F410-4C8E-9591-8C625985BC70}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {87A1FE3D-F410-4C8E-9591-8C625985BC70}.Release|x86 Setup.ActiveCfg = Release|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|Win32.ActiveCfg = Release|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|Win32.Build.0 = Release|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64.ActiveCfg = Release|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64.Build.0 = Release|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64 Setup.ActiveCfg = Release|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x64 Setup.Build.0 = Release|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x86 Setup.ActiveCfg = Release|Win32
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.All|x86 Setup.Build.0 = Release|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.ActiveCfg = Debug|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|Win32.Build.0 = Debug|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.ActiveCfg = Debug|x64
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64.Build.0 = Debug|x64
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.ActiveCfg = Release|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|Win32.Build.0 = Release|Win32
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.ActiveCfg = Release|x64
{7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64.Build.0 = Release|x64
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x64 Setup.ActiveCfg = Release|x64
+ {7A8D8174-B355-4114-AFC1-04777CB9DE0A}.Release|x86 Setup.ActiveCfg = Release|Win32
{7EB71250-F002-4ED8-92CA-CA218114537A}.All|Win32.ActiveCfg = Release|Win32
{7EB71250-F002-4ED8-92CA-CA218114537A}.All|x64.ActiveCfg = Release|Win32
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.All|x64 Setup.ActiveCfg = Release|Win32
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.All|x86 Setup.ActiveCfg = Release|Win32
{7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|Win32.ActiveCfg = Debug|Win32
{7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x64.ActiveCfg = Debug|x64
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{7EB71250-F002-4ED8-92CA-CA218114537A}.Release|Win32.ActiveCfg = Release|Win32
{7EB71250-F002-4ED8-92CA-CA218114537A}.Release|x64.ActiveCfg = Release|x64
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|x64 Setup.ActiveCfg = Release|x64
+ {7EB71250-F002-4ED8-92CA-CA218114537A}.Release|x86 Setup.ActiveCfg = Release|Win32
{6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.All|Win32.ActiveCfg = Release|Win32
{6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.All|x64.ActiveCfg = Release|Win32
+ {6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.All|x64 Setup.ActiveCfg = Release|Win32
+ {6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.All|x86 Setup.ActiveCfg = Release|Win32
{6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.Debug|Win32.ActiveCfg = Debug|Win32
{6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.Debug|x64.ActiveCfg = Debug|Win32
+ {6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.Release|Win32.ActiveCfg = Release|Win32
{6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.Release|x64.ActiveCfg = Release|Win32
+ {6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {6E49F6C2-ADDA-4BFB-81FE-AB9AF51B455F}.Release|x86 Setup.ActiveCfg = Release|Win32
{464AAB78-5489-4916-BE51-BF8D61822311}.All|Win32.ActiveCfg = Release|Win32
{464AAB78-5489-4916-BE51-BF8D61822311}.All|x64.ActiveCfg = Release|Win32
+ {464AAB78-5489-4916-BE51-BF8D61822311}.All|x64 Setup.ActiveCfg = Release|Win32
+ {464AAB78-5489-4916-BE51-BF8D61822311}.All|x86 Setup.ActiveCfg = Release|Win32
{464AAB78-5489-4916-BE51-BF8D61822311}.Debug|Win32.ActiveCfg = Debug|Win32
{464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x64.ActiveCfg = Debug|x64
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{464AAB78-5489-4916-BE51-BF8D61822311}.Release|Win32.ActiveCfg = Release|Win32
{464AAB78-5489-4916-BE51-BF8D61822311}.Release|x64.ActiveCfg = Release|x64
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Release|x64 Setup.ActiveCfg = Release|x64
+ {464AAB78-5489-4916-BE51-BF8D61822311}.Release|x86 Setup.ActiveCfg = Release|Win32
{0AD1177E-1FD8-4643-9391-431467A11084}.All|Win32.ActiveCfg = Release|x64
{0AD1177E-1FD8-4643-9391-431467A11084}.All|x64.ActiveCfg = Release|x64
{0AD1177E-1FD8-4643-9391-431467A11084}.All|x64.Build.0 = Release|x64
+ {0AD1177E-1FD8-4643-9391-431467A11084}.All|x64 Setup.ActiveCfg = Release|x64
+ {0AD1177E-1FD8-4643-9391-431467A11084}.All|x64 Setup.Build.0 = Release|x64
+ {0AD1177E-1FD8-4643-9391-431467A11084}.All|x86 Setup.ActiveCfg = Release|x64
{0AD1177E-1FD8-4643-9391-431467A11084}.Debug|Win32.ActiveCfg = Debug|Win32
{0AD1177E-1FD8-4643-9391-431467A11084}.Debug|Win32.Build.0 = Debug|Win32
{0AD1177E-1FD8-4643-9391-431467A11084}.Debug|x64.ActiveCfg = Debug|x64
{0AD1177E-1FD8-4643-9391-431467A11084}.Debug|x64.Build.0 = Debug|x64
+ {0AD1177E-1FD8-4643-9391-431467A11084}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {0AD1177E-1FD8-4643-9391-431467A11084}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{0AD1177E-1FD8-4643-9391-431467A11084}.Release|Win32.ActiveCfg = Release|Win32
{0AD1177E-1FD8-4643-9391-431467A11084}.Release|Win32.Build.0 = Release|Win32
{0AD1177E-1FD8-4643-9391-431467A11084}.Release|x64.ActiveCfg = Release|x64
{0AD1177E-1FD8-4643-9391-431467A11084}.Release|x64.Build.0 = Release|x64
+ {0AD1177E-1FD8-4643-9391-431467A11084}.Release|x64 Setup.ActiveCfg = Release|x64
+ {0AD1177E-1FD8-4643-9391-431467A11084}.Release|x86 Setup.ActiveCfg = Release|Win32
{66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|Win32.ActiveCfg = Release Static|x64
{66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64.ActiveCfg = Release Static|x64
{66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64.Build.0 = Release Static|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64 Setup.ActiveCfg = Release Static|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x64 Setup.Build.0 = Release Static|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.All|x86 Setup.ActiveCfg = Release Static|x64
{66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|Win32.ActiveCfg = Debug|Win32
{66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|x64.ActiveCfg = Debug|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|Win32.ActiveCfg = Release|Win32
{66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|x64.ActiveCfg = Release|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|x64 Setup.ActiveCfg = Release|x64
+ {66444AEE-554C-11DD-A9F0-8C5D56D89593}.Release|x86 Setup.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.All|Win32.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.All|Win32.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.All|x64.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.All|x64.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.All|x64 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.All|x64 Setup.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.All|x86 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.All|x86 Setup.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Debug|Win32.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Debug|Win32.Build.0 = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Debug|x64.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Debug|x64.Build.0 = Debug|Win32
+ {D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Release|Win32.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Release|Win32.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Release|x64.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Release|x64.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82FDD086DB1B}.Release|x86 Setup.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.All|Win32.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.All|Win32.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.All|x64.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.All|x64.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.All|x64 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.All|x64 Setup.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.All|x86 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.All|x86 Setup.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Debug|Win32.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Debug|Win32.Build.0 = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Debug|x64.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Debug|x64.Build.0 = Debug|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Release|Win32.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Release|Win32.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Release|x64.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Release|x64.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB2086DB1B}.Release|x86 Setup.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.All|Win32.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.All|Win32.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.All|x64.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.All|x64.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.All|x64 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.All|x64 Setup.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.All|x86 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.All|x86 Setup.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Debug|Win32.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Debug|Win32.Build.0 = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Debug|x64.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Debug|x64.Build.0 = Debug|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Release|Win32.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Release|Win32.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Release|x64.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Release|x64.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB3086DB1B}.Release|x86 Setup.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.All|Win32.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.All|Win32.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.All|x64.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.All|x64.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.All|x64 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.All|x64 Setup.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.All|x86 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.All|x86 Setup.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Debug|Win32.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Debug|Win32.Build.0 = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Debug|x64.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Debug|x64.Build.0 = Debug|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Release|Win32.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Release|Win32.Build.0 = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Release|x64.ActiveCfg = Release|Win32
{D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Release|x64.Build.0 = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {D5D2BF72-29FE-4982-A9FA-82AB1086DB1B}.Release|x86 Setup.ActiveCfg = Release|Win32
{E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|Win32.ActiveCfg = Debug|x64
{E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64.ActiveCfg = Debug|x64
{E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64.Build.0 = Debug|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64 Setup.ActiveCfg = Debug|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x64 Setup.Build.0 = Debug|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.All|x86 Setup.ActiveCfg = Debug|x64
{E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|Win32.ActiveCfg = Debug|Win32
{E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|Win32.Build.0 = Debug|Win32
{E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x64.ActiveCfg = Debug|x64
{E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x64.Build.0 = Debug|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|Win32.ActiveCfg = Release|Win32
{E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|Win32.Build.0 = Release|Win32
{E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x64.ActiveCfg = Release|x64
{E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x64.Build.0 = Release|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x64 Setup.ActiveCfg = Release|x64
+ {E316772F-5D8F-4F2A-8F71-094C3E859D34}.Release|x86 Setup.ActiveCfg = Release|Win32
{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|Win32.ActiveCfg = Debug|x64
{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64.ActiveCfg = Debug|x64
{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64.Build.0 = Debug|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64 Setup.ActiveCfg = Debug|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x64 Setup.Build.0 = Debug|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.All|x86 Setup.ActiveCfg = Debug|x64
{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|Win32.ActiveCfg = Debug|Win32
{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|Win32.Build.0 = Debug|Win32
{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x64.ActiveCfg = Debug|x64
{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x64.Build.0 = Debug|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|Win32.ActiveCfg = Release|Win32
{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|Win32.Build.0 = Release|Win32
{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x64.ActiveCfg = Release|x64
{D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x64.Build.0 = Release|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x64 Setup.ActiveCfg = Release|x64
+ {D3D8B329-20BE-475E-9E83-653CEA0E0EF5}.Release|x86 Setup.ActiveCfg = Release|Win32
{38FE0559-9910-43A8-9E45-3E5004C27692}.All|Win32.ActiveCfg = Release|x64
{38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64.ActiveCfg = Release|x64
{38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64.Build.0 = Release|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64 Setup.ActiveCfg = Release|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.All|x64 Setup.Build.0 = Release|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.All|x86 Setup.ActiveCfg = Release|x64
{38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|Win32.ActiveCfg = Debug|Win32
{38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|Win32.Build.0 = Debug|Win32
{38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x64.ActiveCfg = Debug|x64
{38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x64.Build.0 = Debug|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{38FE0559-9910-43A8-9E45-3E5004C27692}.Release|Win32.ActiveCfg = Release|Win32
{38FE0559-9910-43A8-9E45-3E5004C27692}.Release|Win32.Build.0 = Release|Win32
{38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x64.ActiveCfg = Release|x64
{38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x64.Build.0 = Release|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x64 Setup.ActiveCfg = Release|x64
+ {38FE0559-9910-43A8-9E45-3E5004C27692}.Release|x86 Setup.ActiveCfg = Release|Win32
{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|Win32.ActiveCfg = Debug|x64
{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64.ActiveCfg = Debug|x64
{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64.Build.0 = Debug|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64 Setup.ActiveCfg = Debug|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x64 Setup.Build.0 = Debug|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.All|x86 Setup.ActiveCfg = Debug|x64
{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|Win32.ActiveCfg = Debug|Win32
{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|Win32.Build.0 = Debug|Win32
{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x64.ActiveCfg = Debug|x64
{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x64.Build.0 = Debug|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|Win32.ActiveCfg = Release|Win32
{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|Win32.Build.0 = Release|Win32
{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x64.ActiveCfg = Release|x64
{0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x64.Build.0 = Release|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x64 Setup.ActiveCfg = Release|x64
+ {0FEEAEC6-4399-4C46-B7DB-62ECE80D15B4}.Release|x86 Setup.ActiveCfg = Release|Win32
{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|Win32.ActiveCfg = Release|x64
{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64.ActiveCfg = Release|x64
{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64.Build.0 = Release|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64 Setup.ActiveCfg = Release|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x64 Setup.Build.0 = Release|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.All|x86 Setup.ActiveCfg = Release|x64
{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|Win32.ActiveCfg = Debug|Win32
{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|Win32.Build.0 = Debug|Win32
{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x64.ActiveCfg = Debug|x64
{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x64.Build.0 = Debug|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|Win32.ActiveCfg = Release|Win32
{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|Win32.Build.0 = Release|Win32
{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x64.ActiveCfg = Release|x64
{2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x64.Build.0 = Release|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x64 Setup.ActiveCfg = Release|x64
+ {2A3D00C6-588D-4E86-81AC-9EF5EDE86E03}.Release|x86 Setup.ActiveCfg = Release|Win32
{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|Win32.ActiveCfg = Release|x64
{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64.ActiveCfg = Release|x64
{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64.Build.0 = Release|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64 Setup.ActiveCfg = Release|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x64 Setup.Build.0 = Release|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.All|x86 Setup.ActiveCfg = Release|x64
{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|Win32.ActiveCfg = Debug|Win32
{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|Win32.Build.0 = Debug|Win32
{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x64.ActiveCfg = Debug|x64
{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x64.Build.0 = Debug|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|Win32.ActiveCfg = Release|Win32
{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|Win32.Build.0 = Release|Win32
{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x64.ActiveCfg = Release|x64
{B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x64.Build.0 = Release|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x64 Setup.ActiveCfg = Release|x64
+ {B6A9FB7A-1CC4-442B-812D-EC33E4E4A36E}.Release|x86 Setup.ActiveCfg = Release|Win32
{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|Win32.ActiveCfg = Release_Mono|x64
{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64.ActiveCfg = Release_Mono|x64
{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64.Build.0 = Release_Mono|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64 Setup.ActiveCfg = Release_Mono|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x64 Setup.Build.0 = Release_Mono|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.All|x86 Setup.ActiveCfg = Release_Mono|x64
{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|Win32.ActiveCfg = Debug_CLR|Win32
{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|Win32.Build.0 = Debug_CLR|Win32
{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x64.ActiveCfg = Debug_CLR|x64
{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x64.Build.0 = Debug_CLR|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x64 Setup.ActiveCfg = Debug_CLR|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Debug|x86 Setup.ActiveCfg = Debug_CLR|Win32
{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|Win32.ActiveCfg = Release_CLR|Win32
{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|Win32.Build.0 = Release_CLR|Win32
{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x64.ActiveCfg = Release_CLR|x64
{7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x64.Build.0 = Release_CLR|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x64 Setup.ActiveCfg = Release_CLR|x64
+ {7B42BDA1-72C0-4378-A9B6-5C530F8CD61E}.Release|x86 Setup.ActiveCfg = Release_CLR|Win32
{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|Win32.ActiveCfg = Release|Any CPU
{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|x64.ActiveCfg = Release|Any CPU
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|x64 Setup.ActiveCfg = Release|Any CPU
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.All|x86 Setup.ActiveCfg = Release|Any CPU
{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|Win32.ActiveCfg = Debug|Any CPU
{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|Win32.Build.0 = Debug|Any CPU
{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x64.ActiveCfg = Debug|x64
{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x64.Build.0 = Debug|x64
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Debug|x86 Setup.ActiveCfg = Debug|Any CPU
{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|Win32.ActiveCfg = Release|Any CPU
{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|Win32.Build.0 = Release|Any CPU
{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x64.ActiveCfg = Release|x64
{834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x64.Build.0 = Release|x64
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x64 Setup.ActiveCfg = Release|x64
+ {834E2B2F-5483-4B80-8FE3-FE48FF76E5C0}.Release|x86 Setup.ActiveCfg = Release|Any CPU
{E796E337-DE78-4303-8614-9A590862EE95}.All|Win32.ActiveCfg = Release|Win32
{E796E337-DE78-4303-8614-9A590862EE95}.All|Win32.Build.0 = Release|Win32
{E796E337-DE78-4303-8614-9A590862EE95}.All|x64.ActiveCfg = Release|Win32
{E796E337-DE78-4303-8614-9A590862EE95}.All|x64.Build.0 = Release|Win32
+ {E796E337-DE78-4303-8614-9A590862EE95}.All|x64 Setup.ActiveCfg = Release|Win32
+ {E796E337-DE78-4303-8614-9A590862EE95}.All|x64 Setup.Build.0 = Release|Win32
+ {E796E337-DE78-4303-8614-9A590862EE95}.All|x86 Setup.ActiveCfg = Release|Win32
+ {E796E337-DE78-4303-8614-9A590862EE95}.All|x86 Setup.Build.0 = Release|Win32
{E796E337-DE78-4303-8614-9A590862EE95}.Debug|Win32.ActiveCfg = Debug|Win32
{E796E337-DE78-4303-8614-9A590862EE95}.Debug|Win32.Build.0 = Debug|Win32
{E796E337-DE78-4303-8614-9A590862EE95}.Debug|x64.ActiveCfg = Debug|Win32
{E796E337-DE78-4303-8614-9A590862EE95}.Debug|x64.Build.0 = Debug|Win32
+ {E796E337-DE78-4303-8614-9A590862EE95}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {E796E337-DE78-4303-8614-9A590862EE95}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{E796E337-DE78-4303-8614-9A590862EE95}.Release|Win32.ActiveCfg = Release|Win32
{E796E337-DE78-4303-8614-9A590862EE95}.Release|Win32.Build.0 = Release|Win32
{E796E337-DE78-4303-8614-9A590862EE95}.Release|x64.ActiveCfg = Release|Win32
{E796E337-DE78-4303-8614-9A590862EE95}.Release|x64.Build.0 = Release|Win32
+ {E796E337-DE78-4303-8614-9A590862EE95}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {E796E337-DE78-4303-8614-9A590862EE95}.Release|x86 Setup.ActiveCfg = Release|Win32
{419C8F80-D858-4B48-A25C-AF4007608137}.All|Win32.ActiveCfg = Release|x64
{419C8F80-D858-4B48-A25C-AF4007608137}.All|x64.ActiveCfg = Release|x64
{419C8F80-D858-4B48-A25C-AF4007608137}.All|x64.Build.0 = Release|x64
+ {419C8F80-D858-4B48-A25C-AF4007608137}.All|x64 Setup.ActiveCfg = Release|x64
+ {419C8F80-D858-4B48-A25C-AF4007608137}.All|x64 Setup.Build.0 = Release|x64
+ {419C8F80-D858-4B48-A25C-AF4007608137}.All|x86 Setup.ActiveCfg = Release|x64
{419C8F80-D858-4B48-A25C-AF4007608137}.Debug|Win32.ActiveCfg = Debug|Win32
{419C8F80-D858-4B48-A25C-AF4007608137}.Debug|Win32.Build.0 = Debug|Win32
{419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x64.ActiveCfg = Debug|x64
{419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x64.Build.0 = Debug|x64
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{419C8F80-D858-4B48-A25C-AF4007608137}.Release|Win32.ActiveCfg = Release|Win32
{419C8F80-D858-4B48-A25C-AF4007608137}.Release|Win32.Build.0 = Release|Win32
{419C8F80-D858-4B48-A25C-AF4007608137}.Release|x64.ActiveCfg = Release|x64
{419C8F80-D858-4B48-A25C-AF4007608137}.Release|x64.Build.0 = Release|x64
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Release|x64 Setup.ActiveCfg = Release|x64
+ {419C8F80-D858-4B48-A25C-AF4007608137}.Release|x86 Setup.ActiveCfg = Release|Win32
{B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|Win32.ActiveCfg = Release|x64
{B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64.ActiveCfg = Release|x64
{B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64.Build.0 = Release|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64 Setup.ActiveCfg = Release|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x64 Setup.Build.0 = Release|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.All|x86 Setup.ActiveCfg = Release|x64
{B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|Win32.ActiveCfg = Debug|Win32
{B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|Win32.Build.0 = Debug|Win32
{B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x64.ActiveCfg = Debug|x64
{B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x64.Build.0 = Debug|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.ActiveCfg = Release|Win32
{B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|Win32.Build.0 = Release|Win32
{B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64.ActiveCfg = Release|x64
{B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64.Build.0 = Release|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x64 Setup.ActiveCfg = Release|x64
+ {B3F424EC-3D8F-417C-B244-3919D5E1A577}.Release|x86 Setup.ActiveCfg = Release|Win32
{14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|Win32.ActiveCfg = Release|x64
{14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64.ActiveCfg = Release|x64
{14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64.Build.0 = Release|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64 Setup.ActiveCfg = Release|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x64 Setup.Build.0 = Release|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.All|x86 Setup.ActiveCfg = Release|x64
{14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.ActiveCfg = Debug|Win32
{14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|Win32.Build.0 = Debug|Win32
{14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64.ActiveCfg = Debug|x64
{14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64.Build.0 = Debug|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.ActiveCfg = Release|Win32
{14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|Win32.Build.0 = Release|Win32
{14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64.ActiveCfg = Release|x64
{14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64.Build.0 = Release|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x64 Setup.ActiveCfg = Release|x64
+ {14E4A972-9CFB-436D-B0A5-4943F3F80D47}.Release|x86 Setup.ActiveCfg = Release|Win32
{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|Win32.ActiveCfg = Release|x64
{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64.ActiveCfg = Release|x64
{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64.Build.0 = Release|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64 Setup.ActiveCfg = Release|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x64 Setup.Build.0 = Release|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.All|x86 Setup.ActiveCfg = Release|x64
{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|Win32.ActiveCfg = Debug|Win32
{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|Win32.Build.0 = Debug|Win32
{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x64.ActiveCfg = Debug|x64
{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x64.Build.0 = Debug|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|Win32.ActiveCfg = Release|Win32
{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|Win32.Build.0 = Release|Win32
{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x64.ActiveCfg = Release|x64
{1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x64.Build.0 = Release|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x64 Setup.ActiveCfg = Release|x64
+ {1BC8A8EC-E03B-44DF-BCD9-088650F4D29C}.Release|x86 Setup.ActiveCfg = Release|Win32
{0B6C905B-142E-4999-B39D-92FF7951E921}.All|Win32.ActiveCfg = Release|x64
{0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64.ActiveCfg = Release|x64
{0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64.Build.0 = Release|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64 Setup.ActiveCfg = Release|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.All|x64 Setup.Build.0 = Release|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.All|x86 Setup.ActiveCfg = Release|x64
{0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|Win32.ActiveCfg = Debug|Win32
{0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|Win32.Build.0 = Debug|Win32
{0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x64.ActiveCfg = Debug|x64
{0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x64.Build.0 = Debug|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{0B6C905B-142E-4999-B39D-92FF7951E921}.Release|Win32.ActiveCfg = Release|Win32
{0B6C905B-142E-4999-B39D-92FF7951E921}.Release|Win32.Build.0 = Release|Win32
{0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x64.ActiveCfg = Release|x64
{0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x64.Build.0 = Release|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x64 Setup.ActiveCfg = Release|x64
+ {0B6C905B-142E-4999-B39D-92FF7951E921}.Release|x86 Setup.ActiveCfg = Release|Win32
{CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|Win32.ActiveCfg = Release|x64
{CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64.ActiveCfg = Release|x64
{CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64.Build.0 = Release|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64 Setup.ActiveCfg = Release|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x64 Setup.Build.0 = Release|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.All|x86 Setup.ActiveCfg = Release|x64
{CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|Win32.ActiveCfg = Debug|Win32
{CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|Win32.Build.0 = Debug|Win32
{CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x64.ActiveCfg = Debug|x64
{CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x64.Build.0 = Debug|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|Win32.ActiveCfg = Release|Win32
{CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|Win32.Build.0 = Release|Win32
{CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x64.ActiveCfg = Release|x64
{CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x64.Build.0 = Release|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x64 Setup.ActiveCfg = Release|x64
+ {CF405366-9558-4AE8-90EF-5E21B51CCB4E}.Release|x86 Setup.ActiveCfg = Release|Win32
{D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|Win32.ActiveCfg = Release|x64
{D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64.ActiveCfg = Release|x64
{D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64.Build.0 = Release|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64 Setup.ActiveCfg = Release|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x64 Setup.Build.0 = Release|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.All|x86 Setup.ActiveCfg = Release|x64
{D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|Win32.ActiveCfg = Debug|Win32
{D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|Win32.Build.0 = Debug|Win32
{D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x64.ActiveCfg = Debug|x64
{D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x64.Build.0 = Debug|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|Win32.ActiveCfg = Release|Win32
{D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|Win32.Build.0 = Release|Win32
{D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x64.ActiveCfg = Release|x64
{D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x64.Build.0 = Release|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x64 Setup.ActiveCfg = Release|x64
+ {D2FB8043-D208-4AEE-8F18-3B5857C871B9}.Release|x86 Setup.ActiveCfg = Release|Win32
{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|Win32.ActiveCfg = Release|x64
{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64.ActiveCfg = Release|x64
{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64.Build.0 = Release|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64 Setup.ActiveCfg = Release|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x64 Setup.Build.0 = Release|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.All|x86 Setup.ActiveCfg = Release|x64
{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|Win32.ActiveCfg = Debug|Win32
{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|Win32.Build.0 = Debug|Win32
{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x64.ActiveCfg = Debug|x64
{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x64.Build.0 = Debug|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|Win32.ActiveCfg = Release|Win32
{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|Win32.Build.0 = Release|Win32
{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x64.ActiveCfg = Release|x64
{329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x64.Build.0 = Release|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x64 Setup.ActiveCfg = Release|x64
+ {329FD5B0-EF28-4606-86D0-F6EA21CF8E36}.Release|x86 Setup.ActiveCfg = Release|Win32
{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|Win32.ActiveCfg = Release|x64
{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64.ActiveCfg = Release|x64
{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64.Build.0 = Release|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64 Setup.ActiveCfg = Release|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x64 Setup.Build.0 = Release|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.All|x86 Setup.ActiveCfg = Release|x64
{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|Win32.ActiveCfg = Debug|Win32
{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|Win32.Build.0 = Debug|Win32
{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x64.ActiveCfg = Debug|x64
{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x64.Build.0 = Debug|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|Win32.ActiveCfg = Release|Win32
{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|Win32.Build.0 = Release|Win32
{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x64.ActiveCfg = Release|x64
{1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x64.Build.0 = Release|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x64 Setup.ActiveCfg = Release|x64
+ {1A3793D1-05D1-4B57-9B0F-5AF3E79DC439}.Release|x86 Setup.ActiveCfg = Release|Win32
{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|Win32.ActiveCfg = Release|x64
{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.ActiveCfg = Release|x64
{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64.Build.0 = Release|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64 Setup.ActiveCfg = Release|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x64 Setup.Build.0 = Release|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.All|x86 Setup.ActiveCfg = Release|x64
{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.ActiveCfg = Debug|Win32
{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|Win32.Build.0 = Debug|Win32
{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.ActiveCfg = Debug|x64
{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64.Build.0 = Debug|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.ActiveCfg = Release|Win32
{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|Win32.Build.0 = Release|Win32
{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.ActiveCfg = Release|x64
{401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64.Build.0 = Release|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x64 Setup.ActiveCfg = Release|x64
+ {401A40CD-5DB4-4E34-AC68-FA99E9FAC014}.Release|x86 Setup.ActiveCfg = Release|Win32
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|Win32.ActiveCfg = Release|x64
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.ActiveCfg = Release|x64
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64.Build.0 = Release|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64 Setup.ActiveCfg = Release|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x64 Setup.Build.0 = Release|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.All|x86 Setup.ActiveCfg = Release|x64
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.ActiveCfg = Debug|Win32
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|Win32.Build.0 = Debug|Win32
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.ActiveCfg = Debug|x64
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64.Build.0 = Debug|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.ActiveCfg = Release|Win32
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|Win32.Build.0 = Release|Win32
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.ActiveCfg = Release|x64
{1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64.Build.0 = Release|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x64 Setup.ActiveCfg = Release|x64
+ {1CBB0077-18C5-455F-801C-0A0CE7B0BBF5}.Release|x86 Setup.ActiveCfg = Release|Win32
{E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|Win32.ActiveCfg = Release_WM5_PPC_ARM|x64
{E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64.ActiveCfg = Release_WM5_PPC_ARM|x64
{E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64.Build.0 = Release_WM5_PPC_ARM|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64 Setup.ActiveCfg = Release_WM5_PPC_ARM|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x64 Setup.Build.0 = Release_WM5_PPC_ARM|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.All|x86 Setup.ActiveCfg = Release_WM5_PPC_ARM|x64
{E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32
{E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32
{E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x64.ActiveCfg = Debug|x64
{E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x64.Build.0 = Debug|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32
{E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32
{E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x64.ActiveCfg = Release|x64
{E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x64.Build.0 = Release|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x64 Setup.ActiveCfg = Release|x64
+ {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|x86 Setup.ActiveCfg = Release|Win32
{03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|Win32.ActiveCfg = Release_Static_SSE|x64
{03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64.ActiveCfg = Release_Static_SSE|x64
{03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64.Build.0 = Release_Static_SSE|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64 Setup.ActiveCfg = Release_Static_SSE|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x64 Setup.Build.0 = Release_Static_SSE|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.All|x86 Setup.ActiveCfg = Release_Static_SSE|x64
{03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.ActiveCfg = Debug|Win32
{03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.Build.0 = Debug|Win32
{03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x64.ActiveCfg = Debug|x64
{03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x64.Build.0 = Debug|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.ActiveCfg = Release|Win32
{03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.Build.0 = Release|Win32
{03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x64.ActiveCfg = Release|x64
{03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x64.Build.0 = Release|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x64 Setup.ActiveCfg = Release|x64
+ {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|x86 Setup.ActiveCfg = Release|Win32
{9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|Win32.ActiveCfg = Release|x64
{9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64.ActiveCfg = Release|x64
{9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64.Build.0 = Release|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64 Setup.ActiveCfg = Release|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x64 Setup.Build.0 = Release|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.All|x86 Setup.ActiveCfg = Release|x64
{9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|Win32.ActiveCfg = Debug|Win32
{9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|Win32.Build.0 = Debug|Win32
{9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x64.ActiveCfg = Debug|x64
{9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x64.Build.0 = Debug|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|Win32.ActiveCfg = Release|Win32
{9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|Win32.Build.0 = Release|Win32
{9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x64.ActiveCfg = Release|x64
{9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x64.Build.0 = Release|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x64 Setup.ActiveCfg = Release|x64
+ {9A5DDF08-C88C-4A35-B7F6-D605228446BD}.Release|x86 Setup.ActiveCfg = Release|Win32
{D0B36172-CD76-454A-9B89-990025266C2A}.All|Win32.ActiveCfg = Release|x64
{D0B36172-CD76-454A-9B89-990025266C2A}.All|x64.ActiveCfg = Release|x64
{D0B36172-CD76-454A-9B89-990025266C2A}.All|x64.Build.0 = Release|x64
+ {D0B36172-CD76-454A-9B89-990025266C2A}.All|x64 Setup.ActiveCfg = Release|x64
+ {D0B36172-CD76-454A-9B89-990025266C2A}.All|x64 Setup.Build.0 = Release|x64
+ {D0B36172-CD76-454A-9B89-990025266C2A}.All|x86 Setup.ActiveCfg = Release|x64
{D0B36172-CD76-454A-9B89-990025266C2A}.Debug|Win32.ActiveCfg = Debug|Win32
{D0B36172-CD76-454A-9B89-990025266C2A}.Debug|Win32.Build.0 = Debug|Win32
{D0B36172-CD76-454A-9B89-990025266C2A}.Debug|x64.ActiveCfg = Debug|x64
{D0B36172-CD76-454A-9B89-990025266C2A}.Debug|x64.Build.0 = Debug|x64
+ {D0B36172-CD76-454A-9B89-990025266C2A}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {D0B36172-CD76-454A-9B89-990025266C2A}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D0B36172-CD76-454A-9B89-990025266C2A}.Release|Win32.ActiveCfg = Release|Win32
{D0B36172-CD76-454A-9B89-990025266C2A}.Release|Win32.Build.0 = Release|Win32
{D0B36172-CD76-454A-9B89-990025266C2A}.Release|x64.ActiveCfg = Release|x64
{D0B36172-CD76-454A-9B89-990025266C2A}.Release|x64.Build.0 = Release|x64
+ {D0B36172-CD76-454A-9B89-990025266C2A}.Release|x64 Setup.ActiveCfg = Release|x64
+ {D0B36172-CD76-454A-9B89-990025266C2A}.Release|x86 Setup.ActiveCfg = Release|Win32
{05C9FB27-480E-4D53-B3B7-6338E2526666}.All|Win32.ActiveCfg = Release|Win32
{05C9FB27-480E-4D53-B3B7-6338E2526666}.All|Win32.Build.0 = Release|Win32
{05C9FB27-480E-4D53-B3B7-6338E2526666}.All|x64.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|x64 Setup.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|x86 Setup.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.All|x86 Setup.Build.0 = Release|Win32
{05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|Win32.ActiveCfg = Debug|Win32
{05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|x64.ActiveCfg = Debug|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|Win32.ActiveCfg = Release|Win32
{05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|x64.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-6338E2526666}.Release|x86 Setup.ActiveCfg = Release|Win32
{CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|Win32.ActiveCfg = Release|Win32
{CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|x64.ActiveCfg = Release|Win32
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|x64 Setup.ActiveCfg = Release|Win32
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.All|x86 Setup.ActiveCfg = Release|Win32
{CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|Win32.ActiveCfg = Debug|Win32
{CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|x64.ActiveCfg = Debug|x64
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|Win32.ActiveCfg = Release|Win32
{CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|x64.ActiveCfg = Release|x64
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|x64 Setup.ActiveCfg = Release|x64
+ {CC1DD008-9406-448D-A0AD-33C3186CFADB}.Release|x86 Setup.ActiveCfg = Release|Win32
{DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.ActiveCfg = All|Win32
{DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|Win32.Build.0 = All|Win32
{DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|x64.ActiveCfg = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|x64 Setup.ActiveCfg = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|x86 Setup.ActiveCfg = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.All|x86 Setup.Build.0 = All|Win32
{DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.ActiveCfg = All|Win32
{DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|Win32.Build.0 = All|Win32
{DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64.ActiveCfg = All|Win32
{DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64.Build.0 = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x64 Setup.ActiveCfg = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Debug|x86 Setup.ActiveCfg = All|Win32
{DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|Win32.ActiveCfg = All|Win32
{DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|Win32.Build.0 = All|Win32
{DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64.ActiveCfg = All|Win32
{DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64.Build.0 = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x64 Setup.ActiveCfg = All|Win32
+ {DEE932AB-5911-4700-9EEB-8C7090A0A330}.Release|x86 Setup.ActiveCfg = All|Win32
{329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.ActiveCfg = All|Win32
{329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|Win32.Build.0 = All|Win32
{329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|x64.ActiveCfg = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|x64 Setup.ActiveCfg = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|x86 Setup.ActiveCfg = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.All|x86 Setup.Build.0 = All|Win32
{329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.ActiveCfg = All|Win32
{329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|Win32.Build.0 = All|Win32
{329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64.ActiveCfg = All|Win32
{329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64.Build.0 = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x64 Setup.ActiveCfg = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Debug|x86 Setup.ActiveCfg = All|Win32
{329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|Win32.ActiveCfg = All|Win32
{329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|Win32.Build.0 = All|Win32
{329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64.ActiveCfg = All|Win32
{329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64.Build.0 = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x64 Setup.ActiveCfg = All|Win32
+ {329A6FA0-0FCC-4435-A950-E670AEFA9838}.Release|x86 Setup.ActiveCfg = All|Win32
{11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|Win32.ActiveCfg = Release|x64
{11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64.ActiveCfg = Release|x64
{11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64.Build.0 = Release|x64
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64 Setup.ActiveCfg = Release|x64
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x64 Setup.Build.0 = Release|x64
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.All|x86 Setup.ActiveCfg = Release|x64
{11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|Win32.ActiveCfg = Debug|Win32
{11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|x64.ActiveCfg = Debug|x64
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|Win32.ActiveCfg = Release|Win32
{11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|x64.ActiveCfg = Release|x64
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|x64 Setup.ActiveCfg = Release|x64
+ {11C9BC3D-45E9-46E3-BE84-B8CEE4685E39}.Release|x86 Setup.ActiveCfg = Release|Win32
{C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.All|Win32.ActiveCfg = Release|Win32
{C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.All|Win32.Build.0 = Release|Win32
{C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.All|x64.ActiveCfg = Release|Win32
+ {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.All|x64 Setup.ActiveCfg = Release|Win32
+ {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.All|x86 Setup.ActiveCfg = Release|Win32
+ {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.All|x86 Setup.Build.0 = Release|Win32
{C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Debug|Win32.ActiveCfg = Debug|Win32
{C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Debug|x64.ActiveCfg = Debug|Win32
+ {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Release|Win32.ActiveCfg = Release|Win32
{C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Release|x64.ActiveCfg = Release|Win32
+ {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {C6E78A4C-DB1E-47F4-9B63-4DC27D86343F}.Release|x86 Setup.ActiveCfg = Release|Win32
{1F0A8A77-E661-418F-BB92-82172AE43803}.All|Win32.ActiveCfg = Release|Win32
{1F0A8A77-E661-418F-BB92-82172AE43803}.All|x64.ActiveCfg = Release|Win32
+ {1F0A8A77-E661-418F-BB92-82172AE43803}.All|x64 Setup.ActiveCfg = Release|Win32
+ {1F0A8A77-E661-418F-BB92-82172AE43803}.All|x86 Setup.ActiveCfg = Release|Win32
{1F0A8A77-E661-418F-BB92-82172AE43803}.Debug|Win32.ActiveCfg = Debug|Win32
{1F0A8A77-E661-418F-BB92-82172AE43803}.Debug|x64.ActiveCfg = Debug|Win32
+ {1F0A8A77-E661-418F-BB92-82172AE43803}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {1F0A8A77-E661-418F-BB92-82172AE43803}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1F0A8A77-E661-418F-BB92-82172AE43803}.Release|Win32.ActiveCfg = Release|Win32
{1F0A8A77-E661-418F-BB92-82172AE43803}.Release|x64.ActiveCfg = Release|Win32
+ {1F0A8A77-E661-418F-BB92-82172AE43803}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {1F0A8A77-E661-418F-BB92-82172AE43803}.Release|x86 Setup.ActiveCfg = Release|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.All|Win32.ActiveCfg = Release|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.All|Win32.Build.0 = Release|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.All|x64.ActiveCfg = Release|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.All|x64.Build.0 = Release|Win32
+ {4F5C9D55-98EF-4256-8311-32D7BD360406}.All|x64 Setup.ActiveCfg = Release|Win32
+ {4F5C9D55-98EF-4256-8311-32D7BD360406}.All|x64 Setup.Build.0 = Release|Win32
+ {4F5C9D55-98EF-4256-8311-32D7BD360406}.All|x86 Setup.ActiveCfg = Release|Win32
+ {4F5C9D55-98EF-4256-8311-32D7BD360406}.All|x86 Setup.Build.0 = Release|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.Debug|Win32.ActiveCfg = Debug|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.Debug|Win32.Build.0 = Debug|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.Debug|x64.ActiveCfg = Debug|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.Debug|x64.Build.0 = Debug|Win32
+ {4F5C9D55-98EF-4256-8311-32D7BD360406}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {4F5C9D55-98EF-4256-8311-32D7BD360406}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.Release|Win32.ActiveCfg = Release|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.Release|Win32.Build.0 = Release|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.Release|x64.ActiveCfg = Release|Win32
{4F5C9D55-98EF-4256-8311-32D7BD360406}.Release|x64.Build.0 = Release|Win32
+ {4F5C9D55-98EF-4256-8311-32D7BD360406}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {4F5C9D55-98EF-4256-8311-32D7BD360406}.Release|x86 Setup.ActiveCfg = Release|Win32
{E10571C4-E7F4-4608-B5F2-B22E7EB95400}.All|Win32.ActiveCfg = Release|Win32
{E10571C4-E7F4-4608-B5F2-B22E7EB95400}.All|x64.ActiveCfg = Release|Win32
+ {E10571C4-E7F4-4608-B5F2-B22E7EB95400}.All|x64 Setup.ActiveCfg = Release|Win32
+ {E10571C4-E7F4-4608-B5F2-B22E7EB95400}.All|x86 Setup.ActiveCfg = Release|Win32
{E10571C4-E7F4-4608-B5F2-B22E7EB95400}.Debug|Win32.ActiveCfg = Debug|Win32
{E10571C4-E7F4-4608-B5F2-B22E7EB95400}.Debug|x64.ActiveCfg = Debug|Win32
+ {E10571C4-E7F4-4608-B5F2-B22E7EB95400}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {E10571C4-E7F4-4608-B5F2-B22E7EB95400}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{E10571C4-E7F4-4608-B5F2-B22E7EB95400}.Release|Win32.ActiveCfg = Release|Win32
{E10571C4-E7F4-4608-B5F2-B22E7EB95400}.Release|x64.ActiveCfg = Release|Win32
+ {E10571C4-E7F4-4608-B5F2-B22E7EB95400}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {E10571C4-E7F4-4608-B5F2-B22E7EB95400}.Release|x86 Setup.ActiveCfg = Release|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|Win32.ActiveCfg = Release|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|Win32.Build.0 = Release|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64.ActiveCfg = Release|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64.Build.0 = Release|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64 Setup.ActiveCfg = Release|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x64 Setup.Build.0 = Release|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x86 Setup.ActiveCfg = Release|Win32
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.All|x86 Setup.Build.0 = Release|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.ActiveCfg = Debug|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|Win32.Build.0 = Debug|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.ActiveCfg = Debug|x64
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64.Build.0 = Debug|x64
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.ActiveCfg = Release|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|Win32.Build.0 = Release|Win32
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.ActiveCfg = Release|x64
{D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64.Build.0 = Release|x64
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x64 Setup.ActiveCfg = Release|x64
+ {D1ABE208-6442-4FB4-9AAD-1677E41BC870}.Release|x86 Setup.ActiveCfg = Release|Win32
{BA599D0A-4310-4505-91DA-6A6447B3E289}.All|Win32.ActiveCfg = Release|Win32
{BA599D0A-4310-4505-91DA-6A6447B3E289}.All|x64.ActiveCfg = Release|Win32
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.All|x64 Setup.ActiveCfg = Release|Win32
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.All|x86 Setup.ActiveCfg = Release|Win32
{BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|Win32.ActiveCfg = Debug|Win32
{BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x64.ActiveCfg = Debug|x64
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|Win32.ActiveCfg = Release|Win32
{BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|x64.ActiveCfg = Release|x64
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|x64 Setup.ActiveCfg = Release|x64
+ {BA599D0A-4310-4505-91DA-6A6447B3E289}.Release|x86 Setup.ActiveCfg = Release|Win32
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|Win32.ActiveCfg = Release|Win32
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|x64.ActiveCfg = Release|Win32
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|x64 Setup.ActiveCfg = Release|Win32
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.All|x86 Setup.ActiveCfg = Release|Win32
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|Win32.ActiveCfg = Debug|Win32
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64.ActiveCfg = Debug|x64
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|Win32.ActiveCfg = Release|Win32
{EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64.ActiveCfg = Release|x64
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x64 Setup.ActiveCfg = Release|x64
+ {EED13FC7-4F81-4E6F-93DB-CDB7DF5CF959}.Release|x86 Setup.ActiveCfg = Release|Win32
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|Win32.ActiveCfg = Release|x64
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64.ActiveCfg = Release|x64
{70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64.Build.0 = Release|x64
+ {70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64 Setup.ActiveCfg = Release|x64
+ {70564D74-199A-4452-9C60-19ED5F242F0D}.All|x64 Setup.Build.0 = Release|x64
+ {70564D74-199A-4452-9C60-19ED5F242F0D}.All|x86 Setup.ActiveCfg = Release|x64
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|Win32.ActiveCfg = Debug|Win32
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|Win32.Build.0 = Debug|Win32
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x64.ActiveCfg = Debug|x64
{70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x64.Build.0 = Debug|x64
+ {70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {70564D74-199A-4452-9C60-19ED5F242F0D}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|Win32.ActiveCfg = Release|Win32
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|Win32.Build.0 = Release|Win32
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x64.ActiveCfg = Release|x64
{70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x64.Build.0 = Release|x64
+ {70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x64 Setup.ActiveCfg = Release|x64
+ {70564D74-199A-4452-9C60-19ED5F242F0D}.Release|x86 Setup.ActiveCfg = Release|Win32
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|Win32.ActiveCfg = Release|x64
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.ActiveCfg = Release|x64
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64.Build.0 = Release|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64 Setup.ActiveCfg = Release|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x64 Setup.Build.0 = Release|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.All|x86 Setup.ActiveCfg = Release|x64
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|Win32.ActiveCfg = Debug|Win32
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|Win32.Build.0 = Debug|Win32
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x64.ActiveCfg = Debug|x64
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x64.Build.0 = Debug|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|Win32.ActiveCfg = Release|Win32
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|Win32.Build.0 = Release|Win32
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x64.ActiveCfg = Release|x64
{3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x64.Build.0 = Release|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x64 Setup.ActiveCfg = Release|x64
+ {3C977801-FE88-48F2-83D3-FA2EBFF6688E}.Release|x86 Setup.ActiveCfg = Release|Win32
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|Win32.ActiveCfg = Release|x64
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|Win32.Build.0 = Release|x64
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64.ActiveCfg = Release|x64
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64.Build.0 = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64 Setup.ActiveCfg = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x64 Setup.Build.0 = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x86 Setup.ActiveCfg = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.All|x86 Setup.Build.0 = Release|x64
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|Win32.ActiveCfg = Debug|Win32
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|Win32.Build.0 = Debug|Win32
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x64.ActiveCfg = Debug|x64
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x64.Build.0 = Debug|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|Win32.ActiveCfg = Release|Win32
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|Win32.Build.0 = Release|Win32
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x64.ActiveCfg = Release|x64
{0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x64.Build.0 = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x64 Setup.ActiveCfg = Release|x64
+ {0382E8FD-CFDC-41C0-8B03-792C7C84FC31}.Release|x86 Setup.ActiveCfg = Release|Win32
{432DB165-1EB2-4781-A9C0-71E62610B20A}.All|Win32.ActiveCfg = Release|x64
{432DB165-1EB2-4781-A9C0-71E62610B20A}.All|x64.ActiveCfg = Release|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.All|x64 Setup.ActiveCfg = Release|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.All|x86 Setup.ActiveCfg = Release|x64
{432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|Win32.ActiveCfg = Debug|Win32
{432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|Win32.Build.0 = Debug|Win32
{432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x64.ActiveCfg = Debug|x64
{432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x64.Build.0 = Debug|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|Win32.ActiveCfg = Release|Win32
{432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|Win32.Build.0 = Release|Win32
{432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x64.ActiveCfg = Release|x64
{432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x64.Build.0 = Release|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x64 Setup.ActiveCfg = Release|x64
+ {432DB165-1EB2-4781-A9C0-71E62610B20A}.Release|x86 Setup.ActiveCfg = Release|Win32
{CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|Win32.ActiveCfg = Release|Win32
{CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|Win32.Build.0 = Release|Win32
{CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|x64.ActiveCfg = Release|Win32
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|x64 Setup.ActiveCfg = Release|Win32
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|x86 Setup.ActiveCfg = Release|Win32
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.All|x86 Setup.Build.0 = Release|Win32
{CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.ActiveCfg = Debug|Win32
{CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|Win32.Build.0 = Debug|Win32
{CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x64.ActiveCfg = Debug|x64
{CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x64.Build.0 = Debug|x64
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.ActiveCfg = Release|Win32
{CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|Win32.Build.0 = Release|Win32
{CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x64.ActiveCfg = Release|x64
{CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x64.Build.0 = Release|x64
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x64 Setup.ActiveCfg = Release|x64
+ {CF70F278-3364-4395-A2E1-23501C9B8AD2}.Release|x86 Setup.ActiveCfg = Release|Win32
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|Win32.ActiveCfg = Release|x64
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64.ActiveCfg = Release|x64
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64.Build.0 = Release|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64 Setup.ActiveCfg = Release|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x64 Setup.Build.0 = Release|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.All|x86 Setup.ActiveCfg = Release|x64
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|Win32.ActiveCfg = Debug|Win32
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|Win32.Build.0 = Debug|Win32
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x64.ActiveCfg = Debug|x64
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x64.Build.0 = Debug|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|Win32.ActiveCfg = Release|Win32
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|Win32.Build.0 = Release|Win32
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.ActiveCfg = Release|x64
{D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64.Build.0 = Release|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x64 Setup.ActiveCfg = Release|x64
+ {D5C87B19-150D-4EF3-A671-96589BD2D14A}.Release|x86 Setup.ActiveCfg = Release|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.ActiveCfg = Release|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|Win32.Build.0 = Release|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|x64.ActiveCfg = Release|Win32
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|x64 Setup.ActiveCfg = Release|Win32
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|x86 Setup.ActiveCfg = Release|Win32
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.All|x86 Setup.Build.0 = Release|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.ActiveCfg = Debug|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|Win32.Build.0 = Debug|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.ActiveCfg = Debug|x64
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64.Build.0 = Debug|x64
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.ActiveCfg = Release|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|Win32.Build.0 = Release|Win32
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.ActiveCfg = Release|x64
{13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64.Build.0 = Release|x64
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x64 Setup.ActiveCfg = Release|x64
+ {13DEECA0-BDD4-4744-A1A2-8EB0A44DF3D2}.Release|x86 Setup.ActiveCfg = Release|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.ActiveCfg = Release|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|Win32.Build.0 = Release|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|x64.ActiveCfg = Release|Win32
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|x64 Setup.ActiveCfg = Release|Win32
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|x86 Setup.ActiveCfg = Release|Win32
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.All|x86 Setup.Build.0 = Release|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.ActiveCfg = Debug|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|Win32.Build.0 = Debug|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.ActiveCfg = Debug|x64
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64.Build.0 = Debug|x64
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.ActiveCfg = Release|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|Win32.Build.0 = Release|Win32
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.ActiveCfg = Release|x64
{B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64.Build.0 = Release|x64
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x64 Setup.ActiveCfg = Release|x64
+ {B5A00BFA-6083-4FAE-A097-71642D6473B5}.Release|x86 Setup.ActiveCfg = Release|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.ActiveCfg = Release|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|Win32.Build.0 = Release|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|x64.ActiveCfg = Release|Win32
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|x64 Setup.ActiveCfg = Release|Win32
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|x86 Setup.ActiveCfg = Release|Win32
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.All|x86 Setup.Build.0 = Release|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.ActiveCfg = Debug|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|Win32.Build.0 = Debug|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.ActiveCfg = Debug|x64
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64.Build.0 = Debug|x64
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.ActiveCfg = Release|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|Win32.Build.0 = Release|Win32
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.ActiveCfg = Release|x64
{1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64.Build.0 = Release|x64
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x64 Setup.ActiveCfg = Release|x64
+ {1C320193-46A6-4B34-9C56-8AB584FC1B56}.Release|x86 Setup.ActiveCfg = Release|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.ActiveCfg = Release|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|Win32.Build.0 = Release|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|x64.ActiveCfg = Release|Win32
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|x64 Setup.ActiveCfg = Release|Win32
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|x86 Setup.ActiveCfg = Release|Win32
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.All|x86 Setup.Build.0 = Release|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.ActiveCfg = Debug|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|Win32.Build.0 = Debug|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.ActiveCfg = Debug|x64
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64.Build.0 = Debug|x64
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.ActiveCfg = Release|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|Win32.Build.0 = Release|Win32
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.ActiveCfg = Release|x64
{72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64.Build.0 = Release|x64
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x64 Setup.ActiveCfg = Release|x64
+ {72782932-37CC-46AE-8C7F-9A7B1A6EE108}.Release|x86 Setup.ActiveCfg = Release|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.ActiveCfg = Release|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|Win32.Build.0 = Release|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|x64.ActiveCfg = Release|Win32
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|x64 Setup.ActiveCfg = Release|Win32
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|x86 Setup.ActiveCfg = Release|Win32
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.All|x86 Setup.Build.0 = Release|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.ActiveCfg = Debug|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|Win32.Build.0 = Debug|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.ActiveCfg = Debug|x64
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64.Build.0 = Debug|x64
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.ActiveCfg = Release|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|Win32.Build.0 = Release|Win32
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.ActiveCfg = Release|x64
{12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64.Build.0 = Release|x64
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x64 Setup.ActiveCfg = Release|x64
+ {12A49562-BAB9-43A3-A21D-15B60BBB4C31}.Release|x86 Setup.ActiveCfg = Release|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.ActiveCfg = Release|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|Win32.Build.0 = Release|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|x64.ActiveCfg = Release|Win32
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|x64 Setup.ActiveCfg = Release|Win32
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|x86 Setup.ActiveCfg = Release|Win32
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.All|x86 Setup.Build.0 = Release|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.ActiveCfg = Debug|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|Win32.Build.0 = Debug|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.ActiveCfg = Debug|x64
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64.Build.0 = Debug|x64
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.ActiveCfg = Release|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|Win32.Build.0 = Release|Win32
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.ActiveCfg = Release|x64
{A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64.Build.0 = Release|x64
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x64 Setup.ActiveCfg = Release|x64
+ {A9EDAC04-6A5F-4BA7-BC0D-CCE7B255B6EA}.Release|x86 Setup.ActiveCfg = Release|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.ActiveCfg = Release|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.All|Win32.Build.0 = Release|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.All|x64.ActiveCfg = Release|Win32
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.All|x64 Setup.ActiveCfg = Release|Win32
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.All|x86 Setup.ActiveCfg = Release|Win32
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.All|x86 Setup.Build.0 = Release|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.ActiveCfg = Debug|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|Win32.Build.0 = Debug|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.ActiveCfg = Debug|x64
{504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64.Build.0 = Debug|x64
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.ActiveCfg = Release|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.Release|Win32.Build.0 = Release|Win32
{504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.ActiveCfg = Release|x64
{504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64.Build.0 = Release|x64
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x64 Setup.ActiveCfg = Release|x64
+ {504B3154-7A4F-459D-9877-B951021C3F1F}.Release|x86 Setup.ActiveCfg = Release|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.ActiveCfg = Release|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|Win32.Build.0 = Release|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|x64.ActiveCfg = Release|Win32
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|x64 Setup.ActiveCfg = Release|Win32
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|x86 Setup.ActiveCfg = Release|Win32
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.All|x86 Setup.Build.0 = Release|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.ActiveCfg = Debug|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|Win32.Build.0 = Debug|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.ActiveCfg = Debug|x64
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64.Build.0 = Debug|x64
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.ActiveCfg = Release|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|Win32.Build.0 = Release|Win32
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.ActiveCfg = Release|x64
{746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64.Build.0 = Release|x64
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x64 Setup.ActiveCfg = Release|x64
+ {746F3632-5BB2-4570-9453-31D6D58A7D8E}.Release|x86 Setup.ActiveCfg = Release|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.ActiveCfg = Release|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|Win32.Build.0 = Release|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|x64.ActiveCfg = Release|Win32
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|x64 Setup.ActiveCfg = Release|Win32
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|x86 Setup.ActiveCfg = Release|Win32
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.All|x86 Setup.Build.0 = Release|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.ActiveCfg = Debug|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|Win32.Build.0 = Debug|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.ActiveCfg = Debug|x64
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64.Build.0 = Debug|x64
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.ActiveCfg = Release|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|Win32.Build.0 = Release|Win32
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.ActiveCfg = Release|x64
{DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64.Build.0 = Release|x64
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x64 Setup.ActiveCfg = Release|x64
+ {DEB01ACB-D65F-4A62-AED9-58C1054499E9}.Release|x86 Setup.ActiveCfg = Release|Win32
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|Win32.ActiveCfg = Release|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.ActiveCfg = Release|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64.Build.0 = Release|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64 Setup.ActiveCfg = Release|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x64 Setup.Build.0 = Release|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.All|x86 Setup.ActiveCfg = Release|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.ActiveCfg = Debug|Win32
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|Win32.Build.0 = Debug|Win32
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.ActiveCfg = Debug|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64.Build.0 = Debug|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.ActiveCfg = Release|Win32
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|Win32.Build.0 = Release|Win32
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.ActiveCfg = Release|x64
{D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64.Build.0 = Release|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x64 Setup.ActiveCfg = Release|x64
+ {D07C378A-F5F7-438F-ADF3-4AC4FB1883CD}.Release|x86 Setup.ActiveCfg = Release|Win32
{FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.All|Win32.ActiveCfg = Release|Win32
{FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.All|Win32.Build.0 = Release|Win32
{FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.All|x64.ActiveCfg = Release|Win32
+ {FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.All|x64 Setup.ActiveCfg = Release|Win32
+ {FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.All|x86 Setup.ActiveCfg = Release|Win32
+ {FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.All|x86 Setup.Build.0 = Release|Win32
{FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Debug|Win32.ActiveCfg = Debug|Win32
{FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Debug|Win32.Build.0 = Debug|Win32
{FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Debug|x64.ActiveCfg = Debug|Win32
{FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Debug|x64.Build.0 = Debug|Win32
+ {FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Release|Win32.ActiveCfg = Release|Win32
{FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Release|Win32.Build.0 = Release|Win32
{FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Release|x64.ActiveCfg = Release|Win32
{FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Release|x64.Build.0 = Release|Win32
+ {FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {FFF82F9B-6A2B-4BE3-95D8-DC5A4FC71E19}.Release|x86 Setup.ActiveCfg = Release|Win32
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|Win32.ActiveCfg = Release|x64
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.ActiveCfg = Release|x64
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64.Build.0 = Release|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64 Setup.ActiveCfg = Release|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x64 Setup.Build.0 = Release|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.All|x86 Setup.ActiveCfg = Release|x64
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|Win32.ActiveCfg = Debug|Win32
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|Win32.Build.0 = Debug|Win32
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x64.ActiveCfg = Debug|x64
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x64.Build.0 = Debug|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|Win32.ActiveCfg = Release|Win32
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|Win32.Build.0 = Release|Win32
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x64.ActiveCfg = Release|x64
{ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x64.Build.0 = Release|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x64 Setup.ActiveCfg = Release|x64
+ {ABB71A76-42B0-47A4-973A-42E3D920C6FD}.Release|x86 Setup.ActiveCfg = Release|Win32
{4D418176-3B33-47E6-A63E-01BA34ADD21C}.All|Win32.ActiveCfg = Release Passthrough|x64
{4D418176-3B33-47E6-A63E-01BA34ADD21C}.All|x64.ActiveCfg = Release Passthrough|x64
{4D418176-3B33-47E6-A63E-01BA34ADD21C}.All|x64.Build.0 = Release Passthrough|x64
+ {4D418176-3B33-47E6-A63E-01BA34ADD21C}.All|x64 Setup.ActiveCfg = Release Passthrough|x64
+ {4D418176-3B33-47E6-A63E-01BA34ADD21C}.All|x64 Setup.Build.0 = Release Passthrough|x64
+ {4D418176-3B33-47E6-A63E-01BA34ADD21C}.All|x86 Setup.ActiveCfg = Release Passthrough|x64
{4D418176-3B33-47E6-A63E-01BA34ADD21C}.Debug|Win32.ActiveCfg = Debug|Win32
{4D418176-3B33-47E6-A63E-01BA34ADD21C}.Debug|Win32.Build.0 = Debug|Win32
{4D418176-3B33-47E6-A63E-01BA34ADD21C}.Debug|x64.ActiveCfg = Debug|x64
{4D418176-3B33-47E6-A63E-01BA34ADD21C}.Debug|x64.Build.0 = Debug|x64
+ {4D418176-3B33-47E6-A63E-01BA34ADD21C}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {4D418176-3B33-47E6-A63E-01BA34ADD21C}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{4D418176-3B33-47E6-A63E-01BA34ADD21C}.Release|Win32.ActiveCfg = Release|Win32
{4D418176-3B33-47E6-A63E-01BA34ADD21C}.Release|Win32.Build.0 = Release|Win32
{4D418176-3B33-47E6-A63E-01BA34ADD21C}.Release|x64.ActiveCfg = Release|x64
{4D418176-3B33-47E6-A63E-01BA34ADD21C}.Release|x64.Build.0 = Release|x64
+ {4D418176-3B33-47E6-A63E-01BA34ADD21C}.Release|x64 Setup.ActiveCfg = Release|x64
+ {4D418176-3B33-47E6-A63E-01BA34ADD21C}.Release|x86 Setup.ActiveCfg = Release|Win32
{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|Win32.ActiveCfg = Release|Win32
{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|Win32.Build.0 = Release|Win32
{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|x64.ActiveCfg = Release|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|x64 Setup.ActiveCfg = Release|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|x86 Setup.ActiveCfg = Release|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.All|x86 Setup.Build.0 = Release|Win32
{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|Win32.ActiveCfg = Debug|Win32
{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|x64.ActiveCfg = Debug|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|Win32.ActiveCfg = Release|Win32
{7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|x64.ActiveCfg = Release|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {7D3122C7-C9D0-3748-81F8-F0DDCB40BF5E}.Release|x86 Setup.ActiveCfg = Release|Win32
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|Win32.ActiveCfg = Release|x64
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64.ActiveCfg = Release|x64
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64.Build.0 = Release|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64 Setup.ActiveCfg = Release|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x64 Setup.Build.0 = Release|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.All|x86 Setup.ActiveCfg = Release|x64
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|Win32.ActiveCfg = Debug|Win32
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|Win32.Build.0 = Debug|Win32
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x64.ActiveCfg = Debug|x64
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x64.Build.0 = Debug|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|Win32.ActiveCfg = Release|Win32
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|Win32.Build.0 = Release|Win32
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x64.ActiveCfg = Release|x64
{EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x64.Build.0 = Release|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x64 Setup.ActiveCfg = Release|x64
+ {EF300386-A8DF-4372-B6D8-FB9BFFCA9AED}.Release|x86 Setup.ActiveCfg = Release|Win32
{B808178B-82F0-4CF4-A2B1-921939FA24D0}.All|Win32.ActiveCfg = Release|Win32
{B808178B-82F0-4CF4-A2B1-921939FA24D0}.All|Win32.Build.0 = Release|Win32
{B808178B-82F0-4CF4-A2B1-921939FA24D0}.All|x64.ActiveCfg = Release|Win32
+ {B808178B-82F0-4CF4-A2B1-921939FA24D0}.All|x64 Setup.ActiveCfg = Release|Win32
+ {B808178B-82F0-4CF4-A2B1-921939FA24D0}.All|x86 Setup.ActiveCfg = Release|Win32
+ {B808178B-82F0-4CF4-A2B1-921939FA24D0}.All|x86 Setup.Build.0 = Release|Win32
{B808178B-82F0-4CF4-A2B1-921939FA24D0}.Debug|Win32.ActiveCfg = Debug|Win32
{B808178B-82F0-4CF4-A2B1-921939FA24D0}.Debug|Win32.Build.0 = Debug|Win32
{B808178B-82F0-4CF4-A2B1-921939FA24D0}.Debug|x64.ActiveCfg = Debug|Win32
{B808178B-82F0-4CF4-A2B1-921939FA24D0}.Debug|x64.Build.0 = Debug|Win32
+ {B808178B-82F0-4CF4-A2B1-921939FA24D0}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {B808178B-82F0-4CF4-A2B1-921939FA24D0}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{B808178B-82F0-4CF4-A2B1-921939FA24D0}.Release|Win32.ActiveCfg = Release|Win32
{B808178B-82F0-4CF4-A2B1-921939FA24D0}.Release|Win32.Build.0 = Release|Win32
{B808178B-82F0-4CF4-A2B1-921939FA24D0}.Release|x64.ActiveCfg = Release|Win32
{B808178B-82F0-4CF4-A2B1-921939FA24D0}.Release|x64.Build.0 = Release|Win32
+ {B808178B-82F0-4CF4-A2B1-921939FA24D0}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {B808178B-82F0-4CF4-A2B1-921939FA24D0}.Release|x86 Setup.ActiveCfg = Release|Win32
{9778F1C0-09BC-4698-8EBC-BD982247209A}.All|Win32.ActiveCfg = Release|x64
{9778F1C0-09BC-4698-8EBC-BD982247209A}.All|x64.ActiveCfg = Release|x64
{9778F1C0-09BC-4698-8EBC-BD982247209A}.All|x64.Build.0 = Release|x64
+ {9778F1C0-09BC-4698-8EBC-BD982247209A}.All|x64 Setup.ActiveCfg = Release|x64
+ {9778F1C0-09BC-4698-8EBC-BD982247209A}.All|x64 Setup.Build.0 = Release|x64
+ {9778F1C0-09BC-4698-8EBC-BD982247209A}.All|x86 Setup.ActiveCfg = Release|x64
{9778F1C0-09BC-4698-8EBC-BD982247209A}.Debug|Win32.ActiveCfg = Debug|Win32
{9778F1C0-09BC-4698-8EBC-BD982247209A}.Debug|Win32.Build.0 = Debug|Win32
{9778F1C0-09BC-4698-8EBC-BD982247209A}.Debug|x64.ActiveCfg = Debug|x64
{9778F1C0-09BC-4698-8EBC-BD982247209A}.Debug|x64.Build.0 = Debug|x64
+ {9778F1C0-09BC-4698-8EBC-BD982247209A}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {9778F1C0-09BC-4698-8EBC-BD982247209A}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{9778F1C0-09BC-4698-8EBC-BD982247209A}.Release|Win32.ActiveCfg = Release|Win32
{9778F1C0-09BC-4698-8EBC-BD982247209A}.Release|Win32.Build.0 = Release|Win32
{9778F1C0-09BC-4698-8EBC-BD982247209A}.Release|x64.ActiveCfg = Release|x64
{9778F1C0-09BC-4698-8EBC-BD982247209A}.Release|x64.Build.0 = Release|x64
+ {9778F1C0-09BC-4698-8EBC-BD982247209A}.Release|x64 Setup.ActiveCfg = Release|x64
+ {9778F1C0-09BC-4698-8EBC-BD982247209A}.Release|x86 Setup.ActiveCfg = Release|Win32
{AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|Win32.ActiveCfg = Release|x64
{AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64.ActiveCfg = Release|x64
{AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64.Build.0 = Release|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64 Setup.ActiveCfg = Release|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x64 Setup.Build.0 = Release|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.All|x86 Setup.ActiveCfg = Release|x64
{AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|Win32.ActiveCfg = Debug|Win32
{AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|Win32.Build.0 = Debug|Win32
{AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x64.ActiveCfg = Debug|x64
{AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x64.Build.0 = Debug|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|Win32.ActiveCfg = Release|Win32
{AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|Win32.Build.0 = Release|Win32
{AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x64.ActiveCfg = Release|x64
{AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x64.Build.0 = Release|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x64 Setup.ActiveCfg = Release|x64
+ {AFA983D6-4569-4F88-BA94-555ED00FD9A8}.Release|x86 Setup.ActiveCfg = Release|Win32
{56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|Win32.ActiveCfg = Release|Win32
{56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|Win32.Build.0 = Release|Win32
{56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|x64.ActiveCfg = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|x64 Setup.ActiveCfg = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|x86 Setup.ActiveCfg = Release|Win32
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.All|x86 Setup.Build.0 = Release|Win32
{56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.ActiveCfg = Debug|Win32
{56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|Win32.Build.0 = Debug|Win32
{56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x64.ActiveCfg = Debug|x64
{56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x64.Build.0 = Debug|x64
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.ActiveCfg = Release|Win32
{56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|Win32.Build.0 = Release|Win32
{56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x64.ActiveCfg = Release|x64
{56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x64.Build.0 = Release|x64
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x64 Setup.ActiveCfg = Release|x64
+ {56B91D01-9150-4BBF-AFA1-5B68AB991B76}.Release|x86 Setup.ActiveCfg = Release|Win32
{990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|Win32.ActiveCfg = Release|Win32
{990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|Win32.Build.0 = Release|Win32
{990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|x64.ActiveCfg = Release|Win32
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|x64 Setup.ActiveCfg = Release|Win32
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|x86 Setup.ActiveCfg = Release|Win32
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.All|x86 Setup.Build.0 = Release|Win32
{990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|Win32.ActiveCfg = Debug|Win32
{990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|Win32.Build.0 = Debug|Win32
{990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x64.ActiveCfg = Debug|x64
{990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x64.Build.0 = Debug|x64
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|Win32.ActiveCfg = Release|Win32
{990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|Win32.Build.0 = Release|Win32
{990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x64.ActiveCfg = Release|x64
{990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x64.Build.0 = Release|x64
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x64 Setup.ActiveCfg = Release|x64
+ {990BAA76-89D3-4E38-8479-C7B28784EFC8}.Release|x86 Setup.ActiveCfg = Release|Win32
{1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|Win32.ActiveCfg = Release|x64
{1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64.ActiveCfg = Release|x64
{1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64.Build.0 = Release|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64 Setup.ActiveCfg = Release|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x64 Setup.Build.0 = Release|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.All|x86 Setup.ActiveCfg = Release|x64
{1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|Win32.ActiveCfg = Debug|Win32
{1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|Win32.Build.0 = Debug|Win32
{1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x64.ActiveCfg = Debug|x64
{1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x64.Build.0 = Debug|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|Win32.ActiveCfg = Release|Win32
{1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|Win32.Build.0 = Release|Win32
{1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x64.ActiveCfg = Release|x64
{1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x64.Build.0 = Release|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x64 Setup.ActiveCfg = Release|x64
+ {1E21AFE0-6FDB-41D2-942D-863607C24B91}.Release|x86 Setup.ActiveCfg = Release|Win32
{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|Win32.ActiveCfg = Release|x64
{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64.ActiveCfg = Release|x64
{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64.Build.0 = Release|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64 Setup.ActiveCfg = Release|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x64 Setup.Build.0 = Release|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.All|x86 Setup.ActiveCfg = Release|x64
{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|Win32.ActiveCfg = Debug|Win32
{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|Win32.Build.0 = Debug|Win32
{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x64.ActiveCfg = Debug|x64
{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x64.Build.0 = Debug|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|Win32.ActiveCfg = Release|Win32
{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|Win32.Build.0 = Release|Win32
{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x64.ActiveCfg = Release|x64
{2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x64.Build.0 = Release|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x64 Setup.ActiveCfg = Release|x64
+ {2E250296-0C08-4342-9C8A-BCBDD0E7DF65}.Release|x86 Setup.ActiveCfg = Release|Win32
{D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.All|Win32.ActiveCfg = Release|x64
{D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.All|x64.ActiveCfg = Release|x64
{D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.All|x64.Build.0 = Release|x64
+ {D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.All|x64 Setup.ActiveCfg = Release|x64
+ {D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.All|x64 Setup.Build.0 = Release|x64
+ {D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.All|x86 Setup.ActiveCfg = Release|x64
{D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Debug|Win32.ActiveCfg = Debug|Win32
{D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Debug|Win32.Build.0 = Debug|Win32
{D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Debug|x64.ActiveCfg = Debug|x64
{D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Debug|x64.Build.0 = Debug|x64
+ {D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Release|Win32.ActiveCfg = Release|Win32
{D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Release|Win32.Build.0 = Release|Win32
{D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Release|x64.ActiveCfg = Release|x64
{D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Release|x64.Build.0 = Release|x64
+ {D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Release|x64 Setup.ActiveCfg = Release|x64
+ {D331904D-A00A-4694-A5A3-FCFF64AB5DBE}.Release|x86 Setup.ActiveCfg = Release|Win32
{B4B62169-5AD4-4559-8707-3D933AC5DB39}.All|Win32.ActiveCfg = Release|x64
{B4B62169-5AD4-4559-8707-3D933AC5DB39}.All|x64.ActiveCfg = Release|x64
{B4B62169-5AD4-4559-8707-3D933AC5DB39}.All|x64.Build.0 = Release|x64
+ {B4B62169-5AD4-4559-8707-3D933AC5DB39}.All|x64 Setup.ActiveCfg = Release|x64
+ {B4B62169-5AD4-4559-8707-3D933AC5DB39}.All|x64 Setup.Build.0 = Release|x64
+ {B4B62169-5AD4-4559-8707-3D933AC5DB39}.All|x86 Setup.ActiveCfg = Release|x64
{B4B62169-5AD4-4559-8707-3D933AC5DB39}.Debug|Win32.ActiveCfg = Debug|Win32
{B4B62169-5AD4-4559-8707-3D933AC5DB39}.Debug|Win32.Build.0 = Debug|Win32
{B4B62169-5AD4-4559-8707-3D933AC5DB39}.Debug|x64.ActiveCfg = Debug|x64
{B4B62169-5AD4-4559-8707-3D933AC5DB39}.Debug|x64.Build.0 = Debug|x64
+ {B4B62169-5AD4-4559-8707-3D933AC5DB39}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {B4B62169-5AD4-4559-8707-3D933AC5DB39}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{B4B62169-5AD4-4559-8707-3D933AC5DB39}.Release|Win32.ActiveCfg = Release|Win32
{B4B62169-5AD4-4559-8707-3D933AC5DB39}.Release|Win32.Build.0 = Release|Win32
{B4B62169-5AD4-4559-8707-3D933AC5DB39}.Release|x64.ActiveCfg = Release|x64
{B4B62169-5AD4-4559-8707-3D933AC5DB39}.Release|x64.Build.0 = Release|x64
+ {B4B62169-5AD4-4559-8707-3D933AC5DB39}.Release|x64 Setup.ActiveCfg = Release|x64
+ {B4B62169-5AD4-4559-8707-3D933AC5DB39}.Release|x86 Setup.ActiveCfg = Release|Win32
{25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.All|Win32.ActiveCfg = Release|x64
{25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.All|x64.ActiveCfg = Release|x64
{25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.All|x64.Build.0 = Release|x64
+ {25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.All|x64 Setup.ActiveCfg = Release|x64
+ {25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.All|x64 Setup.Build.0 = Release|x64
+ {25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.All|x86 Setup.ActiveCfg = Release|x64
{25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Debug|Win32.ActiveCfg = Debug|Win32
{25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Debug|Win32.Build.0 = Debug|Win32
{25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Debug|x64.ActiveCfg = Debug|x64
{25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Debug|x64.Build.0 = Debug|x64
+ {25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Release|Win32.ActiveCfg = Release|Win32
{25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Release|Win32.Build.0 = Release|Win32
{25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Release|x64.ActiveCfg = Release|x64
{25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Release|x64.Build.0 = Release|x64
+ {25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Release|x64 Setup.ActiveCfg = Release|x64
+ {25BD39B1-C8BF-4676-A738-9CABD9C6BC79}.Release|x86 Setup.ActiveCfg = Release|Win32
{D578E676-7EC8-4548-BD8B-845C635F14AD}.All|Win32.ActiveCfg = Release|Win32
{D578E676-7EC8-4548-BD8B-845C635F14AD}.All|Win32.Build.0 = Release|Win32
{D578E676-7EC8-4548-BD8B-845C635F14AD}.All|x64.ActiveCfg = Release|Win32
+ {D578E676-7EC8-4548-BD8B-845C635F14AD}.All|x64 Setup.ActiveCfg = Release|Win32
+ {D578E676-7EC8-4548-BD8B-845C635F14AD}.All|x86 Setup.ActiveCfg = Release|Win32
+ {D578E676-7EC8-4548-BD8B-845C635F14AD}.All|x86 Setup.Build.0 = Release|Win32
{D578E676-7EC8-4548-BD8B-845C635F14AD}.Debug|Win32.ActiveCfg = Debug|Win32
{D578E676-7EC8-4548-BD8B-845C635F14AD}.Debug|Win32.Build.0 = Debug|Win32
{D578E676-7EC8-4548-BD8B-845C635F14AD}.Debug|x64.ActiveCfg = Debug|Win32
{D578E676-7EC8-4548-BD8B-845C635F14AD}.Debug|x64.Build.0 = Debug|Win32
+ {D578E676-7EC8-4548-BD8B-845C635F14AD}.Debug|x64 Setup.ActiveCfg = Debug|Win32
+ {D578E676-7EC8-4548-BD8B-845C635F14AD}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{D578E676-7EC8-4548-BD8B-845C635F14AD}.Release|Win32.ActiveCfg = Release|Win32
{D578E676-7EC8-4548-BD8B-845C635F14AD}.Release|Win32.Build.0 = Release|Win32
{D578E676-7EC8-4548-BD8B-845C635F14AD}.Release|x64.ActiveCfg = Release|Win32
{D578E676-7EC8-4548-BD8B-845C635F14AD}.Release|x64.Build.0 = Release|Win32
+ {D578E676-7EC8-4548-BD8B-845C635F14AD}.Release|x64 Setup.ActiveCfg = Release|Win32
+ {D578E676-7EC8-4548-BD8B-845C635F14AD}.Release|x86 Setup.ActiveCfg = Release|Win32
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|Win32.ActiveCfg = Release|x64
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64.ActiveCfg = Release|x64
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64.Build.0 = Release|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64 Setup.ActiveCfg = Release|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x64 Setup.Build.0 = Release|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.All|x86 Setup.ActiveCfg = Release|x64
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.ActiveCfg = Debug|Win32
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|Win32.Build.0 = Debug|Win32
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x64.ActiveCfg = Debug|x64
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x64.Build.0 = Debug|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.ActiveCfg = Release|Win32
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|Win32.Build.0 = Release|Win32
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x64.ActiveCfg = Release|x64
{70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x64.Build.0 = Release|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x64 Setup.ActiveCfg = Release|x64
+ {70A49BC2-7500-41D0-B75D-EDCC5BE987A0}.Release|x86 Setup.ActiveCfg = Release|Win32
{B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|Win32.ActiveCfg = Release|x64
{B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64.ActiveCfg = Release|x64
{B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64.Build.0 = Release|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64 Setup.ActiveCfg = Release|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x64 Setup.Build.0 = Release|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.All|x86 Setup.ActiveCfg = Release|x64
{B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|Win32.ActiveCfg = Debug|Win32
{B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x64.ActiveCfg = Debug|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|Win32.ActiveCfg = Release|Win32
{B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x64.ActiveCfg = Release|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x64 Setup.ActiveCfg = Release|x64
+ {B889A18E-70A7-44B5-B2C9-47798D4F43B3}.Release|x86 Setup.ActiveCfg = Release|Win32
{05C9FB27-480E-4D53-B3B7-7338E2514666}.All|Win32.ActiveCfg = Release|Win32
{05C9FB27-480E-4D53-B3B7-7338E2514666}.All|Win32.Build.0 = Release|Win32
{05C9FB27-480E-4D53-B3B7-7338E2514666}.All|x64.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|x64 Setup.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|x86 Setup.ActiveCfg = Release|Win32
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.All|x86 Setup.Build.0 = Release|Win32
{05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|Win32.ActiveCfg = Debug|Win32
{05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|x64.ActiveCfg = Debug|x64
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|Win32.ActiveCfg = Release|Win32
{05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|x64.ActiveCfg = Release|x64
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|x64 Setup.ActiveCfg = Release|x64
+ {05C9FB27-480E-4D53-B3B7-7338E2514666}.Release|x86 Setup.ActiveCfg = Release|Win32
{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|Win32.ActiveCfg = Release|x64
{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64.ActiveCfg = Release|x64
{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64.Build.0 = Release|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64 Setup.ActiveCfg = Release|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x64 Setup.Build.0 = Release|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.All|x86 Setup.ActiveCfg = Release|x64
{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|Win32.ActiveCfg = Debug|Win32
{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|x64.ActiveCfg = Debug|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Debug|x86 Setup.ActiveCfg = Debug|Win32
{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|Win32.ActiveCfg = Release|Win32
{5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|x64.ActiveCfg = Release|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|x64 Setup.ActiveCfg = Release|x64
+ {5C2B4D88-3BEA-4FE0-90DF-FA9836099D5F}.Release|x86 Setup.ActiveCfg = Release|Win32
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|Win32.ActiveCfg = Release|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|x64.ActiveCfg = Release|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|x64 Setup.ActiveCfg = Release|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.All|x86 Setup.ActiveCfg = Release|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|Win32.ActiveCfg = Debug|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x64.ActiveCfg = Debug|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x64 Setup.ActiveCfg = Debug|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x64 Setup.Build.0 = Debug|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x86 Setup.ActiveCfg = Debug|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Debug|x86 Setup.Build.0 = Debug|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|Win32.ActiveCfg = Release|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x64.ActiveCfg = Release|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x64 Setup.ActiveCfg = Release|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x64 Setup.Build.0 = Release|x64
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x86 Setup.ActiveCfg = Release|x86
+ {47213370-B933-487D-9F45-BCA26D7E2B6F}.Release|x86 Setup.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Makefile.am b/Makefile.am
index b11e3ff988..944511dac9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -267,7 +267,7 @@ src/include/switch_swigable_cpp.h: $(switch_srcdir)/src/include/switch_cpp.h
##
## Applications
##
-bin_PROGRAMS = freeswitch fs_cli fs_ivrd tone2wav
+bin_PROGRAMS = freeswitch fs_cli fs_ivrd tone2wav fs_encode
##
## fs_cli ()
@@ -281,6 +281,14 @@ fs_cli_CFLAGS += -DHAVE_EDITLINE -I$(switch_srcdir)/libs/libedit/src
fs_cli_LDADD = libs/libedit/src/.libs/libedit.a
endif
+##
+## fs_encode ()
+##
+fs_encode_SOURCES = src/fs_encode.c
+fs_encode_CFLAGS = $(AM_CFLAGS)
+fs_encode_LDFLAGS = $(AM_LDFLAGS) $(CORE_LIBS)
+fs_encode_LDADD = libfreeswitch.la
+
##
## tone2wav ()
##
diff --git a/bootstrap.sh b/bootstrap.sh
index 4e65c5ca15..2dd76c409c 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -148,7 +148,7 @@ if [ "x$libtoolize" = "x" ]; then
exit 1
fi
if [ ! -x "$libtoolize" ]; then
- echo "$libtoolize does not exist or ist not executable"
+ echo "$libtoolize does not exist or is not executable"
exit 1
fi
diff --git a/build/modules.conf.in b/build/modules.conf.in
index 67e1fe62ae..37244a188a 100644
--- a/build/modules.conf.in
+++ b/build/modules.conf.in
@@ -105,5 +105,5 @@ say/mod_say_ru
#say/mod_say_th
## Experimental Modules (don't cry if they're broken)
-#../../contrib/mod/endpoints/mod_khomp
+#endpoints/mod_khomp
#../../contrib/mod/xml_int/mod_xml_odbc
diff --git a/conf/autoload_configs/callcenter.conf.xml b/conf/autoload_configs/callcenter.conf.xml
index 9140193b22..a069413ac6 100644
--- a/conf/autoload_configs/callcenter.conf.xml
+++ b/conf/autoload_configs/callcenter.conf.xml
@@ -13,6 +13,7 @@
+
diff --git a/conf/autoload_configs/erlang_event.conf.xml b/conf/autoload_configs/erlang_event.conf.xml
index ec14e21a25..62deb84f67 100644
--- a/conf/autoload_configs/erlang_event.conf.xml
+++ b/conf/autoload_configs/erlang_event.conf.xml
@@ -2,7 +2,16 @@
+
+
+
+
+
diff --git a/conf/autoload_configs/modules.conf.xml b/conf/autoload_configs/modules.conf.xml
index d8ae5e1a03..f5627fe965 100644
--- a/conf/autoload_configs/modules.conf.xml
+++ b/conf/autoload_configs/modules.conf.xml
@@ -34,6 +34,7 @@
+
diff --git a/conf/autoload_configs/switch.conf.xml b/conf/autoload_configs/switch.conf.xml
index e861b1b61a..896dd0e712 100644
--- a/conf/autoload_configs/switch.conf.xml
+++ b/conf/autoload_configs/switch.conf.xml
@@ -86,6 +86,7 @@
+
diff --git a/conf/autoload_configs/voicemail.conf.xml b/conf/autoload_configs/voicemail.conf.xml
index 14ad98b41c..06bd6f6dca 100644
--- a/conf/autoload_configs/voicemail.conf.xml
+++ b/conf/autoload_configs/voicemail.conf.xml
@@ -33,9 +33,10 @@
-
-
-
+ -->
+
+
+
diff --git a/conf/dialplan/default.xml b/conf/dialplan/default.xml
index 8bdcfa0da2..42a3bcc31f 100644
--- a/conf/dialplan/default.xml
+++ b/conf/dialplan/default.xml
@@ -95,7 +95,7 @@
-
+
@@ -103,7 +103,7 @@
-
+
@@ -260,6 +260,8 @@
+
+
diff --git a/debian/READ_BEFORE_CHANGING_ANYTHING_IN_HERE b/debian/READ_BEFORE_CHANGING_ANYTHING_IN_HERE
new file mode 100644
index 0000000000..17480db19e
--- /dev/null
+++ b/debian/READ_BEFORE_CHANGING_ANYTHING_IN_HERE
@@ -0,0 +1,29 @@
+Please do not change the maintainer (as found in the control file).
+
+Please DO send me a note before changing anything here. Also, PLEASE DO MAKE A
+JIRA FIRST !!!!
+
+This request is the result of far too many sleepless nights and far too many
+people breaking this far too often. So, HANDS OFF FOR NOW !!!!
+
+Again, to be perfectly clear:
+1. Do not make any changes before verifying that they are OK with the current
+maintainer (yes, that is me*).
+
+2. Before the mere idea of making a change crosses your mind, create a ticket in
+Jira and assign it to the current maintainer.
+
+3. As current maintainer, I have other obligations besides fixing things people
+break in the Debian build. So, please be patient; it can sometimes take a
+bit for me to respond.
+
+4. Creating and maintaining this packages has been a lot of work. Please help
+me maintain it by not fixing it to death.
+
+5. The maintainer is always right.
+
+6. If you believe the maintainer is wrong, please see item #5.
+
+
+
+* Michal Bielicki
diff --git a/debian/changelog b/debian/changelog
index 7f4e8d7749..8065d932e3 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,53 @@
+freeswitch (1.0.head~git.master.20101015.1-1) unstable; urgency=low
+
+ * reintroduced mod_flite
+ * disabled the patching stuff introduced by Julien ... needs an overwork
+ * reintroduced mod_tts_commandline
+ * cleaned up rules file and module make rules
+ * more trivial changes and updates :)
+
+ -- Michal Bielicki Fri, 15 Oct 2010 13:14:02 +0200
+
+freeswitch (1.0.head~git.master.20101014.1-1) unstable; urgency=low
+
+ * replaced mod_openzap with mod_freetdm
+ * added mod_theora
+ * added mod_codec2
+ * added mod_amrwb
+ * added mod_portaudio_stream
+ * cleaned up rules file and module make rules
+ * added patches from Julien Duqene (FS-369)
+ * Various trivial changes and updates :)
+
+ -- Michal Bielicki Fri, 15 Oct 2010 05:05:02 +0200
+
+freeswitch (1.0.head~git.master.20100601.2-1) unstable; urgency=low
+
+ * Various trivial changes and updates.
+ * Change upstream package version numbering scheme for unreleased versions:
+ new format is major.minor.micro~git.branch.date.commits-1
+ * Change source format to 3.0 (quilt).
+ * Upgrade debhelper compatibility to version 7.
+ * Update maintainer data and copyright file; now includes the full text
+ of the MPL since it is not (yet?) available in /usr/share/common-licenses/
+
+ * Build and install mod_file_string.so (FSBUILD-247)
+ * Work around build failure caused by clean rules for openzap.
+
+ * Remove several libraries from explicit dependencies, there were no special
+ version requirements and they should be picked up by dh_shlibdeps.
+ * Add dh_makeshlibs and make dh_shlibsdeps work again.
+ * Move openssl to Suggests: as it is not a required package to install or
+ run freeswitch.
+
+ * Add upstream-convert rule to apply patches, generate orig tarball
+ and set package version.
+ * Add check to ensure debian patches are applied before attempting build.
+ * Fix clean rule to avoid unwanted tree change before building orig.tar
+ archives with git-buildpackage.
+
+ -- Julien Plissonneau Duquene Tue, 01 Jun 2010 09:53:44 -0400
+
freeswitch (1.0.6-1ubuntu1) maverick; urgency=low
[ Gabriel Gunderson ]
@@ -15,7 +65,7 @@ freeswitch (1.0.4-1ubuntu2) karmic; urgency=low
* upgrade: Add more verbosity when building to make it easier to find build
errors.
* upgrade: Remove the requirement for EXACTLY automake1.9 and change it to
- need atleast automake 1.9
+ need at least automake 1.9
* upgrade: Add the modules (directory, cluechoo, and valet_parking) to the
build files. These are in the standard build, so they should be here too.
@@ -574,7 +624,7 @@ freeswitch (1.0.1-1) unstable; urgency=low
* ADD: reboot option for sip phones to flush_inboud_reg sofia profile api command
* FIX: add small padding to end of mp3 to avoid cut off mp3 recording
* FIX: patch multiple SDP connection lines in sdp for proxy media mode (MODENDP-109)
- * FIX: don't parse ringback varable in proxy situations
+ * FIX: don't parse ringback variable in proxy situations
* ADD: per call vm recording ext with vm_message_ext variable
* ADD: sip_bye_h prefix to add headers to bye
* ENHANCEMENT: more interfaces available in show fsapi command
@@ -596,7 +646,7 @@ freeswitch (1.0.1~trunk) unstable; urgency=low
- Added mod_say_es and mod_say_nl
- Updated descriptions
- Added mod_cdr_csv
- * Fixed typos and some errors in the previus patch.
+ * Fixed typos and some errors in the previous patch.
* Modified monit script. Now it should work.
* The debian build system now bootstrap automagically if it's necessary and all scripts are in place.
diff --git a/debian/compat b/debian/compat
index b8626c4cff..7f8f011eb7 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-4
+7
diff --git a/debian/control b/debian/control
index 92b4e6ada5..f5068bffe5 100644
--- a/debian/control
+++ b/debian/control
@@ -2,18 +2,22 @@ Source: freeswitch
Section: comm
Priority: extra
Maintainer: FreeSWITCH developers
-Uploaders: Michal Bielicki , Gabriel Gunderson , William King , Mathieu Parent
-Build-Depends: debhelper (>= 5), fakeroot, wget, automake (>=1.9), autoconf, libtool, unixodbc-dev, libasound2-dev, libcurl3-openssl-dev|libcurl4-openssl-dev, libssl-dev, ncurses-dev, libogg-dev, libvorbis-dev, libperl-dev, libgdbm-dev, libdb-dev, libgnutls-dev, libtiff4-dev, python-dev, libx11-dev, uuid-dev
+Uploaders: Michal Bielicki , Gabriel Gunderson , William King , Mathieu Parent
+Build-Depends: debhelper (>= 7), wget, automake (>=1.9), autoconf, libtool,
+ unixodbc-dev, libasound2-dev, libcurl3-openssl-dev|libcurl4-openssl-dev,
+ libssl-dev, ncurses-dev, libogg-dev, libvorbis-dev, libperl-dev, libgdbm-dev,
+ libdb-dev, libgnutls-dev, libtiff4-dev, python-dev, libx11-dev, uuid-dev
Homepage: http://freeswitch.org/
Standards-Version: 3.9.1
-Vcs-Svn: http://svn.freeswitch.org/svn/freeswitch/trunk/
-Vcs-Browser: http://fisheye.freeswitch.org/browse/FreeSWITCH
+Vcs-Git: git://git.freeswitch.org/freeswitch.git
+Vcs-Browser: http://fisheye.freeswitch.org/browse/freeswitch.git
Package: freeswitch
Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, unixodbc, libasound2, libcurl3, openssl, libncurses5, libvorbis0a, libuuid1
+Depends: ${shlibs:Depends}, ${misc:Depends}
Recommends: freeswitch-lang-en
-Suggests: freeswitch-spidermonkey, freeswitch-lua, freeswitch-perl, freeswitch-sounds-music-8000, monit
+Suggests: freeswitch-spidermonkey, freeswitch-lua, freeswitch-perl,
+ freeswitch-sounds-music-8000, monit, openssl
Description: open source telephony platform
FreeSWITCH is an open source telephony platform designed to facilitate the
creation of voice and chat driven products scaling from a soft-phone up to a
@@ -48,8 +52,8 @@ Description: development libraries and header files for FreeSWITCH
gateway or a media server to host IVR applications using simple scripts or XML
to control the callflow.
.
- This package contains the include files used if you wish to compile a package which requires FreeSWITCH's
- source file headers.
+ This package contains the include files used if you wish to compile a package
+ which require FreeSWITCH's source file headers.
Package: freeswitch-spidermonkey
Architecture: any
@@ -123,6 +127,19 @@ Description: pass through AMR codec support for FreeSWITCH
.
This package contains the mod_amr codec module.
+Package: freeswitch-codec-passthru-amrwb
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, freeswitch
+Description: pass through AMRWB codec support for FreeSWITCH
+ FreeSWITCH is an open source telephony platform designed to facilitate the
+ creation of voice and chat driven products scaling from a soft-phone up to a
+ soft-switch. It can be used as a simple switching engine, a PBX, a media
+ gateway or a media server to host IVR applications using simple scripts or XML
+ to control the callflow.
+ .
+ This package contains the mod_amrwb codec module.
+
+
Package: freeswitch-codec-passthru-g729
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, freeswitch
@@ -139,7 +156,8 @@ Package: freeswitch-lang-en
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, freeswitch
Recommends: freeswitch-sounds-en-us-callie-8000
-Suggests: freeswitch-sounds-en-us-callie-16000, freeswitch-sounds-en-us-callie-32000, freeswitch-sounds-en-us-callie-48000
+Suggests: freeswitch-sounds-en-us-callie-16000, freeswitch-sounds-en-us-callie-32000,
+ freeswitch-sounds-en-us-callie-48000
Description: English language files for FreeSWITCH
FreeSWITCH is an open source telephony platform designed to facilitate the
creation of voice and chat driven products scaling from a soft-phone up to a
@@ -219,7 +237,8 @@ Package: freeswitch-lang-ru
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, freeswitch
Recommends: freeswitch-sounds-ru-ru-elena-8000
-Suggests: freeswitch-sounds-ru-ru-elena-16000, freeswitch-sounds-ru-ru-elena-32000, freeswitch-sounds-ru-ru-elena-48000
+Suggests: freeswitch-sounds-ru-ru-elena-16000, freeswitch-sounds-ru-ru-elena-32000,
+ freeswitch-sounds-ru-ru-elena-48000
Description: Russian language files for FreeSWITCH
FreeSWITCH is an open source telephony platform designed to facilitate the
creation of voice and chat driven products scaling from a soft-phone up to a
@@ -229,3 +248,18 @@ Description: Russian language files for FreeSWITCH
.
This package contains the mod_say_ru module and available language
configuration files.
+
+Package: freeswitch-freetdm
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, freeswitch
+Description: FreeTDM is a signaling and board API abstraction used mainly by the
+ FreeSWITCH project to place calls in TDM and analog telephony circuits. The library
+ was previously named "OpenZAP". Sangoma has worked along with the FreeSWITCH
+ developers in this library so Sangoma's customers can also use it to do custom
+ development. The library is still under heavy development but the overall API
+ does not change often. The intention of the library is to present a consistent
+ API for different telephony signaling stacks and board I/O APIs. FreeTDM can
+ either be used as a standalone API or along with FreeSWITCH as an endpoint
+ (mod_freetdm). If you want to use it as a part of FreeSWITCH remember following
+ the FreeSWITCH configuration section.
+ This package contains all the freetdm modules and libs and submodules
diff --git a/debian/copyright b/debian/copyright
index 45eb67b0c9..f95b7df2e0 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,51 +1,538 @@
This package was debianized by Michal Bielicki
- on Now 25, 2007.
-
-The current Debian maintainer is Nicholas Amorim
+ on Nov 25, 2007.
The source was downloaded from http://www.freewitch.org/
-Upstream authors:
-Anthony Minessale II
-Portions created by the Initial Developer are Copyright (C) 2006-2009
-the Initial Developer. All Rights Reserved.
+Upstream maintainers:
+ Current: Michal Bielicki
+ Past: Nicholas Amorim
+See changelog.Debian.gz for a full list of contributors.
-The PRIMARY AUTHORS are (and/or have been):
+The Initial Developer of the Original Code is
+Anthony Minessale II
+Portions created by the Initial Developer are Copyright (C)
+ the Initial Developer. All Rights Reserved.
- Anthony Minessale II - Primary developer of all core components
- and many of the included modules. Much of freeswitch is based on his work.
-
- Michael Jerris - Windows porter and responsible for the
- windows\msvc build system.
+ The PRIMARY AUTHORS are (and/or have been):
+
+ Anthony Minessale II - Primary developer of all core
+ components and many of the included modules. Much of freeswitch is based
+ on his work.
+
+ Michael Jerris - Windows porter and responsible for the
+ windows\msvc build system.
And here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS --
people who have submitted patches, reported bugs, and generally made Freeswitch
that much better:
- Brian K. West - For countless hours of work on BSD and Mac support, finding countless bugs, and moral support. Xcode project files.
- Joshua Colp - For his help making mod_exosip possible (which we are now getting rid of but oh well),
- and for just being a swell guy! (until he backstabbed us, c'est la vie)
- Michal "cypromis" Bielicki (michal.bielicki AT voiceworks.pl) - Solaris porting, and autotools enhancements, debian, rpm and solaris packaging.
- James Martelletti - All around cool guy (mod_syslog)
- Johny Kadarisman
- Yossi Neiman of Cartis Solutions, Inc. - implementation of mod_cdr (perldd, mysql, csv)
- Stefan Knoblich - Various patches and support. Thanks.
- Justin Unger - Lots of help with patches and SIP testing. Thanks!
- Paul D. Tinsley - Various patches and support.
- Ken Rice - - xmlcdr, sofia improvements, load testing.
- Neal Horman - conference improvements, switch_ivr menu additions and other tweaks.
- Johny Kadarisman - mod_python fixups.
- Michael Murdock - testing, documentation, bug finding and usability enhancements.
- Matt Klein
- Jonas Gauffin - Bugfixes and additions in mod_spidermonkey_odbc
- Damjan Jovanovic - mod_java
+ Brian K. West - For countless hours of work on BSD and Mac support, finding
+ countless bugs, and moral support. Xcode project files.
+ Joshua Colp - For his help making mod_exosip possible (which we are now
+ getting rid of but oh well), and for just being a swell guy!
+ Michal "cypromis" Bielicki (michal.bielicki AT voiceworks.pl) - Solaris
+ porting, and autotools enhancements, debian, rpm and solaris packaging.
+ James Martelletti - All around cool guy (mod_syslog)
+ Johny Kadarisman
+ Yossi Neiman of Cartis Solutions, Inc. -
+ implementation of mod_cdr (perldd, mysql, csv)
+ Stefan Knoblich - Sofia TLS, various patches and support. Thanks.
+ Justin Unger - Lots of help with patches and
+ SIP testing. Thanks!
+ Paul D. Tinsley - Various patches and support.
+ Ken Rice - - xmlcdr, sofia improvements, load
+ testing, 1 liners here and there.
+ Neal Horman - conference improvements, switch_ivr
+ menu additions and other tweaks.
+ Johny Kadarisman - mod_python fixups.
+ Michael Murdock - testing, documentation, bug
+ finding and usability enhancements.
+ Matt Klein
+ Jonas Gauffin - mod_cdr_odbc,
+ mod_spidermonkey_socket, Bugfixes and additions in mod_spidermonkey_odbc and
+ mod_spidermonkey, .net event socket library.
+ Damjan Jovanovic - mod_java
+ Juan Jose Comellas - Patch to switch_utils for arg
+ parsing.
+ Dale Thatcher - Additions to
+ mod_conference.
+ Simon Perreault & Marc Blanchet from Viagenie.ca - IPv6 Support.
A big THANK YOU goes to:
-Justin Cassidy - Build related cleanups and automatic build setup.
-Bret McDanel - Javascript Documentation, constant feedback and input, many other things I am sure I am forgetting.
+ Justin Cassidy - Build related cleanups and automatic build setup.
+ Bret McDanel - Javascript Documentation, constant feedback and input, many
+ other things I am sure I am forgetting.
+
+
+ MOZILLA PUBLIC LICENSE
+ Version 1.1
+
+ ---------------
+
+1. Definitions.
+
+ 1.0.1. "Commercial Use" means distribution or otherwise making the
+ Covered Code available to a third party.
+
+ 1.1. "Contributor" means each entity that creates or contributes to
+ the creation of Modifications.
+
+ 1.2. "Contributor Version" means the combination of the Original
+ Code, prior Modifications used by a Contributor, and the Modifications
+ made by that particular Contributor.
+
+ 1.3. "Covered Code" means the Original Code or Modifications or the
+ combination of the Original Code and Modifications, in each case
+ including portions thereof.
+
+ 1.4. "Electronic Distribution Mechanism" means a mechanism generally
+ accepted in the software development community for the electronic
+ transfer of data.
+
+ 1.5. "Executable" means Covered Code in any form other than Source
+ Code.
+
+ 1.6. "Initial Developer" means the individual or entity identified
+ as the Initial Developer in the Source Code notice required by Exhibit
+ A.
+
+ 1.7. "Larger Work" means a work which combines Covered Code or
+ portions thereof with code not governed by the terms of this License.
+
+ 1.8. "License" means this document.
+
+ 1.8.1. "Licensable" means having the right to grant, to the maximum
+ extent possible, whether at the time of the initial grant or
+ subsequently acquired, any and all of the rights conveyed herein.
+
+ 1.9. "Modifications" means any addition to or deletion from the
+ substance or structure of either the Original Code or any previous
+ Modifications. When Covered Code is released as a series of files, a
+ Modification is:
+ A. Any addition to or deletion from the contents of a file
+ containing Original Code or previous Modifications.
+
+ B. Any new file that contains any part of the Original Code or
+ previous Modifications.
+
+ 1.10. "Original Code" means Source Code of computer software code
+ which is described in the Source Code notice required by Exhibit A as
+ Original Code, and which, at the time of its release under this
+ License is not already Covered Code governed by this License.
+
+ 1.10.1. "Patent Claims" means any patent claim(s), now owned or
+ hereafter acquired, including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by grantor.
+
+ 1.11. "Source Code" means the preferred form of the Covered Code for
+ making modifications to it, including all modules it contains, plus
+ any associated interface definition files, scripts used to control
+ compilation and installation of an Executable, or source code
+ differential comparisons against either the Original Code or another
+ well known, available Covered Code of the Contributor's choice. The
+ Source Code can be in a compressed or archival form, provided the
+ appropriate decompression or de-archiving software is widely available
+ for no charge.
+
+ 1.12. "You" (or "Your") means an individual or a legal entity
+ exercising rights under, and complying with all of the terms of, this
+ License or a future version of this License issued under Section 6.1.
+ For legal entities, "You" includes any entity which controls, is
+ controlled by, or is under common control with You. For purposes of
+ this definition, "control" means (a) the power, direct or indirect,
+ to cause the direction or management of such entity, whether by
+ contract or otherwise, or (b) ownership of more than fifty percent
+ (50%) of the outstanding shares or beneficial ownership of such
+ entity.
+
+2. Source Code License.
+
+ 2.1. The Initial Developer Grant.
+ The Initial Developer hereby grants You a world-wide, royalty-free,
+ non-exclusive license, subject to third party intellectual property
+ claims:
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Initial Developer to use, reproduce,
+ modify, display, perform, sublicense and distribute the Original
+ Code (or portions thereof) with or without Modifications, and/or
+ as part of a Larger Work; and
+
+ (b) under Patents Claims infringed by the making, using or
+ selling of Original Code, to make, have made, use, practice,
+ sell, and offer for sale, and/or otherwise dispose of the
+ Original Code (or portions thereof).
+
+ (c) the licenses granted in this Section 2.1(a) and (b) are
+ effective on the date Initial Developer first distributes
+ Original Code under the terms of this License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent license is
+ granted: 1) for code that You delete from the Original Code; 2)
+ separate from the Original Code; or 3) for infringements caused
+ by: i) the modification of the Original Code or ii) the
+ combination of the Original Code with other software or devices.
+
+ 2.2. Contributor Grant.
+ Subject to third party intellectual property claims, each Contributor
+ hereby grants You a world-wide, royalty-free, non-exclusive license
+
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Contributor, to use, reproduce, modify,
+ display, perform, sublicense and distribute the Modifications
+ created by such Contributor (or portions thereof) either on an
+ unmodified basis, with other Modifications, as Covered Code
+ and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using, or
+ selling of Modifications made by that Contributor either alone
+ and/or in combination with its Contributor Version (or portions
+ of such combination), to make, use, sell, offer for sale, have
+ made, and/or otherwise dispose of: 1) Modifications made by that
+ Contributor (or portions thereof); and 2) the combination of
+ Modifications made by that Contributor with its Contributor
+ Version (or portions of such combination).
+
+ (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+ effective on the date Contributor first makes Commercial Use of
+ the Covered Code.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent license is
+ granted: 1) for any code that Contributor has deleted from the
+ Contributor Version; 2) separate from the Contributor Version;
+ 3) for infringements caused by: i) third party modifications of
+ Contributor Version or ii) the combination of Modifications made
+ by that Contributor with other software (except as part of the
+ Contributor Version) or other devices; or 4) under Patent Claims
+ infringed by Covered Code in the absence of Modifications made by
+ that Contributor.
+
+3. Distribution Obligations.
+
+ 3.1. Application of License.
+ The Modifications which You create or to which You contribute are
+ governed by the terms of this License, including without limitation
+ Section 2.2. The Source Code version of Covered Code may be
+ distributed only under the terms of this License or a future version
+ of this License released under Section 6.1, and You must include a
+ copy of this License with every copy of the Source Code You
+ distribute. You may not offer or impose any terms on any Source Code
+ version that alters or restricts the applicable version of this
+ License or the recipients' rights hereunder. However, You may include
+ an additional document offering the additional rights described in
+ Section 3.5.
+
+ 3.2. Availability of Source Code.
+ Any Modification which You create or to which You contribute must be
+ made available in Source Code form under the terms of this License
+ either on the same media as an Executable version or via an accepted
+ Electronic Distribution Mechanism to anyone to whom you made an
+ Executable version available; and if made available via Electronic
+ Distribution Mechanism, must remain available for at least twelve (12)
+ months after the date it initially became available, or at least six
+ (6) months after a subsequent version of that particular Modification
+ has been made available to such recipients. You are responsible for
+ ensuring that the Source Code version remains available even if the
+ Electronic Distribution Mechanism is maintained by a third party.
+
+ 3.3. Description of Modifications.
+ You must cause all Covered Code to which You contribute to contain a
+ file documenting the changes You made to create that Covered Code and
+ the date of any change. You must include a prominent statement that
+ the Modification is derived, directly or indirectly, from Original
+ Code provided by the Initial Developer and including the name of the
+ Initial Developer in (a) the Source Code, and (b) in any notice in an
+ Executable version or related documentation in which You describe the
+ origin or ownership of the Covered Code.
+
+ 3.4. Intellectual Property Matters
+ (a) Third Party Claims.
+ If Contributor has knowledge that a license under a third party's
+ intellectual property rights is required to exercise the rights
+ granted by such Contributor under Sections 2.1 or 2.2,
+ Contributor must include a text file with the Source Code
+ distribution titled "LEGAL" which describes the claim and the
+ party making the claim in sufficient detail that a recipient will
+ know whom to contact. If Contributor obtains such knowledge after
+ the Modification is made available as described in Section 3.2,
+ Contributor shall promptly modify the LEGAL file in all copies
+ Contributor makes available thereafter and shall take other steps
+ (such as notifying appropriate mailing lists or newsgroups)
+ reasonably calculated to inform those who received the Covered
+ Code that new knowledge has been obtained.
+
+ (b) Contributor APIs.
+ If Contributor's Modifications include an application programming
+ interface and Contributor has knowledge of patent licenses which
+ are reasonably necessary to implement that API, Contributor must
+ also include this information in the LEGAL file.
+
+ (c) Representations.
+ Contributor represents that, except as disclosed pursuant to
+ Section 3.4(a) above, Contributor believes that Contributor's
+ Modifications are Contributor's original creation(s) and/or
+ Contributor has sufficient rights to grant the rights conveyed by
+ this License.
+
+ 3.5. Required Notices.
+ You must duplicate the notice in Exhibit A in each file of the Source
+ Code. If it is not possible to put such notice in a particular Source
+ Code file due to its structure, then You must include such notice in a
+ location (such as a relevant directory) where a user would be likely
+ to look for such a notice. If You created one or more Modification(s)
+ You may add your name as a Contributor to the notice described in
+ Exhibit A. You must also duplicate this License in any documentation
+ for the Source Code where You describe recipients' rights or ownership
+ rights relating to Covered Code. You may choose to offer, and to
+ charge a fee for, warranty, support, indemnity or liability
+ obligations to one or more recipients of Covered Code. However, You
+ may do so only on Your own behalf, and not on behalf of the Initial
+ Developer or any Contributor. You must make it absolutely clear than
+ any such warranty, support, indemnity or liability obligation is
+ offered by You alone, and You hereby agree to indemnify the Initial
+ Developer and every Contributor for any liability incurred by the
+ Initial Developer or such Contributor as a result of warranty,
+ support, indemnity or liability terms You offer.
+
+ 3.6. Distribution of Executable Versions.
+ You may distribute Covered Code in Executable form only if the
+ requirements of Section 3.1-3.5 have been met for that Covered Code,
+ and if You include a notice stating that the Source Code version of
+ the Covered Code is available under the terms of this License,
+ including a description of how and where You have fulfilled the
+ obligations of Section 3.2. The notice must be conspicuously included
+ in any notice in an Executable version, related documentation or
+ collateral in which You describe recipients' rights relating to the
+ Covered Code. You may distribute the Executable version of Covered
+ Code or ownership rights under a license of Your choice, which may
+ contain terms different from this License, provided that You are in
+ compliance with the terms of this License and that the license for the
+ Executable version does not attempt to limit or alter the recipient's
+ rights in the Source Code version from the rights set forth in this
+ License. If You distribute the Executable version under a different
+ license You must make it absolutely clear that any terms which differ
+ from this License are offered by You alone, not by the Initial
+ Developer or any Contributor. You hereby agree to indemnify the
+ Initial Developer and every Contributor for any liability incurred by
+ the Initial Developer or such Contributor as a result of any such
+ terms You offer.
+
+ 3.7. Larger Works.
+ You may create a Larger Work by combining Covered Code with other code
+ not governed by the terms of this License and distribute the Larger
+ Work as a single product. In such a case, You must make sure the
+ requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+ If it is impossible for You to comply with any of the terms of this
+ License with respect to some or all of the Covered Code due to
+ statute, judicial order, or regulation then You must: (a) comply with
+ the terms of this License to the maximum extent possible; and (b)
+ describe the limitations and the code they affect. Such description
+ must be included in the LEGAL file described in Section 3.4 and must
+ be included with all distributions of the Source Code. Except to the
+ extent prohibited by statute or regulation, such description must be
+ sufficiently detailed for a recipient of ordinary skill to be able to
+ understand it.
+
+5. Application of this License.
+
+ This License applies to code to which the Initial Developer has
+ attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+ 6.1. New Versions.
+ Netscape Communications Corporation ("Netscape") may publish revised
+ and/or new versions of the License from time to time. Each version
+ will be given a distinguishing version number.
+
+ 6.2. Effect of New Versions.
+ Once Covered Code has been published under a particular version of the
+ License, You may always continue to use it under the terms of that
+ version. You may also choose to use such Covered Code under the terms
+ of any subsequent version of the License published by Netscape. No one
+ other than Netscape has the right to modify the terms applicable to
+ Covered Code created under this License.
+
+ 6.3. Derivative Works.
+ If You create or use a modified version of this License (which you may
+ only do in order to apply it to code which is not already Covered Code
+ governed by this License), You must (a) rename Your license so that
+ the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+ "MPL", "NPL" or any confusingly similar phrase do not appear in your
+ license (except to note that your license differs from this License)
+ and (b) otherwise make it clear that Your version of the license
+ contains terms which differ from the Mozilla Public License and
+ Netscape Public License. (Filling in the name of the Initial
+ Developer, Original Code or Contributor in the notice described in
+ Exhibit A shall not of themselves be deemed to be modifications of
+ this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+ COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+ DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+ THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+ IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+ YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+ COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+ OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+ 8.1. This License and the rights granted hereunder will terminate
+ automatically if You fail to comply with terms herein and fail to cure
+ such breach within 30 days of becoming aware of the breach. All
+ sublicenses to the Covered Code which are properly granted shall
+ survive any termination of this License. Provisions which, by their
+ nature, must remain in effect beyond the termination of this License
+ shall survive.
+
+ 8.2. If You initiate litigation by asserting a patent infringement
+ claim (excluding declatory judgment actions) against Initial Developer
+ or a Contributor (the Initial Developer or Contributor against whom
+ You file such action is referred to as "Participant") alleging that:
+
+ (a) such Participant's Contributor Version directly or indirectly
+ infringes any patent, then any and all rights granted by such
+ Participant to You under Sections 2.1 and/or 2.2 of this License
+ shall, upon 60 days notice from Participant terminate prospectively,
+ unless if within 60 days after receipt of notice You either: (i)
+ agree in writing to pay Participant a mutually agreeable reasonable
+ royalty for Your past and future use of Modifications made by such
+ Participant, or (ii) withdraw Your litigation claim with respect to
+ the Contributor Version against such Participant. If within 60 days
+ of notice, a reasonable royalty and payment arrangement are not
+ mutually agreed upon in writing by the parties or the litigation claim
+ is not withdrawn, the rights granted by Participant to You under
+ Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+ the 60 day notice period specified above.
+
+ (b) any software, hardware, or device, other than such Participant's
+ Contributor Version, directly or indirectly infringes any patent, then
+ any rights granted to You by such Participant under Sections 2.1(b)
+ and 2.2(b) are revoked effective as of the date You first made, used,
+ sold, distributed, or had made, Modifications made by that
+ Participant.
+
+ 8.3. If You assert a patent infringement claim against Participant
+ alleging that such Participant's Contributor Version directly or
+ indirectly infringes any patent where such claim is resolved (such as
+ by license or settlement) prior to the initiation of patent
+ infringement litigation, then the reasonable value of the licenses
+ granted by such Participant under Sections 2.1 or 2.2 shall be taken
+ into account in determining the amount or value of any payment or
+ license.
+
+ 8.4. In the event of termination under Sections 8.1 or 8.2 above,
+ all end user license agreements (excluding distributors and resellers)
+ which have been validly granted by You or any distributor hereunder
+ prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+ (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+ DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+ OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+ ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+ CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+ WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+ COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+ INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+ LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+ RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+ PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+ EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+ THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+ The Covered Code is a "commercial item," as that term is defined in
+ 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+ software" and "commercial computer software documentation," as such
+ terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+ C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+ all U.S. Government End Users acquire Covered Code with only those
+ rights set forth herein.
+
+11. MISCELLANEOUS.
+
+ This License represents the complete agreement concerning subject
+ matter hereof. If any provision of this License is held to be
+ unenforceable, such provision shall be reformed only to the extent
+ necessary to make it enforceable. This License shall be governed by
+ California law provisions (except to the extent applicable law, if
+ any, provides otherwise), excluding its conflict-of-law provisions.
+ With respect to disputes in which at least one party is a citizen of,
+ or an entity chartered or registered to do business in the United
+ States of America, any litigation relating to this License shall be
+ subject to the jurisdiction of the Federal Courts of the Northern
+ District of California, with venue lying in Santa Clara County,
+ California, with the losing party responsible for costs, including
+ without limitation, court costs and reasonable attorneys' fees and
+ expenses. The application of the United Nations Convention on
+ Contracts for the International Sale of Goods is expressly excluded.
+ Any law or regulation which provides that the language of a contract
+ shall be construed against the drafter shall not apply to this
+ License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+ As between Initial Developer and the Contributors, each party is
+ responsible for claims and damages arising, directly or indirectly,
+ out of its utilization of rights under this License and You agree to
+ work with Initial Developer and Contributors to distribute such
+ responsibility on an equitable basis. Nothing herein is intended or
+ shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+ Initial Developer may designate portions of the Covered Code as
+ "Multiple-Licensed". "Multiple-Licensed" means that the Initial
+ Developer permits you to utilize portions of the Covered Code under
+ Your choice of the NPL or the alternative licenses, if any, specified
+ by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+ ``The contents of this file are subject to the Mozilla Public License
+ Version 1.1 (the "License"); you may not use this file except in
+ compliance with the License. You may obtain a copy of the License at
+ http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ License for the specific language governing rights and limitations
+ under the License.
+
+ The Original Code is ______________________________________.
+
+ The Initial Developer of the Original Code is ________________________.
+ Portions created by ______________________ are Copyright (C) ______
+ _______________________. All Rights Reserved.
+
+ Contributor(s): ______________________________________.
+
+ Alternatively, the contents of this file may be used under the terms
+ of the _____ license (the "[___] License"), in which case the
+ provisions of [______] License are applicable instead of those
+ above. If you wish to allow use of your version of this file only
+ under the terms of the [____] License and not to allow others to use
+ your version of this file under the MPL, indicate your decision by
+ deleting the provisions above and replace them with the notice and
+ other provisions required by the [___] License. If you do not delete
+ the provisions above, a recipient may use your version of this file
+ under either the MPL or the [___] License."
+
+ [NOTE: The text of this Exhibit A may differ slightly from the text of
+ the notices in the Source Code files of the Original Code. You should
+ use the text of this Exhibit A rather than the text found in the
+ Original Code Source Code for Your Modifications.]
+
-You are free to distribute this software under the terms of
-the MPL Mozilla Public License. On Debian systems, the complete
-text of the GNU General Public License can be found in the file
-'/usr/share/common-licenses/MPL'.
diff --git a/debian/freeswitch-codec-passthru-amrwb.install b/debian/freeswitch-codec-passthru-amrwb.install
new file mode 100644
index 0000000000..022462d001
--- /dev/null
+++ b/debian/freeswitch-codec-passthru-amrwb.install
@@ -0,0 +1 @@
+opt/freeswitch/mod/mod_amrwb.so*
diff --git a/debian/freeswitch-freetdm.conffiles b/debian/freeswitch-freetdm.conffiles
new file mode 100644
index 0000000000..f14e37f3db
--- /dev/null
+++ b/debian/freeswitch-freetdm.conffiles
@@ -0,0 +1,6 @@
+opt/freeswitch/conf/tones.conf
+opt/freeswitch/conf/autoload_configs/freetdm.conf.xml
+opt/freeswitch/conf/pika.conf
+opt/freeswitch/conf/freetdm.conf
+opt/freeswitch/conf/wanpipe.conf
+opt/freeswitch/conf/zt.conf
diff --git a/debian/freeswitch-freetdm.install b/debian/freeswitch-freetdm.install
new file mode 100644
index 0000000000..cdca887dd3
--- /dev/null
+++ b/debian/freeswitch-freetdm.install
@@ -0,0 +1,10 @@
+opt/freeswitch/conf/tones.conf
+opt/freeswitch/conf/autoload_configs/freetdm.conf.xml
+opt/freeswitch/conf/pika.conf
+opt/freeswitch/conf/freetdm.conf
+opt/freeswitch/conf/wanpipe.conf
+opt/freeswitch/conf/zt.conf
+opt/freeswitch/lib/libfreetdm.so*
+opt/freeswitch/mod/mod_freetdm.so*
+opt/freeswitch/mod/ftm*.so*
+
diff --git a/debian/freeswitch-python.config b/debian/freeswitch-python.config
new file mode 100644
index 0000000000..1c1746c875
--- /dev/null
+++ b/debian/freeswitch-python.config
@@ -0,0 +1 @@
+opt/freeswitch/conf/autoload_configs/python.conf.xml
diff --git a/debian/freeswitch-python.install b/debian/freeswitch-python.install
new file mode 100644
index 0000000000..2773f0c780
--- /dev/null
+++ b/debian/freeswitch-python.install
@@ -0,0 +1,3 @@
+opt/freeswitch/conf/autoload_configs/python.conf.xml
+opt/freeswitch/mod/mod_python.so*
+usr/lib/python2.*/*-packages/freeswitch.py*
diff --git a/debian/freeswitch.conffiles b/debian/freeswitch.conffiles
index a6f9ce380f..20da33de15 100644
--- a/debian/freeswitch.conffiles
+++ b/debian/freeswitch.conffiles
@@ -83,10 +83,8 @@
/opt/freeswitch/conf/ivr_menus/demo_ivr.xml
/opt/freeswitch/conf/jingle_profiles/client.xml
/opt/freeswitch/conf/jingle_profiles/server.xml
-/opt/freeswitch/conf/m3ua.conf
/opt/freeswitch/conf/mime.types
/opt/freeswitch/conf/notify-voicemail.tpl
-/opt/freeswitch/conf/pika.conf
/opt/freeswitch/conf/sip_profiles/external/example.xml
/opt/freeswitch/conf/sip_profiles/external.xml
/opt/freeswitch/conf/sip_profiles/internal/example.xml
@@ -94,8 +92,6 @@
/opt/freeswitch/conf/sip_profiles/internal.xml
/opt/freeswitch/conf/skinny_profiles/internal.xml
/opt/freeswitch/conf/tetris.ttml
-/opt/freeswitch/conf/tones.conf
/opt/freeswitch/conf/vars.xml
/opt/freeswitch/conf/voicemail.tpl
/opt/freeswitch/conf/web-vm.tpl
-/opt/freeswitch/conf/zt.conf
diff --git a/debian/freeswitch.init b/debian/freeswitch.init
index 36129cbe90..ddde2f5518 100755
--- a/debian/freeswitch.init
+++ b/debian/freeswitch.init
@@ -5,7 +5,7 @@
# Required-Stop: $network $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
-# Short-Description: The FreeSwitch Voice Switching System
+# Short-Description: The FreeSWITCH Voice Switching System
# Description: An advanced platform for voice services
### END INIT INFO
@@ -16,7 +16,7 @@
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/opt/freeswitch/bin
-DESC="FreeSwitch Voice Switching System"
+DESC="FreeSWITCH Voice Switching System"
NAME=freeswitch
DAEMON=/opt/freeswitch/bin/$NAME
USER=freeswitch
@@ -48,6 +48,24 @@ fi
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
+#
+# Function that sets ulimit values for the daemon
+#
+do_setlimits() {
+ ulimit -c unlimited
+ ulimit -d unlimited
+ ulimit -f unlimited
+ ulimit -i unlimited
+ ulimit -n 999999
+ ulimit -q unlimited
+ ulimit -u unlimited
+ ulimit -v unlimited
+ ulimit -x unlimited
+ ulimit -s 240
+ ulimit -l unlimited
+ return 0
+}
+
#
# Function that starts the daemon/service
#
@@ -59,6 +77,7 @@ do_start()
# 2 if daemon could not be started
start-stop-daemon -d $WORKDIR -c $USER --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
+ do_setlimits
start-stop-daemon -d $WORKDIR -c $USER --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$FREESWITCH_PARAMS \
|| return 2
diff --git a/debian/freeswitch.install b/debian/freeswitch.install
index 087d167859..3c838cde94 100644
--- a/debian/freeswitch.install
+++ b/debian/freeswitch.install
@@ -1,9 +1,9 @@
opt/freeswitch/bin/freeswitch
opt/freeswitch/bin/fs_cli
+opt/freeswitch/bin/fs_encode
opt/freeswitch/bin/fs_ivrd
opt/freeswitch/bin/fsxs
opt/freeswitch/bin/gentls_cert
-opt/freeswitch/bin/scripts/*
opt/freeswitch/conf/autoload_configs/acl.conf.xml
opt/freeswitch/conf/autoload_configs/alsa.conf.xml
opt/freeswitch/conf/autoload_configs/callcenter.conf.xml
@@ -31,7 +31,6 @@ opt/freeswitch/conf/autoload_configs/memcache.conf.xml
opt/freeswitch/conf/autoload_configs/modules.conf.xml
opt/freeswitch/conf/autoload_configs/nibblebill.conf.xml
opt/freeswitch/conf/autoload_configs/opal.conf.xml
-opt/freeswitch/conf/autoload_configs/openzap.conf.xml
opt/freeswitch/conf/autoload_configs/pocketsphinx.conf.xml
opt/freeswitch/conf/autoload_configs/portaudio.conf.xml
opt/freeswitch/conf/autoload_configs/post_load_modules.conf.xml
@@ -91,11 +90,8 @@ opt/freeswitch/conf/fur_elise.ttml
opt/freeswitch/conf/ivr_menus/demo_ivr.xml
opt/freeswitch/conf/jingle_profiles/client.xml
opt/freeswitch/conf/jingle_profiles/server.xml
-opt/freeswitch/conf/m3ua.conf
opt/freeswitch/conf/mime.types
opt/freeswitch/conf/notify-voicemail.tpl
-opt/freeswitch/conf/openzap.conf
-opt/freeswitch/conf/pika.conf
opt/freeswitch/conf/sip_profiles/external/example.xml
opt/freeswitch/conf/sip_profiles/external.xml
opt/freeswitch/conf/sip_profiles/internal/example.xml
@@ -103,69 +99,71 @@ opt/freeswitch/conf/sip_profiles/internal-ipv6.xml
opt/freeswitch/conf/sip_profiles/internal.xml
opt/freeswitch/conf/skinny_profiles/internal.xml
opt/freeswitch/conf/tetris.ttml
-opt/freeswitch/conf/tones.conf
opt/freeswitch/conf/vars.xml
opt/freeswitch/conf/voicemail.tpl
-opt/freeswitch/conf/wanpipe.conf
opt/freeswitch/conf/web-vm.tpl
-opt/freeswitch/conf/zt.conf
opt/freeswitch/htdocs/*
opt/freeswitch/lib/libfreeswitch*.so*
-opt/freeswitch/lib/libopenzap*.so*
+opt/freeswitch/mod/mod_avmd.so*
+opt/freeswitch/mod/mod_bv.so*
opt/freeswitch/mod/mod_callcenter.so*
opt/freeswitch/mod/mod_cdr_csv.so*
opt/freeswitch/mod/mod_celt.so*
opt/freeswitch/mod/mod_cidlookup.so*
opt/freeswitch/mod/mod_cluechoo.so*
+opt/freeswitch/mod/mod_console.so*
+opt/freeswitch/mod/mod_codec2.so*
opt/freeswitch/mod/mod_commands.so*
opt/freeswitch/mod/mod_conference.so*
opt/freeswitch/mod/mod_console.so*
opt/freeswitch/mod/mod_curl.so*
+opt/freeswitch/mod/mod_db.so*
opt/freeswitch/mod/mod_dialplan*.so*
opt/freeswitch/mod/mod_dingaling.so*
opt/freeswitch/mod/mod_directory.so*
+opt/freeswitch/mod/mod_distributor.so*
opt/freeswitch/mod/mod_dptools.so*
opt/freeswitch/mod/mod_easyroute.so*
opt/freeswitch/mod/mod_enum.so*
opt/freeswitch/mod/mod_esf.so*
opt/freeswitch/mod/mod_event_*.so*
opt/freeswitch/mod/mod_expr.so*
-opt/freeswitch/mod/mod_spandsp.so*
opt/freeswitch/mod/mod_fifo.so*
+opt/freeswitch/mod/mod_file_string.so*
+opt/freeswitch/mod/mod_flite.so*
opt/freeswitch/mod/mod_fsv.so*
+opt/freeswitch/mod/mod_hash.so*
opt/freeswitch/mod/mod_h26x.so*
opt/freeswitch/mod/mod_ilbc.so*
opt/freeswitch/mod/mod_lcr.so*
-opt/freeswitch/mod/mod_db.so*
-opt/freeswitch/mod/mod_hash.so*
+opt/freeswitch/mod/mod_limit.so*
opt/freeswitch/mod/mod_local_stream.so*
opt/freeswitch/mod/mod_logfile.so*
opt/freeswitch/mod/mod_loopback.so*
+opt/freeswitch/mod/mod_memcache.so*
+opt/freeswitch/mod/mod_mp4v.so*
opt/freeswitch/mod/mod_native_file.so*
opt/freeswitch/mod/mod_nibblebill.so*
-opt/freeswitch/mod/mod_openzap.so
opt/freeswitch/mod/mod_portaudio.so*
+opt/freeswitch/mod/mod_portaudio_stream.so*
+opt/freeswitch/mod/mod_redis.so*
opt/freeswitch/mod/mod_rss.so*
opt/freeswitch/mod/mod_shout.so*
+opt/freeswitch/mod/mod_silk.so*
opt/freeswitch/mod/mod_siren.so*
opt/freeswitch/mod/mod_skinny.so*
opt/freeswitch/mod/mod_skypopen.so*
opt/freeswitch/mod/mod_sndfile.so*
opt/freeswitch/mod/mod_snom.so*
opt/freeswitch/mod/mod_sofia.so*
+opt/freeswitch/mod/mod_spandsp.so*
opt/freeswitch/mod/mod_speex.so*
opt/freeswitch/mod/mod_spy.so*
opt/freeswitch/mod/mod_syslog.so*
+opt/freeswitch/mod/mod_theora.so*
opt/freeswitch/mod/mod_tone_stream.so*
opt/freeswitch/mod/mod_tts_commandline.so*
opt/freeswitch/mod/mod_valet_parking.so*
opt/freeswitch/mod/mod_vmd.so*
opt/freeswitch/mod/mod_voicemail.so*
opt/freeswitch/mod/mod_xml_*.so*
-opt/freeswitch/mod/ozmod_analog_em.so*
-opt/freeswitch/mod/ozmod_analog.so*
-opt/freeswitch/mod/ozmod_isdn.so*
-opt/freeswitch/mod/ozmod_skel.so*
-opt/freeswitch/mod/ozmod_ss7_boost.so*
-opt/freeswitch/mod/ozmod_wanpipe.so*
-opt/freeswitch/mod/ozmod_zt.so*
diff --git a/debian/postinst b/debian/postinst
index 31a2536d4e..696171eb5a 100755
--- a/debian/postinst
+++ b/debian/postinst
@@ -24,9 +24,16 @@ case "$1" in
if ! getent passwd freeswitch >/dev/null; then
adduser --disabled-password --quiet --system \
--home /opt/freeswitch \
- --gecos "FreeSwitch Voice Platform" --ingroup daemon \
+ --gecos "FreeSWITCH Voice Platform" --ingroup daemon \
freeswitch
adduser freeswitch audio
+ else
+ if [ "$(getent passwd freeswitch | cut -d : -f 6)" != "/opt/freeswitch" ]; then
+ echo "Error: pre-existing freeswitch user with non-standard home directory." >&2
+ exit 1
+ fi
+ usermod -d /opt/freeswitch -c "FreeSWITCH daemon,,," \
+ -g daemon -G audio freeswitch
fi
mkdir -p /opt/freeswitch
diff --git a/debian/postrm b/debian/postrm
index 9dbbeb0246..97718dfacd 100755
--- a/debian/postrm
+++ b/debian/postrm
@@ -1,5 +1,5 @@
#!/bin/sh
-# postrm script for openfire
+# postrm script for freeswitch
#
# see: dh_installdeb(1)
diff --git a/debian/rules b/debian/rules
index 114ad64f34..94aee73a00 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,40 +1,40 @@
#!/usr/bin/make -f
-# Sample debian/rules that uses debhelper.
-# This file is public domain software, originally written by Joey Hess.
# Uncomment this to turn on verbose mode.
export DH_VERBOSE=1
export DH_OPTIONS
export DEB_DH_INSTALL_SOURCEDIR=debian/tmp
-export PASSTHRU_CODEC_MODULES=codecs/mod_g729 codecs/mod_g723_1 codecs/mod_amr
+export PASSTHRU_CODEC_MODULES=codecs/mod_g729 codecs/mod_g723_1 codecs/mod_amr codecs/mod_amrwb
# Modules listed by those built by default, then those that are added in this package
-export APPLICATIONS_MODULES=applications/mod_cluechoo applications/mod_commands applications/mod_conference applications/mod_dptools \
- applications/mod_enum applications/mod_esf applications/mod_expr applications/mod_fifo applications/mod_fsv \
- applications/mod_hash applications/mod_db applications/mod_valet_parking applications/mod_voicemail applications/mod_rss \
- applications/mod_spandsp applications/mod_cidlookup applications/mod_curl applications/mod_easyroute \
- applications/mod_lcr applications/mod_nibblebill applications/mod_snom \
- applications/mod_spy applications/mod_vmd applications/mod_directory applications/mod_callcenter
-export ASR_TTS_MODULES=asr_tts/mod_tts_commandline
-export CODECS_MODULES=codecs/mod_ilbc codecs/mod_h26x codecs/mod_speex codecs/mod_siren codecs/mod_celt
-export DIALPLANS_MODULES=dialplans/mod_dialplan_asterisk dialplans/mod_dialplan_directory dialplans/mod_dialplan_xml
-export DIRECTORIES_MODULES=
-export DOTNET_MODULES=
-export ENDPOINTS_MODULES=endpoints/mod_dingaling endpoints/mod_portaudio endpoints/mod_sofia \
- endpoints/mod_loopback ../../libs/openzap/mod_openzap endpoints/mod_skypopen \
- endpoints/mod_skinny
+export APPLICATION_MODULES_AE= applications/mod_avmd applications/mod_callcenter applications/mod_cidlookup applications/mod_cluechoo \
+ applications/mod_commands applications/mod_conference applications/mod_curl applications/mod_db applications/mod_directory \
+ applications/mod_distributor applications/mod_dptools applications/mod_easyroute applications/mod_enum \
+ applications/mod_esf applications/mod_expr
+export APPLICATION_MODULES_FM= applications/mod_fifo applications/mod_fsv applications/mod_hash applications/mod_lcr applications/mod_limit \
+ applications/mod_memcache
+export APPLICATION_MODULES_NY= applications/mod_nibblebill applications/mod_redis applications/mod_rss applications/mod_snom \
+ applications/mod_spandsp applications/mod_spy applications/mod_stress \
+ applications/mod_valet_parking applications/mod_vmd applications/mod_voicemail
+
+export APPLICATIONS_MODULES= $(APPLICATION_MODULES_AE) $(APPLICATION_MODULES_FM) $(APPLICATION_MODULES_NY) $(APPLICATION_MODULES_VZ)
+export ASR_TTS_MODULES= asr_tts/mod_pocketsphinx asr_tts/mod_flite asr_tts/mod_tts_commandline
+export CODECS_MODULES= codecs/mod_bv codecs/mod_h26x codecs/mod_speex codecs/mod_celt codecs/mod_codec2 codecs/mod_ilbc codecs/mod_mp4v \
+ codecs/mod_silk codecs/mod_siren codecs/mod_theora
+export DIALPLANS_MODULES= dialplans/mod_dialplan_asterisk dialplans/mod_dialplan_directory dialplans/mod_dialplan_xml
+export ENDPOINTS_MODULES= endpoints/mod_dingaling endpoints/mod_portaudio endpoints/mod_sofia endpoints/mod_loopback \
+ ../../libs/freetdm/mod_freetdm endpoints/mod_skypopen endpoints/mod_skinny
export EVENT_HANDLERS_MODULES=event_handlers/mod_event_multicast event_handlers/mod_event_socket event_handlers/mod_cdr_csv
-export FORMATS_MODULES=formats/mod_local_stream formats/mod_native_file formats/mod_sndfile formats/mod_tone_stream formats/mod_shout
+export FORMATS_MODULES= formats/mod_file_string formats/mod_local_stream formats/mod_native_file formats/mod_portaudio_stream \
+ formats/mod_shout formats/mod_sndfile formats/mod_tone_stream
export LANGUAGES_MODULES=languages/mod_spidermonkey languages/mod_perl languages/mod_lua languages/mod_python
export LOGGERS_MODULES=loggers/mod_console loggers/mod_logfile loggers/mod_syslog
export SAY_MODULES=say/mod_say_en say/mod_say_it say/mod_say_de say/mod_say_fr say/mod_say_es say/mod_say_nl say/mod_say_ru
-export TIMERS_MODULES=
-export DISABLED_MODULES=applications/mod_memcache applications/mod_soundtouch directories/mod_ldap languages/mod_java \
- asr_tts/mod_cepstral asr_tts/mod_lumenvox endpoints/mod_wanpipe \
- event_handlers/mod_event_test event_handlers/mod_radius_cdr event_handlers/mod_zeroconf
export XML_INT_MODULES=xml_int/mod_xml_rpc xml_int/mod_xml_curl xml_int/mod_xml_cdr
-export MYMODULES=$(PASSTHRU_CODEC_MODULES) $(APPLICATIONS_MODULES) $(ASR_TTS_MODULES) $(CODECS_MODULES) $(DIALPLANS_MODULES) $(DIRECTORIES_MODULES) $(DOTNET_MODULES) $(ENDPOINTS_MODULES) $(EVENT_HANDLERS_MODULES) $(FORMATS_MODULES) $(LANGUAGES_MODULES) $(LOGGERS_MODULES) $(SAY_MODULES) $(TIMERS_MODULES) $(XML_INT_MODULES)
+export MYMODULES= $(PASSTHRU_CODEC_MODULES) $(APPLICATIONS_MODULES) $(ASR_TTS_MODULES) $(CODECS_MODULES) $(DIALPLANS_MODULES) $(ENDPOINTS_MODULES) $(EVENT_HANDLERS_MODULES) $(FORMATS_MODULES) $(LANGUAGES_MODULES) $(LOGGERS_MODULES) $(SAY_MODULES) $(XML_INT_MODULES)
export MODULES=$(MYMODULES)
+
+
ifndef AUTOCONF
AUTOCONFS := $(wildcard /usr/bin/autoconf*)
AUTOCONF = $(shell which autoconf)
@@ -57,6 +57,116 @@ ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
FEATURES += --disable-optimization
endif
+.pc/applied-patches:
+ @echo
+ @echo \ \ Sorry, currently this package cannot be built directly from upstream
+ @echo \ \ source git/tarball: patches are needed for policy compliance, and the
+ @echo \ \ "new 3.0 (quilt) source format requires patches to be already applied."
+ @echo
+ @echo \ \ Please first convert this tree by running:
+ @echo -e \\t./debian/rules upstream-convert
+ @echo
+ @echo \ \ Note that this will insert an entry in debian/changelog, rename the
+ @echo \ \ current directory to the version number there, create a .orig.tar.bz2
+ @echo \ \ archive and apply all the patches in debian/patches/series.
+ @echo
+ @echo \ \ Using git-buildpackage is not recommended for now.
+ @echo
+ @exit 1
+
+upstream-convert:
+ @dh_testdir
+ @test -s .pc/applied-patches && \
+ echo "Aborted: patches are already applied." && \
+ exit 1 || exit 0
+ # update (or not) version number in debian/changelog
+ @set -e ; \
+ echo Checking version number ; \
+ v1="$$(dpkg-parsechangelog | sed -e '/^Version: / ! d' -e 's/^Version: //')" ; \
+ v2="$${v1}" ; \
+ echo " Current version: $${v1}" ; \
+ if [ "$$(which git)" = "" -o ! -d .git ] ; then \
+ echo Git not available. Keeping current version number. ; \
+ exit 0 ; \
+ fi ; \
+ if [ "$$(which debchange)" = "" ] ; then \
+ echo debchange not available. Keeping current version number. ; \
+ exit 0 ; \
+ fi ; \
+ if echo -n "$${v1}" | grep -q '~git\.[a-z0-9]\+\.20[0-9]\{6\}\.[0-9]\+-[^-]\+$$' ; then \
+ maj1="$$(echo -n "$${v1}" | sed -e 's/^\([^.]\+\)\..*$$/\1/')" ; \
+ min1="$$(echo -n "$${v1}" | sed -e 's/^[^.]\+\.\([^.]\+\)\..*$$/\1/')" ; \
+ mic1="$$(echo -n "$${v1}" | sed -e 's/^[^.]\+\.[^.]\+\.\([a-zA-Z0-9]\+\).*$$/\1/')" ; \
+ b1="$$(echo -n "$${v1}" | sed -e 's/^.*~git\.\([a-z0-9]\+\)\.\(20[0-9]\{6\}\)\.[0-9]\+-[^-]\+$$/\1/')" ; \
+ d1="$$(echo -n "$${v1}" | sed -e 's/^.*\.\(20[0-9]\{6\}\)\.[0-9]\+-[^-]\+$$/\1/')" ; \
+ n1="$$(echo -n "$${v1}" | sed -e 's/^.*\.20[0-9]\{6\}\.\([0-9]\+\)-[^-]\+$$/\1/')" ; \
+ maj2="$$(sed -e '/^AC_SUBST(SWITCH_VERSION_MAJOR/ ! d' -e 's/^.*\[\([^\[]\+\)\][^\]]*$$/\1/' configure.in)" ; \
+ min2="$$(sed -e '/^AC_SUBST(SWITCH_VERSION_MINOR/ ! d' -e 's/^.*\[\([^\[]\+\)\][^\]]*$$/\1/' configure.in)" ; \
+ mic2="$$(sed -e '/^AC_SUBST(SWITCH_VERSION_MICRO/ ! d' -e 's/^.*\[\([^\[]\+\)\][^\]]*$$/\1/' configure.in)" ; \
+ b2="$$(git branch | sed -e '/^[^*]/ d' -e 's/* \(.*\)/\1/')" ; \
+ d2="$$(TZ=UTC git log --date=local -1 --format='%ai' | sed -e 's/^\(....\).\(..\).\(..\).*$$/\1\2\3/')" ; \
+ n2="$$(TZ=UTC git log --date=local --format=oneline --since="$${d2::4}-$${d2:4:2}-$${d2:6:2} 00:00" | wc -l)" ; \
+ if [ "$${b2}" != "$$(echo "$${b2}" | tr -dc a-z0-9)" ] ; then \
+ echo Invalid branch name "'$${b2}'". Aborted. ; \
+ exit 1; \
+ fi ; \
+ if [ "$${b1}.$${d1}.$${n1}" != "$${b2}.$${d2}.$${n2}" \
+ -o "$${maj1}.$${min1}.$${mic1}" != "$${maj2}.$${min2}.$${mic2}" ] ; then \
+ v2="$$(echo -n "$${maj2}.$${min2}.$${mic2}")" ; \
+ v2="$${v2}$$(echo -n "$${v1}" | sed -e 's/^[^.]\+\.[^.]\+\.[^.]\+\(.*\)~git\..*$$/\1/')" ; \
+ v2="$${v2}~git.$${b2}.$${d2}.$${n2}-1" ; \
+ echo " New version: $${v2}" ; \
+ echo Updating debian/changelog with new version number ; \
+ debchange -v "$${v2}" "New upstream release" ; \
+ else \
+ echo Version number already correct, no change. ; \
+ fi ; \
+ else \
+ echo 'Not a ~git. version number. Keeping current version number.' ; \
+ fi
+ # rename (or not) current directory to match packagename-version.number
+ @set -e ; \
+ echo Checking directory name ; \
+ d1="$$(basename "$$(cd . && echo "$$PWD")")" ; \
+ d2="$$(dpkg-parsechangelog | sed -e '/^Source: / ! d' -e 's/^Source: //')" ; \
+ d2="$${d2}-$$(dpkg-parsechangelog | sed -e '/^Version: / ! d' -e 's/^Version: \(.*\)-[^-]\+$$/\1/')" ; \
+ if [ "$${d1}" != "$${d2}" ] ; then \
+ if [ -e "../$${d2}" ] ; then \
+ test . -ef "../$${d2}" && exit 0 ; \
+ echo Aborted: directory "../$${d2}" already exists. ; \
+ exit 1 ; \
+ fi ; \
+ echo Renaming current directory to "$${d2}" ; \
+ mv ../$${d1} ../$${d2} ; \
+ fi
+ # create .orig.tar.bz2
+ @set -e ; \
+ n="$$(dpkg-parsechangelog | sed -e '/^Source: / ! d' -e 's/^Source: //')" ; \
+ d="$${n}-$$(dpkg-parsechangelog | sed -e '/^Version: / ! d' -e 's/^Version: \(.*\)-[^-]\+$$/\1/')" ; \
+ n="$${n}_$$(dpkg-parsechangelog | sed -e '/^Version: / ! d' -e 's/^Version: \(.*\)-[^-]\+$$/\1/').orig.tar.bz2" ; \
+ echo "Creating source archive $${n}" ; \
+ cd .. && tar cjf "$${n}" --exclude='.git*' "$${d}"
+ # apply patches
+ @set -e ; \
+ echo "Applying patches in debian/patches/series" ; \
+ QUILT_PATCHES=debian/patches ; \
+ export QUILT_PATCHES ; \
+ while quilt next ; do \
+ quilt push -v ; \
+ quilt refresh ; \
+ done
+ # remind user to change dir
+ @echo Done.
+ @echo
+ @if [ "$(CURDIR)" != "$$PWD" ] ; then \
+ echo \ \ You should now tell your shell to update its current working directory: ; \
+ echo -e \\t'cd $$(pwd)' ; \
+ echo \ \ or ; \
+ echo -e "\\tcd $$PWD" ; \
+ echo ; \
+ fi
+
+
config.status: configure
dh_testdir
rm -f modules.conf
@@ -65,15 +175,12 @@ config.status: configure
for i in $(MODULES); do echo $$i >> modules.conf; done
./configure --prefix=/opt/freeswitch --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) ${FEATURES}
-configure:
- if test ! -f Makefile.in ; then \
- if test -f ./bootstrap.sh ; then \
- AUTOCONF=${AUTOCONF} ./bootstrap.sh ; \
- else \
- echo "No Makefile.in and no known way to bootstrap." ; \
- exit 1; \
- fi; \
- fi;
+configure: bootstrap.sh # .pc/applied-patches
+ dh_testdir
+ test -e /usr/share/misc/config.sub && cp -f /usr/share/misc/config.sub build/config/config.sub
+ test -e /usr/share/misc/config.guess && cp -f /usr/share/misc/config.guess build/config/config.guess
+ AUTOCONF=${AUTOCONF} ./bootstrap.sh
+
build: build-stamp
build-stamp: config.status
@@ -83,19 +190,13 @@ build-stamp: config.status
touch $@
-clean:
+clean: # .pc/applied-patches
dh_testdir
dh_testroot
rm -f build-stamp
-$(MAKE) update-clean
-ifneq "$(wildcard /usr/share/misc/config.sub)" ""
- cp -f /usr/share/misc/config.sub build/config/config.sub
-endif
-ifneq "$(wildcard /usr/share/misc/config.guess)" ""
- cp -f /usr/share/misc/config.guess build/config/config.guess
-endif
- rm -f config.status
+ rm -f configure config.status
rm -f */*/config.status
rm -f */*/*/config.status
dh_clean
@@ -103,8 +204,8 @@ endif
install: build
dh_testdir
dh_testroot
- dh_clean -k
- dh_installdirs -A --sourcedir=debian/tmp
+ dh_prep
+ dh_installdirs -A
VERBOSE=1 $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install
@@ -123,11 +224,12 @@ binary-arch: build install
cp debian/monit/freeswitch.monitrc debian/freeswitch/etc/monit/freeswitch.monitrc
dh_install --sourcedir=debian/tmp
dh_link
- dh_strip --dbg-package=freeswitch
+ dh_strip --dbg-package=freeswitch-dbg
dh_compress
dh_fixperms --exclude /opt/freeswitch/conf
+ dh_makeshlibs
+ dh_shlibdeps
dh_installdeb
- dh_shlibdeps --exclude=/opt/freeswitch
dh_gencontrol
dh_md5sums
dh_builddeb
diff --git a/debian/sounds/freeswitch-sounds-en-us-callie/debian/changelog b/debian/sounds/freeswitch-sounds-en-us-callie/debian/changelog
index adb1dfc517..9ca1d1a933 100644
--- a/debian/sounds/freeswitch-sounds-en-us-callie/debian/changelog
+++ b/debian/sounds/freeswitch-sounds-en-us-callie/debian/changelog
@@ -1,3 +1,12 @@
+freeswitch-sounds-en-us-callie (1.0.head-git.master,20101014.1-1) unstable; urgency=low
+
+ * Change upstream package version numbering scheme for unreleased versions:
+ new format is major.minor.micro~git.branch.date.commits-1
+ * Change source format to 3.0 (quilt).
+ * Upgrade debhelper compatibility to version 7.
+
+ -- Michal Bielicki Fr, 14 Oct 2010 05:05:02 +0200
+
freeswitch-sounds-en-us-callie (1.0.12-0ubuntu1) jaunty; urgency=low
* Initial: This is the initial working build of the en-us-callie sounds
diff --git a/debian/sounds/freeswitch-sounds-en-us-callie/debian/control b/debian/sounds/freeswitch-sounds-en-us-callie/debian/control
index 1af616adb8..3408328ca1 100644
--- a/debian/sounds/freeswitch-sounds-en-us-callie/debian/control
+++ b/debian/sounds/freeswitch-sounds-en-us-callie/debian/control
@@ -2,8 +2,9 @@ Source: freeswitch-sounds-en-us-callie
Maintainer: Freeswitch Debian Team
Section: net
Priority: extra
-Build-Depends: debhelper (>= 5), fakeroot, sox
-Standards-Version: 3.7.3
+Build-Depends: debhelper (>= 7), sox
+Homepage: http://www.freeswitch.org/
+Standards-Version: 3.8.4
Package: freeswitch-sounds-en-us-callie-8000
Architecture: all
@@ -47,14 +48,18 @@ Description: English language sounds for the FreeSWITCH(TM) (48000)
Package: freeswitch-sounds-en-us-callie
Architecture: all
Depends: sox, freeswitch-sounds-en-us-callie-48000
-Conflicts: freeswitch-sounds-en-us-callie-omega, freeswitch-sounds-en-us-callie-8000, freeswitch-sounds-en-us-callie-16000, freeswitch-sounds-en-us-callie-32000
+Conflicts: freeswitch-sounds-en-us-callie-omega,
+ freeswitch-sounds-en-us-callie-8000, freeswitch-sounds-en-us-callie-16000,
+ freeswitch-sounds-en-us-callie-32000
Description: English language files for FreeSWITCH(TM)
This package generates the 8k, 16k, and 32k from the installed 48k
sounds. You can select which ones you want.
Package: freeswitch-sounds-en-us-callie-omega
Architecture: all
-Depends: freeswitch-sounds-en-us-callie-48000, freeswitch-sounds-en-us-callie-32000, freeswitch-sounds-en-us-callie-16000, freeswitch-sounds-en-us-callie-8000
+Depends: freeswitch-sounds-en-us-callie-48000,
+ freeswitch-sounds-en-us-callie-32000, freeswitch-sounds-en-us-callie-16000,
+ freeswitch-sounds-en-us-callie-8000
Conflicts: freeswitch-sounds-en-us-callie
Description: English language files for FreeSWITCH(TM)
This package depends on the pregenerated 8khz, 16khz, 32khz, and 48khz sounds
diff --git a/debian/sounds/freeswitch-sounds-music/debian/changelog b/debian/sounds/freeswitch-sounds-music/debian/changelog
index 5f18ff3277..2d639c0691 100644
--- a/debian/sounds/freeswitch-sounds-music/debian/changelog
+++ b/debian/sounds/freeswitch-sounds-music/debian/changelog
@@ -1,3 +1,12 @@
+freeswitch-sounds-music (1.0.head-git.master,20101014.1-1) unstable; urgency=low
+
+ * Change upstream package version numbering scheme for unreleased versions:
+ new format is major.minor.micro~git.branch.date.commits-1
+ * Change source format to 3.0 (quilt).
+ * Upgrade debhelper compatibility to version 7.
+
+ -- Michal Bielicki Fr, 14 Oct 2010 05:05:02 +0200
+
freeswitch-sounds-music (1.0.8-0ubuntu3) jaunty; urgency=low
* Fixed: empty binary files for some packages
diff --git a/debian/sounds/freeswitch-sounds-music/debian/control b/debian/sounds/freeswitch-sounds-music/debian/control
index d03c2aa64e..20cfd5e3df 100644
--- a/debian/sounds/freeswitch-sounds-music/debian/control
+++ b/debian/sounds/freeswitch-sounds-music/debian/control
@@ -1,9 +1,10 @@
Source: freeswitch-sounds-music
-Maintainer: Freeswitch Debian Team
+Maintainer: Freeswitch development Team
Section: net
Priority: extra
-Build-Depends: debhelper (>= 5), fakeroot, sox
-Standards-Version: 3.7.3
+Build-Depends: debhelper (>= 7), sox
+Homepage: http://www.freeswitch.org/
+Standards-Version: 3.8.4
Package: freeswitch-sounds-music-8000
Architecture: all
@@ -47,14 +48,18 @@ Description: music for FreeSWITCH(TM) (48000)
Package: freeswitch-sounds-music
Architecture: all
Depends: sox, freeswitch-sounds-music-48000
-Conflicts: freeswitch-sounds-music-omega, freeswitch-sounds-music-8000, freeswitch-sounds-music-16000, freeswitch-sounds-music-32000
+Conflicts: freeswitch-sounds-music-omega,
+ freeswitch-sounds-music-8000, freeswitch-sounds-music-16000,
+ freeswitch-sounds-music-32000
Description: Music for FreeSWITCH(TM)
This package generates the 8k, 16k, and 32k from the installed 48k
sounds. You can select which ones you want.
Package: freeswitch-sounds-music-omega
Architecture: all
-Depends: freeswitch-sounds-music-48000, freeswitch-sounds-music-32000, freeswitch-sounds-music-16000, freeswitch-sounds-music-8000
+Depends: freeswitch-sounds-music-48000,
+ freeswitch-sounds-music-32000, freeswitch-sounds-music-16000,
+ freeswitch-sounds-music-8000
Conflicts: freeswitch-sounds-music
Description: Music for FreeSWITCH(TM)
This package depends on the pregenerated 8khz, 16khz, 32khz, and 48khz sounds
diff --git a/debian/sounds/freeswitch-sounds-ru-RU-elena/debian/changelog b/debian/sounds/freeswitch-sounds-ru-RU-elena/debian/changelog
index b7de59226e..38cc529ef6 100644
--- a/debian/sounds/freeswitch-sounds-ru-RU-elena/debian/changelog
+++ b/debian/sounds/freeswitch-sounds-ru-RU-elena/debian/changelog
@@ -1,3 +1,12 @@
+freeswitch-sounds-ru-ru-elena (1.0.head-git.master,20101014.1-1) unstable; urgency=low
+
+ * Change upstream package version numbering scheme for unreleased versions:
+ new format is major.minor.micro~git.branch.date.commits-1
+ * Change source format to 3.0 (quilt).
+ * Upgrade debhelper compatibility to version 7.
+
+ -- Michal Bielicki Fr, 14 Oct 2010 05:05:02 +0200
+
freeswitch-sounds-ru-ru-elena (1.0.12-0ubuntu3) jaunty; urgency=low
* Fixed: Empty binary package bug caused by the second ru folder being
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000000..163aaf8d82
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/substvars b/debian/substvars
index 62293246ae..e69de29bb2 100644
--- a/debian/substvars
+++ b/debian/substvars
@@ -1 +0,0 @@
-shlibs:Depends=libc6 (>= 2.3.6-6), libdb4.4, libgcc1 (>= 1:4.1.1-12), libsasl2-2, libssl0.9.8 (>= 0.9.8c-1), libstdc++6 (>= 4.1.1-12), libuuid1, zlib1g (>= 1:1.2.1)
diff --git a/docs/phrase/phrase_en.xml b/docs/phrase/phrase_en.xml
index 318aba18dd..a028a2aae0 100644
--- a/docs/phrase/phrase_en.xml
+++ b/docs/phrase/phrase_en.xml
@@ -384,14 +384,14 @@
-
+
-
+
@@ -403,27 +403,30 @@
-
+
-
+
-
+
+
+
+
@@ -435,7 +438,7 @@
-
+
diff --git a/freeswitch.spec b/freeswitch.spec
index a2c975b5a9..ceacfbafb2 100644
--- a/freeswitch.spec
+++ b/freeswitch.spec
@@ -331,7 +331,7 @@ export QA_RPATHS=$[ 0x0001|0x0002 ]
#
######################################################################################################################
APPLICATION_MODULES_AE="applications/mod_avmd applications/mod_callcenter applications/mod_cidlookup applications/mod_cluechoo \
- applications/mod_commands applications/mod_conference applications/mod_db applications/mod_directory \
+ applications/mod_commands applications/mod_conference applications/mod_curl applications/mod_db applications/mod_directory \
applications/mod_distributor applications/mod_dptools applications/mod_easyroute applications/mod_enum \
applications/mod_esf applications/mod_expr"
APPLICATION_MODULES_FM="applications/mod_fifo applications/mod_fsv applications/mod_hash applications/mod_lcr applications/mod_limit \
@@ -753,6 +753,7 @@ fi
%{prefix}/mod/mod_console.so*
%{prefix}/mod/mod_commands.so*
%{prefix}/mod/mod_conference.so*
+%{prefix}/mod/mod_curl.so*
%{prefix}/mod/mod_db.so*
%{prefix}/mod/mod_dialplan_asterisk.so*
%{prefix}/mod/mod_dialplan_directory.so*
@@ -949,6 +950,8 @@ fi
#
######################################################################################################################
%changelog
+* Fri Oct 15 2010 - michal.bielicki@seventhsignal.de
+- added mod_curl
* Sat Oct 09 2010 - michal.bielicki@seventhsignal.de
- added mod_silk
- added mod_codec2
diff --git a/libs/esl/java/Makefile b/libs/esl/java/Makefile
index a1e5f93294..9474a83276 100644
--- a/libs/esl/java/Makefile
+++ b/libs/esl/java/Makefile
@@ -1,4 +1,4 @@
-LOCAL_CFLAGS=-I../src/include -I/usr/java/jdk1.6.0_14/include -I/usr/java/jdk1.6.0_14/include/linux
+LOCAL_CFLAGS=-I../src/include -I/usr/java/jdk1.6.0_14/include -I/usr/java/jdk1.6.0_14/include/linux -I/usr/lib/jvm/java-6-openjdk/include/
GCC_WARNING_JUNK=-w
CLASSES=org/freeswitch/esl/*
diff --git a/libs/freetdm/.gitignore b/libs/freetdm/.gitignore
index 5018c5311b..2b06b30218 100644
--- a/libs/freetdm/.gitignore
+++ b/libs/freetdm/.gitignore
@@ -11,6 +11,20 @@ config.*
configure
libtool
aclocal.m4
+build/libtool.m4
+build/ltoptions.m4
+build/ltsugar.m4
+build/ltversion.m4
+build/lt~obsolete.m4
+
+testanalog
+testapp
+testboost
+testcid
+testpri
+testr2
+testsangomaboost
+testtones
!/sample/boost/Makefile
!/sample/dso/Makefile
diff --git a/libs/freetdm/Makefile.am b/libs/freetdm/Makefile.am
index d14013ab9b..bc92e1db58 100644
--- a/libs/freetdm/Makefile.am
+++ b/libs/freetdm/Makefile.am
@@ -29,29 +29,34 @@
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-PREFIX = $(prefix)
-SRC = src
+ACLOCAL_AMFLAGS = -I build
+AUTOMAKE_OPTIONS = foreign
+
+SRC = src
moddir = @modinstdir@
libdir = @libdir@
-library_includedir = $(PREFIX)/include
+library_includedir = $(prefix)/include
-INCS = -I$(FT_SRCDIR)/$(SRC)/include -I$(FT_SRCDIR)/$(SRC)/isdn/include -I$(FT_SRCDIR)/$(SRC)/include/private
-INCS += -I$(FT_SRCDIR)/$(SRC)/ftmod/ftmod_sangoma_boost
-if SNGSS7
-INCS += -I/usr/include/sng_ss7/
-endif
-if SNGISDN
-INCS += -I/usr/include/sng_isdn/
+INCS = -I$(FT_SRCDIR)/$(SRC)/include -I$(FT_SRCDIR)/$(SRC)/include/private
+INCS += -I$(FT_SRCDIR)/$(SRC)/ftmod/ftmod_sangoma_boost
+
+if HAVE_SNG_SS7
+INCS += -I/usr/include/sng_ss7
endif
-MY_CFLAGS = $(INCS) $(FTDM_CFLAGS) -DFTDM_CONFIG_DIR=\"@confdir@\" -DFTDM_MOD_DIR=\"$(moddir)\" @COMP_VENDOR_CFLAGS@ @DEFS@
-COMPILE = $(CC) $(MY_CFLAGS) $(INCS)
+if HAVE_SNG_ISDN
+INCS += -I/usr/include/sng_isdn
+endif
+
+FTDM_COMPAT_CFLAGS = $(INCS) -DFTDM_CONFIG_DIR=\"@confdir@\" -DFTDM_MOD_DIR=\"$(moddir)\" @COMP_VENDOR_COMPAT_CFLAGS@ @DEFS@
+FTDM_CFLAGS = $(INCS) -DFTDM_CONFIG_DIR=\"@confdir@\" -DFTDM_MOD_DIR=\"$(moddir)\" @COMP_VENDOR_CFLAGS@ @DEFS@
+COMPILE = $(CC) $(FTDM_CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(COMPILE)
-LINK = $(LIBTOOL) --mode=link --tag=CC $(CC) $(MY_CFLAGS) $(LDFLAGS) -o $@
+LINK = $(LIBTOOL) --mode=link --tag=CC $(CC) $(FTDM_CFLAGS) $(LDFLAGS) -o $@
-if DEBUGDTMF
-MY_CFLAGS += -DFTDM_DEBUG_DTMF
+if WANT_DEBUGDTMF
+FTDM_CFLAGS += -DFTDM_DEBUG_DTMF
endif
@@ -68,265 +73,226 @@ pkgconfig_DATA = freetdm.pc
# libfreetdm
#
libfreetdm_la_SOURCES = \
-$(SRC)/hashtable.c \
-$(SRC)/hashtable_itr.c \
-$(SRC)/ftdm_io.c \
-$(SRC)/ftdm_queue.c \
-$(SRC)/ftdm_sched.c \
-$(SRC)/ftdm_call_utils.c \
-$(SRC)/ftdm_config.c \
-$(SRC)/ftdm_callerid.c \
-$(SRC)/fsk.c \
-$(SRC)/uart.c \
-$(SRC)/g711.c \
-$(SRC)/libteletone_detect.c \
-$(SRC)/libteletone_generate.c \
-$(SRC)/ftdm_buffer.c \
-$(SRC)/ftdm_threadmutex.c \
-$(SRC)/ftdm_dso.c \
-$(SRC)/ftdm_cpu_monitor.c
+ $(SRC)/hashtable.c \
+ $(SRC)/hashtable_itr.c \
+ $(SRC)/ftdm_io.c \
+ $(SRC)/ftdm_queue.c \
+ $(SRC)/ftdm_sched.c \
+ $(SRC)/ftdm_call_utils.c \
+ $(SRC)/ftdm_config.c \
+ $(SRC)/ftdm_callerid.c \
+ $(SRC)/fsk.c \
+ $(SRC)/uart.c \
+ $(SRC)/g711.c \
+ $(SRC)/libteletone_detect.c \
+ $(SRC)/libteletone_generate.c \
+ $(SRC)/ftdm_buffer.c \
+ $(SRC)/ftdm_threadmutex.c \
+ $(SRC)/ftdm_dso.c \
+ $(SRC)/ftdm_cpu_monitor.c
library_include_HEADERS = \
-$(SRC)/include/freetdm.h \
-$(SRC)/include/ftdm_declare.h \
-$(SRC)/include/ftdm_threadmutex.h \
-$(SRC)/include/ftdm_os.h \
-$(SRC)/include/ftdm_dso.h
+ $(SRC)/include/freetdm.h \
+ $(SRC)/include/ftdm_declare.h \
+ $(SRC)/include/ftdm_threadmutex.h \
+ $(SRC)/include/ftdm_os.h \
+ $(SRC)/include/ftdm_dso.h
lib_LTLIBRARIES = libfreetdm.la
-libfreetdm_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+libfreetdm_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
libfreetdm_la_LDFLAGS = -version-info 1:0:0 $(AM_LDFLAGS)
libfreetdm_la_LIBADD = $(LIBS)
-MYLIB = libfreetdm.la
-
core: libfreetdm.la
core-install: install-libLTLIBRARIES
#
# tools & test programs
#
-noinst_PROGRAMS = testtones detect_tones detect_dtmf testpri testr2 testanalog testapp testcid #testisdn
-if HAVE_SCTP
-noinst_PROGRAMS += testboost
-endif
+noinst_PROGRAMS = testtones detect_tones detect_dtmf testpri testr2 testanalog testapp testcid
noinst_PROGRAMS += testsangomaboost
testapp_SOURCES = $(SRC)/testapp.c
testapp_LDADD = libfreetdm.la
-testapp_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+testapp_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
testcid_SOURCES = $(SRC)/testcid.c
testcid_LDADD = libfreetdm.la
-testcid_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+testcid_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
testtones_SOURCES = $(SRC)/testtones.c
testtones_LDADD = libfreetdm.la
-testtones_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+testtones_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
detect_tones_SOURCES = $(SRC)/detect_tones.c
detect_tones_LDADD = libfreetdm.la
-detect_tones_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+detect_tones_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
detect_dtmf_SOURCES = $(SRC)/detect_dtmf.c
detect_dtmf_LDADD = libfreetdm.la
-detect_dtmf_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+detect_dtmf_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
#testisdn_SOURCES = $(SRC)/testisdn.c
#testisdn_LDADD = libfreetdm.la
-#testisdn_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+#testisdn_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
testpri_SOURCES = $(SRC)/testpri.c
testpri_LDADD = libfreetdm.la
-testpri_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+testpri_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
testr2_SOURCES = $(SRC)/testr2.c
testr2_LDADD = libfreetdm.la
-testr2_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+testr2_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
if HAVE_SCTP
+noinst_PROGRAMS += testboost
testboost_SOURCES = $(SRC)/testboost.c
testboost_LDADD = libfreetdm.la
-testboost_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+testboost_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
endif
testsangomaboost_SOURCES = $(SRC)/testsangomaboost.c
testsangomaboost_LDADD = libfreetdm.la
-testsangomaboost_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+testsangomaboost_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
testanalog_SOURCES = $(SRC)/testanalog.c
testanalog_LDADD = libfreetdm.la
-testanalog_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+testanalog_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
#
# ftmod modules
#
-mod_LTLIBRARIES = ftmod_zt.la ftmod_skel.la ftmod_analog.la ftmod_analog_em.la #ftmod_isdn.la
-
-
-if HAVE_SCTP
-mod_LTLIBRARIES += ftmod_sangoma_boost.la
-endif
-
-if LIBSANGOMA
-mod_LTLIBRARIES += ftmod_wanpipe.la
-endif
-
-if LIBPRI
-mod_LTLIBRARIES += ftmod_libpri.la
-endif
-
-if PRITAP
-mod_LTLIBRARIES += ftmod_pritap.la
-endif
-
-if SNGSS7
-mod_LTLIBRARIES += ftmod_sangoma_ss7.la
-endif
-
-if SNGISDN
-mod_LTLIBRARIES += ftmod_sangoma_isdn.la
-endif
-
-if OPENR2
-mod_LTLIBRARIES += ftmod_r2.la
-endif
+mod_LTLIBRARIES = ftmod_zt.la ftmod_skel.la ftmod_analog.la ftmod_analog_em.la
ftmod_zt_la_SOURCES = $(SRC)/ftmod/ftmod_zt/ftmod_zt.c
-ftmod_zt_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
-ftmod_zt_la_LDFLAGS = -module -avoid-version
-ftmod_zt_la_LIBADD = $(MYLIB)
+ftmod_zt_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
+ftmod_zt_la_LDFLAGS = -shared -module -avoid-version
+ftmod_zt_la_LIBADD = libfreetdm.la
ftmod_skel_la_SOURCES = $(SRC)/ftmod/ftmod_skel/ftmod_skel.c
-ftmod_skel_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
+ftmod_skel_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
ftmod_skel_la_LDFLAGS = -module -avoid-version
-ftmod_skel_la_LIBADD = $(MYLIB)
-
-if LIBSANGOMA
-ftmod_wanpipe_la_SOURCES = $(SRC)/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
-ftmod_wanpipe_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS) -D__LINUX__ -I/usr/include/wanpipe
-ftmod_wanpipe_la_LDFLAGS = -module -avoid-version -lsangoma
-ftmod_wanpipe_la_LIBADD = $(MYLIB)
-endif
-
-#ftmod_isdn_la_SOURCES = \
-#$(SRC)/isdn/EuroISDNStateNT.c \
-#$(SRC)/isdn/EuroISDNStateTE.c \
-#$(SRC)/isdn/mfifo.c \
-#$(SRC)/isdn/Q921.c \
-#$(SRC)/isdn/Q931api.c \
-#$(SRC)/isdn/Q931.c \
-#$(SRC)/isdn/Q931ie.c \
-#$(SRC)/isdn/Q931mes.c \
-#$(SRC)/isdn/Q931StateNT.c \
-#$(SRC)/isdn/Q931StateTE.c \
-#$(SRC)/isdn/nationalmes.c \
-#$(SRC)/isdn/nationalStateNT.c \
-#$(SRC)/isdn/nationalStateTE.c \
-#$(SRC)/isdn/DMSmes.c \
-#$(SRC)/isdn/DMSStateNT.c \
-#$(SRC)/isdn/DMSStateTE.c \
-#$(SRC)/isdn/5ESSmes.c \
-#$(SRC)/isdn/5ESSStateNT.c \
-#$(SRC)/isdn/5ESSStateTE.c \
-#$(SRC)/isdn/Q932mes.c \
-#$(SRC)/ftmod/ftmod_isdn/ftmod_isdn.c
-
-#ftmod_isdn_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS) -D_GNU_SOURCE
-#ftmod_isdn_la_LDFLAGS = $(PCAP_LIB_FLAGS) -module -avoid-version
-#ftmod_isdn_la_LIBADD = $(MYLIB)
+ftmod_skel_la_LIBADD = libfreetdm.la
ftmod_analog_la_SOURCES = $(SRC)/ftmod/ftmod_analog/ftmod_analog.c
-ftmod_analog_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
-ftmod_analog_la_LDFLAGS = -module -avoid-version
-ftmod_analog_la_LIBADD = $(MYLIB)
+ftmod_analog_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
+ftmod_analog_la_LDFLAGS = -shared -module -avoid-version
+ftmod_analog_la_LIBADD = libfreetdm.la
ftmod_analog_em_la_SOURCES = $(SRC)/ftmod/ftmod_analog_em/ftmod_analog_em.c
-ftmod_analog_em_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
-ftmod_analog_em_la_LDFLAGS = -module -avoid-version
-ftmod_analog_em_la_LIBADD = $(MYLIB)
+ftmod_analog_em_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
+ftmod_analog_em_la_LDFLAGS = -shared -module -avoid-version
+ftmod_analog_em_la_LIBADD = libfreetdm.la
+
+if HAVE_LIBSANGOMA
+mod_LTLIBRARIES += ftmod_wanpipe.la
+ftmod_wanpipe_la_SOURCES = $(SRC)/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
+#some structures within Wanpipe drivers are not c99 compatible, so we need to compile ftmod_wanpipe
+#without c99 flags
+ftmod_wanpipe_la_CFLAGS = $(AM_CFLAGS) $(FTDM_COMPAT_CFLAGS) -D__LINUX__ -I/usr/include/wanpipe
+ftmod_wanpipe_la_LDFLAGS = -shared -module -avoid-version -lsangoma
+ftmod_wanpipe_la_LIBADD = libfreetdm.la
+endif
+
+if HAVE_LIBISDN
+mod_LTLIBRARIES += ftmod_isdn.la
+ftmod_isdn_la_SOURCES = $(SRC)/ftmod/ftmod_isdn/ftmod_isdn.c
+ftmod_isdn_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS) -D_GNU_SOURCE $(LIBISDN_CPPFLAGS) $(PCAP_CPPFLAGS)
+ftmod_isdn_la_LDFLAGS = -shared -module -avoid-version $(LIBISDN_LDFLAGS) $(PCAP_LDFLAGS)
+ftmod_isdn_la_LIBADD = libfreetdm.la $(LIBISDN_LIBS) $(PCAP_LIBS)
+endif
if HAVE_SCTP
+mod_LTLIBRARIES += ftmod_sangoma_boost.la
ftmod_sangoma_boost_la_SOURCES = $(SRC)/ftmod/ftmod_sangoma_boost/sangoma_boost_client.c $(SRC)/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c
-ftmod_sangoma_boost_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
-ftmod_sangoma_boost_la_LDFLAGS = -module -avoid-version
-ftmod_sangoma_boost_la_LIBADD = $(MYLIB)
+ftmod_sangoma_boost_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
+ftmod_sangoma_boost_la_LDFLAGS = -shared -module -avoid-version
+ftmod_sangoma_boost_la_LIBADD = libfreetdm.la
endif
-if LIBPRI
+if HAVE_LIBPRI
+mod_LTLIBRARIES += ftmod_libpri.la
ftmod_libpri_la_SOURCES = $(SRC)/ftmod/ftmod_libpri/ftmod_libpri.c $(SRC)/ftmod/ftmod_libpri/lpwrap_pri.c
-ftmod_libpri_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
-ftmod_libpri_la_LDFLAGS = -module -avoid-version -lpri
-ftmod_libpri_la_LIBADD = $(MYLIB)
+ftmod_libpri_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
+ftmod_libpri_la_LDFLAGS = -shared -module -avoid-version -lpri
+ftmod_libpri_la_LIBADD = libfreetdm.la
endif
-if PRITAP
+if HAVE_PRITAP
+mod_LTLIBRARIES += ftmod_pritap.la
ftmod_pritap_la_SOURCES = $(SRC)/ftmod/ftmod_pritap/ftmod_pritap.c
-ftmod_pritap_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
-ftmod_pritap_la_LDFLAGS = -module -avoid-version -lpri
-ftmod_pritap_la_LIBADD = $(MYLIB)
+ftmod_pritap_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
+ftmod_pritap_la_LDFLAGS = -shared -module -avoid-version -lpri
+ftmod_pritap_la_LIBADD = libfreetdm.la
endif
-if SNGSS7
-ftmod_sangoma_ss7_la_SOURCES = $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sta.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sts.c \
- $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c
-ftmod_sangoma_ss7_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS) -D_GNU_SOURCE
-ftmod_sangoma_ss7_la_LDFLAGS = -module -avoid-version -lsng_ss7
-ftmod_sangoma_ss7_la_LIBADD = $(MYLIB)
+if HAVE_SNG_SS7
+mod_LTLIBRARIES += ftmod_sangoma_ss7.la
+ftmod_sangoma_ss7_la_SOURCES = \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sta.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sts.c \
+ $(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c
+
+ftmod_sangoma_ss7_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS) -D_GNU_SOURCE
+ftmod_sangoma_ss7_la_LDFLAGS = -shared -module -avoid-version -lsng_ss7
+ftmod_sangoma_ss7_la_LIBADD = libfreetdm.la
endif
-if SNGISDN
-ftmod_sangoma_isdn_la_SOURCES = $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c \
- $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c \
- $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cntrl.c \
- $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c \
- $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c \
- $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cntrl.c \
- $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c \
- $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c \
- $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c \
- $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
+if HAVE_SNG_ISDN
+mod_LTLIBRARIES += ftmod_sangoma_isdn.la
+ftmod_sangoma_isdn_la_SOURCES = \
+ $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c \
+ $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c \
+ $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cntrl.c \
+ $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c \
+ $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c \
+ $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cntrl.c \
+ $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c \
+ $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c \
+ $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c \
+ $(SRC)/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
-
-ftmod_sangoma_isdn_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS) -D_GNU_SOURCE
-ftmod_sangoma_isdn_la_LDFLAGS = -module -avoid-version -lsng_isdn
-ftmod_sangoma_isdn_la_LIBADD = $(MYLIB)
+ftmod_sangoma_isdn_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS) -D_GNU_SOURCE
+ftmod_sangoma_isdn_la_LDFLAGS = -shared -module -avoid-version -lsng_isdn
+ftmod_sangoma_isdn_la_LIBADD = libfreetdm.la
endif
-if OPENR2
+if HAVE_OPENR2
+mod_LTLIBRARIES += ftmod_r2.la
ftmod_r2_la_SOURCES = $(SRC)/ftmod/ftmod_r2/ftmod_r2.c
-ftmod_r2_la_CFLAGS = $(AM_CFLAGS) $(MY_CFLAGS)
-ftmod_r2_la_LDFLAGS = -module -avoid-version -lopenr2
-ftmod_r2_la_LIBADD = $(MYLIB)
+ftmod_r2_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
+ftmod_r2_la_LDFLAGS = -shared -module -avoid-version -lopenr2
+ftmod_r2_la_LIBADD = libfreetdm.la
endif
dox doxygen:
doxygen $(FT_SRCDIR)/docs/Doxygen.conf
-mod_freetdm/mod_freetdm.$(DYNAMIC_LIB_EXTEN): $(MYLIB) mod_freetdm/mod_freetdm.c
- cd mod_freetdm && make
+mod_freetdm/mod_freetdm.$(DYNAMIC_LIB_EXTEN): libfreetdm.la mod_freetdm/mod_freetdm.c
+ $(MAKE) -C mod_freetdm
mod_freetdm: mod_freetdm/mod_freetdm.$(DYNAMIC_LIB_EXTEN)
mod_freetdm-install: mod_freetdm
- cd mod_freetdm && make install
+ $(MAKE) -C mod_freetdm install
mod_freetdm-clean:
- @if [ -f mod_freetdm/mod_freetdm.$(DYNAMIC_LIB_EXTEN) ] ; then cd mod_freetdm && make clean ; fi
+ @if [ -f mod_freetdm/mod_freetdm.$(DYNAMIC_LIB_EXTEN) ] ; then \
+ $(MAKE) -C mod_freetdm clean ; \
+ fi
install-data-local:
- $(mkinstalldirs) $(DESTDIR)$(PREFIX)
+ $(mkinstalldirs) $(DESTDIR)$(prefix)
$(mkinstalldirs) $(DESTDIR)@confdir@
@[ -f "$(DESTDIR)@confdir@/freetdm.conf" ] || ( cp conf/*.conf $(DESTDIR)@confdir@)
@echo FreeTDM Installed
diff --git a/libs/freetdm/build/ax_compiler_vendor.m4 b/libs/freetdm/build/ax_compiler_vendor.m4
new file mode 100644
index 0000000000..a24a58da0f
--- /dev/null
+++ b/libs/freetdm/build/ax_compiler_vendor.m4
@@ -0,0 +1,15 @@
+AC_DEFUN([AX_COMPILER_VENDOR],
+[
+AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
+ [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
+ # note: don't check for gcc first since some other compilers define __GNUC__
+ for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
+ vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
+#if !($vencpp)
+ thisisanerror;
+#endif
+])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
+ done
+ ])
+])
diff --git a/libs/freetdm/build/libpcap.m4 b/libs/freetdm/build/libpcap.m4
index c20d345ca6..ea7581e69b 100644
--- a/libs/freetdm/build/libpcap.m4
+++ b/libs/freetdm/build/libpcap.m4
@@ -2,6 +2,10 @@ dnl libpcap.m4--PCAP libraries and includes
dnl Derrick Brashear
dnl from KTH krb and Arla
dnl $Id: libpcap.m4,v 1.4 2006/01/20 20:21:09 snsimon Exp $
+dnl 2010/10/31 (stkn):
+dnl rename: PCAP_INC_FLAGS -> PCAP_CPPFLAGS
+dnl rename: PCAP_LIB_FLAGS -> PCAP_LDFLAGS (-L flags only)
+dnl add: PCAP_LIBS (libs only)
AC_DEFUN([PCAP_INC_WHERE1], [
ac_cv_found_pcap_inc=no
@@ -129,12 +133,14 @@ AC_ARG_WITH(pcap-include,
AC_MSG_RESULT(yes)
PCAP_INC_DIR=$ac_cv_pcap_where_inc
PCAP_LIB_DIR=$ac_cv_pcap_where_lib
- PCAP_INC_FLAGS="-I${PCAP_INC_DIR}"
- PCAP_LIB_FLAGS="-L${PCAP_LIB_DIR} -lpcap"
+ PCAP_CPPFLAGS="-I${PCAP_INC_DIR}"
+ PCAP_LDFLAGS="-L${PCAP_LIB_DIR}"
+ PCAP_LIBS="-lpcap"
AC_SUBST(PCAP_INC_DIR)
AC_SUBST(PCAP_LIB_DIR)
- AC_SUBST(PCAP_INC_FLAGS)
- AC_SUBST(PCAP_LIB_FLAGS)
+ AC_SUBST(PCAP_CPPFLAGS)
+ AC_SUBST(PCAP_LDFLAGS)
+ AC_SUBST(PCAP_LIBS)
AC_DEFINE([HAVE_LIBPCAP],[1],[libpcap])
else
ac_cv_found_pcap=no
diff --git a/libs/freetdm/configure.ac b/libs/freetdm/configure.ac
index 18f83d8f1d..8b878edc09 100644
--- a/libs/freetdm/configure.ac
+++ b/libs/freetdm/configure.ac
@@ -1,119 +1,120 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
-AC_PREREQ(2.59)
-AC_INIT([freetdm],[pre-alpha],[bugs@freeswitch.org])
+AC_PREREQ([2.59])
+AC_INIT([freetdm], [pre-alpha], [bugs@freeswitch.org])
AC_CONFIG_SRCDIR([src/ftdm_io.c])
-AC_CONFIG_AUX_DIR(build)
-AM_INIT_AUTOMAKE(libfreetdm,0.1)
+AC_CONFIG_AUX_DIR([build])
+AC_CONFIG_MACRO_DIR([build])
+AM_INIT_AUTOMAKE([libfreetdm], [0.1])
+
+# >=automake-1.11
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
+# override some default libtool behavior and invoke AC_PROG_LIBTOOL
+# (see http://lists.gnu.org/archive/html/libtool/2007-03/msg00000.html)
+m4_defun([_LT_AC_LANG_F77_CONFIG], [:])
+m4_defun([_LT_AC_LANG_GCJ_CONFIG], [:])
+m4_defun([_LT_AC_LANG_RC_CONFIG], [:])
# Checks for programs.
AC_PROG_CC
AC_PROG_MAKE_SET
AM_PROG_CC_C_O
+AC_PROG_LIBTOOL
+AC_PROG_INSTALL
+PKG_PROG_PKG_CONFIG
-AC_PREFIX_DEFAULT(/usr/local/freetdm)
-# AC_PREFIX_DEFAULT does not get expanded until too late so we need to do this to use prefix in this script
-if test "x$prefix" = "xNONE" ; then
- prefix='/usr/local/freetdm'
+AX_COMPILER_VENDOR
+
+# AC_PREFIX_DEFAULT does not get expanded until too late so we need
+# to do this to use prefix in this script
+AC_PREFIX_DEFAULT([/usr/local/freetdm])
+if test "x${prefix}" = "xNONE" ; then
+ prefix='/usr/local/freetdm'
fi
# Absolute source/build directory
FT_SRCDIR=`(cd $srcdir && pwd)`
ft_builddir=`pwd`
-AC_SUBST(FT_SRCDIR)
-AC_SUBST(ft_builddir)
+AC_SUBST([FT_SRCDIR])
+AC_SUBST([ft_builddir])
if test "$sysconfdir" = "\${prefix}/etc" ; then
- confdir="$prefix/conf"
+ confdir="$prefix/conf"
else
- confdir="$sysconfdir"
+ confdir="$sysconfdir"
fi
-AC_SUBST(confdir)
+AC_SUBST([confdir])
-#override some default libtool behavior and invoke AC_PROG_LIBTOOL (see http://lists.gnu.org/archive/html/libtool/2007-03/msg00000.html)
-m4_defun([_LT_AC_LANG_F77_CONFIG], [:])
-m4_defun([_LT_AC_LANG_GCJ_CONFIG], [:])
-m4_defun([_LT_AC_LANG_RC_CONFIG], [:])
-#AM_PROG_CC_C_O
-AC_PROG_LIBTOOL
-AC_PROG_INSTALL
+# Where to install the modules
+AC_ARG_WITH([modinstdir],
+ [AS_HELP_STRING([--with-modinstdir=DIR], [Install modules into this location (default: ${prefix}/mod)])],
+ [case "${withval}" in
+ no|yes) AC_MSG_ERROR([Invalid value \"${withval}\", option requires a valid path]) ;;
+ *) modinstdir="${withval}" ;;
+ esac],
+ [modinstdir="${prefix}/mod"]
+)
+AC_SUBST([modinstdir])
-# Check for com;iler type
-AC_DEFUN([AX_COMPILER_VENDOR],
-[
-AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
- [ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
- # note: don't check for GCC first, since some other compilers define __GNUC__
- for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
- vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
- AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
-#if !($vencpp)
- thisisanerror;
-#endif
-])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
- done
- ])
-])
-AC_ARG_ENABLE([enable_64], [AS_HELP_STRING([--enable-64], [Enable 64bit compilation])], [enable_64="$enableval"], [enable_64="no"])
-
-AX_COMPILER_VENDOR
+AC_ARG_ENABLE([enable_64],
+ [AS_HELP_STRING([--enable-64], [Enable 64bit compilation])],
+ [enable_64="${enableval}"],
+ [enable_64="no"]
+)
case "${ax_cv_c_compiler_vendor}" in
gnu)
- COMP_VENDOR_CFLAGS="-ffast-math -Wall -Werror -Wunused-variable -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -O0"
- ;;
+ COMP_VENDOR_CFLAGS="-ffast-math -Wall -Werror -Wunused-variable -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -O0"
+ ;;
sun)
- COMP_VENDOR_CFLAGS="-xc99=all -mt -xCC -D__FUNCTION__=__func__ -xvpara"
- if test "$enable_64" = "yes" ; then
- COMP_VENDOR_CFLAGS="-m64 $COMP_VENDOR_CFLAGS"
- fi
- ;;
+ COMP_VENDOR_CFLAGS="-xc99=all -mt -xCC -D__FUNCTION__=__func__ -xvpara"
+ if test "$enable_64" != "no" ; then
+ COMP_VENDOR_CFLAGS="-m64 $COMP_VENDOR_CFLAGS"
+ fi
+ ;;
*)
- COMP_VENDOR_CFLAGS="-std=c99 -Wall -Wunused-variable -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes"
- ;;
+ COMP_VENDOR_COMPAT_CFLAGS="-Wall -Wunused-variable -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes"
+ COMP_VENDOR_CFLAGS="-std=c99 $COMP_VENDOR_COMPAT_CFLAGS"
+ ;;
esac
+AC_SUBST([COMP_VENDOR_COMPAT_CFLAGS])
+AC_SUBST([COMP_VENDOR_CFLAGS])
-#set SOLINK variable based on compiler and host
-if test "x${ax_cv_c_compiler_vendor}" = "xsun" ; then
- SOLINK="-Bdynamic -dy -G"
-elif test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then
- case "$host" in
- *darwin*)
- SOLINK="-dynamic -bundle -force-flat-namespace"
- ;;
- *-solaris2*)
- SOLINK="-shared -Xlinker"
- ;;
- *)
- SOLINK="-shared -Xlinker -x"
- ;;
- esac
-else
- AC_ERROR([Please update configure.in with SOLINK values for your compiler])
+# Enable debugging
+AC_ARG_ENABLE([debug],
+ [AC_HELP_STRING([--enable-debug], [build with debug information])],
+ [enable_debug="${enableval}"],
+ [enable_debug="yes"]
+)
+if test "${enable_debug}" != "no"; then
+ AC_DEFINE([DEBUG], [], [Enable extra debugging.])
+
+ if test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then
+ COMP_VENDOR_CFLAGS="$COMP_VENDOR_CFLAGS -g -ggdb"
+ fi
fi
+AC_SUBST([COMP_VENDOR_CFLAGS])
# set DYNAMIC_LIB_EXTEN
# we should really be using libtool so we don't need to do this
case "$host" in
- *cygwin* | *mingw*)
- DYNAMIC_LIB_EXTEN="dll"
- ;;
- *)
- DYNAMIC_LIB_EXTEN="so"
- ;;
+*cygwin* | *mingw*)
+ DYNAMIC_LIB_EXTEN="dll"
+ ;;
+*)
+ DYNAMIC_LIB_EXTEN="so"
+ ;;
esac
-
-AC_SUBST(SOLINK)
-AC_SUBST(DYNAMIC_LIB_EXTEN)
+AC_SUBST([DYNAMIC_LIB_EXTEN])
AC_CHECK_LIB([dl], [dlopen])
AC_CHECK_LIB([pthread], [pthread_create])
AC_CHECK_LIB([m], [cos])
-AX_LIB_PCAP
AC_CHECK_HEADERS([netinet/sctp.h netdb.h sys/select.h])
AM_CONDITIONAL([HAVE_SCTP],[test "${ac_cv_header_netinet_sctp_h}" = "yes"])
@@ -121,105 +122,252 @@ AM_CONDITIONAL([HAVE_SCTP],[test "${ac_cv_header_netinet_sctp_h}" = "yes"])
AC_CHECK_FUNC([gethostbyname_r],
[], [AC_CHECK_LIB([nsl], [gethostbyname_r])]
)
-if test "$ac_cv_func_gethostbyname_r" = "yes" -o "$ac_cv_lib_nsl_gethostbyname_r" = "yes" ; then
+if test "$ac_cv_func_gethostbyname_r" = "yes" -o "$ac_cv_lib_nsl_gethostbyname_r" = "yes"
+then
+ AC_MSG_CHECKING([whether gethostbyname_r requires five arguments])
-AC_MSG_CHECKING([whether gethostbyname_r requires five arguments])
+ ac_cv_func_gethostbyname_r_five_args="no"
-ac_cv_func_gethostbyname_r_five_args="no"
+ AC_TRY_COMPILE([#include ],
+ [char *name;
+ struct hostent *he, *res;
+ char buffer[2048];
+ int buflen = 2048;
+ (void)gethostbyname_r(name, he, buffer, buflen, &res)],
+ [ac_cv_func_gethostbyname_r_five_args="yes"
+ AC_DEFINE([HAVE_GETHOSTBYNAME_R_FIVE], [1], [gethostbyname_r has five arguments])]
+ )
-AC_TRY_COMPILE([#include ],
- [char *name;
- struct hostent *he, *res;
- char buffer[2048];
- int buflen = 2048;
- (void)gethostbyname_r(name, he, buffer, buflen, &res)],
- [ac_cv_func_gethostbyname_r_five_args="yes"
- AC_DEFINE([HAVE_GETHOSTBYNAME_R_FIVE], [1], [gethostbyname_r has five arguments])]
-)
-
- AC_MSG_RESULT([$ac_cv_func_gethostbyname_r_five_args])
- AC_DEFINE([HAVE_GETHOSTBYNAME_R],[1],[threadsafe gethostbyname])
+ AC_MSG_RESULT([$ac_cv_func_gethostbyname_r_five_args])
+ AC_DEFINE([HAVE_GETHOSTBYNAME_R], [1], [threadsafe gethostbyname])
fi
-# Enable debugging
-AC_ARG_ENABLE(debug,
-[AC_HELP_STRING([--enable-debug],[build with debug information])],[enable_debug="$enableval"],[enable_debug="yes"])
+##
+## Modules and optional features
+##
+AC_MSG_RESULT([${as_nl}<<>> Modules and optional features])
-if test "${enable_debug}" = "yes"; then
- AC_DEFINE([DEBUG],[],[Enable extra debugging.])
-
- if test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then
- COMP_VENDOR_CFLAGS="$COMP_VENDOR_CFLAGS -g -ggdb"
- fi
-fi
-
-# Where to install the modules
-AC_ARG_WITH([modinstdir],
- [AS_HELP_STRING([--with-modinstdir=DIR], [Install modules into this location (default: $prefix/mod)])], [modinstdir="$withval"], [modinstdir="${prefix}/mod"])
-
-AC_SUBST(modinstdir)
-
-
-# libpri?
-AC_ARG_WITH([libpri],
- [AS_HELP_STRING([--with-libpri], [Install ftmod_libpri])], [enable_libpri="yes"], [enable_libpri="no"])
-AC_SUBST(enable_libpri)
-
-# pritap?
+##
+# pritap (TODO: add checks)
+#
+HAVE_PRITAP="no"
AC_ARG_WITH([pritap],
- [AS_HELP_STRING([--with-pritap], [Install ftmod_pritap])], [enable_pritap="yes"], [enable_pritap="no"])
-AC_SUBST(enable_pritap)
+ [AS_HELP_STRING([--with-pritap], [Install ftmod_pritap])],
+ [case "${withval}" in
+ no) enable_pritap="no" ;;
+ *) enable_pritab="yes" ;;
+ esac],
+ [enable_pritap="no"]
+)
+HAVE_PRITAP="${enable_pritap}"
+AM_CONDITIONAL([HAVE_PRITAP],[test "${enable_pritap}" = "yes"])
# debug dtmf?
AC_ARG_WITH([debugdtmf],
- [AS_HELP_STRING([--with-debugdtmf], [Debug DTMF])], [enable_debugdtmf="yes"], [enable_debugdtmf="no"])
-AC_SUBST(enable_debugdtmf)
+ [AS_HELP_STRING([--with-debugdtmf], [Debug DTMF])],
+ [case "${withval}" in
+ no) enable_debugdtmf="no" ;;
+ *) enable_debugdtmf="yes" ;;
+ esac],
+ [enable_debugdtmf="no"]
+)
+AM_CONDITIONAL([WANT_DEBUGDTMF], [test "${enable_debugdtmf}" = "yes"])
-AC_CHECK_LIB([sangoma], [sangoma_span_chan_toif], [have_libsangoma="yes"])
-AM_CONDITIONAL([LIBSANGOMA],[test "${have_libsangoma}" = "yes"])
+##
+# OpenR2 stack
+#
+HAVE_OPENR2="no"
+AC_CHECK_LIB([openr2], [openr2_context_set_io_type], [HAVE_OPENR2="yes"])
+AC_MSG_RESULT([checking whether to build ftmod_r2... ${HAVE_OPENR2}])
+AM_CONDITIONAL([HAVE_OPENR2], [test "${HAVE_OPENR2}" = "yes"])
-AM_CONDITIONAL([LIBPRI],[test "${enable_libpri}" = "yes"])
+##
+# Digium libpri (TODO: add checks)
+#
+HAVE_LIBPRI="no"
+AC_ARG_WITH([libpri],
+ [AS_HELP_STRING([--with-libpri], [Install ftmod_libpri])],
+ [case "${withval}" in
+ no) enable_libpri="no" ;;
+ *) enable_libpri="yes" ;;
+ esac],
+ [enable_libpri="no"]
+)
+if test "${enable_libpri}" != "no"
+then
+ AC_MSG_RESULT([${as_nl}<<>> Digium libpri])
-AM_CONDITIONAL([PRITAP],[test "${enable_pritap}" = "yes"])
+ save_LIBS="${LIBS}"
+ LIBS="${LIBS} -lpri"
+ AC_MSG_CHECKING([whether libpri is usable])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [#include ],
+ [const char *version = pri_get_version();]
+ )],
+ [AC_MSG_RESULT([yes])],
+ [AC_MSG_RESULT([no])
+ AC_MSG_ERROR([libpri is not installed or unusable (see config.log for details)])]
+ )
-AM_CONDITIONAL([DEBUGDTMF],[test "${enable_debugdtmf}" = "yes"])
+ AC_MSG_CHECKING([whether libpri has BRI support])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [extern void pri_new_bri_cb(void);],
+ [pri_new_bri_cb();]
+ )],
+ [AC_DEFINE([HAVE_LIBPRI_BRI], [1], [libpri has BRI support])
+ AC_MSG_RESULT([yes])],
+ [AC_MSG_RESULT([no])
+ AC_MSG_NOTICE([You will need libpri-1.4.12_beta1 or newer for BRI support])]
+ )
-AC_CHECK_LIB([sng_ss7], [sng_isup_init], [have_sng_ss7="yes"])
-AM_CONDITIONAL([SNGSS7],[test "${have_sng_ss7}" = "yes"])
+ AC_MSG_CHECKING([whether libpri has AOC event support])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [extern void pri_aoc_events_enable(void);],
+ [pri_aoc_events_enable();]
+ )],
+ [AC_DEFINE([HAVE_LIBPRI_AOC], [1], [libpri has AOC event support])
+ AC_MSG_RESULT([yes])],
+ [AC_MSG_RESULT([no])
+ AC_MSG_NOTICE([You will need libpri-1.4.12_beta1 or newer for AOC event support])]
+ )
+ LIBS="${save_LIBS}"
+fi
+HAVE_LIBPRI="${enable_libpri}"
+AM_CONDITIONAL([HAVE_LIBPRI],[test "${enable_libpri}" = "yes"])
-AC_CHECK_LIB([sng_isdn], [sng_isdn_init], [have_sng_isdn="yes"])
-AM_CONDITIONAL([SNGISDN],[test "${have_sng_isdn}" = "yes"])
+##
+# Sangoma Wanpipe
+#
+HAVE_LIBSANGOMA="no"
+AC_MSG_RESULT([${as_nl}<<>> Sangoma Wanpipe])
+AC_CHECK_LIB([sangoma], [sangoma_span_chan_toif], [HAVE_LIBSANGOMA="yes"])
+AC_MSG_RESULT([checking whether to build ftmod_wanpipe... ${HAVE_LIBSANGOMA}])
+AM_CONDITIONAL([HAVE_LIBSANGOMA], [test "${HAVE_LIBSANGOMA}" = "yes"])
-AC_CHECK_LIB([openr2], [openr2_context_set_io_type], [have_openr2="yes"])
-AM_CONDITIONAL([OPENR2],[test "${have_openr2}" = "yes"])
+##
+# Sangoma ISDN stack
+#
+HAVE_SNG_ISDN="no"
+AC_MSG_RESULT([${as_nl}<<>> Sangoma ISDN stack])
+AC_CHECK_LIB([sng_isdn], [sng_isdn_init], [HAVE_SNG_ISDN="yes"])
+AC_MSG_RESULT([checking whether to build ftmod_sangoma_isdn... ${HAVE_SNG_ISDN}])
+AM_CONDITIONAL([HAVE_SNG_ISDN], [test "${HAVE_SNG_ISDN}" = "yes"])
-if test "${have_sng_isdn}" = "yes"; then
+if test "${HAVE_SNG_ISDN}" = "yes"; then
if test "${build}" == "${host}"
then
case "${host}" in
x86_64-*)
- # X86_64 machines need additional flags when compiling against libsng_isdn
- CFLAGS="$CFLAGS -DBIT_64 -DALIGN_64BIT"
- ;;
+ # X86_64 machines need additional flags when compiling against libsng_isdn
+ CFLAGS="$CFLAGS -DBIT_64 -DALIGN_64BIT"
+ ;;
esac
fi
fi
-if test "${have_sng_ss7}" = "yes"; then
+##
+# Sangoma SS7 stack
+#
+HAVE_SNG_SS7="no"
+AC_MSG_RESULT([${as_nl}<<>> Sangoma SS7 stack])
+AC_CHECK_LIB([sng_ss7], [sng_isup_init], [HAVE_SNG_SS7="yes"])
+AC_MSG_RESULT([checking whether to build ftmod_sangoma_ss7... ${HAVE_SNG_SS7}])
+AM_CONDITIONAL([HAVE_SNG_SS7], [test "${HAVE_SNG_SS7}" = "yes"])
+
+if test "${HAVE_SNG_SS7}" = "yes"; then
if test "${build}" == "${host}"
then
case "${host}" in
x86_64-*)
- # X86_64 machines need additional flags when compiling against libsng_isdn
- CFLAGS="$CFLAGS -DBIT_64 -DALIGN_64BIT"
- ;;
+ # X86_64 machines need additional flags when compiling against libsng_isdn
+ CFLAGS="$CFLAGS -DBIT_64 -DALIGN_64BIT"
+ ;;
esac
fi
fi
-COMP_VENDOR_CFLAGS="$COMP_VENDOR_CFLAGS"
-AC_SUBST(COMP_VENDOR_CFLAGS)
-AC_CONFIG_FILES([Makefile
- freetdm.pc
- mod_freetdm/Makefile])
+##
+# libisdn
+#
+HAVE_LIBISDN="no"
+AC_ARG_WITH([libisdn],
+ [AS_HELP_STRING([--with-libisdn], [Install ftmod_isdn (libisdn stack)])],
+ [case "${withval}" in
+ no) with_libisdn="no" ;;
+ *) with_libisdn="yes" ;;
+ esac
+ ],
+ [with_libisdn="no"]
+)
+if test "${with_libisdn}" != "no"
+then
+ AC_MSG_RESULT([${as_nl}<<>> ftmod_isdn (libisdn stack)])
+ PKG_CHECK_MODULES([libisdn],
+ [libisdn >= 0.0.1],
+ [AC_MSG_CHECKING([libisdn version])
+ LIBISDN_VERSION="`${PKG_CONFIG} --modversion libisdn`"
+ if test -z "${LIBISDN_VERSION}"; then
+ AC_MSG_ERROR([Failed to retrieve libisdn version])
+ fi
+ AC_MSG_RESULT([${LIBISDN_VERSION}])
+
+ # check features
+ AC_MSG_CHECKING([for new experimental API])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [#include
+ #if !LIBISDN_FEATURE(API2)
+ #error "libisdn API v2 not available"
+ #endif
+ ],
+ [;]
+ )],
+ [AC_MSG_RESULT([yes])],
+ [AC_MSG_RESULT([no])]
+ )
+
+ HAVE_LIBISDN="yes"
+ AC_DEFINE([HAVE_LIBISDN], [1], [libisdn support])
+ AC_SUBST([LIBISDN_CFLAGS], [${libisdn_CFLAGS}])
+ AC_SUBST([LIBISDN_CPPFLAGS],[${libisdn_CPPFLAGS}])
+ AC_SUBST([LIBISDN_LDFLAGS], [${libisdn_LDFLAGS}])
+ AC_SUBST([LIBISDN_LIBS], [${libisdn_LIBS}])
+ AC_SUBST([LIBISDN_VERSION])
+ ],
+ [AC_MSG_ERROR([Need libisdn-0.0.1 or higher])]
+ )
+ AX_LIB_PCAP
+fi
+AM_CONDITIONAL([HAVE_LIBISDN], [test "${HAVE_LIBISDN}" = "yes"])
+
+AC_MSG_RESULT([${as_nl}<<>> Creating output files])
+AC_CONFIG_FILES([
+ Makefile
+ freetdm.pc
+ mod_freetdm/Makefile
+])
AC_OUTPUT
+
+#
+# summary screen
+#
+AC_MSG_RESULT([
+============================ FreeTDM configuration ============================
+
++ Modules
+
+ Signalling:
+ ftmod_isdn......................... ${HAVE_LIBISDN}
+ ftmod_libpri....................... ${HAVE_LIBPRI}
+ ftmod_sangoma_isdn................. ${HAVE_SNG_ISDN}
+ ftmod_sangoma_ss7.................. ${HAVE_SNG_SS7}
+ ftmod_r2........................... ${HAVE_OPENR2}
+ ftmod_pritap....................... ${HAVE_PRITAP}
+ I/O:
+ ftmod_wanpipe...................... ${HAVE_LIBSANGOMA}
+
+===============================================================================
+])
diff --git a/libs/freetdm/cyginstall.sh b/libs/freetdm/cyginstall.sh
index 93ba624156..9d486b7dce 100644
--- a/libs/freetdm/cyginstall.sh
+++ b/libs/freetdm/cyginstall.sh
@@ -7,7 +7,7 @@ cp Debug/mod/*.dll $fsdir/Debug/mod/
cp mod_freetdm/Debug/*.pdb $fsdir/Debug/mod/
cp Debug/*.dll $fsdir/Debug/
cp Debug/*.pdb $fsdir/Debug/
-cp Debug/testsangomaboost.exe $fsdir/Debug/
+#cp Debug/testsangomaboost.exe $fsdir/Debug/
echo "FRIENDLY REMINDER: RECOMPILE ftmod_wanpipe WHENEVER YOU INSTALL NEW DRIVERS"
set +x
diff --git a/libs/freetdm/freetdm.2008.sln b/libs/freetdm/freetdm.2008.sln
index 4d1f019987..f059d941d3 100644
--- a/libs/freetdm/freetdm.2008.sln
+++ b/libs/freetdm/freetdm.2008.sln
@@ -63,8 +63,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_sangoma_isdn", "src\f
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_r2", "src\ftmod\ftmod_r2\ftmod_r2.vcproj", "{94F04D58-5EB8-4B48-8FE5-75EBF468073B}"
-EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_r2", "src\ftmod\ftmod_r2\ftmod_r2.2008.vcproj", "{08C3EA27-A51D-47F8-B47D-B189C649CF30}"
EndProject
Global
@@ -162,12 +160,6 @@ Global
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Release|Win32.ActiveCfg = Release|Win32
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Release|Win32.Build.0 = Release|Win32
{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}.Release|x64.ActiveCfg = Release|Win32
- {94F04D58-5EB8-4B48-8FE5-75EBF468073B}.Debug|Win32.ActiveCfg = Debug|Win32
- {94F04D58-5EB8-4B48-8FE5-75EBF468073B}.Debug|Win32.Build.0 = Debug|Win32
- {94F04D58-5EB8-4B48-8FE5-75EBF468073B}.Debug|x64.ActiveCfg = Debug|Win32
- {94F04D58-5EB8-4B48-8FE5-75EBF468073B}.Release|Win32.ActiveCfg = Release|Win32
- {94F04D58-5EB8-4B48-8FE5-75EBF468073B}.Release|Win32.Build.0 = Release|Win32
- {94F04D58-5EB8-4B48-8FE5-75EBF468073B}.Release|x64.ActiveCfg = Release|Win32
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Debug|Win32.ActiveCfg = Debug|Win32
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Debug|Win32.Build.0 = Debug|Win32
{08C3EA27-A51D-47F8-B47D-B189C649CF30}.Debug|x64.ActiveCfg = Debug|Win32
diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c
index b7b8e040d6..a410e4eac6 100755
--- a/libs/freetdm/mod_freetdm/mod_freetdm.c
+++ b/libs/freetdm/mod_freetdm/mod_freetdm.c
@@ -657,7 +657,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
status = ftdm_channel_wait(tech_pvt->ftdmchan, &wflags, chunk);
if (status == FTDM_FAIL) {
- ftdm_log(FTDM_LOG_WARNING, "failed to wait for I/O\n");
+ ftdm_log(FTDM_LOG_ERROR, "Failed to wait for I/O\n");
goto fail;
}
@@ -2434,7 +2434,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans)
char *var = (char *) switch_xml_attr_soft(param, "name");
char *val = (char *) switch_xml_attr_soft(param, "value");
- if (ftdm_array_len(spanparameters) == paramindex) {
+ if (ftdm_array_len(spanparameters) - 1 == paramindex) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Too many parameters for ss7 span, ignoring any parameter after %s\n", var);
break;
}
@@ -2594,7 +2594,7 @@ static switch_status_t load_config(void)
char *var = (char *) switch_xml_attr_soft(param, "name");
char *val = (char *) switch_xml_attr_soft(param, "value");
- if (sizeof(spanparameters)/sizeof(spanparameters[0]) == paramindex) {
+ if (ftdm_array_len(spanparameters) - 1 == paramindex) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Too many parameters for ss7 span, ignoring any parameter after %s\n", var);
break;
}
@@ -2923,102 +2923,56 @@ static switch_status_t load_config(void)
if ((spans = switch_xml_child(cfg, "pri_spans"))) {
for (myspan = switch_xml_child(spans, "span"); myspan; myspan = myspan->next) {
- char *id = (char *) switch_xml_attr(myspan, "id");
char *name = (char *) switch_xml_attr(myspan, "name");
+ ftdm_conf_parameter_t spanparameters[10];
ftdm_status_t zstatus = FTDM_FAIL;
const char *context = "default";
const char *dialplan = "XML";
- //Q921NetUser_t mode = Q931_TE;
- //Q931Dialect_t dialect = Q931_Dialect_National;
- char *mode = NULL;
- char *dialect = NULL;
- uint32_t span_id = 0;
+ unsigned paramindex = 0;
ftdm_span_t *span = NULL;
- const char *tonegroup = NULL;
- char *digit_timeout = NULL;
- const char *opts = "none";
- uint32_t to = 0;
- int q921loglevel = -1;
- int q931loglevel = -1;
-
- // quick debug
- //switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ID: '%s', Name:'%s'\n",id,name);
+ uint32_t span_id = 0;
+
+ if (!name) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required attribute 'name'\n");
+ continue;
+ }
+
+ memset(spanparameters, 0, sizeof(spanparameters));
for (param = switch_xml_child(myspan, "param"); param; param = param->next) {
char *var = (char *) switch_xml_attr_soft(param, "name");
char *val = (char *) switch_xml_attr_soft(param, "value");
- if (!strcasecmp(var, "tonegroup")) {
- tonegroup = val;
- } else if (!strcasecmp(var, "mode")) {
- mode = val;
- } else if (!strcasecmp(var, "dialect")) {
- dialect = val;
- } else if (!strcasecmp(var, "q921loglevel")) {
- if ((q921loglevel = switch_log_str2level(val)) == SWITCH_LOG_INVALID) {
- q921loglevel = -1;
- }
- } else if (!strcasecmp(var, "q931loglevel")) {
- if ((q931loglevel = switch_log_str2level(val)) == SWITCH_LOG_INVALID) {
- q931loglevel = -1;
- }
- } else if (!strcasecmp(var, "context")) {
+ if (ftdm_array_len(spanparameters) - 1 == paramindex) {
+ ftdm_log(FTDM_LOG_ERROR, "Too many parameters for pri span '%s', ignoring everything after '%s'\n", name, var);
+ break;
+ }
+
+ if (ftdm_strlen_zero(var) || ftdm_strlen_zero(val)) {
+ ftdm_log(FTDM_LOG_WARNING, "Skipping parameter with empty name or value\n");
+ continue;
+ }
+
+ if (!strcasecmp(var, "context")) {
context = val;
- } else if (!strcasecmp(var, "opts")) {
- opts = val;
} else if (!strcasecmp(var, "dialplan")) {
dialplan = val;
- } else if (!strcasecmp(var, "digit_timeout") || !strcasecmp(var, "digit-timeout")) {
- digit_timeout = val;
- }
- }
-
- if (!id && !name) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required param 'id'\n");
- continue;
- }
-
- if (name) {
- zstatus = ftdm_span_find_by_name(name, &span);
- } else {
- if (switch_is_number(id)) {
- span_id = atoi(id);
- zstatus = ftdm_span_find(span_id, &span);
- }
-
- if (zstatus != FTDM_SUCCESS) {
- zstatus = ftdm_span_find_by_name(id, &span);
+ } else {
+ spanparameters[paramindex].var = var;
+ spanparameters[paramindex].val = val;
+ paramindex++;
}
}
- if (digit_timeout) {
- to = atoi(digit_timeout);
- }
-
+ zstatus = ftdm_span_find_by_name(name, &span);
if (zstatus != FTDM_SUCCESS) {
- ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name));
+ ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span %s\n", name);
continue;
}
- if (!span_id) {
- span_id = ftdm_span_get_id(span);
- }
-
- if (!tonegroup) {
- tonegroup = "us";
- }
-
- if (ftdm_configure_span(span, "isdn", on_clear_channel_signal,
- "mode", mode,
- "dialect", dialect,
- "digit_timeout", &to,
- "opts", opts,
- "tonemap", tonegroup,
- "q921loglevel", q921loglevel,
- "q931loglevel", q931loglevel,
- FTDM_TAG_END) != FTDM_SUCCESS) {
- ftdm_log(FTDM_LOG_ERROR, "Error starting FreeTDM span %d mode: %s dialect: %s error: %s\n", span_id,
- mode, dialect, ftdm_span_get_last_error(span));
+ span_id = ftdm_span_get_id(span);
+ if (ftdm_configure_span_signaling(span, "isdn", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) {
+ ftdm_log(FTDM_LOG_ERROR, "Error configuring FreeTDM span %s\n", name);
continue;
}
@@ -3048,11 +3002,18 @@ static switch_status_t load_config(void)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required attribute 'name'\n");
continue;
}
-
+
+ memset(spanparameters, 0, sizeof(spanparameters));
+
for (param = switch_xml_child(myspan, "param"); param; param = param->next) {
char *var = (char *) switch_xml_attr_soft(param, "name");
char *val = (char *) switch_xml_attr_soft(param, "value");
+ if (ftdm_array_len(spanparameters) - 1 == paramindex) {
+ ftdm_log(FTDM_LOG_ERROR, "Too many parameters for pritap span '%s', ignoring everything after '%s'\n", name, var);
+ break;
+ }
+
if (!strcasecmp(var, "context")) {
context = val;
} else if (!strcasecmp(var, "dialplan")) {
@@ -3088,85 +3049,56 @@ static switch_status_t load_config(void)
if ((spans = switch_xml_child(cfg, "libpri_spans"))) {
for (myspan = switch_xml_child(spans, "span"); myspan; myspan = myspan->next) {
- char *id = (char *) switch_xml_attr(myspan, "id");
char *name = (char *) switch_xml_attr(myspan, "name");
+ ftdm_conf_parameter_t spanparameters[10];
ftdm_status_t zstatus = FTDM_FAIL;
- const char *context = "default";
+ const char *context = "default";
const char *dialplan = "XML";
-
- const char *o_node = "cpe";
- const char *o_switch = "dms100";
- const char *o_dp = "unknown";
- const char *o_l1 = "ulaw";
- const char *o_debug = "none";
- const char* opts = "none";
-
- uint32_t span_id = 0;
+ unsigned paramindex = 0;
ftdm_span_t *span = NULL;
+ uint32_t span_id = 0;
+
+ if (!name) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required attribute 'name'\n");
+ continue;
+ }
+
+ memset(spanparameters, 0, sizeof(spanparameters));
-
for (param = switch_xml_child(myspan, "param"); param; param = param->next) {
char *var = (char *) switch_xml_attr_soft(param, "name");
char *val = (char *) switch_xml_attr_soft(param, "value");
- if (!strcasecmp(var, "node")) {
- o_node = val;
- } else if (!strcasecmp(var, "switch")) {
- o_switch = val;
- } else if (!strcasecmp(var, "dp")) {
- o_dp = val;
- } else if (!strcasecmp(var, "l1")) {
- o_l1 = val;
- } else if (!strcasecmp(var, "debug")) {
- o_debug = val;
- } else if (!strcasecmp(var, "context")) {
+ if (ftdm_array_len(spanparameters) - 1 == paramindex) {
+ ftdm_log(FTDM_LOG_ERROR, "Too many parameters for libpri span, ignoring everything after '%s'\n", var);
+ break;
+ }
+
+ if (ftdm_strlen_zero(var) || ftdm_strlen_zero(val)) {
+ ftdm_log(FTDM_LOG_WARNING, "Skipping parameter with empty name or value\n");
+ continue;
+ }
+
+ if (!strcasecmp(var, "context")) {
context = val;
- } else if (!strcasecmp(var, "opts")) {
- opts = val;
} else if (!strcasecmp(var, "dialplan")) {
dialplan = val;
- }
- }
-
- if (!id && !name) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required param 'id'\n");
- continue;
- }
-
- if (name) {
- zstatus = ftdm_span_find_by_name(name, &span);
- } else {
- if (switch_is_number(id)) {
- span_id = atoi(id);
- zstatus = ftdm_span_find(span_id, &span);
- }
-
- if (zstatus != FTDM_SUCCESS) {
- zstatus = ftdm_span_find_by_name(id, &span);
+ } else {
+ spanparameters[paramindex].var = var;
+ spanparameters[paramindex].val = val;
+ paramindex++;
}
}
+ zstatus = ftdm_span_find_by_name(name, &span);
if (zstatus != FTDM_SUCCESS) {
- ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span id:%s name:%s\n", switch_str_nil(id), switch_str_nil(name));
+ ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span %s\n", name);
continue;
}
- if (!span_id) {
- span_id = ftdm_span_get_id(span);
- }
-
-
- if (ftdm_configure_span(span, "libpri", on_clear_channel_signal,
- "node", o_node,
- "switch", o_switch,
- "dp", o_dp,
- "l1", o_l1,
- "debug", o_debug,
- "opts", opts,
- FTDM_TAG_END) != FTDM_SUCCESS) {
- ftdm_log(FTDM_LOG_ERROR, "Error starting FreeTDM span %d node: %s switch: %s dp: %s l1: %s debug: %s error: %s\n",
- span_id, switch_str_nil(o_node), switch_str_nil(o_switch), switch_str_nil(o_dp), switch_str_nil(o_l1), switch_str_nil(o_debug),
- ftdm_span_get_last_error(span));
+ span_id = ftdm_span_get_id(span);
+ if (ftdm_configure_span_signaling(span, "libpri", on_clear_channel_signal, spanparameters) != FTDM_SUCCESS) {
+ ftdm_log(FTDM_LOG_ERROR, "Error configuring FreeTDM span %s\n", name);
continue;
}
@@ -3206,7 +3138,8 @@ static switch_status_t load_config(void)
for (param = switch_xml_child(myspan, "param"); param; param = param->next) {
char *var = (char *) switch_xml_attr_soft(param, "name");
char *val = (char *) switch_xml_attr_soft(param, "value");
- if (sizeof(spanparameters)/sizeof(spanparameters[0]) == paramindex) {
+
+ if (ftdm_array_len(spanparameters) - 1 == paramindex) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Too many parameters for boost span, ignoring any parameter after %s\n", var);
break;
}
diff --git a/libs/freetdm/patches/oz.diff b/libs/freetdm/patches/oz.diff
deleted file mode 100644
index 2e9c558b7c..0000000000
--- a/libs/freetdm/patches/oz.diff
+++ /dev/null
@@ -1,134 +0,0 @@
-Index: src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c
-===================================================================
---- src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c (revision 745)
-+++ src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c (working copy)
-@@ -98,19 +98,21 @@
- * so we can have one analong handler thread that will deal with all the idle analog channels for events
- * the alternative would be for the driver to provide one socket for all of the oob events for all analog channels
- */
--static __inline__ int tdmv_api_wait_socket(sng_fd_t fd, int timeout, int *flags)
-+static __inline__ int tdmv_api_wait_socket(zap_channel_t *zchan, int timeout, int *flags)
- {
-
- #ifdef LIBSANGOMA_VERSION
- int err;
-- sangoma_wait_obj_t sangoma_wait_obj;
-+ sangoma_wait_obj_t *sangoma_wait_obj = zchan->mod_data;
-
-- sangoma_init_wait_obj(&sangoma_wait_obj, fd, 1, 1, *flags, SANGOMA_WAIT_OBJ);
-+ sangoma_init_wait_obj(sangoma_wait_obj, zchan->sockfd, 1, 1, 0, SANGOMA_WAIT_OBJ);
-
-- err=sangoma_socket_waitfor_many(&sangoma_wait_obj,1 , timeout);
-+ err = sangoma_socket_waitfor_many(&sangoma_wait_obj, 1, timeout);
-+
- if (err > 0) {
-- *flags=sangoma_wait_obj.flags_out;
-+ *flags = sangoma_wait_obj.flags_out;
- }
-+
- return err;
-
- #else
-@@ -118,7 +120,7 @@
- int res;
-
- memset(&pfds[0], 0, sizeof(pfds[0]));
-- pfds[0].fd = fd;
-+ pfds[0].fd = zchan->sockfd;
- pfds[0].events = *flags;
- res = poll(pfds, 1, timeout);
- *flags = 0;
-@@ -200,6 +202,15 @@
-
- if (sockfd != WP_INVALID_SOCKET && zap_span_add_channel(span, sockfd, type, &chan) == ZAP_SUCCESS) {
- wanpipe_tdm_api_t tdm_api;
-+#ifdef LIBSANGOMA_VERSION
-+ sangoma_wait_obj_t *sangoma_wait_obj;
-+
-+ sangoma_wait_obj = malloc(sizeof(*sangoma_wait_obj));
-+ memset(sangoma_wait_obj, 0, sizeof(*sangoma_wait_obj));
-+ sangoma_init_wait_obj(sangoma_wait_obj, sockfd, 1, 1, 0, SANGOMA_WAIT_OBJ);
-+ chan->mod_data = sangoma_wait_obj;
-+#endif
-+
- memset(&tdm_api,0,sizeof(tdm_api));
-
- chan->physical_span_id = spanno;
-@@ -211,7 +222,7 @@
-
- dtmf = "software";
-
-- /* FIXME: Handle Error Conditino Check for return code */
-+ /* FIXME: Handle Error Condition Check for return code */
- err= sangoma_tdm_get_hw_coding(chan->sockfd, &tdm_api);
-
- if (tdm_api.wp_tdm_cmd.hw_tdm_coding) {
-@@ -606,7 +617,7 @@
- inflags |= POLLPRI;
- }
-
-- result = tdmv_api_wait_socket(zchan->sockfd, to, &inflags);
-+ result = tdmv_api_wait_socket(zchan, to, &inflags);
-
- *flags = ZAP_NO_FLAGS;
-
-@@ -643,26 +654,30 @@
- ZIO_SPAN_POLL_EVENT_FUNCTION(wanpipe_poll_event)
- {
- #ifdef LIBSANGOMA_VERSION
-- sangoma_wait_obj_t pfds[ZAP_MAX_CHANNELS_SPAN];
-+ sangoma_wait_obj_t *pfds[ZAP_MAX_CHANNELS_SPAN] = { 0 };
- #else
- struct pollfd pfds[ZAP_MAX_CHANNELS_SPAN];
- #endif
-
- uint32_t i, j = 0, k = 0, l = 0;
-- int objects=0;
- int r;
-
- for(i = 1; i <= span->chan_count; i++) {
- zap_channel_t *zchan = span->channels[i];
-
-+
- #ifdef LIBSANGOMA_VERSION
-- sangoma_init_wait_obj(&pfds[j], zchan->sockfd , 1, 1, POLLPRI, SANGOMA_WAIT_OBJ);
-+ if (!zchan->mod_data) {
-+ continue;
-+ }
-+ pfds[j] = zchan->mod_data;
-+
- #else
- memset(&pfds[j], 0, sizeof(pfds[j]));
- pfds[j].fd = span->channels[i]->sockfd;
- pfds[j].events = POLLPRI;
- #endif
-- objects++;
-+
- /* The driver probably should be able to do this wink/flash/ringing by itself this is sort of a hack to make it work! */
-
- if (zap_test_flag(zchan, ZAP_CHANNEL_WINK) || zap_test_flag(zchan, ZAP_CHANNEL_FLASH)) {
-@@ -703,7 +718,7 @@
- ms = l;
- }
- #ifdef LIBSANGOMA_VERSION
-- r = sangoma_socket_waitfor_many(pfds,objects,ms);
-+ r = sangoma_socket_waitfor_many(pfds, j, ms);
- #else
- r = poll(pfds, j, ms);
- #endif
-@@ -935,6 +950,15 @@
- */
- static ZIO_CHANNEL_DESTROY_FUNCTION(wanpipe_channel_destroy)
- {
-+ sangoma_wait_obj_t *sangoma_wait_obj;
-+
-+ if (zchan->mod_data) {
-+ sangoma_wait_obj = zchan->mod_data;
-+ zchan->mod_data = NULL;
-+ sangoma_release_wait_obj(sangoma_wait_obj);
-+ free(sangoma_wait_obj);
-+ }
-+
- if (zchan->sockfd > -1) {
- close(zchan->sockfd);
- zchan->sockfd = WP_INVALID_SOCKET;
diff --git a/libs/freetdm/src/ftdm_io.c b/libs/freetdm/src/ftdm_io.c
index f02c9c48db..0aeaeedce4 100644
--- a/libs/freetdm/src/ftdm_io.c
+++ b/libs/freetdm/src/ftdm_io.c
@@ -1751,7 +1751,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_chan(ftdm_channel_t *ftdmchan)
goto done;
}
- if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_IN_ALARM)) {
+ if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_IN_ALARM) && !ftdm_test_flag(ftdmchan->span, FTDM_SPAN_PWR_SAVING)) {
snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "%s", "Channel is alarmed\n");
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_WARNING, "Cannot open channel when is alarmed\n");
goto done;
@@ -1915,6 +1915,11 @@ FT_DECLARE(ftdm_trunk_type_t) ftdm_span_get_trunk_type(const ftdm_span_t *span)
return span->trunk_type;
}
+FT_DECLARE(const char *) ftdm_span_get_trunk_type_str(const ftdm_span_t *span)
+{
+ return ftdm_trunk_type2str(span->trunk_type);
+}
+
FT_DECLARE(uint32_t) ftdm_span_get_id(const ftdm_span_t *span)
{
return span->span_id;
@@ -2114,6 +2119,15 @@ FT_DECLARE(ftdm_caller_data_t *) ftdm_channel_get_caller_data(ftdm_channel_t *ft
return &ftdmchan->caller_data;
}
+FT_DECLARE(int) ftdm_channel_get_state(const ftdm_channel_t *ftdmchan)
+{
+ int state;
+ ftdm_channel_lock(ftdmchan);
+ state = ftdmchan->state;
+ ftdm_channel_unlock(ftdmchan);
+ return state;
+}
+
FT_DECLARE(const char *) ftdm_channel_get_state_str(const ftdm_channel_t *ftdmchan)
{
const char *state;
@@ -2123,6 +2137,15 @@ FT_DECLARE(const char *) ftdm_channel_get_state_str(const ftdm_channel_t *ftdmch
return state;
}
+FT_DECLARE(int) ftdm_channel_get_last_state(const ftdm_channel_t *ftdmchan)
+{
+ int last_state;
+ ftdm_channel_lock(ftdmchan);
+ last_state = ftdmchan->last_state;
+ ftdm_channel_unlock(ftdmchan);
+ return last_state;
+}
+
FT_DECLARE(const char *) ftdm_channel_get_last_state_str(const ftdm_channel_t *ftdmchan)
{
const char *state;
@@ -3927,6 +3950,11 @@ static ftdm_status_t ftdm_set_channels_alarms(ftdm_span_t *span, int currindex)
ftdm_log(FTDM_LOG_ERROR, "%d:%d: Failed to get alarms\n", span->channels[chan_index]->physical_span_id, span->channels[chan_index]->physical_chan_id);
return FTDM_FAIL;
}
+ if (span->channels[chan_index]->alarm_flags) {
+ ftdm_set_flag_locked(span->channels[chan_index], FTDM_CHANNEL_IN_ALARM);
+ } else {
+ ftdm_clear_flag_locked(span->channels[chan_index], FTDM_CHANNEL_IN_ALARM);
+ }
}
return FTDM_SUCCESS;
}
diff --git a/libs/freetdm/src/ftdm_m3ua.c b/libs/freetdm/src/ftdm_m3ua.c
index 31f4cd5c5e..1a6fe362e7 100644
--- a/libs/freetdm/src/ftdm_m3ua.c
+++ b/libs/freetdm/src/ftdm_m3ua.c
@@ -484,7 +484,7 @@ static FIO_SPAN_NEXT_EVENT_FUNCTION(m3ua_next_event)
static FIO_SPAN_DESTROY_FUNCTION(m3ua_span_destroy)
{
- m3ua_span_data_t *span_data = (m3ua_span_data_t *) span->mod_data;
+ m3ua_span_data_t *span_data = (m3ua_span_data_t *) span->io_data;
if (span_data) {
ftdm_safe_free(span_data);
@@ -494,8 +494,8 @@ static FIO_SPAN_DESTROY_FUNCTION(m3ua_span_destroy)
}
static FIO_CHANNEL_DESTROY_FUNCTION(m3ua_channel_destroy)
{
- m3ua_chan_data_t *chan_data = (m3ua_chan_data_t *) ftdmchan->mod_data;
- m3ua_span_data_t *span_data = (m3ua_span_data_t *) ftdmchan->span->mod_data;
+ m3ua_chan_data_t *chan_data = (m3ua_chan_data_t *) ftdmchan->io_data;
+ m3ua_span_data_t *span_data = (m3ua_span_data_t *) ftdmchan->span->io_data;
if (!chan_data) {
return FTDM_FAIL;
diff --git a/libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c b/libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c
index 65c9dfc11f..1dbd6d362e 100644
--- a/libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c
+++ b/libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c
@@ -1,23 +1,23 @@
/*
* Copyright (c) 2007, Anthony Minessale II
* All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
- *
+ *
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
- *
+ *
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- *
+ *
* * Neither the name of the original author; nor the names of any contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
- *
- *
+ *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -30,267 +30,258 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
-/**
- * Workaround for missing u_int / u_short types on solaris
- */
-#if defined(HAVE_LIBPCAP) && defined(__SunOS)
-#define __EXTENSIONS__
+#ifdef HAVE_CONFIG_H
+#include "config.h"
#endif
+#include
+#include
+#include
-#include "private/ftdm_core.h"
-#include "Q931.h"
-#include "Q921.h"
#ifdef WIN32
#include
#else
#include
#endif
-#include "ftdm_isdn.h"
+#include "ftmod_isdn.h"
#define LINE "--------------------------------------------------------------------------------"
-//#define IODEBUG
/* helper macros */
-#define FTDM_SPAN_IS_BRI(x) ((x)->trunk_type == FTDM_TRUNK_BRI || (x)->trunk_type == FTDM_TRUNK_BRI_PTMP)
#define FTDM_SPAN_IS_NT(x) (((ftdm_isdn_data_t *)(x)->signal_data)->mode == Q921_NT)
+#define DEFAULT_NATIONAL_PREFIX "0"
+#define DEFAULT_INTERNATIONAL_PREFIX "00"
-#ifdef HAVE_LIBPCAP
-/*-------------------------------------------------------------------------*/
-/*Q931ToPcap functions*/
+/*****************************************************************************************
+ * PCAP
+ * Based on Helmut Kuper's () implementation,
+ * but using a different approach (needs a recent libpcap + wireshark)
+ *****************************************************************************************/
+#ifdef HAVE_PCAP
+#include /* htons() */
#include
-#endif
-#define SNAPLEN 1522
-#define MAX_ETHER_PAYLOAD_SIZE 1500
-#define MIN_ETHER_PAYLOAD_SIZE 42
-#define SIZE_ETHERNET 18
-#define VLANID_OFFSET 15
-#define SIZE_IP 20
-#define SIZE_TCP 20
-#define SIZE_TPKT 4
-#define SIZE_ETHERNET_CRC 4
-#define OVERHEAD SIZE_ETHERNET+SIZE_IP+SIZE_TCP+SIZE_TPKT
-#define MAX_Q931_SIZE MAX_ETHER_PAYLOAD_SIZE-SIZE_IP-SIZE_TCP-SIZE_TPKT
-#define TPKT_SIZE_OFFSET SIZE_ETHERNET+SIZE_IP+SIZE_TCP+2
-#define IP_SIZE_OFFSET SIZE_ETHERNET+2
-#define TCP_SEQ_OFFSET SIZE_ETHERNET+SIZE_IP+4
+#define PCAP_SNAPLEN 1500
-#ifdef HAVE_LIBPCAP
-/*Some globals*/
-unsigned long pcapfilesize = 0;
-unsigned long tcp_next_seq_no_send = 0;
-unsigned long tcp_next_seq_no_rec = 0;
-pcap_dumper_t *pcapfile = NULL;
-struct pcap_pkthdr pcaphdr;
-pcap_t *pcaphandle = NULL;
-char *pcapfn = NULL;
-int do_q931ToPcap= 0;
+struct pcap_context {
+ pcap_dumper_t *dump; /*!< pcap file handle */
+ pcap_t *handle; /*!< pcap lib context */
+ char *filename; /*!< capture file name */
+};
-/*Predefined Ethernet Frame with Q931-over-IP encapsulated - From remote TDM host to FreeSWITCH*/
-L3UCHAR recFrame[SNAPLEN]= {
- /*IEEE 802.3 VLAN 802.1q Ethernet Frame Header*/
- 2,0,1,0xAA,0xAA,0xAA,2,0,1,0xBB,0xBB,0xBB,0x81,0,0xE0,0,0x08,0,
- /*IPv4 Header (minimal size; no options)*/
- 0x45,0,0,44,0,0,0,0,64,6,0,0,2,2,2,2,1,1,1,1,
- /*TCP-Header*/
- 0,0x66,0,0x66,0,0,0,0,0,0,0,0,0x50,0,0,1,0,0,0,0,
- /*TPKT-Header RFC 1006*/
- 3,0,0,0
- };
-
-/*Predefined Ethernet Frame with Q931-over-IP encapsulated - Frome FreeSWITCH to remote TDM host*/
-L3UCHAR sendFrame[SNAPLEN]= {
- /*IEEE 802.3 VLAN 802.1q Ethernet Frame Header*/
- 2,0,1,0xBB,0xBB,0xBB,2,0,1,0xAA,0xAA,0xAA,0x81,0,0xE0,0,0x08,0,
- /*IPv4 Header (minimal size; no options)*/
- 0x45,0,0,44,0,0,0,0,64,6,0,0,1,1,1,1,2,2,2,2,
- /*TCP-Header*/
- 0,0x66,0,0x66,0,0,0,0,0,0,0,0,0x50,0,0,1,0,0,0,0,
- /*TPKT-Header RFC 1006*/
- 3,0,0,0
- };
-
-/**
- * \brief Opens a pcap file for capture
- * \return Success or failure
- */
-static ftdm_status_t openPcapFile(void)
+static inline ftdm_status_t isdn_pcap_is_open(struct ftdm_isdn_data *isdn)
{
- if(!pcaphandle)
- {
- pcaphandle = pcap_open_dead(DLT_EN10MB, SNAPLEN);
- if (!pcaphandle)
- {
- ftdm_log(FTDM_LOG_ERROR, "Can't open pcap session: (%s)\n", pcap_geterr(pcaphandle));
- return FTDM_FAIL;
- }
- }
-
- if(!pcapfile){
- /* Open the dump file */
- if(!(pcapfile=pcap_dump_open(pcaphandle, pcapfn))){
- ftdm_log(FTDM_LOG_ERROR, "Error opening output file (%s)\n", pcap_geterr(pcaphandle));
- return FTDM_FAIL;
- }
- }
- else{
- ftdm_log(FTDM_LOG_WARNING, "Pcap file is already open!\n");
- return FTDM_FAIL;
- }
-
- ftdm_log(FTDM_LOG_DEBUG, "Pcap file '%s' successfully opened!\n", pcapfn);
-
- pcaphdr.ts.tv_sec = 0;
- pcaphdr.ts.tv_usec = 0;
- pcapfilesize = 24; /*current pcap file header seems to be 24 bytes*/
- tcp_next_seq_no_send = 0;
- tcp_next_seq_no_rec = 0;
-
- return FTDM_SUCCESS;
+ return (isdn->pcap) ? 1 : 0;
}
-/**
- * \brief Closes a pcap file
- * \return Success
- */
-static ftdm_status_t closePcapFile(void)
+static inline ftdm_status_t isdn_pcap_capture_both(struct ftdm_isdn_data *isdn)
{
- if (pcapfile) {
- pcap_dump_close(pcapfile);
- if (pcaphandle) pcap_close(pcaphandle);
+ return ((isdn->flags & (FTDM_ISDN_CAPTURE | FTDM_ISDN_CAPTURE_L3ONLY)) == FTDM_ISDN_CAPTURE) ? 1 : 0;
+}
- ftdm_log(FTDM_LOG_DEBUG, "Pcap file closed! File size is %lu bytes.\n", pcapfilesize);
+static inline ftdm_status_t isdn_pcap_capture_l3only(struct ftdm_isdn_data *isdn)
+{
+ return ((isdn->flags & FTDM_ISDN_CAPTURE) && (isdn->flags & FTDM_ISDN_CAPTURE_L3ONLY)) ? 1 : 0;
+}
- pcaphdr.ts.tv_sec = 0;
- pcaphdr.ts.tv_usec = 0;
- pcapfile = NULL;
- pcaphandle = NULL;
- pcapfilesize = 0;
- tcp_next_seq_no_send = 0;
- tcp_next_seq_no_rec = 0;
+static ftdm_status_t isdn_pcap_open(struct ftdm_isdn_data *isdn, char *filename)
+{
+ struct pcap_context *pcap = NULL;
+
+ if (!isdn || ftdm_strlen_zero(filename))
+ return FTDM_FAIL;
+
+ pcap = malloc(sizeof(struct pcap_context));
+ if (!pcap) {
+ ftdm_log(FTDM_LOG_ERROR, "Failed to allocate isdn pcap context\n");
+ return FTDM_FAIL;
}
- /*We have allways success with this? I think so*/
+ memset(pcap, 0, sizeof(struct pcap_context));
+
+ pcap->filename = strdup(filename);
+
+ pcap->handle = pcap_open_dead(DLT_LINUX_LAPD, PCAP_SNAPLEN);
+ if (!pcap->handle) {
+ ftdm_log(FTDM_LOG_ERROR, "Failed to open pcap handle\n");
+ goto error;
+ }
+
+ pcap->dump = pcap_dump_open(pcap->handle, pcap->filename);
+ if (!pcap->dump) {
+ ftdm_log(FTDM_LOG_ERROR, "Failed to open capture file: '%s'\n", pcap_geterr(pcap->handle));
+ goto error;
+ }
+
+ ftdm_log(FTDM_LOG_INFO, "Capture file '%s' opened\n", pcap->filename);
+
+ isdn->pcap = pcap;
+
+ return FTDM_SUCCESS;
+error:
+ if (pcap->handle)
+ pcap_close(pcap->handle);
+ if (pcap->filename)
+ free(pcap->filename);
+
+ free(pcap);
+
+ return FTDM_FAIL;
+}
+
+static ftdm_status_t isdn_pcap_close(struct ftdm_isdn_data *isdn)
+{
+ struct pcap_context *pcap = NULL;
+ long size;
+
+ if (!isdn || !isdn->pcap)
+ return FTDM_FAIL;
+
+ pcap = isdn->pcap;
+
+ isdn->flags &= ~(FTDM_ISDN_CAPTURE | FTDM_ISDN_CAPTURE_L3ONLY);
+ isdn->pcap = NULL;
+
+ pcap_dump_flush(pcap->dump);
+
+ size = pcap_dump_ftell(pcap->dump);
+ ftdm_log(FTDM_LOG_INFO, "File '%s' captured %ld bytes of data\n", pcap->filename, size);
+
+ pcap_dump_close(pcap->dump);
+ pcap_close(pcap->handle);
+
+ free(pcap->filename);
+ free(pcap);
+
return FTDM_SUCCESS;
}
-/**
- * \brief Writes a Q931 packet to a pcap file
- * \return Success or failure
- */
-static ftdm_status_t writeQ931PacketToPcap(L3UCHAR* q931buf, L3USHORT q931size, L3ULONG span_id, L3USHORT direction)
+static inline void isdn_pcap_start(struct ftdm_isdn_data *isdn)
{
- L3UCHAR *frame = NULL;
- struct timeval ts;
- u_char spanid = (u_char)span_id;
- unsigned long *tcp_next_seq_no = NULL;
+ if (!isdn->pcap)
+ return;
- spanid=span_id;
-
- /*The total length of the ethernet frame generated by this function has a min length of 66
- so we don't have to care about padding :)*/
+ isdn->flags |= FTDM_ISDN_CAPTURE;
+}
+static inline void isdn_pcap_stop(struct ftdm_isdn_data *isdn)
+{
+ isdn->flags &= ~FTDM_ISDN_CAPTURE;
+}
- /*FS is sending the packet*/
- if(direction==0){
- frame=sendFrame;
- tcp_next_seq_no = &tcp_next_seq_no_send;
- }
- /*FS is receiving the packet*/
- else{
- frame=recFrame;
- tcp_next_seq_no = &tcp_next_seq_no_rec;
+#ifndef ETH_P_LAPD
+#define ETH_P_LAPD 0x0030
+#endif
+
+struct isdn_sll_hdr {
+ uint16_t slltype;
+ uint16_t sllhatype;
+ uint16_t slladdrlen;
+ uint8_t slladdr[8];
+ uint16_t sllproto;
+};
+
+/* Fake Q.921 I-frame */
+//static const char q921_fake_frame[] = { 0x00, 0x00, 0x00, 0x00 };
+
+enum {
+ ISDN_PCAP_INCOMING = 0,
+ ISDN_PCAP_INCOMING_BCAST = 1,
+ ISDN_PCAP_OUTGOING = 4,
+};
+
+static ftdm_status_t isdn_pcap_write(struct ftdm_isdn_data *isdn, unsigned char *buf, ftdm_ssize_t len, int direction)
+{
+ unsigned char frame[PCAP_SNAPLEN];
+ struct pcap_context *pcap;
+ struct isdn_sll_hdr *sll_hdr = (struct isdn_sll_hdr *)frame;
+ struct pcap_pkthdr hdr;
+ int offset = sizeof(struct isdn_sll_hdr);
+ int nbytes;
+
+ if (!isdn || !isdn->pcap || !buf || !len)
+ return FTDM_FAIL;
+
+ pcap = isdn->pcap;
+
+ /* Update SLL header */
+ sll_hdr->slltype = htons(direction);
+ sll_hdr->sllhatype = 0;
+ sll_hdr->slladdrlen = 1;
+ sll_hdr->slladdr[0] = (isdn->mode == Q921_NT) ? 1 : 0; /* TODO: NT/TE */
+ sll_hdr->sllproto = htons(ETH_P_LAPD);
+
+#if 0
+ /* Q.931-only mode: copy fake Q.921 header */
+ if (isdn->flags & FTDM_ISDN_CAPTURE_L3ONLY) {
+ /* copy fake q921 header */
+ memcpy(frame + offset, q921_fake_frame, sizeof(q921_fake_frame));
+ offset += sizeof(q921_fake_frame);
}
-
- /*Set spanid in VLAN-ID tag*/
- frame[VLANID_OFFSET] = spanid;
-
- /*** Write sent packet ***/
- if(q931size > MAX_Q931_SIZE)
- {
- /*WARNING*/
- ftdm_log(FTDM_LOG_WARNING, "Q931 packet size is too big (%u)! Ignoring it!\n", q931size);
- return FTDM_FAIL;
- }
-
- /*Copy q931 buffer into frame*/
- memcpy(frame+OVERHEAD,q931buf,q931size);
-
- /*Store TCP sequence number in TCP header*/
- frame[TCP_SEQ_OFFSET]=(*tcp_next_seq_no>>24)&0xFF;
- frame[TCP_SEQ_OFFSET+1]=(*tcp_next_seq_no>>16)&0xFF;
- frame[TCP_SEQ_OFFSET+2]=(*tcp_next_seq_no>>8)&0xFF;
- frame[TCP_SEQ_OFFSET+3]=*tcp_next_seq_no & 0xFF;
-
- /*Store size of TPKT packet*/
- q931size+=4;
- frame[TPKT_SIZE_OFFSET]=(q931size>>8)&0xFF;
- frame[TPKT_SIZE_OFFSET+1]=q931size&0xFF;
-
- /*Calc next TCP sequence number*/
- *tcp_next_seq_no+=q931size;
-
- /*Store size of IP packet*/
- q931size+=SIZE_IP+SIZE_TCP;
- frame[IP_SIZE_OFFSET]=(q931size>>8)&0xFF;
- frame[IP_SIZE_OFFSET+1]=q931size&0xFF;
-
- pcaphdr.caplen = SIZE_ETHERNET+SIZE_ETHERNET_CRC+q931size;
- pcaphdr.len = pcaphdr.caplen;
-
- /* Set Timestamp */
- /* Get Time in ms. usecs would be better ... */
- gettimeofday(&ts, NULL);
- /*Write it into packet header*/
- pcaphdr.ts.tv_sec = ts.tv_sec;
- pcaphdr.ts.tv_usec = ts.tv_usec;
-
- pcap_dump((u_char*)pcapfile, &pcaphdr, frame);
- pcap_dump_flush(pcapfile);
-
- /*Maintain pcap file size*/
- pcapfilesize+=pcaphdr.caplen;
- pcapfilesize+=sizeof(struct pcap_pkthdr);
-
- ftdm_log(FTDM_LOG_DEBUG, "Added %u bytes to pcap file. File size is now %lu, \n", q931size, pcapfilesize);
-
- return FTDM_SUCCESS;
-}
-
#endif
-/**
- * \brief Unloads pcap IO
- * \return Success or failure
- */
-static FIO_IO_UNLOAD_FUNCTION(close_pcap)
-{
-#ifdef HAVE_LIBPCAP
- return closePcapFile();
-#else
+ /* Copy data */
+ nbytes = (len > (PCAP_SNAPLEN - offset)) ? (PCAP_SNAPLEN - offset) : len;
+ memcpy(frame + offset, buf, nbytes);
+
+ /* Update timestamp */
+ memset(&hdr, 0, sizeof(struct pcap_pkthdr));
+ gettimeofday(&hdr.ts, NULL);
+ hdr.caplen = offset + nbytes;
+ hdr.len = hdr.caplen;
+
+ /* Write packet */
+ pcap_dump((unsigned char *)pcap->dump, &hdr, frame);
+
return FTDM_SUCCESS;
-#endif
}
+#endif /* HAVE_PCAP */
-/*Q931ToPcap functions DONE*/
-/*-------------------------------------------------------------------------*/
-/**
- * \brief Gets current time
- * \return Current time (in ms)
- */
static L2ULONG ftdm_time_now(void)
{
return (L2ULONG)ftdm_current_time_in_ms();
}
/**
- * \brief Initialises an ISDN channel (outgoing call)
- * \param ftdmchan Channel to initiate call on
- * \return Success or failure
+ * \brief Returns the signalling status on a channel
+ * \param ftdmchan Channel to get status on
+ * \param status Pointer to set signalling status
+ * \return Success or failure
+ */
+static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(isdn_get_channel_sig_status)
+{
+ *status = FTDM_SIG_STATE_DOWN;
+
+ ftdm_isdn_data_t *isdn_data = ftdmchan->span->signal_data;
+ if (ftdm_test_flag(isdn_data, FTDM_ISDN_RUNNING)) {
+ *status = FTDM_SIG_STATE_UP;
+ }
+ return FTDM_SUCCESS;
+}
+
+/**
+ * \brief Returns the signalling status on a span
+ * \param span Span to get status on
+ * \param status Pointer to set signalling status
+ * \return Success or failure
+ */
+static FIO_SPAN_GET_SIG_STATUS_FUNCTION(isdn_get_span_sig_status)
+{
+ *status = FTDM_SIG_STATE_DOWN;
+
+ ftdm_isdn_data_t *isdn_data = span->signal_data;
+ if (ftdm_test_flag(isdn_data, FTDM_ISDN_RUNNING)) {
+ *status = FTDM_SIG_STATE_UP;
+ }
+ return FTDM_SUCCESS;
+}
+
+/**
+ * \brief Create outgoing channel
+ * \param ftdmchan Channel to create outgoing call on
+ * \return Success or failure
*/
static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(isdn_outgoing_call)
{
@@ -301,14 +292,12 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(isdn_outgoing_call)
}
/**
- * \brief Requests an ISDN channel on a span (outgoing call)
- * \param span Span where to get a channel
- * \param chan_id Specific channel to get (0 for any)
- * \param direction Call direction (inbound, outbound)
- * \param caller_data Caller information
- * \param ftdmchan Channel to initialise
- * \return Success or failure
+ * \brief Create outgoing channel, let module select the channel to use
+ * \param span Span to create outgoing call on
+ * \param caller_data
+ * \return Success or failure
*/
+#ifdef __TODO__
static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
{
Q931mes_Generic *gen = (Q931mes_Generic *) caller_data->raw_data;
@@ -348,7 +337,7 @@ static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
BearerCap.ITR = Q931_ITR_64K; /* 64k */
BearerCap.Layer1Ident = 1;
BearerCap.UIL1Prot = (codec == FTDM_CODEC_ALAW) ? Q931_UIL1P_G711A : Q931_UIL1P_G711U; /* U-law = 2, A-law = 3 */
- gen->BearerCap = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &BearerCap);
+ gen->BearerCap = Q931AppendIE(gen, (L3UCHAR *) &BearerCap);
/*
* Channel ID IE
@@ -356,20 +345,20 @@ static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
Q931InitIEChanID(&ChanID);
ChanID.IntType = FTDM_SPAN_IS_BRI(span) ? 0 : 1; /* PRI = 1, BRI = 0 */
- if(!FTDM_SPAN_IS_NT(span)) {
+ if (!FTDM_SPAN_IS_NT(span)) {
ChanID.PrefExcl = (isdn_data->opts & FTDM_ISDN_OPT_SUGGEST_CHANNEL) ? 0 : 1; /* 0 = preferred, 1 exclusive */
} else {
ChanID.PrefExcl = 1; /* always exclusive in NT-mode */
}
- if(ChanID.IntType) {
+ if (ChanID.IntType) {
ChanID.InfoChanSel = 1; /* None = 0, See Slot = 1, Any = 3 */
ChanID.ChanMapType = 3; /* B-Chan */
ChanID.ChanSlot = (unsigned char)chan_id;
} else {
ChanID.InfoChanSel = (unsigned char)chan_id & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
}
- gen->ChanID = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &ChanID);
+ gen->ChanID = Q931AppendIE(gen, (L3UCHAR *) &ChanID);
/*
* Progress IE
@@ -378,15 +367,15 @@ static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
Progress.CodStand = Q931_CODING_ITU; /* 0 = ITU */
Progress.Location = 0; /* 0 = User, 1 = Private Network */
Progress.ProgDesc = 3; /* 1 = Not end-to-end ISDN */
- gen->ProgInd = Q931AppendIE((L3UCHAR *)gen, (L3UCHAR *)&Progress);
+ gen->ProgInd = Q931AppendIE(gen, (L3UCHAR *)&Progress);
/*
* Display IE
*/
- if (!(isdn_data->opts & FTDM_ISDN_OPT_OMIT_DISPLAY_IE)) {
+ if (!(isdn_data->opts & FTDM_ISDN_OPT_OMIT_DISPLAY_IE) && FTDM_SPAN_IS_NT(span)) {
Q931InitIEDisplay(&Display);
Display.Size = Display.Size + (unsigned char)strlen(caller_data->cid_name);
- gen->Display = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &Display);
+ gen->Display = Q931AppendIE(gen, (L3UCHAR *) &Display);
ptrDisplay = Q931GetIEPtr(gen->Display, gen->buf);
ftdm_copy_string((char *)ptrDisplay->Display, caller_data->cid_name, strlen(caller_data->cid_name)+1);
}
@@ -400,7 +389,7 @@ static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
CallingNum.PresInd = Q931_PRES_ALLOWED;
CallingNum.ScreenInd = Q931_SCREEN_USER_NOT_SCREENED;
CallingNum.Size = CallingNum.Size + (unsigned char)strlen(caller_data->cid_num.digits);
- gen->CallingNum = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &CallingNum);
+ gen->CallingNum = Q931AppendIE(gen, (L3UCHAR *) &CallingNum);
ptrCallingNum = Q931GetIEPtr(gen->CallingNum, gen->buf);
ftdm_copy_string((char *)ptrCallingNum->Digit, caller_data->cid_num.digits, strlen(caller_data->cid_num.digits)+1);
@@ -411,10 +400,10 @@ static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
Q931InitIECalledNum(&CalledNum);
CalledNum.TypNum = Q931_TON_UNKNOWN;
CalledNum.NumPlanID = Q931_NUMPLAN_E164;
- CalledNum.Size = CalledNum.Size + (unsigned char)strlen(caller_data->dnis.digits);
- gen->CalledNum = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &CalledNum);
+ CalledNum.Size = CalledNum.Size + (unsigned char)strlen(caller_data->ani.digits);
+ gen->CalledNum = Q931AppendIE(gen, (L3UCHAR *) &CalledNum);
ptrCalledNum = Q931GetIEPtr(gen->CalledNum, gen->buf);
- ftdm_copy_string((char *)ptrCalledNum->Digit, caller_data->dnis.digits, strlen(caller_data->dnis.digits)+1);
+ ftdm_copy_string((char *)ptrCalledNum->Digit, caller_data->ani.digits, strlen(caller_data->ani.digits)+1);
/*
* High-Layer Compatibility IE (Note: Required for AVM FritzBox)
@@ -424,31 +413,31 @@ static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
HLComp.Interpret = 4; /* only possible value */
HLComp.PresMeth = 1; /* High-layer protocol profile */
HLComp.HLCharID = 1; /* Telephony = 1, Fax G2+3 = 4, Fax G4 = 65 (Class I)/ 68 (Class II or III) */
- gen->HLComp = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &HLComp);
+ gen->HLComp = Q931AppendIE(gen, (L3UCHAR *) &HLComp);
caller_data->call_state = FTDM_CALLER_STATE_DIALING;
- Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
-
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
+
isdn_data->outbound_crv[gen->CRV] = caller_data;
//isdn_data->channels_local_crv[gen->CRV] = ftdmchan;
- while(ftdm_running() && caller_data->call_state == FTDM_CALLER_STATE_DIALING) {
+ while (ftdm_running() && caller_data->call_state == FTDM_CALLER_STATE_DIALING) {
ftdm_sleep(1);
-
+
if (!--sanity) {
caller_data->call_state = FTDM_CALLER_STATE_FAIL;
break;
}
}
isdn_data->outbound_crv[gen->CRV] = NULL;
-
+
if (caller_data->call_state == FTDM_CALLER_STATE_SUCCESS) {
ftdm_channel_t *new_chan = NULL;
int fail = 1;
-
+
new_chan = NULL;
- if (caller_data->chan_id < FTDM_MAX_CHANNELS_SPAN && caller_data->chan_id <= span->chan_count) {
- new_chan = span->channels[caller_data->chan_id];
+ if (caller_data->chan_id > 0 && caller_data->chan_id <= ftdm_span_get_chan_count(span)) {
+ new_chan = ftdm_span_get_channel(span, caller_data->chan_id);
}
if (new_chan && (status = ftdm_channel_open_chan(new_chan) == FTDM_SUCCESS)) {
@@ -456,7 +445,7 @@ static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
if (new_chan->state == FTDM_CHANNEL_STATE_DOWN || new_chan->state >= FTDM_CHANNEL_STATE_TERMINATING) {
int x = 0;
ftdm_log(FTDM_LOG_WARNING, "Channel %d:%d ~ %d:%d is already in use waiting for it to become available.\n");
-
+
for (x = 0; x < 200; x++) {
if (!ftdm_test_flag(new_chan, FTDM_CHANNEL_INUSE)) {
break;
@@ -493,9 +482,9 @@ static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
}
fail = 0;
- }
+ }
}
-
+
if (!fail) {
*ftdmchan = new_chan;
return FTDM_SUCCESS;
@@ -510,13 +499,13 @@ static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
//should we be casting here.. or do we need to translate value?
cause.Value = (unsigned char) FTDM_CAUSE_WRONG_CALL_STATE;
*cause.Diag = '\0';
- gen->Cause = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &cause);
- Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
+ gen->Cause = Q931AppendIE(gen, (L3UCHAR *) &cause);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
if (gen->CRV) {
Q931ReleaseCRV(&isdn_data->q931, gen->CRV);
}
-
+
if (new_chan) {
ftdm_log(FTDM_LOG_CRIT, "Channel is busy\n");
} else {
@@ -524,20 +513,13 @@ static FIO_CHANNEL_REQUEST_FUNCTION(isdn_channel_request)
}
}
}
-
+
*ftdmchan = NULL;
return FTDM_FAIL;
}
+#endif /* __TODO__ */
-/**
- * \brief Handler for Q931 error
- * \param pvt Private structure (span?)
- * \param id Error number
- * \param p1 ??
- * \param p2 ??
- * \return 0
- */
static L3INT ftdm_isdn_931_err(void *pvt, L3INT id, L3INT p1, L3INT p2)
{
ftdm_log(FTDM_LOG_ERROR, "ERROR: [%s] [%d] [%d]\n", q931_error_to_name(id), p1, p2);
@@ -545,32 +527,225 @@ static L3INT ftdm_isdn_931_err(void *pvt, L3INT id, L3INT p1, L3INT p2)
}
/**
- * \brief Handler for Q931 event message
- * \param pvt Span to handle
- * \param msg Message string
- * \param mlen Message string length
- * \return 0
+ * \brief The new call event handler
+ * \note W000t!!! \o/ ;D
+ * \todo A lot
*/
-static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
+static void ftdm_isdn_call_event(struct Q931_Call *call, struct Q931_CallEvent *event, void *priv)
{
+ Q931_TrunkInfo_t *trunk = NULL;
+ ftdm_isdn_data_t *isdn_data = NULL;
+ ftdm_span_t *zspan = NULL;
+ assert(call);
+ assert(event);
+
+ trunk = Q931CallGetTrunk(call);
+ assert(trunk);
+
+ zspan = Q931CallGetPrivate(call);
+ if (!zspan) {
+ zspan = priv;
+ Q931CallSetPrivate(call, zspan);
+ }
+ assert(zspan);
+
+ isdn_data = zspan->signal_data;
+
+ if (Q931CallIsGlobal(call)) {
+ /*
+ * Global event
+ */
+ ftdm_log(FTDM_LOG_DEBUG, "Received global event from Q.931\n");
+ } else {
+ ftdm_channel_t *ftdmchan = NULL;
+ ftdm_sigmsg_t sig;
+ int call_crv = Q931CallGetCRV(call);
+ int type;
+
+ /*
+ * Call-specific event
+ */
+ ftdm_log(FTDM_LOG_DEBUG, "Received call-specific event from Q.931 for call %d [%hu]\n", Q931CallGetCRV(call), Q931CallGetCRV(call));
+
+ /*
+ * Try to get associated zap channel
+ * and init sigmsg struct if there is one
+ */
+ ftdmchan = Q931CallIsOutgoing(call) ? isdn_data->channels_local_crv[call_crv] : isdn_data->channels_remote_crv[call_crv];
+ if (ftdmchan) {
+ memset(&sig, 0, sizeof(ftdm_sigmsg_t));
+ sig.chan_id = ftdmchan->chan_id;
+ sig.span_id = ftdmchan->span_id;
+ sig.channel = ftdmchan;
+ }
+
+ type = Q931CallEventGetType(event);
+
+ if (type == Q931_EVENT_TYPE_CRV) {
+
+ ftdm_log(FTDM_LOG_DEBUG, "\tCRV event\n");
+
+ switch (Q931CallEventGetId(event)) {
+ case Q931_EVENT_RELEASE_CRV:
+ {
+ /* WARNING contains old interface code, yuck! */
+ if (!ftdmchan) {
+ ftdm_log(FTDM_LOG_DEBUG, "Call %d [0x%x] not associated to zap channel\n", call_crv, call_crv);
+ return;
+ }
+
+ if (ftdmchan->state != FTDM_CHANNEL_STATE_DOWN) {
+ ftdm_log(FTDM_LOG_DEBUG, "Channel %d:%d not in DOWN state, cleaning up\n",
+ ftdmchan->span_id, ftdmchan->chan_id);
+
+ /*
+ * Send hangup signal to mod_openzap
+ */
+ if (!sig.channel->caller_data.hangup_cause) {
+ sig.channel->caller_data.hangup_cause = FTDM_CAUSE_NORMAL_CLEARING;
+ }
+
+ sig.event_id = FTDM_SIGEVENT_STOP;
+ isdn_data->sig_cb(&sig);
+
+ /* Release zap channel */
+ ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
+ }
+ return;
+ }
+ break;
+ default:
+ ftdm_log(FTDM_LOG_ERROR, "Unknown CRV event: %d\n", Q931CallEventGetId(event));
+ return;
+ }
+ }
+ else if (type == Q931_EVENT_TYPE_TIMER) {
+ struct Q931_CallTimerEvent *timer_evt = Q931CallEventGetData(event);
+
+ ftdm_log(FTDM_LOG_DEBUG, "\tTimer event\n");
+ assert(timer_evt->id);
+
+ switch (timer_evt->id) {
+ case Q931_TIMER_T303:
+ /*
+ * SETUP timeout
+ *
+ * TE-mode: Q931_EVENT_SETUP_CONFIRM (error)
+ * NT-mode: Q931_EVENT_RELEASE_INDICATION
+ */
+ {
+ /* WARNING contains old interface code, yuck! */
+ if (!ftdmchan) {
+ ftdm_log(FTDM_LOG_ERROR, "Call %d [0x%x] not associated to zap channel\n", call_crv, call_crv);
+ return;
+ }
+
+ ftdm_log(FTDM_LOG_DEBUG, "Call setup failed on channel %d:%d\n", ftdmchan->span_id, ftdmchan->chan_id);
+
+ /*
+ * Send signal to mod_openzap
+ */
+ sig.channel->caller_data.hangup_cause = FTDM_CAUSE_NETWORK_OUT_OF_ORDER;
+
+ sig.event_id = FTDM_SIGEVENT_STOP;
+ isdn_data->sig_cb(&sig);
+
+ /* Release zap channel */
+ ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
+ return;
+ }
+ break;
+
+ default:
+ ftdm_log(FTDM_LOG_ERROR, "Unhandled timer event %d\n", timer_evt->id);
+ }
+ }
+ else if (type == Q931_EVENT_TYPE_MESSAGE) {
+ struct Q931_CallMessageEvent *msg_evt = Q931CallEventGetData(event);
+
+ ftdm_log(FTDM_LOG_DEBUG, "\tMessage event\n");
+ assert(msg_evt);
+
+ /*
+ * Slowly move stuff from the old event handler into this part...
+ */
+ switch (Q931CallEventGetId(event)) {
+ case Q931_EVENT_SETUP_CONFIRM:
+ case Q931_EVENT_SETUP_COMPLETE_INDICATION: /* CONNECT */
+ {
+ /* WARNING contains old interface code, yuck! */
+ if (!ftdmchan) {
+ ftdm_log(FTDM_LOG_ERROR, "Call %d [0x%x] not associated to zap channel\n", call_crv, call_crv);
+ return;
+ }
+ ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_UP);
+ }
+ break;
+
+ default:
+ ftdm_log(FTDM_LOG_DEBUG, "Not yet handled message event %d\n", Q931CallEventGetId(event));
+ }
+ }
+ else {
+ ftdm_log(FTDM_LOG_ERROR, "Unknown event type %d\n", type);
+ }
+ }
+}
+
+/**
+ * Copy callednum, readding prefix as needed
+ */
+static void __isdn_get_number(const char *digits, const int ton, char *buf, int size)
+{
+ int offset = 0;
+
+ if (!digits || !buf || size <= 0)
+ return;
+
+ switch (ton) {
+ case Q931_TON_NATIONAL:
+ offset = strlen(DEFAULT_NATIONAL_PREFIX);
+ memcpy(buf, DEFAULT_NATIONAL_PREFIX, offset);
+ break;
+ case Q931_TON_INTERNATIONAL:
+ offset = strlen(DEFAULT_INTERNATIONAL_PREFIX);
+ memcpy(buf, DEFAULT_INTERNATIONAL_PREFIX, offset);
+ break;
+ default:
+ break;
+ }
+
+ strncpy(&buf[offset], digits, size - (offset + 1));
+ buf[size - 1] = '\0';
+}
+
+#define isdn_get_number(num, buf) \
+ __isdn_get_number((const char *)(num)->Digit, (num)->TypNum, (char *)buf, sizeof(buf))
+
+
+/**
+ * \brief The old call event handler (err, call message handler)
+ * \todo This one must die!
+ */
+static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic *msg, int mlen)
+{
+ Q931mes_Generic *gen = (Q931mes_Generic *) msg;
ftdm_span_t *span = (ftdm_span_t *) pvt;
ftdm_isdn_data_t *isdn_data = span->signal_data;
- Q931mes_Generic *gen = (Q931mes_Generic *) msg;
- uint32_t chan_id = 0;
- int chan_hunt = 0;
ftdm_channel_t *ftdmchan = NULL;
- ftdm_caller_data_t *caller_data = NULL;
+ int chan_id = 0;
+ int chan_hunt = 0;
if (Q931IsIEPresent(gen->ChanID)) {
Q931ie_ChanID *chanid = Q931GetIEPtr(gen->ChanID, gen->buf);
- if(chanid->IntType)
+ if (chanid->IntType)
chan_id = chanid->ChanSlot;
else
chan_id = chanid->InfoChanSel;
/* "any" channel specified */
- if(chanid->InfoChanSel == 3) {
+ if (chanid->InfoChanSel == 3) {
chan_hunt++;
}
} else if (FTDM_SPAN_IS_NT(span)) {
@@ -580,9 +755,30 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
assert(span != NULL);
assert(isdn_data != NULL);
-
+
+ /*
+ * Support code for the new event handling system
+ * Remove this as soon as we have the new api to set up calls
+ */
+#ifdef __OLD__
+ if (gen->CRV) {
+ struct Q931_Call *call;
+
+ call = Q931GetCallByCRV(&isdn_data->q931, gen->CRV);
+ if (call && !Q931CallGetPrivate(call)) {
+ ftdm_log(FTDM_LOG_DEBUG, "Storing reference to current span in call %d [0x%x]\n", gen->CRV, gen->CRV);
+ Q931CallSetPrivate(call, span);
+ }
+ }
+#else
+ if (call && !Q931CallGetPrivate(call)) {
+ ftdm_log(FTDM_LOG_DEBUG, "Storing reference to current span in call %d [0x%x]\n", gen->CRV, gen->CRV);
+ Q931CallSetPrivate(call, span);
+ }
+#endif
ftdm_log(FTDM_LOG_DEBUG, "Yay I got an event! Type:[%02x] Size:[%d] CRV: %d (%#hx, CTX: %s)\n", gen->MesType, gen->Size, gen->CRV, gen->CRV, gen->CRVFlag ? "Terminator" : "Originator");
+#ifdef __TODO_OR_REMOVE__
if (gen->CRVFlag && (caller_data = isdn_data->outbound_crv[gen->CRV])) {
if (chan_id) {
caller_data->chan_id = chan_id;
@@ -595,17 +791,16 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
case Q931mes_ALERTING:
case Q931mes_PROGRESS:
case Q931mes_CONNECT:
- {
- caller_data->call_state = FTDM_CALLER_STATE_SUCCESS;
- }
+ caller_data->call_state = FTDM_CALLER_STATE_SUCCESS;
break;
default:
caller_data->call_state = FTDM_CALLER_STATE_FAIL;
break;
}
-
+
return 0;
}
+#endif
if (gen->CRVFlag) {
ftdmchan = isdn_data->channels_local_crv[gen->CRV];
@@ -613,8 +808,12 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
ftdmchan = isdn_data->channels_remote_crv[gen->CRV];
}
- ftdm_log(FTDM_LOG_DEBUG, "ftdmchan %x (%d:%d) source isdn_data->channels_%s_crv[%#hx]\n", ftdmchan, ftdmchan ? ftdmchan->span_id : -1, ftdmchan ? ftdmchan->chan_id : -1, gen->CRVFlag ? "local" : "remote", gen->CRV);
-
+ ftdm_log(FTDM_LOG_DEBUG, "ftdmchan %x (%d:%d) source isdn_data->channels_%s_crv[%#hx]\n",
+ ftdmchan,
+ ((ftdmchan) ? ftdm_channel_get_span_id(ftdmchan) : -1),
+ ((ftdmchan) ? ftdm_channel_get_id(ftdmchan) : -1),
+ ((gen->CRVFlag) ? "local" : "remote"),
+ gen->CRV);
if (gen->ProtDisc == 3) {
switch(gen->MesType) {
@@ -626,11 +825,13 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
case 0: /* change status to "in service" */
{
ftdm_clear_flag_locked(ftdmchan, FTDM_CHANNEL_SUSPENDED);
- ftdm_log(FTDM_LOG_DEBUG, "Channel %d:%d in service\n", ftdmchan->span_id, ftdmchan->chan_id);
+ ftdm_log(FTDM_LOG_DEBUG, "Channel %d:%d in service\n",
+ ftdm_channel_get_span_id(ftdmchan),
+ ftdm_channel_get_id(ftdmchan));
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
}
break;
- case 1:
+ case 1:
{ /* change status to "maintenance" */
ftdm_set_flag_locked(ftdmchan, FTDM_CHANNEL_SUSPENDED);
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
@@ -658,14 +859,20 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
case Q931mes_RESTART:
{
if (chan_id) {
- ftdmchan = span->channels[chan_id];
+ ftdmchan = ftdm_span_get_channel(span, chan_id);
}
if (ftdmchan) {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
} else {
uint32_t i;
- for (i = 1; i < span->chan_count; i++) {
- ftdm_set_state_locked((span->channels[i]), FTDM_CHANNEL_STATE_RESTART);
+
+ for (i = 1; i < ftdm_span_get_chan_count(span); i++) {
+ /* Skip channels that are down and D-Channels (#OpenZAP-39) */
+ if (ftdm_channel_get_state(span->channels[i]) == FTDM_CHANNEL_STATE_DOWN ||
+ ftdm_channel_get_type(span->channels[i]) == FTDM_CHAN_TYPE_DQ921)
+ continue;
+
+ ftdm_set_state_locked(span->channels[i], FTDM_CHANNEL_STATE_RESTART);
}
}
}
@@ -675,15 +882,17 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
{
const char *what = gen->MesType == Q931mes_RELEASE ? "Release" : "Release Complete";
if (ftdmchan) {
- if (ftdmchan->state == FTDM_CHANNEL_STATE_TERMINATING || ftdmchan->state == FTDM_CHANNEL_STATE_HANGUP) {
+ if (ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_TERMINATING ||
+ ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_HANGUP)
+ {
if (gen->MesType == Q931mes_RELEASE) {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
} else {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
}
}
- else if((gen->MesType == Q931mes_RELEASE && ftdmchan->state <= FTDM_CHANNEL_STATE_UP) ||
- (gen->MesType == Q931mes_RELEASE_COMPLETE && ftdmchan->state == FTDM_CHANNEL_STATE_DIALING)) {
+ else if ((gen->MesType == Q931mes_RELEASE && ftdm_channel_get_state(ftdmchan) <= FTDM_CHANNEL_STATE_UP) ||
+ (gen->MesType == Q931mes_RELEASE_COMPLETE && ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_DIALING)) {
/*
* Don't keep inbound channels open if the remote side hangs up before we answered
@@ -693,18 +902,20 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
ftdm_status_t status;
memset(&sig, 0, sizeof(sig));
- sig.chan_id = ftdmchan->chan_id;
- sig.span_id = ftdmchan->span_id;
+ sig.span_id = ftdm_channel_get_span_id(ftdmchan);
+ sig.chan_id = ftdm_channel_get_id(ftdmchan);
sig.channel = ftdmchan;
sig.channel->caller_data.hangup_cause = (cause) ? cause->Value : FTDM_CAUSE_NORMAL_UNSPECIFIED;
sig.event_id = FTDM_SIGEVENT_STOP;
- status = ftdm_span_send_signal(ftdmchan->span, &sig);
+ status = isdn_data->sig_cb(&sig);
- ftdm_log(FTDM_LOG_DEBUG, "Received %s in state %s, requested hangup for channel %d:%d\n", what, ftdm_channel_state2str(ftdmchan->state), ftdmchan->span_id, chan_id);
- }
- else {
- ftdm_log(FTDM_LOG_DEBUG, "Ignoring %s on channel %d\n", what, chan_id);
+ ftdm_log(FTDM_LOG_DEBUG, "Received %s in state %s, requested hangup for channel %d:%d\n", what,
+ ftdm_channel_get_state_str(ftdmchan),
+ ftdm_channel_get_span_id(ftdmchan),
+ ftdm_channel_get_id(ftdmchan));
+ } else {
+ ftdm_log(FTDM_LOG_DEBUG, "Ignoring %s on channel %d\n", what, ftdm_channel_get_id(ftdmchan));
}
} else {
ftdm_log(FTDM_LOG_CRIT, "Received %s with no matching channel %d\n", what, chan_id);
@@ -741,52 +952,56 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
}
break;
case Q931mes_CONNECT:
+#if 0 /* Handled by new event code */
{
if (ftdmchan) {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_UP);
+#if 0 /* Auto-Ack is enabled, we actually don't need this */
gen->MesType = Q931mes_CONNECT_ACKNOWLEDGE;
gen->CRVFlag = 0; /* outbound */
- Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
+#endif
} else {
ftdm_log(FTDM_LOG_CRIT, "Received Connect with no matching channel %d\n", chan_id);
}
}
+#endif
break;
case Q931mes_SETUP:
{
Q931ie_CallingNum *callingnum = Q931GetIEPtr(gen->CallingNum, gen->buf);
Q931ie_CalledNum *callednum = Q931GetIEPtr(gen->CalledNum, gen->buf);
- int fail = 1;
- int fail_cause = 0;
- int overlap_dial = 0;
uint32_t cplen = mlen;
+ int overlap_dial = 0;
+ int fail_cause = 0;
+ int fail = 1;
- if(ftdmchan && ftdmchan == isdn_data->channels_remote_crv[gen->CRV]) {
+ if (ftdmchan && ftdmchan == isdn_data->channels_remote_crv[gen->CRV]) {
ftdm_log(FTDM_LOG_INFO, "Duplicate SETUP message(?) for Channel %d:%d ~ %d:%d in state %s [ignoring]\n",
- ftdmchan->span_id,
- ftdmchan->chan_id,
- ftdmchan->physical_span_id,
- ftdmchan->physical_chan_id,
- ftdm_channel_state2str(ftdmchan->state));
+ ftdm_channel_get_span_id(ftdmchan),
+ ftdm_channel_get_id(ftdmchan),
+ ftdm_channel_get_ph_span_id(ftdmchan),
+ ftdm_channel_get_ph_id(ftdmchan),
+ ftdm_channel_get_state_str(ftdmchan));
break;
}
-
+
ftdmchan = NULL;
/*
* Channel selection for incoming calls:
*/
if (FTDM_SPAN_IS_NT(span) && chan_hunt) {
- uint32_t x;
+ int x;
/*
* In NT-mode with channel selection "any",
* try to find a free channel
*/
- for (x = 1; x <= span->chan_count; x++) {
- ftdm_channel_t *zc = span->channels[x];
+ for (x = 1; x <= ftdm_span_get_chan_count(span); x++) {
+ ftdm_channel_t *zc = ftdm_span_get_channel(span, x);
- if (!ftdm_test_flag(zc, FTDM_CHANNEL_INUSE) && zc->state == FTDM_CHANNEL_STATE_DOWN) {
+ if (!ftdm_test_flag(zc, FTDM_CHANNEL_INUSE) && ftdm_channel_get_state(zc) == FTDM_CHANNEL_STATE_DOWN) {
ftdmchan = zc;
break;
}
@@ -807,8 +1022,8 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
* TODO: NT mode is abled to select a different channel if the one chosen
* by the TE side is already in use
*/
- if (chan_id > 0 && chan_id < FTDM_MAX_CHANNELS_SPAN && chan_id <= span->chan_count) {
- ftdmchan = span->channels[chan_id];
+ if (chan_id > 0 && chan_id < FTDM_MAX_CHANNELS_SPAN && chan_id <= ftdm_span_get_chan_count(span)) {
+ ftdmchan = ftdm_span_get_channel(span, chan_id);
}
else {
/* invalid channel id */
@@ -822,22 +1037,22 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
if (FTDM_SPAN_IS_NT(span)) {
ftdm_log(FTDM_LOG_NOTICE, "No destination number found, assuming overlap dial\n");
overlap_dial++;
- }
- else {
+ } else {
ftdm_log(FTDM_LOG_ERROR, "No destination number found\n");
ftdmchan = NULL;
}
}
if (ftdmchan) {
- if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE) || ftdmchan->state != FTDM_CHANNEL_STATE_DOWN) {
- if (ftdmchan->state == FTDM_CHANNEL_STATE_DOWN || ftdmchan->state >= FTDM_CHANNEL_STATE_TERMINATING) {
+ if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE) || ftdm_channel_get_state(ftdmchan) != FTDM_CHANNEL_STATE_DOWN) {
+ if (ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_DOWN || ftdm_channel_get_state(ftdmchan) >= FTDM_CHANNEL_STATE_TERMINATING)
+ {
int x = 0;
ftdm_log(FTDM_LOG_WARNING, "Channel %d:%d ~ %d:%d is already in use waiting for it to become available.\n",
- ftdmchan->span_id,
- ftdmchan->chan_id,
- ftdmchan->physical_span_id,
- ftdmchan->physical_chan_id);
+ ftdm_channel_get_span_id(ftdmchan),
+ ftdm_channel_get_id(ftdmchan),
+ ftdm_channel_get_ph_span_id(ftdmchan),
+ ftdm_channel_get_ph_id(ftdmchan));
for (x = 0; x < 200; x++) {
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE)) {
@@ -848,45 +1063,51 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
}
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE)) {
ftdm_log(FTDM_LOG_ERROR, "Channel %d:%d ~ %d:%d is already in use.\n",
- ftdmchan->span_id,
- ftdmchan->chan_id,
- ftdmchan->physical_span_id,
- ftdmchan->physical_chan_id
- );
+ ftdm_channel_get_span_id(ftdmchan),
+ ftdm_channel_get_id(ftdmchan),
+ ftdm_channel_get_ph_span_id(ftdmchan),
+ ftdm_channel_get_ph_id(ftdmchan));
ftdmchan = NULL;
}
}
- if (ftdmchan && ftdmchan->state == FTDM_CHANNEL_STATE_DOWN) {
+ if (ftdmchan && ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_DOWN) {
+ ftdm_caller_data_t *caller_data = ftdm_channel_get_caller_data(ftdmchan);
+
isdn_data->channels_remote_crv[gen->CRV] = ftdmchan;
memset(&ftdmchan->caller_data, 0, sizeof(ftdmchan->caller_data));
- if (ftdmchan->mod_data) {
- memset(ftdmchan->mod_data, 0, sizeof(ftdm_isdn_bchan_data_t));
+ if (ftdmchan->call_data) {
+ memset(ftdmchan->call_data, 0, sizeof(ftdm_isdn_bchan_data_t));
}
- ftdm_set_string(ftdmchan->caller_data.cid_num.digits, (char *)callingnum->Digit);
- ftdm_set_string(ftdmchan->caller_data.cid_name, (char *)callingnum->Digit);
- ftdm_set_string(ftdmchan->caller_data.ani.digits, (char *)callingnum->Digit);
+ /* copy number readd prefix as needed */
+ isdn_get_number(callingnum, caller_data->cid_num.digits);
+ isdn_get_number(callingnum, caller_data->cid_name);
+ isdn_get_number(callingnum, caller_data->ani.digits);
+
if (!overlap_dial) {
- ftdm_set_string(ftdmchan->caller_data.dnis.digits, (char *)callednum->Digit);
+ isdn_get_number(callednum, caller_data->dnis.digits);
}
-
+#ifdef __TODO_OR_REMOVE__
ftdmchan->caller_data.CRV = gen->CRV;
- if (cplen > sizeof(ftdmchan->caller_data.raw_data)) {
- cplen = sizeof(ftdmchan->caller_data.raw_data);
+#endif
+ if (cplen > sizeof(caller_data->raw_data)) {
+ cplen = sizeof(caller_data->raw_data);
}
gen->CRVFlag = !(gen->CRVFlag);
- memcpy(ftdmchan->caller_data.raw_data, msg, cplen);
- ftdmchan->caller_data.raw_data_len = cplen;
+ memcpy(caller_data->raw_data, msg, cplen);
+ caller_data->raw_data_len = cplen;
fail = 0;
- }
- }
+ }
+ }
if (fail) {
Q931ie_Cause cause;
+
gen->MesType = Q931mes_DISCONNECT;
gen->CRVFlag = 1; /* inbound call */
+
cause.IEId = Q931ie_CAUSE;
cause.Size = sizeof(Q931ie_Cause);
cause.CodStand = Q931_CODING_ITU;
@@ -895,8 +1116,8 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
//should we be casting here.. or do we need to translate value?
cause.Value = (unsigned char)((fail_cause) ? fail_cause : FTDM_CAUSE_WRONG_CALL_STATE);
*cause.Diag = '\0';
- gen->Cause = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &cause);
- Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
+ gen->Cause = Q931AppendIE(gen, (L3UCHAR *) &cause);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
if (gen->CRV) {
Q931ReleaseCRV(&isdn_data->q931, gen->CRV);
@@ -907,7 +1128,7 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
} else {
ftdm_log(FTDM_LOG_CRIT, "Failed to open channel for new setup message\n");
}
-
+
} else {
Q931ie_ChanID ChanID;
@@ -917,14 +1138,14 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
Q931InitIEChanID(&ChanID);
ChanID.IntType = FTDM_SPAN_IS_BRI(ftdmchan->span) ? 0 : 1; /* PRI = 1, BRI = 0 */
ChanID.PrefExcl = FTDM_SPAN_IS_NT(ftdmchan->span) ? 1 : 0; /* Exclusive in NT-mode = 1, Preferred otherwise = 0 */
- if(ChanID.IntType) {
+ if (ChanID.IntType) {
ChanID.InfoChanSel = 1; /* None = 0, See Slot = 1, Any = 3 */
ChanID.ChanMapType = 3; /* B-Chan */
- ChanID.ChanSlot = (unsigned char)ftdmchan->chan_id;
+ ChanID.ChanSlot = (unsigned char)ftdm_channel_get_id(ftdmchan);
} else {
- ChanID.InfoChanSel = (unsigned char)ftdmchan->chan_id & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
+ ChanID.InfoChanSel = (unsigned char)ftdm_channel_get_id(ftdmchan) & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
}
- gen->ChanID = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &ChanID);
+ gen->ChanID = Q931AppendIE(gen, (L3UCHAR *) &ChanID);
if (overlap_dial) {
Q931ie_ProgInd progress;
@@ -934,17 +1155,17 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
*/
progress.IEId = Q931ie_PROGRESS_INDICATOR;
progress.Size = sizeof(Q931ie_ProgInd);
- progress.CodStand = Q931_CODING_ITU; /* ITU */
+ progress.CodStand = Q931_CODING_ITU; /* ITU */
progress.Location = 1; /* private network serving the local user */
progress.ProgDesc = 8; /* call is not end-to-end isdn = 1, in-band information available = 8 */
- gen->ProgInd = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &progress);
+ gen->ProgInd = Q931AppendIE(gen, (L3UCHAR *) &progress);
/*
* Send SETUP ACK
*/
gen->MesType = Q931mes_SETUP_ACKNOWLEDGE;
gen->CRVFlag = 1; /* inbound call */
- Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DIALTONE);
} else {
@@ -960,7 +1181,7 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
case Q931mes_CALL_PROCEEDING:
{
if (ftdmchan) {
- ftdm_log(FTDM_LOG_CRIT, "Received CALL PROCEEDING message for channel %d\n", chan_id);
+ ftdm_log(FTDM_LOG_CRIT, "Received CALL PROCEEDING message for channel %d\n", ftdm_channel_get_id(ftdmchan));
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
} else {
ftdm_log(FTDM_LOG_CRIT, "Received CALL PROCEEDING with no matching channel %d\n", chan_id);
@@ -970,7 +1191,7 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
case Q931mes_CONNECT_ACKNOWLEDGE:
{
if (ftdmchan) {
- ftdm_log(FTDM_LOG_DEBUG, "Received CONNECT_ACK message for channel %d\n", chan_id);
+ ftdm_log(FTDM_LOG_DEBUG, "Received CONNECT_ACK message for channel %d\n", ftdm_channel_get_id(ftdmchan));
} else {
ftdm_log(FTDM_LOG_DEBUG, "Received CONNECT_ACK with no matching channel %d\n", chan_id);
}
@@ -980,16 +1201,16 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
case Q931mes_INFORMATION:
{
if (ftdmchan) {
- ftdm_log(FTDM_LOG_CRIT, "Received INFORMATION message for channel %d\n", ftdmchan->chan_id);
+ ftdm_log(FTDM_LOG_CRIT, "Received INFORMATION message for channel %d\n", ftdm_channel_get_id(ftdmchan));
- if (ftdmchan->state == FTDM_CHANNEL_STATE_DIALTONE) {
+ if (ftdm_channel_get_state(ftdmchan) == FTDM_CHANNEL_STATE_DIALTONE) {
char digit = '\0';
/*
* overlap dial digit indication
*/
if (Q931IsIEPresent(gen->CalledNum)) {
- ftdm_isdn_bchan_data_t *data = (ftdm_isdn_bchan_data_t *)ftdmchan->mod_data;
+ ftdm_isdn_bchan_data_t *data = (ftdm_isdn_bchan_data_t *)ftdmchan->call_data;
Q931ie_CalledNum *callednum = Q931GetIEPtr(gen->CalledNum, gen->buf);
int pos;
@@ -999,8 +1220,8 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
}
/* TODO: make this more safe with strncat() */
- pos = (int)strlen(ftdmchan->caller_data.dnis.digits);
- strcat(&ftdmchan->caller_data.dnis.digits[pos], (char *)callednum->Digit);
+ pos = strlen(ftdmchan->caller_data.dnis.digits);
+ strcat(&ftdmchan->caller_data.dnis.digits[pos], (char *)callednum->Digit);
/* update timer */
data->digit_timeout = ftdm_time_now() + isdn_data->digit_timeout;
@@ -1020,61 +1241,6 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
}
break;
- case Q931mes_STATUS_ENQUIRY:
- {
- /*
- * !! HACK ALERT !!
- *
- * Map FreeTDM channel states to Q.931 states
- */
- Q931ie_CallState state;
- Q931ie_Cause cause;
-
- gen->MesType = Q931mes_STATUS;
- gen->CRVFlag = gen->CRVFlag ? 0 : 1;
-
- state.CodStand = Q931_CODING_ITU; /* ITU-T */
- state.CallState = Q931_U0; /* Default: Null */
-
- cause.IEId = Q931ie_CAUSE;
- cause.Size = sizeof(Q931ie_Cause);
- cause.CodStand = Q931_CODING_ITU; /* ITU */
- cause.Location = 1; /* private network */
- cause.Recom = 1; /* */
- *cause.Diag = '\0';
-
- if(ftdmchan) {
- switch(ftdmchan->state) {
- case FTDM_CHANNEL_STATE_UP:
- state.CallState = Q931_U10; /* Active */
- break;
- case FTDM_CHANNEL_STATE_RING:
- state.CallState = Q931_U6; /* Call present */
- break;
- case FTDM_CHANNEL_STATE_DIALING:
- state.CallState = Q931_U1; /* Call initiated */
- break;
- case FTDM_CHANNEL_STATE_DIALTONE:
- state.CallState = Q931_U25; /* Overlap receiving */
- break;
-
- /* TODO: map missing states */
-
- default:
- state.CallState = Q931_U0;
- }
-
- cause.Value = 30; /* response to STATUS ENQUIRY */
- } else {
- cause.Value = 98; /* */
- }
-
- gen->CallState = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &state);
- gen->Cause = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &cause);
- Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
- }
- break;
-
default:
ftdm_log(FTDM_LOG_CRIT, "Received unhandled message %d (%#x)\n", (int)gen->MesType, (int)gen->MesType);
break;
@@ -1084,17 +1250,10 @@ static L3INT ftdm_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
return 0;
}
-/**
- * \brief Handler for Q921 read event
- * \param pvt Span were message is coming from
- * \param ind Q921 indication
- * \param tei Terminal Endpoint Identifier
- * \param msg Message string
- * \param mlen Message string length
- * \return 0 on success, 1 on failure
- */
static int ftdm_isdn_921_23(void *pvt, Q921DLMsg_t ind, L2UCHAR tei, L2UCHAR *msg, L2INT mlen)
{
+ ftdm_span_t *span = pvt;
+ ftdm_isdn_data_t *isdn_data = span->signal_data;
int ret, offset = (ind == Q921_DL_DATA) ? 4 : 3;
char bb[4096] = "";
@@ -1102,20 +1261,14 @@ static int ftdm_isdn_921_23(void *pvt, Q921DLMsg_t ind, L2UCHAR tei, L2UCHAR *ms
case Q921_DL_DATA:
case Q921_DL_UNIT_DATA:
print_hex_bytes(msg + offset, mlen - offset, bb, sizeof(bb));
-#ifdef HAVE_LIBPCAP
- /*Q931ToPcap*/
- if(do_q931ToPcap==1){
- ftdm_span_t *span = (ftdm_span_t *) pvt;
- if(writeQ931PacketToPcap(msg + offset, mlen - offset, span->span_id, 1) != FTDM_SUCCESS){
- ftdm_log(FTDM_LOG_WARNING, "Couldn't write Q931 buffer to pcap file!\n");
- }
- }
- /*Q931ToPcap done*/
+ ftdm_log(FTDM_LOG_DEBUG, "READ %d\n%s\n%s\n\n", (int)mlen - offset, LINE, bb);
+#ifdef HAVE_PCAP
+ if (isdn_pcap_capture_l3only(isdn_data)) {
+ isdn_pcap_write(isdn_data, msg, mlen, (ind == Q921_DL_UNIT_DATA) ? ISDN_PCAP_INCOMING_BCAST : ISDN_PCAP_INCOMING);
+ }
#endif
- ftdm_log(FTDM_LOG_DEBUG, "READ %d\n%s\n%s\n\n\n", (int)mlen - offset, LINE, bb);
-
default:
- ret = Q931Rx23(pvt, ind, tei, msg, mlen);
+ ret = Q931Rx23(&isdn_data->q931, ind, tei, msg, mlen);
if (ret != 0)
ftdm_log(FTDM_LOG_DEBUG, "931 parse error [%d] [%s]\n", ret, q931_error_to_name(ret));
break;
@@ -1124,35 +1277,22 @@ static int ftdm_isdn_921_23(void *pvt, Q921DLMsg_t ind, L2UCHAR tei, L2UCHAR *ms
return ((ret >= 0) ? 1 : 0);
}
-/**
- * \brief Handler for Q921 write event
- * \param pvt Span were message is coming from
- * \param msg Message string
- * \param mlen Message string length
- * \return 0 on success, -1 on failure
- */
static int ftdm_isdn_921_21(void *pvt, L2UCHAR *msg, L2INT mlen)
{
ftdm_span_t *span = (ftdm_span_t *) pvt;
ftdm_size_t len = (ftdm_size_t) mlen;
ftdm_isdn_data_t *isdn_data = span->signal_data;
-#ifdef IODEBUG
- char bb[4096] = "";
- print_hex_bytes(msg, len, bb, sizeof(bb));
- print_bits(msg, (int)len, bb, sizeof(bb), FTDM_ENDIAN_LITTLE, 0);
- ftdm_log(FTDM_LOG_DEBUG, "WRITE %d\n%s\n%s\n\n", (int)len, LINE, bb);
-
-#endif
-
assert(span != NULL);
+
+#ifdef HAVE_PCAP
+ if (isdn_pcap_capture_both(isdn_data)) {
+ isdn_pcap_write(isdn_data, msg, mlen, ISDN_PCAP_OUTGOING);
+ }
+#endif
return ftdm_channel_write(isdn_data->dchan, msg, len, &len) == FTDM_SUCCESS ? 0 : -1;
}
-/**
- * \brief Handler for channel state change
- * \param ftdmchan Channel to handle
- */
static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{
Q931mes_Generic *gen = (Q931mes_Generic *) ftdmchan->caller_data.raw_data;
@@ -1160,15 +1300,17 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
ftdm_sigmsg_t sig;
ftdm_status_t status;
- ftdm_log(FTDM_LOG_DEBUG, "%d:%d STATE [%s]\n",
- ftdmchan->span_id, ftdmchan->chan_id, ftdm_channel_state2str(ftdmchan->state));
+ ftdm_log(FTDM_LOG_DEBUG, "%d:%d STATE [%s]\n",
+ ftdm_channel_get_span_id(ftdmchan),
+ ftdm_channel_get_id(ftdmchan),
+ ftdm_channel_get_state_str(ftdmchan));
memset(&sig, 0, sizeof(sig));
- sig.chan_id = ftdmchan->chan_id;
- sig.span_id = ftdmchan->span_id;
+ sig.span_id = ftdm_channel_get_span_id(ftdmchan);
+ sig.chan_id = ftdm_channel_get_id(ftdmchan);
sig.channel = ftdmchan;
- switch (ftdmchan->state) {
+ switch (ftdm_channel_get_state(ftdmchan)) {
case FTDM_CHANNEL_STATE_DOWN:
{
if (gen->CRV) {
@@ -1186,40 +1328,44 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
sig.event_id = FTDM_SIGEVENT_PROGRESS;
- if ((status = ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS)) {
+ if ((status = isdn_data->sig_cb(&sig) != FTDM_SUCCESS)) {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
}
} else {
+ int crv = gen->CRV;
+
+ Q931InitMesGeneric(gen);
gen->MesType = Q931mes_CALL_PROCEEDING;
+ gen->CRV = crv;
gen->CRVFlag = 1; /* inbound */
- if (FTDM_SPAN_IS_NT(ftdmchan->span)) {
+ if (FTDM_SPAN_IS_NT(ftdm_channel_get_span(ftdmchan))) {
Q931ie_ChanID ChanID;
/*
* Set new Channel ID
*/
Q931InitIEChanID(&ChanID);
- ChanID.IntType = FTDM_SPAN_IS_BRI(ftdmchan->span) ? 0 : 1; /* PRI = 1, BRI = 0 */
+ ChanID.IntType = FTDM_SPAN_IS_BRI(ftdm_channel_get_span(ftdmchan)) ? 0 : 1; /* PRI = 1, BRI = 0 */
ChanID.PrefExcl = 1; /* always exclusive in NT-mode */
- if(ChanID.IntType) {
+ if (ChanID.IntType) {
ChanID.InfoChanSel = 1; /* None = 0, See Slot = 1, Any = 3 */
ChanID.ChanMapType = 3; /* B-Chan */
- ChanID.ChanSlot = (unsigned char)ftdmchan->chan_id;
+ ChanID.ChanSlot = (unsigned char)ftdm_channel_get_id(ftdmchan);
} else {
- ChanID.InfoChanSel = (unsigned char)ftdmchan->chan_id & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
+ ChanID.InfoChanSel = (unsigned char)ftdm_channel_get_id(ftdmchan) & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
}
- gen->ChanID = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &ChanID);
+ gen->ChanID = Q931AppendIE(gen, (L3UCHAR *) &ChanID);
}
- Q931Rx43(&isdn_data->q931, (void *)gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
}
}
break;
case FTDM_CHANNEL_STATE_DIALTONE:
{
- ftdm_isdn_bchan_data_t *data = (ftdm_isdn_bchan_data_t *)ftdmchan->mod_data;
+ ftdm_isdn_bchan_data_t *data = (ftdm_isdn_bchan_data_t *)ftdmchan->call_data;
if (data) {
data->digit_timeout = ftdm_time_now() + isdn_data->digit_timeout;
@@ -1230,7 +1376,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
sig.event_id = FTDM_SIGEVENT_START;
- if ((status = ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS)) {
+ if ((status = isdn_data->sig_cb(&sig) != FTDM_SUCCESS)) {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
}
}
@@ -1240,7 +1386,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{
ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_NORMAL_UNSPECIFIED;
sig.event_id = FTDM_SIGEVENT_RESTART;
- status = ftdm_span_send_signal(ftdmchan->span, &sig);
+ status = isdn_data->sig_cb(&sig);
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
}
break;
@@ -1248,7 +1394,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
sig.event_id = FTDM_SIGEVENT_PROGRESS_MEDIA;
- if ((status = ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS)) {
+ if ((status = isdn_data->sig_cb(&sig) != FTDM_SUCCESS)) {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
}
} else {
@@ -1260,7 +1406,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
}
gen->MesType = Q931mes_ALERTING;
gen->CRVFlag = 1; /* inbound call */
- Q931Rx43(&isdn_data->q931, (void *)gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
}
}
break;
@@ -1268,7 +1414,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
{
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
sig.event_id = FTDM_SIGEVENT_UP;
- if ((status = ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS)) {
+ if ((status = isdn_data->sig_cb(&sig) != FTDM_SUCCESS)) {
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
}
} else {
@@ -1281,12 +1427,13 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
gen->MesType = Q931mes_CONNECT;
gen->BearerCap = 0;
gen->CRVFlag = 1; /* inbound call */
- Q931Rx43(&isdn_data->q931, (void *)gen, ftdmchan->caller_data.raw_data_len);
+ Q931Rx43(&isdn_data->q931, gen, ftdmchan->caller_data.raw_data_len);
}
}
break;
case FTDM_CHANNEL_STATE_DIALING:
if (!(isdn_data->opts & FTDM_ISDN_OPT_SUGGEST_CHANNEL)) {
+ ftdm_caller_data_t *caller_data = ftdm_channel_get_caller_data(ftdmchan);
Q931ie_BearerCap BearerCap;
Q931ie_ChanID ChanID;
Q931ie_CallingNum CallingNum;
@@ -1301,11 +1448,11 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
/*
* get codec type
*/
- ftdm_channel_command(ftdmchan->span->channels[ftdmchan->chan_id], FTDM_COMMAND_GET_NATIVE_CODEC, &codec);
+ ftdm_channel_command(ftdmchan, FTDM_COMMAND_GET_NATIVE_CODEC, &codec);
/*
* Q.931 Setup Message
- */
+ */
Q931InitMesGeneric(gen);
gen->MesType = Q931mes_SETUP;
gen->CRVFlag = 0; /* outbound(?) */
@@ -1320,22 +1467,22 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
BearerCap.ITR = Q931_ITR_64K; /* 64k = 16, Packet mode = 0 */
BearerCap.Layer1Ident = 1;
BearerCap.UIL1Prot = (codec == FTDM_CODEC_ALAW) ? 3 : 2; /* U-law = 2, A-law = 3 */
- gen->BearerCap = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &BearerCap);
+ gen->BearerCap = Q931AppendIE(gen, (L3UCHAR *) &BearerCap);
/*
* ChannelID IE
*/
Q931InitIEChanID(&ChanID);
- ChanID.IntType = FTDM_SPAN_IS_BRI(ftdmchan->span) ? 0 : 1; /* PRI = 1, BRI = 0 */
- ChanID.PrefExcl = FTDM_SPAN_IS_NT(ftdmchan->span) ? 1 : 0; /* Exclusive in NT-mode = 1, Preferred otherwise = 0 */
- if(ChanID.IntType) {
+ ChanID.IntType = FTDM_SPAN_IS_BRI(ftdm_channel_get_span(ftdmchan)) ? 0 : 1; /* PRI = 1, BRI = 0 */
+ ChanID.PrefExcl = FTDM_SPAN_IS_NT(ftdm_channel_get_span(ftdmchan)) ? 1 : 0; /* Exclusive in NT-mode = 1, Preferred otherwise = 0 */
+ if (ChanID.IntType) {
ChanID.InfoChanSel = 1; /* None = 0, See Slot = 1, Any = 3 */
ChanID.ChanMapType = 3; /* B-Chan */
- ChanID.ChanSlot = (unsigned char)ftdmchan->chan_id;
+ ChanID.ChanSlot = (unsigned char)ftdm_channel_get_id(ftdmchan);
} else {
- ChanID.InfoChanSel = (unsigned char)ftdmchan->chan_id & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
+ ChanID.InfoChanSel = (unsigned char)ftdm_channel_get_id(ftdmchan) & 0x03; /* None = 0, B1 = 1, B2 = 2, Any = 3 */
}
- gen->ChanID = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &ChanID);
+ gen->ChanID = Q931AppendIE(gen, (L3UCHAR *) &ChanID);
/*
* Progress IE
@@ -1344,42 +1491,42 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
Progress.CodStand = Q931_CODING_ITU; /* 0 = ITU */
Progress.Location = 0; /* 0 = User, 1 = Private Network */
Progress.ProgDesc = 3; /* 1 = Not end-to-end ISDN */
- gen->ProgInd = Q931AppendIE((L3UCHAR *)gen, (L3UCHAR *)&Progress);
+ gen->ProgInd = Q931AppendIE(gen, (L3UCHAR *)&Progress);
/*
* Display IE
*/
- if (!(isdn_data->opts & FTDM_ISDN_OPT_OMIT_DISPLAY_IE)) {
+ if (!(isdn_data->opts & FTDM_ISDN_OPT_OMIT_DISPLAY_IE) && FTDM_SPAN_IS_NT(ftdm_channel_get_span(ftdmchan))) {
Q931InitIEDisplay(&Display);
- Display.Size = Display.Size + (unsigned char)strlen(ftdmchan->caller_data.cid_name);
- gen->Display = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &Display);
+ Display.Size = Display.Size + (unsigned char)strlen(caller_data->cid_name);
+ gen->Display = Q931AppendIE(gen, (L3UCHAR *) &Display);
ptrDisplay = Q931GetIEPtr(gen->Display, gen->buf);
- ftdm_copy_string((char *)ptrDisplay->Display, ftdmchan->caller_data.cid_name, strlen(ftdmchan->caller_data.cid_name)+1);
+ ftdm_copy_string((char *)ptrDisplay->Display, caller_data->cid_name, strlen(caller_data->cid_name) + 1);
}
/*
* CallingNum IE
- */
+ */
Q931InitIECallingNum(&CallingNum);
- CallingNum.TypNum = ftdmchan->caller_data.ani.type;
+ CallingNum.TypNum = caller_data->ani.type;
CallingNum.NumPlanID = Q931_NUMPLAN_E164;
CallingNum.PresInd = Q931_PRES_ALLOWED;
CallingNum.ScreenInd = Q931_SCREEN_USER_NOT_SCREENED;
- CallingNum.Size = CallingNum.Size + (unsigned char)strlen(ftdmchan->caller_data.cid_num.digits);
- gen->CallingNum = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &CallingNum);
+ CallingNum.Size = CallingNum.Size + (unsigned char)strlen(caller_data->cid_num.digits);
+ gen->CallingNum = Q931AppendIE(gen, (L3UCHAR *) &CallingNum);
ptrCallingNum = Q931GetIEPtr(gen->CallingNum, gen->buf);
- ftdm_copy_string((char *)ptrCallingNum->Digit, ftdmchan->caller_data.cid_num.digits, strlen(ftdmchan->caller_data.cid_num.digits)+1);
+ ftdm_copy_string((char *)ptrCallingNum->Digit, caller_data->cid_num.digits, strlen(caller_data->cid_num.digits) + 1);
/*
* CalledNum IE
*/
Q931InitIECalledNum(&CalledNum);
- CalledNum.TypNum = ftdmchan->caller_data.dnis.type;
+ CalledNum.TypNum = Q931_TON_UNKNOWN;
CalledNum.NumPlanID = Q931_NUMPLAN_E164;
- CalledNum.Size = CalledNum.Size + (unsigned char)strlen(ftdmchan->caller_data.dnis.digits);
- gen->CalledNum = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &CalledNum);
+ CalledNum.Size = CalledNum.Size + (unsigned char)strlen(caller_data->ani.digits);
+ gen->CalledNum = Q931AppendIE(gen, (L3UCHAR *) &CalledNum);
ptrCalledNum = Q931GetIEPtr(gen->CalledNum, gen->buf);
- ftdm_copy_string((char *)ptrCalledNum->Digit, ftdmchan->caller_data.dnis.digits, strlen(ftdmchan->caller_data.dnis.digits)+1);
+ ftdm_copy_string((char *)ptrCalledNum->Digit, caller_data->ani.digits, strlen(caller_data->ani.digits) + 1);
/*
* High-Layer Compatibility IE (Note: Required for AVM FritzBox)
@@ -1389,25 +1536,40 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
HLComp.Interpret = 4; /* only possible value */
HLComp.PresMeth = 1; /* High-layer protocol profile */
HLComp.HLCharID = Q931_HLCHAR_TELEPHONY; /* Telephony = 1, Fax G2+3 = 4, Fax G4 = 65 (Class I)/ 68 (Class II or III) */ /* TODO: make accessible from user layer */
- gen->HLComp = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &HLComp);
+ gen->HLComp = Q931AppendIE(gen, (L3UCHAR *) &HLComp);
- Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
isdn_data->channels_local_crv[gen->CRV] = ftdmchan;
+
+ /*
+ * Support code for the new event handling system
+ * Remove this as soon as we have the new api to set up calls
+ */
+ if (gen->CRV) {
+ struct Q931_Call *call;
+
+ call = Q931GetCallByCRV(&isdn_data->q931, gen->CRV);
+ if (call) {
+ ftdm_log(FTDM_LOG_DEBUG, "Storing reference to current span in call %d [0x%x]\n", gen->CRV, gen->CRV);
+ Q931CallSetPrivate(call, ftdm_channel_get_span(ftdmchan));
+ }
+ }
}
break;
case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
{
/* reply RELEASE with RELEASE_COMPLETE message */
- if(ftdmchan->last_state == FTDM_CHANNEL_STATE_HANGUP) {
+ if (ftdm_channel_get_last_state(ftdmchan) == FTDM_CHANNEL_STATE_HANGUP) {
gen->MesType = Q931mes_RELEASE_COMPLETE;
- Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
}
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
}
break;
case FTDM_CHANNEL_STATE_HANGUP:
{
+ ftdm_caller_data_t *caller_data = ftdm_channel_get_caller_data(ftdmchan);
Q931ie_Cause cause;
ftdm_log(FTDM_LOG_DEBUG, "Hangup: Direction %s\n", ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? "Outbound" : "Inbound");
@@ -1424,7 +1586,7 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
* BRI PTMP needs special handling here...
* TODO: cleanup / refine (see above)
*/
- if (ftdmchan->last_state == FTDM_CHANNEL_STATE_RING) {
+ if (ftdm_channel_get_last_state(ftdmchan) == FTDM_CHANNEL_STATE_RING) {
/*
* inbound call [was: number unknown (= not found in routing state)]
* (in Q.931 spec terms: Reject request)
@@ -1432,25 +1594,25 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
gen->MesType = Q931mes_RELEASE_COMPLETE;
//cause.Value = (unsigned char) FTDM_CAUSE_UNALLOCATED;
- cause.Value = (unsigned char) ftdmchan->caller_data.hangup_cause;
+ cause.Value = (unsigned char) caller_data->hangup_cause;
*cause.Diag = '\0';
- gen->Cause = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &cause);
- Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
+ gen->Cause = Q931AppendIE(gen, (L3UCHAR *) &cause);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
/* we're done, release channel */
//ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
}
- else if (ftdmchan->last_state <= FTDM_CHANNEL_STATE_PROGRESS) {
+ else if (ftdm_channel_get_last_state(ftdmchan) <= FTDM_CHANNEL_STATE_PROGRESS) {
/*
* just release all unanswered calls [was: inbound call, remote side hung up before we answered]
*/
gen->MesType = Q931mes_RELEASE;
- cause.Value = (unsigned char) ftdmchan->caller_data.hangup_cause;
+ cause.Value = (unsigned char) caller_data->hangup_cause;
*cause.Diag = '\0';
- gen->Cause = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &cause);
- Q931Rx43(&isdn_data->q931, (void *)gen, gen->Size);
+ gen->Cause = Q931AppendIE(gen, (L3UCHAR *) &cause);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
/* this will be triggered by the RELEASE_COMPLETE reply */
/* ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE); */
@@ -1461,10 +1623,10 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
*/
gen->MesType = Q931mes_DISCONNECT;
- cause.Value = (unsigned char) ftdmchan->caller_data.hangup_cause;
+ cause.Value = (unsigned char) caller_data->hangup_cause;
*cause.Diag = '\0';
- gen->Cause = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &cause);
- Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
+ gen->Cause = Q931AppendIE(gen, (L3UCHAR *) &cause);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
}
}
break;
@@ -1473,97 +1635,128 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
ftdm_log(FTDM_LOG_DEBUG, "Terminating: Direction %s\n", ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? "Outbound" : "Inbound");
sig.event_id = FTDM_SIGEVENT_STOP;
- status = ftdm_span_send_signal(ftdmchan->span, &sig);
+ status = isdn_data->sig_cb(&sig);
+
gen->MesType = Q931mes_RELEASE;
gen->CRVFlag = ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) ? 0 : 1;
- Q931Rx43(&isdn_data->q931, (void *)gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, gen, gen->Size);
}
default:
break;
}
}
-/**
- * \brief Checks current state on a span
- * \param span Span to check status on
- */
static __inline__ void check_state(ftdm_span_t *span)
{
- if (ftdm_test_flag(span, FTDM_SPAN_STATE_CHANGE)) {
- uint32_t j;
- ftdm_clear_flag_locked(span, FTDM_SPAN_STATE_CHANGE);
- for(j = 1; j <= span->chan_count; j++) {
- if (ftdm_test_flag((span->channels[j]), FTDM_CHANNEL_STATE_CHANGE)) {
- ftdm_mutex_lock(span->channels[j]->mutex);
- ftdm_clear_flag((span->channels[j]), FTDM_CHANNEL_STATE_CHANGE);
- state_advance(span->channels[j]);
- ftdm_channel_complete_state(span->channels[j]);
- ftdm_mutex_unlock(span->channels[j]->mutex);
- }
- }
- }
+ if (ftdm_test_flag(span, FTDM_SPAN_STATE_CHANGE)) {
+ uint32_t j;
+
+ ftdm_clear_flag_locked(span, FTDM_SPAN_STATE_CHANGE);
+
+ for (j = 1; j <= ftdm_span_get_chan_count(span); j++) {
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, j);
+
+ if (ftdm_test_flag(chan, FTDM_CHANNEL_STATE_CHANGE)) {
+ ftdm_channel_lock(chan);
+
+ ftdm_clear_flag(chan, FTDM_CHANNEL_STATE_CHANGE);
+ state_advance(chan);
+ ftdm_channel_complete_state(chan);
+
+ ftdm_channel_unlock(chan);
+ }
+ }
+ }
}
-/**
- * \brief Processes FreeTDM event on a span
- * \param span Span to process event on
- * \param event Event to process
- * \return Success or failure
- */
+
static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *event)
{
- ftdm_log(FTDM_LOG_DEBUG, "EVENT [%s][%d:%d] STATE [%s]\n",
- ftdm_oob_event2str(event->enum_id), event->channel->span_id, event->channel->chan_id, ftdm_channel_state2str(event->channel->state));
+ ftdm_isdn_data_t *isdn_data = span->signal_data;
+ ftdm_alarm_flag_t alarmbits;
+ ftdm_sigmsg_t sig;
- switch(event->enum_id) {
+ memset(&sig, 0, sizeof(sig));
+ sig.span_id = ftdm_channel_get_span_id(event->channel);
+ sig.chan_id = ftdm_channel_get_id(event->channel);
+ sig.channel = event->channel;
+
+ ftdm_log(FTDM_LOG_DEBUG, "EVENT [%s][%d:%d] STATE [%s]\n",
+ ftdm_oob_event2str(event->enum_id),
+ ftdm_channel_get_span_id(event->channel),
+ ftdm_channel_get_id(event->channel),
+ ftdm_channel_get_state_str(event->channel));
+
+ switch (event->enum_id) {
case FTDM_OOB_ALARM_TRAP:
{
- if (event->channel->state != FTDM_CHANNEL_STATE_DOWN) {
- if (event->channel->type == FTDM_CHAN_TYPE_B) {
- ftdm_set_state_locked(event->channel, FTDM_CHANNEL_STATE_RESTART);
- }
+ sig.event_id = FTDM_OOB_ALARM_TRAP;
+ if (ftdm_channel_get_state(event->channel) != FTDM_CHANNEL_STATE_DOWN) {
+ ftdm_set_state_locked(event->channel, FTDM_CHANNEL_STATE_RESTART);
}
-
-
ftdm_set_flag(event->channel, FTDM_CHANNEL_SUSPENDED);
+ ftdm_channel_get_alarms(event->channel, &alarmbits);
+ isdn_data->sig_cb(&sig);
-
- ftdm_channel_get_alarms(event->channel);
- ftdm_log(FTDM_LOG_WARNING, "channel %d:%d (%d:%d) has alarms! [%s]\n",
- event->channel->span_id, event->channel->chan_id,
- event->channel->physical_span_id, event->channel->physical_chan_id,
- event->channel->last_error);
+ ftdm_log(FTDM_LOG_WARNING, "channel %d:%d (%d:%d) has alarms [%s]\n",
+ ftdm_channel_get_span_id(event->channel),
+ ftdm_channel_get_id(event->channel),
+ ftdm_channel_get_ph_span_id(event->channel),
+ ftdm_channel_get_ph_id(event->channel),
+ ftdm_channel_get_last_error(event->channel));
}
break;
case FTDM_OOB_ALARM_CLEAR:
{
-
- ftdm_log(FTDM_LOG_WARNING, "channel %d:%d (%d:%d) alarms Cleared!\n", event->channel->span_id, event->channel->chan_id,
- event->channel->physical_span_id, event->channel->physical_chan_id);
-
+ sig.event_id = FTDM_OOB_ALARM_CLEAR;
ftdm_clear_flag(event->channel, FTDM_CHANNEL_SUSPENDED);
- ftdm_channel_get_alarms(event->channel);
+ ftdm_channel_get_alarms(event->channel, &alarmbits);
+ isdn_data->sig_cb(&sig);
}
break;
+#ifdef __BROKEN_BY_FREETDM_CONVERSION__
+ case FTDM_OOB_DTMF: /* Taken from ozmod_analog, minus the CALLWAITING state handling */
+ {
+ const char * digit_str = (const char *)event->data;
+
+ if (digit_str) {
+ fio_event_cb_t event_callback = NULL;
+
+ ftdm_channel_queue_dtmf(event->channel, digit_str);
+ if (span->event_callback) {
+ event_callback = span->event_callback;
+ } else if (event->channel->event_callback) {
+ event_callback = event->channel->event_callback;
+ }
+
+ if (event_callback) {
+ event->channel->event_header.channel = event->channel;
+ event->channel->event_header.e_type = FTDM_EVENT_DTMF;
+ event->channel->event_header.data = (void *)digit_str;
+ event_callback(event->channel, &event->channel->event_header);
+ event->channel->event_header.e_type = FTDM_EVENT_NONE;
+ event->channel->event_header.data = NULL;
+ }
+ ftdm_safe_free(event->data);
+ }
+ }
+ break;
+#endif
}
return FTDM_SUCCESS;
}
-/**
- * \brief Checks for events on a span
- * \param span Span to check for events
- */
+
static __inline__ void check_events(ftdm_span_t *span)
{
- ftdm_status_t status;
+ ftdm_status_t status = ftdm_span_poll_event(span, 5, NULL);
- status = ftdm_span_poll_event(span, 5, NULL);
-
- switch(status) {
+ switch (status) {
case FTDM_SUCCESS:
{
ftdm_event_t *event;
+
while (ftdm_span_next_event(span, &event) == FTDM_SUCCESS) {
if (event->enum_id == FTDM_OOB_NOOP) {
continue;
@@ -1584,12 +1777,7 @@ static __inline__ void check_events(ftdm_span_t *span)
}
}
-/**
- * \brief Retrieves tone generation output to be sent
- * \param ts Teletone generator
- * \param map Tone map
- * \return -1 on error, 0 on success
- */
+
static int teletone_handler(teletone_generation_session_t *ts, teletone_tone_map_t *map)
{
ftdm_buffer_t *dt_buffer = ts->user_data;
@@ -1598,25 +1786,20 @@ static int teletone_handler(teletone_generation_session_t *ts, teletone_tone_map
if (!dt_buffer) {
return -1;
}
+
wrote = teletone_mux_tones(ts, map);
ftdm_buffer_write(dt_buffer, ts->buffer, wrote * 2);
return 0;
}
-/**
- * \brief Main thread function for tone generation on a span
- * \param me Current thread
- * \param obj Span to generate tones on
- */
static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
{
ftdm_span_t *span = (ftdm_span_t *) obj;
ftdm_isdn_data_t *isdn_data = span->signal_data;
ftdm_buffer_t *dt_buffer = NULL;
- teletone_generation_session_t ts = {{{{0}}}};
+ teletone_generation_session_t ts = {{{{0}}}};;
unsigned char frame[1024];
- uint32_t x;
- int interval = 0;
+ int x, interval;
int offset = 0;
ftdm_log(FTDM_LOG_DEBUG, "ISDN tones thread starting.\n");
@@ -1630,9 +1813,11 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
ftdm_buffer_set_loops(dt_buffer, -1);
/* get a tone generation friendly interval to avoid distortions */
- for (x = 1; x <= span->chan_count; x++) {
- if (span->channels[x]->type != FTDM_CHAN_TYPE_DQ921) {
- ftdm_channel_command(span->channels[x], FTDM_COMMAND_GET_INTERVAL, &interval);
+ for (x = 1; x <= ftdm_span_get_chan_count(span); x++) {
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, x);
+
+ if (ftdm_channel_get_type(chan) != FTDM_CHAN_TYPE_DQ921) {
+ ftdm_channel_command(chan, FTDM_COMMAND_GET_INTERVAL, &interval);
break;
}
}
@@ -1647,7 +1832,7 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
ts.duration = ts.rate;
/* main loop */
- while(ftdm_running() && ftdm_test_flag(isdn_data, FTDM_ISDN_TONES_RUNNING) && !ftdm_test_flag(isdn_data, FTDM_ISDN_STOP)) {
+ while (ftdm_running() && ftdm_test_flag(isdn_data, FTDM_ISDN_RUNNING)) {
ftdm_wait_flag_t flags;
ftdm_status_t status;
int last_chan_state = 0;
@@ -1657,11 +1842,11 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
/*
* check b-channel states and generate & send tones if neccessary
*/
- for (x = 1; x <= span->chan_count; x++) {
- ftdm_channel_t *ftdmchan = span->channels[x];
+ for (x = 1; x <= ftdm_span_get_chan_count(span); x++) {
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, x);
ftdm_size_t len = sizeof(frame), rlen;
- if (ftdmchan->type == FTDM_CHAN_TYPE_DQ921) {
+ if (ftdm_channel_get_type(chan) == FTDM_CHAN_TYPE_DQ921) {
continue;
}
@@ -1670,40 +1855,41 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
* (Recycle buffer content if succeeding channels share the
* same state, this saves some cpu cycles)
*/
- switch (ftdmchan->state) {
+ switch (ftdm_channel_get_state(chan)) {
case FTDM_CHANNEL_STATE_DIALTONE:
{
- ftdm_isdn_bchan_data_t *data = (ftdm_isdn_bchan_data_t *)ftdmchan->mod_data;
+ ftdm_isdn_bchan_data_t *data = (ftdm_isdn_bchan_data_t *)chan->call_data;
+ ftdm_caller_data_t *caller_data = ftdm_channel_get_caller_data(chan);
/* check overlap dial timeout first before generating tone */
if (data && data->digit_timeout && data->digit_timeout <= now) {
- if (strlen(ftdmchan->caller_data.dnis.digits) > 0) {
+ if (strlen(caller_data->dnis.digits) > 0) {
ftdm_log(FTDM_LOG_DEBUG, "Overlap dial timeout, advancing to RING state\n");
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RING);
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_RING);
} else {
/* no digits received, hangup */
ftdm_log(FTDM_LOG_DEBUG, "Overlap dial timeout, no digits received, going to HANGUP state\n");
- ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_RECOVERY_ON_TIMER_EXPIRE; /* TODO: probably wrong cause value */
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
+ caller_data->hangup_cause = FTDM_CAUSE_RECOVERY_ON_TIMER_EXPIRE; /* TODO: probably wrong cause value */
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_HANGUP);
}
data->digit_timeout = 0;
continue;
}
- if (last_chan_state != ftdmchan->state) {
+ if (last_chan_state != ftdm_channel_get_state(chan)) {
ftdm_buffer_zero(dt_buffer);
- teletone_run(&ts, ftdmchan->span->tone_map[FTDM_TONEMAP_DIAL]);
- last_chan_state = ftdmchan->state;
+ teletone_run(&ts, span->tone_map[FTDM_TONEMAP_DIAL]);
+ last_chan_state = ftdm_channel_get_state(chan);
}
}
break;
case FTDM_CHANNEL_STATE_RING:
{
- if (last_chan_state != ftdmchan->state) {
+ if (last_chan_state != ftdm_channel_get_state(chan)) {
ftdm_buffer_zero(dt_buffer);
- teletone_run(&ts, ftdmchan->span->tone_map[FTDM_TONEMAP_RING]);
- last_chan_state = ftdmchan->state;
+ teletone_run(&ts, span->tone_map[FTDM_TONEMAP_RING]);
+ last_chan_state = ftdm_channel_get_state(chan);
}
}
break;
@@ -1712,18 +1898,20 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
continue;
}
- if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OPEN)) {
- if (ftdm_channel_open_chan(ftdmchan) != FTDM_SUCCESS) {
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
+ if (!ftdm_test_flag(chan, FTDM_CHANNEL_OPEN)) {
+ if (ftdm_channel_open_chan(chan) != FTDM_SUCCESS) {
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_HANGUP);
continue;
}
- ftdm_log(FTDM_LOG_NOTICE, "Successfully opened channel %d:%d\n", ftdmchan->span_id, ftdmchan->chan_id);
+ ftdm_log(FTDM_LOG_NOTICE, "Successfully opened channel %d:%d\n",
+ ftdm_channel_get_span_id(chan),
+ ftdm_channel_get_id(chan));
}
flags = FTDM_READ;
- status = ftdm_channel_wait(ftdmchan, &flags, (gated) ? 0 : interval);
- switch(status) {
+ status = ftdm_channel_wait(chan, &flags, (gated) ? 0 : interval);
+ switch (status) {
case FTDM_FAIL:
continue;
@@ -1738,12 +1926,12 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
}
gated = 1;
- status = ftdm_channel_read(ftdmchan, frame, &len);
+ status = ftdm_channel_read(chan, frame, &len);
if (status != FTDM_SUCCESS || len <= 0) {
continue;
}
- if (ftdmchan->effective_codec != FTDM_CODEC_SLIN) {
+ if (chan->effective_codec != FTDM_CODEC_SLIN) {
len *= 2;
}
@@ -1752,23 +1940,23 @@ static void *ftdm_isdn_tones_run(ftdm_thread_t *me, void *obj)
rlen = ftdm_buffer_read_loop(dt_buffer, frame, len);
- if (ftdmchan->effective_codec != FTDM_CODEC_SLIN) {
+ if (chan->effective_codec != FTDM_CODEC_SLIN) {
fio_codec_t codec_func = NULL;
- if (ftdmchan->native_codec == FTDM_CODEC_ULAW) {
+ if (chan->native_codec == FTDM_CODEC_ULAW) {
codec_func = fio_slin2ulaw;
- } else if (ftdmchan->native_codec == FTDM_CODEC_ALAW) {
+ } else if (chan->native_codec == FTDM_CODEC_ALAW) {
codec_func = fio_slin2alaw;
}
if (codec_func) {
status = codec_func(frame, sizeof(frame), &rlen);
} else {
- snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "codec error!");
+ snprintf(chan->last_error, sizeof(chan->last_error), "codec error!");
goto done;
}
}
- ftdm_channel_write(ftdmchan, frame, sizeof(frame), &rlen);
+ ftdm_channel_write(chan, frame, sizeof(frame), &rlen);
}
/*
@@ -1799,11 +1987,6 @@ done:
return NULL;
}
-/**
- * \brief Main thread function for an ISDN span
- * \param me Current thread
- * \param obj Span to monitor
- */
static void *ftdm_isdn_run(ftdm_thread_t *me, void *obj)
{
ftdm_span_t *span = (ftdm_span_t *) obj;
@@ -1813,15 +1996,16 @@ static void *ftdm_isdn_run(ftdm_thread_t *me, void *obj)
int errs = 0;
#ifdef WIN32
- timeBeginPeriod(1);
+ timeBeginPeriod(1);
#endif
ftdm_log(FTDM_LOG_DEBUG, "ISDN thread starting.\n");
ftdm_set_flag(isdn_data, FTDM_ISDN_RUNNING);
Q921Start(&isdn_data->q921);
+ Q931Start(&isdn_data->q931);
- while(ftdm_running() && ftdm_test_flag(isdn_data, FTDM_ISDN_RUNNING) && !ftdm_test_flag(isdn_data, FTDM_ISDN_STOP)) {
+ while (ftdm_running() && ftdm_test_flag(isdn_data, FTDM_ISDN_RUNNING)) {
ftdm_wait_flag_t flags = FTDM_READ;
ftdm_status_t status = ftdm_channel_wait(isdn_data->dchan, &flags, 100);
@@ -1833,7 +2017,7 @@ static void *ftdm_isdn_run(ftdm_thread_t *me, void *obj)
/*
*
*/
- switch(status) {
+ switch (status) {
case FTDM_FAIL:
{
ftdm_log(FTDM_LOG_ERROR, "D-Chan Read Error!\n");
@@ -1853,20 +2037,13 @@ static void *ftdm_isdn_run(ftdm_thread_t *me, void *obj)
{
errs = 0;
if (flags & FTDM_READ) {
-
- if (ftdm_test_flag(isdn_data->dchan, FTDM_CHANNEL_SUSPENDED)) {
- ftdm_clear_flag_all(span, FTDM_CHANNEL_SUSPENDED);
- }
len = sizeof(frame);
if (ftdm_channel_read(isdn_data->dchan, frame, &len) == FTDM_SUCCESS) {
-#ifdef IODEBUG
- char bb[4096] = "";
- print_hex_bytes(frame, len, bb, sizeof(bb));
-
- print_bits(frame, (int)len, bb, sizeof(bb), FTDM_ENDIAN_LITTLE, 0);
- ftdm_log(FTDM_LOG_DEBUG, "READ %d\n%s\n%s\n\n", (int)len, LINE, bb);
+#ifdef HAVE_PCAP
+ if (isdn_pcap_capture_both(isdn_data)) {
+ isdn_pcap_write(isdn_data, frame, len, ISDN_PCAP_INCOMING);
+ }
#endif
-
Q921QueueHDLCFrame(&isdn_data->q921, frame, (int)len);
Q921Rx12(&isdn_data->q921);
}
@@ -1877,45 +2054,28 @@ static void *ftdm_isdn_run(ftdm_thread_t *me, void *obj)
break;
}
}
-
- done:
- ftdm_channel_close(&isdn_data->dchans[0]);
- ftdm_channel_close(&isdn_data->dchans[1]);
+
+done:
+// ftdm_channel_close(&isdn_data->dchans[0]);
+// ftdm_channel_close(&isdn_data->dchans[1]);
ftdm_clear_flag(isdn_data, FTDM_ISDN_RUNNING);
#ifdef WIN32
- timeEndPeriod(1);
+ timeEndPeriod(1);
+#endif
+#ifdef HAVE_PCAP
+ if (isdn_pcap_is_open(isdn_data)) {
+ isdn_pcap_close(isdn_data);
+ }
#endif
-
ftdm_log(FTDM_LOG_DEBUG, "ISDN thread ended.\n");
return NULL;
}
-/**
- * \brief FreeTDM ISDN signaling module initialisation
- * \return Success
- */
-static FIO_SIG_LOAD_FUNCTION(ftdm_isdn_init)
-{
- Q931Initialize();
-
- Q921SetGetTimeCB(ftdm_time_now);
- Q931SetGetTimeCB(ftdm_time_now);
-
- return FTDM_SUCCESS;
-}
-
-/**
- * \brief Receives a Q931 indication message
- * \param pvt Span were message is coming from
- * \param ind Q931 indication
- * \param tei Terminal Endpoint Identifier
- * \param msg Message string
- * \param mlen Message string length
- * \return 0 on success
- */
static int q931_rx_32(void *pvt, Q921DLMsg_t ind, L3UCHAR tei, L3UCHAR *msg, L3INT mlen)
{
+ ftdm_span_t *span = pvt;
+ ftdm_isdn_data_t *isdn_data = span->signal_data;
int offset = 4;
char bb[4096] = "";
@@ -1925,16 +2085,6 @@ static int q931_rx_32(void *pvt, Q921DLMsg_t ind, L3UCHAR tei, L3UCHAR *msg, L3I
case Q921_DL_DATA:
print_hex_bytes(msg + offset, mlen - offset, bb, sizeof(bb));
-#ifdef HAVE_LIBPCAP
- /*Q931ToPcap*/
- if(do_q931ToPcap==1){
- ftdm_span_t *span = (ftdm_span_t *) pvt;
- if(writeQ931PacketToPcap(msg + offset, mlen - offset, span->span_id, 0) != FTDM_SUCCESS){
- ftdm_log(FTDM_LOG_WARNING, "Couldn't write Q931 buffer to pcap file!\n");
- }
- }
- /*Q931ToPcap done*/
-#endif
ftdm_log(FTDM_LOG_DEBUG, "WRITE %d\n%s\n%s\n\n", (int)mlen - offset, LINE, bb);
break;
@@ -1942,17 +2092,14 @@ static int q931_rx_32(void *pvt, Q921DLMsg_t ind, L3UCHAR tei, L3UCHAR *msg, L3I
break;
}
- return Q921Rx32(pvt, ind, tei, msg, mlen);
+#ifdef HAVE_PCAP
+ if (isdn_pcap_capture_l3only(isdn_data)) {
+ isdn_pcap_write(isdn_data, msg, mlen, ISDN_PCAP_OUTGOING);
+ }
+#endif
+ return Q921Rx32(&isdn_data->q921, ind, tei, msg, mlen);
}
-/**
- * \brief Logs Q921 message
- * \param pvt Span were message is coming from
- * \param level Q921 log level
- * \param msg Message string
- * \param size Message string length
- * \return 0
- */
static int ftdm_isdn_q921_log(void *pvt, Q921LogLevel_t level, char *msg, L2INT size)
{
ftdm_span_t *span = (ftdm_span_t *) pvt;
@@ -1961,14 +2108,6 @@ static int ftdm_isdn_q921_log(void *pvt, Q921LogLevel_t level, char *msg, L2INT
return 0;
}
-/**
- * \brief Logs Q931 message
- * \param pvt Span were message is coming from
- * \param level Q931 log level
- * \param msg Message string
- * \param size Message string length
- * \return 0
- */
static L3INT ftdm_isdn_q931_log(void *pvt, Q931LogLevel_t level, char *msg, L3INT size)
{
ftdm_span_t *span = (ftdm_span_t *) pvt;
@@ -1976,9 +2115,7 @@ static L3INT ftdm_isdn_q931_log(void *pvt, Q931LogLevel_t level, char *msg, L3IN
ftdm_log("Span", "Q.931", span->span_id, (int)level, "%s", msg);
return 0;
}
-/**
- * \brief ISDN state map
- */
+
static ftdm_state_map_t isdn_state_map = {
{
{
@@ -2003,7 +2140,7 @@ static ftdm_state_map_t isdn_state_map = {
ZSD_OUTBOUND,
ZSM_UNACCEPTABLE,
{FTDM_CHANNEL_STATE_DIALING, FTDM_END},
- {FTDM_CHANNEL_STATE_PROGRESS_MEDIA, FTDM_CHANNEL_STATE_PROGRESS, FTDM_CHANNEL_STATE_UP, FTDM_CHANNEL_STATE_HANGUP, FTDM_CHANNEL_STATE_TERMINATING, FTDM_END}
+ {FTDM_CHANNEL_STATE_PROGRESS_MEDIA, FTDM_CHANNEL_STATE_PROGRESS, FTDM_CHANNEL_STATE_UP, FTDM_CHANNEL_STATE_HANGUP, FTDM_CHANNEL_STATE_TERMINATING, FTDM_CHANNEL_STATE_DOWN, FTDM_END}
},
{
ZSD_OUTBOUND,
@@ -2077,7 +2214,7 @@ static ftdm_state_map_t isdn_state_map = {
ZSD_INBOUND,
ZSM_UNACCEPTABLE,
{FTDM_CHANNEL_STATE_PROGRESS, FTDM_CHANNEL_STATE_PROGRESS_MEDIA, FTDM_END},
- {FTDM_CHANNEL_STATE_HANGUP, FTDM_CHANNEL_STATE_TERMINATING, FTDM_CHANNEL_STATE_PROGRESS_MEDIA,
+ {FTDM_CHANNEL_STATE_HANGUP, FTDM_CHANNEL_STATE_TERMINATING, FTDM_CHANNEL_STATE_PROGRESS_MEDIA,
FTDM_CHANNEL_STATE_CANCEL, FTDM_CHANNEL_STATE_UP, FTDM_END},
},
{
@@ -2086,17 +2223,11 @@ static ftdm_state_map_t isdn_state_map = {
{FTDM_CHANNEL_STATE_UP, FTDM_END},
{FTDM_CHANNEL_STATE_HANGUP, FTDM_CHANNEL_STATE_TERMINATING, FTDM_END},
},
-
-
}
};
/**
- * \brief Stops an ISDN span
- * \param span Span to halt
- * \return Success
- *
- * Sets a stop flag and waits for the threads to end
+ * \brief Stop signalling on span
*/
static ftdm_status_t ftdm_isdn_stop(ftdm_span_t *span)
{
@@ -2105,32 +2236,27 @@ static ftdm_status_t ftdm_isdn_stop(ftdm_span_t *span)
if (!ftdm_test_flag(isdn_data, FTDM_ISDN_RUNNING)) {
return FTDM_FAIL;
}
-
+
ftdm_set_flag(isdn_data, FTDM_ISDN_STOP);
-
- while(ftdm_test_flag(isdn_data, FTDM_ISDN_RUNNING)) {
+
+ while (ftdm_test_flag(isdn_data, FTDM_ISDN_RUNNING)) {
ftdm_sleep(100);
}
- while(ftdm_test_flag(isdn_data, FTDM_ISDN_TONES_RUNNING)) {
+ while (ftdm_test_flag(isdn_data, FTDM_ISDN_TONES_RUNNING)) {
ftdm_sleep(100);
}
return FTDM_SUCCESS;
-
}
/**
- * \brief Starts an ISDN span
- * \param span Span to halt
- * \return Success or failure
- *
- * Launches a thread to monitor the span and a thread to generate tones on the span
+ * \brief Start signalling on span
*/
static ftdm_status_t ftdm_isdn_start(ftdm_span_t *span)
{
- ftdm_status_t ret;
ftdm_isdn_data_t *isdn_data = span->signal_data;
+ ftdm_status_t ret;
if (ftdm_test_flag(isdn_data, FTDM_ISDN_RUNNING)) {
return FTDM_FAIL;
@@ -2149,264 +2275,586 @@ static ftdm_status_t ftdm_isdn_start(ftdm_span_t *span)
return ret;
}
-/**
- * \brief Parses an option string to flags
- * \param in String to parse for configuration options
- * \return Flags
- */
-static uint32_t parse_opts(const char *in)
+
+/*###################################################################*
+ * (text) value parsing / translation
+ *###################################################################*/
+
+static int32_t parse_loglevel(const char *level)
{
- uint32_t flags = 0;
-
- if (!in) {
- return 0;
- }
-
- if (strstr(in, "suggest_channel")) {
- flags |= FTDM_ISDN_OPT_SUGGEST_CHANNEL;
- }
+ if (!level)
+ return -1;
- if (strstr(in, "omit_display")) {
- flags |= FTDM_ISDN_OPT_OMIT_DISPLAY_IE;
+ if (!strcasecmp(level, "debug")) {
+ return FTDM_LOG_LEVEL_DEBUG;
+ } else if (!strcasecmp(level, "info")) {
+ return FTDM_LOG_LEVEL_INFO;
+ } else if (!strcasecmp(level, "notice")) {
+ return FTDM_LOG_LEVEL_NOTICE;
+ } else if (!strcasecmp(level, "warning")) {
+ return FTDM_LOG_LEVEL_WARNING;
+ } else if (!strcasecmp(level, "error")) {
+ return FTDM_LOG_LEVEL_ERROR;
+ } else if (!strcasecmp(level, "alert")) {
+ return FTDM_LOG_LEVEL_ALERT;
+ } else if (!strcasecmp(level, "crit")) {
+ return FTDM_LOG_LEVEL_CRIT;
+ } else if (!strcasecmp(level, "emerg")) {
+ return FTDM_LOG_LEVEL_EMERG;
+ } else {
+ return -1;
}
-
- if (strstr(in, "disable_tones")) {
- flags |= FTDM_ISDN_OPT_DISABLE_TONES;
- }
-
- return flags;
}
-/**
- * \brief Initialises an ISDN span from configuration variables
- * \param span Span to configure
- * \param sig_cb Callback function for event signals
- * \param ap List of configuration variables
- * \return Success or failure
- */
-static FIO_SIG_CONFIGURE_FUNCTION(ftdm_isdn_configure_span)
+static int parse_opts(const char *in, uint32_t *flags)
+{
+ if (!in || !flags)
+ return -1;
+
+ if (strstr(in, "suggest_channel")) {
+ *flags |= FTDM_ISDN_OPT_SUGGEST_CHANNEL;
+ }
+ if (strstr(in, "omit_display")) {
+ *flags |= FTDM_ISDN_OPT_OMIT_DISPLAY_IE;
+ }
+ if (strstr(in, "disable_tones")) {
+ *flags |= FTDM_ISDN_OPT_DISABLE_TONES;
+ }
+
+ return 0;
+}
+
+static int parse_dialect(const char *in, uint32_t *dialect)
+{
+ if (!in || !dialect)
+ return -1;
+
+#if __UNSUPPORTED__
+ if (!strcasecmp(in, "national")) {
+ *dialect = Q931_Dialect_National;
+ return 0;
+ }
+ if (!strcasecmp(in, "dms")) {
+ *dialect = Q931_Dialect_DMS;
+ return 0;
+ }
+#endif
+ if (!strcasecmp(in, "5ess")) {
+ *dialect = Q931_Dialect_5ESS;
+ return 0;
+ }
+ if (!strcasecmp(in, "dss1") || !strcasecmp(in, "euroisdn")) {
+ *dialect = Q931_Dialect_DSS1;
+ return 0;
+ }
+ if (!strcasecmp(in, "q931")) {
+ *dialect = Q931_Dialect_Q931;
+ return 0;
+ }
+
+ return -1;
+}
+
+
+/*###################################################################*
+ * API commands
+ *###################################################################*/
+
+static const char isdn_api_usage[] =
+#ifdef HAVE_PCAP
+ "isdn capture [q931only]\n"
+ "isdn capture \n"
+#endif
+ "isdn loglevel \n"
+ "isdn dump calls\n"
+ "isdn help";
+
+
+/**
+ * isdn_api
+ */
+static FIO_API_FUNCTION(isdn_api)
+{
+ char *mycmd = NULL, *argv[10] = { 0 };
+ int argc = 0;
+
+ if (data) {
+ mycmd = strdup(data);
+ argc = ftdm_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
+ }
+
+ if (!argc || !strcasecmp(argv[0], "help")) {
+ stream->write_function(stream, "%s\n", isdn_api_usage);
+ goto done;
+ }
+ else if (!strcasecmp(argv[0], "dump")) {
+ ftdm_isdn_data_t *isdn_data = NULL;
+ ftdm_span_t *span = NULL;
+ int span_id = 0;
+
+ /* dump calls */
+
+ if (argc < 3) {
+ stream->write_function(stream, "-ERR not enough arguments.\n");
+ goto done;
+ }
+
+ span_id = atoi(argv[1]);
+
+ if (ftdm_span_find_by_name(argv[1], &span) == FTDM_SUCCESS || ftdm_span_find(span_id, &span) == FTDM_SUCCESS) {
+ isdn_data = span->signal_data;
+ } else {
+ stream->write_function(stream, "-ERR invalid span.\n");
+ goto done;
+ }
+
+ if (!strcasecmp(argv[2], "calls")) {
+ /* dump all calls to log */
+ Q931DumpAllCalls(&isdn_data->q931);
+ stream->write_function(stream, "+OK call information dumped to log\n");
+ goto done;
+ }
+ }
+ else if (!strcasecmp(argv[0], "loglevel")) {
+ ftdm_isdn_data_t *isdn_data = NULL;
+ ftdm_span_t *span = NULL;
+ int span_id = 0;
+ int layer = 0;
+ int level = 0;
+
+ /* loglevel [level] */
+
+ if (argc < 3) {
+ stream->write_function(stream, "-ERR not enough arguments.\n");
+ goto done;
+ }
+
+ span_id = atoi(argv[1]);
+
+ if (ftdm_span_find_by_name(argv[1], &span) == FTDM_SUCCESS || ftdm_span_find(span_id, &span) == FTDM_SUCCESS) {
+ isdn_data = span->signal_data;
+ } else {
+ stream->write_function(stream, "-ERR invalid span.\n");
+ goto done;
+ }
+
+ if (!strcasecmp(argv[2], "q921")) {
+ layer = 0x01;
+ } else if (!strcasecmp(argv[2], "q931")) {
+ layer = 0x02;
+ } else if (!strcasecmp(argv[2], "all")) {
+ layer = 0x03;
+ } else {
+ stream->write_function(stream, "-ERR invalid layer\n");
+ goto done;
+ }
+
+ if (argc > 3) {
+ /* set loglevel */
+ if ((level = parse_loglevel(argv[3])) < 0) {
+ stream->write_function(stream, "-ERR invalid loglevel\n");
+ goto done;
+ }
+
+ if (layer & 0x01) { /* q921 */
+ Q921SetLogLevel(&isdn_data->q921, (Q921LogLevel_t)level);
+ }
+ if (layer & 0x02) { /* q931 */
+ Q931SetLogLevel(&isdn_data->q931, (Q931LogLevel_t)level);
+ }
+ stream->write_function(stream, "+OK loglevel set");
+ } else {
+ /* get loglevel */
+ if (layer & 0x01) {
+ stream->write_function(stream, "Q.921 loglevel: %s\n",
+ Q921GetLogLevelName(&isdn_data->q921));
+ }
+ if (layer & 0x02) {
+ stream->write_function(stream, "Q.931 loglevel: %s\n",
+ Q931GetLogLevelName(&isdn_data->q931));
+ }
+ stream->write_function(stream, "+OK");
+ }
+ goto done;
+ }
+#ifdef HAVE_PCAP
+ else if (!strcasecmp(argv[0], "capture")) {
+ ftdm_isdn_data_t *isdn_data = NULL;
+ ftdm_span_t *span = NULL;
+ int span_id = 0;
+
+ /* capture [q931only] */
+ /* capture */
+
+ if (argc < 3) {
+ stream->write_function(stream, "-ERR not enough arguments.\n");
+ goto done;
+ }
+
+ span_id = atoi(argv[1]);
+
+ if (ftdm_span_find_by_name(argv[1], &span) == FTDM_SUCCESS || ftdm_span_find(span_id, &span) == FTDM_SUCCESS) {
+ isdn_data = span->signal_data;
+ } else {
+ stream->write_function(stream, "-ERR invalid span.\n");
+ goto done;
+ }
+
+ if (!strcasecmp(argv[2], "start")) {
+ char *filename = NULL;
+
+ if (argc < 4) {
+ stream->write_function(stream, "-ERR not enough parameters.\n");
+ goto done;
+ }
+
+ if (isdn_pcap_is_open(isdn_data)) {
+ stream->write_function(stream, "-ERR capture is already running.\n");
+ goto done;
+ }
+
+ filename = argv[3];
+
+ if (isdn_pcap_open(isdn_data, filename) != FTDM_SUCCESS) {
+ stream->write_function(stream, "-ERR failed to open capture file.\n");
+ goto done;
+ }
+
+ if (argc > 4 && !strcasecmp(argv[4], "q931only")) {
+ isdn_data->flags |= FTDM_ISDN_CAPTURE_L3ONLY;
+ }
+ isdn_pcap_start(isdn_data);
+
+ stream->write_function(stream, "+OK capture started.\n");
+ goto done;
+ }
+ else if (!strcasecmp(argv[2], "stop")) {
+
+ if (!isdn_pcap_is_open(isdn_data)) {
+ stream->write_function(stream, "-ERR capture is not running.\n");
+ goto done;
+ }
+
+ isdn_pcap_stop(isdn_data);
+ isdn_pcap_close(isdn_data);
+
+ stream->write_function(stream, "+OK capture stopped.\n");
+ goto done;
+ }
+ else if (!strcasecmp(argv[2], "suspend")) {
+
+ if (!isdn_pcap_is_open(isdn_data)) {
+ stream->write_function(stream, "-ERR capture is not running.\n");
+ goto done;
+ }
+ isdn_pcap_stop(isdn_data);
+
+ stream->write_function(stream, "+OK capture suspended.\n");
+ goto done;
+ }
+ else if (!strcasecmp(argv[2], "resume")) {
+
+ if (!isdn_pcap_is_open(isdn_data)) {
+ stream->write_function(stream, "-ERR capture is not running.\n");
+ goto done;
+ }
+ isdn_pcap_start(isdn_data);
+
+ stream->write_function(stream, "+OK capture resumed.\n");
+ goto done;
+ }
+ else {
+ stream->write_function(stream, "-ERR wrong action.\n");
+ goto done;
+ }
+ }
+#endif
+ else {
+ stream->write_function(stream, "-ERR invalid command.\n");
+ }
+done:
+ ftdm_safe_free(mycmd);
+
+ return FTDM_SUCCESS;
+}
+
+static int parse_mode(const char *mode)
+{
+ if (!mode)
+ return -1;
+
+ if (!strcasecmp(mode, "user") || !strcasecmp(mode, "cpe")) {
+ return Q931_TE;
+ }
+ if (!strcasecmp(mode, "net") || !strcasecmp(mode, "network")) {
+ return Q931_NT;
+ }
+
+ return -1;
+}
+
+static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(isdn_configure_span)
{
- uint32_t i, x = 0;
- ftdm_channel_t *dchans[2] = {0};
- ftdm_isdn_data_t *isdn_data;
- const char *tonemap = "us";
- char *var, *val;
Q931Dialect_t dialect = Q931_Dialect_National;
+ ftdm_channel_t *dchan = NULL;
+ ftdm_isdn_data_t *isdn_data;
int32_t digit_timeout = 0;
+ const char *tonemap = "us";
+ int dchan_count = 0, bchan_count = 0;
int q921loglevel = -1;
int q931loglevel = -1;
-#ifdef HAVE_LIBPCAP
- int q931topcap = -1; /*Q931ToPcap*/
- int openPcap = 0; /*Flag: open Pcap file please*/
-#endif
+ uint32_t i;
if (span->signal_type) {
-#ifdef HAVE_LIBPCAP
- /*Q931ToPcap: Get the content of the q931topcap and pcapfilename args given by mod_freetdm */
- while((var = va_arg(ap, char *))) {
- if (!strcasecmp(var, "q931topcap")) {
- q931topcap = va_arg(ap, int);
- if(q931topcap==1) {
- /*PCAP on*/;
- openPcap=1;
- } else if (q931topcap==0) {
- /*PCAP off*/
- if (closePcapFile() != FTDM_SUCCESS) return FTDM_FAIL;
- do_q931ToPcap=0;
- return FTDM_SUCCESS;
- }
- }
- if (!strcasecmp(var, "pcapfilename")) {
- /*Put filename into global var*/
- pcapfn = va_arg(ap, char*);
- }
- }
- /*We know now, that user wants to enable Q931ToPcap and what file name he wants, so open it please*/
- if(openPcap==1){
- if(openPcapFile() != FTDM_SUCCESS) return FTDM_FAIL;
- do_q931ToPcap=1;
- return FTDM_SUCCESS;
- }
- /*Q931ToPcap done*/
-#endif
- snprintf(span->last_error, sizeof(span->last_error), "Span is already configured for signalling [%d].", span->signal_type);
+ ftdm_log(FTDM_LOG_ERROR, "Span is already configured for signalling [%d]\n", span->signal_type);
+ snprintf(span->last_error, sizeof(span->last_error), "Span is already configured for signalling [%d]", span->signal_type);
return FTDM_FAIL;
}
- if (span->trunk_type >= FTDM_TRUNK_NONE) {
- ftdm_log(FTDM_LOG_WARNING, "Invalid trunk type '%s' defaulting to T1.\n", ftdm_trunk_type2str(span->trunk_type));
+ if (ftdm_span_get_trunk_type(span) >= FTDM_TRUNK_NONE) {
+ ftdm_log(FTDM_LOG_WARNING, "Invalid trunk type '%s' defaulting to T1\n", ftdm_span_get_trunk_type_str(span));
span->trunk_type = FTDM_TRUNK_T1;
}
-
- for(i = 1; i <= span->chan_count; i++) {
- if (span->channels[i]->type == FTDM_CHAN_TYPE_DQ921) {
- if (x > 1) {
- snprintf(span->last_error, sizeof(span->last_error), "Span has more than 2 D-Channels!");
+
+ for (i = 1; i <= ftdm_span_get_chan_count(span); i++) {
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, i);
+
+ switch (ftdm_channel_get_type(chan)) {
+ case FTDM_CHAN_TYPE_DQ921:
+ if (dchan_count > 1) {
+ ftdm_log(FTDM_LOG_ERROR, "Span has more than 1 D-Channel!\n");
+ snprintf(span->last_error, sizeof(span->last_error), "Span has more than 1 D-Channel!");
return FTDM_FAIL;
- } else {
- if (ftdm_channel_open(span->span_id, i, &dchans[x]) == FTDM_SUCCESS) {
- ftdm_log(FTDM_LOG_DEBUG, "opening d-channel #%d %d:%d\n", x, dchans[x]->span_id, dchans[x]->chan_id);
- dchans[x]->state = FTDM_CHANNEL_STATE_UP;
- x++;
- }
}
+
+ if (ftdm_channel_open(ftdm_span_get_id(span), i, &dchan) == FTDM_SUCCESS) {
+ ftdm_log(FTDM_LOG_DEBUG, "opening d-channel #%d %d:%d\n", dchan_count,
+ ftdm_channel_get_span_id(dchan), ftdm_channel_get_id(dchan));
+ dchan->state = FTDM_CHANNEL_STATE_UP;
+ }
+
+ dchan_count++;
+ break;
+
+ case FTDM_CHAN_TYPE_B:
+ bchan_count++;
+ break;
+
+ default:
+ break;
}
}
-
- if (!x) {
- snprintf(span->last_error, sizeof(span->last_error), "Span has no D-Channels!");
+ if (!dchan_count) {
+ ftdm_log(FTDM_LOG_ERROR, "Span has no D-Channel!\n");
+ snprintf(span->last_error, sizeof(span->last_error), "Span has no D-Channel!");
+ return FTDM_FAIL;
+ }
+ if (!bchan_count) {
+ ftdm_log(FTDM_LOG_ERROR, "Span has no B-Channels!\n");
+ snprintf(span->last_error, sizeof(span->last_error), "Span has no B-Channels!");
return FTDM_FAIL;
}
- isdn_data = ftdm_malloc(sizeof(*isdn_data));
+ isdn_data = malloc(sizeof(*isdn_data));
assert(isdn_data != NULL);
memset(isdn_data, 0, sizeof(*isdn_data));
-
+
isdn_data->mode = Q931_TE;
- dialect = Q931_Dialect_National;
-
- while((var = va_arg(ap, char *))) {
+ dialect = Q931_Dialect_Q931;
+
+ for (i = 0; ftdm_parameters[i].var; i++) {
+ const char *var = ftdm_parameters[i].var;
+ const char *val = ftdm_parameters[i].val;
+
+ if (ftdm_strlen_zero(var)) {
+ ftdm_log(FTDM_LOG_WARNING, "Skipping variable with no name\n");
+ continue;
+ }
+
+ if (ftdm_strlen_zero(val)) {
+ ftdm_log(FTDM_LOG_ERROR, "Variable '%s' has no value\n", var);
+ return FTDM_FAIL;
+ }
+
if (!strcasecmp(var, "mode")) {
- if (!(val = va_arg(ap, char *))) {
- break;
+ if ((isdn_data->mode = parse_mode(val)) < 0) {
+ ftdm_log(FTDM_LOG_ERROR, "Invalid/unknown mode '%s'\n", val);
+ snprintf(span->last_error, sizeof(span->last_error), "Invalid/unknown mode [%s]!", val);
+ return FTDM_FAIL;
}
- isdn_data->mode = strcasecmp(val, "net") ? Q931_TE : Q931_NT;
} else if (!strcasecmp(var, "dialect")) {
- if (!(val = va_arg(ap, char *))) {
- break;
- }
- dialect = q931_str2Q931Dialect_type(val);
- if (dialect == Q931_Dialect_Count) {
+ if (parse_dialect(val, &dialect) < 0) {
+ ftdm_log(FTDM_LOG_ERROR, "Invalid/unknown dialect '%s'\n", val);
+ snprintf(span->last_error, sizeof(span->last_error), "Invalid/unknown dialect [%s]!", val);
return FTDM_FAIL;
}
} else if (!strcasecmp(var, "opts")) {
- if (!(val = va_arg(ap, char *))) {
- break;
+ if (parse_opts(val, &isdn_data->opts) < 0) {
+ ftdm_log(FTDM_LOG_ERROR, "Invalid/unknown options '%s'\n", val);
+ snprintf(span->last_error, sizeof(span->last_error), "Invalid/unknown options [%s]!", val);
+ return FTDM_FAIL;
}
- isdn_data->opts = parse_opts(val);
} else if (!strcasecmp(var, "tonemap")) {
- if (!(val = va_arg(ap, char *))) {
- break;
- }
tonemap = (const char *)val;
} else if (!strcasecmp(var, "digit_timeout")) {
- int *optp;
- if (!(optp = va_arg(ap, int *))) {
- break;
+ digit_timeout = atoi(val);
+ if (digit_timeout < 3000 || digit_timeout > 30000) {
+ ftdm_log(FTDM_LOG_WARNING, "Digit timeout %d ms outside of range (3000 - 30000 ms), using default (10000 ms)\n", digit_timeout);
+ digit_timeout = DEFAULT_DIGIT_TIMEOUT;
}
- digit_timeout = *optp;
} else if (!strcasecmp(var, "q921loglevel")) {
- q921loglevel = va_arg(ap, int);
- if (q921loglevel < Q921_LOG_NONE) {
- q921loglevel = Q921_LOG_NONE;
- } else if (q921loglevel > Q921_LOG_DEBUG) {
- q921loglevel = Q921_LOG_DEBUG;
+ if ((q921loglevel = parse_loglevel(val)) < 0) {
+ ftdm_log(FTDM_LOG_ERROR, "Invalid/unknown loglevel '%s'\n", val);
+ snprintf(span->last_error, sizeof(span->last_error), "Invalid/unknown loglevel [%s]!", val);
+ return FTDM_FAIL;
}
} else if (!strcasecmp(var, "q931loglevel")) {
- q931loglevel = va_arg(ap, int);
- if (q931loglevel < Q931_LOG_NONE) {
- q931loglevel = Q931_LOG_NONE;
- } else if (q931loglevel > Q931_LOG_DEBUG) {
- q931loglevel = Q931_LOG_DEBUG;
+ if ((q931loglevel = parse_loglevel(val)) < 0) {
+ ftdm_log(FTDM_LOG_ERROR, "Invalid/unknown loglevel '%s'\n", val);
+ snprintf(span->last_error, sizeof(span->last_error), "Invalid/unknown loglevel [%s]!", val);
+ return FTDM_FAIL;
}
} else {
+ ftdm_log(FTDM_LOG_ERROR, "Unknown parameter '%s'\n", var);
snprintf(span->last_error, sizeof(span->last_error), "Unknown parameter [%s]", var);
return FTDM_FAIL;
}
}
-
if (!digit_timeout) {
digit_timeout = DEFAULT_DIGIT_TIMEOUT;
}
- else if (digit_timeout < 3000 || digit_timeout > 30000) {
- ftdm_log(FTDM_LOG_WARNING, "Digit timeout %d ms outside of range (3000 - 30000 ms), using default (10000 ms)\n", digit_timeout);
- digit_timeout = DEFAULT_DIGIT_TIMEOUT;
- }
/* allocate per b-chan data */
if (isdn_data->mode == Q931_NT) {
ftdm_isdn_bchan_data_t *data;
- data = ftdm_malloc((span->chan_count - 1) * sizeof(ftdm_isdn_bchan_data_t));
+ data = malloc(bchan_count * sizeof(ftdm_isdn_bchan_data_t));
if (!data) {
return FTDM_FAIL;
}
- for (i = 1; i <= span->chan_count; i++, data++) {
- if (span->channels[i]->type == FTDM_CHAN_TYPE_B) {
- span->channels[i]->mod_data = data;
+ for (i = 1; i <= ftdm_span_get_chan_count(span); i++, data++) {
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, i);
+
+ if (ftdm_channel_get_type(chan) == FTDM_CHAN_TYPE_B) {
+ chan->call_data = data;
memset(data, 0, sizeof(ftdm_isdn_bchan_data_t));
}
}
}
-
- span->start = ftdm_isdn_start;
- span->stop = ftdm_isdn_stop;
- span->signal_cb = sig_cb;
- isdn_data->dchans[0] = dchans[0];
- isdn_data->dchans[1] = dchans[1];
- isdn_data->dchan = isdn_data->dchans[0];
+
+ isdn_data->sig_cb = sig_cb;
+ isdn_data->dchan = dchan;
isdn_data->digit_timeout = digit_timeout;
-
+
Q921_InitTrunk(&isdn_data->q921,
0,
0,
isdn_data->mode,
- span->trunk_type == FTDM_TRUNK_BRI_PTMP ? Q921_PTMP : Q921_PTP,
+ (ftdm_span_get_trunk_type(span) == FTDM_TRUNK_BRI_PTMP) ? Q921_PTMP : Q921_PTP,
0,
ftdm_isdn_921_21,
(Q921Tx23CB_t)ftdm_isdn_921_23,
span,
- &isdn_data->q931);
+ span);
- Q921SetLogCB(&isdn_data->q921, &ftdm_isdn_q921_log, isdn_data);
+ Q921SetLogCB(&isdn_data->q921, &ftdm_isdn_q921_log, span);
Q921SetLogLevel(&isdn_data->q921, (Q921LogLevel_t)q921loglevel);
-
- Q931Api_InitTrunk(&isdn_data->q931,
+
+ Q931InitTrunk(&isdn_data->q931,
dialect,
isdn_data->mode,
span->trunk_type,
ftdm_isdn_931_34,
(Q931Tx32CB_t)q931_rx_32,
ftdm_isdn_931_err,
- &isdn_data->q921,
+ span,
span);
- Q931SetLogCB(&isdn_data->q931, &ftdm_isdn_q931_log, isdn_data);
+ Q931SetLogCB(&isdn_data->q931, &ftdm_isdn_q931_log, span);
Q931SetLogLevel(&isdn_data->q931, (Q931LogLevel_t)q931loglevel);
- isdn_data->q931.autoRestartAck = 1;
- isdn_data->q931.autoConnectAck = 0;
- isdn_data->q931.autoServiceAck = 1;
- span->signal_data = isdn_data;
- span->signal_type = FTDM_SIGTYPE_ISDN;
+ /* Register new event hander CB */
+ Q931SetCallEventCB(&isdn_data->q931, ftdm_isdn_call_event, span);
+
+ /* TODO: hmm, maybe drop the "Trunk" prefix */
+ Q931TrunkSetAutoRestartAck(&isdn_data->q931, 1);
+ Q931TrunkSetAutoConnectAck(&isdn_data->q931, 1);
+ Q931TrunkSetAutoServiceAck(&isdn_data->q931, 1);
+ Q931TrunkSetStatusEnquiry(&isdn_data->q931, 0);
+
+ span->state_map = &isdn_state_map;
+ span->signal_data = isdn_data;
+ span->signal_type = FTDM_SIGTYPE_ISDN;
+ span->start = ftdm_isdn_start;
+ span->stop = ftdm_isdn_stop;
span->outgoing_call = isdn_outgoing_call;
+ span->get_channel_sig_status = isdn_get_channel_sig_status;
+ span->get_span_sig_status = isdn_get_span_sig_status;
+
+#ifdef __TODO__
if ((isdn_data->opts & FTDM_ISDN_OPT_SUGGEST_CHANNEL)) {
span->channel_request = isdn_channel_request;
- ftdm_set_flag(span, FTDM_SPAN_SUGGEST_CHAN_ID);
+ span->flags |= FTDM_SPAN_SUGGEST_CHAN_ID;
}
- span->state_map = &isdn_state_map;
-
+#endif
ftdm_span_load_tones(span, tonemap);
return FTDM_SUCCESS;
}
/**
- * \brief FreeTDM ISDN signaling module definition
+ * ISDN module io interface
+ * \note This is really ugly...
*/
-EX_DECLARE_DATA ftdm_module_t ftdm_module = {
- "isdn",
- NULL,
- close_pcap,
- ftdm_isdn_init,
- ftdm_isdn_configure_span,
- NULL
+static ftdm_io_interface_t isdn_interface = {
+ .name = "isdn",
+ .api = isdn_api
};
+/**
+ * \brief ISDN module io interface init callback
+ */
+static FIO_IO_LOAD_FUNCTION(isdn_io_load)
+{
+ assert(fio != NULL);
+ *fio = &isdn_interface;
+
+ return FTDM_SUCCESS;
+}
+
+/**
+ * \brief ISDN module load callback
+ */
+static FIO_SIG_LOAD_FUNCTION(isdn_load)
+{
+ Q931Initialize();
+
+ Q921SetGetTimeCB(ftdm_time_now);
+ Q931SetGetTimeCB(ftdm_time_now);
+
+ return FTDM_SUCCESS;
+}
+
+/**
+ * \brief ISDN module shutdown callback
+ */
+static FIO_SIG_UNLOAD_FUNCTION(isdn_unload)
+{
+ return FTDM_SUCCESS;
+};
+
+ftdm_module_t ftdm_module = {
+ .name = "isdn",
+ .io_load = isdn_io_load,
+ .io_unload = NULL,
+ .sig_load = isdn_load,
+ .sig_unload = isdn_unload,
+ .configure_span_signaling = isdn_configure_span
+};
/* For Emacs:
* Local Variables:
@@ -2416,5 +2864,5 @@ EX_DECLARE_DATA ftdm_module_t ftdm_module = {
* c-basic-offset:4
* End:
* For VIM:
- * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
*/
diff --git a/libs/freetdm/src/ftmod/ftmod_isdn/ftdm_isdn.h b/libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.h
similarity index 83%
rename from libs/freetdm/src/ftmod/ftmod_isdn/ftdm_isdn.h
rename to libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.h
index 7168abeb3b..95eee90887 100644
--- a/libs/freetdm/src/ftmod/ftmod_isdn/ftdm_isdn.h
+++ b/libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.h
@@ -1,23 +1,23 @@
/*
* Copyright (c) 2007, Anthony Minessale II
* All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
- *
+ *
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
- *
+ *
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- *
+ *
* * Neither the name of the original author; nor the names of any contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
- *
- *
+ *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -33,7 +33,6 @@
#ifndef FTDM_ISDN_H
#define FTDM_ISDN_H
-#include "freetdm.h"
#define DEFAULT_DIGIT_TIMEOUT 10000 /* default overlap timeout: 10 seconds */
@@ -42,17 +41,23 @@ typedef enum {
FTDM_ISDN_OPT_NONE = 0,
FTDM_ISDN_OPT_SUGGEST_CHANNEL = (1 << 0),
FTDM_ISDN_OPT_OMIT_DISPLAY_IE = (1 << 1), /*!< Do not send Caller name in outgoing SETUP message (= Display IE) */
- FTDM_ISDN_OPT_DISABLE_TONES = (1 << 2), /*!< Disable tone generating thread (NT mode) */
+ FTDM_ISDN_OPT_DISABLE_TONES = (1 << 2), /*!< Disable tone generating thread (NT mode) */
FTDM_ISDN_OPT_MAX = (2 << 0)
} ftdm_isdn_opts_t;
typedef enum {
- FTDM_ISDN_RUNNING = (1 << 0),
- FTDM_ISDN_TONES_RUNNING = (1 << 1),
- FTDM_ISDN_STOP = (1 << 2)
+ FTDM_ISDN_RUNNING = (1 << 0),
+ FTDM_ISDN_TONES_RUNNING = (1 << 1),
+ FTDM_ISDN_STOP = (1 << 2),
+
+ FTDM_ISDN_CAPTURE = (1 << 3),
+ FTDM_ISDN_CAPTURE_L3ONLY = (1 << 4)
} ftdm_isdn_flag_t;
+#ifdef HAVE_PCAP
+struct pcap_context;
+#endif
struct ftdm_isdn_data {
Q921Data_t q921;
@@ -60,6 +65,7 @@ struct ftdm_isdn_data {
ftdm_channel_t *dchan;
ftdm_channel_t *dchans[2];
struct ftdm_sigmsg sigmsg;
+ fio_signal_cb_t sig_cb;
uint32_t flags;
int32_t mode;
int32_t digit_timeout;
@@ -67,6 +73,9 @@ struct ftdm_isdn_data {
ftdm_caller_data_t *outbound_crv[32768];
ftdm_channel_t *channels_local_crv[32768];
ftdm_channel_t *channels_remote_crv[32768];
+#ifdef HAVE_PCAP
+ struct pcap_context *pcap;
+#endif
};
typedef struct ftdm_isdn_data ftdm_isdn_data_t;
@@ -75,7 +84,7 @@ typedef struct ftdm_isdn_data ftdm_isdn_data_t;
/* b-channel private data */
struct ftdm_isdn_bchan_data
{
- L2ULONG digit_timeout;
+ int32_t digit_timeout;
};
typedef struct ftdm_isdn_bchan_data ftdm_isdn_bchan_data_t;
@@ -91,6 +100,6 @@ typedef struct ftdm_isdn_bchan_data ftdm_isdn_bchan_data_t;
* c-basic-offset:4
* End:
* For VIM:
- * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
*/
diff --git a/libs/freetdm/src/ftmod/ftmod_isdn/ozmod_isdn.2005.vcproj b/libs/freetdm/src/ftmod/ftmod_isdn/ozmod_isdn.2005.vcproj
deleted file mode 100644
index 5c8d2efc0f..0000000000
--- a/libs/freetdm/src/ftmod/ftmod_isdn/ozmod_isdn.2005.vcproj
+++ /dev/null
@@ -1,316 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
index a7135aab0d..21d6674717 100644
--- a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
+++ b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
@@ -1,23 +1,24 @@
/*
* Copyright (c) 2007, Anthony Minessale II
+ * Copyright (c) 2010, Stefan Knoblich
* All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
- *
+ *
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
- *
+ *
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- *
+ *
* * Neither the name of the original author; nor the names of any contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
- *
- *
+ *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -30,10 +31,15 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
#include "private/ftdm_core.h"
#include "ftmod_libpri.h"
+static void _ftdm_channel_set_state_force(ftdm_channel_t *chan, const ftdm_channel_state_t state)
+{
+ assert(chan);
+ chan->state = state;
+}
+
/**
* \brief Unloads libpri IO module
* \return Success
@@ -140,100 +146,118 @@ static void s_pri_message(char *s)
static void s_pri_message(struct pri *pri, char *s)
#endif
{
- ftdm_log(FTDM_LOG_DEBUG, "%s", s);
+ ftdm_log(FTDM_LOG_DEBUG, "%s", s);
}
-/**
- * \brief Parses an option string to flags
- * \param in String to parse for configuration options
- * \return Flags
- */
-static uint32_t parse_opts(const char *in)
-{
- uint32_t flags = 0;
-
- if (!in) {
- return 0;
- }
-
- if (strstr(in, "suggest_channel")) {
- flags |= FTMOD_LIBPRI_OPT_SUGGEST_CHANNEL;
- }
-
- if (strstr(in, "omit_display")) {
- flags |= FTMOD_LIBPRI_OPT_OMIT_DISPLAY_IE;
- }
-
- if (strstr(in, "omit_redirecting_number")) {
- flags |= FTMOD_LIBPRI_OPT_OMIT_REDIRECTING_NUMBER_IE;
- }
+#define PRI_DEBUG_Q921_ALL (PRI_DEBUG_Q921_RAW | PRI_DEBUG_Q921_DUMP | PRI_DEBUG_Q921_STATE)
+#define PRI_DEBUG_Q931_ALL (PRI_DEBUG_Q931_DUMP | PRI_DEBUG_Q931_STATE | PRI_DEBUG_Q931_ANOMALY)
- return flags;
-}
+static const struct ftdm_libpri_debug {
+ const char *name;
+ const int flags;
+} ftdm_libpri_debug[] = {
+ /* NOTE: order is important for print_debug() */
+ { "q921_all", PRI_DEBUG_Q921_ALL },
+ { "q921_raw", PRI_DEBUG_Q921_RAW },
+ { "q921_dump", PRI_DEBUG_Q921_DUMP },
+ { "q921_state", PRI_DEBUG_Q921_STATE },
+
+ { "q931_all", PRI_DEBUG_Q931_ALL },
+ { "q931_dump", PRI_DEBUG_Q931_DUMP },
+ { "q931_state", PRI_DEBUG_Q931_STATE },
+ { "q931_anomaly", PRI_DEBUG_Q931_ANOMALY },
+
+ { "config", PRI_DEBUG_CONFIG },
+ { "apdu", PRI_DEBUG_APDU },
+ { "aoc", PRI_DEBUG_AOC }
+};
/**
* \brief Parses a debug string to flags
* \param in Debug string to parse for
- * \return Flags
+ * \return Flags or -1 if nothing matched
*/
-static int parse_debug(const char *in)
+static int parse_debug(const char *in, uint32_t *flags)
{
- int flags = 0;
+ int res = -1;
+ int i;
- if (!in) {
+ if (!in || !flags)
+ return -1;
+
+ if (!strcmp(in, "all")) {
+ *flags = PRI_DEBUG_ALL;
+ return 0;
+ }
+ if (strstr(in, "none")) {
+ *flags = 0;
return 0;
}
- if (strstr(in, "q921_raw")) {
- flags |= PRI_DEBUG_Q921_RAW;
+ for (i = 0; i < ftdm_array_len(ftdm_libpri_debug); i++) {
+ if (strstr(in, ftdm_libpri_debug[i].name)) {
+ *flags |= ftdm_libpri_debug[i].flags;
+ res = 0;
+ }
}
-
- if (strstr(in, "q921_dump")) {
- flags |= PRI_DEBUG_Q921_DUMP;
- }
-
- if (strstr(in, "q921_state")) {
- flags |= PRI_DEBUG_Q921_STATE;
- }
-
- if (strstr(in, "config")) {
- flags |= PRI_DEBUG_CONFIG;
- }
-
- if (strstr(in, "q931_dump")) {
- flags |= PRI_DEBUG_Q931_DUMP;
- }
-
- if (strstr(in, "q931_state")) {
- flags |= PRI_DEBUG_Q931_STATE;
- }
-
- if (strstr(in, "q931_anomaly")) {
- flags |= PRI_DEBUG_Q931_ANOMALY;
- }
-
- if (strstr(in, "apdu")) {
- flags |= PRI_DEBUG_APDU;
- }
-
- if (strstr(in, "aoc")) {
- flags |= PRI_DEBUG_AOC;
- }
-
- if (strstr(in, "all")) {
- flags |= PRI_DEBUG_ALL;
- }
-
- if (strstr(in, "none")) {
- flags = 0;
- }
-
- return flags;
+ return res;
}
-static ftdm_io_interface_t ftdm_libpri_interface;
+static int print_debug(uint32_t flags, char *tmp, const int size)
+{
+ int offset = 0;
+ int res = 0;
+ int i;
+
+ if ((flags & PRI_DEBUG_ALL) == PRI_DEBUG_ALL) {
+ strcat(tmp, "all");
+ return 0;
+ }
+ else if (!flags) {
+ strcat(tmp, "none");
+ return 0;
+ }
+
+ for (i = 0; i < ftdm_array_len(ftdm_libpri_debug); i++) {
+ if ((flags & ftdm_libpri_debug[i].flags) == ftdm_libpri_debug[i].flags) {
+ res = snprintf(&tmp[offset], size - offset, "%s,", ftdm_libpri_debug[i].name);
+ if (res <= 0 || res == (size - offset))
+ goto out;
+ offset += res;
+ flags &= ~ftdm_libpri_debug[i].flags; /* remove detected flags to make *_all work correctly */
+ }
+ }
+
+out:
+ tmp[offset - 1] = '\0';
+ return 0;
+}
static ftdm_status_t ftdm_libpri_start(ftdm_span_t *span);
+static ftdm_io_interface_t ftdm_libpri_interface;
+
+static const char *ftdm_libpri_usage =
+ "Usage:\n"
+ "libpri kill \n"
+ "libpri debug [all|none|flag,...flagN]\n"
+ "\n"
+ "Possible debug flags:\n"
+ "\tq921_raw - Q.921 Raw messages\n"
+ "\tq921_dump - Q.921 Decoded messages\n"
+ "\tq921_state - Q.921 State machine changes\n"
+ "\tq921_all - Enable all Q.921 debug options\n"
+ "\n"
+ "\tq931_dump - Q.931 Messages\n"
+ "\tq931_state - Q.931 State machine changes\n"
+ "\tq931_anomaly - Q.931 Anomalies\n"
+ "\tq931_all - Enable all Q.931 debug options\n"
+ "\n"
+ "\tapdu - Application protocol data unit\n"
+ "\taoc - Advice of Charge messages\n"
+ "\tconfig - Configuration\n"
+ "\n"
+ "\tnone - Disable debugging\n"
+ "\tall - Enable all debug options\n";
/**
* \brief API function to kill or debug a libpri span
@@ -244,13 +268,20 @@ static ftdm_status_t ftdm_libpri_start(ftdm_span_t *span);
static FIO_API_FUNCTION(ftdm_libpri_api)
{
char *mycmd = NULL, *argv[10] = { 0 };
- int argc = 0;
-
+ int argc = 0;
+
if (data) {
mycmd = ftdm_strdup(data);
argc = ftdm_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
}
+ if (argc == 1) {
+ if (!strcasecmp(argv[0], "help") || !strcasecmp(argv[0], "usage")) {
+ stream->write_function(stream, ftdm_libpri_usage);
+ goto done;
+ }
+ }
+
if (argc == 2) {
if (!strcasecmp(argv[0], "kill")) {
int span_id = atoi(argv[1]);
@@ -264,7 +295,7 @@ static FIO_API_FUNCTION(ftdm_libpri_api)
goto done;
}
- ftdm_clear_flag((&isdn_data->spri), LPWRAP_PRI_READY);
+ ftdm_clear_flag(&(isdn_data->spri), LPWRAP_PRI_READY);
stream->write_function(stream, "%s: +OK killed.\n", __FILE__);
goto done;
} else {
@@ -274,19 +305,33 @@ static FIO_API_FUNCTION(ftdm_libpri_api)
}
}
- if (argc > 2) {
+ if (argc >= 2) {
if (!strcasecmp(argv[0], "debug")) {
ftdm_span_t *span = NULL;
if (ftdm_span_find_by_name(argv[1], &span) == FTDM_SUCCESS) {
ftdm_libpri_data_t *isdn_data = span->signal_data;
+ uint32_t flags = 0;
+
if (span->start != ftdm_libpri_start) {
stream->write_function(stream, "%s: -ERR invalid span.\n", __FILE__);
goto done;
}
- pri_set_debug(isdn_data->spri.pri, parse_debug(argv[2]));
- stream->write_function(stream, "%s: +OK debug set.\n", __FILE__);
+ if (argc == 2) {
+ char tmp[100] = { 0 };
+ print_debug(pri_get_debug(isdn_data->spri.pri), tmp, sizeof(tmp));
+ stream->write_function(stream, "%s: +OK current debug flags: '%s'\n", __FILE__, tmp);
+ goto done;
+ }
+
+ if (parse_debug(argv[2], &flags) == -1) {
+ stream->write_function(stream, "%s: -ERR invalid debug flags given\n", __FILE__);
+ goto done;
+ }
+
+ pri_set_debug(isdn_data->spri.pri, flags);
+ stream->write_function(stream, "%s: +OK debug %s.\n", __FILE__, (flags) ? "enabled" : "disabled");
goto done;
} else {
stream->write_function(stream, "%s: -ERR invalid span.\n", __FILE__);
@@ -295,16 +340,15 @@ static FIO_API_FUNCTION(ftdm_libpri_api)
}
}
-
stream->write_function(stream, "%s: -ERR invalid command.\n", __FILE__);
-
- done:
+done:
ftdm_safe_free(mycmd);
return FTDM_SUCCESS;
}
+
/**
* \brief Loads libpri IO module
* \param fio FreeTDM IO interface
@@ -313,10 +357,10 @@ static FIO_API_FUNCTION(ftdm_libpri_api)
static FIO_IO_LOAD_FUNCTION(ftdm_libpri_io_init)
{
assert(fio != NULL);
- memset(&ftdm_libpri_interface, 0, sizeof(ftdm_libpri_interface));
+ memset(&ftdm_libpri_interface, 0, sizeof(ftdm_libpri_interface));
ftdm_libpri_interface.name = "libpri";
- ftdm_libpri_interface.api = ftdm_libpri_api;
+ ftdm_libpri_interface.api = &ftdm_libpri_api;
*fio = &ftdm_libpri_interface;
@@ -445,8 +489,6 @@ static ftdm_state_map_t isdn_state_map = {
{FTDM_CHANNEL_STATE_UP, FTDM_END},
{FTDM_CHANNEL_STATE_HANGUP, FTDM_CHANNEL_STATE_TERMINATING, FTDM_END},
},
-
-
}
};
@@ -454,177 +496,199 @@ static ftdm_state_map_t isdn_state_map = {
* \brief Handler for channel state change
* \param ftdmchan Channel to handle
*/
-static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
+static __inline__ void state_advance(ftdm_channel_t *chan)
{
- //Q931mes_Generic *gen = (Q931mes_Generic *) ftdmchan->caller_data.raw_data;
- ftdm_libpri_data_t *isdn_data = ftdmchan->span->signal_data;
+ ftdm_libpri_data_t *isdn_data = chan->span->signal_data;
+ q931_call *call = (q931_call *)chan->call_data;
ftdm_status_t status;
ftdm_sigmsg_t sig;
- q931_call *call = (q931_call *) ftdmchan->call_data;
-
-
- ftdm_log(FTDM_LOG_DEBUG, "%d:%d STATE [%s]\n",
- ftdmchan->span_id, ftdmchan->chan_id, ftdm_channel_state2str(ftdmchan->state));
+ ftdm_log(FTDM_LOG_DEBUG, "%d:%d STATE [%s]\n",
+ ftdm_channel_get_span_id(chan), ftdm_channel_get_id(chan), ftdm_channel_get_state_str(chan));
#if 0
- if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND) && !call) {
+ if (!ftdm_test_flag(chan, FTDM_CHANNEL_OUTBOUND) && !call) {
ftdm_log(FTDM_LOG_WARNING, "NO CALL!!!!\n");
}
#endif
-
memset(&sig, 0, sizeof(sig));
- sig.chan_id = ftdmchan->chan_id;
- sig.span_id = ftdmchan->span_id;
- sig.channel = ftdmchan;
+ sig.chan_id = ftdm_channel_get_id(chan);
+ sig.span_id = ftdm_channel_get_span_id(chan);
+ sig.channel = chan;
-
- switch (ftdmchan->state) {
+ switch (ftdm_channel_get_state(chan)) {
case FTDM_CHANNEL_STATE_DOWN:
{
- ftdmchan->call_data = NULL;
- ftdm_channel_done(ftdmchan);
+ chan->call_data = NULL;
+ ftdm_channel_done(chan);
}
break;
+
case FTDM_CHANNEL_STATE_PROGRESS:
{
- if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
+ if (ftdm_test_flag(chan, FTDM_CHANNEL_OUTBOUND)) {
sig.event_id = FTDM_SIGEVENT_PROGRESS;
- if ((status = ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS)) {
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
+ if ((status = ftdm_span_send_signal(ftdm_channel_get_span(chan), &sig) != FTDM_SUCCESS)) {
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_HANGUP);
}
} else if (call) {
- pri_progress(isdn_data->spri.pri, call, ftdmchan->chan_id, 1);
+ pri_progress(isdn_data->spri.pri, call, ftdm_channel_get_id(chan), 1);
} else {
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_RESTART);
}
}
break;
+
case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
{
- if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
+ if (ftdm_test_flag(chan, FTDM_CHANNEL_OUTBOUND)) {
sig.event_id = FTDM_SIGEVENT_PROGRESS_MEDIA;
- if ((status = ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS)) {
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
+ if ((status = ftdm_span_send_signal(ftdm_channel_get_span(chan), &sig) != FTDM_SUCCESS)) {
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_HANGUP);
}
} else if (call) {
- pri_proceeding(isdn_data->spri.pri, call, ftdmchan->chan_id, 1);
+ pri_proceeding(isdn_data->spri.pri, call, ftdm_channel_get_id(chan), 1);
} else {
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_RESTART);
}
}
break;
+
case FTDM_CHANNEL_STATE_RING:
{
- if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
+ if (!ftdm_test_flag(chan, FTDM_CHANNEL_OUTBOUND)) {
if (call) {
- pri_acknowledge(isdn_data->spri.pri, call, ftdmchan->chan_id, 0);
+ pri_acknowledge(isdn_data->spri.pri, call, ftdm_channel_get_id(chan), 0);
sig.event_id = FTDM_SIGEVENT_START;
- if ((status = ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS)) {
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
+ if ((status = ftdm_span_send_signal(ftdm_channel_get_span(chan), &sig) != FTDM_SUCCESS)) {
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_HANGUP);
}
} else {
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_RESTART);
}
}
}
break;
+
case FTDM_CHANNEL_STATE_RESTART:
{
- ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_NORMAL_UNSPECIFIED;
+ chan->caller_data.hangup_cause = FTDM_CAUSE_NORMAL_UNSPECIFIED;
sig.event_id = FTDM_SIGEVENT_RESTART;
- status = ftdm_span_send_signal(ftdmchan->span, &sig);
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
+ status = ftdm_span_send_signal(ftdm_channel_get_span(chan), &sig);
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_DOWN);
}
break;
+
case FTDM_CHANNEL_STATE_UP:
{
- if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
+ if (ftdm_test_flag(chan, FTDM_CHANNEL_OUTBOUND)) {
sig.event_id = FTDM_SIGEVENT_UP;
- if ((status = ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS)) {
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
+ if ((status = ftdm_span_send_signal(ftdm_channel_get_span(chan), &sig) != FTDM_SUCCESS)) {
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_HANGUP);
}
} else if (call) {
pri_answer(isdn_data->spri.pri, call, 0, 1);
} else {
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_RESTART);
}
}
break;
+
case FTDM_CHANNEL_STATE_DIALING:
if (isdn_data) {
+ ftdm_caller_data_t *caller_data = ftdm_channel_get_caller_data(chan);
struct pri_sr *sr;
- int dp;
+ int ton;
if (!(call = pri_new_call(isdn_data->spri.pri))) {
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
+ ftdm_log(FTDM_LOG_ERROR, "Failed to create new call on channel %d:%d\n",
+ ftdm_channel_get_span_id(chan), ftdm_channel_get_id(chan));
+ /* TODO: set hangup cause? */
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_RESTART);
return;
}
-
- dp = ftdmchan->caller_data.dnis.type;
- switch(dp) {
+ ton = caller_data->dnis.type;
+ switch (ton) {
case FTDM_TON_NATIONAL:
- dp = PRI_NATIONAL_ISDN;
+ ton = PRI_NATIONAL_ISDN;
break;
case FTDM_TON_INTERNATIONAL:
- dp = PRI_INTERNATIONAL_ISDN;
+ ton = PRI_INTERNATIONAL_ISDN;
break;
case FTDM_TON_SUBSCRIBER_NUMBER:
- dp = PRI_LOCAL_ISDN;
+ ton = PRI_LOCAL_ISDN;
break;
default:
- dp = isdn_data->dp;
+ ton = isdn_data->ton;
}
- ftdmchan->call_data = call;
+ chan->call_data = call;
+
sr = pri_sr_new();
+ if (!sr) {
+ ftdm_log(FTDM_LOG_ERROR, "Failed to create new setup request on channel %d:%d\n",
+ ftdm_channel_get_span_id(chan), ftdm_channel_get_id(chan));
+ /* TODO: handle error properly */
+ }
assert(sr);
- pri_sr_set_channel(sr, ftdmchan->chan_id, 0, 0);
- pri_sr_set_bearer(sr, 0, isdn_data->l1);
- pri_sr_set_called(sr, ftdmchan->caller_data.dnis.digits, dp, 1);
- pri_sr_set_caller(sr, ftdmchan->caller_data.cid_num.digits, (isdn_data->opts & FTMOD_LIBPRI_OPT_OMIT_DISPLAY_IE ? NULL : ftdmchan->caller_data.cid_name),
- dp, (ftdmchan->caller_data.pres != 1 ? PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN : PRES_PROHIB_USER_NUMBER_NOT_SCREENED));
+
+ pri_sr_set_channel(sr, ftdm_channel_get_id(chan), 0, 0);
+ pri_sr_set_bearer(sr, PRI_TRANS_CAP_SPEECH, isdn_data->layer1);
+
+ pri_sr_set_called(sr, caller_data->dnis.digits, ton, 1);
+ pri_sr_set_caller(sr, caller_data->cid_num.digits,
+ ((isdn_data->opts & FTMOD_LIBPRI_OPT_OMIT_DISPLAY_IE) ? NULL : caller_data->cid_name),
+ ton,
+ ((caller_data->pres != 1) ? PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN : PRES_PROHIB_USER_NUMBER_NOT_SCREENED));
if (!(isdn_data->opts & FTMOD_LIBPRI_OPT_OMIT_REDIRECTING_NUMBER_IE)) {
- pri_sr_set_redirecting(sr, ftdmchan->caller_data.cid_num.digits, dp, PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN, PRI_REDIR_UNCONDITIONAL);
+ pri_sr_set_redirecting(sr, caller_data->cid_num.digits, ton,
+ PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN, PRI_REDIR_UNCONDITIONAL);
}
-
+#ifdef HAVE_LIBPRI_AOC
+ if (isdn_data->opts & FTMOD_LIBPRI_OPT_FACILITY_AOC) {
+ /* request AOC on call */
+ pri_sr_set_aoc_charging_request(sr, (PRI_AOC_REQUEST_S | PRI_AOC_REQUEST_E | PRI_AOC_REQUEST_D));
+ ftdm_log(FTDM_LOG_DEBUG, "Requesting AOC-S/D/E on call\n");
+ }
+#endif
if (pri_setup(isdn_data->spri.pri, call, sr)) {
- ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_DESTINATION_OUT_OF_ORDER;
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
+ caller_data->hangup_cause = FTDM_CAUSE_DESTINATION_OUT_OF_ORDER;
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_HANGUP);
}
pri_sr_free(sr);
}
-
break;
+
case FTDM_CHANNEL_STATE_HANGUP:
{
if (call) {
- pri_hangup(isdn_data->spri.pri, call, ftdmchan->caller_data.hangup_cause);
+ ftdm_caller_data_t *caller_data = ftdm_channel_get_caller_data(chan);
+
+ pri_hangup(isdn_data->spri.pri, call, caller_data->hangup_cause);
pri_destroycall(isdn_data->spri.pri, call);
- ftdmchan->call_data = NULL;
- }
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
+
+ chan->call_data = NULL;
+ }
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_DOWN);
}
break;
+
case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
break;
+
case FTDM_CHANNEL_STATE_TERMINATING:
{
sig.event_id = FTDM_SIGEVENT_STOP;
- status = ftdm_span_send_signal(ftdmchan->span, &sig);
+ status = ftdm_span_send_signal(ftdm_channel_get_span(chan), &sig);
/* user moves us to HANGUP and from there we go to DOWN */
}
default:
break;
}
-
-
-
- return;
}
/**
@@ -633,21 +697,25 @@ static __inline__ void state_advance(ftdm_channel_t *ftdmchan)
*/
static __inline__ void check_state(ftdm_span_t *span)
{
- if (ftdm_test_flag(span, FTDM_SPAN_STATE_CHANGE)) {
- uint32_t j;
- ftdm_clear_flag_locked(span, FTDM_SPAN_STATE_CHANGE);
- for(j = 1; j <= span->chan_count; j++) {
- if (ftdm_test_flag((span->channels[j]), FTDM_CHANNEL_STATE_CHANGE)) {
- ftdm_mutex_lock(span->channels[j]->mutex);
- ftdm_channel_lock(span->channels[j]);
- ftdm_clear_flag((span->channels[j]), FTDM_CHANNEL_STATE_CHANGE);
- state_advance(span->channels[j]);
- ftdm_channel_complete_state(span->channels[j]);
- ftdm_mutex_unlock(span->channels[j]->mutex);
- ftdm_channel_unlock(span->channels[j]);
- }
- }
- }
+ if (ftdm_test_flag(span, FTDM_SPAN_STATE_CHANGE)) {
+ uint32_t j;
+
+ ftdm_clear_flag_locked(span, FTDM_SPAN_STATE_CHANGE);
+
+ for (j = 1; j <= ftdm_span_get_chan_count(span); j++) {
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, j);
+
+ if (ftdm_test_flag(chan, FTDM_CHANNEL_STATE_CHANGE)) {
+ ftdm_channel_lock(chan);
+
+ ftdm_clear_flag(chan, FTDM_CHANNEL_STATE_CHANGE);
+ state_advance(chan);
+ ftdm_channel_complete_state(chan);
+
+ ftdm_channel_unlock(chan);
+ }
+ }
+ }
}
/**
@@ -659,8 +727,8 @@ static __inline__ void check_state(ftdm_span_t *span)
*/
static int on_info(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
{
-
ftdm_log(FTDM_LOG_DEBUG, "number is: %s\n", pevent->ring.callednum);
+
if (strlen(pevent->ring.callednum) > 3) {
ftdm_log(FTDM_LOG_DEBUG, "final number is: %s\n", pevent->ring.callednum);
pri_answer(spri->pri, pevent->ring.call, 0, 1);
@@ -677,40 +745,40 @@ static int on_info(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event
*/
static int on_hangup(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
{
- ftdm_span_t *span = spri->private_info;
- ftdm_channel_t *ftdmchan = NULL;
+ ftdm_span_t *span = spri->span;
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, pevent->hangup.channel);
q931_call *call = NULL;
- ftdmchan = span->channels[pevent->hangup.channel];
-
- if (!ftdmchan) {
- ftdm_log(FTDM_LOG_CRIT, "-- Hangup on channel %d:%d %s but it's not in use?\n", spri->span->span_id, pevent->hangup.channel);
+
+ if (!chan) {
+ ftdm_log(FTDM_LOG_CRIT, "-- Hangup on channel %d:%d %s but it's not in use?\n", ftdm_span_get_id(spri->span), pevent->hangup.channel);
return 0;
}
- ftdm_channel_lock(ftdmchan);
+ ftdm_channel_lock(chan);
- if (ftdmchan->state >= FTDM_CHANNEL_STATE_TERMINATING) {
- ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Ignoring remote hangup in state %s\n", ftdm_channel_state2str(ftdmchan->state));
+ if (ftdm_channel_get_state(chan) >= FTDM_CHANNEL_STATE_TERMINATING) {
+ ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Ignoring remote hangup in state %s\n", ftdm_channel_get_state_str(chan));
goto done;
}
- if (!ftdmchan->call_data) {
- ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Ignoring remote hangup in state %s with no call data\n", ftdm_channel_state2str(ftdmchan->state));
+ if (!chan->call_data) {
+ ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Ignoring remote hangup in state %s with no call data\n", ftdm_channel_get_state_str(chan));
goto done;
}
-
- call = (q931_call *) ftdmchan->call_data;
- ftdm_log(FTDM_LOG_DEBUG, "-- Hangup on channel %d:%d\n", spri->span->span_id, pevent->hangup.channel);
- ftdmchan->caller_data.hangup_cause = pevent->hangup.cause;
+
+ call = (q931_call *)chan->call_data;
+
+ ftdm_log(FTDM_LOG_DEBUG, "-- Hangup on channel %d:%d\n", ftdm_span_get_id(spri->span), pevent->hangup.channel);
+
pri_release(spri->pri, call, 0);
pri_destroycall(spri->pri, call);
- ftdmchan->call_data = NULL;
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
+
+ chan->caller_data.hangup_cause = pevent->hangup.cause;
+ chan->call_data = NULL;
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_TERMINATING);
done:
-
- ftdm_channel_unlock(ftdmchan);
-
+ ftdm_channel_unlock(chan);
return 0;
}
@@ -723,19 +791,16 @@ done:
*/
static int on_answer(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
{
- ftdm_span_t *span = spri->private_info;
- ftdm_channel_t *ftdmchan = NULL;
+ ftdm_span_t *span = spri->span;
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, pevent->answer.channel);
- ftdmchan = span->channels[pevent->answer.channel];
-
- if (ftdmchan) {
- ftdm_log(FTDM_LOG_DEBUG, "-- Answer on channel %d:%d\n", spri->span->span_id, pevent->answer.channel);
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_UP);
+ if (chan) {
+ ftdm_log(FTDM_LOG_DEBUG, "-- Answer on channel %d:%d\n", ftdm_span_get_id(span), pevent->answer.channel);
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_UP);
} else {
- ftdm_log(FTDM_LOG_DEBUG, "-- Answer on channel %d:%d %s but it's not in use?\n", spri->span->span_id, pevent->answer.channel, ftdmchan->chan_id);
-
+ ftdm_log(FTDM_LOG_DEBUG, "-- Answer on channel %d:%d but it's not in the span?\n",
+ ftdm_span_get_id(span), pevent->answer.channel);
}
-
return 0;
}
@@ -748,19 +813,16 @@ static int on_answer(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_even
*/
static int on_proceed(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
{
- ftdm_span_t *span = spri->private_info;
- ftdm_channel_t *ftdmchan = NULL;
-
- ftdmchan = span->channels[pevent->proceeding.channel];
-
- if (ftdmchan) {
- ftdm_log(FTDM_LOG_DEBUG, "-- Proceeding on channel %d:%d\n", spri->span->span_id, pevent->proceeding.channel);
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
- } else {
- ftdm_log(FTDM_LOG_DEBUG, "-- Proceeding on channel %d:%d %s but it's not in use?\n", spri->span->span_id,
- pevent->proceeding.channel, ftdmchan->chan_id);
- }
+ ftdm_span_t *span = spri->span;
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, pevent->answer.channel);
+ if (chan) {
+ ftdm_log(FTDM_LOG_DEBUG, "-- Proceeding on channel %d:%d\n", ftdm_span_get_id(span), pevent->proceeding.channel);
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
+ } else {
+ ftdm_log(FTDM_LOG_DEBUG, "-- Proceeding on channel %d:%d but it's not in the span?\n",
+ ftdm_span_get_id(span), pevent->proceeding.channel);
+ }
return 0;
}
@@ -773,22 +835,20 @@ static int on_proceed(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_eve
*/
static int on_ringing(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
{
- ftdm_span_t *span = spri->private_info;
- ftdm_channel_t *ftdmchan = NULL;
+ ftdm_span_t *span = spri->span;
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, pevent->ringing.channel);
- ftdmchan = span->channels[pevent->ringing.channel];
-
- if (ftdmchan) {
- ftdm_log(FTDM_LOG_DEBUG, "-- Ringing on channel %d:%d\n", spri->span->span_id, pevent->ringing.channel);
+ if (chan) {
+ ftdm_log(FTDM_LOG_DEBUG, "-- Ringing on channel %d:%d\n", ftdm_span_get_id(span), pevent->ringing.channel);
/* we may get on_ringing even when we're already in FTDM_CHANNEL_STATE_PROGRESS_MEDIA */
- if (ftdmchan->state == FTDM_CHANNEL_STATE_PROGRESS_MEDIA) {
+ if (ftdm_channel_get_state(chan) == FTDM_CHANNEL_STATE_PROGRESS_MEDIA) {
/* dont try to move to STATE_PROGRESS to avoid annoying veto warning */
return 0;
}
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_PROGRESS);
} else {
- ftdm_log(FTDM_LOG_DEBUG, "-- Ringing on channel %d:%d %s but it's not in use?\n", spri->span->span_id,
- pevent->ringing.channel, ftdmchan->chan_id);
+ ftdm_log(FTDM_LOG_DEBUG, "-- Ringing on channel %d:%d but it's not in the span?\n",
+ ftdm_span_get_id(span), pevent->ringing.channel);
}
return 0;
@@ -803,52 +863,50 @@ static int on_ringing(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_eve
*/
static int on_ring(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
{
- ftdm_span_t *span = spri->private_info;
- ftdm_channel_t *ftdmchan = NULL;
+ ftdm_span_t *span = spri->span;
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, pevent->ring.channel);
+ ftdm_caller_data_t *caller_data = NULL;
int ret = 0;
- //switch_mutex_lock(globals.channel_mutex);
-
- ftdmchan = span->channels[pevent->ring.channel];
- if (!ftdmchan || ftdmchan->state != FTDM_CHANNEL_STATE_DOWN || ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE)) {
- ftdm_log(FTDM_LOG_WARNING, "--Duplicate Ring on channel %d:%d (ignored)\n", spri->span->span_id, pevent->ring.channel);
- ret = 0;
+ if (!chan || ftdm_channel_get_state(chan) != FTDM_CHANNEL_STATE_DOWN || ftdm_test_flag(chan, FTDM_CHANNEL_INUSE)) {
+ ftdm_log(FTDM_LOG_WARNING, "--Duplicate Ring on channel %d:%d (ignored)\n", ftdm_span_get_id(span), pevent->ring.channel);
goto done;
}
- if (ftdm_channel_open_chan(ftdmchan) != FTDM_SUCCESS) {
- ftdm_log(FTDM_LOG_WARNING, "--Failure opening channel %d:%d (ignored)\n", spri->span->span_id, pevent->ring.channel);
- ret = 0;
+ if (ftdm_channel_open_chan(chan) != FTDM_SUCCESS) {
+ ftdm_log(FTDM_LOG_WARNING, "--Failure opening channel %d:%d (ignored)\n", ftdm_span_get_id(span), pevent->ring.channel);
goto done;
}
-
- ftdm_log(FTDM_LOG_NOTICE, "-- Ring on channel %d:%d (from %s to %s)\n", spri->span->span_id, pevent->ring.channel,
+ ftdm_log(FTDM_LOG_NOTICE, "-- Ring on channel %d:%d (from %s to %s)\n", ftdm_span_get_id(span), pevent->ring.channel,
pevent->ring.callingnum, pevent->ring.callednum);
-
- memset(&ftdmchan->caller_data, 0, sizeof(ftdmchan->caller_data));
-
- ftdm_set_string(ftdmchan->caller_data.cid_num.digits, (char *)pevent->ring.callingnum);
- if (!ftdm_strlen_zero((char *)pevent->ring.callingname)) {
- ftdm_set_string(ftdmchan->caller_data.cid_name, (char *)pevent->ring.callingname);
- } else {
- ftdm_set_string(ftdmchan->caller_data.cid_name, (char *)pevent->ring.callingnum);
- }
- ftdm_set_string(ftdmchan->caller_data.ani.digits, (char *)pevent->ring.callingani);
- ftdm_set_string(ftdmchan->caller_data.dnis.digits, (char *)pevent->ring.callednum);
-
- if (pevent->ring.ani2 >= 0) {
- snprintf(ftdmchan->caller_data.aniII, 5, "%.2d", pevent->ring.ani2);
- }
-
- // scary to trust this pointer, you'd think they would give you a copy of the call data so you own it......
- ftdmchan->call_data = pevent->ring.call;
-
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RING);
-
- done:
- //switch_mutex_unlock(globals.channel_mutex);
+ caller_data = ftdm_channel_get_caller_data(chan);
+
+ memset(caller_data, 0, sizeof(*caller_data));
+
+ ftdm_set_string(caller_data->cid_num.digits, (char *)pevent->ring.callingnum);
+ ftdm_set_string(caller_data->ani.digits, (char *)pevent->ring.callingani);
+ ftdm_set_string(caller_data->dnis.digits, (char *)pevent->ring.callednum);
+ ftdm_set_string(caller_data->rdnis.digits, (char *)pevent->ring.redirectingnum);
+
+ if (!ftdm_strlen_zero((char *)pevent->ring.callingname)) {
+ ftdm_set_string(caller_data->cid_name, (char *)pevent->ring.callingname);
+ } else {
+ ftdm_set_string(caller_data->cid_name, (char *)pevent->ring.callingnum);
+ }
+
+ if (pevent->ring.ani2 >= 0) {
+ snprintf(caller_data->aniII, 5, "%.2d", pevent->ring.ani2);
+ }
+
+ // scary to trust this pointer, you'd think they would give you a copy of the call data so you own it......
+ /* hurr, this valid as along as nobody releases the call */
+ chan->call_data = pevent->ring.call;
+
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_RING);
+
+done:
return ret;
}
@@ -861,41 +919,43 @@ static int on_ring(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event
static __inline__ ftdm_status_t process_event(ftdm_span_t *span, ftdm_event_t *event)
{
ftdm_alarm_flag_t alarmbits;
- ftdm_log(FTDM_LOG_DEBUG, "EVENT [%s][%d][%d:%d] STATE [%s]\n",
- ftdm_oob_event2str(event->enum_id), event->enum_id, event->channel->span_id, event->channel->chan_id, ftdm_channel_state2str(event->channel->state));
- switch(event->enum_id) {
+ ftdm_log(FTDM_LOG_DEBUG, "EVENT [%s][%d][%d:%d] STATE [%s]\n",
+ ftdm_oob_event2str(event->enum_id),
+ event->enum_id,
+ ftdm_channel_get_span_id(event->channel),
+ ftdm_channel_get_id(event->channel),
+ ftdm_channel_get_state_str(event->channel));
+
+ switch (event->enum_id) {
case FTDM_OOB_ALARM_TRAP:
{
- if (event->channel->state != FTDM_CHANNEL_STATE_DOWN) {
- if (event->channel->type == FTDM_CHAN_TYPE_B) {
+ if (ftdm_channel_get_state(event->channel) != FTDM_CHANNEL_STATE_DOWN) {
+ if (ftdm_channel_get_type(event->channel) == FTDM_CHAN_TYPE_B) {
ftdm_set_state_locked(event->channel, FTDM_CHANNEL_STATE_RESTART);
}
}
-
ftdm_set_flag(event->channel, FTDM_CHANNEL_SUSPENDED);
-
ftdm_channel_get_alarms(event->channel, &alarmbits);
- ftdm_log(FTDM_LOG_WARNING, "channel %d:%d (%d:%d) has alarms! [%s]\n",
- event->channel->span_id, event->channel->chan_id,
- event->channel->physical_span_id, event->channel->physical_chan_id,
- event->channel->last_error);
+ ftdm_log(FTDM_LOG_WARNING, "channel %d:%d (%d:%d) has alarms! [%s]\n",
+ ftdm_channel_get_span_id(event->channel), ftdm_channel_get_id(event->channel),
+ ftdm_channel_get_ph_span_id(event->channel), ftdm_channel_get_ph_id(event->channel),
+ ftdm_channel_get_last_error(event->channel));
}
break;
case FTDM_OOB_ALARM_CLEAR:
{
-
- ftdm_log(FTDM_LOG_WARNING, "channel %d:%d (%d:%d) alarms Cleared!\n", event->channel->span_id, event->channel->chan_id,
- event->channel->physical_span_id, event->channel->physical_chan_id);
+ ftdm_log(FTDM_LOG_WARNING, "channel %d:%d (%d:%d) alarms Cleared!\n",
+ ftdm_channel_get_span_id(event->channel), ftdm_channel_get_id(event->channel),
+ ftdm_channel_get_ph_span_id(event->channel), ftdm_channel_get_ph_id(event->channel));
ftdm_clear_flag(event->channel, FTDM_CHANNEL_SUSPENDED);
ftdm_channel_get_alarms(event->channel, &alarmbits);
}
break;
}
-
return FTDM_SUCCESS;
}
@@ -909,10 +969,11 @@ static __inline__ void check_events(ftdm_span_t *span)
status = ftdm_span_poll_event(span, 5, NULL);
- switch(status) {
+ switch (status) {
case FTDM_SUCCESS:
{
ftdm_event_t *event;
+
while (ftdm_span_next_event(span, &event) == FTDM_SUCCESS) {
if (event->enum_id == FTDM_OOB_NOOP) {
continue;
@@ -923,12 +984,12 @@ static __inline__ void check_events(ftdm_span_t *span)
}
}
break;
+
case FTDM_FAIL:
- {
- ftdm_log(FTDM_LOG_DEBUG, "Event Failure! %d\n", ftdm_running());
- ftdm_sleep(2000);
- }
+ ftdm_log(FTDM_LOG_DEBUG, "Event Failure! %d\n", ftdm_running());
+ ftdm_sleep(2000);
break;
+
default:
break;
}
@@ -941,7 +1002,7 @@ static __inline__ void check_events(ftdm_span_t *span)
*/
static int check_flags(lpwrap_pri_t *spri)
{
- ftdm_span_t *span = spri->private_info;
+ ftdm_span_t *span = spri->span;
if (!ftdm_running() || ftdm_test_flag(span, FTDM_SPAN_STOP_THREAD)) {
return -1;
@@ -949,8 +1010,6 @@ static int check_flags(lpwrap_pri_t *spri)
check_state(span);
check_events(span);
-
-
return 0;
}
@@ -963,27 +1022,200 @@ static int check_flags(lpwrap_pri_t *spri)
*/
static int on_restart(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
{
- ftdm_span_t *span = spri->private_info;
- ftdm_channel_t *ftdmchan;
+ ftdm_span_t *span = spri->span;
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, pevent->restart.channel);
- ftdm_log(FTDM_LOG_NOTICE, "-- Restarting %d:%d\n", spri->span->span_id, pevent->restart.channel);
-
- spri->dchan->state = FTDM_CHANNEL_STATE_UP;
- ftdmchan = span->channels[pevent->restart.channel];
+ ftdm_log(FTDM_LOG_NOTICE, "-- Restarting %d:%d\n", ftdm_span_get_id(span), pevent->restart.channel);
+ _ftdm_channel_set_state_force(spri->dchan, FTDM_CHANNEL_STATE_UP);
- if (!ftdmchan) {
+ if (!chan) {
return 0;
}
if (pevent->restart.channel < 1) {
- ftdm_set_state_all(ftdmchan->span, FTDM_CHANNEL_STATE_RESTART);
+ ftdm_set_state_all(span, FTDM_CHANNEL_STATE_RESTART);
} else {
- ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
+ ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_RESTART);
}
-
return 0;
}
+/*
+ * FACILITY Advice-On-Charge handler
+ */
+#ifdef HAVE_LIBPRI_AOC
+static const char *aoc_billing_id(const int id)
+{
+ switch (id) {
+ case PRI_AOC_E_BILLING_ID_NOT_AVAILABLE:
+ return "not available";
+ case PRI_AOC_E_BILLING_ID_NORMAL:
+ return "normal";
+ case PRI_AOC_E_BILLING_ID_REVERSE:
+ return "reverse";
+ case PRI_AOC_E_BILLING_ID_CREDIT_CARD:
+ return "credit card";
+ case PRI_AOC_E_BILLING_ID_CALL_FORWARDING_UNCONDITIONAL:
+ return "call forwarding unconditional";
+ case PRI_AOC_E_BILLING_ID_CALL_FORWARDING_BUSY:
+ return "call forwarding busy";
+ case PRI_AOC_E_BILLING_ID_CALL_FORWARDING_NO_REPLY:
+ return "call forwarding no reply";
+ case PRI_AOC_E_BILLING_ID_CALL_DEFLECTION:
+ return "call deflection";
+ case PRI_AOC_E_BILLING_ID_CALL_TRANSFER:
+ return "call transfer";
+ default:
+ return "unknown\n";
+ }
+}
+
+static float aoc_money_amount(const struct pri_aoc_amount *amount)
+{
+ switch (amount->multiplier) {
+ case PRI_AOC_MULTIPLIER_THOUSANDTH:
+ return amount->cost * 0.001f;
+ case PRI_AOC_MULTIPLIER_HUNDREDTH:
+ return amount->cost * 0.01f;
+ case PRI_AOC_MULTIPLIER_TENTH:
+ return amount->cost * 0.1f;
+ case PRI_AOC_MULTIPLIER_TEN:
+ return amount->cost * 10.0f;
+ case PRI_AOC_MULTIPLIER_HUNDRED:
+ return amount->cost * 100.0f;
+ case PRI_AOC_MULTIPLIER_THOUSAND:
+ return amount->cost * 1000.0f;
+ default:
+ return amount->cost;
+ }
+}
+
+static int handle_facility_aoc_s(const struct pri_subcmd_aoc_s *aoc_s)
+{
+ /* Left as an excercise to the reader */
+ return 0;
+}
+
+static int handle_facility_aoc_d(const struct pri_subcmd_aoc_d *aoc_d)
+{
+ /* Left as an excercise to the reader */
+ return 0;
+}
+
+static int handle_facility_aoc_e(const struct pri_subcmd_aoc_e *aoc_e)
+{
+ char tmp[1024] = { 0 };
+ int x = 0, offset = 0;
+
+ switch (aoc_e->charge) {
+ case PRI_AOC_DE_CHARGE_FREE:
+ strcat(tmp, "\tcharge-type: none\n");
+ offset = strlen(tmp);
+ break;
+
+ case PRI_AOC_DE_CHARGE_CURRENCY:
+ sprintf(tmp, "\tcharge-type: money\n\tcharge-amount: %.2f\n\tcharge-currency: %s\n",
+ aoc_money_amount(&aoc_e->recorded.money.amount),
+ aoc_e->recorded.money.currency);
+ offset = strlen(tmp);
+ break;
+
+ case PRI_AOC_DE_CHARGE_UNITS:
+ strcat(tmp, "\tcharge-type: units\n");
+ offset = strlen(tmp);
+
+ for (x = 0; x < aoc_e->recorded.unit.num_items; x++) {
+ sprintf(&tmp[offset], "\tcharge-amount: %ld (type: %d)\n",
+ aoc_e->recorded.unit.item[x].number,
+ aoc_e->recorded.unit.item[x].type);
+ offset += strlen(&tmp[offset]);
+ }
+ break;
+
+ default:
+ strcat(tmp, "\tcharge-type: not available\n");
+ offset = strlen(tmp);
+ }
+
+ sprintf(&tmp[offset], "\tbilling-id: %s\n", aoc_billing_id(aoc_e->billing_id));
+ offset += strlen(&tmp[offset]);
+
+ strcat(&tmp[offset], "\tassociation-type: ");
+ offset += strlen(&tmp[offset]);
+
+ switch (aoc_e->associated.charging_type) {
+ case PRI_AOC_E_CHARGING_ASSOCIATION_NOT_AVAILABLE:
+ strcat(&tmp[offset], "not available\n");
+ break;
+ case PRI_AOC_E_CHARGING_ASSOCIATION_NUMBER:
+ sprintf(&tmp[offset], "number\n\tassociation-number: %s\n", aoc_e->associated.charge.number.str);
+ break;
+ case PRI_AOC_E_CHARGING_ASSOCIATION_ID:
+ sprintf(&tmp[offset], "id\n\tassociation-id: %d\n", aoc_e->associated.charge.id);
+ break;
+ default:
+ strcat(&tmp[offset], "unknown\n");
+ }
+
+ ftdm_log(FTDM_LOG_INFO, "AOC-E:\n%s", tmp);
+ return 0;
+}
+
+/**
+ * \brief Handler for libpri facility events
+ * \param spri Pri wrapper structure (libpri, span, dchan)
+ * \param event_type Event type (unused)
+ * \param pevent Event
+ * \return 0
+ */
+static int on_facility(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
+{
+ struct pri_event_facility *pfac = &pevent->facility;
+ int i = 0;
+
+ if (!pevent)
+ return 0;
+
+ ftdm_log(FTDM_LOG_DEBUG, "Got a FACILITY event on span %d:%d\n", ftdm_span_get_id(spri->span), pfac->channel);
+
+ if (!pfac->subcmds || pfac->subcmds->counter_subcmd <= 0)
+ return 0;
+
+ for (i = 0; i < pfac->subcmds->counter_subcmd; i++) {
+ struct pri_subcommand *sub = &pfac->subcmds->subcmd[i];
+ int res = -1;
+
+ switch (sub->cmd) {
+ case PRI_SUBCMD_AOC_S: /* AOC-S: Start of call */
+ res = handle_facility_aoc_s(&sub->u.aoc_s);
+ break;
+ case PRI_SUBCMD_AOC_D: /* AOC-D: During call */
+ res = handle_facility_aoc_d(&sub->u.aoc_d);
+ break;
+ case PRI_SUBCMD_AOC_E: /* AOC-E: End of call */
+ res = handle_facility_aoc_e(&sub->u.aoc_e);
+ break;
+ case PRI_SUBCMD_AOC_CHARGING_REQ:
+ ftdm_log(FTDM_LOG_NOTICE, "AOC Charging Request received\n");
+ break;
+ case PRI_SUBCMD_AOC_CHARGING_REQ_RSP:
+ ftdm_log(FTDM_LOG_NOTICE, "AOC Charging Request Response received [aoc_s data: %s, req: %x, resp: %x]\n",
+ sub->u.aoc_request_response.valid_aoc_s ? "yes" : "no",
+ sub->u.aoc_request_response.charging_request,
+ sub->u.aoc_request_response.charging_response);
+ break;
+ default:
+ ftdm_log(FTDM_LOG_DEBUG, "FACILITY subcommand %d is not implemented, ignoring\n", sub->cmd);
+ }
+
+ ftdm_log(FTDM_LOG_DEBUG, "FACILITY subcommand %d handler returned %d\n", sub->cmd, res);
+ }
+
+ ftdm_log(FTDM_LOG_DEBUG, "Caught Event on span %d %u (%s)\n", ftdm_span_get_id(spri->span), event_type, lpwrap_pri_event_str(event_type));
+ return 0;
+}
+#endif
+
/**
* \brief Handler for libpri dchan up event
* \param spri Pri wrapper structure (libpri, span, dchan)
@@ -995,23 +1227,27 @@ static int on_dchan_up(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_ev
{
if (!ftdm_test_flag(spri, LPWRAP_PRI_READY)) {
ftdm_signaling_status_t status = FTDM_SIG_STATE_UP;
- ftdm_channel_t *ftdmchan = NULL;
+ ftdm_span_t *span = spri->span;
ftdm_sigmsg_t sig;
int i;
- ftdm_log(FTDM_LOG_INFO, "Span %d D-Chan UP!\n", spri->span->span_id);
- ftdm_set_flag(spri, LPWRAP_PRI_READY);
- ftdm_set_state_all(spri->span, FTDM_CHANNEL_STATE_RESTART);
- ftdm_log(FTDM_LOG_NOTICE, "%d:Signaling link status changed to %s\n", spri->span->span_id, ftdm_signaling_status2str(status));
- for(i=1; i <= spri->span->chan_count; i++) {
- ftdmchan = spri->span->channels[i];
+ ftdm_log(FTDM_LOG_INFO, "Span %d D-Channel UP!\n", ftdm_span_get_id(span));
+ ftdm_set_flag(spri, LPWRAP_PRI_READY);
+ ftdm_set_state_all(span, FTDM_CHANNEL_STATE_RESTART);
+
+ ftdm_log(FTDM_LOG_NOTICE, "%d:Signaling link status changed to %s\n", ftdm_span_get_id(span), ftdm_signaling_status2str(status));
+
+ for (i = 1; i <= ftdm_span_get_chan_count(span); i++) {
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, i);
+
memset(&sig, 0, sizeof(sig));
- sig.chan_id = ftdmchan->chan_id;
- sig.span_id = ftdmchan->span_id;
- sig.channel = ftdmchan;
+ sig.span_id = ftdm_channel_get_span_id(chan);
+ sig.chan_id = ftdm_channel_get_id(chan);
+ sig.channel = chan;
sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
sig.raw_data = &status;
- ftdm_span_send_signal(spri->span, &sig);
+
+ ftdm_span_send_signal(span, &sig);
}
}
return 0;
@@ -1025,27 +1261,30 @@ static int on_dchan_up(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_ev
* \return 0
*/
static int on_dchan_down(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
-{
+{
if (ftdm_test_flag(spri, LPWRAP_PRI_READY)) {
ftdm_signaling_status_t status = FTDM_SIG_STATE_DOWN;
- ftdm_channel_t *ftdmchan = NULL;
+ ftdm_span_t *span = spri->span;
ftdm_sigmsg_t sig;
int i;
- ftdm_log(FTDM_LOG_INFO, "Span %d D-Chan DOWN!\n", spri->span->span_id);
+
+ ftdm_log(FTDM_LOG_INFO, "Span %d D-Channel DOWN!\n", ftdm_span_get_id(span));
ftdm_clear_flag(spri, LPWRAP_PRI_READY);
- ftdm_set_state_all(spri->span, FTDM_CHANNEL_STATE_RESTART);
+ ftdm_set_state_all(span, FTDM_CHANNEL_STATE_RESTART);
+ ftdm_log(FTDM_LOG_NOTICE, "%d:Signaling link status changed to %s\n", ftdm_span_get_id(span), ftdm_signaling_status2str(status));
+
+ for (i = 1; i <= ftdm_span_get_chan_count(span); i++) {
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, i);
- ftdm_log(FTDM_LOG_NOTICE, "%d:Signaling link status changed to %s\n", spri->span->span_id, ftdm_signaling_status2str(status));
- for(i=1; i <= spri->span->chan_count; i++) {
- ftdmchan = spri->span->channels[i];
memset(&sig, 0, sizeof(sig));
- sig.chan_id = ftdmchan->chan_id;
- sig.span_id = ftdmchan->span_id;
- sig.channel = ftdmchan;
+ sig.span_id = ftdm_channel_get_span_id(chan);
+ sig.chan_id = ftdm_channel_get_id(chan);
+ sig.channel = chan;
sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
sig.raw_data = &status;
- ftdm_span_send_signal(spri->span, &sig);
+
+ ftdm_span_send_signal(span, &sig);
}
}
@@ -1061,8 +1300,7 @@ static int on_dchan_down(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_
*/
static int on_anything(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
{
-
- ftdm_log(FTDM_LOG_DEBUG, "Caught Event span %d %u (%s)\n", spri->span->span_id, event_type, lpwrap_pri_event_str(event_type));
+ ftdm_log(FTDM_LOG_DEBUG, "Caught Event span %d %u (%s)\n", ftdm_span_get_id(spri->span), event_type, lpwrap_pri_event_str(event_type));
return 0;
}
@@ -1075,8 +1313,7 @@ static int on_anything(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_ev
*/
static int on_io_fail(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_event *pevent)
{
-
- ftdm_log(FTDM_LOG_DEBUG, "Caught Event span %d %u (%s)\n", spri->span->span_id, event_type, lpwrap_pri_event_str(event_type));
+ ftdm_log(FTDM_LOG_DEBUG, "Caught Event span %d %u (%s)\n", ftdm_span_get_id(spri->span), event_type, lpwrap_pri_event_str(event_type));
return 0;
}
@@ -1084,48 +1321,83 @@ static int on_io_fail(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_eve
* \brief Main thread function for libpri span (monitor)
* \param me Current thread
* \param obj Span to run in this thread
+ *
+ * \todo Move all init stuff outside of loop or into ftdm_libpri_configure_span()
*/
static void *ftdm_libpri_run(ftdm_thread_t *me, void *obj)
{
ftdm_span_t *span = (ftdm_span_t *) obj;
ftdm_libpri_data_t *isdn_data = span->signal_data;
- int i, x = 0;
int down = 0;
int got_d = 0;
-
+ int res = 0;
+
ftdm_set_flag(span, FTDM_SPAN_IN_THREAD);
-
- while(ftdm_running() && !ftdm_test_flag(span, FTDM_SPAN_STOP_THREAD)) {
+
+ while (ftdm_running() && !ftdm_test_flag(span, FTDM_SPAN_STOP_THREAD)) {
if (!got_d) {
- for(i = 1; i <= span->chan_count; i++) {
- if (span->channels[i]->type == FTDM_CHAN_TYPE_DQ921) {
- if (ftdm_channel_open(span->span_id, i, &isdn_data->dchan) == FTDM_SUCCESS) {
- ftdm_log(FTDM_LOG_DEBUG, "opening d-channel #%d %d:%d\n", x, isdn_data->dchan->span_id, isdn_data->dchan->chan_id);
+ int i, x;
+
+ for (i = 1, x = 0; i <= ftdm_span_get_chan_count(span); i++) {
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, i);
+
+ if (ftdm_channel_get_type(chan) == FTDM_CHAN_TYPE_DQ921) {
+ if (ftdm_channel_open(ftdm_span_get_id(span), i, &isdn_data->dchan) == FTDM_SUCCESS) {
+ ftdm_log(FTDM_LOG_DEBUG, "opening D-Channel #%d %d:%d\n", x,
+ ftdm_channel_get_span_id(isdn_data->dchan), ftdm_channel_get_id(isdn_data->dchan));
got_d = 1;
x++;
break;
} else {
- ftdm_log(FTDM_LOG_ERROR, "failed to open d-channel #%d %d:%d\n", x, span->channels[i]->span_id, span->channels[i]->chan_id);
+ ftdm_log(FTDM_LOG_ERROR, "failed to open D-Channel #%d %d:%d\n", x,
+ ftdm_channel_get_span_id(chan), ftdm_channel_get_id(chan));
}
}
}
}
-
- if (!got_d) {
- ftdm_log(FTDM_LOG_ERROR, "Failed to get a D-channel in span %d\n", span->span_id);
+ if (!got_d || !isdn_data->dchan) {
+ ftdm_log(FTDM_LOG_ERROR, "Failed to get a D-Channel in span %d\n", ftdm_span_get_id(span));
break;
}
-
-
- if (lpwrap_init_pri(&isdn_data->spri,
- span, // span
- isdn_data->dchan, // dchan
- isdn_data->pswitch,
- isdn_data->node,
- isdn_data->debug) < 0) {
- snprintf(span->last_error, sizeof(span->last_error), "PRI init FAIL!");
- } else {
+ /* Initialize libpri trunk */
+ switch (ftdm_span_get_trunk_type(span)) {
+ case FTDM_TRUNK_E1:
+ case FTDM_TRUNK_T1:
+ case FTDM_TRUNK_J1:
+ res = lpwrap_init_pri(&isdn_data->spri, span, isdn_data->dchan,
+ isdn_data->dialect, isdn_data->mode, isdn_data->debug_mask);
+ break;
+ case FTDM_TRUNK_BRI:
+ res = lpwrap_init_bri(&isdn_data->spri, span, isdn_data->dchan,
+ isdn_data->dialect, isdn_data->mode, 1, isdn_data->debug_mask);
+#ifndef HAVE_LIBPRI_BRI
+ goto out;
+#endif
+ break;
+ case FTDM_TRUNK_BRI_PTMP:
+ res = lpwrap_init_bri(&isdn_data->spri, span, isdn_data->dchan,
+ isdn_data->dialect, isdn_data->mode, 0, isdn_data->debug_mask);
+#ifndef HAVE_LIBPRI_BRI
+ goto out;
+#endif
+ break;
+ default:
+ snprintf(span->last_error, sizeof(span->last_error), "Invalid trunk type");
+ goto out;
+ }
+
+#ifdef HAVE_LIBPRI_AOC
+ /*
+ * Only enable facility on trunk if really required,
+ * this may help avoid problems on troublesome lines.
+ */
+ if (isdn_data->opts & FTMOD_LIBPRI_OPT_FACILITY_AOC) {
+ pri_facility_enable(isdn_data->spri.pri);
+ }
+#endif
+
+ if (res == 0) {
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_ANY, on_anything);
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_RING, on_ring);
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_RINGING, on_ringing);
@@ -1139,26 +1411,31 @@ static void *ftdm_libpri_run(ftdm_thread_t *me, void *obj)
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_INFO_RECEIVED, on_info);
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_RESTART, on_restart);
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_IO_FAIL, on_io_fail);
-
+#ifdef HAVE_LIBPRI_AOC
+ LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_FACILITY, on_facility);
+#endif
if (down) {
- ftdm_log(FTDM_LOG_INFO, "PRI back up on span %d\n", isdn_data->spri.span->span_id);
+ ftdm_log(FTDM_LOG_INFO, "PRI back up on span %d\n", ftdm_span_get_id(span));
ftdm_set_state_all(span, FTDM_CHANNEL_STATE_RESTART);
down = 0;
}
isdn_data->spri.on_loop = check_flags;
- isdn_data->spri.private_info = span;
- lpwrap_run_pri(&isdn_data->spri);
+ lpwrap_run_pri(&isdn_data->spri);
+ } else {
+ ftdm_log(FTDM_LOG_CRIT, "PRI init failed!\n");
+ snprintf(span->last_error, sizeof(span->last_error), "PRI init failed!");
+ break;
}
if (!ftdm_running() || ftdm_test_flag(span, FTDM_SPAN_STOP_THREAD)) {
break;
}
- ftdm_log(FTDM_LOG_CRIT, "PRI down on span %d\n", isdn_data->spri.span->span_id);
+ ftdm_log(FTDM_LOG_CRIT, "PRI down on span %d\n", ftdm_span_get_id(span));
if (isdn_data->spri.dchan) {
- isdn_data->spri.dchan->state = FTDM_CHANNEL_STATE_DOWN;
+ _ftdm_channel_set_state_force(isdn_data->spri.dchan, FTDM_CHANNEL_STATE_DOWN);
}
if (!down) {
@@ -1169,11 +1446,11 @@ static void *ftdm_libpri_run(ftdm_thread_t *me, void *obj)
check_state(span);
check_events(span);
- down++;
+ down = 1;
ftdm_sleep(5000);
}
-
- ftdm_log(FTDM_LOG_DEBUG, "PRI thread ended on span %d\n", span->span_id);
+out:
+ ftdm_log(FTDM_LOG_DEBUG, "PRI thread ended on span %d\n", ftdm_span_get_id(span));
ftdm_clear_flag(span, FTDM_SPAN_IN_THREAD);
ftdm_clear_flag(isdn_data, FTMOD_LIBPRI_RUNNING);
@@ -1197,11 +1474,15 @@ static ftdm_status_t ftdm_libpri_stop(ftdm_span_t *span)
}
ftdm_set_state_all(span, FTDM_CHANNEL_STATE_RESTART);
+
check_state(span);
+
ftdm_set_flag(span, FTDM_SPAN_STOP_THREAD);
- while(ftdm_test_flag(span, FTDM_SPAN_IN_THREAD)) {
+
+ while (ftdm_test_flag(span, FTDM_SPAN_IN_THREAD)) {
ftdm_sleep(100);
}
+
check_state(span);
return FTDM_SUCCESS;
@@ -1216,7 +1497,6 @@ static ftdm_status_t ftdm_libpri_stop(ftdm_span_t *span)
*/
static ftdm_status_t ftdm_libpri_start(ftdm_span_t *span)
{
- ftdm_status_t ret;
ftdm_libpri_data_t *isdn_data = span->signal_data;
if (ftdm_test_flag(isdn_data, FTMOD_LIBPRI_RUNNING)) {
@@ -1227,13 +1507,8 @@ static ftdm_status_t ftdm_libpri_start(ftdm_span_t *span)
ftdm_clear_flag(span, FTDM_SPAN_IN_THREAD);
ftdm_set_flag(isdn_data, FTMOD_LIBPRI_RUNNING);
- ret = ftdm_thread_create_detached(ftdm_libpri_run, span);
- if (ret != FTDM_SUCCESS) {
- return ret;
- }
-
- return ret;
+ return ftdm_thread_create_detached(ftdm_libpri_run, span);
}
/**
@@ -1241,12 +1516,13 @@ static ftdm_status_t ftdm_libpri_start(ftdm_span_t *span)
* \param node Node string to convert
* \return -1 on failure, node value on success
*/
-static int str2node(char *node)
+static int parse_mode(const char *mode)
{
- if (!strcasecmp(node, "cpe") || !strcasecmp(node, "user"))
+ if (!strcasecmp(mode, "cpe") || !strcasecmp(mode, "user"))
return PRI_CPE;
- if (!strcasecmp(node, "network") || !strcasecmp(node, "net"))
+ if (!strcasecmp(mode, "network") || !strcasecmp(mode, "net"))
return PRI_NETWORK;
+
return -1;
}
@@ -1255,24 +1531,25 @@ static int str2node(char *node)
* \param swtype Swtype string to convert
* \return Switch value
*/
-static int str2switch(char *swtype)
+static int parse_dialect(const char *dialect)
{
- if (!strcasecmp(swtype, "ni1"))
+ if (!strcasecmp(dialect, "ni1"))
return PRI_SWITCH_NI1;
- if (!strcasecmp(swtype, "ni2"))
+ if (!strcasecmp(dialect, "ni2"))
return PRI_SWITCH_NI2;
- if (!strcasecmp(swtype, "dms100"))
+ if (!strcasecmp(dialect, "dms100"))
return PRI_SWITCH_DMS100;
- if (!strcasecmp(swtype, "lucent5e") || !strcasecmp(swtype, "5ess"))
+ if (!strcasecmp(dialect, "lucent5e") || !strcasecmp(dialect, "5ess"))
return PRI_SWITCH_LUCENT5E;
- if (!strcasecmp(swtype, "att4ess") || !strcasecmp(swtype, "4ess"))
+ if (!strcasecmp(dialect, "att4ess") || !strcasecmp(dialect, "4ess"))
return PRI_SWITCH_ATT4ESS;
- if (!strcasecmp(swtype, "euroisdn"))
+ if (!strcasecmp(dialect, "euroisdn") || !strcasecmp(dialect, "q931"))
return PRI_SWITCH_EUROISDN_E1;
- if (!strcasecmp(swtype, "gr303eoc"))
+ if (!strcasecmp(dialect, "gr303eoc"))
return PRI_SWITCH_GR303_EOC;
- if (!strcasecmp(swtype, "gr303tmc"))
+ if (!strcasecmp(dialect, "gr303tmc"))
return PRI_SWITCH_GR303_TMC;
+
return PRI_SWITCH_DMS100;
}
@@ -1281,11 +1558,11 @@ static int str2switch(char *swtype)
* \param l1 L1 string to convert
* \return L1 value
*/
-static int str2l1(char *l1)
+static int parse_layer1(const char *val)
{
- if (!strcasecmp(l1, "alaw"))
+ if (!strcasecmp(val, "alaw"))
return PRI_LAYER_1_ALAW;
-
+
return PRI_LAYER_1_ULAW;
}
@@ -1294,161 +1571,219 @@ static int str2l1(char *l1)
* \param dp DP string to convert
* \return DP value
*/
-static int str2dp(char *dp)
+static int parse_ton(const char *ton)
{
- if (!strcasecmp(dp, "international"))
+ if (!strcasecmp(ton, "international"))
return PRI_INTERNATIONAL_ISDN;
- if (!strcasecmp(dp, "national"))
+ if (!strcasecmp(ton, "national"))
return PRI_NATIONAL_ISDN;
- if (!strcasecmp(dp, "local"))
+ if (!strcasecmp(ton, "local"))
return PRI_LOCAL_ISDN;
- if (!strcasecmp(dp, "private"))
+ if (!strcasecmp(ton, "private"))
return PRI_PRIVATE;
- if (!strcasecmp(dp, "unknown"))
+ if (!strcasecmp(ton, "unknown"))
return PRI_UNKNOWN;
return PRI_UNKNOWN;
}
+/**
+ * \brief Parses an option string to flags
+ * \param in String to parse for configuration options
+ * \return Flags
+ */
+static uint32_t parse_opts(const char *in)
+{
+ uint32_t flags = 0;
+
+ if (!in) {
+ return 0;
+ }
+
+ if (strstr(in, "suggest_channel")) {
+ flags |= FTMOD_LIBPRI_OPT_SUGGEST_CHANNEL;
+ }
+ if (strstr(in, "omit_display")) {
+ flags |= FTMOD_LIBPRI_OPT_OMIT_DISPLAY_IE;
+ }
+ if (strstr(in, "omit_redirecting_number")) {
+ flags |= FTMOD_LIBPRI_OPT_OMIT_REDIRECTING_NUMBER_IE;
+ }
+ if (strstr(in, "aoc")) {
+ flags |= FTMOD_LIBPRI_OPT_FACILITY_AOC;
+ }
+ return flags;
+}
+
/**
* \brief Initialises a libpri span from configuration variables
* \param span Span to configure
* \param sig_cb Callback function for event signals
- * \param ap List of configuration variables
+ * \param ftdm_parameters List of configuration variables
* \return Success or failure
*/
-static FIO_SIG_CONFIGURE_FUNCTION(ftdm_libpri_configure_span)
+static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_libpri_configure_span)
{
- uint32_t i, x = 0;
- //ftdm_channel_t *dchans[2] = {0};
- ftdm_libpri_data_t *isdn_data;
- char *var, *val;
- char *debug = NULL;
+ ftdm_libpri_data_t *isdn_data = NULL;
+ //ftdm_channel_t *dchan = NULL;
+ uint32_t bchan_count = 0;
+ uint32_t dchan_count = 0;
+ uint32_t i;
- if (span->trunk_type >= FTDM_TRUNK_NONE) {
- ftdm_log(FTDM_LOG_WARNING, "Invalid trunk type '%s' defaulting to T1.\n", ftdm_trunk_type2str(span->trunk_type));
- span->trunk_type = FTDM_TRUNK_T1;
+ if (ftdm_span_get_trunk_type(span) >= FTDM_TRUNK_NONE) {
+ ftdm_log(FTDM_LOG_WARNING, "Invalid trunk type '%s' defaulting to T1.\n", ftdm_span_get_trunk_type_str(span));
+ ftdm_span_set_trunk_type(span, FTDM_TRUNK_T1);
}
-
- for(i = 1; i <= span->chan_count; i++) {
- if (span->channels[i]->type == FTDM_CHAN_TYPE_DQ921) {
- if (x > 1) {
+
+ for (i = 1; i <= ftdm_span_get_chan_count(span); i++) {
+ ftdm_channel_t *chan = ftdm_span_get_channel(span, i);
+
+ switch (ftdm_channel_get_type(chan)) {
+ case FTDM_CHAN_TYPE_DQ921:
+ if (dchan_count > 1) {
+ ftdm_log(FTDM_LOG_ERROR, "Span has more than 2 D-Channels!\n");
snprintf(span->last_error, sizeof(span->last_error), "Span has more than 2 D-Channels!");
return FTDM_FAIL;
} else {
#if 0
- if (ftdm_channel_open(span->span_id, i, &dchans[x]) == FTDM_SUCCESS) {
- ftdm_log(FTDM_LOG_DEBUG, "opening d-channel #%d %d:%d\n", x, dchans[x]->span_id, dchans[x]->chan_id);
- dchans[x]->state = FTDM_CHANNEL_STATE_UP;
- x++;
+ if (ftdm_channel_open(ftdm_span_get_id(span), i, &dchan) == FTDM_SUCCESS) {
+ ftdm_log(FTDM_LOG_DEBUG, "opening D-Channel %d:%d\n", ftdm_channel_get_span_id(dchan), ftdm_channel_get_id(dchan));
+ _ftdm_channel_set_state_force(dchan, FTDM_CHANNEL_STATE_UP);
+ } else {
+ ftdm_log(FTDM_LOG_ERROR, "Failed to open D-Channel %d:%d\n", ftdm_channel_get_span_id(chan), ftdm_channel_getid(chan));
+ snprintf(span->last_error, sizeof(span->last_error), "Failed to open D-Channel %d:%d\n", ftdm_channel_get_span_id(chan), ftdm_channel_getid(chan));
+ return FTDM_FAIL;
}
#endif
+ dchan_count++;
}
+ break;
+
+ case FTDM_CHAN_TYPE_B:
+ bchan_count++;
+ break;
+ default: /* Ignore other channel types */
+ break;
}
}
-
-#if 0
- if (!x) {
- snprintf(span->last_error, sizeof(span->last_error), "Span has no D-Channels!");
+ if (!dchan_count) {
+ ftdm_log(FTDM_LOG_ERROR, "Span has no D-Channel!\n");
+ snprintf(span->last_error, sizeof(span->last_error), "Span has no D-Channel!");
+ return FTDM_FAIL;
+ }
+ if (!bchan_count) {
+ ftdm_log(FTDM_LOG_ERROR, "Span has no B-Channels!\n");
+ snprintf(span->last_error, sizeof(span->last_error), "Span has no B-Channels!");
return FTDM_FAIL;
}
-#endif
isdn_data = ftdm_malloc(sizeof(*isdn_data));
assert(isdn_data != NULL);
memset(isdn_data, 0, sizeof(*isdn_data));
- if (span->trunk_type == FTDM_TRUNK_E1) {
- ftdm_log(FTDM_LOG_NOTICE, "Setting default Layer 1 to ALAW since this is an E1 trunk\n");
- isdn_data->l1 = PRI_LAYER_1_ALAW;
- } else if (span->trunk_type == FTDM_TRUNK_T1) {
- ftdm_log(FTDM_LOG_NOTICE, "Setting default Layer 1 to ULAW since this is a T1 trunk\n");
- isdn_data->l1 = PRI_LAYER_1_ULAW;
- }
-
- while((var = va_arg(ap, char *))) {
- if (!strcasecmp(var, "node")) {
- int node;
- if (!(val = va_arg(ap, char *))) {
- break;
- }
- node = str2node(val);
- if (-1 == node) {
- ftdm_log(FTDM_LOG_ERROR, "Unknown node type %s, defaulting to CPE mode\n", val);
- node = PRI_CPE;
- }
- isdn_data->node = node;
- } else if (!strcasecmp(var, "switch")) {
- if (!(val = va_arg(ap, char *))) {
- break;
- }
- isdn_data->pswitch = str2switch(val);
- } else if (!strcasecmp(var, "opts")) {
- if (!(val = va_arg(ap, char *))) {
- break;
+ switch (ftdm_span_get_trunk_type(span)) {
+ case FTDM_TRUNK_BRI:
+ case FTDM_TRUNK_BRI_PTMP:
+#ifndef HAVE_LIBPRI_BRI
+ ftdm_log(FTDM_LOG_ERROR, "Unsupported trunk type: '%s', libpri too old\n", ftdm_span_get_trunk_type_str(span));
+ snprintf(span->last_error, sizeof(span->last_error), "Unsupported trunk type [%s], libpri too old", ftdm_span_get_trunk_type_str(span));
+ return FTDM_FAIL;
+#endif
+ case FTDM_TRUNK_E1:
+ ftdm_log(FTDM_LOG_NOTICE, "Setting default Layer 1 to ALAW since this is an E1/BRI/BRI PTMP trunk\n");
+ isdn_data->layer1 = PRI_LAYER_1_ALAW;
+ break;
+ case FTDM_TRUNK_T1:
+ case FTDM_TRUNK_J1:
+ ftdm_log(FTDM_LOG_NOTICE, "Setting default Layer 1 to ULAW since this is a T1/J1 trunk\n");
+ isdn_data->layer1 = PRI_LAYER_1_ULAW;
+ break;
+ default:
+ ftdm_log(FTDM_LOG_ERROR, "Invalid trunk type: '%s'\n", ftdm_span_get_trunk_type_str(span));
+ snprintf(span->last_error, sizeof(span->last_error), "Invalid trunk type [%s]", ftdm_span_get_trunk_type_str(span));
+ return FTDM_FAIL;
+ }
+
+ for (i = 0; ftdm_parameters[i].var; i++) {
+ const char *var = ftdm_parameters[i].var;
+ const char *val = ftdm_parameters[i].val;
+
+ if (ftdm_strlen_zero(var)) {
+ ftdm_log(FTDM_LOG_WARNING, "Skipping parameter with no name\n");
+ continue;
+ }
+
+ if (ftdm_strlen_zero(val)) {
+ ftdm_log(FTDM_LOG_ERROR, "Parameter '%s' has no value\n", var);
+ snprintf(span->last_error, sizeof(span->last_error), "Parameter [%s] has no value", var);
+ return FTDM_FAIL;
+ }
+
+ if (!strcasecmp(var, "node") || !strcasecmp(var, "mode")) {
+ if ((isdn_data->mode = parse_mode(val)) == -1) {
+ ftdm_log(FTDM_LOG_ERROR, "Unknown node type '%s', defaulting to CPE mode\n", val);
+ isdn_data->mode = PRI_CPE;
}
+ }
+ else if (!strcasecmp(var, "switch") || !strcasecmp(var, "dialect")) {
+ isdn_data->dialect = parse_dialect(val);
+ }
+ else if (!strcasecmp(var, "opts")) {
isdn_data->opts = parse_opts(val);
- } else if (!strcasecmp(var, "dp")) {
- if (!(val = va_arg(ap, char *))) {
- break;
+ }
+ else if (!strcasecmp(var, "dp") || !strcasecmp(var, "ton")) {
+ isdn_data->ton = parse_ton(val);
+ }
+ else if (!strcasecmp(var, "l1") || !strcasecmp(var, "layer1")) {
+ isdn_data->layer1 = parse_layer1(val);
+ }
+ else if (!strcasecmp(var, "debug")) {
+ if (parse_debug(val, &isdn_data->debug_mask) == -1) {
+ ftdm_log(FTDM_LOG_ERROR, "Invalid debug flag, ignoring parameter\n");
+ isdn_data->debug_mask = 0;
}
- isdn_data->dp = str2dp(val);
- } else if (!strcasecmp(var, "l1")) {
- if (!(val = va_arg(ap, char *))) {
- break;
- }
- isdn_data->l1 = str2l1(val);
- } else if (!strcasecmp(var, "debug")) {
- if (!(val = va_arg(ap, char *))) {
- break;
- }
- debug = val;
- } else {
+ }
+ else {
+ ftdm_log(FTDM_LOG_ERROR, "Unknown parameter '%s', aborting configuration\n", var);
snprintf(span->last_error, sizeof(span->last_error), "Unknown parameter [%s]", var);
return FTDM_FAIL;
}
}
-
+
span->start = ftdm_libpri_start;
- span->stop = ftdm_libpri_stop;
+ span->stop = ftdm_libpri_stop;
span->signal_cb = sig_cb;
- //isdn_data->dchans[0] = dchans[0];
- //isdn_data->dchans[1] = dchans[1];
- //isdn_data->dchan = isdn_data->dchans[0];
-
- isdn_data->debug = parse_debug(debug);
-
span->signal_data = isdn_data;
span->signal_type = FTDM_SIGTYPE_ISDN;
span->outgoing_call = isdn_outgoing_call;
+ span->state_map = &isdn_state_map;
+
span->get_channel_sig_status = isdn_get_channel_sig_status;
span->get_span_sig_status = isdn_get_span_sig_status;
-
+
if ((isdn_data->opts & FTMOD_LIBPRI_OPT_SUGGEST_CHANNEL)) {
span->channel_request = isdn_channel_request;
ftdm_set_flag(span, FTDM_SPAN_SUGGEST_CHAN_ID);
}
- span->state_map = &isdn_state_map;
-
return FTDM_SUCCESS;
}
/**
* \brief FreeTDM libpri signaling and IO module definition
*/
-ftdm_module_t ftdm_module = {
+ftdm_module_t ftdm_module = {
"libpri",
ftdm_libpri_io_init,
ftdm_libpri_unload,
ftdm_libpri_init,
- ftdm_libpri_configure_span,
- NULL
+ NULL,
+ NULL,
+ ftdm_libpri_configure_span
};
-
/* For Emacs:
* Local Variables:
* mode:c
diff --git a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.h b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.h
index 0bf8c46817..3f47cd2888 100644
--- a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.h
+++ b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.h
@@ -42,8 +42,9 @@ typedef enum {
FTMOD_LIBPRI_OPT_SUGGEST_CHANNEL = (1 << 0),
FTMOD_LIBPRI_OPT_OMIT_DISPLAY_IE = (1 << 1),
FTMOD_LIBPRI_OPT_OMIT_REDIRECTING_NUMBER_IE = (1 << 2),
-
- FTMOD_LIBPRI_OPT_MAX = (1 << 3)
+ FTMOD_LIBPRI_OPT_FACILITY_AOC = (1 << 3),
+
+ FTMOD_LIBPRI_OPT_MAX = (1 << 4)
} ftdm_isdn_opts_t;
typedef enum {
@@ -53,35 +54,20 @@ typedef enum {
struct ftdm_libpri_data {
ftdm_channel_t *dchan;
- ftdm_channel_t *dchans[2];
- struct ftdm_sigmsg sigmsg;
- uint32_t flags;
- int32_t mode;
ftdm_isdn_opts_t opts;
+ uint32_t flags;
+ uint32_t debug_mask;
- int node;
- int pswitch;
- char *dialplan;
- unsigned int l1;
- unsigned int dp;
-
- int debug;
+ int mode;
+ int dialect;
+ unsigned int layer1;
+ unsigned int ton;
lpwrap_pri_t spri;
};
typedef struct ftdm_libpri_data ftdm_libpri_data_t;
-
-/* b-channel private data */
-struct ftdm_isdn_bchan_data
-{
- int32_t digit_timeout;
-};
-
-typedef struct ftdm_isdn_bchan_data ftdm_isdn_bchan_data_t;
-
-
#endif
/* For Emacs:
diff --git a/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c b/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c
index 8dfba34ec3..de4fa2b232 100644
--- a/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c
+++ b/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.c
@@ -1,23 +1,23 @@
/*
* Copyright (c) 2009, Anthony Minessale II
* All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
- *
+ *
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
- *
+ *
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- *
+ *
* * Neither the name of the original author; nor the names of any contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
- *
- *
+ *
+ *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -35,8 +35,8 @@
#include "private/ftdm_core.h"
#include "lpwrap_pri.h"
-#ifndef HAVE_GETTIMEOFDAY
+#ifndef HAVE_GETTIMEOFDAY
#ifdef WIN32
#include
@@ -92,7 +92,7 @@ static struct lpwrap_pri_event_list LPWRAP_PRI_EVENT_LIST[] = {
{8, LPWRAP_PRI_EVENT_ANSWER, "ANSWER"},
{9, LPWRAP_PRI_EVENT_HANGUP_ACK, "HANGUP_ACK"},
{10, LPWRAP_PRI_EVENT_RESTART_ACK, "RESTART_ACK"},
- {11, LPWRAP_PRI_EVENT_FACNAME, "FACNAME"},
+ {11, LPWRAP_PRI_EVENT_FACILITY, "FACILITY"},
{12, LPWRAP_PRI_EVENT_INFO_RECEIVED, "INFO_RECEIVED"},
{13, LPWRAP_PRI_EVENT_PROCEEDING, "PROCEEDING"},
{14, LPWRAP_PRI_EVENT_SETUP_ACK, "SETUP_ACK"},
@@ -106,7 +106,10 @@ static struct lpwrap_pri_event_list LPWRAP_PRI_EVENT_LIST[] = {
#define LINE "--------------------------------------------------------------------------------"
const char *lpwrap_pri_event_str(lpwrap_pri_event_t event_id)
-{
+{
+ if (event_id < 0 || event_id >= LPWRAP_PRI_EVENT_MAX)
+ return "";
+
return LPWRAP_PRI_EVENT_LIST[event_id].name;
}
@@ -114,8 +117,8 @@ static int __pri_lpwrap_read(struct pri *pri, void *buf, int buflen)
{
struct lpwrap_pri *spri = (struct lpwrap_pri *) pri_get_userdata(pri);
ftdm_size_t len = buflen;
- int res;
ftdm_status_t zst;
+ int res;
if ((zst = ftdm_channel_read(spri->dchan, buf, &len)) != FTDM_SUCCESS) {
if (zst == FTDM_FAIL) {
@@ -124,31 +127,31 @@ static int __pri_lpwrap_read(struct pri *pri, void *buf, int buflen)
} else {
ftdm_log(FTDM_LOG_CRIT, "span %d D-READ TIMEOUT\n", spri->span->span_id);
}
-
+
ftdm_clear_flag(spri, LPWRAP_PRI_READY);
return -1;
}
spri->errs = 0;
res = (int)len;
- memset(&((unsigned char*)buf)[res],0,2);
- res+=2;
+
+ memset(&((unsigned char*)buf)[res], 0, 2);
+ res += 2;
#ifdef IODEBUG
{
char bb[2048] = { 0 };
print_hex_bytes(buf, res - 2, bb, sizeof(bb));
- ftdm_log(FTDM_LOG_DEBUG, "READ %d\n", res-2);
+ ftdm_log(FTDM_LOG_DEBUG, "READ %d\n", res - 2);
}
#endif
-
return res;
}
static int __pri_lpwrap_write(struct pri *pri, void *buf, int buflen)
{
struct lpwrap_pri *spri = (struct lpwrap_pri *) pri_get_userdata(pri);
- ftdm_size_t len = buflen -2;
+ ftdm_size_t len = buflen - 2;
if (ftdm_channel_write(spri->dchan, buf, buflen, &len) != FTDM_SUCCESS) {
ftdm_log(FTDM_LOG_CRIT, "span %d D-WRITE FAIL! [%s]\n", spri->span->span_id, spri->dchan->last_error);
@@ -161,11 +164,10 @@ static int __pri_lpwrap_write(struct pri *pri, void *buf, int buflen)
char bb[2048] = { 0 };
print_hex_bytes(buf, buflen - 2, bb, sizeof(bb));
- ftdm_log(FTDM_LOG_DEBUG, "WRITE %d\n", (int)buflen-2);
+ ftdm_log(FTDM_LOG_DEBUG, "WRITE %d\n", (int)buflen - 2);
}
#endif
-
- return (int) buflen;
+ return (int)buflen;
}
int lpwrap_init_pri(struct lpwrap_pri *spri, ftdm_span_t *span, ftdm_channel_t *dchan, int swtype, int node, int debug)
@@ -173,21 +175,63 @@ int lpwrap_init_pri(struct lpwrap_pri *spri, ftdm_span_t *span, ftdm_channel_t *
int ret = -1;
memset(spri, 0, sizeof(struct lpwrap_pri));
-
spri->dchan = dchan;
- spri->span = span;
+ spri->span = span;
- if (spri->dchan && (spri->pri = pri_new_cb(spri->dchan->sockfd, node, swtype, __pri_lpwrap_read, __pri_lpwrap_write, spri))){
- unsigned char buf[4] = { 0 };
- size_t buflen = sizeof(buf), len = 0;
- pri_set_debug(spri->pri, debug);
- ret = 0;
-
- ftdm_channel_write(spri->dchan, buf, buflen, &len);
- } else {
- fprintf(stderr, "Unable to create PRI\n");
+ if (!spri->dchan) {
+ ftdm_log(FTDM_LOG_ERROR, "No D-Channel available, unable to create PRI\n");
+ return ret;
}
+ if ((spri->pri = pri_new_cb(spri->dchan->sockfd, node, swtype, __pri_lpwrap_read, __pri_lpwrap_write, spri))) {
+ unsigned char buf[4] = { 0 };
+ size_t buflen = sizeof(buf), len = 0;
+
+ pri_set_debug(spri->pri, debug);
+#ifdef HAVE_LIBPRI_AOC
+ pri_aoc_events_enable(spri->pri, 1);
+#endif
+ ftdm_channel_write(spri->dchan, buf, buflen, &len);
+
+ ret = 0;
+ } else {
+ ftdm_log(FTDM_LOG_ERROR, "Unable to create PRI\n");
+ }
+ return ret;
+}
+
+int lpwrap_init_bri(struct lpwrap_pri *spri, ftdm_span_t *span, ftdm_channel_t *dchan, int swtype, int node, int ptp, int debug)
+{
+ int ret = -1;
+
+#ifdef HAVE_LIBPRI_BRI
+ memset(spri, 0, sizeof(struct lpwrap_pri));
+ spri->dchan = dchan;
+ spri->span = span;
+
+ if (!spri->dchan) {
+ ftdm_log(FTDM_LOG_ERROR, "No D-Channel available, unable to create BRI\n");
+ return ret;
+ }
+
+ if ((spri->pri = pri_new_bri_cb(spri->dchan->sockfd, ptp, node, swtype, __pri_lpwrap_read, __pri_lpwrap_write, spri))) {
+ unsigned char buf[4] = { 0 };
+ size_t buflen = sizeof(buf), len = 0;
+
+ pri_set_debug(spri->pri, debug);
+#ifdef HAVE_LIBPRI_AOC
+ pri_aoc_events_enable(spri->pri, 1);
+#endif
+ ftdm_channel_write(spri->dchan, buf, buflen, &len);
+
+ ret = 0;
+ } else {
+ ftdm_log(FTDM_LOG_ERROR, "Unable to create BRI\n");
+ }
+#else
+ ftdm_log(FTDM_LOG_ERROR, "Installed libpri version (%s) has no BRI support\n",
+ pri_get_version());
+#endif
return ret;
}
@@ -195,11 +239,11 @@ int lpwrap_init_pri(struct lpwrap_pri *spri, ftdm_span_t *span, ftdm_channel_t *
int lpwrap_one_loop(struct lpwrap_pri *spri)
{
fd_set rfds, efds;
- struct timeval now = {0,0}, *next;
- pri_event *event;
+ struct timeval now = {0,0}, *next = NULL;
+ pri_event *event = NULL;
event_handler handler;
- int sel;
-
+ int sel;
+
if (spri->on_loop) {
if ((sel = spri->on_loop(spri)) < 0) {
return sel;
@@ -231,9 +275,6 @@ int lpwrap_one_loop(struct lpwrap_pri *spri)
now.tv_usec = 100000;
sel = select(pri_fd(spri->pri) + 1, &rfds, NULL, &efds, &now);
-
- event = NULL;
-
if (!sel) {
if ((next = pri_schedule_next(spri->pri))) {
gettimeofday(&now, NULL);
@@ -248,46 +289,40 @@ int lpwrap_one_loop(struct lpwrap_pri *spri)
if (event) {
/* 0 is catchall event handler */
- if ((handler = spri->eventmap[event->e] ? spri->eventmap[event->e] : spri->eventmap[0] ? spri->eventmap[0] : NULL)) {
+ if (event->e < 0 || event->e >= LPWRAP_PRI_EVENT_MAX) {
+ handler = spri->eventmap[0];
+ } else if (spri->eventmap[event->e]) {
+ handler = spri->eventmap[event->e];
+ } else {
+ handler = spri->eventmap[0];
+ }
+
+ if (handler) {
handler(spri, event->e, event);
} else {
ftdm_log(FTDM_LOG_CRIT, "No event handler found for event %d.\n", event->e);
}
}
-
-
return sel;
-
-
- if ((handler = spri->eventmap[LPWRAP_PRI_EVENT_IO_FAIL] ? spri->eventmap[LPWRAP_PRI_EVENT_IO_FAIL] : spri->eventmap[0] ? spri->eventmap[0] : NULL)) {
- handler(spri, LPWRAP_PRI_EVENT_IO_FAIL, NULL);
- }
-
- return -1;
}
int lpwrap_run_pri(struct lpwrap_pri *spri)
{
int ret = 0;
-
- for (;;){
- ret = lpwrap_one_loop(spri);
-
- if (ret < 0) {
+ for (;;) {
+ if ((ret = lpwrap_one_loop(spri)) < 0) {
#ifndef WIN32 //This needs to be adressed fror WIN32 still
if (errno == EINTR){
/* Igonore an interrupted system call */
continue;
}
-#endif
+#endif
ftdm_log(FTDM_LOG_CRIT, "Error = %i [%s]\n", ret, strerror(errno));
break;
}
}
-
return ret;
-
}
/* For Emacs:
@@ -300,4 +335,3 @@ int lpwrap_run_pri(struct lpwrap_pri *spri)
* For VIM:
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
*/
-
diff --git a/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.h b/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.h
index f92c5bbafa..b62e5fb176 100644
--- a/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.h
+++ b/libs/freetdm/src/ftmod/ftmod_libpri/lpwrap_pri.h
@@ -51,7 +51,11 @@ typedef enum {
LPWRAP_PRI_EVENT_ANSWER = PRI_EVENT_ANSWER,
LPWRAP_PRI_EVENT_HANGUP_ACK = PRI_EVENT_HANGUP_ACK,
LPWRAP_PRI_EVENT_RESTART_ACK = PRI_EVENT_RESTART_ACK,
- LPWRAP_PRI_EVENT_FACNAME = PRI_EVENT_FACNAME,
+#ifdef PRI_EVENT_FACILITY
+ LPWRAP_PRI_EVENT_FACILITY = PRI_EVENT_FACILITY,
+#else
+ LPWRAP_PRI_EVENT_FACILITY = PRI_EVENT_FACNAME,
+#endif
LPWRAP_PRI_EVENT_INFO_RECEIVED = PRI_EVENT_INFO_RECEIVED,
LPWRAP_PRI_EVENT_PROCEEDING = PRI_EVENT_PROCEEDING,
LPWRAP_PRI_EVENT_SETUP_ACK = PRI_EVENT_SETUP_ACK,
@@ -121,6 +125,8 @@ struct lpwrap_pri_event_list {
const char *lpwrap_pri_event_str(lpwrap_pri_event_t event_id);
int lpwrap_one_loop(struct lpwrap_pri *spri);
int lpwrap_init_pri(struct lpwrap_pri *spri, ftdm_span_t *span, ftdm_channel_t *dchan, int swtype, int node, int debug);
+int lpwrap_init_bri(struct lpwrap_pri *spri, ftdm_span_t *span, ftdm_channel_t *dchan, int swtype, int node, int ptp, int debug);
int lpwrap_run_pri(struct lpwrap_pri *spri);
+#define lpwrap_run_bri(x) lpwrap_run_pri(x)
#endif
diff --git a/libs/freetdm/src/ftmod/ftmod_pika/ftmod_pika.c b/libs/freetdm/src/ftmod/ftmod_pika/ftmod_pika.c
index f20cbc53a7..aaafdb33cc 100644
--- a/libs/freetdm/src/ftmod/ftmod_pika/ftmod_pika.c
+++ b/libs/freetdm/src/ftmod/ftmod_pika/ftmod_pika.c
@@ -266,7 +266,7 @@ PK_VOID PK_CALLBACK media_out_callback(PKH_TPikaEvent *event)
{
PK_STATUS pk_status;
ftdm_channel_t *ftdmchan = event->userData;
- pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->mod_data;
+ pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->io_data;
//PK_CHAR event_text[PKH_EVENT_MAX_NAME_LENGTH];
//PKH_EVENT_GetText(event->id, event_text, sizeof(event_text));
@@ -345,8 +345,8 @@ static unsigned pika_open_range(ftdm_span_t *span, unsigned boardno, unsigned sp
}
- if (span->mod_data) {
- span_data = span->mod_data;
+ if (span->io_data) {
+ span_data = span->io_data;
} else {
span_data = ftdm_malloc(sizeof(*span_data));
assert(span_data != NULL);
@@ -364,7 +364,7 @@ static unsigned pika_open_range(ftdm_span_t *span, unsigned boardno, unsigned sp
//PKH_QUEUE_Attach(span_data->event_queue, globals.open_boards[boardno], NULL);
- span->mod_data = span_data;
+ span->io_data = span_data;
}
if (type == FTDM_CHAN_TYPE_FXS || type == FTDM_CHAN_TYPE_FXO) {
@@ -380,7 +380,7 @@ static unsigned pika_open_range(ftdm_span_t *span, unsigned boardno, unsigned sp
assert(chan_data);
memset(chan_data, 0, sizeof(*chan_data));
ftdm_span_add_channel(span, 0, type, &chan);
- chan->mod_data = chan_data;
+ chan->io_data = chan_data;
if ((type == FTDM_CHAN_TYPE_B || type == FTDM_CHAN_TYPE_DQ921) && !span_data->handle) {
PKH_TBoardConfig boardConfig;
@@ -680,7 +680,7 @@ static FIO_CONFIGURE_SPAN_FUNCTION(pika_configure_span)
*/
static FIO_OPEN_FUNCTION(pika_open)
{
- pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->mod_data;
+ pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->io_data;
if (!chan_data && !ftdm_test_flag(chan_data, PK_FLAG_READY)) {
return FTDM_FAIL;
@@ -715,7 +715,7 @@ static FIO_CLOSE_FUNCTION(pika_close)
*/
static FIO_WAIT_FUNCTION(pika_wait)
{
- pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->mod_data;
+ pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->io_data;
PK_STATUS status;
ftdm_wait_flag_t myflags = *flags;
PK_CHAR event_text[PKH_EVENT_MAX_NAME_LENGTH];
@@ -754,7 +754,7 @@ static FIO_WAIT_FUNCTION(pika_wait)
*/
static FIO_READ_FUNCTION(pika_read)
{
- pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->mod_data;
+ pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->io_data;
PK_STATUS status;
PK_CHAR event_text[PKH_EVENT_MAX_NAME_LENGTH];
uint32_t len;
@@ -795,7 +795,7 @@ static FIO_READ_FUNCTION(pika_read)
*/
static FIO_WRITE_FUNCTION(pika_write)
{
- pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->mod_data;
+ pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->io_data;
PK_STATUS status;
if (ftdmchan->type == FTDM_CHAN_TYPE_DQ921) {
@@ -821,8 +821,8 @@ static FIO_WRITE_FUNCTION(pika_write)
*/
static FIO_COMMAND_FUNCTION(pika_command)
{
- pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->mod_data;
- //pika_span_data_t *span_data = (pika_span_data_t *) ftdmchan->span->mod_data;
+ pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->io_data;
+ //pika_span_data_t *span_data = (pika_span_data_t *) ftdmchan->span->io_data;
PK_STATUS pk_status;
ftdm_status_t status = FTDM_SUCCESS;
@@ -956,7 +956,7 @@ static FIO_COMMAND_FUNCTION(pika_command)
*/
static FIO_SPAN_POLL_EVENT_FUNCTION(pika_poll_event)
{
- pika_span_data_t *span_data = (pika_span_data_t *) span->mod_data;
+ pika_span_data_t *span_data = (pika_span_data_t *) span->io_data;
PK_STATUS status;
PK_CHAR event_text[PKH_EVENT_MAX_NAME_LENGTH];
@@ -1025,7 +1025,7 @@ static FIO_SPAN_POLL_EVENT_FUNCTION(pika_poll_event)
for(x = 1; x <= span->chan_count; x++) {
ftdmchan = span->channels[x];
assert(ftdmchan != NULL);
- chan_data = (pika_chan_data_t *) ftdmchan->mod_data;
+ chan_data = (pika_chan_data_t *) ftdmchan->io_data;
assert(chan_data != NULL);
@@ -1042,7 +1042,7 @@ static FIO_SPAN_POLL_EVENT_FUNCTION(pika_poll_event)
//ftdm_log(FTDM_LOG_DEBUG, "Event: %s\n", event_text);
if (ftdmchan) {
- pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->mod_data;
+ pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->io_data;
assert(chan_data != NULL);
ftdm_set_flag(ftdmchan, FTDM_CHANNEL_EVENT);
@@ -1068,7 +1068,7 @@ static FIO_SPAN_NEXT_EVENT_FUNCTION(pika_next_event)
for(i = 1; i <= span->chan_count; i++) {
if (ftdm_test_flag(span->channels[i], FTDM_CHANNEL_EVENT)) {
- pika_chan_data_t *chan_data = (pika_chan_data_t *) span->channels[i]->mod_data;
+ pika_chan_data_t *chan_data = (pika_chan_data_t *) span->channels[i]->io_data;
PK_CHAR event_text[PKH_EVENT_MAX_NAME_LENGTH];
ftdm_clear_flag(span->channels[i], FTDM_CHANNEL_EVENT);
@@ -1207,7 +1207,7 @@ static FIO_SPAN_NEXT_EVENT_FUNCTION(pika_next_event)
*/
static FIO_SPAN_DESTROY_FUNCTION(pika_span_destroy)
{
- pika_span_data_t *span_data = (pika_span_data_t *) span->mod_data;
+ pika_span_data_t *span_data = (pika_span_data_t *) span->io_data;
if (span_data) {
PKH_QUEUE_Destroy(span_data->event_queue);
@@ -1224,8 +1224,8 @@ static FIO_SPAN_DESTROY_FUNCTION(pika_span_destroy)
*/
static FIO_CHANNEL_DESTROY_FUNCTION(pika_channel_destroy)
{
- pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->mod_data;
- pika_span_data_t *span_data = (pika_span_data_t *) ftdmchan->span->mod_data;
+ pika_chan_data_t *chan_data = (pika_chan_data_t *) ftdmchan->io_data;
+ pika_span_data_t *span_data = (pika_span_data_t *) ftdmchan->span->io_data;
if (!chan_data) {
return FTDM_FAIL;
diff --git a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
index df9e7736d5..d5344814f0 100644
--- a/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
+++ b/libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
@@ -31,11 +31,15 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include
#ifdef __linux__
+#ifndef _BSD_SOURCE
+#define _BSD_SOURCE /* for strsep() */
+#endif
#include
#include
+#include
#endif
+#include
#include
#include "freetdm.h"
#include "private/ftdm_core.h"
@@ -403,6 +407,7 @@ static void ftdm_r2_on_call_init(openr2_chan_t *r2chan)
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_INUSE)) {
ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Cannot start call when channel is in use (state = %s)\n", ftdm_channel_state2str(ftdmchan->state));
ftdm_mutex_unlock(ftdmchan->mutex);
+ return;
}
if (ftdmchan->state != FTDM_CHANNEL_STATE_DOWN) {
@@ -436,9 +441,6 @@ static void ftdm_r2_on_call_init(openr2_chan_t *r2chan)
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_COLLECT);
ftdm_mutex_unlock(ftdmchan->mutex);
-
- ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Span is not threaded, not launching thread for this call\n");
- return;
}
/* only called for incoming calls when the ANI, DNIS etc is complete and the user has to decide either to accept or reject the call */
@@ -447,9 +449,7 @@ static void ftdm_r2_on_call_offered(openr2_chan_t *r2chan, const char *ani, cons
ftdm_channel_t *ftdmchan = openr2_chan_get_client_data(r2chan);
ftdm_log_chan(ftdmchan, FTDM_LOG_NOTICE, "Call offered with ANI = %s, DNIS = %s, Priority = (%d)\n", ani, dnis, category);
- //ftdmchan->caller_data.priority = category;
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RING);
-
}
static void ftdm_r2_on_call_accepted(openr2_chan_t *r2chan, openr2_call_mode_t mode)
@@ -602,8 +602,8 @@ static void ftdm_r2_on_line_idle(openr2_chan_t *r2chan)
ftdm_log_chan(ftdmchan, FTDM_LOG_NOTICE, "Far end unblocked in state %s\n", ftdm_channel_state2str(ftdmchan->state));
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_SUSPENDED);
- /* XXX when should we set/unset this flag? XXX */
- ftdm_set_flag(ftdmchan, FTDM_CHANNEL_SIG_UP);
+ /* XXX when should we set/unset this flag? XXX */
+ ftdm_set_flag(ftdmchan, FTDM_CHANNEL_SIG_UP);
}
static void ftdm_r2_write_log(openr2_log_level_t level, const char *file, const char *function, int line, const char *message)
@@ -883,7 +883,7 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_r2_configure_span)
ftdm_r2_call_t *r2call = NULL;
openr2_chan_t *r2chan = NULL;
openr2_log_level_t tmplevel;
- char *clevel;
+ char *clevel = NULL;
char *logval = NULL;
ft_r2_conf_t r2conf =
@@ -891,20 +891,21 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_r2_configure_span)
/* .variant */ OR2_VAR_ITU,
/* .category */ OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER,
/* .loglevel */ OR2_LOG_ERROR | OR2_LOG_WARNING,
+ /* .logdir */ NULL,
+ /* .advanced_protocol_file */ NULL,
/* .max_ani */ 10,
/* .max_dnis */ 4,
/* .mfback_timeout */ -1,
/* .metering_pulse_timeout */ -1,
- /* .allow_collect_calls */ -1,
/* .immediate_accept */ -1,
/* .skip_category */ -1,
- /* .forced_release */ -1,
- /* .charge_calls */ -1,
/* .get_ani_first */ -1,
/* .call_files */ 0,
/* .mf_files */ 0,
- /* .logdir */ NULL,
- /* .advanced_protocol_file */ NULL
+ /* .double_answer */ 0,
+ /* .charge_calls */ -1,
+ /* .forced_release */ -1,
+ /* .allow_collect_calls */ -1
};
assert(sig_cb != NULL);
@@ -1107,7 +1108,7 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_r2_configure_span)
memset(r2call, 0, sizeof(*r2call));
openr2_chan_set_logging_func(r2chan, ftdm_r2_on_chan_log);
openr2_chan_set_client_data(r2chan, span->channels[i]);
- r2call->r2chan = r2chan;
+ r2call->r2chan = r2chan;
span->channels[i]->call_data = r2call;
/* value and key are the same so just free one of them */
snprintf(r2call->name, sizeof(r2call->name), "chancall%d", i);
@@ -1322,8 +1323,8 @@ static int ftdm_r2_state_advance(ftdm_channel_t *ftdmchan)
static void *ftdm_r2_run(ftdm_thread_t *me, void *obj)
{
openr2_chan_t *r2chan;
- ftdm_r2_call_t *r2call = NULL;
- ftdm_channel_t *ftdmchan = NULL;
+ ftdm_r2_call_t *r2call = NULL;
+ ftdm_channel_t *ftdmchan = NULL;
ftdm_status_t status;
ftdm_span_t *span = (ftdm_span_t *) obj;
ftdm_r2_data_t *r2data = span->signal_data;
@@ -1359,16 +1360,14 @@ static void *ftdm_r2_run(ftdm_thread_t *me, void *obj)
}
#ifndef WIN32
- /* figure out what event to poll each channel for. POLLPRI when the channel is down,
- * POLLPRI|POLLIN|POLLOUT otherwise.
- */
- memset(poll_events, 0, sizeof(short)*span->chan_count);
- for (i = 0; i < span->chan_count; i++) {
- r2chan = R2CALL(span->channels[(i+1)])->r2chan;
- ftdmchan = openr2_chan_get_client_data(r2chan);
-
- poll_events[i] = ftdmchan->state == FTDM_CHANNEL_STATE_DOWN ? POLLPRI : (POLLPRI | POLLIN | POLLOUT);
- }
+ /* figure out what event to poll each channel for. POLLPRI when the channel is down,
+ * POLLPRI|POLLIN|POLLOUT otherwise */
+ memset(poll_events, 0, sizeof(short)*span->chan_count);
+ for (i = 0; i < span->chan_count; i++) {
+ r2chan = R2CALL(span->channels[(i+1)])->r2chan;
+ ftdmchan = openr2_chan_get_client_data(r2chan);
+ poll_events[i] = ftdmchan->state == FTDM_CHANNEL_STATE_DOWN ? POLLPRI : (POLLPRI | POLLIN | POLLOUT);
+ }
status = ftdm_span_poll_event(span, waitms, poll_events);
#else
@@ -1385,62 +1384,61 @@ static void *ftdm_r2_run(ftdm_thread_t *me, void *obj)
continue;
}
- if (FTDM_SUCCESS == status) {
+ if (FTDM_SUCCESS == status) {
ftdm_event_t *event;
while (ftdm_span_next_event(span, &event) == FTDM_SUCCESS) {
if (event->enum_id == FTDM_OOB_CAS_BITS_CHANGE) {
- r2call = R2CALL(event->channel);
- r2chan = r2call->r2chan;
+ r2call = R2CALL(event->channel);
+ r2chan = r2call->r2chan;
ftdm_log(FTDM_LOG_DEBUG, "Handling CAS on channel %d.\n", openr2_chan_get_number(r2chan));
// we only expect CAS and other OOB events on this thread/loop, once a call is started
// the MF events (in-band signaling) are handled in the call thread
openr2_chan_process_cas_signaling(r2chan);
-
} else {
ftdm_log(FTDM_LOG_DEBUG, "Ignoring event %d on channel %d.\n", event->enum_id, openr2_chan_get_number(r2chan));
// XXX TODO: handle alarms here XXX
}
}
- /* XXX
- * when ftdm_span_poll_event() returns FTDM_SUCCESS, means there are events pending on the span.
- * is it possible to know on which channels those events are pending, without trasvering the span?
- * XXX
- */
- for (i = 1; i <= span->chan_count; i++) {
- r2chan = R2CALL(span->channels[i])->r2chan;
- ftdmchan = openr2_chan_get_client_data(r2chan);
- r2call = R2CALL(ftdmchan);
+ /* XXX
+ * when ftdm_span_poll_event() returns FTDM_SUCCESS, means there are events pending on the span.
+ * is it possible to know on which channels those events are pending, without traversing the span?
+ * XXX */
+ for (i = 1; i <= span->chan_count; i++) {
+ r2chan = R2CALL(span->channels[i])->r2chan;
+ ftdmchan = openr2_chan_get_client_data(r2chan);
+ r2call = R2CALL(ftdmchan);
- ftdm_mutex_lock(ftdmchan->mutex);
- ftdm_set_flag(r2call, FTDM_R2_PROCESSING);
+ ftdm_mutex_lock(ftdmchan->mutex);
+ ftdm_set_flag(r2call, FTDM_R2_PROCESSING);
- if (ftdm_r2_state_advance(ftdmchan)) {
- ftdm_clear_flag(r2call, FTDM_R2_PROCESSING);
- ftdm_mutex_unlock(ftdmchan->mutex);
- continue;
- }
+ if (ftdm_r2_state_advance(ftdmchan)) {
+ ftdm_clear_flag(r2call, FTDM_R2_PROCESSING);
+ ftdm_mutex_unlock(ftdmchan->mutex);
+ continue;
+ }
- /* handle timeout events first if any */
- openr2_chan_run_schedule(r2chan);
+ /* handle timeout events first if any */
+ openr2_chan_run_schedule(r2chan);
- /* process mf tones, if any */
- if (openr2_chan_get_read_enabled(r2chan))
- openr2_chan_process_mf_signaling(r2chan);
+ /* process mf tones, if any */
+ if (openr2_chan_get_read_enabled(r2chan)) {
+ openr2_chan_process_mf_signaling(r2chan);
+ }
- if (ftdm_r2_state_advance(ftdmchan)) {
- ftdm_clear_flag(r2call, FTDM_R2_PROCESSING);
- ftdm_mutex_unlock(ftdmchan->mutex);
- continue;
- }
+ if (ftdm_r2_state_advance(ftdmchan)) {
+ ftdm_clear_flag(r2call, FTDM_R2_PROCESSING);
+ ftdm_mutex_unlock(ftdmchan->mutex);
+ continue;
+ }
- ftdm_clear_flag(r2call, FTDM_R2_PROCESSING);
- ftdm_mutex_unlock(ftdmchan->mutex);
- }
+ ftdm_clear_flag(r2call, FTDM_R2_PROCESSING);
+ ftdm_mutex_unlock(ftdmchan->mutex);
+ }
} else if (status != FTDM_TIMEOUT) {
ftdm_log(FTDM_LOG_ERROR, "ftdm_span_poll_event returned %d.\n", status);
- }
+ }
ftdm_sleep(20);
}
@@ -1613,22 +1611,13 @@ static FIO_API_FUNCTION(ftdm_r2_api)
r2data->loops,
r2data->monitor_thread_id);
stream->write_function(stream, "\n");
- stream->write_function(stream, "%4s %-12.12s %-12.12s %6s %6s %6s %6s\n", "Channel", "Tx CAS", "Rx CAS",
- "Rx Avg", "Tx Avg", "Rx", "Tx");
+ stream->write_function(stream, "%4s %-12.12s %-12.12s\n", "Channel", "Tx CAS", "Rx CAS");
for (i = 1; i <= span->chan_count; i++) {
- char rx_str[25];
- char tx_str[25];
- char rxavg_str[25];
- char txavg_str[25];
r2chan = R2CALL(span->channels[i])->r2chan;
- stream->write_function(stream, "%4d %-12.12s %-12.12s %6s %6s %6s %6s\n",
+ stream->write_function(stream, "%4d %-12.12s %-12.12s\n",
span->channels[i]->chan_id,
openr2_chan_get_tx_cas_string(r2chan),
- openr2_chan_get_rx_cas_string(r2chan),
- rxavg_str,
- txavg_str,
- rx_str,
- tx_str);
+ openr2_chan_get_rx_cas_string(r2chan));
}
stream->write_function(stream, "\n");
stream->write_function(stream, "+OK.\n");
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
index 8dbbda7a65..583d5c1729 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
@@ -47,6 +47,7 @@ static ftdm_status_t ftdm_sangoma_isdn_start(ftdm_span_t *span);
ftdm_channel_t* ftdm_sangoma_isdn_process_event_states(ftdm_span_t *span, sngisdn_event_data_t *sngisdn_event);
static void ftdm_sangoma_isdn_advance_chan_states(ftdm_channel_t *ftdmchan);
+static void ftdm_sangoma_isdn_poll_events(ftdm_span_t *span);
static void ftdm_sangoma_isdn_process_state_change(ftdm_channel_t *ftdmchan);
static void ftdm_sangoma_isdn_process_stack_event (ftdm_span_t *span, sngisdn_event_data_t *sngisdn_event);
@@ -56,9 +57,6 @@ static sng_isdn_event_interface_t g_sngisdn_event_interface;
ftdm_sngisdn_data_t g_sngisdn_data;
-extern ftdm_status_t sng_isdn_activate_trace(ftdm_span_t *span, sngisdn_tracetype_t trace_opt);
-extern ftdm_status_t sngisdn_check_free_ids(void);
-
ftdm_state_map_t sangoma_isdn_state_map = {
{
{
@@ -238,6 +236,50 @@ static __inline__ void ftdm_sangoma_isdn_advance_chan_states(ftdm_channel_t *ftd
}
}
+static void ftdm_sangoma_isdn_poll_events(ftdm_span_t *span)
+{
+ ftdm_status_t ret_status;
+ ftdm_channel_t *ftdmchan;
+ ftdm_iterator_t *chaniter = NULL;
+ ftdm_iterator_t *curr = NULL;
+
+ ret_status = ftdm_span_poll_event(span, 0, NULL);
+ switch(ret_status) {
+ case FTDM_SUCCESS:
+ {
+ ftdm_event_t *event;
+ while (ftdm_span_next_event(span, &event) == FTDM_SUCCESS) {
+
+ if (FTDM_SPAN_IS_BRI(span)) {
+ switch (event->enum_id) {
+ /* Check if the span woke up from power-saving mode */
+ case FTDM_OOB_ALARM_CLEAR:
+ {
+ chaniter = ftdm_span_get_chan_iterator(span, NULL);
+ for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) {
+ ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr);
+ sngisdn_chan_data_t *sngisdn_info = ftdmchan->call_data;
+
+ if (ftdm_test_flag(sngisdn_info, FLAG_ACTIVATING)) {
+ ftdm_clear_flag(sngisdn_info, FLAG_ACTIVATING);
+ sngisdn_snd_setup((ftdm_channel_t*)ftdmchan);
+ }
+ }
+ ftdm_iterator_free(chaniter);
+ }
+ }
+ }
+ }
+ }
+ break;
+ case FTDM_TIMEOUT:
+ /* No events pending */
+ break;
+ default:
+ ftdm_log(FTDM_LOG_WARNING, "%s:Failed to poll span event\n", span->name);
+ }
+}
+
static void *ftdm_sangoma_isdn_run(ftdm_thread_t *me, void *obj)
{
ftdm_interrupt_t *ftdm_sangoma_isdn_int[2];
@@ -300,21 +342,8 @@ static void *ftdm_sangoma_isdn_run(ftdm_thread_t *me, void *obj)
}
/* Poll for events, e.g HW DTMF */
- ret_status = ftdm_span_poll_event(span, 0);
- switch(ret_status) {
- case FTDM_SUCCESS:
- {
- ftdm_event_t *event;
- while (ftdm_span_next_event(span, &event) == FTDM_SUCCESS);
- }
- break;
- case FTDM_TIMEOUT:
- /* No events pending */
- break;
- default:
- ftdm_log(FTDM_LOG_WARNING, "%s:Failed to poll span event\n", span->name);
- }
-
+ ftdm_sangoma_isdn_poll_events(span);
+
if (ftdm_sched_get_time_to_next_timer(signal_data->sched, &sleep) == FTDM_SUCCESS) {
if (sleep < 0 || sleep > SNGISDN_EVENT_POLL_RATE) {
sleep = SNGISDN_EVENT_POLL_RATE;
@@ -498,8 +527,20 @@ static void ftdm_sangoma_isdn_process_state_change(ftdm_channel_t *ftdmchan)
}
break;
case FTDM_CHANNEL_STATE_DIALING: /* outgoing call request */
- {
- sngisdn_snd_setup(ftdmchan);
+ {
+ if (FTDM_SPAN_IS_BRI(ftdmchan->span) &&
+ ftdm_test_flag(ftdmchan, FTDM_CHANNEL_IN_ALARM) &&
+ ftdm_test_flag(ftdmchan->span, FTDM_SPAN_PWR_SAVING)) {
+
+ sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
+
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Requesting Line activation\n");
+ sngisdn_set_flag(sngisdn_info, FLAG_ACTIVATING);
+ sng_isdn_wake_up_phy(ftdmchan->span);
+ ftdm_sched_timer(signal_data->sched, "timer_t3", signal_data->timer_t3*1000, sngisdn_t3_timeout, (void*) sngisdn_info, NULL);
+ } else {
+ sngisdn_snd_setup(ftdmchan);
+ }
}
break;
case FTDM_CHANNEL_STATE_PROGRESS:
@@ -856,8 +897,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_isdn_span_config)
if (span->trunk_type == FTDM_TRUNK_BRI_PTMP ||
span->trunk_type == FTDM_TRUNK_BRI) {
-
- ftdm_set_flag(span, FTDM_SPAN_USE_AV_RATE);
+
sng_isdn_set_avail_rate(span, SNGISDN_AVAIL_PWR_SAVING);
}
@@ -913,7 +953,8 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_isdn_init)
}
/* initalize sng_isdn library */
- sng_isdn_init(&g_sngisdn_event_interface);
+
+ ftdm_assert_return(!sng_isdn_init(&g_sngisdn_event_interface), FTDM_FAIL, "Failed to initialize stack\n");
return FTDM_SUCCESS;
}
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
index 7db753e420..2a65a82985 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
@@ -74,6 +74,7 @@ typedef enum {
FLAG_DELAYED_REL = (1 << 7),
FLAG_SENT_PROCEED = (1 << 8),
FLAG_SEND_DISC = (1 << 9),
+ FLAG_ACTIVATING = (1 << 10), /* Used for BRI only, flag is set after we request line CONNECTED */
} sngisdn_flag_t;
@@ -181,6 +182,7 @@ typedef struct sngisdn_span_data {
uint8_t facility;
int8_t facility_timeout;
uint8_t num_local_numbers;
+ uint8_t timer_t3;
char* local_numbers[SNGISDN_NUM_LOCAL_NUMBERS];
ftdm_sched_t *sched;
ftdm_queue_t *event_queue;
@@ -266,16 +268,27 @@ extern ftdm_sngisdn_data_t g_sngisdn_data;
ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *span);
/* Support functions */
-FT_DECLARE_INLINE(uint32_t) get_unique_suInstId(uint8_t cc_id);
-FT_DECLARE_INLINE(void) clear_call_data(sngisdn_chan_data_t *sngisdn_info);
-FT_DECLARE_INLINE(void) clear_call_glare_data(sngisdn_chan_data_t *sngisdn_info);
+FT_DECLARE(uint32_t) get_unique_suInstId(int16_t cc_id);
+FT_DECLARE(void) clear_call_data(sngisdn_chan_data_t *sngisdn_info);
+FT_DECLARE(void) clear_call_glare_data(sngisdn_chan_data_t *sngisdn_info);
void stack_hdr_init(Header *hdr);
void stack_pst_init(Pst *pst);
-FT_DECLARE_INLINE(ftdm_status_t) get_ftdmchan_by_spInstId(uint8_t cc_id, uint32_t spInstId, sngisdn_chan_data_t **sngisdn_data);
-FT_DECLARE_INLINE(ftdm_status_t) get_ftdmchan_by_suInstId(uint8_t cc_id, uint32_t suInstId, sngisdn_chan_data_t **sngisdn_data);
-FT_DECLARE_INLINE(ftdm_status_t) sng_isdn_set_avail_rate(ftdm_span_t *ftdmspan, sngisdn_avail_t avail);
+
+FT_DECLARE(ftdm_status_t) get_ftdmchan_by_spInstId(int16_t cc_id, uint32_t spInstId, sngisdn_chan_data_t **sngisdn_data);
+FT_DECLARE(ftdm_status_t) get_ftdmchan_by_suInstId(int16_t cc_id, uint32_t suInstId, sngisdn_chan_data_t **sngisdn_data);
+FT_DECLARE(ftdm_status_t) sng_isdn_set_avail_rate(ftdm_span_t *ftdmspan, sngisdn_avail_t avail);
+
+FT_DECLARE(ftdm_status_t) cpy_calling_num_from_stack(ftdm_caller_data_t *ftdm, CgPtyNmb *cgPtyNmb);
+FT_DECLARE(ftdm_status_t) cpy_called_num_from_stack(ftdm_caller_data_t *ftdm, CdPtyNmb *cdPtyNmb);
+FT_DECLARE(ftdm_status_t) cpy_redir_num_from_stack(ftdm_caller_data_t *ftdm, RedirNmb *redirNmb);
+FT_DECLARE(ftdm_status_t) cpy_calling_name_from_stack(ftdm_caller_data_t *ftdm, Display *display);
+
+FT_DECLARE(ftdm_status_t) cpy_calling_num_from_user(CgPtyNmb *cgPtyNmb, ftdm_caller_data_t *ftdm);
+FT_DECLARE(ftdm_status_t) cpy_called_num_from_user(CdPtyNmb *cdPtyNmb, ftdm_caller_data_t *ftdm);
+FT_DECLARE(ftdm_status_t) cpy_redir_num_from_user(RedirNmb *redirNmb, ftdm_caller_data_t *ftdm);
+FT_DECLARE(ftdm_status_t) cpy_calling_name_from_user(ConEvnt *conEvnt, ftdm_channel_t *ftdmchan);
/* Outbound Call Control functions */
void sngisdn_snd_setup(ftdm_channel_t *ftdmchan);
@@ -331,6 +344,14 @@ void sngisdn_process_rst_ind (sngisdn_event_data_t *sngisdn_event);
void sngisdn_rcv_phy_ind(SuId suId, Reason reason);
void sngisdn_rcv_q921_ind(BdMngmt *status);
+
+void sngisdn_trace_q921(char* str, uint8_t* data, uint32_t data_len);
+void sngisdn_trace_q931(char* str, uint8_t* data, uint32_t data_len);
+void get_memory_info(void);
+
+ftdm_status_t sng_isdn_activate_trace(ftdm_span_t *span, sngisdn_tracetype_t trace_opt);
+ftdm_status_t sngisdn_check_free_ids(void);
+
void sngisdn_rcv_q921_trace(BdMngmt *trc, Buffer *mBuf);
void sngisdn_rcv_q931_ind(InMngmt *status);
void sngisdn_rcv_q931_trace(InMngmt *trc, Buffer *mBuf);
@@ -368,11 +389,13 @@ void sngisdn_delayed_release(void* p_sngisdn_info);
void sngisdn_delayed_connect(void* p_sngisdn_info);
void sngisdn_delayed_disconnect(void* p_sngisdn_info);
void sngisdn_facility_timeout(void* p_sngisdn_info);
+void sngisdn_t3_timeout(void* p_sngisdn_info);
/* Stack management functions */
ftdm_status_t sng_isdn_stack_cfg(ftdm_span_t *span);
ftdm_status_t sng_isdn_stack_start(ftdm_span_t *span);
ftdm_status_t sng_isdn_stack_stop(ftdm_span_t *span);
+ftdm_status_t sng_isdn_wake_up_phy(ftdm_span_t *span);
void sngisdn_print_phy_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span);
void sngisdn_print_spans(ftdm_stream_handle_t *stream);
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c
index 64d7a2403f..18ca9c38dd 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c
@@ -98,6 +98,8 @@ ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span)
ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported switchtype %s for trunktype:%s\n", span->name, switch_name, ftdm_trunk_type2str(span->trunk_type));
return FTDM_FAIL;
}
+ ftdm_set_flag(span, FTDM_SPAN_USE_AV_RATE);
+ ftdm_set_flag(span, FTDM_SPAN_PWR_SAVING);
/* can be > 1 for some BRI variants */
break;
default:
@@ -179,6 +181,7 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_
signal_data->min_digits = 8;
signal_data->overlap_dial = SNGISDN_OPT_DEFAULT;
signal_data->setup_arb = SNGISDN_OPT_DEFAULT;
+ signal_data->timer_t3 = 8;
signal_data->link_id = span->span_id;
span->default_caller_data.bearer_capability = IN_ITC_SPEECH;
@@ -189,6 +192,7 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_
if (span->trunk_type == FTDM_TRUNK_BRI ||
span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
+
ftdm_span_set_npi("unknown", &span->default_caller_data.dnis.plan);
ftdm_span_set_ton("unknown", &span->default_caller_data.dnis.type);
ftdm_span_set_npi("unknown", &span->default_caller_data.cid_num.plan);
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
index 5a3e06ec89..bb46fb7fba 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
@@ -198,7 +198,7 @@ ftdm_status_t sng_isdn_stack_cfg_phy_psap(ftdm_span_t *span)
L1Mngmt cfg;
Pst pst;
- S32 d_channel_fd = -1;
+ int32_t d_channel_fd = -1;
sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
/* initalize the post structure */
@@ -227,7 +227,7 @@ ftdm_status_t sng_isdn_stack_cfg_phy_psap(ftdm_span_t *span)
for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) {
ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr);
if (ftdmchan->type == FTDM_CHAN_TYPE_DQ921) {
- d_channel_fd = (S32) ftdmchan->sockfd;
+ d_channel_fd = (int32_t)ftdmchan->sockfd;
break;
}
}
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cntrl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cntrl.c
index 27c16c2a51..bfc00d07ba 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cntrl.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cntrl.c
@@ -113,6 +113,40 @@ ftdm_status_t sng_isdn_stack_stop(ftdm_span_t *span)
}
+ftdm_status_t sng_isdn_wake_up_phy(ftdm_span_t *span)
+{
+ L1Mngmt cntrl;
+ Pst pst;
+
+ sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
+
+ /* initalize the post structure */
+ stack_pst_init(&pst);
+
+ /* insert the destination Entity */
+ pst.dstEnt = ENTL1;
+
+ /* initalize the control structure */
+ memset(&cntrl, 0, sizeof(cntrl));
+
+ /* initalize the control header */
+ stack_hdr_init(&cntrl.hdr);
+
+ cntrl.hdr.msgType = TCNTRL; /* configuration */
+ cntrl.hdr.entId.ent = ENTL1; /* entity */
+ cntrl.hdr.entId.inst = S_INST; /* instance */
+ cntrl.hdr.elmId.elmnt = STTSAP; /* SAP Specific cntrl */
+
+ cntrl.t.cntrl.action = AENA;
+ cntrl.t.cntrl.subAction = SAELMNT;
+ cntrl.t.cntrl.sapId = signal_data->link_id;
+
+ if (sng_isdn_phy_cntrl(&pst, &cntrl)) {
+ return FTDM_FAIL;
+ }
+ return FTDM_SUCCESS;
+}
+
ftdm_status_t sng_isdn_activate_phy(ftdm_span_t *span)
{
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
index 9adcc08296..8408c673ef 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
@@ -34,11 +34,6 @@
#include "ftmod_sangoma_isdn.h"
-extern ftdm_status_t cpy_calling_num_from_stack(ftdm_caller_data_t *ftdm, CgPtyNmb *cgPtyNmb);
-extern ftdm_status_t cpy_called_num_from_stack(ftdm_caller_data_t *ftdm, CdPtyNmb *cdPtyNmb);
-extern ftdm_status_t cpy_redir_num_from_stack(ftdm_caller_data_t *ftdm, RedirNmb *redirNmb);
-extern ftdm_status_t cpy_calling_name_from_stack(ftdm_caller_data_t *ftdm, Display *display);
-
/* Remote side transmit a SETUP */
void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
{
@@ -78,7 +73,7 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
break;
}
- sngisdn_info->suInstId = get_unique_suInstId((int8_t) suId);
+ sngisdn_info->suInstId = get_unique_suInstId(suId);
sngisdn_info->spInstId = spInstId;
@@ -135,6 +130,7 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
cpy_calling_num_from_stack(&ftdmchan->caller_data, &conEvnt->cgPtyNmb);
cpy_called_num_from_stack(&ftdmchan->caller_data, &conEvnt->cdPtyNmb);
cpy_calling_name_from_stack(&ftdmchan->caller_data, &conEvnt->display);
+ cpy_redir_num_from_stack(&ftdmchan->caller_data, &conEvnt->redirNmb);
ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_INFO, "Incoming call: Called No:[%s] Calling No:[%s]\n", ftdmchan->caller_data.dnis.digits, ftdmchan->caller_data.cid_num.digits);
if (conEvnt->bearCap[0].eh.pres) {
@@ -205,7 +201,7 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
sngisdn_set_flag(sngisdn_info, FLAG_DELAYED_REL);
sngisdn_info->glare.suId = suId;
- sngisdn_info->glare.suInstId = get_unique_suInstId((int8_t) suId);
+ sngisdn_info->glare.suInstId = get_unique_suInstId(suId);
sngisdn_info->glare.spInstId = spInstId;
sngisdn_info->glare.dChan = dChan;
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
index 3284d54165..cb508a54b4 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
@@ -34,10 +34,6 @@
#include "ftmod_sangoma_isdn.h"
-extern ftdm_status_t cpy_calling_num_from_user(CgPtyNmb *cgPtyNmb, ftdm_caller_data_t *ftdm);
-extern ftdm_status_t cpy_called_num_from_user(CdPtyNmb *cdPtyNmb, ftdm_caller_data_t *ftdm);
-extern ftdm_status_t cpy_calling_name_from_user(ConEvnt *conEvnt, ftdm_channel_t *ftdmchan);
-
void sngisdn_snd_setup(ftdm_channel_t *ftdmchan);
void sngisdn_snd_proceed(ftdm_channel_t *ftdmchan);
void sngisdn_snd_progress(ftdm_channel_t *ftdmchan);
@@ -45,7 +41,6 @@ void sngisdn_snd_connect(ftdm_channel_t *ftdmchan);
void sngisdn_snd_disconnect(ftdm_channel_t *ftdmchan);
void sngisdn_snd_release(ftdm_channel_t *ftdmchan, uint8_t glare);
-
void sngisdn_snd_setup(ftdm_channel_t *ftdmchan)
{
ConEvnt conEvnt;
@@ -147,6 +142,7 @@ void sngisdn_snd_setup(ftdm_channel_t *ftdmchan)
cpy_called_num_from_user(&conEvnt.cdPtyNmb, &ftdmchan->caller_data);
cpy_calling_num_from_user(&conEvnt.cgPtyNmb, &ftdmchan->caller_data);
+ cpy_redir_num_from_user(&conEvnt.redirNmb, &ftdmchan->caller_data);
cpy_calling_name_from_user(&conEvnt, ftdmchan);
ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending SETUP (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c
index 39c5693728..7c375f7c64 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c
@@ -34,10 +34,6 @@
#include "ftmod_sangoma_isdn.h"
-extern void sngisdn_trace_q921(char* str, uint8_t* data, uint32_t data_len);
-extern void sngisdn_trace_q931(char* str, uint8_t* data, uint32_t data_len);
-extern void get_memory_info(void);
-
#define MAX_DECODE_STR_LEN 2000
@@ -112,7 +108,7 @@ void sngisdn_rcv_con_cfm (int16_t suId, uint32_t suInstId, uint32_t spInstId, Cn
ftdm_assert(g_sngisdn_data.ccs[suId].activation_done != 0, "Con Cfm on unconfigured cc\n");
ftdm_assert(g_sngisdn_data.dchans[dChan].num_spans != 0, "Con Cfm on unconfigured dchan\n");
- if (get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) != FTDM_SUCCESS) {
+ if (get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) != FTDM_SUCCESS) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
ISDN_FUNC_TRACE_EXIT(__FUNCTION__);
return;
@@ -156,7 +152,7 @@ void sngisdn_rcv_cnst_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, C
ftdm_assert(g_sngisdn_data.ccs[suId].activation_done != 0, "Cnst Ind on unconfigured cc\n");
ftdm_assert(g_sngisdn_data.dchans[dChan].num_spans != 0, "Cnst Ind on unconfigured dchan\n");
- if (get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) != FTDM_SUCCESS) {
+ if (get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) != FTDM_SUCCESS) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
ISDN_FUNC_TRACE_EXIT(__FUNCTION__);
return;
@@ -206,8 +202,8 @@ void sngisdn_rcv_disc_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, D
ftdm_assert(spInstId != 0, "Received DISCONNECT with invalid id");
- if (!(spInstId && get_ftdmchan_by_spInstId((int8_t) suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
- !(suInstId && get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
+ if (!(spInstId && get_ftdmchan_by_spInstId(suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
+ !(suInstId && get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
ftdm_assert(0, "Inconsistent call states\n");
@@ -240,8 +236,8 @@ void sngisdn_rcv_rel_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, Re
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
- if (!(spInstId && get_ftdmchan_by_spInstId((int8_t) suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
- !(suInstId && get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
+ if (!(spInstId && get_ftdmchan_by_spInstId(suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
+ !(suInstId && get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
/* It seems that Trillium has a bug where they sometimes send release twice on a call, so do not crash on these for now */
@@ -274,8 +270,8 @@ void sngisdn_rcv_dat_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, In
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
- if (!(spInstId && get_ftdmchan_by_spInstId((int8_t) suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
- !(suInstId && get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
+ if (!(spInstId && get_ftdmchan_by_spInstId(suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
+ !(suInstId && get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
ftdm_assert(0, "Inconsistent call states\n");
@@ -307,8 +303,8 @@ void sngisdn_rcv_sshl_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, S
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
- if (!(spInstId && get_ftdmchan_by_spInstId((int8_t) suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
- !(suInstId && get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
+ if (!(spInstId && get_ftdmchan_by_spInstId(suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
+ !(suInstId && get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
ftdm_assert(0, "Inconsistent call states\n");
@@ -341,8 +337,8 @@ void sngisdn_rcv_sshl_cfm (int16_t suId, uint32_t suInstId, uint32_t spInstId, S
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
- if (!(spInstId && get_ftdmchan_by_spInstId((int8_t) suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
- !(suInstId && get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
+ if (!(spInstId && get_ftdmchan_by_spInstId(suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
+ !(suInstId && get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
ftdm_assert(0, "Inconsistent call states\n");
@@ -374,8 +370,8 @@ void sngisdn_rcv_rmrt_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, R
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
- if (!(spInstId && get_ftdmchan_by_spInstId((int8_t) suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
- !(suInstId && get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
+ if (!(spInstId && get_ftdmchan_by_spInstId(suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
+ !(suInstId && get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
ftdm_assert(0, "Inconsistent call states\n");
@@ -408,8 +404,8 @@ void sngisdn_rcv_rmrt_cfm (int16_t suId, uint32_t suInstId, uint32_t spInstId, R
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
- if (!(spInstId && get_ftdmchan_by_spInstId((int8_t) suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
- !(suInstId && get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
+ if (!(spInstId && get_ftdmchan_by_spInstId(suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
+ !(suInstId && get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
ftdm_assert(0, "Inconsistent call states\n");
@@ -442,8 +438,8 @@ void sngisdn_rcv_flc_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, St
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
- if (!(spInstId && get_ftdmchan_by_spInstId((int8_t) suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
- !(suInstId && get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
+ if (!(spInstId && get_ftdmchan_by_spInstId(suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
+ !(suInstId && get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
ftdm_assert(0, "Inconsistent call states\n");
@@ -476,8 +472,8 @@ void sngisdn_rcv_fac_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, Fa
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
- if (!(spInstId && get_ftdmchan_by_spInstId((int8_t) suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
- !(suInstId && get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
+ if (!(spInstId && get_ftdmchan_by_spInstId(suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
+ !(suInstId && get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
ftdm_assert(0, "Inconsistent call states\n");
@@ -510,8 +506,8 @@ void sngisdn_rcv_sta_cfm (int16_t suId, uint32_t suInstId, uint32_t spInstId, St
ISDN_FUNC_TRACE_ENTER(__FUNCTION__);
- if (!(spInstId && get_ftdmchan_by_spInstId((int8_t) suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
- !(suInstId && get_ftdmchan_by_suInstId((int8_t) suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
+ if (!(spInstId && get_ftdmchan_by_spInstId(suId, spInstId, &sngisdn_info) == FTDM_SUCCESS) &&
+ !(suInstId && get_ftdmchan_by_suInstId(suId, suInstId, &sngisdn_info) == FTDM_SUCCESS)) {
ftdm_log(FTDM_LOG_CRIT, "Could not find matching call suId:%u suInstId:%u spInstId:%u\n", suId, suInstId, spInstId);
ftdm_assert(0, "Inconsistent call states\n");
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
index 5cc17a539a..7322aeddaa 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
@@ -34,22 +34,12 @@
#include "ftmod_sangoma_isdn.h"
-ftdm_status_t cpy_calling_num_from_stack(ftdm_caller_data_t *ftdm, CgPtyNmb *cgPtyNmb);
-ftdm_status_t cpy_called_num_from_stack(ftdm_caller_data_t *ftdm, CdPtyNmb *cdPtyNmb);
-ftdm_status_t cpy_redir_num_from_stack(ftdm_caller_data_t *ftdm, RedirNmb *redirNmb);
-ftdm_status_t cpy_calling_name_from_stack(ftdm_caller_data_t *ftdm, Display *display);
-
-ftdm_status_t cpy_calling_num_from_user(CgPtyNmb *cgPtyNmb, ftdm_caller_data_t *ftdm);
-ftdm_status_t cpy_called_num_from_user(CdPtyNmb *cdPtyNmb, ftdm_caller_data_t *ftdm);
-ftdm_status_t cpy_redir_num_from_user(RedirNmb *redirNmb, ftdm_caller_data_t *ftdm);
-ftdm_status_t cpy_calling_name_from_user(ConEvnt *conEvnt, ftdm_channel_t *ftdmchan);
-
ftdm_status_t sngisdn_check_free_ids(void);
extern ftdm_sngisdn_data_t g_sngisdn_data;
void get_memory_info(void);
-FT_DECLARE_INLINE(void) clear_call_data(sngisdn_chan_data_t *sngisdn_info)
+FT_DECLARE(void) clear_call_data(sngisdn_chan_data_t *sngisdn_info)
{
uint32_t cc_id = ((sngisdn_span_data_t*)sngisdn_info->ftdmchan->span->signal_data)->cc_id;
@@ -66,7 +56,7 @@ FT_DECLARE_INLINE(void) clear_call_data(sngisdn_chan_data_t *sngisdn_info)
return;
}
-FT_DECLARE_INLINE(void) clear_call_glare_data(sngisdn_chan_data_t *sngisdn_info)
+FT_DECLARE(void) clear_call_glare_data(sngisdn_chan_data_t *sngisdn_info)
{
ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_DEBUG, "Clearing glare data (suId:%d suInstId:%u spInstId:%u actv-suInstId:%u actv-spInstId:%u)\n",
sngisdn_info->glare.suId,
@@ -91,9 +81,10 @@ FT_DECLARE_INLINE(void) clear_call_glare_data(sngisdn_chan_data_t *sngisdn_info)
}
-FT_DECLARE_INLINE(uint32_t) get_unique_suInstId(uint8_t cc_id)
+FT_DECLARE(uint32_t) get_unique_suInstId(int16_t cc_id)
{
uint32_t suInstId;
+ ftdm_assert_return((cc_id > 0 && cc_id <=MAX_VARIANTS), FTDM_FAIL, "Invalid cc_id\n");
ftdm_mutex_lock(g_sngisdn_data.ccs[cc_id].mutex);
suInstId = g_sngisdn_data.ccs[cc_id].last_suInstId;
@@ -112,8 +103,9 @@ FT_DECLARE_INLINE(uint32_t) get_unique_suInstId(uint8_t cc_id)
return 0;
}
-FT_DECLARE_INLINE(ftdm_status_t) get_ftdmchan_by_suInstId(uint8_t cc_id, uint32_t suInstId, sngisdn_chan_data_t **sngisdn_data)
+FT_DECLARE(ftdm_status_t) get_ftdmchan_by_suInstId(int16_t cc_id, uint32_t suInstId, sngisdn_chan_data_t **sngisdn_data)
{
+ ftdm_assert_return((cc_id > 0 && cc_id <=MAX_VARIANTS), FTDM_FAIL, "Invalid cc_id\n");
ftdm_assert_return(g_sngisdn_data.ccs[cc_id].activation_done, FTDM_FAIL, "Trying to find call on unconfigured CC\n");
if (g_sngisdn_data.ccs[cc_id].active_suInstIds[suInstId] == NULL) {
@@ -123,8 +115,9 @@ FT_DECLARE_INLINE(ftdm_status_t) get_ftdmchan_by_suInstId(uint8_t cc_id, uint32_
return FTDM_SUCCESS;
}
-FT_DECLARE_INLINE(ftdm_status_t) get_ftdmchan_by_spInstId(uint8_t cc_id, uint32_t spInstId, sngisdn_chan_data_t **sngisdn_data)
+FT_DECLARE(ftdm_status_t) get_ftdmchan_by_spInstId(int16_t cc_id, uint32_t spInstId, sngisdn_chan_data_t **sngisdn_data)
{
+ ftdm_assert_return((cc_id > 0 && cc_id <=MAX_VARIANTS), FTDM_FAIL, "Invalid cc_id\n");
ftdm_assert_return(g_sngisdn_data.ccs[cc_id].activation_done, FTDM_FAIL, "Trying to find call on unconfigured CC\n");
if (g_sngisdn_data.ccs[cc_id].active_spInstIds[spInstId] == NULL) {
@@ -154,7 +147,7 @@ ftdm_status_t sng_isdn_set_avail_rate(ftdm_span_t *span, sngisdn_avail_t avail)
return FTDM_SUCCESS;
}
-ftdm_status_t cpy_calling_num_from_stack(ftdm_caller_data_t *ftdm, CgPtyNmb *cgPtyNmb)
+FT_DECLARE(ftdm_status_t) cpy_calling_num_from_stack(ftdm_caller_data_t *ftdm, CgPtyNmb *cgPtyNmb)
{
if (cgPtyNmb->eh.pres != PRSNT_NODEF) {
return FTDM_FAIL;
@@ -181,7 +174,7 @@ ftdm_status_t cpy_calling_num_from_stack(ftdm_caller_data_t *ftdm, CgPtyNmb *cgP
return FTDM_SUCCESS;
}
-ftdm_status_t cpy_called_num_from_stack(ftdm_caller_data_t *ftdm, CdPtyNmb *cdPtyNmb)
+FT_DECLARE(ftdm_status_t) cpy_called_num_from_stack(ftdm_caller_data_t *ftdm, CdPtyNmb *cdPtyNmb)
{
if (cdPtyNmb->eh.pres != PRSNT_NODEF) {
return FTDM_FAIL;
@@ -203,7 +196,7 @@ ftdm_status_t cpy_called_num_from_stack(ftdm_caller_data_t *ftdm, CdPtyNmb *cdPt
return FTDM_SUCCESS;
}
-ftdm_status_t cpy_redir_num_from_stack(ftdm_caller_data_t *ftdm, RedirNmb *redirNmb)
+FT_DECLARE(ftdm_status_t) cpy_redir_num_from_stack(ftdm_caller_data_t *ftdm, RedirNmb *redirNmb)
{
if (redirNmb->eh.pres != PRSNT_NODEF) {
return FTDM_FAIL;
@@ -223,7 +216,7 @@ ftdm_status_t cpy_redir_num_from_stack(ftdm_caller_data_t *ftdm, RedirNmb *redir
return FTDM_SUCCESS;
}
-ftdm_status_t cpy_calling_name_from_stack(ftdm_caller_data_t *ftdm, Display *display)
+FT_DECLARE(ftdm_status_t) cpy_calling_name_from_stack(ftdm_caller_data_t *ftdm, Display *display)
{
if (display->eh.pres != PRSNT_NODEF) {
return FTDM_FAIL;
@@ -236,7 +229,7 @@ ftdm_status_t cpy_calling_name_from_stack(ftdm_caller_data_t *ftdm, Display *dis
return FTDM_SUCCESS;
}
-ftdm_status_t cpy_calling_num_from_user(CgPtyNmb *cgPtyNmb, ftdm_caller_data_t *ftdm)
+FT_DECLARE(ftdm_status_t) cpy_calling_num_from_user(CgPtyNmb *cgPtyNmb, ftdm_caller_data_t *ftdm)
{
uint8_t len = strlen(ftdm->cid_num.digits);
if (!len) {
@@ -264,7 +257,7 @@ ftdm_status_t cpy_calling_num_from_user(CgPtyNmb *cgPtyNmb, ftdm_caller_data_t *
return FTDM_SUCCESS;
}
-ftdm_status_t cpy_called_num_from_user(CdPtyNmb *cdPtyNmb, ftdm_caller_data_t *ftdm)
+FT_DECLARE(ftdm_status_t) cpy_called_num_from_user(CdPtyNmb *cdPtyNmb, ftdm_caller_data_t *ftdm)
{
uint8_t len = strlen(ftdm->dnis.digits);
if (!len) {
@@ -294,7 +287,7 @@ ftdm_status_t cpy_called_num_from_user(CdPtyNmb *cdPtyNmb, ftdm_caller_data_t *f
return FTDM_SUCCESS;
}
-ftdm_status_t cpy_redir_num_from_user(RedirNmb *redirNmb, ftdm_caller_data_t *ftdm)
+FT_DECLARE(ftdm_status_t) cpy_redir_num_from_user(RedirNmb *redirNmb, ftdm_caller_data_t *ftdm)
{
uint8_t len = strlen(ftdm->rdnis.digits);
if (!len) {
@@ -326,7 +319,7 @@ ftdm_status_t cpy_redir_num_from_user(RedirNmb *redirNmb, ftdm_caller_data_t *ft
}
-ftdm_status_t cpy_calling_name_from_user(ConEvnt *conEvnt, ftdm_channel_t *ftdmchan)
+FT_DECLARE(ftdm_status_t) cpy_calling_name_from_user(ConEvnt *conEvnt, ftdm_channel_t *ftdmchan)
{
uint8_t len;
ftdm_caller_data_t *ftdm = &ftdmchan->caller_data;
@@ -379,6 +372,28 @@ ftdm_status_t cpy_calling_name_from_user(ConEvnt *conEvnt, ftdm_channel_t *ftdmc
return FTDM_SUCCESS;
}
+void sngisdn_t3_timeout(void* p_sngisdn_info)
+{
+ sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*)p_sngisdn_info;
+ ftdm_channel_t *ftdmchan = sngisdn_info->ftdmchan;
+ sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
+
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Timer T3 expired (suId:%d suInstId:%u spInstId:%u)\n",
+ signal_data->cc_id, sngisdn_info->glare.spInstId, sngisdn_info->glare.suInstId);
+ ftdm_mutex_lock(ftdmchan->mutex);
+ if (ftdm_test_flag(sngisdn_info, FLAG_ACTIVATING)){
+ /* PHY layer timed-out, need to clear the call */
+ ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Failed to Wake-Up line (suId:%d suInstId:%u spInstId:%u)\n",
+ signal_data->cc_id, sngisdn_info->glare.spInstId, sngisdn_info->glare.suInstId);
+
+ ftdmchan->caller_data.hangup_cause = FTDM_CAUSE_NO_ROUTE_DESTINATION;
+ ftdm_clear_flag(sngisdn_info, FLAG_ACTIVATING);
+ ftdm_set_flag(sngisdn_info, FLAG_LOCAL_ABORT);
+ ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
+ }
+ ftdm_mutex_unlock(ftdmchan->mutex);
+}
+
void sngisdn_delayed_release(void* p_sngisdn_info)
{
sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*)p_sngisdn_info;
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c
index 87d80f18a4..e7378bf2ea 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c
@@ -1347,7 +1347,7 @@ int ftmod_ss7_isup_isap_config(int id)
cfg.t.cfg.s.siSap.natAddrInd = ADDR_NOTPRSNT; /* SID Nature of Addres Indicator */
cfg.t.cfg.s.siSap.sidNPlan = NP_ISDN; /* SID Numbering Plan */
cfg.t.cfg.s.siSap.sidPresInd = FALSE; /* default presentation indicator */
- cfg.t.cfg.s.siSap.incSidPresRes = TRUE; /* Presentation Restriction of incoming SID */
+ cfg.t.cfg.s.siSap.incSidPresRes = FALSE; /* Presentation Restriction of incoming SID */
cfg.t.cfg.s.siSap.sidPresRes = 0; /* Presentation Restriction */
}
cfg.t.cfg.s.siSap.reqOpt = FALSE; /* Request option */
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
index 38d3723061..34cca80140 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
@@ -1482,7 +1482,7 @@ static ftdm_status_t handle_tx_grs(ftdm_stream_handle_t *stream, int span, int c
sngss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
ftdmchan = sngss7_info->ftdmchan;
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
if ((ftdmchan->physical_span_id == span) &&
((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) {
@@ -1529,7 +1529,7 @@ static ftdm_status_t handle_tx_grs(ftdm_stream_handle_t *stream, int span, int c
sngss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
ftdmchan = sngss7_info->ftdmchan;
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
if ((ftdmchan->physical_span_id == span) &&
((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) {
@@ -1572,7 +1572,7 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c
/* extract the channel and span info for this circuit */
sngss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
ftdmchan = sngss7_info->ftdmchan;
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
/* check if this circuit is part of the block */
if ((ftdmchan->physical_span_id == span) &&
@@ -1628,7 +1628,7 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c
sngss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
ftdmchan = sngss7_info->ftdmchan;
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
if ((ftdmchan->physical_span_id == span) &&
((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) {
@@ -1672,7 +1672,7 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c
/* extract the channel and span info for this circuit */
sngss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
ftdmchan = sngss7_info->ftdmchan;
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
/* check if this circuit is part of the block */
if ((ftdmchan->physical_span_id == span) &&
@@ -1728,7 +1728,7 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c
sngss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
ftdmchan = sngss7_info->ftdmchan;
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
if ((ftdmchan->physical_span_id == span) &&
((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) {
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
index af3b9edbae..72e4bacf52 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
@@ -1722,7 +1722,7 @@ ftdm_status_t handle_grs_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
}
/* fill in the span structure for this circuit */
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
sngss7_span->rx_grs.circuit = circuit;
sngss7_span->rx_grs.range = range;
@@ -1758,7 +1758,7 @@ ftdm_status_t handle_grs_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ
}
/* fill in the span structure for this circuit */
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
sngss7_span->rx_gra.circuit = circuit;
sngss7_span->rx_gra.range = range;
@@ -1866,7 +1866,7 @@ ftdm_status_t handle_ucic(uint32_t suInstId, uint32_t spInstId, uint32_t circuit
}
/* check if we just sent a GRS request...*/
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
if (sngss7_span->tx_grs.circuit > 0) {
/* we need to put all circuits on this UCIC */
sngss7_span->ucic.circuit = sngss7_span->tx_grs.circuit;
@@ -1917,7 +1917,7 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
}
/* grab the span info */
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
/* figure out what type of block needs to be applied */
if ((siStaEvnt->cgsmti.eh.pres == PRSNT_NODEF) && (siStaEvnt->cgsmti.typeInd.pres == PRSNT_NODEF)) {
@@ -2058,7 +2058,7 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
}
/* grab the span info */
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
/* figure out what type of block needs to be applied */
if ((siStaEvnt->cgsmti.eh.pres == PRSNT_NODEF) && (siStaEvnt->cgsmti.typeInd.pres == PRSNT_NODEF)) {
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c
index 06fae0cd37..72bd1c3fb2 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c
@@ -90,7 +90,7 @@ void sngss7_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCo
memcpy(&sngss7_event->event.siConEvnt, siConEvnt, sizeof(*siConEvnt));
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
}
@@ -128,7 +128,7 @@ void sngss7_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCo
memcpy(&sngss7_event->event.siConEvnt, siConEvnt, sizeof(*siConEvnt));
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
}
@@ -167,7 +167,7 @@ void sngss7_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCn
memcpy(&sngss7_event->event.siCnStEvnt, siCnStEvnt, sizeof(*siCnStEvnt));
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
}
@@ -205,7 +205,7 @@ void sngss7_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiRe
memcpy(&sngss7_event->event.siRelEvnt, siRelEvnt, sizeof(*siRelEvnt));
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
}
@@ -243,7 +243,7 @@ void sngss7_rel_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiRe
memcpy(&sngss7_event->event.siRelEvnt, siRelEvnt, sizeof(*siRelEvnt));
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
}
@@ -281,7 +281,7 @@ void sngss7_dat_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiIn
memcpy(&sngss7_event->event.siInfoEvnt, siInfoEvnt, sizeof(*siInfoEvnt));
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
}
@@ -320,7 +320,7 @@ void sngss7_fac_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint
memcpy(&sngss7_event->event.siFacEvnt, siFacEvnt, sizeof(*siFacEvnt));
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
}
@@ -359,7 +359,7 @@ void sngss7_fac_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint
memcpy(&sngss7_event->event.siFacEvnt, siFacEvnt, sizeof(*siFacEvnt));
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
}
@@ -396,7 +396,7 @@ void sngss7_umsg_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit)
sngss7_event->event_id = SNGSS7_UMSG_IND_EVENT;
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
@@ -438,7 +438,7 @@ void sngss7_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint
}
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
}
@@ -478,7 +478,7 @@ void sngss7_susp_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiS
}
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
@@ -519,7 +519,7 @@ void sngss7_resm_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiR
}
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
@@ -560,7 +560,7 @@ void sngss7_ssp_sta_cfm(uint32_t infId)
}
/* enqueue this event */
- ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->mod_data)->event_queue, sngss7_event);
+ ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
#endif
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
index 7612f3dd74..304e9d6ce3 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
@@ -275,7 +275,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
ftdm_span_t *ftdmspan = (ftdm_span_t *) obj;
ftdm_channel_t *ftdmchan = NULL;
sngss7_event_data_t *sngss7_event = NULL;
- sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->mod_data;
+ sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data;
ftdm_log (FTDM_LOG_INFO, "ftmod_sangoma_ss7 monitor thread for span=%u started.\n", ftdmspan->span_id);
@@ -788,7 +788,7 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
/* check if this is the base circuit and send out the GRA
* we insure that this is the last circuit to have the state change queued
*/
- sngss7_span_data_t *span = ftdmchan->span->mod_data;
+ sngss7_span_data_t *span = ftdmchan->span->signal_data;
if (span->rx_grs.circuit == sngss7_info->circuit->id) {
/* send out the GRA */
ft_to_sngss7_gra(ftdmchan);
@@ -1350,7 +1350,7 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span)
ftdmchan = span->channels[x];
if (ftdmchan->call_data == NULL) continue;
sngss7_info = ftdmchan->call_data;
- sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span = ftdmchan->span->signal_data;
sngss7_intf = &g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId];
@@ -1474,7 +1474,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config)
span->get_channel_sig_status = ftdm_sangoma_ss7_get_sig_status;
span->set_channel_sig_status = ftdm_sangoma_ss7_set_sig_status;
span->state_map = &sangoma_ss7_state_map;
- span->mod_data = ss7_span_info;
+ span->signal_data = ss7_span_info;
/* set the flag to indicate that this span uses channel state change queues */
ftdm_set_flag (span, FTDM_SPAN_USE_CHAN_QUEUE);
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
index 970d006756..008265b9a4 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
@@ -619,7 +619,7 @@ void ft_to_sngss7_gra (ftdm_channel_t * ftdmchan)
{
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
- sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->signal_data;
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
SiStaEvnt gra;
@@ -663,7 +663,7 @@ void ft_to_sngss7_grs (ftdm_channel_t * ftdmchan)
{
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
- sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->signal_data;
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
SiStaEvnt grs;
@@ -696,7 +696,7 @@ void ft_to_sngss7_cgba(ftdm_channel_t * ftdmchan)
{
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
- sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->signal_data;
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
int x = 0;
@@ -745,7 +745,7 @@ void ft_to_sngss7_cgua(ftdm_channel_t * ftdmchan)
{
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
- sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->signal_data;
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
int x = 0;
@@ -794,7 +794,7 @@ void ft_to_sngss7_cgb(ftdm_channel_t * ftdmchan)
{
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
- sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->signal_data;
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
SiStaEvnt cgb;
int x = 0;
@@ -844,7 +844,7 @@ void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan)
{
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
- sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->signal_data;
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
SiStaEvnt cgu;
int x = 0;
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
index 4d497b599d..23617c9147 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
@@ -513,7 +513,7 @@ ftdm_status_t check_if_rx_grs_started(ftdm_span_t *ftdmspan)
{
ftdm_channel_t *ftdmchan = NULL;
sngss7_chan_data_t *sngss7_info = NULL;
- sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->mod_data;
+ sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data;
int i;
for ( i = sngss7_span->rx_grs.circuit; i < (sngss7_span->rx_grs.circuit + sngss7_span->rx_grs.range + 1); i++) {
@@ -575,7 +575,7 @@ ftdm_status_t check_if_rx_grs_processed(ftdm_span_t *ftdmspan)
{
ftdm_channel_t *ftdmchan = NULL;
sngss7_chan_data_t *sngss7_info = NULL;
- sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->mod_data;
+ sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data;
int i;
int byte = 0;
int bit = 0;
@@ -667,7 +667,7 @@ ftdm_status_t check_if_rx_gra_started(ftdm_span_t *ftdmspan)
{
ftdm_channel_t *ftdmchan = NULL;
sngss7_chan_data_t *sngss7_info = NULL;
- sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->mod_data;
+ sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data;
int i;
for (i = sngss7_span->rx_gra.circuit; i < (sngss7_span->rx_gra.circuit + sngss7_span->rx_gra.range + 1); i++) {
@@ -817,7 +817,7 @@ ftdm_status_t process_span_ucic(ftdm_span_t *ftdmspan)
{
ftdm_channel_t *ftdmchan = NULL;
sngss7_chan_data_t *sngss7_info = NULL;
- sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->mod_data;
+ sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data;
int i;
for (i = sngss7_span->ucic.circuit; i < (sngss7_span->ucic.circuit + sngss7_span->ucic.range + 1); i++) {
@@ -869,7 +869,7 @@ ftdm_status_t clear_rx_grs_flags(sngss7_chan_data_t *sngss7_info)
ftdm_status_t clear_rx_grs_data(sngss7_chan_data_t *sngss7_info)
{
ftdm_channel_t *ftdmchan = sngss7_info->ftdmchan;
- sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->signal_data;
/* clear the rx_grs data fields */
memset(&sngss7_span->rx_grs, 0x0, sizeof(sngss7_group_data_t));
@@ -881,7 +881,7 @@ ftdm_status_t clear_rx_grs_data(sngss7_chan_data_t *sngss7_info)
ftdm_status_t clear_rx_gra_data(sngss7_chan_data_t *sngss7_info)
{
ftdm_channel_t *ftdmchan = sngss7_info->ftdmchan;
- sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->signal_data;
/* clear the rx_grs data fields */
memset(&sngss7_span->rx_gra, 0x0, sizeof(sngss7_group_data_t));
@@ -904,7 +904,7 @@ ftdm_status_t clear_tx_grs_flags(sngss7_chan_data_t *sngss7_info)
ftdm_status_t clear_tx_grs_data(sngss7_chan_data_t *sngss7_info)
{
ftdm_channel_t *ftdmchan = sngss7_info->ftdmchan;
- sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
+ sngss7_span_data_t *sngss7_span = ftdmchan->span->signal_data;
/* clear the rx_grs data fields */
memset(&sngss7_span->tx_grs, 0x0, sizeof(sngss7_group_data_t));
diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
index 74d37b53d1..4a9c863b12 100644
--- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c
@@ -2121,7 +2121,7 @@ static int ftmod_ss7_fill_in_circuits(sng_isupCkt_t *isupCkt)
ftdmchan->call_data = ss7_info;
/* prepare the timer structures */
- ss7_info->t35.sched = ((sngss7_span_data_t *)isupCkt->span->mod_data)->sched;
+ ss7_info->t35.sched = ((sngss7_span_data_t *)isupCkt->span->signal_data)->sched;
ss7_info->t35.counter = 1;
ss7_info->t35.beat = g_ftdm_sngss7_data.cfg.isupIntf[isupCkt->isupInf].t35*100; /* beat is in ms, t35 is in 100ms */
ss7_info->t35.callback = handle_isup_t35;
diff --git a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
index 86940107e7..8e8acc24e3 100644
--- a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
+++ b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
@@ -117,28 +117,28 @@ static __inline__ int tdmv_api_wait_socket(ftdm_channel_t *ftdmchan, int timeout
#ifdef LIBSANGOMA_VERSION
int err;
- uint32_t inflags = *flags;
- uint32_t outflags = 0;
- sangoma_wait_obj_t *sangoma_wait_obj = ftdmchan->mod_data;
+ uint32_t inflags = *flags;
+ uint32_t outflags = 0;
+ sangoma_wait_obj_t *sangoma_wait_obj = ftdmchan->io_data;
err = sangoma_waitfor(sangoma_wait_obj, inflags, &outflags, timeout);
*flags = 0;
- if (err == SANG_STATUS_SUCCESS) {
- *flags = outflags;
- err = 1; /* ideally should be the number of file descriptors with something to read */
- }
- if (err == SANG_STATUS_APIPOLL_TIMEOUT) {
- err = 0;
- }
- return err;
+ if (err == SANG_STATUS_SUCCESS) {
+ *flags = outflags;
+ err = 1; /* ideally should be the number of file descriptors with something to read */
+ }
+ if (err == SANG_STATUS_APIPOLL_TIMEOUT) {
+ err = 0;
+ }
+ return err;
#else
struct pollfd pfds[1];
- int res;
+ int res;
- memset(&pfds[0], 0, sizeof(pfds[0]));
- pfds[0].fd = ftdmchan->sockfd;
- pfds[0].events = *flags;
- res = poll(pfds, 1, timeout);
+ memset(&pfds[0], 0, sizeof(pfds[0]));
+ pfds[0].fd = ftdmchan->sockfd;
+ pfds[0].events = *flags;
+ res = poll(pfds, 1, timeout);
*flags = 0;
if (pfds[0].revents & POLLERR) {
@@ -149,7 +149,7 @@ static __inline__ int tdmv_api_wait_socket(ftdm_channel_t *ftdmchan, int timeout
*flags = pfds[0].revents;
}
- return res;
+ return res;
#endif
}
@@ -252,7 +252,7 @@ static unsigned wp_open_range(ftdm_span_t *span, unsigned spanno, unsigned start
ftdm_log(FTDM_LOG_ERROR, "failure create waitable object for s%dc%d\n", spanno, x);
continue;
}
- chan->mod_data = sangoma_wait_obj;
+ chan->io_data = sangoma_wait_obj;
#endif
chan->physical_span_id = spanno;
@@ -541,7 +541,7 @@ static FIO_OPEN_FUNCTION(wanpipe_open)
static FIO_CLOSE_FUNCTION(wanpipe_close)
{
#ifdef LIBSANGOMA_VERSION
- sangoma_wait_obj_t *waitobj = ftdmchan->mod_data;
+ sangoma_wait_obj_t *waitobj = ftdmchan->io_data;
/* kick any I/O waiters */
sangoma_wait_obj_signal(waitobj);
#endif
@@ -895,10 +895,10 @@ FIO_SPAN_POLL_EVENT_FUNCTION(wanpipe_poll_event)
for(i = 1; i <= span->chan_count; i++) {
ftdm_channel_t *ftdmchan = span->channels[i];
#ifdef LIBSANGOMA_VERSION
- if (!ftdmchan->mod_data) {
+ if (!ftdmchan->io_data) {
continue; /* should never happen but happens when shutting down */
}
- pfds[j] = ftdmchan->mod_data;
+ pfds[j] = ftdmchan->io_data;
inflags[j] = poll_events ? poll_events[j] : POLLPRI;
#else
memset(&pfds[j], 0, sizeof(pfds[j]));
@@ -1011,12 +1011,25 @@ static FIO_GET_ALARMS_FUNCTION(wanpipe_get_alarms)
}
alarms = tdm_api.wp_tdm_cmd.fe_alarms;
#endif
+#ifdef WIN32
+ /* Temporary fix: in the current trunk of libsangoma, for BRI,
+ WAN_TE_BIT_ALARM_RED bit is set if the card is in disconnected state, but this has
+ not been ported to Windows-libsangoma yet */
+ if (FTDM_SPAN_IS_BRI(ftdmchan->span)) {
+ if (alarms) {
+ ftdmchan->alarm_flags |= FTDM_ALARM_RED;
+ alarms = 0;
+ }
+ }
+#endif
+
ftdmchan->alarm_flags = FTDM_ALARM_NONE;
if (alarms & WAN_TE_BIT_ALARM_RED) {
ftdmchan->alarm_flags |= FTDM_ALARM_RED;
alarms &= ~WAN_TE_BIT_ALARM_RED;
}
+
if (alarms & WAN_TE_BIT_ALARM_AIS) {
ftdmchan->alarm_flags |= FTDM_ALARM_BLUE;
@@ -1166,6 +1179,11 @@ FIO_SPAN_NEXT_EVENT_FUNCTION(wanpipe_next_event)
char tmp_dtmf[2] = { tdm_api.wp_tdm_cmd.event.wp_tdm_api_event_dtmf_digit, 0 };
event_id = FTDM_OOB_NOOP;
+ if (tmp_dtmf[0] == 'f') {
+ ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Ignoring wanpipe DTMF: %c, fax tones will be passed through!\n", tmp_dtmf[0]);
+ break;
+ }
+
if (tdm_api.wp_tdm_cmd.event.wp_tdm_api_event_dtmf_type == WAN_EC_TONE_PRESENT) {
ftdm_set_flag_locked(ftdmchan, FTDM_CHANNEL_MUTE);
}
@@ -1216,10 +1234,10 @@ FIO_SPAN_NEXT_EVENT_FUNCTION(wanpipe_next_event)
static FIO_CHANNEL_DESTROY_FUNCTION(wanpipe_channel_destroy)
{
#ifdef LIBSANGOMA_VERSION
- if (ftdmchan->mod_data) {
+ if (ftdmchan->io_data) {
sangoma_wait_obj_t *sangoma_wait_obj;
- sangoma_wait_obj = ftdmchan->mod_data;
- ftdmchan->mod_data = NULL;
+ sangoma_wait_obj = ftdmchan->io_data;
+ ftdmchan->io_data = NULL;
sangoma_wait_obj_delete(&sangoma_wait_obj);
}
#endif
diff --git a/libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c b/libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c
index ae9398418a..ddf7b3ffab 100644
--- a/libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c
+++ b/libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c
@@ -658,6 +658,14 @@ static FIO_OPEN_FUNCTION(zt_open)
*/
static FIO_CLOSE_FUNCTION(zt_close)
{
+ if (ftdmchan->type == FTDM_CHAN_TYPE_B) {
+ int value = 0; /* disable audio mode */
+ if (ioctl(ftdmchan->sockfd, codes.AUDIOMODE, &value)) {
+ snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "%s", strerror(errno));
+ ftdm_log(FTDM_LOG_ERROR, "%s\n", ftdmchan->last_error);
+ return FTDM_FAIL;
+ }
+ }
return FTDM_SUCCESS;
}
@@ -867,7 +875,7 @@ static FIO_WAIT_FUNCTION(zt_wait)
{
int32_t inflags = 0;
int result;
- struct pollfd pfds[1];
+ struct pollfd pfds[1];
if (*flags & FTDM_READ) {
inflags |= POLLIN;
@@ -882,13 +890,14 @@ static FIO_WAIT_FUNCTION(zt_wait)
}
- memset(&pfds[0], 0, sizeof(pfds[0]));
- pfds[0].fd = ftdmchan->sockfd;
- pfds[0].events = inflags;
- result = poll(pfds, 1, to);
+ memset(&pfds[0], 0, sizeof(pfds[0]));
+ pfds[0].fd = ftdmchan->sockfd;
+ pfds[0].events = inflags;
+ result = poll(pfds, 1, to);
*flags = 0;
if (pfds[0].revents & POLLERR) {
+ ftdm_log_chan_msg(ftdmchan, FTDM_LOG_ERROR, "DAHDI device got POLLERR\n");
result = -1;
}
@@ -900,6 +909,7 @@ static FIO_WAIT_FUNCTION(zt_wait)
if (result < 0){
snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "Poll failed");
+ ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Failed to poll DAHDI device: %s\n", strerror(errno));
return FTDM_FAIL;
}
diff --git a/libs/freetdm/src/include/freetdm.h b/libs/freetdm/src/include/freetdm.h
index 64ecc2e357..31bc88b9ca 100644
--- a/libs/freetdm/src/include/freetdm.h
+++ b/libs/freetdm/src/include/freetdm.h
@@ -1240,6 +1240,9 @@ FT_DECLARE(void) ftdm_span_set_trunk_type(ftdm_span_t *span, ftdm_trunk_type_t t
*/
FT_DECLARE(ftdm_trunk_type_t) ftdm_span_get_trunk_type(const ftdm_span_t *span);
+/*! \brief For display debugging purposes you can display this string which describes the trunk type of a span */
+FT_DECLARE(const char *) ftdm_span_get_trunk_type_str(const ftdm_span_t *span);
+
/*!
* \brief Return the channel identified by the provided id
*
@@ -1259,6 +1262,12 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_set_caller_data(ftdm_channel_t *ftdmchan,
/*! \brief Get the caller data for a channel, typically you need this when receiving FTDM_SIGEVENT_START */
FT_DECLARE(ftdm_caller_data_t *) ftdm_channel_get_caller_data(ftdm_channel_t *channel);
+/*! \brief Get current state of a channel */
+FT_DECLARE(int) ftdm_channel_get_state(const ftdm_channel_t *ftdmchan);
+
+/*! \brief Get last state of a channel */
+FT_DECLARE(int) ftdm_channel_get_last_state(const ftdm_channel_t *ftdmchan);
+
/*! \brief For display debugging purposes you can display this string which describes the current channel internal state */
FT_DECLARE(const char *) ftdm_channel_get_state_str(const ftdm_channel_t *channel);
diff --git a/libs/freetdm/src/include/ftdm_declare.h b/libs/freetdm/src/include/ftdm_declare.h
index 2985ab4f45..ab3b5c8966 100644
--- a/libs/freetdm/src/include/ftdm_declare.h
+++ b/libs/freetdm/src/include/ftdm_declare.h
@@ -70,7 +70,7 @@ extern "C" {
#define FT_DECLARE_NONSTD(type) __declspec(dllimport) type __cdecl
#define FT_DECLARE_DATA __declspec(dllimport)
#endif
-#define FT_DECLARE_INLINE(type) type
+#define FT_DECLARE_INLINE(type) extern __inline__ type /* why extern? see http://support.microsoft.com/kb/123768 */
#define EX_DECLARE_DATA __declspec(dllexport)
#else
#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(HAVE_VISIBILITY)
@@ -82,7 +82,7 @@ extern "C" {
#define FT_DECLARE_NONSTD(type) type
#define FT_DECLARE_DATA
#endif
-#define FT_DECLARE_INLINE(type) type __inline__
+#define FT_DECLARE_INLINE(type) __inline__ type
#define EX_DECLARE_DATA
#endif
diff --git a/libs/freetdm/src/include/private/ftdm_core.h b/libs/freetdm/src/include/private/ftdm_core.h
index 8bdbdd60f8..ab20ef8171 100644
--- a/libs/freetdm/src/include/private/ftdm_core.h
+++ b/libs/freetdm/src/include/private/ftdm_core.h
@@ -222,6 +222,8 @@ extern "C" {
#define ftdm_is_dtmf(key) ((key > 47 && key < 58) || (key > 64 && key < 69) || (key > 96 && key < 101) || key == 35 || key == 42 || key == 87 || key == 119)
+#define FTDM_SPAN_IS_BRI(x) ((x)->trunk_type == FTDM_TRUNK_BRI || (x)->trunk_type == FTDM_TRUNK_BRI_PTMP)
+
/*!
\brief Copy flags from one arbitrary object to another
\command dest the object to copy the flags to
@@ -422,7 +424,9 @@ struct ftdm_channel {
ftdm_fsk_data_state_t fsk;
uint8_t fsk_buf[80];
uint32_t ring_count;
- void *mod_data;
+ /* Private I/O data. Do not touch unless you are an I/O module */
+ void *io_data;
+ /* Private signaling data. Do not touch unless you are a signaling module */
void *call_data;
struct ftdm_caller_data caller_data;
struct ftdm_span *span;
@@ -454,6 +458,7 @@ struct ftdm_span {
ftdm_trunk_type_t trunk_type;
ftdm_analog_start_type_t start_type;
ftdm_signal_type_t signal_type;
+ /* Private signaling data. Do not touch unless you are a signaling module */
void *signal_data;
fio_signal_cb_t signal_cb;
ftdm_event_t event_header;
@@ -471,7 +476,8 @@ struct ftdm_span {
ftdm_span_start_t start;
ftdm_span_stop_t stop;
ftdm_channel_sig_read_t sig_read;
- void *mod_data;
+ /* Private I/O data per span. Do not touch unless you are an I/O module */
+ void *io_data;
char *type;
char *dtmf_hangup;
size_t dtmf_hangup_len;
diff --git a/libs/freetdm/src/include/private/ftdm_types.h b/libs/freetdm/src/include/private/ftdm_types.h
index bddefd9be6..78ac8f63eb 100644
--- a/libs/freetdm/src/include/private/ftdm_types.h
+++ b/libs/freetdm/src/include/private/ftdm_types.h
@@ -176,10 +176,11 @@ typedef enum {
FTDM_SPAN_USE_CHAN_QUEUE = (1 << 6),
FTDM_SPAN_SUGGEST_CHAN_ID = (1 << 7),
FTDM_SPAN_USE_AV_RATE = (1 << 8),
+ FTDM_SPAN_PWR_SAVING = (1 << 9),
/* If you use this flag, you MUST call ftdm_span_trigger_signals to deliver the user signals
* after having called ftdm_send_span_signal(), which with this flag it will just enqueue the signal
* for later delivery */
- FTDM_SPAN_USE_SIGNALS_QUEUE = (1 << 9),
+ FTDM_SPAN_USE_SIGNALS_QUEUE = (1 << 10),
} ftdm_span_flag_t;
/*! \brief Channel supported features */
diff --git a/libs/libsndfile/M4/lt~obsolete.m4 b/libs/libsndfile/M4/lt~obsolete.m4
index 637bb2066c..c573da90c5 100644
--- a/libs/libsndfile/M4/lt~obsolete.m4
+++ b/libs/libsndfile/M4/lt~obsolete.m4
@@ -1,13 +1,13 @@
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
#
-# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
# Written by Scott James Remnant, 2004.
#
# This file is free software; the Free Software Foundation gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
-# serial 4 lt~obsolete.m4
+# serial 5 lt~obsolete.m4
# These exist entirely to fool aclocal when bootstrapping libtool.
#
@@ -77,7 +77,6 @@ m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])])
m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
@@ -90,3 +89,10 @@ m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
diff --git a/libs/openzap/src/ozmod/ozmod_sangoma_boost/ozmod_sangoma_boost.c b/libs/openzap/src/ozmod/ozmod_sangoma_boost/ozmod_sangoma_boost.c
index 937c67b328..dc2218012e 100644
--- a/libs/openzap/src/ozmod/ozmod_sangoma_boost/ozmod_sangoma_boost.c
+++ b/libs/openzap/src/ozmod/ozmod_sangoma_boost/ozmod_sangoma_boost.c
@@ -898,7 +898,7 @@ tryagain:
static void handle_call_loop_start(zap_span_t *span, sangomabc_connection_t *mcon, sangomabc_short_event_t *event)
{
- zap_status_t res = ZAP_FAIL;
+ zap_state_change_result_t res = ZAP_FAIL;
zap_channel_t *zchan;
if (!(zchan = find_zchan(span, (sangomabc_short_event_t*)event, 0))) {
@@ -923,7 +923,7 @@ static void handle_call_loop_start(zap_span_t *span, sangomabc_connection_t *mco
static __inline__ void stop_loop(zap_channel_t *zchan)
{
- zap_status_t res = ZAP_FAIL;
+ zap_state_change_result_t res = ZAP_STATE_CHANGE_FAIL;
zap_channel_command(zchan, ZAP_COMMAND_DISABLE_LOOP, NULL);
/* even when we did not sent a msg we set this flag to avoid sending call stop in the DOWN state handler */
zap_set_flag(zchan, SFLAG_SENT_FINAL_MSG);
diff --git a/libs/openzap/src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c b/libs/openzap/src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c
index 40cf2a5a7c..8423aac34b 100644
--- a/libs/openzap/src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c
+++ b/libs/openzap/src/ozmod/ozmod_wanpipe/ozmod_wanpipe.c
@@ -1119,7 +1119,14 @@ ZIO_SPAN_NEXT_EVENT_FUNCTION(wanpipe_next_event)
event_id = ZAP_OOB_NOOP;
//zap_log(ZAP_LOG_WARNING, "%d:%d queue hardware dtmf %s %s\n", zchan->span_id, zchan->chan_id, tmp_dtmf,
- //tdm_api.wp_tdm_cmd.event.wp_tdm_api_event_dtmf_type == WAN_EC_TONE_PRESENT ? "on" : "off");
+ //tdm_api.wp_tdm_cmd.event.wp_tdm_api_event_dtmf_type == WAN_EC_TONE_PRESENT ? "on" : "off");
+ if (tmp_dtmf[0] == 'f') {
+ if (zap_test_flag(zchan, ZAP_CHANNEL_INUSE)) {
+ zap_channel_queue_dtmf(zchan, tmp_dtmf);
+ }
+ break;
+ }
+
if (tdm_api.wp_tdm_cmd.event.wp_tdm_api_event_dtmf_type == WAN_EC_TONE_PRESENT) {
zap_set_flag_locked(zchan, ZAP_CHANNEL_MUTE);
}
diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update
index ec0a895cdb..aacfc996d3 100644
--- a/libs/sofia-sip/.update
+++ b/libs/sofia-sip/.update
@@ -1 +1 @@
-Mon May 31 09:47:08 EDT 2010
+Wed Nov 3 13:53:34 EDT 2010
diff --git a/libs/sofia-sip/libsofia-sip-ua/nta/nta.c b/libs/sofia-sip/libsofia-sip-ua/nta/nta.c
index 40ee1f8f85..f77cdd3afa 100644
--- a/libs/sofia-sip/libsofia-sip-ua/nta/nta.c
+++ b/libs/sofia-sip/libsofia-sip-ua/nta/nta.c
@@ -1674,7 +1674,7 @@ int agent_set_params(nta_agent_t *agent, tagi_t *tags)
progress = 60 * 1000;
agent->sa_progress = progress;
- if (server_rport > 2)
+ if (server_rport > 3)
server_rport = 1;
else if (server_rport < 0)
server_rport = 1;
@@ -3084,7 +3084,9 @@ int agent_check_request_via(nta_agent_t *agent,
rport = su_sprintf(msg_home(msg), "rport=%u", ntohs(from->su_port));
msg_header_replace_param(msg_home(msg), v->v_common, rport);
}
- else if (agent->sa_server_rport == 2) {
+ else if (agent->sa_server_rport == 2 ||
+ (agent->sa_server_rport == 3 && sip && sip->sip_user_agent &&
+ sip->sip_user_agent->g_string && !strncasecmp(sip->sip_user_agent->g_string, "Polycom", 7))) {
rport = su_sprintf(msg_home(msg), "rport=%u", ntohs(from->su_port));
msg_header_replace_param(msg_home(msg), v->v_common, rport);
}
@@ -8174,9 +8176,12 @@ outgoing_send(nta_outgoing_t *orq, int retransmit)
if (orq->orq_method == sip_method_ack)
;
- else if (!orq->orq_reliable)
- outgoing_set_timer(orq, agent->sa_t1); /* Timer A/E */
- else if (orq->orq_try_tcp_instead && !tport_is_connected(tp))
+ else if (!orq->orq_reliable) {
+ /* race condition on initial t1 timer timeout, set minimum initial timeout to 1000ms */
+ unsigned t1_timer = agent->sa_t1;
+ if (t1_timer < 1000) t1_timer = 1000;
+ outgoing_set_timer(orq, t1_timer); /* Timer A/E */
+ } else if (orq->orq_try_tcp_instead && !tport_is_connected(tp))
outgoing_set_timer(orq, agent->sa_t4); /* Timer N3 */
}
@@ -8660,6 +8665,10 @@ void outgoing_destroy(nta_outgoing_t *orq)
orq->orq_destroyed = 1;
orq->orq_callback = outgoing_default_cb;
orq->orq_magic = NULL;
+
+ if (orq->orq_method != sip_method_invite &&
+ orq->orq_method != sip_method_ack)
+ outgoing_terminate(orq);
}
/** @internal Outgoing transaction timer routine.
diff --git a/libs/stfu/stfu.c b/libs/stfu/stfu.c
index 866ae57616..7c30ab2ad4 100644
--- a/libs/stfu/stfu.c
+++ b/libs/stfu/stfu.c
@@ -38,7 +38,6 @@ struct stfu_queue {
uint32_t array_size;
uint32_t array_len;
uint32_t wr_len;
- uint32_t last_index;
};
typedef struct stfu_queue stfu_queue_t;
@@ -47,10 +46,12 @@ struct stfu_instance {
struct stfu_queue b_queue;
struct stfu_queue *in_queue;
struct stfu_queue *out_queue;
- uint32_t last_ts;
+ struct stfu_frame *last_frame;
+ uint32_t last_wr_ts;
+ uint32_t last_rd_ts;
uint32_t interval;
uint32_t miss_count;
- uint8_t running;
+ uint32_t max_plc;
};
@@ -112,7 +113,7 @@ stfu_status_t stfu_n_resize(stfu_instance_t *i, uint32_t qlen)
return s;
}
-stfu_instance_t *stfu_n_init(uint32_t qlen)
+stfu_instance_t *stfu_n_init(uint32_t qlen, uint32_t max_plc)
{
struct stfu_instance *i;
@@ -125,6 +126,13 @@ stfu_instance_t *stfu_n_init(uint32_t qlen)
stfu_n_init_aqueue(&i->b_queue, qlen);
i->in_queue = &i->a_queue;
i->out_queue = &i->b_queue;
+
+ if (max_plc) {
+ i->max_plc = max_plc;
+ } else {
+ i->max_plc = qlen / 2;
+ }
+
return i;
}
@@ -135,10 +143,9 @@ void stfu_n_reset(stfu_instance_t *i)
i->in_queue->array_len = 0;
i->out_queue->array_len = 0;
i->out_queue->wr_len = 0;
- i->out_queue->last_index = 0;
+ i->last_frame = NULL;
i->miss_count = 0;
- i->last_ts = 0;
- i->running = 0;
+ i->last_wr_ts = 0;
i->miss_count = 0;
i->interval = 0;
}
@@ -197,7 +204,7 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint32_t pt, void
i->in_queue->array_len = 0;
i->out_queue->wr_len = 0;
- i->out_queue->last_index = 0;
+ i->last_frame = NULL;
i->miss_count = 0;
if (stfu_n_process(i, i->out_queue) < 0) {
@@ -222,6 +229,8 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint32_t pt, void
cplen = sizeof(frame->data);
}
+ i->last_rd_ts = ts;
+
memcpy(frame->data, data, cplen);
frame->pt = pt;
frame->ts = ts;
@@ -231,87 +240,71 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint32_t pt, void
return STFU_IT_WORKED;
}
+static int stfu_n_find_frame(stfu_queue_t *queue, uint32_t ts, stfu_frame_t **r_frame, uint32_t *index)
+{
+ uint32_t i = 0;
+ stfu_frame_t *frame = NULL;
+
+ assert(r_frame);
+ assert(index);
+
+ *r_frame = NULL;
+
+ for(i = 0; i < queue->array_len; i++) {
+ frame = &queue->array[i];
+
+ if (frame->ts == ts) {
+ *r_frame = frame;
+ *index = i;
+ frame->was_read = 1;
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i)
{
- uint32_t index, index2;
+ uint32_t index;
uint32_t should_have = 0;
- stfu_frame_t *frame = NULL, *rframe = NULL;
+ stfu_frame_t *rframe = NULL;
if (((i->out_queue->wr_len == i->out_queue->array_len) || !i->out_queue->array_len)) {
return NULL;
}
- if (i->running) {
- should_have = i->last_ts + i->interval;
+ if (i->last_wr_ts) {
+ should_have = i->last_wr_ts + i->interval;
} else {
should_have = i->out_queue->array[0].ts;
}
- for(index = 0; index < i->out_queue->array_len; index++) {
- if (i->out_queue->array[index].was_read) {
- continue;
- }
-
- frame = &i->out_queue->array[index];
-
- if (frame->ts != should_have) {
- unsigned int tried = 0;
- for (index2 = 0; index2 < i->out_queue->array_len; index2++) {
- if (i->out_queue->array[index2].was_read) {
- continue;
- }
- tried++;
- if (i->out_queue->array[index2].ts == should_have) {
- rframe = &i->out_queue->array[index2];
- i->out_queue->last_index = index2;
- goto done;
- }
- }
- for (index2 = 0; index2 < i->in_queue->array_len; index2++) {
- if (i->in_queue->array[index2].was_read) {
- continue;
- }
- tried++;
- if (i->in_queue->array[index2].ts == should_have) {
- rframe = &i->in_queue->array[index2];
- goto done;
- }
- }
-
- i->miss_count++;
-
- if (i->miss_count > 10 || (i->in_queue->array_len == i->in_queue->array_size) || tried >= i->in_queue->array_size) {
- i->running = 0;
- i->interval = 0;
- i->out_queue->wr_len = i->out_queue->array_size;
- return NULL;
- }
-
- i->last_ts = should_have;
- rframe = &i->out_queue->int_frame;
- rframe->dlen = i->out_queue->array[i->out_queue->last_index].dlen;
- /* poor man's plc.. Copy the last frame, but we flag it so you can use a better one if you wish */
- memcpy(rframe->data, i->out_queue->array[i->out_queue->last_index].data, rframe->dlen);
- rframe->ts = should_have;
- i->out_queue->wr_len++;
- i->running = 1;
- return rframe;
- } else {
- rframe = &i->out_queue->array[index];
- i->out_queue->last_index = index;
- goto done;
- }
- }
-
-done:
-
- if (rframe) {
+ if (stfu_n_find_frame(i->out_queue, should_have, &rframe, &index) || stfu_n_find_frame(i->in_queue, should_have, &rframe, &index)) {
+ i->last_frame = rframe;
i->out_queue->wr_len++;
- i->last_ts = rframe->ts;
+ i->last_wr_ts = rframe->ts;
rframe->was_read = 1;
- i->running = 1;
i->miss_count = 0;
- }
+ } else {
+ i->last_wr_ts = should_have;
+ rframe = &i->out_queue->int_frame;
+
+ if (i->last_frame && i->last_frame != rframe) {
+ rframe->dlen = i->last_frame->dlen;
+ /* poor man's plc.. Copy the last frame, but we flag it so you can use a better one if you wish */
+ memcpy(rframe->data, i->last_frame->data, rframe->dlen);
+ }
+
+ rframe->ts = should_have;
+
+ if (++i->miss_count > i->max_plc) {
+ i->interval = 0;
+ i->out_queue->wr_len = i->out_queue->array_size;
+ i->last_wr_ts = 0;
+ rframe = NULL;
+ }
+ }
return rframe;
}
diff --git a/libs/stfu/stfu.h b/libs/stfu/stfu.h
index 17f01e3256..900db6f9ac 100644
--- a/libs/stfu/stfu.h
+++ b/libs/stfu/stfu.h
@@ -96,7 +96,7 @@ typedef struct {
void stfu_n_report(stfu_instance_t *i, stfu_report_t *r);
void stfu_n_destroy(stfu_instance_t **i);
-stfu_instance_t *stfu_n_init(uint32_t qlen);
+stfu_instance_t *stfu_n_init(uint32_t qlen, uint32_t max_plc);
stfu_status_t stfu_n_resize(stfu_instance_t *i, uint32_t qlen);
stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint32_t pt, void *data, size_t datalen, int last);
stfu_frame_t *stfu_n_read_a_frame(stfu_instance_t *i);
diff --git a/libs/win32/Sound_Files/16khz.2008.vcproj b/libs/win32/Sound_Files/16khz.2008.vcproj
index d8f80bbde6..026987197d 100644
--- a/libs/win32/Sound_Files/16khz.2008.vcproj
+++ b/libs/win32/Sound_Files/16khz.2008.vcproj
@@ -11,6 +11,9 @@
+
@@ -33,7 +36,7 @@
/>
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/win32/Sound_Files/16khzmusic.2008.vcproj b/libs/win32/Sound_Files/16khzmusic.2008.vcproj
index 932d1c5b4f..c09a5aec90 100644
--- a/libs/win32/Sound_Files/16khzmusic.2008.vcproj
+++ b/libs/win32/Sound_Files/16khzmusic.2008.vcproj
@@ -11,6 +11,9 @@
+
@@ -58,6 +61,51 @@
CommandLine="xcopy "$(SolutionDir)libs\sounds\music\16000\*.*" "$(OutDir)\sounds\music\16000" /C /D /Y /S /I
"
/>
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/win32/Sound_Files/32khz.2008.vcproj b/libs/win32/Sound_Files/32khz.2008.vcproj
index d2ac0af2e3..cdf3fa93fc 100644
--- a/libs/win32/Sound_Files/32khz.2008.vcproj
+++ b/libs/win32/Sound_Files/32khz.2008.vcproj
@@ -11,6 +11,9 @@
+
@@ -33,7 +36,7 @@
/>
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/win32/Sound_Files/32khzmusic.2008.vcproj b/libs/win32/Sound_Files/32khzmusic.2008.vcproj
index aafc1ef50d..7ff356e038 100644
--- a/libs/win32/Sound_Files/32khzmusic.2008.vcproj
+++ b/libs/win32/Sound_Files/32khzmusic.2008.vcproj
@@ -11,6 +11,9 @@
+
@@ -58,6 +61,51 @@
CommandLine="xcopy "$(SolutionDir)libs\sounds\music\32000\*.*" "$(OutDir)\sounds\music\32000" /C /D /Y /S /I"
/>
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/win32/Sound_Files/8khz.2008.vcproj b/libs/win32/Sound_Files/8khz.2008.vcproj
index 413c47dc63..5f6d36803e 100644
--- a/libs/win32/Sound_Files/8khz.2008.vcproj
+++ b/libs/win32/Sound_Files/8khz.2008.vcproj
@@ -11,6 +11,9 @@
+
@@ -33,7 +36,7 @@
/>
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/win32/Sound_Files/8khzmusic.2008.vcproj b/libs/win32/Sound_Files/8khzmusic.2008.vcproj
index 2e46ecff8e..a89d14f9f0 100644
--- a/libs/win32/Sound_Files/8khzmusic.2008.vcproj
+++ b/libs/win32/Sound_Files/8khzmusic.2008.vcproj
@@ -11,6 +11,9 @@
+
@@ -58,6 +61,51 @@
CommandLine="xcopy "$(SolutionDir)libs\sounds\music\8000\*.*" "$(OutDir)\sounds\music\8000" /C /D /Y /S /I
"
/>
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/libs/win32/json/libjson.2008.vcproj b/libs/win32/json/libjson.2008.vcproj
index 91a371b48c..5c09e5413c 100644
--- a/libs/win32/json/libjson.2008.vcproj
+++ b/libs/win32/json/libjson.2008.vcproj
@@ -172,7 +172,7 @@
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="."
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB;HAVE_CONFIG_H;HAVE_STDARG_H;STDC_HEADERS"
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;HAVE_CONFIG_H;HAVE_STDARG_H;STDC_HEADERS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
@@ -236,7 +236,7 @@
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="."
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB;HAVE_CONFIG_H;HAVE_STDARG_H;STDC_HEADERS"
+ PreprocessorDefinitions="WIN32;NDEBUG;_LIB;HAVE_CONFIG_H;HAVE_STDARG_H;STDC_HEADERS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
diff --git a/libs/win32/json/libjson.2010.vcxproj b/libs/win32/json/libjson.2010.vcxproj
index 5846ff3e92..a371ac2f46 100644
--- a/libs/win32/json/libjson.2010.vcxproj
+++ b/libs/win32/json/libjson.2010.vcxproj
@@ -96,7 +96,7 @@
MaxSpeed
true
.;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_LIB;HAVE_CONFIG_H;HAVE_STDARG_H;STDC_HEADERS;%(PreprocessorDefinitions)
+ WIN32;NDEBUG;_LIB;HAVE_CONFIG_H;HAVE_STDARG_H;STDC_HEADERS;%(PreprocessorDefinitions)
MultiThreadedDLL
true
Level3
@@ -110,7 +110,7 @@
MaxSpeed
true
.;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_LIB;HAVE_CONFIG_H;HAVE_STDARG_H;STDC_HEADERS;%(PreprocessorDefinitions)
+ WIN32;NDEBUG;_LIB;HAVE_CONFIG_H;HAVE_STDARG_H;STDC_HEADERS;%(PreprocessorDefinitions)
MultiThreadedDLL
true
Level3
diff --git a/libs/win32/openssl/libeay32.2008.vcproj b/libs/win32/openssl/libeay32.2008.vcproj
index 84cc80b4ee..5681c7cfb9 100644
--- a/libs/win32/openssl/libeay32.2008.vcproj
+++ b/libs/win32/openssl/libeay32.2008.vcproj
@@ -32,7 +32,7 @@
>
- copy /Y $(ProjectDir)opensslconf.h $(ProjectDir)..\..\openssl-1.0.0a\include\openssl\opensslconf.h
-copy /Y $(ProjectDir)applink.c $(ProjectDir)..\..\openssl-1.0.0a\include\openssl\applink.c
-copy /Y $(ProjectDir)buildinf.h $(ProjectDir)..\..\openssl-1.0.0a\crypto\buildinf.h
-copy /Y $(ProjectDir)libeay32.def $(ProjectDir)..\..\openssl-1.0.0a\libeay32.def
+ copy /Y "$(ProjectDir)opensslconf.h" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\opensslconf.h"
+copy /Y "$(ProjectDir)applink.c" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\applink.c"
+copy /Y "$(ProjectDir)buildinf.h" "$(ProjectDir)..\..\openssl-1.0.0a\crypto\buildinf.h"
+copy /Y "$(ProjectDir)libeay32.def" "$(ProjectDir)..\..\openssl-1.0.0a\libeay32.def"
if not exist "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\e_os.h" xcopy "$(ProjectDir)\include\*.*" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\" /C /Y /S
@@ -115,10 +115,10 @@ if not exist "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\e_os.h" xcopy "$
- copy /Y $(ProjectDir)opensslconf.h $(ProjectDir)..\..\openssl-1.0.0a\include\openssl\opensslconf.h
-copy /Y $(ProjectDir)applink.c $(ProjectDir)..\..\openssl-1.0.0a\include\openssl\applink.c
-copy /Y $(ProjectDir)buildinf.h $(ProjectDir)..\..\openssl-1.0.0a\crypto\buildinf.h
-copy /Y $(ProjectDir)libeay32.def $(ProjectDir)..\..\openssl-1.0.0a\libeay32.def
+ copy /Y "$(ProjectDir)opensslconf.h" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\opensslconf.h"
+copy /Y "$(ProjectDir)applink.c" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\applink.c"
+copy /Y "$(ProjectDir)buildinf.h" "$(ProjectDir)..\..\openssl-1.0.0a\crypto\buildinf.h"
+copy /Y "$(ProjectDir)libeay32.def" "$(ProjectDir)..\..\openssl-1.0.0a\libeay32.def"
if not exist "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\e_os.h" xcopy "$(ProjectDir)\include\*.*" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\" /C /Y /S
@@ -151,10 +151,10 @@ if not exist "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\e_os.h" xcopy "$
- copy /Y $(ProjectDir)opensslconf.h $(ProjectDir)..\..\openssl-1.0.0a\include\openssl\opensslconf.h
-copy /Y $(ProjectDir)applink.c $(ProjectDir)..\..\openssl-1.0.0a\include\openssl\applink.c
-copy /Y $(ProjectDir)buildinf.h $(ProjectDir)..\..\openssl-1.0.0a\crypto\buildinf.h
-copy /Y $(ProjectDir)libeay32.def $(ProjectDir)..\..\openssl-1.0.0a\libeay32.def
+ copy /Y "$(ProjectDir)opensslconf.h" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\opensslconf.h"
+copy /Y "$(ProjectDir)applink.c" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\applink.c"
+copy /Y "$(ProjectDir)buildinf.h" "$(ProjectDir)..\..\openssl-1.0.0a\crypto\buildinf.h"
+copy /Y "$(ProjectDir)libeay32.def" "$(ProjectDir)..\..\openssl-1.0.0a\libeay32.def"
if not exist "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\e_os.h" xcopy "$(ProjectDir)\include\*.*" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\" /C /Y /S
@@ -185,10 +185,10 @@ if not exist "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\e_os.h" xcopy "$
- copy /Y $(ProjectDir)opensslconf.h $(ProjectDir)..\..\openssl-1.0.0a\include\openssl\opensslconf.h
-copy /Y $(ProjectDir)applink.c $(ProjectDir)..\..\openssl-1.0.0a\include\openssl\applink.c
-copy /Y $(ProjectDir)buildinf.h $(ProjectDir)..\..\openssl-1.0.0a\crypto\buildinf.h
-copy /Y $(ProjectDir)libeay32.def $(ProjectDir)..\..\openssl-1.0.0a\libeay32.def
+ copy /Y "$(ProjectDir)opensslconf.h" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\opensslconf.h"
+copy /Y "$(ProjectDir)applink.c" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\applink.c"
+copy /Y "$(ProjectDir)buildinf.h" "$(ProjectDir)..\..\openssl-1.0.0a\crypto\buildinf.h"
+copy /Y "$(ProjectDir)libeay32.def" "$(ProjectDir)..\..\openssl-1.0.0a\libeay32.def"
if not exist "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\e_os.h" xcopy "$(ProjectDir)\include\*.*" "$(ProjectDir)..\..\openssl-1.0.0a\include\openssl\" /C /Y /S
diff --git a/libs/win32/openssl/ssleay32.2008.vcproj b/libs/win32/openssl/ssleay32.2008.vcproj
index 1d8654a882..fef7e5c947 100644
--- a/libs/win32/openssl/ssleay32.2008.vcproj
+++ b/libs/win32/openssl/ssleay32.2008.vcproj
@@ -29,7 +29,7 @@
>
- copy /Y $(ProjectDir)ssleay32.def $(ProjectDir)..\..\openssl-1.0.0a\ssleay32.def
+ copy /Y "$(ProjectDir)ssleay32.def" "$(ProjectDir)..\..\openssl-1.0.0a\ssleay32.def"
/Gs0 %(AdditionalOptions)
@@ -107,7 +107,7 @@
- copy /Y $(ProjectDir)ssleay32.def $(ProjectDir)..\..\openssl-1.0.0a\ssleay32.def
+ copy /Y "$(ProjectDir)ssleay32.def" "$(ProjectDir)..\..\openssl-1.0.0a\ssleay32.def"
/Gs0 %(AdditionalOptions)
@@ -134,7 +134,7 @@
- copy /Y $(ProjectDir)ssleay32.def $(ProjectDir)..\..\openssl-1.0.0a\ssleay32.def
+ copy /Y "$(ProjectDir)ssleay32.def" "$(ProjectDir)..\..\openssl-1.0.0a\ssleay32.def"
X64
@@ -164,7 +164,7 @@
- copy /Y $(ProjectDir)ssleay32.def $(ProjectDir)..\..\openssl-1.0.0a\ssleay32.def
+ copy /Y "$(ProjectDir)ssleay32.def" "$(ProjectDir)..\..\openssl-1.0.0a\ssleay32.def"
X64
diff --git a/scripts/lua/zrtp_agent.lua b/scripts/lua/zrtp_agent.lua
index c657359fba..2ce8b3e0a6 100644
--- a/scripts/lua/zrtp_agent.lua
+++ b/scripts/lua/zrtp_agent.lua
@@ -8,7 +8,7 @@ session:sleep(3000);
-- Give the agent time to bring up ZRTP.
local zrtp_secure_media_confirmed = session:getVariable("zrtp_secure_media_confirmed_audio");
-local zrtp_new_user_enrolled = session:getVariable("zrtp_new_user_enrolled");
+local zrtp_new_user_enrolled = session:getVariable("zrtp_new_user_enrolled_audio");
local zrtp_already_enrolled = session:getVariable("zrtp_already_enrolled_audio");
if zrtp_secure_media_confirmed == "true" then
diff --git a/src/fs_encode.c b/src/fs_encode.c
new file mode 100644
index 0000000000..9517802600
--- /dev/null
+++ b/src/fs_encode.c
@@ -0,0 +1,246 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2010, Anthony Minessale II
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Mathieu Rene
+ *
+ * fs_encode.c -- Encode a native file
+ *
+ */
+
+#ifndef _XOPEN_SOURCE
+#define _XOPEN_SOURCE 600
+#endif
+
+#ifndef WIN32
+#ifdef HAVE_SETRLIMIT
+#include
+#endif
+#endif
+
+#include
+#include
+
+
+/* Picky compiler */
+#ifdef __ICC
+#pragma warning (disable:167)
+#endif
+
+int main(int argc, char *argv[])
+{
+ int r = 1;
+ switch_bool_t verbose = SWITCH_FALSE;
+ const char *err = NULL;
+ int i;
+ char *extra_modules[100] = { 0 };
+ int extra_modules_count = 0;
+ int cmd_fail = 0;
+ const char *fmtp = "";
+ int ptime = 20;
+ const char *input, *output, *format = NULL;
+ int channels = 1;
+ int rate = 8000;
+ switch_file_handle_t fh_input = { 0 }, fh_output = { 0 };
+ switch_codec_t codec = { 0 };
+ char buf[2048];
+ switch_size_t len = sizeof(buf)/2;
+ switch_memory_pool_t *pool;
+ int bitrate = 0;
+ int blocksize;
+
+ for (i = 1; i < argc; i++) {
+ if (argv[i][0] == '-') {
+ switch(argv[i][1]) {
+ case 'l':
+ i++;
+ /* Load extra modules */
+ if (strchr(argv[i], ',')) {
+ extra_modules_count = switch_split(argv[i], ',', extra_modules);
+ } else {
+ extra_modules_count = 1;
+ extra_modules[0] = argv[i];
+ }
+ break;
+ case 'f':
+ fmtp = argv[++i];
+ break;
+ case 'p':
+ ptime = atoi(argv[++i]);
+ break;
+ case 'r':
+ rate = atoi(argv[++i]);
+ break;
+ case 'b':
+ bitrate = atoi(argv[++i]);
+ break;
+ case 'v':
+ verbose = SWITCH_TRUE;
+ break;
+ default:
+ printf("Command line option not recognized: %s\n", argv[i]);
+ cmd_fail = 1;
+ }
+ } else {
+ break;
+ }
+ }
+
+ if (argc - i < 2 || cmd_fail) {
+ goto usage;
+ }
+
+ input = argv[i++];
+ output = argv[i++];
+ if (zstr(input) || zstr(output) || !(format = strchr(output, '.'))) {
+ goto usage;
+ }
+
+ format++;
+
+ if (switch_core_init(SCF_MINIMAL, verbose, &err) != SWITCH_STATUS_SUCCESS) {
+ fprintf(stderr, "Cannot init core [%s]\n", err);
+ goto end;
+ }
+
+ switch_loadable_module_init(SWITCH_FALSE);
+
+ for (i = 0; i < extra_modules_count; i++) {
+ if (switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) extra_modules[i], SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) {
+ fprintf(stderr, "Cannot init %s [%s]\n", extra_modules[i], err);
+ goto end;
+ }
+ }
+
+ if (switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) "mod_sndfile", SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) {
+ fprintf(stderr, "Cannot init mod_sndfile [%s]\n", err);
+ goto end;
+ }
+
+ if (switch_loadable_module_load_module((char *) SWITCH_GLOBAL_dirs.mod_dir, (char *) "mod_native_file", SWITCH_TRUE, &err) != SWITCH_STATUS_SUCCESS) {
+ fprintf(stderr, "Cannot init mod_native_file [%s]\n", err);
+ goto end;
+ }
+
+ switch_core_new_memory_pool(&pool);
+ if (verbose) {
+ fprintf(stderr, "Opening file %s\n", input);
+ }
+ if (switch_core_file_open(&fh_input, input, channels, rate, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL) != SWITCH_STATUS_SUCCESS) {
+ fprintf(stderr, "Couldn't open %s\n", input);
+ goto end;
+ }
+
+
+ if (verbose) {
+ fprintf(stderr, "Opening file %s\n", output);
+ }
+ if (switch_core_file_open(&fh_output, output, channels, rate, SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_NATIVE, NULL) != SWITCH_STATUS_SUCCESS) {
+ fprintf(stderr, "Couldn't open %s\n", output);
+ goto end;
+ }
+
+ if (switch_test_flag(&fh_input, SWITCH_FILE_NATIVE)) {
+ fprintf(stderr, "Input as native file is not implemented\n");
+ goto end;
+ }
+
+ if (switch_core_codec_init_with_bitrate(&codec, format, fmtp, rate, ptime, channels, bitrate, SWITCH_CODEC_FLAG_ENCODE, NULL, pool) != SWITCH_STATUS_SUCCESS) {
+ fprintf(stderr, "Couldn't initialize codec for %s@%dh@%di\n", format, rate, ptime);
+ goto end;
+ }
+
+ blocksize = len = (rate*ptime)/1000;
+ switch_assert(sizeof(buf) >= len * 2);
+
+ if (verbose) {
+ fprintf(stderr, "Frame size is %d\n", blocksize);
+ }
+
+ while (switch_core_file_read(&fh_input, buf, &len) == SWITCH_STATUS_SUCCESS) {
+ char encode_buf[2048];
+ uint32_t encoded_len = sizeof(buf);
+ uint32_t encoded_rate = rate;
+ unsigned int flags = 0;
+
+ if (switch_core_codec_encode(&codec, NULL, buf, len*2, rate, encode_buf, &encoded_len, &encoded_rate, &flags) != SWITCH_STATUS_SUCCESS) {
+ fprintf(stderr, "Codec encoder error\n");
+ goto end;
+ }
+
+ len = encoded_len;
+
+ if (switch_core_file_write(&fh_output, encode_buf, &len) != SWITCH_STATUS_SUCCESS) {
+ fprintf(stderr, "Write error\n");
+ goto end;
+ }
+
+ if (len != encoded_len) {
+ printf("Short write: wrote %"SWITCH_SIZE_T_FMT"/%d bytes\n", len, encoded_len);
+ }
+
+ len = blocksize;
+ }
+
+ r = 0;
+
+end:
+
+ switch_core_codec_destroy(&codec);
+
+ if (fh_input.file_interface) {
+ switch_core_file_close(&fh_input);
+ }
+
+ if (fh_output.file_interface) {
+ switch_core_file_close(&fh_output);
+ }
+
+ if (pool) {
+ switch_core_destroy_memory_pool(&pool);
+ }
+ switch_core_destroy();
+ return r;
+usage:
+ printf("Usage: %s [options] input output\n\n", argv[0]);
+ printf("The output must end in the format, e.g., myfile.SPEEX\n");
+ printf("\t\t -l module[,module]\t Load additional modules (comma-separated)\n");
+ printf("\t\t -f format\t\t fmtp to pass to the codec\n");
+ printf("\t\t -p ptime\t\t ptime to use while encoding\n");
+ printf("\t\t -r rate\t\t sampling rate\n");
+ printf("\t\t -b bitrate\t\t codec bitrate (if supported)\n");
+ printf("\t\t -v\t\t\t verbose\n");
+ return 1;
+}
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c
+ * indent-tabs-mode:t
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
+ */
diff --git a/src/include/private/switch_core_pvt.h b/src/include/private/switch_core_pvt.h
index ea02f22fa0..3df9001b0c 100644
--- a/src/include/private/switch_core_pvt.h
+++ b/src/include/private/switch_core_pvt.h
@@ -193,6 +193,11 @@ struct switch_media_bug {
struct switch_media_bug *next;
};
+typedef enum {
+ DBTYPE_DEFAULT = 0,
+ DBTYPE_MSSQL = 1,
+} switch_dbtype_t;
+
struct switch_runtime {
switch_time_t initiated;
switch_time_t reference;
@@ -237,6 +242,7 @@ struct switch_runtime {
double min_idle_time;
int sql_buffer_len;
int max_sql_buffer_len;
+ switch_dbtype_t odbc_dbtype;
};
extern struct switch_runtime runtime;
diff --git a/src/include/switch_core_event_hook.h b/src/include/switch_core_event_hook.h
index b60246cf24..575786f5ce 100644
--- a/src/include/switch_core_event_hook.h
+++ b/src/include/switch_core_event_hook.h
@@ -45,6 +45,7 @@ typedef struct switch_io_event_hook_kill_channel switch_io_event_hook_kill_chann
typedef struct switch_io_event_hook_send_dtmf switch_io_event_hook_send_dtmf_t;
typedef struct switch_io_event_hook_recv_dtmf switch_io_event_hook_recv_dtmf_t;
typedef struct switch_io_event_hook_state_change switch_io_event_hook_state_change_t;
+typedef struct switch_io_event_hook_state_run switch_io_event_hook_state_run_t;
typedef struct switch_io_event_hook_resurrect_session switch_io_event_hook_resurrect_session_t;
typedef switch_status_t (*switch_outgoing_channel_hook_t)
(switch_core_session_t *, switch_event_t *, switch_caller_profile_t *, switch_core_session_t *, switch_originate_flag_t);
@@ -58,6 +59,7 @@ typedef switch_status_t (*switch_kill_channel_hook_t) (switch_core_session_t *,
typedef switch_status_t (*switch_send_dtmf_hook_t) (switch_core_session_t *, const switch_dtmf_t *, switch_dtmf_direction_t direction);
typedef switch_status_t (*switch_recv_dtmf_hook_t) (switch_core_session_t *, const switch_dtmf_t *, switch_dtmf_direction_t direction);
typedef switch_status_t (*switch_state_change_hook_t) (switch_core_session_t *);
+typedef switch_status_t (*switch_state_run_hook_t) (switch_core_session_t *);
typedef switch_call_cause_t (*switch_resurrect_session_hook_t) (switch_core_session_t **, switch_memory_pool_t **, void *);
/*! \brief Node in which to store custom receive message callback hooks */
@@ -136,6 +138,13 @@ struct switch_io_event_hook_state_change {
struct switch_io_event_hook_state_change *next;
};
+/*! \brief Node in which to store state run callback hooks */
+struct switch_io_event_hook_state_run {
+ /*! the state run channel callback hook */
+ switch_state_run_hook_t state_run;
+ struct switch_io_event_hook_state_run *next;
+};
+
struct switch_io_event_hook_resurrect_session {
switch_resurrect_session_hook_t resurrect_session;
@@ -166,6 +175,7 @@ struct switch_io_event_hooks {
switch_io_event_hook_recv_dtmf_t *recv_dtmf;
/*! a list of state change hooks */
switch_io_event_hook_state_change_t *state_change;
+ switch_io_event_hook_state_run_t *state_run;
switch_io_event_hook_resurrect_session_t *resurrect_session;
};
@@ -218,6 +228,7 @@ NEW_HOOK_DECL_ADD_P(outgoing_channel);
NEW_HOOK_DECL_ADD_P(receive_message);
NEW_HOOK_DECL_ADD_P(receive_event);
NEW_HOOK_DECL_ADD_P(state_change);
+NEW_HOOK_DECL_ADD_P(state_run);
NEW_HOOK_DECL_ADD_P(read_frame);
NEW_HOOK_DECL_ADD_P(write_frame);
NEW_HOOK_DECL_ADD_P(video_read_frame);
@@ -231,6 +242,7 @@ NEW_HOOK_DECL_REM_P(outgoing_channel);
NEW_HOOK_DECL_REM_P(receive_message);
NEW_HOOK_DECL_REM_P(receive_event);
NEW_HOOK_DECL_REM_P(state_change);
+NEW_HOOK_DECL_REM_P(state_run);
NEW_HOOK_DECL_REM_P(read_frame);
NEW_HOOK_DECL_REM_P(write_frame);
NEW_HOOK_DECL_REM_P(video_read_frame);
diff --git a/src/include/switch_event.h b/src/include/switch_event.h
index 1864e397e6..41bc75cada 100644
--- a/src/include/switch_event.h
+++ b/src/include/switch_event.h
@@ -345,11 +345,15 @@ SWITCH_DECLARE(switch_status_t) switch_event_create_pres_in_detailed(_In_z_ char
*/
#define switch_event_create(event, id) switch_event_create_subclass(event, id, SWITCH_EVENT_SUBCLASS_ANY)
- static inline switch_status_t switch_event_create_plain(switch_event_t **event, switch_event_types_t event_id)
+static inline switch_status_t switch_event_create_plain(switch_event_t **event, switch_event_types_t event_id)
{
switch_status_t status = switch_event_create(event, SWITCH_EVENT_CLONE);
if (status == SWITCH_STATUS_SUCCESS) {
(*event)->event_id = event_id;
+
+ if (event_id == SWITCH_EVENT_REQUEST_PARAMS || event_id == SWITCH_EVENT_CHANNEL_DATA) {
+ (*event)->flags |= EF_UNIQ_HEADERS;
+ }
}
return status;
diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h
index fb023848ec..249ac63a58 100644
--- a/src/include/switch_ivr.h
+++ b/src/include/switch_ivr.h
@@ -840,11 +840,13 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_say_ip(switch_core_session_t *session
SWITCH_DECLARE(switch_status_t) switch_ivr_set_user(switch_core_session_t *session, const char *data);
SWITCH_DECLARE(switch_status_t) switch_ivr_sound_test(switch_core_session_t *session);
-SWITCH_DECLARE(void) switch_process_import(switch_core_session_t *session, switch_channel_t *peer_channel, const char *varname);
+SWITCH_DECLARE(void) switch_process_import(switch_core_session_t *session, switch_channel_t *peer_channel, const char *varname, const char *prefix);
SWITCH_DECLARE(switch_bool_t) switch_ivr_uuid_exists(const char *uuid);
+SWITCH_DECLARE(void) switch_ivr_dmachine_set_match_callback(switch_ivr_dmachine_t *dmachine, switch_ivr_dmachine_callback_t match_callback);
+SWITCH_DECLARE(void) switch_ivr_dmachine_set_nonmatch_callback(switch_ivr_dmachine_t *dmachine, switch_ivr_dmachine_callback_t nonmatch_callback);
SWITCH_DECLARE(switch_status_t) switch_ivr_dmachine_create(switch_ivr_dmachine_t **dmachine_p,
const char *name,
switch_memory_pool_t *pool,
diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h
index a6013a9386..ae0ce900a9 100644
--- a/src/include/switch_module_interfaces.h
+++ b/src/include/switch_module_interfaces.h
@@ -134,6 +134,7 @@ typedef switch_status_t (*switch_io_send_dtmf_t) (switch_core_session_t *, const
typedef switch_status_t (*switch_io_receive_message_t) (switch_core_session_t *, switch_core_session_message_t *);
typedef switch_status_t (*switch_io_receive_event_t) (switch_core_session_t *, switch_event_t *);
typedef switch_status_t (*switch_io_state_change_t) (switch_core_session_t *);
+typedef switch_status_t (*switch_io_state_run_t) (switch_core_session_t *);
typedef switch_status_t (*switch_io_read_video_frame_t) (switch_core_session_t *, switch_frame_t **, switch_io_flag_t, int);
typedef switch_status_t (*switch_io_write_video_frame_t) (switch_core_session_t *, switch_frame_t *, switch_io_flag_t, int);
typedef switch_call_cause_t (*switch_io_resurrect_session_t) (switch_core_session_t **, switch_memory_pool_t **, void *);
@@ -174,6 +175,8 @@ struct switch_io_routines {
switch_io_read_video_frame_t read_video_frame;
/*! write a video frame to a session */
switch_io_write_video_frame_t write_video_frame;
+ /*! change a sessions channel run state */
+ switch_io_state_run_t state_run;
/*! resurrect a session */
switch_io_resurrect_session_t resurrect_session;
void *padding[10];
diff --git a/src/include/switch_odbc.h b/src/include/switch_odbc.h
index 81039f113d..b8d4bc2f17 100644
--- a/src/include/switch_odbc.h
+++ b/src/include/switch_odbc.h
@@ -58,6 +58,8 @@ SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_exec(switch_odbc_handle_
char **err);
SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_exec_string(switch_odbc_handle_t *handle, const char *sql, char *resbuf, size_t len, char **err);
SWITCH_DECLARE(switch_bool_t) switch_odbc_available(void);
+SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_SQLSetAutoCommitAttr(switch_odbc_handle_t *handle, switch_bool_t on);
+SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_SQLEndTran(switch_odbc_handle_t *handle, switch_bool_t commit);
SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_statement_handle_free(switch_odbc_statement_handle_t *stmt);
/*!
diff --git a/src/include/switch_types.h b/src/include/switch_types.h
index b1fc627354..c01638089f 100644
--- a/src/include/switch_types.h
+++ b/src/include/switch_types.h
@@ -596,7 +596,7 @@ typedef enum {
*/
- RTP_BUG_IGNORE_MARK_BIT = (1 << 2)
+ RTP_BUG_IGNORE_MARK_BIT = (1 << 2),
/*
A Huawei SBC has been discovered that sends the mark bit on every single RTP packet.
@@ -606,6 +606,34 @@ typedef enum {
*/
+
+ RTP_BUG_SEND_LINEAR_TIMESTAMPS = (1 << 3),
+
+ /*
+ Our friends at Sonus get real mad when the timestamps are not in perfect sequence even during periods of silence.
+ With this flag, we will only increment the timestamp when write packets even if they are eons apart.
+
+ */
+
+ RTP_BUG_START_SEQ_AT_ZERO = (1 << 4),
+
+ /*
+ Our friends at Sonus also get real mad if the sequence number does not start at 0.
+ Typically, we set this to a random starting value for your saftey.
+ This is a security risk you take upon yourself when you enable this flag.
+ */
+
+
+ RTP_BUG_NEVER_SEND_MARKER = (1 << 5),
+
+ /*
+ Our friends at Sonus are on a roll, They also get easily dumbfounded by marker bits.
+ This flag will never send any. Sheesh....
+ */
+
+
+
+
} switch_rtp_bug_flag_t;
@@ -840,6 +868,7 @@ typedef enum {
SWITCH_STATUS_IGNORE,
SWITCH_STATUS_TOO_SMALL,
SWITCH_STATUS_FOUND,
+ SWITCH_STATUS_CONTINUE,
SWITCH_STATUS_NOT_INITALIZED
} switch_status_t;
@@ -1063,6 +1092,7 @@ typedef enum {
CF_CONSUME_ON_ORIGINATE,
CF_PASSTHRU_PTIME_MISMATCH,
CF_BRIDGE_NOWRITE,
+ CF_RECOVERED,
/* WARNING: DO NOT ADD ANY FLAGS BELOW THIS LINE */
CF_FLAG_MAX
} switch_channel_flag_t;
@@ -1266,7 +1296,8 @@ typedef enum {
SMBF_STEREO = (1 << 5),
SMBF_ANSWER_REQ = (1 << 6),
SMBF_THREAD_LOCK = (1 << 7),
- SMBF_PRUNE = (1 << 8)
+ SMBF_PRUNE = (1 << 8),
+ SMBF_NO_PAUSE = (1 << 9)
} switch_media_bug_flag_enum_t;
typedef uint32_t switch_media_bug_flag_t;
@@ -1304,7 +1335,8 @@ typedef enum {
SWITCH_FILE_CALLBACK = (1 << 12),
SWITCH_FILE_DONE = (1 << 13),
SWITCH_FILE_BUFFER_DONE = (1 << 14),
- SWITCH_FILE_WRITE_APPEND = (1 << 15)
+ SWITCH_FILE_WRITE_APPEND = (1 << 15),
+ SWITCH_FILE_WRITE_OVER = (1 << 16)
} switch_file_flag_enum_t;
typedef uint32_t switch_file_flag_t;
diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h
index 945583ee07..e2a7335226 100644
--- a/src/include/switch_utils.h
+++ b/src/include/switch_utils.h
@@ -54,6 +54,13 @@ SWITCH_DECLARE(int) switch_isspace(int c);
SWITCH_DECLARE(int) switch_isupper(int c);
SWITCH_DECLARE(int) switch_isxdigit(int c);
+typedef union{
+ uint32_t v4;
+ struct in6_addr v6;
+} ip_t;
+
+SWITCH_DECLARE(switch_bool_t) switch_testv6_subnet(ip_t _ip, ip_t _net, ip_t _mask);
+
#define switch_goto_status(_status, _label) status = _status; goto _label
#define switch_goto_int(_n, _i, _label) _n = _i; goto _label
#define switch_samples_per_packet(rate, interval) ((uint32_t)((float)rate / (1000.0f / (float)interval)))
@@ -322,7 +329,7 @@ SWITCH_DECLARE(unsigned char) switch_char_to_rfc2833(char key);
\param key the key to test
\return TRUE or FALSE
*/
-#define is_dtmf(key) ((key > 47 && key < 58) || (key > 64 && key < 69) || (key > 96 && key < 101) || key == 35 || key == 42 || key == 87 || key == 119 || key == 70)
+#define is_dtmf(key) ((key > 47 && key < 58) || (key > 64 && key < 69) || (key > 96 && key < 101) || key == 35 || key == 42 || key == 87 || key == 119 || key == 70 || key == 102)
#define end_of(_s) *(*_s == '\0' ? _s : _s + strlen(_s) - 1)
#define end_of_p(_s) (*_s == '\0' ? _s : _s + strlen(_s) - 1)
@@ -694,7 +701,7 @@ SWITCH_DECLARE(char *) switch_find_end_paren(const char *s, char open, char clos
-SWITCH_DECLARE(int) switch_parse_cidr(const char *string, uint32_t *ip, uint32_t *mask, uint32_t *bitp);
+SWITCH_DECLARE(int) switch_parse_cidr(const char *string, ip_t *ip, ip_t *mask, uint32_t *bitp);
SWITCH_DECLARE(switch_status_t) switch_network_list_create(switch_network_list_t **list, const char *name, switch_bool_t default_type,
switch_memory_pool_t *pool);
SWITCH_DECLARE(switch_status_t) switch_network_list_add_cidr_token(switch_network_list_t *list, const char *cidr_str, switch_bool_t ok, const char *token);
@@ -703,6 +710,7 @@ SWITCH_DECLARE(switch_status_t) switch_network_list_add_cidr_token(switch_networ
SWITCH_DECLARE(switch_status_t) switch_network_list_add_host_mask(switch_network_list_t *list, const char *host, const char *mask_str, switch_bool_t ok);
SWITCH_DECLARE(switch_bool_t) switch_network_list_validate_ip_token(switch_network_list_t *list, uint32_t ip, const char **token);
+SWITCH_DECLARE(switch_bool_t) switch_network_list_validate_ip6_token(switch_network_list_t *list, ip_t ip, const char **token);
#define switch_network_list_validate_ip(_list, _ip) switch_network_list_validate_ip_token(_list, _ip, NULL);
#define switch_test_subnet(_ip, _net, _mask) (_mask ? ((_net & _mask) == (_ip & _mask)) : _net ? _net == _ip : 1)
@@ -711,7 +719,7 @@ SWITCH_DECLARE(int) switch_inet_pton(int af, const char *src, void *dst);
SWITCH_DECLARE(const char *) switch_dow_int2str(int val);
SWITCH_DECLARE(int) switch_dow_str2int(const char *exp);
-SWITCH_DECLARE(int) switch_dow_cmp(const char *exp, int val);
+SWITCH_DECLARE(switch_bool_t) switch_dow_cmp(const char *exp, int val);
SWITCH_DECLARE(int) switch_number_cmp(const char *exp, int val);
SWITCH_DECLARE(int) switch_tod_cmp(const char *exp, int val);
diff --git a/src/mod/applications/mod_avmd/buffer.h b/src/mod/applications/mod_avmd/buffer.h
index bb5b1b1d84..b6676767e1 100644
--- a/src/mod/applications/mod_avmd/buffer.h
+++ b/src/mod/applications/mod_avmd/buffer.h
@@ -78,18 +78,18 @@ extern size_t next_power_of_2(size_t v);
#define CALC_BUFF_LEN(fl, bl) (((fl) >= (bl))? next_power_of_2((fl) << 1): next_power_of_2((bl) << 1))
-#define INIT_CIRC_BUFFER(bf, bl, fl) \
+#define INIT_CIRC_BUFFER(bf, bl, fl, s) \
{ \
(bf)->buf_len = CALC_BUFF_LEN((fl), (bl)); \
(bf)->mask = (bf)->buf_len - 1; \
- (bf)->buf = (BUFF_TYPE *)calloc((bf)->buf_len, sizeof(BUFF_TYPE)); \
+ (bf)->buf = (BUFF_TYPE *) switch_core_session_alloc(s, (bf)->buf_len * sizeof(BUFF_TYPE)); \
assert((bf)->buf != NULL); \
(bf)->pos = 0; \
(bf)->lpos = 0; \
(bf)->backlog = 0; \
}
-#define DESTROY_CIRC_BUFFER(b) free((b)->buf)
+//#define DESTROY_CIRC_BUFFER(b) free((b)->buf)
#define GET_BACKLOG_POS(b) ((b)->lpos - (b)->backlog)
#define GET_CURRENT_POS(b) ((b)->lpos)
#define GET_CURRENT_SAMPLE(b) GET_SAMPLE((b), GET_CURRENT_POS((b)))
diff --git a/src/mod/applications/mod_avmd/mod_avmd.c b/src/mod/applications/mod_avmd/mod_avmd.c
index 74372a0c2d..8e6f2e124d 100644
--- a/src/mod/applications/mod_avmd/mod_avmd.c
+++ b/src/mod/applications/mod_avmd/mod_avmd.c
@@ -130,7 +130,7 @@ static void init_avmd_session_data(avmd_session_t *avmd_session, switch_core_se
{
/*! This is a worst case sample rate estimate */
avmd_session->rate = 48000;
- INIT_CIRC_BUFFER(&avmd_session->b, BEEP_LEN(avmd_session->rate), FRAME_LEN(avmd_session->rate));
+ INIT_CIRC_BUFFER(&avmd_session->b, BEEP_LEN(avmd_session->rate), FRAME_LEN(avmd_session->rate), fs_session);
avmd_session->session = fs_session;
avmd_session->pos = 0;
@@ -176,6 +176,7 @@ static switch_bool_t avmd_callback(switch_media_bug_t * bug, void *user_data, sw
case SWITCH_ABC_TYPE_READ_PING:
break;
case SWITCH_ABC_TYPE_CLOSE:
+
break;
case SWITCH_ABC_TYPE_READ:
break;
diff --git a/src/mod/applications/mod_callcenter/mod_callcenter.c b/src/mod/applications/mod_callcenter/mod_callcenter.c
index ddd2cd5175..1b0ba1331a 100644
--- a/src/mod/applications/mod_callcenter/mod_callcenter.c
+++ b/src/mod/applications/mod_callcenter/mod_callcenter.c
@@ -37,7 +37,6 @@
#define CC_AGENT_TYPE_UUID_STANDBY "uuid-standby"
#define CC_SQLITE_DB_NAME "callcenter"
-#define CC_MAX_TIME_DIFF_CHECK 5
/* TODO
drop caller if no agent login
dont allow new caller
@@ -429,6 +428,7 @@ struct cc_queue {
uint32_t max_wait_time;
uint32_t max_wait_time_with_no_agent;
+ uint32_t max_wait_time_with_no_agent_time_reached;
switch_mutex_t *mutex;
@@ -540,6 +540,7 @@ cc_queue_t *queue_set_config(cc_queue_t *queue)
SWITCH_CONFIG_SET_ITEM(queue->config[i++], "max-wait-time", SWITCH_CONFIG_INT, 0, &queue->max_wait_time, 0, &config_int_0_86400, NULL, NULL);
SWITCH_CONFIG_SET_ITEM(queue->config[i++], "max-wait-time-with-no-agent", SWITCH_CONFIG_INT, 0, &queue->max_wait_time_with_no_agent, 0, &config_int_0_86400, NULL, NULL);
+ SWITCH_CONFIG_SET_ITEM(queue->config[i++], "max-wait-time-with-no-agent-time-reached", SWITCH_CONFIG_INT, 0, &queue->max_wait_time_with_no_agent_time_reached, 5, &config_int_0_86400, NULL, NULL);
switch_assert(i < CC_QUEUE_CONFIGITEM_COUNT);
@@ -850,7 +851,7 @@ cc_status_t cc_agent_del(const char *agent)
return result;
}
-cc_agent_status_t cc_agent_get(const char *key, const char *agent, char *ret_result, size_t ret_result_size)
+cc_status_t cc_agent_get(const char *key, const char *agent, char *ret_result, size_t ret_result_size)
{
cc_status_t result = CC_STATUS_SUCCESS;
char *sql;
@@ -890,7 +891,7 @@ cc_agent_status_t cc_agent_get(const char *key, const char *agent, char *ret_res
done:
if (result == CC_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Get Info Agent %s set %s = %s\n", agent, key, res);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Get Info Agent %s %s = %s\n", agent, key, res);
}
return result;
@@ -2023,7 +2024,7 @@ void *SWITCH_THREAD_FUNC cc_member_thread_run(switch_thread_t *thread, void *obj
}
/* Will drop the caller if no agent was found for more than X secondes */
- if (queue->max_wait_time_with_no_agent > 0 && m->t_member_called < queue->last_agent_exist_check - CC_MAX_TIME_DIFF_CHECK &&
+ if (queue->max_wait_time_with_no_agent > 0 && m->t_member_called < queue->last_agent_exist_check - queue->max_wait_time_with_no_agent_time_reached &&
queue->last_agent_exist_check - queue->last_agent_exist >= queue->max_wait_time_with_no_agent) {
m->member_cancel_reason = CC_MEMBER_CANCEL_REASON_NO_AGENT_TIMEOUT;
switch_channel_set_flag_value(member_channel, CF_BREAK, 2);
@@ -2465,9 +2466,10 @@ SWITCH_STANDARD_API(cc_config_api_function)
} else {
const char *key = argv[0 + initial_argc];
const char *agent = argv[1 + initial_argc];
- switch (cc_agent_get(key, agent, NULL, 0)) {
+ char ret[64];
+ switch (cc_agent_get(key, agent, ret, sizeof(ret))) {
case CC_STATUS_SUCCESS:
- stream->write_function(stream, "%s", "+OK\n");
+ stream->write_function(stream, "%s", ret);
break;
case CC_STATUS_INVALID_KEY:
stream->write_function(stream, "%s", "-ERR Invalid Agent Update KEY!\n");
@@ -2631,7 +2633,21 @@ SWITCH_STANDARD_API(cc_config_api_function)
}
} else if (action && !strcasecmp(action, "list")) {
if (argc-initial_argc < 1) {
- stream->write_function(stream, "%s", "-ERR Invalid!\n");
+ switch_hash_index_t *hi;
+ stream->write_function(stream, "%s", "name|strategy|moh_sound|time_base_score|tier_rules_apply|tier_rule_wait_second|tier_rule_wait_multiply_level|tier_rule_no_agent_no_wait|discard_abandoned_after|abandoned_resume_allowed|max_wait_time|max_wait_time_with_no_agent|max_wait_time_with_no_agent_time_reached|record_template\n");
+ switch_mutex_lock(globals.mutex);
+ for (hi = switch_hash_first(NULL, globals.queue_hash); hi; hi = switch_hash_next(hi)) {
+ void *val = NULL;
+ const void *key;
+ switch_ssize_t keylen;
+ cc_queue_t *queue;
+ switch_hash_this(hi, &key, &keylen, &val);
+ queue = (cc_queue_t *) val;
+ stream->write_function(stream, "%s|%s|%s|%s|%s|%d|%s|%s|%d|%s|%d|%d|%d|%s\n", queue->name, queue->strategy, queue->moh, queue->time_base_score, (queue->tier_rules_apply?"true":"false"), queue->tier_rule_wait_second, (queue->tier_rule_wait_multiply_level?"true":"false"), (queue->tier_rule_no_agent_no_wait?"true":"false"), queue->discard_abandoned_after, (queue->abandoned_resume_allowed?"true":"false"), queue->max_wait_time, queue->max_wait_time_with_no_agent, queue->max_wait_time_with_no_agent_time_reached, queue->record_template);
+ queue = NULL;
+ }
+ switch_mutex_unlock(globals.mutex);
+ stream->write_function(stream, "%s", "+OK\n");
goto done;
} else {
const char *queue_name = argv[0 + initial_argc];
diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c
index 4b7e4340a8..40ec1ee2f6 100644
--- a/src/mod/applications/mod_commands/mod_commands.c
+++ b/src/mod/applications/mod_commands/mod_commands.c
@@ -2019,6 +2019,66 @@ SWITCH_STANDARD_API(transfer_function)
return SWITCH_STATUS_SUCCESS;
}
+
+#define DUAL_TRANSFER_SYNTAX " [/][/] [/][/]"
+SWITCH_STANDARD_API(dual_transfer_function)
+{
+ switch_core_session_t *tsession = NULL, *other_session = NULL;
+ char *mycmd = NULL, *argv[5] = { 0 };
+ int argc = 0;
+ char *tuuid, *dest1, *dest2, *dp1 = NULL, *dp2 = NULL, *context1 = NULL, *context2 = NULL;
+
+ if (zstr(cmd) || !(mycmd = strdup(cmd))) {
+ stream->write_function(stream, "-USAGE: %s\n", DUAL_TRANSFER_SYNTAX);
+ return SWITCH_STATUS_SUCCESS;
+ }
+
+ argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
+
+ if (argc != 3) {
+ stream->write_function(stream, "-USAGE: %s\n", DUAL_TRANSFER_SYNTAX);
+ goto done;
+ }
+
+ tuuid = argv[0];
+ dest1 = argv[1];
+ dest2= argv[2];
+
+ if ((dp1 = strchr(dest1, '/'))) {
+ *dp1++ = '\0';
+ if ((context1 = strchr(dp1, '/'))) {
+ *context1++ = '\0';
+ }
+ }
+
+ if ((dp2 = strchr(dest2, '/'))) {
+ *dp2++ = '\0';
+ if ((context2 = strchr(dp2, '/'))) {
+ *context2++ = '\0';
+ }
+ }
+
+ if (zstr(tuuid) || !(tsession = switch_core_session_locate(tuuid))) {
+ stream->write_function(stream, "-ERR No Such Channel!\n");
+ goto done;
+ }
+
+ if (switch_core_session_get_partner(tsession, &other_session) == SWITCH_STATUS_SUCCESS) {
+ switch_ivr_session_transfer(other_session, dest2, dp2, context2);
+ switch_core_session_rwunlock(other_session);
+ }
+
+ switch_ivr_session_transfer(tsession, dest1, dp1, context1);
+
+ stream->write_function(stream, "+OK\n");
+
+ switch_core_session_rwunlock(tsession);
+
+ done:
+ switch_safe_free(mycmd);
+ return SWITCH_STATUS_SUCCESS;
+}
+
#define TONE_DETECT_SYNTAX " [ ]"
SWITCH_STANDARD_API(tone_detect_session_function)
{
@@ -3423,6 +3483,12 @@ SWITCH_STANDARD_API(show_function)
char hostname[256] = "";
gethostname(hostname, sizeof(hostname));
+
+ if (!(cflags & SCF_USE_SQL)) {
+ stream->write_function(stream, "-ERR SQL DISABLED NO DATA AVAILABLE!\n");
+ return SWITCH_STATUS_SUCCESS;
+ }
+
if (switch_core_db_handle(&db) != SWITCH_STATUS_SUCCESS) {
stream->write_function(stream, "%s", "-ERR Databse Error!\n");
return SWITCH_STATUS_SUCCESS;
@@ -3455,11 +3521,6 @@ SWITCH_STANDARD_API(show_function)
holder.print_title = 1;
- if (!(cflags & SCF_USE_SQL) && command && !strcasecmp(command, "channels")) {
- stream->write_function(stream, "-ERR SQL DISABLED NO CHANNEL DATA AVAILABLE!\n");
- goto end;
- }
-
/* If you change the field qty or order of any of these select */
/* statements, you must also change show_callback and friends to match! */
if (!command) {
@@ -4263,7 +4324,7 @@ SWITCH_STANDARD_API(uuid_loglevel)
#define SQL_ESCAPE_SYNTAX ""
SWITCH_STANDARD_API(sql_escape)
{
- if (zstr(cmd)) {
+ if (!cmd) {
stream->write_function(stream, "-USAGE: %s\n", SQL_ESCAPE_SYNTAX);
} else {
stream->write_function(stream, "%q", cmd);
@@ -4630,6 +4691,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load)
SWITCH_ADD_API(commands_api_interface, "uuid_setvar_multi", "uuid_setvar_multi", uuid_setvar_multi_function, SETVAR_MULTI_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "uuid_setvar", "uuid_setvar", uuid_setvar_function, SETVAR_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "uuid_transfer", "Transfer a session", transfer_function, TRANSFER_SYNTAX);
+ SWITCH_ADD_API(commands_api_interface, "uuid_dual_transfer", "Transfer a session and its partner", dual_transfer_function, DUAL_TRANSFER_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "uuid_simplify", "Try to cut out of a call path / attended xfer", uuid_simplify_function, SIMPLIFY_SYNTAX);
SWITCH_ADD_API(commands_api_interface, "xml_locate", "find some xml", xml_locate_function, "[root | ]");
SWITCH_ADD_API(commands_api_interface, "xml_wrap", "Wrap another api command in xml", xml_wrap_api_function, " ");
@@ -4749,6 +4811,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load)
switch_console_set_complete("add uuid_setvar_multi ::console::list_uuid");
switch_console_set_complete("add uuid_setvar ::console::list_uuid");
switch_console_set_complete("add uuid_transfer ::console::list_uuid");
+ switch_console_set_complete("add uuid_dual_transfer ::console::list_uuid");
switch_console_set_complete("add version");
switch_console_set_complete("add uuid_warning ::console::list_uuid");
switch_console_set_complete("add ...");
diff --git a/src/mod/applications/mod_conference/mod_conference.c b/src/mod/applications/mod_conference/mod_conference.c
index ed62da107b..4cbb052994 100644
--- a/src/mod/applications/mod_conference/mod_conference.c
+++ b/src/mod/applications/mod_conference/mod_conference.c
@@ -40,6 +40,11 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_conference_load);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_conference_shutdown);
SWITCH_MODULE_DEFINITION(mod_conference, mod_conference_load, mod_conference_shutdown, NULL);
+typedef enum {
+ CONF_SILENT_REQ = (1 << 0),
+ CONF_SILENT_DONE = (1 << 1)
+} conf_app_flag_t;
+
static const char global_app_name[] = "conference";
static char *global_cf_name = "conference.conf";
static char *cf_pin_url_param_name = "X-ConfPin=";
@@ -92,29 +97,6 @@ static struct {
switch_event_node_t *node;
} globals;
-typedef enum {
- CALLER_CONTROL_MUTE,
- CALLER_CONTROL_MUTE_ON,
- CALLER_CONTROL_MUTE_OFF,
- CALLER_CONTROL_DEAF_MUTE,
- CALLER_CONTROL_ENERGY_UP,
- CALLER_CONTROL_ENERGY_EQU_CONF,
- CALLER_CONTROL_ENERGY_DN,
- CALLER_CONTROL_VOL_TALK_UP,
- CALLER_CONTROL_VOL_TALK_ZERO,
- CALLER_CONTROL_VOL_TALK_DN,
- CALLER_CONTROL_VOL_LISTEN_UP,
- CALLER_CONTROL_VOL_LISTEN_ZERO,
- CALLER_CONTROL_VOL_LISTEN_DN,
- CALLER_CONTROL_HANGUP,
- CALLER_CONTROL_MENU,
- CALLER_CONTROL_DIAL,
- CALLER_CONTROL_EVENT,
- CALLER_CONTROL_LOCK,
- CALLER_CONTROL_TRANSFER,
- CALLER_CONTROL_EXEC_APP
-} caller_control_t;
-
/* forward declaration for conference_obj and caller_control */
struct conference_member;
typedef struct conference_member conference_member_t;
@@ -128,17 +110,10 @@ typedef struct call_list call_list_t;
struct caller_control_actions;
-typedef struct caller_control_fn_table {
- char *key;
- char *digits;
- caller_control_t action;
- void (*handler) (conference_member_t *, struct caller_control_actions *);
-} caller_control_fn_table_t;
-
typedef struct caller_control_actions {
- caller_control_fn_table_t *fndesc;
char *binded_dtmf;
- void *data;
+ char *data;
+ char *expanded_data;
} caller_control_action_t;
typedef struct caller_control_menu_info {
@@ -266,12 +241,12 @@ typedef struct conference_obj {
uint32_t max_members;
char *maxmember_sound;
uint32_t announce_count;
- switch_ivr_digit_stream_parser_t *dtmf_parser;
char *pin;
char *pin_sound;
char *bad_pin_sound;
char *profile_name;
char *domain;
+ char *caller_controls;
uint32_t flags;
member_flag_t mflags;
switch_call_cause_t bridge_hangup_cause;
@@ -357,8 +332,6 @@ struct conference_member {
uint32_t resample_out_len;
conference_file_node_t *fnode;
conference_relationship_t *relationships;
- switch_ivr_digit_stream_parser_t *dtmf_parser;
- switch_ivr_digit_stream_t *digit_stream;
switch_speech_handle_t lsh;
switch_speech_handle_t *sh;
uint32_t verbose_events;
@@ -366,6 +339,7 @@ struct conference_member {
uint32_t avg_itt;
uint32_t avg_tally;
struct conference_member *next;
+ switch_ivr_dmachine_t *dmachine;
};
/* Record Node */
@@ -409,6 +383,7 @@ static void conference_send_all_dtmf(conference_member_t *member, conference_obj
static switch_status_t conference_say(conference_obj_t *conference, const char *text, uint32_t leadin);
static void conference_list(conference_obj_t *conference, switch_stream_handle_t *stream, char *delim);
static conference_obj_t *conference_find(char *name);
+static void member_bind_controls(conference_member_t *member, const char *controls);
SWITCH_STANDARD_API(conf_api_main);
@@ -651,6 +626,7 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe
char msg[512]; /* conference count announcement */
call_list_t *call_list = NULL;
switch_channel_t *channel;
+ const char *controls = NULL;
switch_assert(conference != NULL);
switch_assert(member != NULL);
@@ -698,20 +674,21 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe
switch_clear_flag(conference, CFLAG_WAIT_MOD);
}
+ channel = switch_core_session_get_channel(member->session);
+ switch_channel_set_variable_printf(channel, "conference_member_id", "%d", member->id);
+
if (conference->count > 1) {
if (conference->moh_sound && !switch_test_flag(conference, CFLAG_WAIT_MOD)) {
/* stop MoH if any */
conference_stop_file(conference, FILE_STOP_ASYNC);
}
- if (conference->enter_sound) {
+
+ if (!switch_channel_test_app_flag_key("conf_silent", channel, CONF_SILENT_REQ) && !zstr(conference->enter_sound)) {
conference_play_file(conference, conference->enter_sound, CONF_DEFAULT_LEADIN, switch_core_session_get_channel(member->session),
switch_test_flag(conference, CFLAG_WAIT_MOD) ? 0 : 1);
}
}
- channel = switch_core_session_get_channel(member->session);
- switch_channel_set_variable_printf(channel, "conference_member_id", "%d", member->id);
-
call_list = (call_list_t *) switch_channel_get_private(channel, "_conference_autocall_list_");
@@ -720,7 +697,8 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe
switch_snprintf(saymsg, sizeof(saymsg), "Auto Calling %d parties", call_list->iteration);
conference_member_say(member, saymsg, 0);
} else {
- if (zstr(conference->special_announce)) {
+
+ if (!switch_channel_test_app_flag_key("conf_silent", channel, CONF_SILENT_REQ)) {
/* announce the total number of members in the conference */
if (conference->count >= conference->announce_count && conference->announce_count > 1) {
switch_snprintf(msg, sizeof(msg), "There are %d callers", conference->count);
@@ -750,13 +728,32 @@ static switch_status_t conference_add_member(conference_obj_t *conference, confe
switch_set_flag(conference, CFLAG_ENFORCE_MIN);
}
- if (test_eflag(conference, EFLAG_ADD_MEMBER) &&
+ if (!switch_channel_test_app_flag_key("conf_silent", channel, CONF_SILENT_REQ) &&
switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
conference_add_event_member_data(member, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "add-member");
switch_event_fire(&event);
}
+ switch_channel_clear_app_flag_key("conf_silent", channel, CONF_SILENT_REQ);
+
+
+ switch_ivr_dmachine_create(&member->dmachine, "mod_conference", NULL, 500, 0, NULL, NULL, NULL);
+
+ controls = switch_channel_get_variable(channel, "conference_controls");
+
+ if (zstr(controls)) {
+ controls = conference->caller_controls;
+ }
+
+ if (zstr(controls)) {
+ controls = "default";
+ }
+
+ if (strcasecmp(controls, "none")) {
+ member_bind_controls(member, controls);
+ }
+
}
unlock_member(member);
switch_mutex_unlock(member->audio_out_mutex);
@@ -787,6 +784,8 @@ static switch_status_t conference_del_member(conference_obj_t *conference, confe
member->sh = NULL;
unlock_member(member);
+ switch_ivr_dmachine_destroy(&member->dmachine);
+
switch_mutex_lock(conference->mutex);
switch_mutex_lock(conference->member_mutex);
switch_mutex_lock(member->audio_in_mutex);
@@ -1454,8 +1453,6 @@ static void *SWITCH_THREAD_FUNC conference_thread_run(switch_thread_t *thread, v
switch_thread_rwlock_unlock(conference->rwlock);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write Lock OFF\n");
- switch_ivr_digit_stream_parser_destroy(conference->dtmf_parser);
-
if (conference->sh) {
switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE;
switch_core_speech_close(&conference->lsh, &flags);
@@ -1685,6 +1682,7 @@ static void conference_loop_fn_volume_talk_zero(conference_member_t *member, cal
switch_snprintf(msg, sizeof(msg), "Volume level %d", member->volume_out_level);
conference_member_say(member, msg, 0);
+
}
static void conference_loop_fn_volume_talk_dn(conference_member_t *member, caller_control_action_t *action)
@@ -1793,7 +1791,7 @@ static void conference_loop_fn_event(conference_member_t *member, caller_control
conference_add_event_member_data(member, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "dtmf");
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "DTMF-Key", action->binded_dtmf);
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Data", action->data);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Data", action->expanded_data);
switch_event_fire(&event);
}
}
@@ -1812,12 +1810,12 @@ static void conference_loop_fn_transfer(conference_member_t *member, caller_cont
if (test_eflag(member->conference, EFLAG_DTMF) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
conference_add_event_member_data(member, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "transfer");
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Dialplan", action->data);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Dialplan", action->expanded_data);
switch_event_fire(&event);
}
switch_clear_flag_locked(member, MFLAG_RUNNING);
- if ((mydata = switch_core_session_strdup(member->session, action->data))) {
+ if ((mydata = switch_core_session_strdup(member->session, action->expanded_data))) {
if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
if (argc > 0) {
exten = argv[0];
@@ -1830,7 +1828,7 @@ static void conference_loop_fn_transfer(conference_member_t *member, caller_cont
}
} else {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_ERROR, "Empty transfer string [%s]\n", (char *) action->data);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_ERROR, "Empty transfer string [%s]\n", (char *) action->expanded_data);
goto done;
}
} else {
@@ -1856,14 +1854,16 @@ static void conference_loop_fn_exec_app(conference_member_t *member, caller_cont
switch_event_t *event = NULL;
switch_channel_t *channel = NULL;
+ if (!action->expanded_data) return;
+
if (test_eflag(member->conference, EFLAG_DTMF) && switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
conference_add_event_member_data(member, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "execute_app");
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Application", action->data);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Application", action->expanded_data);
switch_event_fire(&event);
}
- if ((mydata = switch_core_session_strdup(member->session, action->data))) {
+ if ((mydata = switch_core_session_strdup(member->session, action->expanded_data))) {
if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
if (argc > 0) {
app = argv[0];
@@ -1873,7 +1873,8 @@ static void conference_loop_fn_exec_app(conference_member_t *member, caller_cont
}
} else {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_ERROR, "Empty execute app string [%s]\n", (char *) action->data);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_ERROR, "Empty execute app string [%s]\n",
+ (char *) action->expanded_data);
goto done;
}
} else {
@@ -1885,6 +1886,7 @@ static void conference_loop_fn_exec_app(conference_member_t *member, caller_cont
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_ERROR, "Unable to find application.\n");
goto done;
}
+
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_DEBUG, "Execute app: %s, %s\n", app, arg);
channel = switch_core_session_get_channel(member->session);
@@ -1895,6 +1897,7 @@ static void conference_loop_fn_exec_app(conference_member_t *member, caller_cont
switch_core_session_set_read_codec(member->session, &member->read_codec);
switch_channel_clear_app_flag(channel, CF_APP_TAGGED);
done:
+
return;
}
@@ -2299,29 +2302,6 @@ static void launch_conference_loop_input(conference_member_t *member, switch_mem
switch_thread_create(&thread, thd_attr, conference_loop_input, member, pool);
}
-static caller_control_fn_table_t ccfntbl[] = {
- {"mute", "0", CALLER_CONTROL_MUTE, conference_loop_fn_mute_toggle},
- {"mute on", NULL, CALLER_CONTROL_MUTE_ON, conference_loop_fn_mute_on},
- {"mute off", NULL, CALLER_CONTROL_MUTE_OFF, conference_loop_fn_mute_off},
- {"deaf mute", "*", CALLER_CONTROL_DEAF_MUTE, conference_loop_fn_deafmute_toggle},
- {"energy up", "9", CALLER_CONTROL_ENERGY_UP, conference_loop_fn_energy_up},
- {"energy equ", "8", CALLER_CONTROL_ENERGY_EQU_CONF, conference_loop_fn_energy_equ_conf},
- {"energy dn", "7", CALLER_CONTROL_ENERGY_DN, conference_loop_fn_energy_dn},
- {"vol talk up", "3", CALLER_CONTROL_VOL_TALK_UP, conference_loop_fn_volume_talk_up},
- {"vol talk zero", "2", CALLER_CONTROL_VOL_TALK_ZERO, conference_loop_fn_volume_talk_zero},
- {"vol talk dn", "1", CALLER_CONTROL_VOL_TALK_DN, conference_loop_fn_volume_talk_dn},
- {"vol listen up", "6", CALLER_CONTROL_VOL_LISTEN_UP, conference_loop_fn_volume_listen_up},
- {"vol listen zero", "5", CALLER_CONTROL_VOL_LISTEN_ZERO, conference_loop_fn_volume_listen_zero},
- {"vol listen dn", "4", CALLER_CONTROL_VOL_LISTEN_DN, conference_loop_fn_volume_listen_dn},
- {"hangup", "#", CALLER_CONTROL_HANGUP, conference_loop_fn_hangup},
- {"event", NULL, CALLER_CONTROL_EVENT, conference_loop_fn_event},
- {"lock", NULL, CALLER_CONTROL_LOCK, conference_loop_fn_lock_toggle},
- {"transfer", NULL, CALLER_CONTROL_TRANSFER, conference_loop_fn_transfer},
- {"execute_application", NULL, CALLER_CONTROL_EXEC_APP, conference_loop_fn_exec_app}
-};
-
-#define CCFNTBL_QTY (sizeof(ccfntbl)/sizeof(ccfntbl[0]))
-
/* marshall frames from the conference (or file or tts output) to the call leg */
/* NB. this starts the input thread after some initial setup for the call leg */
static void conference_loop_output(conference_member_t *member)
@@ -2392,13 +2372,6 @@ static void conference_loop_output(conference_member_t *member)
/* Start the input thread */
launch_conference_loop_input(member, switch_core_session_get_pool(member->session));
- /* build a digit stream object */
- if (member->conference->dtmf_parser != NULL
- && switch_ivr_digit_stream_new(member->conference->dtmf_parser, &member->digit_stream) != SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session), SWITCH_LOG_ERROR,
- "Danger Will Robinson, there is no digit parser stream object\n");
- }
-
if ((call_list = switch_channel_get_private(channel, "_conference_autocall_list_"))) {
const char *cid_name = switch_channel_get_variable(channel, "conference_auto_outcall_caller_id_name");
const char *cid_num = switch_channel_get_variable(channel, "conference_auto_outcall_caller_id_number");
@@ -2408,7 +2381,7 @@ static void conference_loop_output(conference_member_t *member)
const char *prefix = switch_channel_get_variable(channel, "conference_auto_outcall_prefix");
int to = 60;
- if (ann) {
+ if (ann && !switch_channel_test_app_flag_key("conf_silent", channel, CONF_SILENT_REQ)) {
member->conference->special_announce = switch_core_strdup(member->conference->pool, ann);
}
@@ -2449,9 +2422,7 @@ static void conference_loop_output(conference_member_t *member)
while (switch_test_flag(member, MFLAG_RUNNING) && switch_test_flag(member, MFLAG_ITHREAD)
&& switch_channel_ready(channel)) {
char dtmf[128] = "";
- char *digit;
switch_event_t *event;
- caller_control_action_t *caller_action = NULL;
int use_timer = 0;
switch_buffer_t *use_buffer = NULL;
uint32_t mux_used = 0;
@@ -2505,40 +2476,13 @@ static void conference_loop_output(conference_member_t *member)
if (switch_test_flag(member, MFLAG_DIST_DTMF)) {
conference_send_all_dtmf(member, member->conference, dtmf);
- } else {
- if (member->conference->dtmf_parser != NULL) {
- for (digit = dtmf; *digit && caller_action == NULL; digit++) {
- caller_action = (caller_control_action_t *)
- switch_ivr_digit_stream_parser_feed(member->conference->dtmf_parser, member->digit_stream, *digit);
- }
- }
+ } else if (member->dmachine) {
+ switch_ivr_dmachine_feed(member->dmachine, dtmf, NULL);
}
- /* otherwise, clock the parser so that it can handle digit timeout detection */
- } else if (member->conference->dtmf_parser != NULL) {
- caller_action = (caller_control_action_t *) switch_ivr_digit_stream_parser_feed(member->conference->dtmf_parser, member->digit_stream, '\0');
+ } else if (member->dmachine) {
+ switch_ivr_dmachine_ping(member->dmachine, NULL);
}
- /* if a caller action has been detected, handle it */
- if (caller_action != NULL && caller_action->fndesc != NULL && caller_action->fndesc->handler != NULL) {
- char *param = NULL;
-
- if (caller_action->fndesc->action != CALLER_CONTROL_MENU) {
- param = caller_action->data;
- }
-#ifdef INTENSE_DEBUG
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member->session),
- SWITCH_LOG_INFO,
- "executing caller control '%s' param '%s' on call '%u, %s\n",
- caller_action->fndesc->key, param ? param : "none", member->id, switch_channel_get_name(channel));
-#endif
-
- caller_action->fndesc->handler(member, caller_action);
-
- /* set up for next pass */
- caller_action = NULL;
- }
-
-
use_buffer = NULL;
mux_used = (uint32_t) switch_buffer_inuse(member->mux_buffer);
@@ -2582,6 +2526,7 @@ static void conference_loop_output(conference_member_t *member)
}
if (switch_core_session_write_frame(member->session, &write_frame, SWITCH_IO_FLAG_NONE, 0) != SWITCH_STATUS_SUCCESS) {
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
+ switch_mutex_unlock(member->audio_out_mutex);
break;
}
}
@@ -2647,10 +2592,6 @@ static void conference_loop_output(conference_member_t *member)
} /* Rinse ... Repeat */
- if (member->digit_stream != NULL) {
- switch_ivr_digit_stream_destroy(&member->digit_stream);
- }
-
switch_clear_flag_locked(member, MFLAG_RUNNING);
switch_core_timer_destroy(&timer);
@@ -2933,6 +2874,10 @@ static switch_status_t conference_play_file(conference_obj_t *conference, char *
switch_assert(conference != NULL);
+ if (zstr(file)) {
+ return SWITCH_STATUS_NOTFOUND;
+ }
+
switch_mutex_lock(conference->mutex);
switch_mutex_lock(conference->member_mutex);
count = conference->count;
@@ -4366,8 +4311,9 @@ static switch_status_t conf_api_sub_transfer(conference_obj_t *conference, switc
if ((profiles = switch_xml_child(cfg, "profiles"))) {
xml_cfg.profile = switch_xml_find_child(profiles, "profile", "name", profile_name);
}
-
- xml_cfg.controls = switch_xml_child(cfg, "caller-controls");
+
+ /* Create the conference object. */
+ new_conference = conference_new(conf_name, xml_cfg, pool);
/* Release the config registry handle */
if (cxml) {
@@ -4375,9 +4321,6 @@ static switch_status_t conf_api_sub_transfer(conference_obj_t *conference, switc
cxml = NULL;
}
- /* Create the conference object. */
- new_conference = conference_new(conf_name, xml_cfg, pool);
-
if (!new_conference) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
if (pool != NULL) {
@@ -5328,7 +5271,6 @@ static int setup_media(conference_member_t *member, conference_obj_t *conference
}
-
/* Application interface function that is called from the dialplan to join the channel to a conference */
SWITCH_STANDARD_APP(conference_function)
{
@@ -5353,7 +5295,10 @@ SWITCH_STANDARD_APP(conference_function)
switch_event_t *params = NULL;
int locked = 0;
-
+ if (!switch_channel_test_app_flag_key("conf_silent", channel, CONF_SILENT_DONE) &&
+ (switch_channel_test_flag(channel, CF_RECOVERED) || switch_true(switch_channel_get_variable(channel, "conference_silent_entry")))) {
+ switch_channel_set_app_flag_key("conf_silent", channel, CONF_SILENT_REQ);
+ }
if (switch_channel_answer(channel) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Channel answer failed.\n");
@@ -5444,8 +5389,6 @@ SWITCH_STANDARD_APP(conference_function)
xml_cfg.profile = switch_xml_find_child(profiles, "profile", "name", profile_name);
}
- xml_cfg.controls = switch_xml_child(cfg, "caller-controls");
-
/* if this is a bridging call, and it's not a duplicate, build a */
/* conference object, and skip pin handling, and locked checking */
@@ -5656,7 +5599,7 @@ SWITCH_STANDARD_APP(conference_function)
}
}
- if (conference->special_announce) {
+ if (conference->special_announce && !switch_channel_test_app_flag_key("conf_silent", channel, CONF_SILENT_REQ)) {
conference_local_play_file(conference, session, conference->special_announce, CONF_DEFAULT_LEADIN, NULL, 0);
}
@@ -5777,9 +5720,6 @@ SWITCH_STANDARD_APP(conference_function)
switch_buffer_destroy(&member.resample_buffer);
switch_buffer_destroy(&member.audio_buffer);
switch_buffer_destroy(&member.mux_buffer);
- if (conference && member.dtmf_parser != conference->dtmf_parser) {
- switch_ivr_digit_stream_parser_destroy(member.dtmf_parser);
- }
if (conference) {
switch_mutex_lock(conference->mutex);
@@ -5928,88 +5868,6 @@ static switch_status_t chat_send(const char *proto, const char *from, const char
return SWITCH_STATUS_SUCCESS;
}
-static switch_status_t conf_default_controls(conference_obj_t *conference)
-{
- switch_status_t status = SWITCH_STATUS_FALSE;
- uint32_t i;
- caller_control_action_t *action;
-
- switch_assert(conference != NULL);
-
- for (i = 0, status = SWITCH_STATUS_SUCCESS; status == SWITCH_STATUS_SUCCESS && i < CCFNTBL_QTY; i++) {
- if (!zstr(ccfntbl[i].digits)) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,
- "Installing default caller control action '%s' bound to '%s'.\n", ccfntbl[i].key, ccfntbl[i].digits);
- action = (caller_control_action_t *) switch_core_alloc(conference->pool, sizeof(caller_control_action_t));
- if (action != NULL) {
- action->fndesc = &ccfntbl[i];
- action->data = NULL;
- status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser, ccfntbl[i].digits, action);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
- "unable to alloc memory for caller control binding '%s' to '%s'\n", ccfntbl[i].key, ccfntbl[i].digits);
- status = SWITCH_STATUS_MEMERR;
- }
- }
- }
-
- return status;
-}
-
-static switch_status_t conference_new_install_caller_controls_custom(conference_obj_t *conference, switch_xml_t xml_controls, switch_xml_t xml_menus)
-{
- switch_status_t status = SWITCH_STATUS_FALSE;
- switch_xml_t xml_kvp;
-
- switch_assert(conference != NULL);
-
- if (!xml_controls) {
- return status;
- }
-
- /* parse the controls tree for caller control digit strings */
- for (xml_kvp = switch_xml_child(xml_controls, "control"); xml_kvp; xml_kvp = xml_kvp->next) {
- char *key = (char *) switch_xml_attr(xml_kvp, "action");
- char *val = (char *) switch_xml_attr(xml_kvp, "digits");
- char *data = (char *) switch_xml_attr_soft(xml_kvp, "data");
-
- if (!zstr(key) && !zstr(val)) {
- uint32_t i;
-
- /* scan through all of the valid actions, and if found, */
- /* set the new caller control action digit string, then */
- /* stop scanning the table, and go to the next xml kvp. */
- for (i = 0, status = SWITCH_STATUS_NOOP; i < CCFNTBL_QTY && status == SWITCH_STATUS_NOOP; i++) {
-
- if (strcasecmp(ccfntbl[i].key, key) == 0) {
-
- caller_control_action_t *action;
-
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Installing caller control action '%s' bound to '%s'.\n", key, val);
- action = (caller_control_action_t *) switch_core_alloc(conference->pool, sizeof(caller_control_action_t));
- if (action != NULL) {
- action->fndesc = &ccfntbl[i];
- action->data = (void *) switch_core_strdup(conference->pool, data);
- action->binded_dtmf = switch_core_strdup(conference->pool, val);
- status = switch_ivr_digit_stream_parser_set_event(conference->dtmf_parser, val, action);
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
- "unable to alloc memory for caller control binding '%s' to '%s'\n", ccfntbl[i].key, ccfntbl[i].digits);
- status = SWITCH_STATUS_MEMERR;
- }
- }
- }
- if (status == SWITCH_STATUS_NOOP) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid caller control action name '%s'.\n", key);
- }
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Invalid caller control config entry pair action = '%s' digits = '%s'\n", key, val);
- }
- }
-
- return status;
-}
-
static conference_obj_t *conference_find(char *name)
{
conference_obj_t *conference;
@@ -6252,7 +6110,8 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_m
conference->comfort_noise_level = comfort_noise_level;
conference->caller_id_name = switch_core_strdup(conference->pool, caller_id_name);
conference->caller_id_number = switch_core_strdup(conference->pool, caller_id_number);
-
+ conference->caller_controls = switch_core_strdup(conference->pool, caller_controls);
+
if (!zstr(perpetual_sound)) {
conference->perpetual_sound = switch_core_strdup(conference->pool, perpetual_sound);
@@ -6376,7 +6235,6 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_m
}
conference->rate = rate;
conference->interval = interval;
- conference->dtmf_parser = NULL;
conference->eflags = 0xFFFFFFFF;
if (!zstr(suppress_events)) {
@@ -6394,27 +6252,6 @@ static conference_obj_t *conference_new(char *name, conf_xml_cfg_t cfg, switch_m
conference->verbose_events = 1;
}
- /* caller control configuration chores */
- if (switch_ivr_digit_stream_parser_new(conference->pool, &conference->dtmf_parser) == SWITCH_STATUS_SUCCESS) {
-
- /* if no controls, or default controls specified, install default */
- if (caller_controls == NULL || *caller_controls == '\0' || strcasecmp(caller_controls, "default") == 0) {
- status = conf_default_controls(conference);
- } else if (strcasecmp(caller_controls, "none") != 0) {
- /* try to build caller control if the group has been specified and != "none" */
- switch_xml_t xml_controls = switch_xml_find_child(cfg.controls, "group", "name", caller_controls);
- status = conference_new_install_caller_controls_custom(conference, xml_controls, NULL);
-
- if (status != SWITCH_STATUS_SUCCESS) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to install caller controls group '%s'\n", caller_controls);
- }
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "No caller controls installed.\n");
- }
- } else {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to allocate caller control digit parser.\n");
- }
-
/* Activate the conference mutex for exclusivity */
switch_mutex_init(&conference->mutex, SWITCH_MUTEX_NESTED, conference->pool);
switch_mutex_init(&conference->flag_mutex, SWITCH_MUTEX_NESTED, conference->pool);
@@ -6529,6 +6366,145 @@ static void send_presence(switch_event_types_t id)
}
}
+typedef void (*conf_key_callback_t) (conference_member_t *, struct caller_control_actions *);
+
+typedef struct {
+ conference_member_t *member;
+ caller_control_action_t action;
+ conf_key_callback_t handler;
+} key_binding_t;
+
+
+static switch_status_t dmachine_dispatcher(switch_ivr_dmachine_match_t *match)
+{
+ key_binding_t *binding = match->user_data;
+ switch_channel_t *channel;
+
+ if (!binding) return SWITCH_STATUS_FALSE;
+
+ channel = switch_core_session_get_channel(binding->member->session);
+ switch_channel_set_variable(channel, "conference_last_matching_digits", match->match_digits);
+
+ if (binding->action.data) {
+ binding->action.expanded_data = switch_channel_expand_variables(channel, binding->action.data);
+ }
+
+ binding->handler(binding->member, &binding->action);
+
+ if (binding->action.expanded_data != binding->action.data) {
+ free(binding->action.expanded_data);
+ binding->action.expanded_data = NULL;
+ }
+
+ switch_set_flag_locked(binding->member, MFLAG_FLUSH_BUFFER);
+
+ return SWITCH_STATUS_SUCCESS;
+}
+
+static void do_binding(conference_member_t *member, conf_key_callback_t handler, const char *digits, const char *data)
+{
+ key_binding_t *binding;
+
+ binding = switch_core_alloc(member->pool, sizeof(*binding));
+ binding->member = member;
+
+ binding->action.binded_dtmf = switch_core_strdup(member->pool, digits);
+
+ if (data) {
+ binding->action.data = switch_core_strdup(member->pool, data);
+ }
+
+ binding->handler = handler;
+ switch_ivr_dmachine_bind(member->dmachine, "conf", digits, 0, dmachine_dispatcher, binding);
+
+}
+
+struct _mapping {
+ const char *name;
+ conf_key_callback_t handler;
+};
+
+static struct _mapping control_mappings[] = {
+ {"mute", conference_loop_fn_mute_toggle},
+ {"mute on", conference_loop_fn_mute_on},
+ {"mute off", conference_loop_fn_mute_off},
+ {"deaf mute", conference_loop_fn_deafmute_toggle},
+ {"energy up", conference_loop_fn_energy_up},
+ {"energy equ", conference_loop_fn_energy_equ_conf},
+ {"energy dn", conference_loop_fn_energy_dn},
+ {"vol talk up", conference_loop_fn_volume_talk_up},
+ {"vol talk zero", conference_loop_fn_volume_talk_zero},
+ {"vol talk dn", conference_loop_fn_volume_talk_dn},
+ {"vol listen up", conference_loop_fn_volume_listen_up},
+ {"vol listen zero", conference_loop_fn_volume_listen_zero},
+ {"vol listen dn", conference_loop_fn_volume_listen_dn},
+ {"hangup", conference_loop_fn_hangup},
+ {"event", conference_loop_fn_event},
+ {"lock", conference_loop_fn_lock_toggle},
+ {"transfer", conference_loop_fn_transfer},
+ {"execute_application", conference_loop_fn_exec_app}
+};
+#define MAPPING_LEN (sizeof(control_mappings)/sizeof(control_mappings[0]))
+
+static void member_bind_controls(conference_member_t *member, const char *controls)
+{
+ switch_xml_t cxml, cfg, xgroups, xcontrol;
+ switch_event_t *params;
+ int i;
+
+ switch_event_create(¶ms, SWITCH_EVENT_REQUEST_PARAMS);
+ switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "Conf-Name", member->conference->name);
+ switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "Action", "request-controls");
+ switch_event_add_header_string(params, SWITCH_STACK_BOTTOM, "Controls", controls);
+
+ if (!(cxml = switch_xml_open_cfg(global_cf_name, &cfg, params))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Open of %s failed\n", global_cf_name);
+ goto end;
+ }
+
+ if (!(xgroups = switch_xml_child(cfg, "caller-controls"))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't find caller-controls in %s\n", global_cf_name);
+ goto end;
+ }
+
+ if (!(xgroups = switch_xml_find_child(xgroups, "group", "name", controls))) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't find caller-controls in %s\n", global_cf_name);
+ goto end;
+ }
+
+
+ for (xcontrol = switch_xml_child(xgroups, "control"); xcontrol; xcontrol = xcontrol->next) {
+ const char *key = switch_xml_attr(xcontrol, "action");
+ const char *digits = switch_xml_attr(xcontrol, "digits");
+ const char *data = switch_xml_attr_soft(xcontrol, "data");
+
+ if (zstr(key) || zstr(digits)) continue;
+
+ for(i = 0; i < MAPPING_LEN; i++) {
+ if (!strcasecmp(key, control_mappings[i].name)) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s binding '%s' to '%s'\n",
+ switch_core_session_get_name(member->session), digits, key);
+
+ do_binding(member, control_mappings[i].handler, digits, data);
+ }
+ }
+ }
+
+ end:
+
+ /* Release the config registry handle */
+ if (cxml) {
+ switch_xml_free(cxml);
+ cxml = NULL;
+ }
+
+ if (params) switch_event_destroy(¶ms);
+
+}
+
+
+
+
/* Called by FreeSWITCH when the module loads */
SWITCH_MODULE_LOAD_FUNCTION(mod_conference_load)
{
diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c
index 06f545928d..4fd6a676ea 100755
--- a/src/mod/applications/mod_dptools/mod_dptools.c
+++ b/src/mod/applications/mod_dptools/mod_dptools.c
@@ -111,6 +111,8 @@ static switch_status_t digit_nomatch_action_callback(switch_ivr_dmachine_match_t
switch_event_t *event;
switch_status_t status;
+ switch_channel_set_variable(channel, "last_non_matching_digits", match->match_digits);
+
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "%s Digit NOT match binding [%s]\n",
switch_channel_get_name(channel), match->match_digits);
@@ -141,6 +143,8 @@ static switch_status_t digit_action_callback(switch_ivr_dmachine_match_t *match)
char *string = act->string;
switch_channel_t *channel = switch_core_session_get_channel(act->session);
+ switch_channel_set_variable(channel, "last_matching_digits", match->match_digits);
+
if (switch_event_create_plain(&event, SWITCH_EVENT_CHANNEL_DATA) == SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(act->session), SWITCH_LOG_DEBUG, "%s Digit match binding [%s][%s]\n",
switch_channel_get_name(channel), act->string, act->value);
diff --git a/src/mod/applications/mod_fifo/mod_fifo.c b/src/mod/applications/mod_fifo/mod_fifo.c
index 560b1cd6ad..3943ac6ea6 100644
--- a/src/mod/applications/mod_fifo/mod_fifo.c
+++ b/src/mod/applications/mod_fifo/mod_fifo.c
@@ -29,6 +29,7 @@
*
*/
#include
+#define FIFO_APP_KEY "mod_fifo"
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_fifo_shutdown);
SWITCH_MODULE_LOAD_FUNCTION(mod_fifo_load);
@@ -60,7 +61,8 @@ typedef struct {
typedef enum {
FIFO_APP_BRIDGE_TAG = (1 << 0),
- FIFO_APP_TRACKING = (1 << 1)
+ FIFO_APP_TRACKING = (1 << 1),
+ FIFO_APP_DID_HOOK = (1 << 2)
} fifo_app_flag_t;
@@ -306,6 +308,8 @@ struct fifo_node {
int outbound_per_cycle;
char *outbound_name;
outbound_strategy_t outbound_strategy;
+ int ring_timeout;
+ int default_lag;
};
typedef struct fifo_node fifo_node_t;
@@ -864,7 +868,7 @@ static void do_unbridge(switch_core_session_t *consumer_session, switch_core_ses
caller_channel = switch_core_session_get_channel(caller_session);
}
- if (switch_channel_test_app_flag(consumer_channel, FIFO_APP_BRIDGE_TAG)) {
+ if (switch_channel_test_app_flag_key(FIFO_APP_KEY, consumer_channel, FIFO_APP_BRIDGE_TAG)) {
char date[80] = "";
switch_time_exp_t tm;
switch_time_t ts = switch_micro_time_now();
@@ -874,7 +878,7 @@ static void do_unbridge(switch_core_session_t *consumer_session, switch_core_ses
char *sql;
switch_event_t *event;
- switch_channel_clear_app_flag_key(__FILE__, consumer_channel, FIFO_APP_BRIDGE_TAG);
+ switch_channel_clear_app_flag_key(FIFO_APP_KEY, consumer_channel, FIFO_APP_BRIDGE_TAG);
switch_channel_set_variable(consumer_channel, "fifo_bridged", NULL);
ts = switch_micro_time_now();
@@ -984,11 +988,11 @@ static switch_status_t messagehook (switch_core_session_t *session, switch_core_
switch_size_t retsize;
const char *ced_name, *ced_number, *cid_name, *cid_number;
- if (switch_channel_test_app_flag(consumer_channel, FIFO_APP_BRIDGE_TAG)) {
+ if (switch_channel_test_app_flag_key(FIFO_APP_KEY, consumer_channel, FIFO_APP_BRIDGE_TAG)) {
goto end;
}
- switch_channel_set_app_flag_key(__FILE__, consumer_channel, FIFO_APP_BRIDGE_TAG);
+ switch_channel_set_app_flag_key(FIFO_APP_KEY, consumer_channel, FIFO_APP_BRIDGE_TAG);
switch_channel_set_variable(consumer_channel, "fifo_bridged", "true");
switch_channel_set_variable(consumer_channel, "fifo_manual_bridge", "true");
@@ -996,8 +1000,10 @@ static switch_status_t messagehook (switch_core_session_t *session, switch_core_
if (caller_channel) {
switch_channel_set_variable(caller_channel, "fifo_role", "caller");
- switch_process_import(consumer_session, caller_channel, "fifo_caller_consumer_import");
- switch_process_import(caller_session, consumer_channel, "fifo_consumer_caller_import");
+ switch_process_import(consumer_session, caller_channel, "fifo_caller_consumer_import",
+ switch_channel_get_variable(consumer_channel, "fifo_import_prefix"));
+ switch_process_import(caller_session, consumer_channel, "fifo_consumer_caller_import",
+ switch_channel_get_variable(caller_channel, "fifo_import_prefix"));
}
@@ -1209,10 +1215,11 @@ static void *SWITCH_THREAD_FUNC ringall_thread_run(switch_thread_t *thread, void
switch_event_create_brackets(h->originate_string, '{', '}', ',', &ovars, &parsed);
switch_event_del_header(ovars, "fifo_outbound_uuid");
- if (!h->timeout) h->timeout = 60;
+ if (!h->timeout) h->timeout = node->ring_timeout;
if (timeout < h->timeout) timeout = h->timeout;
- stream.write_function(&stream, "[leg_timeout=%d,fifo_outbound_uuid=%s]%s,", h->timeout, h->uuid, parsed ? parsed : h->originate_string);
+ stream.write_function(&stream, "[leg_timeout=%d,fifo_outbound_uuid=%s,fifo_name=%s]%s,",
+ h->timeout, h->uuid, node->name, parsed ? parsed : h->originate_string);
stream2.write_function(&stream2, "%s,", h->uuid);
switch_safe_free(parsed);
@@ -1505,17 +1512,17 @@ static void *SWITCH_THREAD_FUNC o_thread_run(switch_thread_t *thread, void *obj)
switch_event_add_header(ovars, SWITCH_STACK_BOTTOM, "originate_timeout", "%d", h->timeout);
if (switch_stristr("origination_caller", h->originate_string)) {
- originate_string = switch_mprintf("{execute_on_answer='unset fifo_hangup_check',fifo_hangup_check='%q'}%s",
- node->name, h->originate_string);
+ originate_string = switch_mprintf("{execute_on_answer='unset fifo_hangup_check',fifo_name='%q',fifo_hangup_check='%q'}%s",
+ node->name, node->name, h->originate_string);
} else {
if (!zstr(node->outbound_name)) {
- originate_string = switch_mprintf("{execute_on_answer='unset fifo_hangup_check',fifo_hangup_check='%q',"
+ originate_string = switch_mprintf("{execute_on_answer='unset fifo_hangup_check',fifo_name='%q',fifo_hangup_check='%q',"
"origination_caller_id_name=Queue,origination_caller_id_number='Queue: %q'}%s",
- node->name, node->outbound_name, h->originate_string);
+ node->name, node->name, node->outbound_name, h->originate_string);
} else {
- originate_string = switch_mprintf("{execute_on_answer='unset fifo_hangup_check',fifo_hangup_check='%q',"
+ originate_string = switch_mprintf("{execute_on_answer='unset fifo_hangup_check',fifo_name='%q',fifo_hangup_check='%q',"
"origination_caller_id_name=Queue,origination_caller_id_number='Queue: %q'}%s",
- node->name, node->name, h->originate_string);
+ node->name, node->name, node->name, h->originate_string);
}
}
@@ -2017,9 +2024,10 @@ static switch_status_t hanguphook(switch_core_session_t *session)
switch_channel_t *channel = switch_core_session_get_channel(session);
switch_channel_state_t state = switch_channel_get_state(channel);
- if (state == CS_HANGUP) {
+ if (state >= CS_HANGUP && !switch_channel_test_app_flag_key(FIFO_APP_KEY, channel, FIFO_APP_DID_HOOK)) {
dec_use_count(session, SWITCH_TRUE);
switch_core_event_hook_remove_state_change(session, hanguphook);
+ switch_channel_set_app_flag_key(FIFO_APP_KEY, channel, FIFO_APP_DID_HOOK);
}
return SWITCH_STATUS_SUCCESS;
@@ -2037,17 +2045,19 @@ SWITCH_STANDARD_APP(fifo_track_call_function)
return;
}
- if (switch_channel_test_app_flag(channel, FIFO_APP_TRACKING)) {
+ if (switch_channel_test_app_flag_key(FIFO_APP_KEY, channel, FIFO_APP_TRACKING)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "%s trying to double-track call!\n", switch_channel_get_name(channel));
return;
}
+ switch_core_event_hook_add_receive_message(session, messagehook);
+ switch_core_event_hook_add_state_run(session, hanguphook);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s tracking call on uuid %s!\n", switch_channel_get_name(channel), data);
add_bridge_call(data);
- switch_channel_set_app_flag_key(__FILE__, channel, FIFO_APP_TRACKING);
+ switch_channel_set_app_flag_key(FIFO_APP_KEY, channel, FIFO_APP_TRACKING);
switch_channel_set_variable(channel, "fifo_outbound_uuid", data);
switch_channel_set_variable(channel, "fifo_track_call", "true");
@@ -2083,9 +2093,6 @@ SWITCH_STANDARD_APP(fifo_track_call_function)
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Caller-CID-Number", cid_number);
switch_event_fire(&event);
}
-
- switch_core_event_hook_add_receive_message(session, messagehook);
- switch_core_event_hook_add_state_change(session, hanguphook);
}
@@ -2346,7 +2353,7 @@ SWITCH_STANDARD_APP(fifo_function)
switch_channel_set_variable(channel, "fifo_timestamp", date);
switch_channel_set_variable(channel, "fifo_serviced_uuid", NULL);
- switch_channel_set_app_flag_key(__FILE__, channel, FIFO_APP_BRIDGE_TAG);
+ switch_channel_set_app_flag_key(FIFO_APP_KEY, channel, FIFO_APP_BRIDGE_TAG);
if (chime_list) {
char *list_dup = switch_core_session_strdup(session, chime_list);
@@ -2421,7 +2428,7 @@ SWITCH_STANDARD_APP(fifo_function)
abort:
- switch_channel_clear_app_flag_key(__FILE__, channel, FIFO_APP_BRIDGE_TAG);
+ switch_channel_clear_app_flag_key(FIFO_APP_KEY, channel, FIFO_APP_BRIDGE_TAG);
fifo_caller_del(switch_core_session_get_uuid(session));
@@ -2491,6 +2498,7 @@ SWITCH_STANDARD_APP(fifo_function)
if (switch_core_event_hook_remove_receive_message(session, messagehook) == SWITCH_STATUS_SUCCESS) {
dec_use_count(session, SWITCH_FALSE);
switch_core_event_hook_remove_state_change(session, hanguphook);
+ switch_channel_clear_app_flag_key(FIFO_APP_KEY, channel, FIFO_APP_TRACKING);
}
if (!zstr(strat_str)) {
@@ -2778,7 +2786,7 @@ SWITCH_STANDARD_APP(fifo_function)
switch_channel_set_flag(other_channel, CF_BREAK);
while (switch_channel_ready(channel) && switch_channel_ready(other_channel) &&
- switch_channel_test_app_flag(other_channel, FIFO_APP_BRIDGE_TAG)) {
+ switch_channel_test_app_flag_key(FIFO_APP_KEY, other_channel, FIFO_APP_BRIDGE_TAG)) {
status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
if (!SWITCH_READ_ACCEPTABLE(status)) {
break;
@@ -2842,8 +2850,8 @@ SWITCH_STANDARD_APP(fifo_function)
switch_core_media_bug_resume(session);
switch_core_media_bug_resume(other_session);
- switch_process_import(session, other_channel, "fifo_caller_consumer_import");
- switch_process_import(other_session, channel, "fifo_consumer_caller_import");
+ switch_process_import(session, other_channel, "fifo_caller_consumer_import", switch_channel_get_variable(channel, "fifo_import_prefix"));
+ switch_process_import(other_session, channel, "fifo_consumer_caller_import", switch_channel_get_variable(other_channel, "fifo_import_prefix"));
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, FIFO_EVENT) == SWITCH_STATUS_SUCCESS) {
switch_channel_event_set_data(channel, event);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "FIFO-Name", argv[0]);
@@ -3082,7 +3090,7 @@ SWITCH_STANDARD_APP(fifo_function)
switch_mutex_unlock(globals.mutex);
- switch_channel_clear_app_flag_key(__FILE__, channel, FIFO_APP_BRIDGE_TAG);
+ switch_channel_clear_app_flag_key(FIFO_APP_KEY, channel, FIFO_APP_BRIDGE_TAG);
switch_core_media_bug_resume(session);
@@ -3512,6 +3520,12 @@ static void list_node(fifo_node_t *node, switch_xml_t x_report, int *off, int ve
switch_snprintf(tmp, sizeof(buffer), "%u", node->outbound_per_cycle);
switch_xml_set_attr_d(x_fifo, "outbound_per_cycle", tmp);
+ switch_snprintf(tmp, sizeof(buffer), "%u", node->ring_timeout);
+ switch_xml_set_attr_d(x_fifo, "ring_timeout", tmp);
+
+ switch_snprintf(tmp, sizeof(buffer), "%u", node->default_lag);
+ switch_xml_set_attr_d(x_fifo, "default_lag", tmp);
+
switch_snprintf(tmp, sizeof(buffer), "%u", node->outbound_priority);
switch_xml_set_attr_d(x_fifo, "outbound_priority", tmp);
@@ -3922,6 +3936,8 @@ static switch_status_t load_config(int reload, int del_all)
int taking_calls_i = 1;
int timeout_i = 60;
int lag_i = 10;
+ int ring_timeout = 60;
+ int default_lag = 30;
name = switch_xml_attr(fifo, "name");
@@ -3975,11 +3991,29 @@ static switch_status_t load_config(int reload, int del_all)
node->has_outbound = 1;
}
-
+ if ((val = switch_xml_attr(fifo, "outbound_ring_timeout"))) {
+ int tmp = atoi(val);
+ if (tmp > 10) {
+ ring_timeout = tmp;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Invalid ring_timeout: must be > 10 for queue %s\n", node->name);
+ }
+ }
+
+ if ((val = switch_xml_attr(fifo, "outbound_default_lag"))) {
+ int tmp = atoi(val);
+ if (tmp > 10) {
+ default_lag = tmp;
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Invalid default_lag: must be > 10 for queue %s\n", node->name);
+ }
+ }
+
+ node->ring_timeout = ring_timeout;
node->outbound_per_cycle = outbound_per_cycle;
node->outbound_priority = outbound_priority;
+ node->default_lag = default_lag;
-
if (outbound_strategy) {
node->outbound_strategy = parse_strat(outbound_strategy);
node->has_outbound = 1;
@@ -4011,14 +4045,14 @@ static switch_status_t load_config(int reload, int del_all)
if (timeout) {
if ((timeout_i = atoi(timeout)) < 10) {
- timeout_i = 60;
+ timeout_i = ring_timeout;
}
}
if (lag) {
if ((lag_i = atoi(lag)) < 0) {
- lag_i = 10;
+ lag_i = default_lag;
}
}
diff --git a/src/mod/applications/mod_mp4/Makefile b/src/mod/applications/mod_mp4/Makefile
new file mode 100644
index 0000000000..8c7932ae30
--- /dev/null
+++ b/src/mod/applications/mod_mp4/Makefile
@@ -0,0 +1,6 @@
+LOCAL_LDFLAGS=-lmp4v2
+LOCAL_SOURCES=mp4_helper.cpp
+LOCAL_OBJS=mp4_helper.o
+
+BASE=../../../..
+include $(BASE)/build/modmake.rules
diff --git a/src/mod/applications/mod_mp4/exception.hpp b/src/mod/applications/mod_mp4/exception.hpp
new file mode 100644
index 0000000000..75f84989a2
--- /dev/null
+++ b/src/mod/applications/mod_mp4/exception.hpp
@@ -0,0 +1,59 @@
+/*
+
+The contents of this file are subject to the Mozilla Public License
+Version 1.1 (the "License"); you may not use this file except in
+compliance with the License. You may obtain a copy of the License at
+http://www.mozilla.org/MPL/
+
+Software distributed under the License is distributed on an "AS IS"
+basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+License for the specific language governing rights and limitations
+under the License.
+
+The Original Code is MP4 Helper Library to Freeswitch MP4 module.
+
+The Initial Developer of the Original Code is
+Paulo Rogério Panhoto .
+Portions created by the Initial Developer are Copyright (C)
+the Initial Developer. All Rights Reserved.
+
+*/
+
+#ifndef EXCEPTION_HPP_
+#define EXCEPTION_HPP_
+
+#include
+#include
+
+class Exception: public std::exception {
+ public:
+ Exception()
+ {
+ }
+
+ Exception(const std::string & message): message_(message)
+ {
+ }
+
+ Exception(const std::exception & e): message_(e.what())
+ {
+ }
+
+ Exception(const Exception & e): message_(e.message_)
+ {
+ }
+
+ virtual ~Exception() throw()
+ {
+ }
+
+ const char * what() const throw()
+ {
+ return message_.c_str();
+ }
+
+ private:
+ std::string message_;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/mod/applications/mod_mp4/mod_mp4.cpp b/src/mod/applications/mod_mp4/mod_mp4.cpp
new file mode 100644
index 0000000000..a1114d1ffc
--- /dev/null
+++ b/src/mod/applications/mod_mp4/mod_mp4.cpp
@@ -0,0 +1,547 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2010, Anthony Minessale II
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Paulo Rogério Panhoto
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * mod_mp4 -- MP4 File Format support for video apps.
+ *
+ */
+
+#include
+#include "mp4_helper.hpp"
+#include "exception.hpp"
+
+
+#ifndef min
+#define min(x, y) ((x) < (y) ? (x) : (y))
+#endif
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_mp4_load);
+SWITCH_MODULE_DEFINITION(mod_mp4, mod_mp4_load, NULL, NULL);
+
+#define VID_BIT (1 << 31)
+#define VERSION 4201
+
+/*
+struct file_header {
+ int32_t version;
+ char video_codec_name[32];
+ char video_fmtp[128];
+ uint32_t audio_rate;
+ uint32_t audio_ptime;
+ switch_time_t created;
+};
+
+struct record_helper {
+ switch_core_session_t *session;
+ switch_mutex_t *mutex;
+ int fd;
+ int up;
+};
+*/
+
+struct AVParams {
+ switch_core_session_t * session;
+ switch_channel_t * channel;
+ switch_timer_t * timer;
+ switch_frame_t * frame;
+ switch_mutex_t * mutex;
+ bool video;
+ switch_payload_t pt;
+ MP4::Context * vc;
+ bool done;
+ bool * quit;
+};
+
+static void *SWITCH_THREAD_FUNC record_video_thread(switch_thread_t *thread, void *obj)
+{
+/*
+ record_helper *eh = reinterpret_cast(obj);
+ switch_core_session_t *session = eh->session;
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ switch_status_t status;
+ switch_frame_t *read_frame;
+ int bytes;
+
+ eh->up = 1;
+ while (switch_channel_ready(channel)) {
+ status = switch_core_session_read_video_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
+
+ if (!SWITCH_READ_ACCEPTABLE(status)) {
+ break;
+ }
+
+ if (switch_test_flag(read_frame, SFF_CNG)) {
+ continue;
+ }
+
+ bytes = read_frame->packetlen | VID_BIT;
+
+ switch_mutex_lock(eh->mutex);
+
+ if (write(eh->fd, &bytes, sizeof(bytes)) != (int) sizeof(bytes)) {
+ switch_mutex_unlock(eh->mutex);
+ break;
+ }
+
+ if (write(eh->fd, read_frame->packet, read_frame->packetlen) != (int) read_frame->packetlen) {
+ switch_mutex_unlock(eh->mutex);
+ break;
+ }
+
+ switch_mutex_unlock(eh->mutex);
+
+ switch_core_session_write_video_frame(session, read_frame, SWITCH_IO_FLAG_NONE, 0);
+ }
+ eh->up = 0;
+*/
+ return NULL;
+}
+
+SWITCH_STANDARD_APP(record_mp4_function)
+{
+/*
+ switch_status_t status;
+ switch_frame_t *read_frame;
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ struct record_helper eh = { 0 };
+ switch_thread_t *thread;
+ switch_threadattr_t *thd_attr = NULL;
+ int fd;
+ switch_mutex_t *mutex = NULL;
+ switch_codec_t codec, *vid_codec;
+ switch_codec_implementation_t read_impl = { };
+ int count = 0, sanity = 30;
+
+ switch_core_session_get_read_impl(session, &read_impl);
+ switch_channel_answer(channel);
+
+
+ while (switch_channel_up(channel) && !switch_channel_test_flag(channel, CF_VIDEO)) {
+ switch_yield(10000);
+
+ if (count) count--;
+
+ if (count == 0) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "%s waiting for video.\n", switch_channel_get_name(channel));
+ count = 100;
+ if (!--sanity) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "%s timeout waiting for video.\n",
+ switch_channel_get_name(channel));
+ return;
+ }
+ }
+ }
+
+ if (!switch_channel_ready(channel)) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "%s not ready.\n", switch_channel_get_name(channel));
+ return;
+ }
+
+/*
+ if ((fd = open((char *) data, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, S_IRUSR | S_IWUSR)) < 0) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Error opening file %s\n", (char *) data);
+ return;
+ }
+**
+
+ MP4::Context ctx(reinterpret_cast(data), true);
+
+ if (switch_core_codec_init(&codec,
+ "L16",
+ NULL,
+ read_impl.samples_per_second,
+ read_impl.microseconds_per_packet / 1000,
+ 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
+ NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS)
+ {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Audio Codec Activation Success\n");
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Audio Codec Activation Fail\n");
+ goto end;
+ }
+
+ switch_core_session_set_read_codec(session, &codec);
+
+ if (switch_channel_test_flag(channel, CF_VIDEO)) {
+ struct file_header h;
+ memset(&h, 0, sizeof(h));
+ vid_codec = switch_core_session_get_video_read_codec(session);
+
+ h.version = VERSION;
+ h.created = switch_micro_time_now();
+ switch_set_string(h.video_codec_name, vid_codec->implementation->iananame);
+ if (vid_codec->fmtp_in) {
+ switch_set_string(h.video_fmtp, vid_codec->fmtp_in);
+ }
+ h.audio_rate = read_impl.samples_per_second;
+ h.audio_ptime = read_impl.microseconds_per_packet / 1000;
+
+ if (write(fd, &h, sizeof(h)) != sizeof(h)) {
+ goto end;
+ }
+
+ switch_mutex_init(&mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
+ eh.mutex = mutex;
+ eh.fd = fd;
+ eh.session = session;
+ switch_threadattr_create(&thd_attr, switch_core_session_get_pool(session));
+ switch_threadattr_detach_set(thd_attr, 1);
+ switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
+ switch_thread_create(&thread, thd_attr, record_video_thread, &eh, switch_core_session_get_pool(session));
+ }
+
+
+ while (switch_channel_ready(channel)) {
+
+ status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
+
+ if (!SWITCH_READ_ACCEPTABLE(status)) {
+ break;
+ }
+
+ if (switch_test_flag(read_frame, SFF_CNG)) {
+ continue;
+ }
+
+ if (mutex) {
+ switch_mutex_lock(mutex);
+ }
+
+ if (write(fd, &read_frame->datalen, sizeof(read_frame->datalen)) != sizeof(read_frame->datalen)) {
+ if (mutex) {
+ switch_mutex_unlock(mutex);
+ }
+ break;
+ }
+
+ if (write(fd, read_frame->data, read_frame->datalen) != (int) read_frame->datalen) {
+ if (mutex) {
+ switch_mutex_unlock(mutex);
+ }
+ break;
+ }
+
+ if (mutex) {
+ switch_mutex_unlock(mutex);
+ }
+ }
+
+
+ end:
+
+ if (eh.up) {
+ while (eh.up) {
+ switch_cond_next();
+ }
+ }
+
+ switch_core_session_set_read_codec(session, NULL);
+ switch_core_codec_destroy(&codec);
+*/
+}
+
+static void *SWITCH_THREAD_FUNC play_video_function(switch_thread_t *thread, void *obj)
+{
+ AVParams * pt = reinterpret_cast(obj);
+ u_int next = 0, first = 0xffffffff;
+ u_int64_t ts = 0, control = 0;
+
+ bool ok;
+ bool sent = true;
+ pt->done = false;
+ switch_time_t start = switch_time_now();
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(pt->session), SWITCH_LOG_DEBUG, "Video thread Started\n");
+ while (!*pt->quit && switch_channel_ready(pt->channel)) {
+ if (pt->video) {
+ if (sent) {
+ switch_mutex_lock(pt->mutex);
+ pt->frame->packetlen = pt->frame->buflen;
+ ok = pt->vc->getVideoPacket(pt->frame->packet, pt->frame->packetlen, next);
+ switch_mutex_unlock(pt->mutex);
+ sent = false;
+ if (ok) {
+ switch_rtp_hdr_t *hdr = reinterpret_cast(pt->frame->packet);
+ if(first == 0xffffffff) first = next;
+ next -= first;
+ control = next * 90000LL / pt->vc->videoTrack().track.clock;
+ control -= first;
+ hdr->ts = htonl(control);
+ control = control * 1000 / 90;
+ if (pt->pt)
+ hdr->pt = pt->pt;
+ } else break;
+ }
+
+ ts = switch_time_now() - start;
+ int64_t wait = control > ts ? (control - ts) : 0;
+
+ if (wait > 0) {
+ switch_cond_next();
+ // wait the time for the next Video frame
+ switch_sleep(wait);
+ }
+
+ if (switch_channel_test_flag(pt->channel, CF_VIDEO)) {
+ switch_byte_t *data = (switch_byte_t *) pt->frame->packet;
+
+ pt->frame->data = data + 12;
+ pt->frame->datalen = pt->frame->packetlen - 12;
+ switch_core_session_write_video_frame(pt->session, pt->frame, SWITCH_IO_FLAG_NONE, 0);
+ sent = true;
+ }
+
+ }
+ }
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(pt->session), SWITCH_LOG_DEBUG, "Video thread ended\n");
+ pt->done = true;
+ return NULL;
+}
+
+static void *SWITCH_THREAD_FUNC play_audio_function(switch_thread_t *thread, void *obj)
+{
+ AVParams * pt = reinterpret_cast(obj);
+ u_int next = 0, first = 0xffffffff;
+ u_int64_t ts = 0, control = 0;
+
+ bool ok;
+ bool sent = true;
+ switch_dtmf_t dtmf = {0};
+ pt->done = false;
+ switch_frame_t * read_frame;
+
+ while (!*pt->quit && switch_channel_ready(pt->channel)) {
+ // event processing.
+ // -- SEE switch_ivr_play_say.c:1231 && mod_dptools.c:1428 && mod_dptools.c:1919
+ switch_core_session_read_frame(pt->session, &read_frame, SWITCH_IO_FLAG_SINGLE_READ, 0);
+
+ if (switch_channel_test_flag(pt->channel, CF_BREAK)) {
+ switch_channel_clear_flag(pt->channel, CF_BREAK);
+ break;
+ }
+
+ switch_ivr_parse_all_events(pt->session);
+
+ if (switch_channel_has_dtmf(pt->channel)) {
+ switch_channel_dequeue_dtmf(pt->channel, &dtmf);
+ const char * terminators = switch_channel_get_variable(pt->channel, SWITCH_PLAYBACK_TERMINATORS_VARIABLE);
+ if (terminators && !strcasecmp(terminators, "none")) terminators = NULL;
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(pt->session), SWITCH_LOG_DEBUG, "Digit %c\n", dtmf.digit);
+ if (terminators && strchr(terminators, dtmf.digit)) {
+ std::string digit(&dtmf.digit, 0, 1);
+ switch_channel_set_variable(pt->channel, SWITCH_PLAYBACK_TERMINATOR_USED, digit.c_str());
+ break;
+ }
+ }
+
+ switch_mutex_lock(pt->mutex);
+ pt->frame->datalen = pt->frame->buflen;
+ ok = pt->vc->getAudioPacket(pt->frame->data, pt->frame->datalen, next);
+ switch_mutex_unlock(pt->mutex);
+
+ if (ok) {
+ if (pt->frame->datalen > (int) pt->frame->buflen)
+ pt->frame->datalen = pt->frame->buflen;
+
+ switch_core_session_write_frame(pt->session, pt->frame, SWITCH_IO_FLAG_NONE, 0);
+ switch_core_timer_next(pt->timer);
+ }
+ else break;
+ }
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(pt->session), SWITCH_LOG_DEBUG, "Audio done\n");
+ *pt->quit = pt->done = true;
+ return NULL;
+}
+
+SWITCH_STANDARD_APP(play_mp4_function)
+{
+ switch_channel_t *channel = switch_core_session_get_channel(session);
+ switch_frame_t write_frame = { 0 }, vid_frame = {0};
+ switch_codec_t codec = { 0 }, vid_codec = {0}, *read_vid_codec;
+ unsigned char *aud_buffer;
+ unsigned char *vid_buffer;
+ switch_timer_t timer = { 0 };
+ switch_codec_implementation_t read_impl = {};
+ bool done = false;
+
+ try {
+ MP4::Context vc((char *) data);
+
+ switch_payload_t pt = 0;
+
+ switch_core_session_get_read_impl(session, &read_impl);
+
+ aud_buffer = (unsigned char *) switch_core_session_alloc(session, SWITCH_RECOMMENDED_BUFFER_SIZE);
+ vid_buffer = (unsigned char *) switch_core_session_alloc(session, SWITCH_RECOMMENDED_BUFFER_SIZE);
+
+ /*
+ if (!vc.isOpen())
+ {
+ char msgbuf[1024];
+ sprintf(msgbuf, "PLAYBACK ERROR (%s): FILE NOT FOUND.", (char*) data);
+ switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE, msgbuf);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT, "Error opening file %s\n", (char *) data);
+ return;
+ }
+
+ if(!vc.isSupported())
+ {
+ char msgbuf[1024];
+ sprintf(msgbuf, "PLAYBACK ERROR (%s): UNSUPPORTED FORMAT OR FILE NOT HINTED.", (char*) data);
+ switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE, msgbuf);
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_CRIT,
+ "Error reading track info. Maybe this file is not hinted.\n");
+ throw 1;
+ }
+ */
+
+ switch_channel_set_variable(channel, "sip_force_video_fmtp", vc.videoTrack().fmtp.c_str());
+ switch_channel_answer(channel);
+
+ if ((read_vid_codec = switch_core_session_get_video_read_codec(session))) {
+ pt = read_vid_codec->agreed_pt;
+ }
+
+ write_frame.codec = &codec;
+ write_frame.data = aud_buffer;
+ write_frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE;
+
+ vid_frame.codec = &vid_codec;
+ vid_frame.packet = vid_buffer;
+ vid_frame.data = vid_buffer + 12;
+ vid_frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE - 12;
+ switch_set_flag((&vid_frame), SFF_RAW_RTP);
+ switch_set_flag((&vid_frame), SFF_PROXY_PACKET);
+
+ if (switch_core_timer_init(&timer, "soft", read_impl.microseconds_per_packet / 1000,
+ read_impl.samples_per_packet, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Timer Activation Fail\n");
+ throw 2;
+ }
+
+ if (switch_core_codec_init(&codec,
+ vc.audioTrack().codecName,
+ NULL,
+ vc.audioTrack().clock,
+ vc.audioTrack().packetLength,
+ 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
+ NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Audio Codec Activation Success\n");
+ } else {
+ throw Exception("Audio Codec Activation Fail");
+ }
+
+ if (switch_core_codec_init(&vid_codec,
+ vc.videoTrack().track.codecName,
+ NULL,
+ 0,
+ 0,
+ 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
+ NULL, switch_core_session_get_pool(session)) == SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Video Codec Activation Success\n");
+ } else
+ {
+ throw Exception("Video Codec Activation Fail");
+ }
+ switch_core_session_set_read_codec(session, &codec);
+
+ AVParams vpt;
+ vpt.session = session;
+ vpt.channel = channel;
+ vpt.frame = &vid_frame;
+ vpt.timer = &timer;
+ vpt.video = true;
+ vpt.pt = pt;
+ vpt.vc = &vc;
+ switch_mutex_init(&vpt.mutex, SWITCH_MUTEX_DEFAULT, switch_core_session_get_pool(session));
+ vpt.quit = &done;
+
+ switch_threadattr_t * thd_attr;
+ switch_threadattr_create(&thd_attr, switch_core_session_get_pool(session));
+ switch_threadattr_detach_set(thd_attr, 1);
+ switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
+ switch_thread_t *thread;
+ switch_thread_create(&thread, thd_attr, play_video_function, (void*)&vpt, switch_core_session_get_pool(session));
+
+ AVParams apt;
+ apt.session = session;
+ apt.channel = channel;
+ apt.frame = &write_frame;
+ apt.timer = &timer;
+ apt.video = false;
+ apt.vc = &vc;
+ apt.mutex = vpt.mutex;
+ apt.quit = &done;
+ play_audio_function(NULL, &apt);
+
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Waiting for video thread to join.\n");
+ while (!vpt.done) {
+ switch_cond_next();
+ }
+
+ switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE, "FILE PLAYED");
+ } catch(const std::exception & e)
+ {
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "%s\n", e.what());
+ switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE,
+ (std::string("PLAYBACK_FAILED - ") + e.what()).c_str());
+ }catch(...)
+ {
+ switch_channel_set_variable(channel, SWITCH_CURRENT_APPLICATION_RESPONSE_VARIABLE, "PLAYBACK_FAILED - See FS logs for detail.");
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Exception caught.\n");
+ }
+
+ switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "All done.\n");
+ if (timer.interval) switch_core_timer_destroy(&timer);
+
+ switch_core_session_set_read_codec(session, NULL);
+
+ if (switch_core_codec_ready(&codec)) switch_core_codec_destroy(&codec);
+
+ if (switch_core_codec_ready(&vid_codec)) switch_core_codec_destroy(&vid_codec);
+}
+
+SWITCH_MODULE_LOAD_FUNCTION(mod_mp4_load)
+{
+ switch_application_interface_t *app_interface;
+
+ /* connect my internal structure to the blank pointer passed to me */
+ *module_interface = switch_loadable_module_create_module_interface(pool, modname);
+
+ SWITCH_ADD_APP(app_interface, "play_mp4", "play an MP4 file", "play an MP4 file", play_mp4_function, "", SAF_NONE);
+ //SWITCH_ADD_APP(app_interface, "record_mp4", "record an MP4 file", "record an MP4 file", record_mp4_function, "", SAF_NONE);
+
+ /* indicate that the module should continue to be loaded */
+ return SWITCH_STATUS_SUCCESS;
+}
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c
+ * indent-tabs-mode:t
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
+ */
diff --git a/src/mod/applications/mod_mp4/mp4_helper.cpp b/src/mod/applications/mod_mp4/mp4_helper.cpp
new file mode 100644
index 0000000000..a55f5dbeb5
--- /dev/null
+++ b/src/mod/applications/mod_mp4/mp4_helper.cpp
@@ -0,0 +1,133 @@
+/*
+
+The contents of this file are subject to the Mozilla Public License
+Version 1.1 (the "License"); you may not use this file except in
+compliance with the License. You may obtain a copy of the License at
+http://www.mozilla.org/MPL/
+
+Software distributed under the License is distributed on an "AS IS"
+basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+License for the specific language governing rights and limitations
+under the License.
+
+The Original Code is MP4 Helper Library to the Freeswitch MP4 Module.
+
+The Initial Developer of the Original Code is
+Paulo Rogério Panhoto .
+Portions created by the Initial Developer are Copyright (C)
+the Initial Developer. All Rights Reserved.
+
+
+*/
+
+#include "mp4_helper.hpp"
+
+namespace MP4
+{
+
+ Context::Context(const char * file, bool newFile)
+ {
+ if(newFile) create(file);
+ else open(file);
+ }
+
+ Context::~Context()
+ {
+ close();
+ }
+
+ void Context::open(const char * file)
+ {
+ fh = MP4Read(file, 0);
+ if (fh == MP4_INVALID_FILE_HANDLE) throw Exception(file, "Open failed");
+ getTracks(file);
+ }
+
+ void Context::create(const char * file)
+ {
+ fh = MP4Create(file);
+ if (fh == MP4_INVALID_FILE_HANDLE) throw Exception(file, "Create file failed");
+ }
+
+ void Context::close()
+ {
+ if (!isOpen()) return;
+ MP4Close(fh);
+ }
+
+ void Context::getTracks(const char * file)
+ {
+ int i = 0;
+ bool audioTrack = false, videoTrack = false;
+
+ if (!isOpen()) throw Exception(file, "File is closed.");
+
+ for (;;)
+ {
+ TrackProperties track;
+ if((track.hint = MP4FindTrackId(fh, i++, MP4_HINT_TRACK_TYPE, 0)) == MP4_INVALID_TRACK_ID) break;
+
+ MP4GetHintTrackRtpPayload(fh, track.hint, &track.codecName, &track.payload, NULL, NULL);
+
+ track.track = MP4GetHintTrackReferenceTrackId(fh, track.hint);
+ if(track.track == MP4_INVALID_TRACK_ID) continue;
+ track.clock = MP4GetTrackTimeScale(fh, track.hint);
+
+ if (!strcmp(MP4GetTrackType(fh, track.track), MP4_AUDIO_TRACK_TYPE)) {
+ audioTrack = true;
+
+ if(!strncmp(track.codecName, "PCM", 3))
+ track.packetLength = 20;
+ else
+ track.packetLength = track.clock = 0;
+
+ audio = track;
+ } else if (!strcmp(MP4GetTrackType(fh, track.track), MP4_VIDEO_TRACK_TYPE)) {
+ videoTrack = true;
+
+ const char * sdp = MP4GetHintTrackSdp(fh, track.hint);
+ const char * fmtp = strstr(sdp, "fmtp");
+
+ if (fmtp) {
+ // finds beginning of 'fmtp' value;
+ for(fmtp += 5; *fmtp != ' '; ++fmtp);
+ ++fmtp;
+
+ const char * eol = fmtp;
+ for(;*eol != '\r' && *eol != '\n'; ++eol);
+ video.fmtp = std::string(fmtp, eol);
+ }
+ video.track = track;
+ }
+ }
+
+ if (!audioTrack || !videoTrack) throw Exception(file, "Missing audio/video track.");
+ }
+
+ bool Context::getVideoPacket(void * buffer, u_int & size, u_int & ts)
+ {
+ return getPacket(video.track.hint, video.track.runtime, true, buffer, size, ts);
+ }
+
+ bool Context::getAudioPacket(void * buffer, u_int & size, u_int & ts)
+ {
+ return getPacket(audio.hint, audio.runtime, false, buffer, size, ts);
+ }
+
+ bool Context::getPacket(MP4TrackId hint, RuntimeProperties & rt,
+ bool header, void * buffer, u_int & size, u_int & ts)
+ {
+ if (rt.frame == 0 || rt.packet == rt.packetsPerFrame) {
+ ++rt.frame;
+ if(!MP4ReadRtpHint(fh, hint, rt.frame, &rt.packetsPerFrame))
+ return false;
+ rt.packet = 0;
+ rt.last_frame = MP4GetSampleTime(fh, hint, rt.frame);
+ }
+
+ ts = rt.last_frame;
+ if (!MP4ReadRtpPacket(fh, hint, rt.packet, (u_int8_t **) &buffer, &size, 0, header, true)) return false;
+ ++rt.packet;
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/src/mod/applications/mod_mp4/mp4_helper.hpp b/src/mod/applications/mod_mp4/mp4_helper.hpp
new file mode 100644
index 0000000000..e2da30733f
--- /dev/null
+++ b/src/mod/applications/mod_mp4/mp4_helper.hpp
@@ -0,0 +1,137 @@
+/*
+
+The contents of this file are subject to the Mozilla Public License
+Version 1.1 (the "License"); you may not use this file except in
+compliance with the License. You may obtain a copy of the License at
+http://www.mozilla.org/MPL/
+
+Software distributed under the License is distributed on an "AS IS"
+basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+License for the specific language governing rights and limitations
+under the License.
+
+The Original Code is MP4 Helper Library to Freeswitch MP4 module.
+
+The Initial Developer of the Original Code is
+Paulo Rogério Panhoto .
+Portions created by the Initial Developer are Copyright (C)
+the Initial Developer. All Rights Reserved.
+
+*/
+
+#ifndef MP4_HELPER_HPP_
+#define MP4_HELPER_HPP_
+
+#include
+#include
+#include
+#include
+
+namespace MP4
+{
+ class Exception: public std::exception {
+ public:
+ Exception(const std::string & file, const std::string & error)
+ : description_(file + ':' + error)
+ {
+ }
+
+ const char * what() const throw()
+ {
+ return description_.c_str();
+ }
+
+ ~Exception() throw()
+ {
+ }
+
+ private:
+ std::string description_;
+ };
+
+ struct RuntimeProperties {
+ u_int32_t frame; // sampleID
+ u_int16_t packetsPerFrame;
+ u_int16_t packet; // packetID
+ u_int32_t last_frame; // timestamp
+
+ RuntimeProperties(): frame(0), packetsPerFrame(0), packet(0)
+ {
+ }
+ };
+
+
+ struct TrackProperties {
+ MP4TrackId hint;
+ MP4TrackId track;
+
+ char * codecName;
+ u_int8_t payload;
+ u_int32_t clock;
+ u_int32_t packetLength; // packet Length in time (ms)
+
+ RuntimeProperties runtime;
+
+ TrackProperties(): hint(MP4_INVALID_TRACK_ID), track(MP4_INVALID_TRACK_ID),
+ codecName(NULL), payload(0), clock(0), packetLength(0)
+ {
+ }
+ };
+
+ typedef TrackProperties AudioProperties;
+
+ struct VideoProperties {
+ TrackProperties track;
+ std::string fmtp;
+
+ VideoProperties()
+ {
+ }
+
+ VideoProperties(const TrackProperties & rhs): track(rhs)
+ {
+ }
+ };
+
+ class Context {
+ public:
+
+ Context(const char * file, bool create = false);
+ ~Context();
+
+ void open(const char * file);
+
+ void create(const char * file);
+
+ void close();
+
+ // returns: TRUE = has more data, FALSE = end-of-stream or failure
+ bool getVideoPacket(void * buffer, u_int & size, u_int & ts);
+
+ // returns: TRUE = has more data, FALSE = end-of-stream or failure
+ bool getAudioPacket(void * buffer, u_int & size, u_int & ts);
+
+ bool isOpen() const { return fh != MP4_INVALID_FILE_HANDLE; }
+
+ bool isSupported() const { return audio.track != MP4_INVALID_TRACK_ID && video.track.track != MP4_INVALID_TRACK_ID; }
+
+ const AudioProperties & audioTrack() const { return audio; }
+
+ const VideoProperties & videoTrack() const { return video; }
+
+ private:
+ MP4FileHandle fh;
+ AudioProperties audio;
+
+ VideoProperties video;
+
+ // Prevent copy construction.
+ Context(const Context &);
+
+ bool getPacket(MP4TrackId hint, RuntimeProperties & rt,
+ bool header, void * buffer, u_int & size, u_int & ts);
+
+ void getTracks(const char * file);
+ };
+}
+#endif
diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c b/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c
index aa7d05cf9e..005924194f 100644
--- a/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c
+++ b/src/mod/applications/mod_spandsp/mod_spandsp_dsp.c
@@ -140,7 +140,7 @@ switch_status_t spandsp_inband_dtmf_session(switch_core_session_t *session)
}
if ((status = switch_core_media_bug_add(session, "spandsp_dtmf_detect", NULL,
- inband_dtmf_callback, pvt, 0, SMBF_READ_REPLACE, &bug)) != SWITCH_STATUS_SUCCESS) {
+ inband_dtmf_callback, pvt, 0, SMBF_READ_REPLACE | SMBF_NO_PAUSE, &bug)) != SWITCH_STATUS_SUCCESS) {
return status;
}
diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c
index 758e5dcf25..e939d7f315 100644
--- a/src/mod/applications/mod_voicemail/mod_voicemail.c
+++ b/src/mod/applications/mod_voicemail/mod_voicemail.c
@@ -69,7 +69,8 @@ typedef enum {
typedef enum {
VM_MOVE_NEXT,
- VM_MOVE_PREV
+ VM_MOVE_PREV,
+ VM_MOVE_SAME
} msg_move_t;
#define VM_PROFILE_CONFIGITEM_COUNT 100
@@ -107,6 +108,7 @@ struct vm_profile {
char rew_key[2];
char prev_msg_key[2];
char next_msg_key[2];
+ char repeat_msg_key[2];
char urgent_key[2];
char operator_key[2];
char vmain_key[2];
@@ -480,7 +482,7 @@ vm_profile_t *profile_set_config(vm_profile_t *profile)
SWITCH_CONFIG_SET_ITEM(profile->config[i++], "skip-greet-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->skip_greet_key, "#", &config_dtmf, NULL, NULL);
SWITCH_CONFIG_SET_ITEM(profile->config[i++], "skip-info-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
- &profile->skip_info_key, "", &config_dtmf, NULL, NULL);
+ &profile->skip_info_key, "*", &config_dtmf, NULL, NULL);
SWITCH_CONFIG_SET_ITEM(profile->config[i++], "config-menu-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->config_menu_key, "5", &config_dtmf, NULL, NULL);
SWITCH_CONFIG_SET_ITEM(profile->config[i++], "record-greeting-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
@@ -510,9 +512,11 @@ vm_profile_t *profile_set_config(vm_profile_t *profile)
SWITCH_CONFIG_SET_ITEM(profile->config[i++], "ff-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->ff_key, "6", &config_dtmf, NULL, NULL);
SWITCH_CONFIG_SET_ITEM(profile->config[i++], "rew-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE, &profile->rew_key, "4", &config_dtmf, NULL, NULL);
SWITCH_CONFIG_SET_ITEM(profile->config[i++], "previous-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
- &profile->prev_msg_key, "", &config_dtmf, NULL, NULL);
+ &profile->prev_msg_key, "1", &config_dtmf, NULL, NULL);
SWITCH_CONFIG_SET_ITEM(profile->config[i++], "next-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
- &profile->next_msg_key, "", &config_dtmf, NULL, NULL);
+ &profile->next_msg_key, "3", &config_dtmf, NULL, NULL);
+ SWITCH_CONFIG_SET_ITEM(profile->config[i++], "repeat-message-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
+ &profile->repeat_msg_key, "0", &config_dtmf, NULL, NULL);
SWITCH_CONFIG_SET_ITEM(profile->config[i++], "urgent-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
&profile->urgent_key, "*", &config_dtmf, NULL, NULL);
SWITCH_CONFIG_SET_ITEM(profile->config[i++], "operator-key", SWITCH_CONFIG_STRING, CONFIG_RELOADABLE,
@@ -823,7 +827,8 @@ static switch_status_t control_playback(switch_core_session_t *session, void *in
if (!cc->noexit
&& (dtmf->digit == *cc->profile->delete_file_key || dtmf->digit == *cc->profile->save_file_key
- || dtmf->digit == *cc->profile->prev_msg_key || dtmf->digit == *cc->profile->next_msg_key
+ || dtmf->digit == *cc->profile->prev_msg_key || dtmf->digit == *cc->profile->next_msg_key
+ || dtmf->digit == *cc->profile->repeat_msg_key
|| dtmf->digit == *cc->profile->terminator_key || dtmf->digit == *cc->profile->skip_info_key
|| dtmf->digit == *cc->profile->email_key || dtmf->digit == *cc->profile->forward_key)) {
*cc->buf = dtmf->digit;
@@ -1483,6 +1488,8 @@ static switch_status_t listen_file(switch_core_session_t *session, vm_profile_t
}
if (!strcmp(input, profile->prev_msg_key)) {
cbt->move = VM_MOVE_PREV;
+ } else if (!strcmp(input, profile->repeat_msg_key)) {
+ cbt->move = VM_MOVE_SAME;
} else if (!strcmp(input, profile->next_msg_key)) {
cbt->move = VM_MOVE_NEXT;
} else if (!strcmp(input, profile->listen_file_key)) {
@@ -1538,6 +1545,7 @@ static switch_status_t listen_file(switch_core_session_t *session, vm_profile_t
if (voicemail_inject(cmd, session) == SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_NOTICE, "Sent Carbon Copy to %s\n", vm_cc);
TRY_CODE(switch_ivr_phrase_macro(session, VM_ACK_MACRO, "saved", NULL, NULL));
+ cbt->move = VM_MOVE_SAME;
} else {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Failed to Carbon Copy to %s\n", vm_cc);
TRY_CODE(switch_ivr_phrase_macro(session, VM_INVALID_EXTENSION_MACRO, vm_cc, NULL, NULL));
@@ -1884,7 +1892,10 @@ static void voicemail_check_main(switch_core_session_t *session, vm_profile_t *p
} else {
cur_message -= 2;
}
+ } else if (cbt.move == VM_MOVE_SAME) {
+ cur_message -= 1;
}
+
if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
break;
}
@@ -2893,6 +2904,7 @@ static switch_status_t voicemail_leave_main(switch_core_session_t *session, vm_p
char *read_flags = NORMAL_FLAG_STRING;
int priority = 3;
int email_attach = 1;
+ char *operator_ext = NULL;
char buf[2];
char key_buf[80];
char *greet_path = NULL;
@@ -2973,6 +2985,8 @@ static switch_status_t voicemail_leave_main(switch_core_session_t *session, vm_p
vm_enabled = !switch_false(val);
} else if (!strcasecmp(var, "vm-message-ext")) {
vm_ext = switch_core_session_strdup(session, val);
+ } else if (!strcasecmp(var, "vm-operator-extension")) {
+ operator_ext = switch_core_session_strdup(session, val);
}
}
}
@@ -3089,12 +3103,13 @@ static switch_status_t voicemail_leave_main(switch_core_session_t *session, vm_p
greet_key_press:
if (switch_stristr(buf, profile->login_keys)) {
voicemail_check_main(session, profile, domain_name, id, 0);
- } else if (!zstr(profile->operator_ext) && !zstr(profile->operator_key) && !strcasecmp(buf, profile->operator_key) ) {
+ } else if ((!zstr(profile->operator_ext) || !zstr(operator_ext)) && !zstr(profile->operator_key) && !strcasecmp(buf, profile->operator_key) ) {
int argc;
char *argv[4];
char *mycmd;
- if (!zstr(profile->operator_ext) && (mycmd = switch_core_session_strdup(session, profile->operator_ext))) {
+ if ((!zstr(operator_ext) && (mycmd = switch_core_session_strdup(session, operator_ext))) ||
+ (!zstr(profile->operator_ext) && (mycmd = switch_core_session_strdup(session, profile->operator_ext)))) {
argc = switch_separate_string(mycmd, ' ', argv, (sizeof(argv) / sizeof(argv[0])));
if (argc >= 1 && argc <= 4) {
switch_ivr_session_transfer(session, argv[0], argv[1], argv[2]);
diff --git a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.2010.vcxproj b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.2010.vcxproj
index ca533a4cfa..7028e53447 100644
--- a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.2010.vcxproj
+++ b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.2010.vcxproj
@@ -189,6 +189,9 @@
{b4b62169-5ad4-4559-8707-3d933ac5db39}
+
+ {df018947-0fff-4eb3-bdee-441dc81da7a4}
+
{70a49bc2-7500-41d0-b75d-edcc5be987a0}
diff --git a/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c b/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c
index c84dac4509..6e6fe58af6 100644
--- a/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c
+++ b/src/mod/codecs/mod_sangoma_codec/mod_sangoma_codec.c
@@ -33,7 +33,6 @@
*/
#include "switch.h"
-#include "g711.h"
#include
@@ -41,7 +40,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sangoma_codec_load);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_sangoma_codec_shutdown);
SWITCH_MODULE_DEFINITION(mod_sangoma_codec, mod_sangoma_codec_load, mod_sangoma_codec_shutdown, NULL);
-#define IANA_ULAW 0
+#define IANA_LINEAR 10
#define SANGOMA_SESS_HASH_KEY_FORMAT "sngtc%lu"
/* it seemed we need higher PTIME than the calling parties, so we assume nobody will use higher ptime than 40 */
@@ -79,35 +78,48 @@ typedef struct vocallo_codec_s {
int bpfd; /* bytes per frame decompressed */
int bpfc; /* bytes per frame compressed */
+ int sampling_rate; /* declared sampling rate */
+ int actual_sampling_rate; /* true sampling rate */
int autoinit; /* initialize on start loop or manually */
} vocallo_codec_t;
+#define ILBC_133_PAYLOAD 97
+#define ILBC_152_PAYLOAD 98
vocallo_codec_t g_codec_map[] =
{
- { SNGTC_CODEC_PCMU, 0, "PCMU", "Sangoma PCMU", 40, 64000, 10000, 80, 160, 80, 1 },
- { SNGTC_CODEC_PCMA, 8, "PCMA", "Sangoma PCMA", 40, 64000, 10000, 80, 160, 80, 1 },
- { SNGTC_CODEC_L16_1, 10, "L16", "Sangoma L16", 40, 120000, 10000, 80, 160, 160, 1 },
- { SNGTC_CODEC_G729AB, 18, "G729", "Sangoma G729", 40, 8000, 10000, 80, 160, 10, 1 },
- { SNGTC_CODEC_G726_32, 122, "G726-32", "Sangoma G.726 32k", 40, 32000, 10000, 80, 160, 40, 1 },
- { SNGTC_CODEC_GSM_FR, 3, "GSM", "Sangoma GSM", 20, 13200, 20000, 160, 320, 33, 0 },
-#if 0
- /* FIXME: grandstream crashes with iLBC implementation */
- { SNGTC_CODEC_ILBC, 97, "iLBC", "Sangoma ILBC", -1, -1, -1, -1, -1, -1, 0 },
- /* FIXME: sampling rate seems wrong with this, audioooo soooundssssss sloooooow ... */
- { SNGTC_CODEC_G722, 9, "G722", "Sangoma G722", 20, 64000, 20000, 160, 640, 160, 0 },
-#endif
- { -1, -1, NULL, NULL, -1, -1, -1, -1, -1, -1 },
+ /* auto-init codecs */
+ { SNGTC_CODEC_PCMU, 0, "PCMU", "Sangoma PCMU", 40, 64000, 10000, 80, 160, 80, 8000, 8000, 1 },
+ { SNGTC_CODEC_PCMA, 8, "PCMA", "Sangoma PCMA", 40, 64000, 10000, 80, 160, 80, 8000, 8000, 1 },
+ { SNGTC_CODEC_L16_1, 10, "L16", "Sangoma L16", 40, 120000, 10000, 80, 160, 160, 8000, 8000, 0 },
+ { SNGTC_CODEC_L16_2, 10, "L16", "Sangoma L16 2", 40, 320000, 10000, 80, 320, 320, 16000, 16000, 0 },
+ { SNGTC_CODEC_G729AB, 18, "G729", "Sangoma G729", 40, 8000, 10000, 80, 160, 10, 8000, 8000, 1 },
+ { SNGTC_CODEC_G726_32, 122, "G726-32", "Sangoma G.726 32k", 40, 32000, 10000, 80, 160, 40, 8000, 8000, 1 },
+ { SNGTC_CODEC_G722, 9, "G722", "Sangoma G722", 20, 64000, 10000, 80, 160, 80, 8000, 8000, 1 },
+
+ /* manually initialized */
+ { SNGTC_CODEC_GSM_FR, 3, "GSM", "Sangoma GSM", 20, 13200, 20000, 160, 320, 33, 8000, 8000, 0 },
+ { SNGTC_CODEC_G723_1_63, 4, "G723", "Sangoma G723", 90, 6300, 30000, 240, 480, 24, 8000, 8000, 0 },
+ { SNGTC_CODEC_AMR_1220, 96, "AMR", "Sangoma AMR", 20, 12200, 20000, 160, 320, 0, 8000, 8000, 0 },
+ { SNGTC_CODEC_ILBC_133, ILBC_133_PAYLOAD, "iLBC", "Sangoma iLBC", -1, -1, -1, -1, -1, -1, -1, -1, 0 },
+ { SNGTC_CODEC_ILBC_152, ILBC_152_PAYLOAD, "iLBC", "Sangoma iLBC", -1, -1, -1, -1, -1, -1, -1, -1, 0 },
+ { -1, -1, NULL, NULL, -1, -1, -1, -1, -1, -1, -1, -1, 0 },
};
/* RFC3389 RTP Payload for Comfort Noise */
#define IANACODE_CN 13
/* default codec list to load, users may override, special codec 'all' registers everything available unless listed in noregister */
-static char g_codec_register_list[1024] = "all";
+static char g_codec_register_list[1024] = "G729";
/* default codec list to NOT load, users may override */
static char g_codec_noregister_list[1024] = "";
+#define SANGOMA_RTP_QUEUE_SIZE 4
+struct sangoma_rtp_payload {
+ uint8_t data[SWITCH_RECOMMENDED_BUFFER_SIZE];
+ int32_t datalen;
+};
+
struct codec_data {
/* sngtc request and reply */
sngtc_codec_request_t request;
@@ -131,7 +143,15 @@ struct codec_data {
/* avg Rx time */
switch_time_t avgrxus;
switch_time_t last_rx_time;
+ switch_time_t last_func_call_time;
+ /* RTP queue. The bigger the queue, the bigger the possible delay */
+ struct sangoma_rtp_payload rtp_queue[SANGOMA_RTP_QUEUE_SIZE];
+ uint8_t queue_windex;
+ uint8_t queue_rindex;
+ uint8_t queue_size;
+ uint8_t queue_max_ever;
+ unsigned debug_timing:1;
};
struct sangoma_transcoding_session {
@@ -172,6 +192,17 @@ static vocallo_codec_t *get_codec_from_iana(int iana)
return NULL;
}
+static vocallo_codec_t *get_codec_from_id(int id)
+{
+ int i;
+ for (i = 0; g_codec_map[i].codec_id != -1; i++) {
+ if (id == g_codec_map[i].codec_id) {
+ return &g_codec_map[i];
+ }
+ }
+ return NULL;
+}
+
static int sangoma_create_rtp_port(void *usr_priv, uint32_t host_ip, uint32_t *p_rtp_port, void **rtp_fd)
{
struct in_addr local_ip_addr = { 0 };
@@ -229,8 +260,8 @@ static int sangoma_create_rtp(void *usr_priv, sngtc_codec_request_leg_t *codec_r
sngtc_codec_ipv4_hex_to_str(codec_reply_leg->codec_ip, codec_ip);
iana = codec_id_to_iana(codec_req_leg->codec_id);
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Creating RTP session for host (%s/%d) vocallo(%s/%d) Iana=%d ms=%d idx=%lu\n",
- local_ip, rtp_port, codec_ip, codec_reply_leg->codec_udp_port, iana,
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Creating RTP session for host (%s/%d) vocallo(%s/%d) Iana=%d CodecId=%d ms=%d idx=%lu\n",
+ local_ip, rtp_port, codec_ip, codec_reply_leg->codec_udp_port, iana, codec_req_leg->codec_id,
codec_req_leg->ms*1000, sess->sessid);
/* create the RTP socket */
@@ -268,11 +299,11 @@ static switch_status_t switch_sangoma_init(switch_codec_t *codec, switch_codec_f
struct sangoma_transcoding_session *sess = NULL;
vocallo_codec_t *vcodec;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sangoma init called.\n");
-
encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sangoma init called (encoding = %d, decoding = %d, iana = %d)\n", encoding ? 1 : 0, decoding ? 1 : 0, codec->implementation->ianacode);
+
if (!(encoding || decoding)) {
return SWITCH_STATUS_FALSE;
}
@@ -295,7 +326,8 @@ static switch_status_t switch_sangoma_init(switch_codec_t *codec, switch_codec_f
if (encoding) {
sess->encoder.request.usr_priv = sess;
sess->encoder.request.a.host_ip = g_rtpip;
- sess->encoder.request.a.codec_id = SNGTC_CODEC_PCMU;
+ sess->encoder.request.a.codec_id = vcodec->actual_sampling_rate == 16000
+ ? SNGTC_CODEC_L16_2 : SNGTC_CODEC_L16_1;
sess->encoder.request.a.ms = codec->implementation->microseconds_per_packet/1000;
sess->encoder.request.b.host_ip = g_rtpip;
@@ -310,7 +342,8 @@ static switch_status_t switch_sangoma_init(switch_codec_t *codec, switch_codec_f
sess->decoder.request.a.ms = codec->implementation->microseconds_per_packet/1000;
sess->decoder.request.b.host_ip = g_rtpip;
- sess->decoder.request.b.codec_id = SNGTC_CODEC_PCMU;
+ sess->decoder.request.b.codec_id = vcodec->actual_sampling_rate == 16000
+ ? SNGTC_CODEC_L16_2 : SNGTC_CODEC_L16_1;
sess->decoder.request.b.ms = codec->implementation->microseconds_per_packet/1000;
}
@@ -319,6 +352,7 @@ static switch_status_t switch_sangoma_init(switch_codec_t *codec, switch_codec_f
switch_snprintf(sess->hashkey, sizeof(sess->hashkey), SANGOMA_SESS_HASH_KEY_FORMAT, sess->sessid);
switch_core_hash_insert(g_sessions_hash, sess->hashkey, sess);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sangoma init done for codec %s/%s, iana = %d\n", codec->implementation->iananame, vcodec->fs_name, codec->implementation->ianacode);
switch_mutex_unlock(g_sessions_lock);
codec->private_info = sess;
@@ -352,6 +386,35 @@ static switch_status_t switch_sangoma_init_ilbc(switch_codec_t *codec, switch_co
return switch_sangoma_init(codec, flags, codec_settings);
}
+
+static void flush_rtp(switch_rtp_t *rtp)
+{
+ switch_status_t sres;
+ switch_frame_t read_frame;
+ int flushed = 0;
+ int sanity = 1000;
+ while (sanity--) {
+ sres = switch_rtp_zerocopy_read_frame(rtp, &read_frame, SWITCH_IO_FLAG_NOBLOCK);
+ if (sres == SWITCH_STATUS_GENERR) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to read on Sangoma encoder RTP session while flushing: %d\n", sres);
+ return;
+ }
+ if (!read_frame.datalen) {
+ break;
+ }
+ flushed++;
+ }
+ if (!sanity) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Insanely big UDP queue!\n");
+ }
+}
+
+#define SAFE_INDEX_INC(array, index) \
+ (index)++; \
+ if ((index) == switch_arraylen((array))) { \
+ (index) = 0; \
+ }
+
static switch_status_t switch_sangoma_encode(switch_codec_t *codec, switch_codec_t *other_codec, /* codec that was used by the other side */
void *decoded_data, /* decoded data that we must encode */
uint32_t decoded_data_len /* decoded data length */ ,
@@ -363,16 +426,21 @@ static switch_status_t switch_sangoma_encode(switch_codec_t *codec, switch_codec
{
/* FS core checks the actual samples per second and microseconds per packet to determine the buffer size in the worst case scenario, no need to check
* whether the buffer passed in by the core (encoded_data) will be big enough */
- switch_frame_t ulaw_frame;
+ switch_frame_t linear_frame;
switch_frame_t encoded_frame;
- switch_status_t sres;
- switch_time_t now_time, difftime;
- unsigned char ebuf_ulaw[decoded_data_len / 2];
- short *dbuf_linear;
+ switch_status_t sres = SWITCH_STATUS_FALSE;
+ uint16_t decoded_byteswapped_data[SWITCH_RECOMMENDED_BUFFER_SIZE];
+ uint16_t *decoded_data_linear = decoded_data;
+ switch_time_t now_time = 0, difftime = 0;
+ switch_time_t func_start_time = 0, func_end_time = 0;
int i = 0;
int res = 0;
struct sangoma_transcoding_session *sess = codec->private_info;
+ if (sess->encoder.debug_timing) {
+ func_start_time = switch_micro_time_now();
+ }
+
/* start assuming we will not encode anything */
*encoded_data_len = 0;
@@ -390,23 +458,30 @@ static switch_status_t switch_sangoma_encode(switch_codec_t *codec, switch_codec
sess->encoder.txrtp = sess->encoder.reply.tx_fd;
sess->encoder.rxrtp = sess->encoder.reply.rx_fd;
switch_mutex_unlock(g_sessions_lock);
+ flush_rtp(sess->encoder.rxrtp);
}
- /* transcode to ulaw first */
- dbuf_linear = decoded_data;
-
- for (i = 0; i < decoded_data_len / sizeof(short); i++) {
- ebuf_ulaw[i] = linear_to_ulaw(dbuf_linear[i]);
+ if (sess->encoder.debug_timing && sess->encoder.last_func_call_time) {
+ difftime = func_start_time - sess->encoder.last_func_call_time;
+ if (difftime > 25000 || difftime < 15000) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "%ldus since last read on encoding session %lu\n", (long)difftime, sess->sessid);
+ }
}
-
+
/* do the writing */
- memset(&ulaw_frame, 0, sizeof(ulaw_frame));
- ulaw_frame.source = __FUNCTION__;
- ulaw_frame.data = ebuf_ulaw;
- ulaw_frame.datalen = i;
- ulaw_frame.payload = IANA_ULAW;
+ memset(&linear_frame, 0, sizeof(linear_frame));
+ linear_frame.source = __FUNCTION__;
+ linear_frame.data = decoded_byteswapped_data;
+ linear_frame.datalen = decoded_data_len;
+ linear_frame.payload = IANA_LINEAR;
- res = switch_rtp_write_frame(sess->encoder.txrtp, &ulaw_frame);
+ /* copy and byte-swap */
+ for (i = 0; i < decoded_data_len/2; i++) {
+ decoded_byteswapped_data[i] = (decoded_data_linear[i] << 8) | (decoded_data_linear[i] >> 8);
+ }
+
+
+ res = switch_rtp_write_frame(sess->encoder.txrtp, &linear_frame);
if (-1 == res) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to write to Sangoma encoder RTP session.\n");
return SWITCH_STATUS_FALSE;
@@ -420,38 +495,80 @@ static switch_status_t switch_sangoma_encode(switch_codec_t *codec, switch_codec
sess->encoder.tx++;
/* do the reading */
- memset(&encoded_frame, 0, sizeof(encoded_frame));
for ( ; ; ) {
+#if 0
+ prevread_time = switch_micro_time_now();
+#endif
sres = switch_rtp_zerocopy_read_frame(sess->encoder.rxrtp, &encoded_frame, SWITCH_IO_FLAG_NOBLOCK);
if (sres == SWITCH_STATUS_GENERR) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to read on Sangoma encoder RTP session: %d\n", sres);
return SWITCH_STATUS_FALSE;
}
+#if 0
+ afterread_time = switch_micro_time_now();
+ difftime = afterread_time - prevread_time;
+ if (difftime > 0) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%ldus to read on encoding session %lu.\n", (long)difftime, sess->sessid);
+ }
+#endif
if (0 == encoded_frame.datalen) {
break;
}
- if (encoded_frame.payload != codec->implementation->ianacode
- && encoded_frame.payload != IANACODE_CN) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Read unexpected payload %d in Sangoma encoder RTP session, expecting %d\n",
- encoded_frame.payload, codec->implementation->ianacode);
- break;
+ if (encoded_frame.payload == IANACODE_CN) {
+ /* confort noise is treated as silence by us */
+ continue;
}
- if (*encoded_data_len) {
- sess->encoder.rxdiscarded++;
+ if (encoded_frame.datalen != codec->implementation->encoded_bytes_per_packet) {
+ /* seen when silence suppression is enabled */
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Ignoring encoded frame of %d bytes intead of %d bytes\n", encoded_frame.datalen, codec->implementation->encoded_bytes_per_packet);
+ continue;
}
- memcpy(encoded_data, encoded_frame.data, encoded_frame.datalen);
- *encoded_data_len = encoded_frame.datalen;
+ if (encoded_frame.payload != codec->implementation->ianacode) {
+ if (sess->encoder.request.b.codec_id == SNGTC_CODEC_ILBC_152 || sess->encoder.request.b.codec_id == SNGTC_CODEC_ILBC_133) {
+ /* since we moved to SOAP based communications, the mapping between vocallo IANA and our IANA does not work,
+ * some codecs checks cannot be completely done, like iLBC */
+ if (encoded_frame.payload != ILBC_152_PAYLOAD && encoded_frame.payload != ILBC_133_PAYLOAD) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Read unexpected payload %d in Sangoma encoder RTP session, expecting either %d or %d\n",
+ encoded_frame.payload, ILBC_152_PAYLOAD, ILBC_133_PAYLOAD);
+ break;
+ }
+ } else {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Read unexpected payload %d in Sangoma encoder RTP session, expecting %d\n",
+ encoded_frame.payload, codec->implementation->ianacode);
+ break;
+ }
+ }
+
+ if (sess->encoder.queue_windex == sess->encoder.queue_rindex) {
+ if (sess->encoder.rtp_queue[sess->encoder.queue_rindex].datalen) {
+ /* if there is something where we want to write, we're dropping it */
+ sess->encoder.rxdiscarded++;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Discarding encoded frame of %d bytes from RTP session %lu, windex = %d, rindex = %d\n",
+ sess->encoder.rtp_queue[sess->encoder.queue_rindex].datalen, sess->sessid, sess->encoder.queue_windex, sess->encoder.queue_rindex);
+ SAFE_INDEX_INC(sess->encoder.rtp_queue, sess->encoder.queue_rindex);
+ sess->encoder.queue_size--;
+ }
+ }
+
+ memcpy(sess->encoder.rtp_queue[sess->encoder.queue_windex].data, encoded_frame.data, encoded_frame.datalen);
+ sess->encoder.rtp_queue[sess->encoder.queue_windex].datalen = encoded_frame.datalen;
+ SAFE_INDEX_INC(sess->encoder.rtp_queue, sess->encoder.queue_windex);
+
+ /* monitor the queue size */
+ sess->encoder.queue_size++;
+ if (sess->encoder.queue_size > sess->encoder.queue_max_ever) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Encoder Rx queue for RTP session %lu is now %d, windex = %d, rindex = %d\n", sess->sessid, sess->encoder.queue_size,
+ sess->encoder.queue_windex, sess->encoder.queue_rindex);
+ sess->encoder.queue_max_ever = sess->encoder.queue_size;
+ }
}
- /* update encoding stats if we received a frame */
- if (*encoded_data_len) {
- if (*encoded_data_len != codec->implementation->encoded_bytes_per_packet) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Returning odd encoded frame of %d bytes intead of %d bytes\n", *encoded_data_len, codec->implementation->encoded_bytes_per_packet);
- }
+ /* update encoding stats if we have a frame to give */
+ if (sess->encoder.rtp_queue[sess->encoder.queue_rindex].datalen) {
sess->encoder.rx++;
now_time = switch_micro_time_now();
if (!sess->encoder.last_rx_time) {
@@ -469,10 +586,28 @@ static switch_status_t switch_sangoma_encode(switch_codec_t *codec, switch_codec
}
}
sess->encoder.lastrxseqno = encoded_frame.seq;
+
+ /* pop the data from the queue */
+ *encoded_data_len = sess->encoder.rtp_queue[sess->encoder.queue_rindex].datalen;
+ memcpy(encoded_data, sess->encoder.rtp_queue[sess->encoder.queue_rindex].data, *encoded_data_len);
+ sess->encoder.rtp_queue[sess->encoder.queue_rindex].datalen = 0;
+ SAFE_INDEX_INC(sess->encoder.rtp_queue, sess->encoder.queue_rindex);
+ sess->encoder.queue_size--;
+ if (*encoded_data_len != codec->implementation->encoded_bytes_per_packet) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Returning odd encoded frame of %d bytes intead of %d bytes\n", *encoded_data_len, codec->implementation->encoded_bytes_per_packet);
+ }
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "No output from sangoma encoder\n");
}
+ if (sess->encoder.debug_timing) {
+ func_end_time = switch_micro_time_now();
+ difftime = func_end_time - func_start_time;
+ if (difftime > 5000) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "%ldus to execute encoding function in session %lu.\n", (long)difftime, sess->sessid);
+ }
+ sess->encoder.last_func_call_time = func_end_time;
+ }
return SWITCH_STATUS_SUCCESS;
}
@@ -489,14 +624,21 @@ static switch_status_t switch_sangoma_decode(switch_codec_t *codec, /* codec ses
/* FS core checks the actual samples per second and microseconds per packet to determine the buffer size in the worst case scenario, no need to check
* whether the buffer passed in by the core will be enough */
switch_frame_t encoded_frame;
- switch_frame_t ulaw_frame;
- switch_status_t sres;
- switch_time_t now_time, difftime;
- short *dbuf_linear;
- int i = 0;
+ switch_frame_t linear_frame;
+ switch_status_t sres = SWITCH_STATUS_FALSE;
+ switch_time_t now_time = 0, difftime = 0;
+ switch_time_t func_start_time = 0, func_end_time = 0;
+ uint16_t *dbuf_linear;
+ uint16_t *linear_frame_data;
+ uint16_t *rtp_data_linear;
int res = 0;
+ int i = 0;
struct sangoma_transcoding_session *sess = codec->private_info;
+ if (sess->decoder.debug_timing) {
+ func_start_time = switch_micro_time_now();
+ }
+
dbuf_linear = decoded_data;
/* start assuming we will not decode anything */
@@ -522,6 +664,14 @@ static switch_status_t switch_sangoma_decode(switch_codec_t *codec, /* codec ses
sess->decoder.txrtp = sess->decoder.reply.tx_fd;
sess->decoder.rxrtp = sess->decoder.reply.rx_fd;
switch_mutex_unlock(g_sessions_lock);
+ flush_rtp(sess->decoder.rxrtp);
+ }
+
+ if (sess->decoder.debug_timing && sess->decoder.last_func_call_time) {
+ difftime = func_start_time - sess->decoder.last_func_call_time;
+ if (difftime > 25000 || difftime < 15000) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%ldms since last read on decoding session %lu.\n", (long)difftime, sess->sessid);
+ }
}
/* do the writing */
@@ -546,40 +696,70 @@ static switch_status_t switch_sangoma_decode(switch_codec_t *codec, /* codec ses
sess->decoder.tx++;
/* do the reading */
- memset(&ulaw_frame, 0, sizeof(ulaw_frame));
for ( ; ; ) {
- sres = switch_rtp_zerocopy_read_frame(sess->decoder.rxrtp, &ulaw_frame, SWITCH_IO_FLAG_NOBLOCK);
+#if 0
+ prevread_time = switch_micro_time_now();
+#endif
+ sres = switch_rtp_zerocopy_read_frame(sess->decoder.rxrtp, &linear_frame, SWITCH_IO_FLAG_NOBLOCK);
if (sres == SWITCH_STATUS_GENERR) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to read on Sangoma decoder RTP session: %d\n", sres);
return SWITCH_STATUS_FALSE;
}
- if (0 == ulaw_frame.datalen) {
+#if 0
+ afterread_time = switch_micro_time_now();
+ difftime = afterread_time - prevread_time;
+ if (difftime > 0) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%ldus to read on decoding session %lu.\n", (long)difftime, sess->sessid);
+ }
+#endif
+ if (0 == linear_frame.datalen) {
break;
}
- if (ulaw_frame.payload != IANA_ULAW
- && ulaw_frame.payload != IANACODE_CN) {
+ if (linear_frame.payload == IANACODE_CN) {
+ /* confort noise is treated as silence by us */
+ continue;
+ }
+
+ if (linear_frame.payload != IANA_LINEAR) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Read unexpected payload %d in Sangoma decoder RTP session, expecting %d\n",
- ulaw_frame.payload, IANA_ULAW);
+ linear_frame.payload, IANA_LINEAR);
break;
}
- if (*decoded_data_len) {
- sess->decoder.rxdiscarded++;
+
+ if (sess->decoder.queue_windex == sess->decoder.queue_rindex) {
+ if (sess->decoder.rtp_queue[sess->decoder.queue_rindex].datalen) {
+ /* if there is something where we want to write, we're dropping it */
+ sess->decoder.rxdiscarded++;
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Discarding decoded frame of %d bytes from RTP session %lu, windex = %d, rindex = %d\n",
+ sess->decoder.rtp_queue[sess->decoder.queue_rindex].datalen, sess->sessid, sess->decoder.queue_windex, sess->decoder.queue_rindex);
+ SAFE_INDEX_INC(sess->decoder.rtp_queue, sess->decoder.queue_rindex);
+ sess->decoder.queue_size--;
+ }
}
- /* transcode to linear */
- for (i = 0; i < ulaw_frame.datalen; i++) {
- dbuf_linear[i] = ulaw_to_linear(((char *)ulaw_frame.data)[i]);
+ /* byteswap the received data */
+ rtp_data_linear = (unsigned short *)sess->decoder.rtp_queue[sess->decoder.queue_windex].data;
+ linear_frame_data = linear_frame.data;
+ for (i = 0; i < linear_frame.datalen/2; i++) {
+ rtp_data_linear[i] = (linear_frame_data[i] << 8) | (linear_frame_data[i] >> 8);
+ }
+ sess->decoder.rtp_queue[sess->decoder.queue_windex].datalen = linear_frame.datalen;
+
+ SAFE_INDEX_INC(sess->decoder.rtp_queue, sess->decoder.queue_windex);
+
+ /* monitor the queue size */
+ sess->decoder.queue_size++;
+ if (sess->decoder.queue_size > sess->decoder.queue_max_ever) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Encoder Rx queue for RTP session %lu is now %d, windex = %d, rindex = %d\n", sess->sessid, sess->decoder.queue_size,
+ sess->decoder.queue_windex, sess->decoder.queue_rindex);
+ sess->decoder.queue_max_ever = sess->decoder.queue_size;
}
- *decoded_data_len = i * 2;
}
- if (*decoded_data_len) {
- if (*decoded_data_len != codec->implementation->decoded_bytes_per_packet) {
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Returning odd decoded frame of %d bytes intead of %d bytes\n", *decoded_data_len, codec->implementation->decoded_bytes_per_packet);
- }
+ if (sess->decoder.rtp_queue[sess->decoder.queue_rindex].datalen) {
/* update decoding stats */
sess->decoder.rx++;
@@ -594,17 +774,36 @@ static switch_status_t switch_sangoma_decode(switch_codec_t *codec, /* codec ses
/* check sequence and bump lost rx packets count if needed */
if (sess->decoder.lastrxseqno >= 0) {
- if (ulaw_frame.seq > (sess->decoder.lastrxseqno + 2) ) {
- sess->decoder.rxlost += ulaw_frame.seq - sess->decoder.lastrxseqno - 1;
+ if (linear_frame.seq > (sess->decoder.lastrxseqno + 2) ) {
+ sess->decoder.rxlost += linear_frame.seq - sess->decoder.lastrxseqno - 1;
}
}
- sess->decoder.lastrxseqno = ulaw_frame.seq;
+ sess->decoder.lastrxseqno = linear_frame.seq;
+
+ /* pop the data from the queue */
+ memcpy(dbuf_linear, sess->decoder.rtp_queue[sess->decoder.queue_rindex].data, sess->decoder.rtp_queue[sess->decoder.queue_rindex].datalen);
+ *decoded_data_len = sess->decoder.rtp_queue[sess->decoder.queue_rindex].datalen;
+ sess->decoder.rtp_queue[sess->decoder.queue_rindex].datalen = 0;
+ SAFE_INDEX_INC(sess->decoder.rtp_queue, sess->decoder.queue_rindex);
+ sess->decoder.queue_size--;
+
+ if (*decoded_data_len != codec->implementation->decoded_bytes_per_packet) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Returning odd decoded frame of %d bytes intead of %d bytes\n", *decoded_data_len, codec->implementation->decoded_bytes_per_packet);
+ }
} else {
*decoded_data_len = codec->implementation->decoded_bytes_per_packet;
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "No output from sangoma decoder, returning silent frame of %d bytes\n", *decoded_data_len);
memset(dbuf_linear, 0, *decoded_data_len);
}
+ if (sess->decoder.debug_timing) {
+ func_end_time = switch_micro_time_now();
+ difftime = func_end_time - func_start_time;
+ if (difftime > 5000) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "%ldus to execute decoding function in session %lu.\n", (long)difftime, sess->sessid);
+ }
+ sess->decoder.last_func_call_time = func_end_time;
+ }
+
return SWITCH_STATUS_SUCCESS;
}
@@ -652,7 +851,7 @@ static void sangoma_print_stats(switch_stream_handle_t *stream, switch_rtp_numbe
stream->write_function(stream, "Flush packet count: %lu\n\n\n", stats->flush_packet_count);
}
-#define SANGOMA_SYNTAX "settings|sessions|stats "
+#define SANGOMA_SYNTAX "settings|sessions|stats |debug |nodebug "
SWITCH_STANDARD_API(sangoma_function)
{
char *argv[10] = { 0 };
@@ -756,38 +955,83 @@ SWITCH_STANDARD_API(sangoma_function)
if (sess->encoder.rxrtp) {
stats = switch_rtp_get_stats(sess->encoder.rxrtp, NULL);
- stream->write_function(stream, "=== Encoder ===\n");
+ stream->write_function(stream, "=== %s Encoder ===\n", sess->impl->iananame);
- stream->write_function(stream, "Remote address: %s:%d\n\n", switch_rtp_get_remote_host(sess->encoder.rxrtp), switch_rtp_get_remote_port(sess->encoder.rxrtp));
+ stream->write_function(stream, "Tx L16 from %d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n\n", SNGTC_NIPV4(sess->encoder.reply.a.host_ip), sess->encoder.reply.a.host_udp_port,
+ SNGTC_NIPV4(sess->encoder.reply.a.codec_ip), sess->encoder.reply.a.codec_udp_port);
+ stream->write_function(stream, "Rx %s at %d.%d.%d.%d:%d from %d.%d.%d.%d:%d\n\n", sess->impl->iananame, SNGTC_NIPV4(sess->encoder.reply.b.host_ip), sess->encoder.reply.b.host_udp_port,
+ SNGTC_NIPV4(sess->encoder.reply.b.codec_ip), sess->encoder.reply.b.codec_udp_port);
- stream->write_function(stream, "-- Encoder Inbound Stats --\n");
+
+ stream->write_function(stream, "-- Inbound Stats --\n");
stream->write_function(stream, "Rx Discarded: %lu\n", sess->encoder.rxdiscarded);
sangoma_print_stats(stream, &stats->inbound);
stats = switch_rtp_get_stats(sess->encoder.txrtp, NULL);
- stream->write_function(stream, "-- Encoder Outbound Stats --\n");
+ stream->write_function(stream, "-- Outbound Stats --\n");
sangoma_print_stats(stream, &stats->outbound);
- } else {
- stream->write_function(stream, "\n=== No Encoder ===\n\n");
}
if (sess->decoder.rxrtp) {
stats = switch_rtp_get_stats(sess->decoder.rxrtp, NULL);
- stream->write_function(stream, "=== Decoder ===\n");
- stream->write_function(stream, "Remote address: %s:%d\n\n", switch_rtp_get_remote_host(sess->decoder.rxrtp), switch_rtp_get_remote_port(sess->decoder.rxrtp));
+ stream->write_function(stream, "=== %s Decoder ===\n", sess->impl->iananame);
+ stream->write_function(stream, "Tx %s from %d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n\n", sess->impl->iananame, SNGTC_NIPV4(sess->decoder.reply.a.host_ip), sess->decoder.reply.a.host_udp_port,
+ SNGTC_NIPV4(sess->decoder.reply.a.codec_ip), sess->decoder.reply.a.codec_udp_port);
+ stream->write_function(stream, "Rx L16 at %d.%d.%d.%d:%d from %d.%d.%d.%d:%d\n\n", SNGTC_NIPV4(sess->decoder.reply.b.host_ip), sess->decoder.reply.b.host_udp_port,
+ SNGTC_NIPV4(sess->decoder.reply.b.codec_ip), sess->decoder.reply.b.codec_udp_port);
- stream->write_function(stream, "-- Decoder Inbound Stats --\n");
+ stream->write_function(stream, "-- Inbound Stats --\n");
stream->write_function(stream, "Rx Discarded: %lu\n", sess->decoder.rxdiscarded);
sangoma_print_stats(stream, &stats->inbound);
stats = switch_rtp_get_stats(sess->decoder.txrtp, NULL);
- stream->write_function(stream, "-- Decoder Outbound Stats --\n");
+ stream->write_function(stream, "-- Outbound Stats --\n");
sangoma_print_stats(stream, &stats->outbound);
- } else {
- stream->write_function(stream, "\n=== No Decoder ===\n\n");
}
+ } else if (!strcasecmp(argv[0], "debug")) {
+ struct sangoma_transcoding_session *sess;
+ unsigned long sessid = 0;
+ int ret = 0;
+ if (argc < 2) {
+ stream->write_function(stream, "%s", SANGOMA_SYNTAX);
+ goto done;
+ }
+ ret = sscanf(argv[1], "%lu", &sessid);
+ if (ret != 1) {
+ stream->write_function(stream, "%s", SANGOMA_SYNTAX);
+ goto done;
+ }
+ sess = sangoma_find_session(sessid);
+ if (!sess) {
+ stream->write_function(stream, "Failed to find session %lu\n", sessid);
+ goto done;
+ }
+ sess->encoder.debug_timing = 1;
+ sess->decoder.debug_timing = 1;
+ stream->write_function(stream, "Debug enabled for transcoding session: %lu\n", sessid);
+ } else if (!strcasecmp(argv[0], "nodebug")) {
+ struct sangoma_transcoding_session *sess;
+ unsigned long sessid = 0;
+ int ret = 0;
+ if (argc < 2) {
+ stream->write_function(stream, "%s", SANGOMA_SYNTAX);
+ goto done;
+ }
+ ret = sscanf(argv[1], "%lu", &sessid);
+ if (ret != 1) {
+ stream->write_function(stream, "%s", SANGOMA_SYNTAX);
+ goto done;
+ }
+ sess = sangoma_find_session(sessid);
+ if (!sess) {
+ stream->write_function(stream, "Failed to find session %lu\n", sessid);
+ goto done;
+ }
+ sess->encoder.debug_timing = 0;
+ sess->decoder.debug_timing = 0;
+ stream->write_function(stream, "Debug disabled for transcoding session: %lu\n", sessid);
} else {
stream->write_function(stream, "Unknown Command [%s]\n", argv[0]);
}
@@ -911,6 +1155,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sangoma_codec_load)
switch_codec_interface_t *codec_interface = NULL;
switch_api_interface_t *api_interface = NULL;
int i = 0, c = 0;
+ int ilbc_done = 0;
+ vocallo_codec_t *ilbc_codec = NULL;
int detected = 0, activated = 0;
/* make sure we have valid configuration */
@@ -949,6 +1195,11 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sangoma_codec_load)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Loading codecs, register='%s', noregister='%s'\n", g_codec_register_list, g_codec_noregister_list);
for (c = 0; g_codec_map[c].codec_id != -1; c++) {
+ if (g_codec_map[c].codec_id == SNGTC_CODEC_L16_1 || g_codec_map[c].codec_id == SNGTC_CODEC_L16_2) {
+ /* registering L16 does not make any sense */
+ continue;
+ }
+
/* check if the codec is in the load list, otherwise skip it */
if (strcasecmp(g_codec_register_list, "all") && !strcasestr(g_codec_register_list, g_codec_map[c].iana_name)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Not loading codec %s because was not found in the load list\n",
@@ -969,6 +1220,11 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sangoma_codec_load)
sngtc_set_iana_code_based_on_codec_id(g_codec_map[c].codec_id, g_codec_map[c].iana);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Mapped codec %d to IANA %d\n", g_codec_map[c].codec_id, g_codec_map[c].iana);
+ /* special check for iLBC to add a single codec interface for both ILBC bitrate versions */
+ if ((g_codec_map[c].codec_id == SNGTC_CODEC_ILBC_152 || g_codec_map[c].codec_id == SNGTC_CODEC_ILBC_133) && ilbc_done) {
+ continue;
+ }
+
/* SWITCH_ADD_CODEC allocates a codec interface structure from the pool the core gave us and adds it to the internal interface
* list the core keeps, gets a codec id and set the given codec name to it.
* At this point there is an empty shell codec interface registered, but not yet implementations */
@@ -976,19 +1232,21 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sangoma_codec_load)
/* Now add as many codec implementations as needed, just up to 40ms for now */
if (g_codec_map[c].autoinit) {
+ int ms = 0;
for (i = 1; i <= 4; i++) {
-
- if ((g_codec_map[c].maxms/10) < i) {
- continue;
+ ms = i * 10;
+ if (g_codec_map[c].maxms < ms) {
+ break;
}
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding %dms implementation of codec %s\n", ms, g_codec_map[c].fs_name);
switch_core_codec_add_implementation(pool, codec_interface, /* the codec interface we allocated and we want to register with the core */
SWITCH_CODEC_TYPE_AUDIO, /* enumeration defining the type of the codec */
g_codec_map[c].iana, /* the IANA code number, ie http://www.iana.org/assignments/rtp-parameters */
g_codec_map[c].iana_name, /* the IANA code name */
NULL, /* default fmtp to send (can be overridden by the init function), fmtp is used in SDP for format specific parameters */
- 8000, /* samples transferred per second */
- 8000, /* actual samples transferred per second */
+ g_codec_map[c].sampling_rate, /* samples transferred per second */
+ g_codec_map[c].actual_sampling_rate, /* actual samples transferred per second */
g_codec_map[c].bps, /* bits transferred per second */
g_codec_map[c].mpf * i, /* microseconds per frame */
g_codec_map[c].spf * i, /* samples per frame */
@@ -1002,7 +1260,6 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sangoma_codec_load)
switch_sangoma_destroy); /* deinitalize a codec handle using this implementation */
}
-
} else {
/* custom implementation for some codecs */
@@ -1028,11 +1285,13 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sangoma_codec_load)
switch_sangoma_destroy); /* deinitalize a codec handle using this implementation */
break;
- case SNGTC_CODEC_ILBC:
+ case SNGTC_CODEC_ILBC_133:
+ case SNGTC_CODEC_ILBC_152:
+ ilbc_codec = get_codec_from_id(SNGTC_CODEC_ILBC_152);
switch_core_codec_add_implementation(pool, codec_interface, /* the codec interface we allocated and we want to register with the core */
SWITCH_CODEC_TYPE_AUDIO, /* enumeration defining the type of the codec */
- g_codec_map[c].iana, /* the IANA code number, ie http://www.iana.org/assignments/rtp-parameters */
- g_codec_map[c].iana_name, /* the IANA code name */
+ ilbc_codec->iana, /* the IANA code number, ie http://www.iana.org/assignments/rtp-parameters */
+ ilbc_codec->iana_name, /* the IANA code name */
"mode=20", /* default fmtp to send (can be overridden by the init function), fmtp is used in SDP for format specific parameters */
8000, /* samples transferred per second */
8000, /* actual samples transferred per second */
@@ -1048,11 +1307,11 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sangoma_codec_load)
switch_sangoma_decode, /* function to decode encoded data into slinear data */
switch_sangoma_destroy); /* deinitalize a codec handle using this implementation */
-#if 0
+ ilbc_codec = get_codec_from_id(SNGTC_CODEC_ILBC_133);
switch_core_codec_add_implementation(pool, codec_interface, /* the codec interface we allocated and we want to register with the core */
SWITCH_CODEC_TYPE_AUDIO, /* enumeration defining the type of the codec */
- g_codec_map[c].iana, /* 97, the IANA code number */
- g_codec_map[c].iana_name, /* the IANA code name */
+ ilbc_codec->iana, /* the IANA code number, ie http://www.iana.org/assignments/rtp-parameters */
+ ilbc_codec->iana_name, /* the IANA code name */
"mode=30", /* default fmtp to send (can be overridden by the init function), fmtp is used in SDP for format specific parameters */
8000, /* samples transferred per second */
8000, /* actual samples transferred per second */
@@ -1067,17 +1326,41 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sangoma_codec_load)
switch_sangoma_encode, /* function to encode slinear data into encoded data */
switch_sangoma_decode, /* function to decode encoded data into slinear data */
switch_sangoma_destroy); /* deinitalize a codec handle using this implementation */
-#endif
+ ilbc_done = 1;
break;
- case SNGTC_CODEC_G722:
+ case SNGTC_CODEC_G723_1_63:
+
+ for (i = 1; i <= 3; i++) {
+ switch_core_codec_add_implementation(pool, codec_interface, /* the codec interface we allocated and we want to register with the core */
+ SWITCH_CODEC_TYPE_AUDIO, /* enumeration defining the type of the codec */
+ g_codec_map[c].iana, /* the IANA code number, ie http://www.iana.org/assignments/rtp-parameters */
+ g_codec_map[c].iana_name, /* the IANA code name */
+ NULL, /* default fmtp to send (can be overridden by the init function), fmtp is used in SDP for format specific parameters */
+ g_codec_map[c].sampling_rate, /* samples transferred per second */
+ g_codec_map[c].actual_sampling_rate, /* actual samples transferred per second */
+ g_codec_map[c].bps, /* bits transferred per second */
+ g_codec_map[c].mpf * i, /* microseconds per frame */
+ g_codec_map[c].spf * i, /* samples per frame */
+ g_codec_map[c].bpfd * i, /* number of bytes per frame decompressed */
+ g_codec_map[c].bpfc * i, /* number of bytes per frame compressed */
+ 1, /* number of channels represented */
+ g_codec_map[c].spf * i, /* number of frames per network packet (I dont think this is used at all) */
+ switch_sangoma_init, /* function to initialize a codec session using this implementation */
+ switch_sangoma_encode, /* function to encode slinear data into encoded data */
+ switch_sangoma_decode, /* function to decode encoded data into slinear data */
+ switch_sangoma_destroy); /* deinitalize a codec handle using this implementation */
+ }
+
+ break;
+ case SNGTC_CODEC_AMR_1220:
switch_core_codec_add_implementation(pool, codec_interface, /* the codec interface we allocated and we want to register with the core */
SWITCH_CODEC_TYPE_AUDIO, /* enumeration defining the type of the codec */
g_codec_map[c].iana, /* the IANA code number, ie http://www.iana.org/assignments/rtp-parameters */
g_codec_map[c].iana_name, /* the IANA code name */
NULL, /* default fmtp to send (can be overridden by the init function), fmtp is used in SDP for format specific parameters */
- 8000, /* samples transferred per second */
- 16000, /* actual samples transferred per second */
+ g_codec_map[c].sampling_rate, /* samples transferred per second */
+ g_codec_map[c].actual_sampling_rate, /* actual samples transferred per second */
g_codec_map[c].bps, /* bits transferred per second */
g_codec_map[c].mpf, /* microseconds per frame */
g_codec_map[c].spf, /* samples per frame */
@@ -1103,6 +1386,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sangoma_codec_load)
switch_console_set_complete("add sangoma_codec settings");
switch_console_set_complete("add sangoma_codec sessions");
switch_console_set_complete("add sangoma_codec stats");
+ switch_console_set_complete("add sangoma_codec debug");
+ switch_console_set_complete("add sangoma_codec nodebug");
return SWITCH_STATUS_SUCCESS;
}
diff --git a/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/Makefile b/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/Makefile
index 070f941a94..d67bdbbabf 100644
--- a/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/Makefile
+++ b/src/mod/endpoints/mod_gsmopen/alsa_nogsmlib_nocplusplus/mod_gsmopen/Makefile
@@ -1,6 +1,7 @@
MODNAME=mod_gsmopen
SVNDEF := -D'GSMOPEN_SVN_VERSION="$(shell svnversion -n .)"'
-LOCAL_CFLAGS += $(SVNDEF) -Wno-error=address -DNO_GSMLIB -I../../../../../../libs/spandsp/src -I../../../../../..//libs/tiff-3.8.2/libtiff
+#LOCAL_CFLAGS += $(SVNDEF) -Wno-error=address -DNO_GSMLIB -I../../../../../../libs/spandsp/src -I../../../../../..//libs/tiff-3.8.2/libtiff
+LOCAL_CFLAGS += $(SVNDEF) -DNO_GSMLIB -I../../../../../../libs/spandsp/src -I../../../../../..//libs/tiff-3.8.2/libtiff
LOCAL_LDFLAGS=-lasound -L../../../../../../libs/spandsp/src -lspandsp
LOCAL_OBJS=gsmopen_protocol.o
include ../../../../../../build/modmake.rules
diff --git a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp
index 40a716671d..cb440d3bcb 100644
--- a/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp
+++ b/src/mod/endpoints/mod_gsmopen/mod_gsmopen.cpp
@@ -1209,7 +1209,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
switch_call_cause_t *cancel_cause)
{
private_t *tech_pvt = NULL;
- if ((*new_session = switch_core_session_request(gsmopen_endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, pool)) != 0) {
+ if ((*new_session = switch_core_session_request(gsmopen_endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, flags, pool)) != 0) {
switch_channel_t *channel = NULL;
switch_caller_profile_t *caller_profile;
char *rdest;
diff --git a/src/mod/endpoints/mod_h323/Makefile b/src/mod/endpoints/mod_h323/Makefile
index 8287b34cad..57668ee8dd 100644
--- a/src/mod/endpoints/mod_h323/Makefile
+++ b/src/mod/endpoints/mod_h323/Makefile
@@ -1,7 +1,11 @@
BASE=../../../..
-LOCAL_CFLAGS+=-g -ggdb -I/usr/local/include/ptlib -I/usr/local/include/openh323 -I. -DPTRACING=1 -D_REENTRANT -fno-exceptions
-LOCAL_LDFLAGS= -lopenh323 -lpt -lrt
+
+export PTLIBDIR = $(shell /usr/bin/ptlib-config --ptlibdir)
+LOCAL_CFLAGS+=-g -I$PTLIBDIR -I/usr/include/openh323 -I. -DPTRACING=1 -D_REENTRANT -fno-exceptions
+LOCAL_LDFLAGS= -L/usr/lib -lopenh323 -lpt -lrt
+
+ifeq ($(shell uname -m),x86_64)
+LOCAL_CFLAGS+=-DP_64BIT
+endif
include $(BASE)/build/modmake.rules
-
-
diff --git a/src/mod/endpoints/mod_khomp/Install/files/khomp.conf.xml b/src/mod/endpoints/mod_khomp/Install/files/khomp.conf.xml
new file mode 100644
index 0000000000..45268f304b
--- /dev/null
+++ b/src/mod/endpoints/mod_khomp/Install/files/khomp.conf.xml
@@ -0,0 +1,536 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mod/endpoints/mod_khomp/Makefile b/src/mod/endpoints/mod_khomp/Makefile
new file mode 100644
index 0000000000..94923c7cda
--- /dev/null
+++ b/src/mod/endpoints/mod_khomp/Makefile
@@ -0,0 +1,41 @@
+MODNAME := mod_khomp
+VERBOSE := 1
+
+ifeq ($(strip $(FREESWITCH_PATH)),)
+ BASE := ../../../../
+else
+ BASE := $(FREESWITCH_PATH)
+endif
+
+curr_dir := $(shell pwd)
+
+versions := -DFS_VERSION_MAJOR=$(shell bash $(curr_dir)/tools/getversion.sh "SWITCH_VERSION_MAJOR" $(BASE)) -DFS_VERSION_MINOR=$(shell bash $(curr_dir)/tools/getversion.sh "SWITCH_VERSION_MINOR" $(BASE)) -DFS_VERSION_MICRO=$(shell bash $(curr_dir)/tools/getversion.sh "SWITCH_VERSION_MICRO" $(BASE))
+
+LOCAL_CFLAGS = -I./ -I./include -I./commons -I./support -D_REENTRANT -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DK3L_HOSTSYSTEM -DCOMMONS_LIBRARY_USING_FREESWITCH -g -ggdb #-DDEBUG_FLAGS
+LOCAL_CFLAGS += $(versions)
+
+LOCAL_LDFLAGS = -lk3l
+
+LOCAL_OBJS = ./commons/k3lapi.o ./commons/k3lutil.o ./commons/config_options.o ./commons/format.o ./commons/strings.o ./commons/ringbuffer.o ./commons/verbose.o ./commons/saved_condition.o ./commons/regex.o ./commons/timer.o ./commons/configurator/configfile.o ./commons/configurator/option.o ./commons/configurator/section.o ./commons/configurator/restriction.o
+LOCAL_OBJS += ./support/klog-config.o ./support/klog-options.o ./support/config_defaults.o
+LOCAL_OBJS += ./src/globals.o ./src/opt.o ./src/frame.o ./src/utils.o ./src/lock.o ./src/spec.o ./src/applications.o ./src/khomp_pvt_fxo.o ./src/khomp_pvt_gsm.o ./src/khomp_pvt_kxe1.o ./src/khomp_pvt_passive.o ./src/khomp_pvt.o ./src/logger.o ./src/cli.o
+
+conf_file_name := khomp.conf.xml
+conf_file_dir := $(curr_dir)/Install/files
+conf_file_dir_alt := $(curr_dir)/conf
+conf_file_install = $(sysconfdir)/autoload_configs
+
+include $(BASE)/build/modmake.rules
+
+depend_install:
+ @echo "Copy $(conf_file_name)"
+ @if test -d $(conf_file_install) ; then \
+ if test -f $(conf_file_dir)/$(conf_file_name) ; then \
+ cp $(conf_file_dir)/$(conf_file_name) $(conf_file_install)/$(conf_file_name).new ;\
+ else \
+ cp $(conf_file_dir_alt)/$(conf_file_name) $(conf_file_install)/$(conf_file_name).new ;\
+ fi; \
+ if test ! -f "$(conf_file_install)/$(conf_file_name)" ; then \
+ mv $(conf_file_install)/$(conf_file_name).new $(conf_file_install)/$(conf_file_name) ;\
+ fi; \
+ fi;
diff --git a/src/mod/endpoints/mod_khomp/commons/atomic.hpp b/src/mod/endpoints/mod_khomp/commons/atomic.hpp
new file mode 100644
index 0000000000..daa598c9b4
--- /dev/null
+++ b/src/mod/endpoints/mod_khomp/commons/atomic.hpp
@@ -0,0 +1,189 @@
+/*
+ KHOMP generic endpoint/channel library.
+
+ This code was based on FreeBSD 7.X SVN (sys/i386/include/atomic.h),
+ with changes regarding optimizations and generalizations, and a
+ remake of the interface to fit use C++ features.
+
+ Code is distributed under original license.
+ Original copyright follows:
+
+ * Copyright (c) 1998 Doug Rabson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+
+*/
+
+#ifndef _ATOMIC_HPP_
+#define _ATOMIC_HPP_
+
+namespace Atomic
+{
+ // Macros used to insert compare and exchange instructions easily into functions.
+
+ #define MAKE_CMPXCHG_FUNCTION(INS, PTR, EXP, VAL, TYPE) \
+ PunnedType pexp; pexp.valtype = EXP; \
+ PunnedType pval; pval.valtype = VAL; \
+ TYPE vexp = *(pexp.podtype); \
+ TYPE vval = *(pval.podtype); \
+ TYPE res; \
+ unsigned char chg = 0; \
+ asm volatile("lock;" INS "sete %1;" \
+ : "=a" (res), /* 0 */ \
+ "=q" (chg), /* 1 */ \
+ "=m" (*(unsigned char **)(PTR)) /* 2 */ \
+ : "r" (vval), /* 3 */ \
+ "a" (vexp), /* 4 */ \
+ "m" (*(unsigned char **)(PTR)) /* 5 */ \
+ : "memory"); \
+ *(pexp.podtype) = res; \
+ return (chg != 0 ? true : false);
+
+ #define MAKE_CMPXCHG8B_FUNCTION(PTR,EXP,VAL) \
+ PunnedType pexp; pexp.valtype = EXP; \
+ PunnedType pval; pval.valtype = VAL; \
+ unsigned long long vexp = *(pexp.podtype); \
+ unsigned long long vval = *(pval.podtype); \
+ unsigned long long res = (unsigned long long)exp; \
+ unsigned char chg = 0; \
+ asm volatile("lock; cmpxchg8b %2; sete %1;" \
+ : "+A" (vexp), /* 0 (result) */ \
+ "=q" (chg) /* 1 */ \
+ : "m" (*(unsigned char**)(PTR)), /* 2 */ \
+ "b" ((unsigned long)(vval)), \
+ "c" ((unsigned long)(vval >> 32))); \
+ *(pexp.podtype) = vexp; \
+ return (chg != 0 ? true : false);
+
+ // Types used for making CMPXCHG instructions independent from base type.
+
+ template < typename ValType, typename PodType >
+ union PunnedTypeTemplate
+ {
+ ValType * valtype;
+ PodType * podtype;
+ };
+
+ template < int SizeOfType, typename ReturnType >
+ struct HelperCreateCAS;
+
+ template < typename ValType >
+ struct HelperCreateCAS<4, ValType>
+ {
+ #if !defined(__LP64__) && !defined(__LP64)
+ typedef unsigned long BaseType;
+ #else
+ typedef unsigned int BaseType;
+ #endif
+
+ typedef PunnedTypeTemplate< ValType, BaseType > PunnedType;
+
+ inline static bool apply(volatile void *p, ValType * exp, ValType now)
+ {
+ #if !defined(__LP64__) && !defined(__LP64)
+ MAKE_CMPXCHG_FUNCTION("cmpxchgl %3,%5;", p, exp, &now, BaseType);
+ #else
+ MAKE_CMPXCHG_FUNCTION("cmpxchgl %k3,%5;", p, exp, &now, BaseType);
+ #endif
+ }
+ };
+
+ template < typename ValType >
+ struct HelperCreateCAS<8, ValType>
+ {
+ #if !defined(__LP64__) && !defined(__LP64)
+ typedef unsigned long long BaseType;
+ #else
+ typedef unsigned long BaseType;
+ #endif
+
+ typedef PunnedTypeTemplate< ValType, BaseType > PunnedType;
+
+ inline static volatile ValType apply(volatile void *p, ValType * exp, ValType now)
+ {
+ #if !defined(__LP64__) && !defined(__LP64)
+ MAKE_CMPXCHG8B_FUNCTION(p, exp, &now);
+ #else
+ MAKE_CMPXCHG_FUNCTION("cmpxchgq %3,%5;", p, exp, &now, BaseType);
+ #endif
+ }
+
+ };
+
+ // The CAS function itself.
+
+ template < typename ValType >
+ inline bool doCAS(volatile ValType * p, ValType * o, ValType n)
+ {
+ return HelperCreateCAS::apply(static_cast(p), o, n);
+ };
+
+ template < typename ValType >
+ inline bool doCAS(volatile ValType * p, ValType o, ValType n)
+ {
+ return HelperCreateCAS::apply(static_cast(p), &o, n);
+ };
+
+ #undef MAKE_CMPXCHG_32_FUNCTION
+ #undef MAKE_CMPXCHG_64_FUNCTION
+
+ #define MAKE_LOCKED_TEMPLATE(NAME) \
+ template < typename ValType > inline void do##NAME(volatile ValType * p, ValType v); \
+ template < typename ValType > inline void do##NAME(volatile ValType * p);
+
+ #define MAKE_LOCKED_FUNCTION(NAME, TYPE, INS, CONS, VAL) \
+ template < > inline void do##NAME < TYPE > (volatile TYPE * p, TYPE v){ asm volatile("lock;" INS : "=m" (*p) : CONS (VAL), "m" (*p)); } \
+ template < > inline void do##NAME < TYPE > (volatile TYPE * p) { asm volatile("lock;" INS : "=m" (*p) : CONS (1), "m" (*p)); }
+
+ #define MAKE_LOCKED_FUNCTIONS(NAME, TYPE, INS, CONS, VAL) \
+ MAKE_LOCKED_FUNCTION(NAME, TYPE, INS, CONS, VAL) \
+ MAKE_LOCKED_FUNCTION(NAME, unsigned TYPE, INS, CONS, VAL)
+
+ MAKE_LOCKED_TEMPLATE(Add);
+ MAKE_LOCKED_TEMPLATE(Sub);
+ MAKE_LOCKED_TEMPLATE(SetBits);
+ MAKE_LOCKED_TEMPLATE(ClearBits);
+
+ MAKE_LOCKED_FUNCTIONS(Add, int, "addl %1,%0", "ir", v);
+ MAKE_LOCKED_FUNCTIONS(Sub, int, "subl %1,%0", "ir", v);
+ MAKE_LOCKED_FUNCTIONS(SetBits, int, "orl %1,%0", "ir", v);
+ MAKE_LOCKED_FUNCTIONS(ClearBits, int, "andl %1,%0", "ir", ~v);
+
+ #if !defined(__LP64__) && !defined(__LP64)
+
+ MAKE_LOCKED_FUNCTIONS(Add, long, "addl %1,%0", "ir", v);
+ MAKE_LOCKED_FUNCTIONS(Sub, long, "subl %1,%0", "ir", v);
+ MAKE_LOCKED_FUNCTIONS(SetBits, long, "orl %1,%0", "ir", v);
+ MAKE_LOCKED_FUNCTIONS(ClearBits, long, "andl %1,%0", "ir", ~v);
+
+ #else
+
+ MAKE_LOCKED_FUNCTIONS(Add, long, "addq %1,%0", "ir", v);
+ MAKE_LOCKED_FUNCTIONS(Sub, long, "subq %1,%0", "ir", v);
+ MAKE_LOCKED_FUNCTIONS(SetBits, long, "orq %1,%0", "ir", v);
+ MAKE_LOCKED_FUNCTIONS(ClearBits, long, "andq %1,%0", "ir", ~v);
+
+ #endif
+};
+
+#endif /* _ATOMIC_HPP_ */
diff --git a/src/mod/endpoints/mod_khomp/commons/config_commons.hpp b/src/mod/endpoints/mod_khomp/commons/config_commons.hpp
new file mode 100644
index 0000000000..de8f327df4
--- /dev/null
+++ b/src/mod/endpoints/mod_khomp/commons/config_commons.hpp
@@ -0,0 +1,69 @@
+/*
+ KHOMP generic endpoint/channel library.
+ Copyright (C) 2007-2009 Khomp Ind. & Com.
+
+ The contents of this file are subject to the Mozilla Public License Version 1.1
+ (the "License"); you may not use this file except in compliance with the
+ License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
+ the specific language governing rights and limitations under the License.
+
+ Alternatively, the contents of this file may be used under the terms of the
+ "GNU Lesser General Public License 2.1" license (the “LGPL" License), in which
+ case the provisions of "LGPL License" are applicable instead of those above.
+
+ If you wish to allow use of your version of this file only under the terms of
+ the LGPL License and not to allow others to use your version of this file under
+ the MPL, indicate your decision by deleting the provisions above and replace them
+ with the notice and other provisions required by the LGPL License. If you do not
+ delete the provisions above, a recipient may use your version of this file under
+ either the MPL or the LGPL License.
+
+ The LGPL header follows below:
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this library; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+*/
+
+#ifndef _CONFIG_COMMONS_HPP_
+#define _CONFIG_COMMONS_HPP_
+
+/****************************************************************************/
+/* ASTERISK */
+#if defined(COMMONS_LIBRARY_USING_ASTERISK)
+ #define COMMONS_IMPLEMENTATION asterisk
+/****************************************************************************/
+/* CALLWEAVER */
+#elif defined(COMMONS_LIBRARY_USING_CALLWEAVER)
+ #define COMMONS_IMPLEMENTATION callweaver
+/****************************************************************************/
+/* FREESWITCH */
+#elif defined(COMMONS_LIBRARY_USING_FREESWITCH)
+ #define COMMONS_IMPLEMENTATION freeswitch
+/****************************************************************************/
+/* GNU/LINUX (generic) */
+#elif defined(COMMONS_LIBRARY_USING_GNU_LINUX)
+ #define COMMONS_IMPLEMENTATION gnulinux
+/****************************************************************************/
+#else
+ #error Unknown implementation selected. Please define COMMONS_LIBRARY_USING_* correctly.
+#endif
+
+#define COMMONS_INCLUDE(file)
+
+#endif /* _CONFIG_COMMONS_HPP_ */
+
diff --git a/src/mod/endpoints/mod_khomp/commons/config_options.cpp b/src/mod/endpoints/mod_khomp/commons/config_options.cpp
new file mode 100644
index 0000000000..5383855f65
--- /dev/null
+++ b/src/mod/endpoints/mod_khomp/commons/config_options.cpp
@@ -0,0 +1,710 @@
+/*
+ KHOMP generic endpoint/channel library.
+ Copyright (C) 2007-2009 Khomp Ind. & Com.
+
+ The contents of this file are subject to the Mozilla Public License Version 1.1
+ (the "License"); you may not use this file except in compliance with the
+ License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
+ the specific language governing rights and limitations under the License.
+
+ Alternatively, the contents of this file may be used under the terms of the
+ "GNU Lesser General Public License 2.1" license (the “LGPL" License), in which
+ case the provisions of "LGPL License" are applicable instead of those above.
+
+ If you wish to allow use of your version of this file only under the terms of
+ the LGPL License and not to allow others to use your version of this file under
+ the MPL, indicate your decision by deleting the provisions above and replace them
+ with the notice and other provisions required by the LGPL License. If you do not
+ delete the provisions above, a recipient may use your version of this file under
+ either the MPL or the LGPL License.
+
+ The LGPL header follows below:
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this library; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+*/
+
+#include
+
+ConfigOption::ConfigOption(std::string name, const ConfigOption::StringType & value, const ConfigOption::StringType defvalue, string_allowed_type allowed, bool list_me)
+: _my_name(name), _value_data(new StringData(const_cast(value), defvalue, allowed), true),
+ _list_me(list_me), _values(NULL), _loaded(false)
+{};
+
+ConfigOption::ConfigOption(std::string name, const ConfigOption::StringType & value, const ConfigOption::StringType defvalue, bool list_me)
+: _my_name(name), _value_data(new StringData(const_cast(value), defvalue, string_allowed_type()), true),
+ _list_me(list_me), _values(NULL), _loaded(false)
+{};
+
+ConfigOption::ConfigOption(std::string name, const ConfigOption::SignedIntType & value, const ConfigOption::SignedIntType defvalue,
+ ConfigOption::SignedIntType min, ConfigOption::SignedIntType max, ConfigOption::SignedIntType step, bool list_me)
+: _my_name(name), _value_data(new SignedIntData(const_cast(value), defvalue, Range(min, max, step)), true),
+ _list_me(list_me), _values(NULL), _loaded(false)
+{};
+
+ConfigOption::ConfigOption(std::string name, const ConfigOption::UnsignedIntType & value, const ConfigOption::UnsignedIntType defvalue,
+ ConfigOption::UnsignedIntType min, ConfigOption::UnsignedIntType max, ConfigOption::UnsignedIntType step, bool list_me)
+: _my_name(name), _value_data(new UnsignedIntData(const_cast(value), defvalue, Range(min, max, step)), true),
+ _list_me(list_me), _values(NULL), _loaded(false)
+{};
+
+ConfigOption::ConfigOption(std::string name, const ConfigOption::BooleanType & value, const ConfigOption::BooleanType defvalue, bool list_me)
+: _my_name(name), _value_data(new BooleanData(const_cast(value), defvalue), true),
+ _list_me(list_me), _values(NULL), _loaded(false)
+{};
+
+ConfigOption::ConfigOption(std::string name, ConfigOption::FunctionType fun, std::string defvalue, string_allowed_type allowed, bool list_me)
+: _my_name(name), _value_data(new FunctionData(fun, defvalue, allowed), true),
+ _list_me(list_me), _values(NULL), _loaded(false)
+{};
+
+ConfigOption::ConfigOption(std::string name, ConfigOption::FunctionType fun, std::string defvalue, bool list_me)
+: _my_name(name), _value_data(new FunctionData(fun, defvalue, string_allowed_type()), true),
+ _list_me(list_me), _values(NULL), _loaded(false)
+{};
+
+ConfigOption::ConfigOption(const ConfigOption & o)
+: _my_name(o._my_name), _value_data(o._value_data),
+ _list_me(o._list_me), _values(o._values), _loaded(o._loaded)
+{};
+
+ConfigOption::~ConfigOption(void)
+{
+ if (_values)
+ {
+ for (unsigned int i = 0; _values[i] != NULL; i++)
+ delete _values[i];
+
+ delete[] _values;
+ _values = NULL;
+ }
+};
+
+void ConfigOption::set(ConfigOption::StringType value)
+{
+ switch (_value_data.which())
+ {
+ case ID_STRING:
+ {
+ try
+ {
+ StringData & tmp = _value_data.get();
+
+ if (tmp.string_allowed.empty())
+ {
+ tmp.string_val = value;
+ _loaded = true;
+ }
+ else
+ {
+ if (tmp.string_allowed.find(value) != tmp.string_allowed.end())
+ {
+ tmp.string_val = value;
+ _loaded = true;
+ return;
+ }
+
+ std::string allowed_string;
+
+ for (string_allowed_type::iterator i = tmp.string_allowed.begin(); i != tmp.string_allowed.end(); i++)
+ {
+ allowed_string += " '";
+ allowed_string += (*i);
+ allowed_string += "'";
+ }
+
+ throw ConfigProcessFailure(STG(FMT("value '%s' not allowed for option '%s' (allowed values:%s)")
+ % value % _my_name % allowed_string));
+ }
+ break;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+ }
+
+ case ID_FUN:
+ {
+ try
+ {
+ FunctionData & tmp = _value_data.get();
+ tmp.fun_val(value);
+ _loaded = true;
+ break;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+
+ }
+
+ default:
+ {
+ throw ConfigProcessFailure(STG(FMT("option '%s' is not of type string, nor function defined") % _my_name));
+ }
+ }
+}
+
+void ConfigOption::set(ConfigOption::SignedIntType value)
+{
+ try
+ {
+ SignedIntData & tmp = _value_data.get();
+
+ if (value < tmp.sint_Range.minimum)
+ throw ConfigProcessFailure(STG(FMT("value '%d' out-of-Range for option '%s' (too low)") % value % _my_name));
+
+ if (value > tmp.sint_Range.maximum)
+ throw ConfigProcessFailure(STG(FMT("value '%d' out-of-Range for option '%s' (too high)") % value % _my_name));
+
+ if (((value - tmp.sint_Range.minimum) % tmp.sint_Range.step) != 0)
+ throw ConfigProcessFailure(STG(FMT("value '%d' out-of-Range for option '%s' (outside allowed step)") % value % _my_name));
+
+ tmp.sint_val = value;
+ _loaded = true;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+}
+
+void ConfigOption::set(ConfigOption::UnsignedIntType value)
+{
+ try
+ {
+ UnsignedIntData & tmp = _value_data.get();
+
+ if (value < tmp.uint_Range.minimum)
+ throw ConfigProcessFailure(STG(FMT("value '%d' out-of-Range for option '%s' (too low)") % value % _my_name));
+
+ if (value > tmp.uint_Range.maximum)
+ throw ConfigProcessFailure(STG(FMT("value '%d' out-of-Range for option '%s' (too high)") % value % _my_name));
+
+ if (((value - tmp.uint_Range.minimum) % tmp.uint_Range.step) != 0)
+ throw ConfigProcessFailure(STG(FMT("value '%d' out-of-Range for option '%s' (outside allowed step)") % value % _my_name));
+
+ tmp.uint_val = value;
+ _loaded = true;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+}
+
+void ConfigOption::set(ConfigOption::BooleanType value)
+{
+ try
+ {
+ BooleanData & tmp = _value_data.get();
+ tmp.bool_val = value;
+ _loaded = true;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+}
+
+std::string & ConfigOption::name(void) { return _my_name; };
+
+ConfigOption::value_id_type ConfigOption::type(void)
+{
+ return (value_id_type) _value_data.which();
+};
+
+const char ** ConfigOption::values(void)
+{
+ if (_values != NULL)
+ return _values;
+
+ switch ((value_id_type) _value_data.which())
+ {
+ case ConfigOption::ID_BOOL:
+ {
+ _values = new const char*[3];
+
+ _values[0] = strdup("yes");
+ _values[1] = strdup("no");
+ _values[2] = NULL;
+
+ return _values;
+ }
+
+ case ConfigOption::ID_SINT:
+ {
+ try
+ {
+ SignedIntData & tmp = _value_data.get();
+
+
+ unsigned int count = ((tmp.sint_Range.maximum - tmp.sint_Range.minimum) / tmp.sint_Range.step) + 1;
+ unsigned int index = 0;
+
+ _values = new const char*[count + 1];
+
+ for (SignedIntType i = tmp.sint_Range.minimum; i <= tmp.sint_Range.maximum; i += tmp.sint_Range.step, index++)
+ _values[index] = strdup(STG(FMT("%d") % i).c_str());
+
+ _values[index] = NULL;
+
+ return _values;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+ }
+
+ case ConfigOption::ID_UINT:
+ {
+ try
+ {
+ UnsignedIntData & tmp = _value_data.get();
+
+ unsigned int count = ((tmp.uint_Range.maximum - tmp.uint_Range.minimum) / tmp.uint_Range.step) + 1;
+ unsigned int index = 0;
+
+ _values = new const char*[count + 1];
+
+ for (UnsignedIntType i = tmp.uint_Range.minimum; i <= tmp.uint_Range.maximum; i += tmp.uint_Range.step, index++)
+ _values[index] = strdup(STG(FMT("%d") % i).c_str());
+
+ _values[index] = NULL;
+
+ return _values;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+ }
+
+ case ConfigOption::ID_STRING:
+ {
+ try
+ {
+ StringData & tmp = _value_data.get();
+
+ _values = new const char*[ tmp.string_allowed.size() + 1 ];
+
+ unsigned int index = 0;
+
+ for (string_allowed_type::iterator i = tmp.string_allowed.begin(); i != tmp.string_allowed.end(); i++, index++)
+ _values[index] = strdup((*i).c_str());
+
+ _values[index] = NULL;
+
+ return _values;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+ }
+
+ case ConfigOption::ID_FUN:
+ {
+ try
+ {
+ FunctionData & tmp = _value_data.get();
+
+ _values = new const char*[ tmp.fun_allowed.size() + 1 ];
+
+ unsigned int index = 0;
+
+ for (string_allowed_type::iterator i = tmp.fun_allowed.begin(); i != tmp.fun_allowed.end(); i++, index++)
+ _values[index] = strdup((*i).c_str());
+
+ _values[index] = NULL;
+ return _values;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+
+ }
+
+ default:
+ throw ConfigProcessFailure(STG(FMT("unknown type identifier '%d'") % _value_data.which()));
+ }
+};
+
+void ConfigOption::reset(void)
+{
+ _loaded = false;
+};
+
+void ConfigOption::commit(void)
+{
+ if (_loaded)
+ return;
+
+ switch ((value_id_type) _value_data.which())
+ {
+ case ConfigOption::ID_BOOL:
+ {
+ try
+ {
+ BooleanData & tmp = _value_data.get();
+ tmp.bool_val = tmp.bool_default;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+
+ break;
+ }
+
+ case ConfigOption::ID_SINT:
+ {
+ try
+ {
+ SignedIntData & tmp = _value_data.get();
+ tmp.sint_val = tmp.sint_default;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+ break;
+ }
+
+ case ConfigOption::ID_UINT:
+ {
+ try
+ {
+ UnsignedIntData & tmp = _value_data.get();
+ tmp.uint_val = tmp.uint_default;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+ break;
+ }
+
+ case ConfigOption::ID_STRING:
+ {
+ try
+ {
+ StringData & tmp = _value_data.get();
+ tmp.string_val = tmp.string_default;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+ break;
+ }
+
+ case ConfigOption::ID_FUN:
+ {
+ try
+ {
+ FunctionData & tmp = _value_data.get();
+ tmp.fun_val(tmp.fun_default);
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+ break;
+ }
+
+ default:
+ throw ConfigProcessFailure(STG(FMT("unknown type identifier '%d'") % _value_data.which()));
+ }
+
+ _loaded = true;
+};
+
+void ConfigOption::copy_from(ConfigOption & src)
+{
+ if (src._value_data.which() != _value_data.which())
+ throw ConfigProcessFailure(STG(FMT("unable to copy options, source type differs from destination.")));
+
+ if (!src._loaded)
+ return;
+
+ switch ((value_id_type) _value_data.which())
+ {
+ case ConfigOption::ID_BOOL:
+ {
+ try
+ {
+ BooleanData & stmp = src._value_data.get();
+ BooleanData & dtmp = _value_data.get();
+ /* do not copy references, but values.. */
+ bool tmpval = stmp.bool_val;
+ dtmp.bool_val = tmpval;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+
+ break;
+ }
+
+ case ConfigOption::ID_SINT:
+ {
+ try
+ {
+ SignedIntData & stmp = src._value_data.get();
+ SignedIntData & dtmp = _value_data.get();
+ /* do not copy references, but values.. */
+ int tmpval = stmp.sint_val;
+ dtmp.sint_val = tmpval;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+
+ break;
+ }
+
+ case ConfigOption::ID_UINT:
+ {
+ try
+ {
+ UnsignedIntData & stmp = src._value_data.get();
+ UnsignedIntData & dtmp = _value_data.get();
+ /* do not copy references, but values.. */
+ unsigned int tmpval = stmp.uint_val;
+ dtmp.uint_val = tmpval;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+
+
+ break;
+ }
+
+ case ConfigOption::ID_STRING:
+ {
+ try
+ {
+ StringData & stmp = src._value_data.get();
+ StringData & dtmp = _value_data.get();
+ /* do not copy references, but values.. */
+ std::string tmpval = stmp.string_val;
+ dtmp.string_val = tmpval;
+ }
+ catch(ValueType::InvalidType & e)
+ {
+ throw;
+ }
+
+ break;
+ }
+
+ case ConfigOption::ID_FUN:
+ {
+ /* TO IMPLEMENT (NEEDS ANOTHER METHOD ON FUNCTION FOR GETTING VALUE) */
+
+// FunctionData & tmp = boost::get(_value_data);
+//
+// if (!tmp.loaded)
+// {
+// tmp.fun_val(tmp.fun_default);
+// tmp.loaded = true;
+// }
+ break;
+ }
+
+ default:
+ throw ConfigProcessFailure(STG(FMT("unknown type identifier '%d'") % _value_data.which()));
+ }
+
+ _loaded = true;
+};
+
+/*********************************/
+
+bool ConfigOptions::add(ConfigOption option)
+{
+ //option_map_type::iterator iter2 = _map.begin();
+
+ //boost::tie(iter2, ok2)
+ std::pair ret = _map.insert(option_pair_type(option.name(), option));
+
+ return ret.second;
+}
+
+bool ConfigOptions::synonym(std::string equiv_opt, std::string main_opt)
+{
+ //syn_option_map_type::iterator iter = _syn_map.begin();
+
+ //boost::tie(iter, ok)
+ std::pair ret = _syn_map.insert(syn_option_pair_type(equiv_opt, main_opt));
+
+ return ret.second;
+}
+
+ConfigOptions::string_set ConfigOptions::options(void)
+{
+ string_set res;
+
+ for (option_map_type::iterator i = _map.begin(); i != _map.end(); i++)
+ res.insert((*i).first);
+
+ return res;
+}
+
+void ConfigOptions::process(const char * name, const char * value)
+{
+ option_map_type::iterator iter = find_option(name);
+
+ if (iter == _map.end())
+ throw ConfigProcessFailure(STG(FMT("unknown option '%s'") % name));
+
+ try
+ {
+ switch ((*iter).second.type())
+ {
+ case ConfigOption::ID_SINT:
+ set((*iter).first, Strings::toulong(value));
+ return;
+ case ConfigOption::ID_UINT:
+ set((*iter).first, Strings::tolong(value));
+ return;
+ case ConfigOption::ID_BOOL:
+ set((*iter).first, Strings::toboolean(value));
+ return;
+ case ConfigOption::ID_STRING:
+ case ConfigOption::ID_FUN:
+ set((*iter).first, std::string(value));
+ return;
+ default:
+ throw ConfigProcessFailure(STG(FMT("unknown type identifier '%d'") % (*iter).second.type()));
+ }
+ }
+ catch (Strings::invalid_value & e)
+ {
+ throw ConfigProcessFailure(STG(FMT("invalid value '%s' for option '%s'") % value % name));
+ }
+}
+
+const char ** ConfigOptions::values(const char * name)
+{
+ option_map_type::iterator iter = find_option(name);
+
+ if (iter == _map.end())
+ throw ConfigProcessFailure(STG(FMT("unknown option '%s'") % name));
+
+ return (*iter).second.values();
+}
+
+const char ** ConfigOptions::values(void)
+{
+ if (_values != NULL)
+ return _values;
+
+ unsigned int count = 0;
+
+ for (option_map_type::iterator i = _map.begin(); i != _map.end(); i++)
+ if ((*i).second.list_me())
+ ++count;
+
+ _values = new const char*[ count + 1 ];
+
+ unsigned int index = 0;
+
+ for (option_map_type::iterator i = _map.begin(); i != _map.end(); i++)
+ {
+ if ((*i).second.list_me())
+ {
+ _values[index] = strdup((*i).first.c_str());
+ ++index;
+ }
+ }
+
+ _values[index] = NULL;
+
+ return _values;
+}
+
+void ConfigOptions::reset(void)
+{
+ for (option_map_type::iterator i = _map.begin(); i != _map.end(); i++)
+ (*i).second.reset();
+}
+
+ConfigOptions::messages_type ConfigOptions::commit(void)
+{
+ messages_type msgs;
+
+ for (option_map_type::iterator i = _map.begin(); i != _map.end(); i++)
+ {
+ try
+ {
+ (*i).second.commit();
+ }
+ catch (ConfigProcessFailure & e)
+ {
+ msgs.push_back(e.msg);
+ }
+ }
+
+ return msgs;
+}
+
+bool ConfigOptions::loaded(std::string name)
+{
+ option_map_type::iterator iter = find_option(name);
+
+ if (iter == _map.end())
+ return false;
+
+ return iter->second.loaded();
+}
+
+void ConfigOptions::copy_from(ConfigOptions & source, std::string name)
+{
+ option_map_type::iterator iter_src = source.find_option(name);
+ option_map_type::iterator iter_dst = find_option(name);
+
+ if (iter_src == source._map.end())
+ throw ConfigProcessFailure(STG(FMT("unknown option '%s' on source") % name));
+
+ if (iter_dst == _map.end())
+ throw ConfigProcessFailure(STG(FMT("unknown option '%s' on destination") % name));
+
+ iter_dst->second.copy_from(iter_src->second);
+}
+
+ConfigOptions::option_map_type::iterator ConfigOptions::find_option(std::string name)
+{
+ syn_option_map_type::iterator syn_iter = _syn_map.find(name);
+
+ if (syn_iter != _syn_map.end())
+ name = syn_iter->second;
+
+ option_map_type::iterator iter = _map.find(name);
+
+ return iter;
+}
diff --git a/src/mod/endpoints/mod_khomp/commons/config_options.hpp b/src/mod/endpoints/mod_khomp/commons/config_options.hpp
new file mode 100644
index 0000000000..3cfe2e1c78
--- /dev/null
+++ b/src/mod/endpoints/mod_khomp/commons/config_options.hpp
@@ -0,0 +1,286 @@
+/*
+ KHOMP generic endpoint/channel library.
+ Copyright (C) 2007-2009 Khomp Ind. & Com.
+
+ The contents of this file are subject to the Mozilla Public License Version 1.1
+ (the "License"); you may not use this file except in compliance with the
+ License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS" basis,
+ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
+ the specific language governing rights and limitations under the License.
+
+ Alternatively, the contents of this file may be used under the terms of the
+ "GNU Lesser General Public License 2.1" license (the “LGPL" License), in which
+ case the provisions of "LGPL License" are applicable instead of those above.
+
+ If you wish to allow use of your version of this file only under the terms of
+ the LGPL License and not to allow others to use your version of this file under
+ the MPL, indicate your decision by deleting the provisions above and replace them
+ with the notice and other provisions required by the LGPL License. If you do not
+ delete the provisions above, a recipient may use your version of this file under
+ either the MPL or the LGPL License.
+
+ The LGPL header follows below:
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this library; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+*/
+
+#include
+#include