diff options
author | Bevan Weiss <bevan.weiss@gmail.com> | 2025-01-16 21:29:43 +1100 |
---|---|---|
committer | Rob Mensching <rob@firegiant.com> | 2025-03-03 06:35:56 -0800 |
commit | 3b9efe831c6a408cd71a7bea6fa95f65c141911b (patch) | |
tree | bf57792ff48689ecfffca80f68d0aa5b725dab27 | |
parent | 4992cb0ec8259603133638b19633bd09a32d9261 (diff) | |
download | wix-3b9efe831c6a408cd71a7bea6fa95f65c141911b.tar.gz wix-3b9efe831c6a408cd71a7bea6fa95f65c141911b.tar.bz2 wix-3b9efe831c6a408cd71a7bea6fa95f65c141911b.zip |
Fix up missing 'Wix4' prefixes on MSMQ Permission tables.
And updated decompiler to Wix4 table names etc in line with firewall CA.
Fixes wixtoolset/issues#8902
Signed-off-by: Bevan Weiss <bevan.weiss@gmail.com>
6 files changed, 236 insertions, 110 deletions
diff --git a/src/ext/Msmq/ca/mqqueuesched.cpp b/src/ext/Msmq/ca/mqqueuesched.cpp index 7fdf65e3..42a25ea6 100644 --- a/src/ext/Msmq/ca/mqqueuesched.cpp +++ b/src/ext/Msmq/ca/mqqueuesched.cpp | |||
@@ -10,9 +10,9 @@ LPCWSTR vcsMessageQueueQuery = | |||
10 | enum eMessageQueueQuery { mqqMessageQueue = 1, mqqComponent, mqqBasePriority, mqqJournalQuota, mqqLabel, mqqMulticastAddress, mqqPathName, mqqPrivLevel, mqqQuota, mqqServiceTypeGuid, mqqAttributes }; | 10 | enum eMessageQueueQuery { mqqMessageQueue = 1, mqqComponent, mqqBasePriority, mqqJournalQuota, mqqLabel, mqqMulticastAddress, mqqPathName, mqqPrivLevel, mqqQuota, mqqServiceTypeGuid, mqqAttributes }; |
11 | 11 | ||
12 | LPCWSTR vcsMessageQueueUserPermissionQuery = | 12 | LPCWSTR vcsMessageQueueUserPermissionQuery = |
13 | L"SELECT `MessageQueueUserPermission`, `MessageQueue_`, `MessageQueueUserPermission`.`Component_`, `Domain`, `Name`, `Permissions` FROM `Wix4MessageQueueUserPermission`, `Wix4User` WHERE `User_` = `User`"; | 13 | L"SELECT `MessageQueueUserPermission`, `MessageQueue_`, `Wix4MessageQueueUserPermission`.`Component_`, `Domain`, `Name`, `Permissions` FROM `Wix4MessageQueueUserPermission`, `Wix4User` WHERE `User_` = `User`"; |
14 | LPCWSTR vcsMessageQueueGroupPermissionQuery = | 14 | LPCWSTR vcsMessageQueueGroupPermissionQuery = |
15 | L"SELECT `MessageQueueGroupPermission`, `MessageQueue_`, `MessageQueueGroupPermission`.`Component_`, `Domain`, `Name`, `Permissions` FROM `Wix4MessageQueueGroupPermission`, `Wix4Group` WHERE `Group_` = `Group`"; | 15 | L"SELECT `MessageQueueGroupPermission`, `MessageQueue_`, `Wix4MessageQueueGroupPermission`.`Component_`, `Domain`, `Name`, `Permissions` FROM `Wix4MessageQueueGroupPermission`, `Wix4Group` WHERE `Group_` = `Group`"; |
16 | enum eMessageQueuePermissionQuery { mqpqMessageQueuePermission = 1, mqpqMessageQueue, mqpqComponent, mqpqDomain, mqpqName, mqpqPermissions }; | 16 | enum eMessageQueuePermissionQuery { mqpqMessageQueuePermission = 1, mqpqMessageQueue, mqpqComponent, mqpqDomain, mqpqName, mqpqPermissions }; |
17 | 17 | ||
18 | 18 | ||
@@ -94,7 +94,7 @@ HRESULT MqiMessageQueueRead( | |||
94 | 94 | ||
95 | // loop through all partitions | 95 | // loop through all partitions |
96 | hr = WcaOpenExecuteView(vcsMessageQueueQuery, &hView); | 96 | hr = WcaOpenExecuteView(vcsMessageQueueQuery, &hView); |
97 | ExitOnFailure(hr, "Failed to execute view on MessageQueue table"); | 97 | ExitOnFailure(hr, "Failed to execute view on Wix4MessageQueue table"); |
98 | 98 | ||
99 | while (S_OK == (hr = WcaFetchRecord(hView, &hRec))) | 99 | while (S_OK == (hr = WcaFetchRecord(hView, &hRec))) |
100 | { | 100 | { |
@@ -324,14 +324,14 @@ HRESULT MqiMessageQueuePermissionRead( | |||
324 | HRESULT hr = S_OK; | 324 | HRESULT hr = S_OK; |
325 | 325 | ||
326 | // read message queue user permissions | 326 | // read message queue user permissions |
327 | if (S_OK == WcaTableExists(L"MessageQueueUserPermission")) | 327 | if (S_OK == WcaTableExists(L"Wix4MessageQueueUserPermission")) |
328 | { | 328 | { |
329 | hr = MessageQueueTrusteePermissionsRead(vcsMessageQueueUserPermissionQuery, pMessageQueueList, pList); | 329 | hr = MessageQueueTrusteePermissionsRead(vcsMessageQueueUserPermissionQuery, pMessageQueueList, pList); |
330 | ExitOnFailure(hr, "Failed to read message queue user permissions"); | 330 | ExitOnFailure(hr, "Failed to read message queue user permissions"); |
331 | } | 331 | } |
332 | 332 | ||
333 | // read message queue group permissions | 333 | // read message queue group permissions |
334 | if (S_OK == WcaTableExists(L"MessageQueueGroupPermission")) | 334 | if (S_OK == WcaTableExists(L"Wix4MessageQueueGroupPermission")) |
335 | { | 335 | { |
336 | hr = MessageQueueTrusteePermissionsRead(vcsMessageQueueGroupPermissionQuery, pMessageQueueList, pList); | 336 | hr = MessageQueueTrusteePermissionsRead(vcsMessageQueueGroupPermissionQuery, pMessageQueueList, pList); |
337 | ExitOnFailure(hr, "Failed to read message queue group permissions"); | 337 | ExitOnFailure(hr, "Failed to read message queue group permissions"); |
diff --git a/src/ext/Msmq/ca/mqsched.cpp b/src/ext/Msmq/ca/mqsched.cpp index ab5a5ee7..c4f43ca2 100644 --- a/src/ext/Msmq/ca/mqsched.cpp +++ b/src/ext/Msmq/ca/mqsched.cpp | |||
@@ -49,7 +49,7 @@ extern "C" UINT __stdcall MessageQueuingInstall(MSIHANDLE hInstall) | |||
49 | 49 | ||
50 | // read message queues | 50 | // read message queues |
51 | hr = MqiMessageQueueRead(&lstMessageQueues); | 51 | hr = MqiMessageQueueRead(&lstMessageQueues); |
52 | ExitOnFailure(hr, "Failed to read MessageQueue table"); | 52 | ExitOnFailure(hr, "Failed to read Wix4MessageQueue table"); |
53 | 53 | ||
54 | // read message queue permissions | 54 | // read message queue permissions |
55 | hr = MqiMessageQueuePermissionRead(&lstMessageQueues, &lstMessageQueuePermissions); | 55 | hr = MqiMessageQueuePermissionRead(&lstMessageQueues, &lstMessageQueuePermissions); |
@@ -78,7 +78,7 @@ extern "C" UINT __stdcall MessageQueuingInstall(MSIHANDLE hInstall) | |||
78 | 78 | ||
79 | hr = MqiMessageQueuePermissionInstall(&lstMessageQueuePermissions, &pwzExecuteActionData); | 79 | hr = MqiMessageQueuePermissionInstall(&lstMessageQueuePermissions, &pwzExecuteActionData); |
80 | ExitOnFailure(hr, "Failed to add message queue permissions to execute action data"); | 80 | ExitOnFailure(hr, "Failed to add message queue permissions to execute action data"); |
81 | iCost += lstMessageQueues.iInstallCount * COST_MESSAGE_QUEUE_PERMISSION_ADD; | 81 | iCost += lstMessageQueuePermissions.iInstallCount * COST_MESSAGE_QUEUE_PERMISSION_ADD; |
82 | 82 | ||
83 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"MessageQueuingExecuteInstall"), pwzExecuteActionData, iCost); | 83 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"MessageQueuingExecuteInstall"), pwzExecuteActionData, iCost); |
84 | ExitOnFailure(hr, "Failed to schedule MessageQueuingExecuteInstall"); | 84 | ExitOnFailure(hr, "Failed to schedule MessageQueuingExecuteInstall"); |
@@ -148,7 +148,7 @@ extern "C" UINT __stdcall MessageQueuingUninstall(MSIHANDLE hInstall) | |||
148 | 148 | ||
149 | // read message queues | 149 | // read message queues |
150 | hr = MqiMessageQueueRead(&lstMessageQueues); | 150 | hr = MqiMessageQueueRead(&lstMessageQueues); |
151 | ExitOnFailure(hr, "Failed to read MessageQueue table"); | 151 | ExitOnFailure(hr, "Failed to read Wix4MessageQueue table"); |
152 | 152 | ||
153 | // read message queue permissions | 153 | // read message queue permissions |
154 | hr = MqiMessageQueuePermissionRead(&lstMessageQueues, &lstMessageQueuePermissions); | 154 | hr = MqiMessageQueuePermissionRead(&lstMessageQueues, &lstMessageQueuePermissions); |
diff --git a/src/ext/Msmq/test/WixToolsetTest.Msmq/MsmqExtensionFixture.cs b/src/ext/Msmq/test/WixToolsetTest.Msmq/MsmqExtensionFixture.cs index 674d6a66..424d3d5b 100644 --- a/src/ext/Msmq/test/WixToolsetTest.Msmq/MsmqExtensionFixture.cs +++ b/src/ext/Msmq/test/WixToolsetTest.Msmq/MsmqExtensionFixture.cs | |||
@@ -6,6 +6,7 @@ namespace WixToolsetTest.Msmq | |||
6 | using WixInternal.TestSupport; | 6 | using WixInternal.TestSupport; |
7 | using WixInternal.Core.TestPackage; | 7 | using WixInternal.Core.TestPackage; |
8 | using WixToolset.Msmq; | 8 | using WixToolset.Msmq; |
9 | using WixToolset.Util; | ||
9 | using Xunit; | 10 | using Xunit; |
10 | 11 | ||
11 | public class MsmqExtensionFixture | 12 | public class MsmqExtensionFixture |
@@ -14,9 +15,9 @@ namespace WixToolsetTest.Msmq | |||
14 | public void CanBuildUsingMessageQueue() | 15 | public void CanBuildUsingMessageQueue() |
15 | { | 16 | { |
16 | var folder = TestData.Get(@"TestData\UsingMessageQueue"); | 17 | var folder = TestData.Get(@"TestData\UsingMessageQueue"); |
17 | var build = new Builder(folder, typeof(MsmqExtensionFactory), new[] { folder }); | 18 | var build = new Builder(folder, new[] { typeof(MsmqExtensionFactory), typeof(UtilExtensionFactory) }, new[] { folder }); |
18 | 19 | ||
19 | var results = build.BuildAndQuery(Build, "Wix4MessageQueue", "CustomAction"); | 20 | var results = build.BuildAndQuery(Build, "Wix4MessageQueue", "CustomAction", "Wix4MessageQueueUserPermission", "Wix4MessageQueueGroupPermission", "Wix4Group", "Wix4User"); |
20 | WixAssert.CompareLineByLine(new[] | 21 | WixAssert.CompareLineByLine(new[] |
21 | { | 22 | { |
22 | "CustomAction:Wix4MessageQueuingExecuteInstall_A64\t3073\tWix4MsmqCA_A64\tMessageQueuingExecuteInstall\t", | 23 | "CustomAction:Wix4MessageQueuingExecuteInstall_A64\t3073\tWix4MsmqCA_A64\tMessageQueuingExecuteInstall\t", |
@@ -25,7 +26,11 @@ namespace WixToolsetTest.Msmq | |||
25 | "CustomAction:Wix4MessageQueuingRollbackInstall_A64\t3329\tWix4MsmqCA_A64\tMessageQueuingRollbackInstall\t", | 26 | "CustomAction:Wix4MessageQueuingRollbackInstall_A64\t3329\tWix4MsmqCA_A64\tMessageQueuingRollbackInstall\t", |
26 | "CustomAction:Wix4MessageQueuingRollbackUninstall_A64\t3329\tWix4MsmqCA_A64\tMessageQueuingRollbackUninstall\t", | 27 | "CustomAction:Wix4MessageQueuingRollbackUninstall_A64\t3329\tWix4MsmqCA_A64\tMessageQueuingRollbackUninstall\t", |
27 | "CustomAction:Wix4MessageQueuingUninstall_A64\t1\tWix4MsmqCA_A64\tMessageQueuingUninstall\t", | 28 | "CustomAction:Wix4MessageQueuingUninstall_A64\t1\tWix4MsmqCA_A64\tMessageQueuingUninstall\t", |
29 | "Wix4Group:TestGroup\t\tTestGroup\t", | ||
28 | "Wix4MessageQueue:TestMQ\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\t\t\tMQLabel\t\tMQPath\t\t\t\t0", | 30 | "Wix4MessageQueue:TestMQ\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\t\t\tMQLabel\t\tMQPath\t\t\t\t0", |
31 | "Wix4MessageQueueGroupPermission:TestMQ_TestGroup\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tTestMQ\tTestGroup\t160", | ||
32 | "Wix4MessageQueueUserPermission:TestMQ_TestUser\tfilF5_pLhBuF5b4N9XEo52g_hUM5Lo\tTestMQ\tTestUser\t160", | ||
33 | "Wix4User:TestUser\t\tTestUser\t\t\t\t0", | ||
29 | }, results); | 34 | }, results); |
30 | } | 35 | } |
31 | 36 | ||
diff --git a/src/ext/Msmq/test/WixToolsetTest.Msmq/TestData/UsingMessageQueue/PackageComponents.wxs b/src/ext/Msmq/test/WixToolsetTest.Msmq/TestData/UsingMessageQueue/PackageComponents.wxs index ff9f7d92..bba105a0 100644 --- a/src/ext/Msmq/test/WixToolsetTest.Msmq/TestData/UsingMessageQueue/PackageComponents.wxs +++ b/src/ext/Msmq/test/WixToolsetTest.Msmq/TestData/UsingMessageQueue/PackageComponents.wxs | |||
@@ -1,11 +1,17 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | 1 | <?xml version="1.0" encoding="utf-8"?> |
2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" | 2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" |
3 | xmlns:msmq="http://wixtoolset.org/schemas/v4/wxs/msmq"> | 3 | xmlns:msmq="http://wixtoolset.org/schemas/v4/wxs/msmq" |
4 | xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> | ||
4 | <Fragment> | 5 | <Fragment> |
6 | <util:Group Id="TestGroup" Name="TestGroup" /> | ||
7 | <util:User Id="TestUser" Name="TestUser" /> | ||
5 | <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> | 8 | <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> |
6 | <Component> | 9 | <Component> |
7 | <File Source="example.txt" /> | 10 | <File Source="example.txt" /> |
8 | <msmq:MessageQueue Id="TestMQ" Label="MQLabel" PathName="MQPath" /> | 11 | <msmq:MessageQueue Id="TestMQ" Label="MQLabel" PathName="MQPath" > |
12 | <msmq:MessageQueuePermission Id="TestMQ_TestGroup" GetQueuePermissions="yes" GetQueueProperties="yes" Group="TestGroup" /> | ||
13 | <msmq:MessageQueuePermission Id="TestMQ_TestUser" GetQueuePermissions="yes" GetQueueProperties="yes" User="TestUser" /> | ||
14 | </msmq:MessageQueue> | ||
9 | </Component> | 15 | </Component> |
10 | </ComponentGroup> | 16 | </ComponentGroup> |
11 | </Fragment> | 17 | </Fragment> |
diff --git a/src/ext/Msmq/test/WixToolsetTest.Msmq/WixToolsetTest.Msmq.csproj b/src/ext/Msmq/test/WixToolsetTest.Msmq/WixToolsetTest.Msmq.csproj index e7b6f21e..88718f98 100644 --- a/src/ext/Msmq/test/WixToolsetTest.Msmq/WixToolsetTest.Msmq.csproj +++ b/src/ext/Msmq/test/WixToolsetTest.Msmq/WixToolsetTest.Msmq.csproj | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | <ItemGroup> | 17 | <ItemGroup> |
18 | <ProjectReference Include="..\..\wixext\WixToolset.Msmq.wixext.csproj" /> | 18 | <ProjectReference Include="..\..\wixext\WixToolset.Msmq.wixext.csproj" /> |
19 | <ProjectReference Include="..\..\..\Util\wixext\WixToolset.Util.wixext.csproj" /> | ||
19 | </ItemGroup> | 20 | </ItemGroup> |
20 | 21 | ||
21 | <ItemGroup> | 22 | <ItemGroup> |
diff --git a/src/ext/Msmq/wixext/MsmqDecompiler.cs b/src/ext/Msmq/wixext/MsmqDecompiler.cs index aa8c34b6..53734e88 100644 --- a/src/ext/Msmq/wixext/MsmqDecompiler.cs +++ b/src/ext/Msmq/wixext/MsmqDecompiler.cs | |||
@@ -2,59 +2,79 @@ | |||
2 | 2 | ||
3 | namespace WixToolset.Msmq | 3 | namespace WixToolset.Msmq |
4 | { | 4 | { |
5 | #if TODO_CONSIDER_DECOMPILER | ||
6 | using System; | 5 | using System; |
7 | using System.Collections; | 6 | using System.Collections.Generic; |
8 | using System.Globalization; | 7 | using System.Reflection; |
8 | using System.Security; | ||
9 | using System.Xml.Linq; | ||
9 | using WixToolset.Data; | 10 | using WixToolset.Data; |
11 | using WixToolset.Data.WindowsInstaller; | ||
10 | using WixToolset.Extensibility; | 12 | using WixToolset.Extensibility; |
11 | using Msmq = WixToolset.Extensions.Serialize.Msmq; | 13 | using WixToolset.Extensibility.Data; |
12 | using Wix = WixToolset.Data.Serialize; | 14 | using WixToolset.Extensibility.Services; |
13 | 15 | ||
14 | /// <summary> | 16 | /// <summary> |
15 | /// The decompiler for the WiX Toolset MSMQ Extension. | 17 | /// The decompiler for the WiX Toolset MSMQ Extension. |
16 | /// </summary> | 18 | /// </summary> |
17 | public sealed class MsmqDecompiler : DecompilerExtension | 19 | public sealed class MsmqDecompiler : BaseWindowsInstallerDecompilerExtension |
18 | { | 20 | { |
19 | /// <summary> | 21 | public override IReadOnlyCollection<TableDefinition> TableDefinitions => MsmqTableDefinitions.All; |
20 | /// Creates a decompiler for MSMQ Extension. | 22 | |
21 | /// </summary> | 23 | private IParseHelper ParseHelper { get; set; } |
22 | public MsmqDecompiler() | 24 | |
25 | internal static XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/msmq"; | ||
26 | internal static XName MessageQueueName => Namespace + "MessageQueue"; | ||
27 | internal static XName MessageQueuePermissionName => Namespace + "MessageQueuePermission"; | ||
28 | |||
29 | public override void PreDecompile(IWindowsInstallerDecompileContext context, IWindowsInstallerDecompilerHelper helper) | ||
23 | { | 30 | { |
24 | this.TableDefinitions = MsmqExtensionData.GetExtensionTableDefinitions(); | 31 | base.PreDecompile(context, helper); |
32 | this.ParseHelper = context.ServiceProvider.GetService<IParseHelper>(); | ||
25 | } | 33 | } |
26 | 34 | ||
27 | /// <summary> | 35 | /// <summary> |
28 | /// Get the extensions library to be removed. | 36 | /// Called at the beginning of the decompilation of a database. |
29 | /// </summary> | 37 | /// </summary> |
30 | /// <param name="tableDefinitions">Table definitions for library.</param> | 38 | /// <param name="tables">The collection of all tables.</param> |
31 | /// <returns>Library to remove from decompiled output.</returns> | 39 | public override void PreDecompileTables(TableIndexedCollection tables) |
32 | public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions) | ||
33 | { | 40 | { |
34 | return MsmqExtensionData.GetExtensionLibrary(tableDefinitions); | ||
35 | } | 41 | } |
36 | 42 | ||
37 | /// <summary> | 43 | /// <summary> |
38 | /// Decompiles an extension table. | 44 | /// Decompiles an extension table. |
39 | /// </summary> | 45 | /// </summary> |
40 | /// <param name="table">The table to decompile.</param> | 46 | /// <param name="table">The table to decompile.</param> |
41 | public override void DecompileTable(Table table) | 47 | public override bool TryDecompileTable(Table table) |
42 | { | 48 | { |
43 | switch (table.Name) | 49 | switch (table.Name) |
44 | { | 50 | { |
45 | case "MessageQueue": | 51 | case "MessageQueue": |
52 | case "Wix4MessageQueue": | ||
46 | this.DecompileMessageQueueTable(table); | 53 | this.DecompileMessageQueueTable(table); |
47 | break; | 54 | break; |
48 | case "MessageQueueUserPermission": | 55 | case "MessageQueueUserPermission": |
56 | case "Wix4MessageQueueUserPermission": | ||
49 | this.DecompileMessageQueueUserPermissionTable(table); | 57 | this.DecompileMessageQueueUserPermissionTable(table); |
50 | break; | 58 | break; |
51 | case "MessageQueueGroupPermission": | 59 | case "MessageQueueGroupPermission": |
60 | case "Wix4MessageQueueGroupPermission": | ||
52 | this.DecompileMessageQueueGroupPermissionTable(table); | 61 | this.DecompileMessageQueueGroupPermissionTable(table); |
53 | break; | 62 | break; |
54 | default: | 63 | default: |
55 | base.DecompileTable(table); | 64 | return false; |
56 | break; | ||
57 | } | 65 | } |
66 | return true; | ||
67 | } | ||
68 | |||
69 | /// <summary> | ||
70 | /// Finalize decompilation. | ||
71 | /// </summary> | ||
72 | /// <param name="tables">The collection of all tables.</param> | ||
73 | public override void PostDecompileTables(TableIndexedCollection tables) | ||
74 | { | ||
75 | this.FinalizeMessageQueueTable(tables); | ||
76 | this.FinalizeMessageQueueUserPermissionTable(tables); | ||
77 | this.FinalizeMessageQueueGroupPermissionTable(tables); | ||
58 | } | 78 | } |
59 | 79 | ||
60 | /// <summary> | 80 | /// <summary> |
@@ -65,82 +85,106 @@ namespace WixToolset.Msmq | |||
65 | { | 85 | { |
66 | foreach (Row row in table.Rows) | 86 | foreach (Row row in table.Rows) |
67 | { | 87 | { |
68 | Msmq.MessageQueue queue = new Msmq.MessageQueue(); | 88 | var messageQueue = new XElement(MessageQueueName, |
89 | new XAttribute("Id", row.FieldAsString(0)) | ||
90 | ); | ||
69 | 91 | ||
70 | queue.Id = (string)row[0]; | 92 | // Column(1) Component_ resolved in FinalizeMessageQueueTable |
71 | 93 | ||
72 | if (null != row[2]) | 94 | if (!row.IsColumnEmpty(2)) |
73 | { | 95 | { |
74 | queue.BasePriority = (int)row[2]; | 96 | messageQueue.Add(new XAttribute("BasePriority", row.FieldAsString(2))); |
75 | } | 97 | } |
76 | 98 | ||
77 | if (null != row[3]) | 99 | if (!row.IsColumnEmpty(3)) |
78 | { | 100 | { |
79 | queue.JournalQuota = (int)row[3]; | 101 | messageQueue.Add(new XAttribute("JournalQuota", row.FieldAsString(3))); |
80 | } | 102 | } |
81 | 103 | ||
82 | queue.Label = (string)row[4]; | 104 | messageQueue.Add(new XAttribute("Label", row.FieldAsString(4))); |
83 | 105 | ||
84 | if (null != row[5]) | 106 | if (!row.IsColumnEmpty(5)) |
85 | { | 107 | { |
86 | queue.MulticastAddress = (string)row[5]; | 108 | messageQueue.Add(new XAttribute("MulticastAddress", row.FieldAsString(5))); |
87 | } | 109 | } |
88 | 110 | ||
89 | queue.PathName = (string)row[6]; | 111 | messageQueue.Add(new XAttribute("PathName", row.FieldAsString(6))); |
90 | 112 | ||
91 | if (null != row[7]) | 113 | |
114 | if (!row.IsColumnEmpty(7)) | ||
92 | { | 115 | { |
93 | switch ((MsmqCompiler.MqiMessageQueuePrivacyLevel)row[7]) | 116 | int privLevel = row.FieldAsInteger(7); |
117 | switch ((MsmqCompiler.MqiMessageQueuePrivacyLevel)privLevel) | ||
94 | { | 118 | { |
95 | case MsmqCompiler.MqiMessageQueuePrivacyLevel.None: | 119 | case MsmqCompiler.MqiMessageQueuePrivacyLevel.None: |
96 | queue.PrivLevel = Msmq.MessageQueue.PrivLevelType.none; | 120 | messageQueue.Add(new XAttribute("PrivLevel", "none")); |
97 | break; | 121 | break; |
98 | case MsmqCompiler.MqiMessageQueuePrivacyLevel.Optional: | 122 | case MsmqCompiler.MqiMessageQueuePrivacyLevel.Optional: |
99 | queue.PrivLevel = Msmq.MessageQueue.PrivLevelType.optional; | 123 | messageQueue.Add(new XAttribute("PrivLevel", "optional")); |
100 | break; | 124 | break; |
101 | case MsmqCompiler.MqiMessageQueuePrivacyLevel.Body: | 125 | case MsmqCompiler.MqiMessageQueuePrivacyLevel.Body: |
102 | queue.PrivLevel = Msmq.MessageQueue.PrivLevelType.body; | 126 | messageQueue.Add(new XAttribute("PrivLevel", "body")); |
103 | break; | 127 | break; |
104 | default: | 128 | default: |
105 | break; | 129 | break; |
106 | } | 130 | } |
107 | } | 131 | } |
108 | 132 | ||
109 | if (null != row[8]) | 133 | if (!row.IsColumnEmpty(8)) |
110 | { | 134 | { |
111 | queue.Quota = (int)row[8]; | 135 | messageQueue.Add(new XAttribute("Quota", row.FieldAsString(8))); |
112 | } | 136 | } |
113 | 137 | ||
114 | if (null != row[9]) | 138 | if (!row.IsColumnEmpty(9)) |
115 | { | 139 | { |
116 | queue.ServiceTypeGuid = (string)row[9]; | 140 | messageQueue.Add(new XAttribute("ServiceTypeGuid", row.FieldAsString(9))); |
117 | } | 141 | } |
118 | 142 | ||
119 | int attributes = (int)row[10]; | 143 | int attributes = row.FieldAsInteger(10); |
120 | 144 | ||
121 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueueAttributes.Authenticate)) | 145 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueueAttributes.Authenticate)) |
122 | { | 146 | { |
123 | queue.Authenticate = Msmq.YesNoType.yes; | 147 | messageQueue.Add(new XAttribute("Authenticate", YesNoType.Yes)); |
124 | } | 148 | } |
125 | 149 | ||
126 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueueAttributes.Journal)) | 150 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueueAttributes.Journal)) |
127 | { | 151 | { |
128 | queue.Journal = Msmq.YesNoType.yes; | 152 | messageQueue.Add(new XAttribute("Journal", YesNoType.Yes)); |
129 | } | 153 | } |
130 | 154 | ||
131 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueueAttributes.Transactional)) | 155 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueueAttributes.Transactional)) |
132 | { | 156 | { |
133 | queue.Transactional = Msmq.YesNoType.yes; | 157 | messageQueue.Add(new XAttribute("Transactional", YesNoType.Yes)); |
134 | } | 158 | } |
135 | 159 | ||
136 | Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]); | 160 | this.DecompilerHelper.IndexElement(row, messageQueue); |
137 | if (null != component) | 161 | } |
138 | { | 162 | |
139 | component.AddChild(queue); | 163 | } |
140 | } | 164 | |
141 | else | 165 | /// <summary> |
166 | /// Finalize the MessageQueue table. | ||
167 | /// </summary> | ||
168 | /// <param name="tables">Collection of all tables.</param> | ||
169 | private void FinalizeMessageQueueTable(TableIndexedCollection tables) | ||
170 | { | ||
171 | Table messageQueueTable; | ||
172 | if (tables.TryGetTable("MessageQueue", out messageQueueTable) | ||
173 | || tables.TryGetTable("Wix4MessageQueue", out messageQueueTable)) | ||
174 | { | ||
175 | foreach (var row in messageQueueTable.Rows) | ||
142 | { | 176 | { |
143 | this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component")); | 177 | var xmlConfig = this.DecompilerHelper.GetIndexedElement(row); |
178 | |||
179 | var componentId = row.FieldAsString(1); | ||
180 | if (this.DecompilerHelper.TryGetIndexedElement("Component", componentId, out var component)) | ||
181 | { | ||
182 | component.Add(xmlConfig); | ||
183 | } | ||
184 | else | ||
185 | { | ||
186 | this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueTable.Name, row.GetPrimaryKey(), "Component_", componentId, "Component")); | ||
187 | } | ||
144 | } | 188 | } |
145 | } | 189 | } |
146 | } | 190 | } |
@@ -153,27 +197,63 @@ namespace WixToolset.Msmq | |||
153 | { | 197 | { |
154 | foreach (Row row in table.Rows) | 198 | foreach (Row row in table.Rows) |
155 | { | 199 | { |
156 | Msmq.MessageQueuePermission queuePermission = new Msmq.MessageQueuePermission(); | 200 | var queuePermission = new XElement(MessageQueuePermissionName, |
201 | new XAttribute("Id", row.FieldAsString(0)) | ||
202 | ); | ||
157 | 203 | ||
158 | queuePermission.Id = (string)row[0]; | 204 | DecompileMessageQueuePermissionAttributes(row, queuePermission); |
205 | this.DecompilerHelper.IndexElement(row, queuePermission); | ||
206 | } | ||
159 | 207 | ||
160 | if (null != row[2]) | 208 | } |
209 | |||
210 | /// <summary> | ||
211 | /// Finalize the MessageQueueUserPermissionTable table. | ||
212 | /// </summary> | ||
213 | /// <param name="tables">Collection of all tables.</param> | ||
214 | private void FinalizeMessageQueueUserPermissionTable(TableIndexedCollection tables) | ||
215 | { | ||
216 | Table messageQueueUserPermissionTable; | ||
217 | if (tables.TryGetTable("MessageQueueUserPermission", out messageQueueUserPermissionTable) | ||
218 | || tables.TryGetTable("Wix4MessageQueueUserPermission", out messageQueueUserPermissionTable)) | ||
219 | { | ||
220 | foreach (var row in messageQueueUserPermissionTable.Rows) | ||
161 | { | 221 | { |
162 | queuePermission.MessageQueue = (string)row[2]; | 222 | var xmlConfig = this.DecompilerHelper.GetIndexedElement(row); |
163 | } | ||
164 | 223 | ||
165 | queuePermission.User = (string)row[3]; | 224 | var componentId = row.FieldAsString(1); |
225 | if (this.DecompilerHelper.TryGetIndexedElement("Component", componentId, out var component)) | ||
226 | { | ||
227 | component.Add(xmlConfig); | ||
228 | } | ||
229 | else | ||
230 | { | ||
231 | this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueUserPermissionTable.Name, row.GetPrimaryKey(), "Component_", componentId, "Component")); | ||
232 | } | ||
166 | 233 | ||
167 | DecompileMessageQueuePermissionAttributes(row, queuePermission); | 234 | var messageQueueId = row.FieldAsString(2); |
235 | XElement messageQueue; | ||
236 | if (this.DecompilerHelper.TryGetIndexedElement("MessageQueue", messageQueueId, out messageQueue) | ||
237 | || this.DecompilerHelper.TryGetIndexedElement("Wix4MessageQueue", messageQueueId, out messageQueue)) | ||
238 | { | ||
239 | xmlConfig.Add(new XAttribute("MessageQueue", messageQueueId)); | ||
240 | } | ||
241 | else | ||
242 | { | ||
243 | this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueUserPermissionTable.Name, row.GetPrimaryKey(), "MessageQueue_", messageQueueId, "Wix4MessageQueue")); | ||
244 | } | ||
168 | 245 | ||
169 | Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]); | 246 | var userId = row.FieldAsString(3); |
170 | if (null != component) | 247 | XElement user; |
171 | { | 248 | if (this.DecompilerHelper.TryGetIndexedElement("User", userId, out user) |
172 | component.AddChild(queuePermission); | 249 | || this.DecompilerHelper.TryGetIndexedElement("Wix4User", userId, out user)) |
173 | } | 250 | { |
174 | else | 251 | xmlConfig.Add(new XAttribute("User", userId)); |
175 | { | 252 | } |
176 | this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component")); | 253 | else |
254 | { | ||
255 | this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueUserPermissionTable.Name, row.GetPrimaryKey(), "User_", userId, "Wix4User")); | ||
256 | } | ||
177 | } | 257 | } |
178 | } | 258 | } |
179 | } | 259 | } |
@@ -186,27 +266,62 @@ namespace WixToolset.Msmq | |||
186 | { | 266 | { |
187 | foreach (Row row in table.Rows) | 267 | foreach (Row row in table.Rows) |
188 | { | 268 | { |
189 | Msmq.MessageQueuePermission queuePermission = new Msmq.MessageQueuePermission(); | 269 | var queuePermission = new XElement(MessageQueuePermissionName, |
270 | new XAttribute("Id", row.FieldAsString(0)) | ||
271 | ); | ||
190 | 272 | ||
191 | queuePermission.Id = (string)row[0]; | 273 | DecompileMessageQueuePermissionAttributes(row, queuePermission); |
274 | this.DecompilerHelper.IndexElement(row, queuePermission); | ||
275 | } | ||
276 | } | ||
192 | 277 | ||
193 | if (null != row[2]) | 278 | /// <summary> |
279 | /// Finalize the MessageQueueGroupPermissionTable table. | ||
280 | /// </summary> | ||
281 | /// <param name="tables">Collection of all tables.</param> | ||
282 | private void FinalizeMessageQueueGroupPermissionTable(TableIndexedCollection tables) | ||
283 | { | ||
284 | Table messageQueueGroupPermissionTable; | ||
285 | if (tables.TryGetTable("MessageQueueGroupPermission", out messageQueueGroupPermissionTable) | ||
286 | || tables.TryGetTable("Wix4MessageQueueGroupPermission", out messageQueueGroupPermissionTable)) | ||
287 | { | ||
288 | foreach (var row in messageQueueGroupPermissionTable.Rows) | ||
194 | { | 289 | { |
195 | queuePermission.MessageQueue = (string)row[2]; | 290 | var xmlConfig = this.DecompilerHelper.GetIndexedElement(row); |
196 | } | ||
197 | 291 | ||
198 | queuePermission.Group = (string)row[3]; | 292 | var componentId = row.FieldAsString(1); |
293 | if (this.DecompilerHelper.TryGetIndexedElement("Component", componentId, out var component)) | ||
294 | { | ||
295 | component.Add(xmlConfig); | ||
296 | } | ||
297 | else | ||
298 | { | ||
299 | this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueGroupPermissionTable.Name, row.GetPrimaryKey(), "Component_", componentId, "Component")); | ||
300 | } | ||
199 | 301 | ||
200 | DecompileMessageQueuePermissionAttributes(row, queuePermission); | 302 | var messageQueueId = row.FieldAsString(2); |
303 | XElement messageQueue; | ||
304 | if (this.DecompilerHelper.TryGetIndexedElement("MessageQueue", messageQueueId, out messageQueue) | ||
305 | || this.DecompilerHelper.TryGetIndexedElement("Wix4MessageQueue", messageQueueId, out messageQueue)) | ||
306 | { | ||
307 | xmlConfig.Add(new XAttribute("MessageQueue", messageQueueId)); | ||
308 | } | ||
309 | else | ||
310 | { | ||
311 | this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueGroupPermissionTable.Name, row.GetPrimaryKey(), "MessageQueue_", messageQueueId, "Wix4MessageQueue")); | ||
312 | } | ||
201 | 313 | ||
202 | Wix.Component component = (Wix.Component)this.Core.GetIndexedElement("Component", (string)row[1]); | 314 | var groupId = row.FieldAsString(3); |
203 | if (null != component) | 315 | XElement group; |
204 | { | 316 | if (this.DecompilerHelper.TryGetIndexedElement("Group", groupId, out group) |
205 | component.AddChild(queuePermission); | 317 | || this.DecompilerHelper.TryGetIndexedElement("Wix4Group", groupId, out group)) |
206 | } | 318 | { |
207 | else | 319 | xmlConfig.Add(new XAttribute("Group", groupId)); |
208 | { | 320 | } |
209 | this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "Component_", (string)row[1], "Component")); | 321 | else |
322 | { | ||
323 | this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, messageQueueGroupPermissionTable.Name, row.GetPrimaryKey(), "Group_", groupId, "Wix4Group")); | ||
324 | } | ||
210 | } | 325 | } |
211 | } | 326 | } |
212 | } | 327 | } |
@@ -216,90 +331,89 @@ namespace WixToolset.Msmq | |||
216 | /// </summary> | 331 | /// </summary> |
217 | /// <param name="row">The row to decompile.</param> | 332 | /// <param name="row">The row to decompile.</param> |
218 | /// <param name="table">Target element.</param> | 333 | /// <param name="table">Target element.</param> |
219 | private void DecompileMessageQueuePermissionAttributes(Row row, Msmq.MessageQueuePermission queuePermission) | 334 | private void DecompileMessageQueuePermissionAttributes(Row row, XElement element) |
220 | { | 335 | { |
221 | int attributes = (int)row[4]; | 336 | int attributes = row.FieldAsInteger(4); |
222 | 337 | ||
223 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.DeleteMessage)) | 338 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.DeleteMessage)) |
224 | { | 339 | { |
225 | queuePermission.DeleteMessage = Msmq.YesNoType.yes; | 340 | element.Add("DeleteMessage", YesNoType.Yes); |
226 | } | 341 | } |
227 | 342 | ||
228 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.PeekMessage)) | 343 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.PeekMessage)) |
229 | { | 344 | { |
230 | queuePermission.PeekMessage = Msmq.YesNoType.yes; | 345 | element.Add("PeekMessage", YesNoType.Yes); |
231 | } | 346 | } |
232 | 347 | ||
233 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.WriteMessage)) | 348 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.WriteMessage)) |
234 | { | 349 | { |
235 | queuePermission.WriteMessage = Msmq.YesNoType.yes; | 350 | element.Add("WriteMessage", YesNoType.Yes); |
236 | } | 351 | } |
237 | 352 | ||
238 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.DeleteJournalMessage)) | 353 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.DeleteJournalMessage)) |
239 | { | 354 | { |
240 | queuePermission.DeleteJournalMessage = Msmq.YesNoType.yes; | 355 | element.Add("DeleteJournalMessage", YesNoType.Yes); |
241 | } | 356 | } |
242 | 357 | ||
243 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.SetQueueProperties)) | 358 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.SetQueueProperties)) |
244 | { | 359 | { |
245 | queuePermission.SetQueueProperties = Msmq.YesNoType.yes; | 360 | element.Add("SetQueueProperties", YesNoType.Yes); |
246 | } | 361 | } |
247 | 362 | ||
248 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.GetQueueProperties)) | 363 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.GetQueueProperties)) |
249 | { | 364 | { |
250 | queuePermission.GetQueueProperties = Msmq.YesNoType.yes; | 365 | element.Add("GetQueueProperties", YesNoType.Yes); |
251 | } | 366 | } |
252 | 367 | ||
253 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.DeleteQueue)) | 368 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.DeleteQueue)) |
254 | { | 369 | { |
255 | queuePermission.DeleteQueue = Msmq.YesNoType.yes; | 370 | element.Add("DeleteQueue", YesNoType.Yes); |
256 | } | 371 | } |
257 | 372 | ||
258 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.GetQueuePermissions)) | 373 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.GetQueuePermissions)) |
259 | { | 374 | { |
260 | queuePermission.GetQueuePermissions = Msmq.YesNoType.yes; | 375 | element.Add("GetQueuePermissions", YesNoType.Yes); |
261 | } | 376 | } |
262 | 377 | ||
263 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.ChangeQueuePermissions)) | 378 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.ChangeQueuePermissions)) |
264 | { | 379 | { |
265 | queuePermission.ChangeQueuePermissions = Msmq.YesNoType.yes; | 380 | element.Add("ChangeQueuePermissions", YesNoType.Yes); |
266 | } | 381 | } |
267 | 382 | ||
268 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.TakeQueueOwnership)) | 383 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.TakeQueueOwnership)) |
269 | { | 384 | { |
270 | queuePermission.TakeQueueOwnership = Msmq.YesNoType.yes; | 385 | element.Add("TakeQueueOwnership", YesNoType.Yes); |
271 | } | 386 | } |
272 | 387 | ||
273 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.ReceiveMessage)) | 388 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.ReceiveMessage)) |
274 | { | 389 | { |
275 | queuePermission.ReceiveMessage = Msmq.YesNoType.yes; | 390 | element.Add("ReceiveMessage", YesNoType.Yes); |
276 | } | 391 | } |
277 | 392 | ||
278 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.ReceiveJournalMessage)) | 393 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.ReceiveJournalMessage)) |
279 | { | 394 | { |
280 | queuePermission.ReceiveJournalMessage = Msmq.YesNoType.yes; | 395 | element.Add("ReceiveJournalMessage", YesNoType.Yes); |
281 | } | 396 | } |
282 | 397 | ||
283 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericRead)) | 398 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericRead)) |
284 | { | 399 | { |
285 | queuePermission.QueueGenericRead = Msmq.YesNoType.yes; | 400 | element.Add("QueueGenericRead", YesNoType.Yes); |
286 | } | 401 | } |
287 | 402 | ||
288 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericWrite)) | 403 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericWrite)) |
289 | { | 404 | { |
290 | queuePermission.QueueGenericWrite = Msmq.YesNoType.yes; | 405 | element.Add("QueueGenericWrite", YesNoType.Yes); |
291 | } | 406 | } |
292 | 407 | ||
293 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericExecute)) | 408 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericExecute)) |
294 | { | 409 | { |
295 | queuePermission.QueueGenericExecute = Msmq.YesNoType.yes; | 410 | element.Add("QueueGenericExecute", YesNoType.Yes); |
296 | } | 411 | } |
297 | 412 | ||
298 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericAll)) | 413 | if (0 != (attributes & (int)MsmqCompiler.MqiMessageQueuePermission.QueueGenericAll)) |
299 | { | 414 | { |
300 | queuePermission.QueueGenericAll = Msmq.YesNoType.yes; | 415 | element.Add("QueueGenericAll", YesNoType.Yes); |
301 | } | 416 | } |
302 | } | 417 | } |
303 | } | 418 | } |
304 | #endif | ||
305 | } | 419 | } |