aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBevan Weiss <bevan.weiss@gmail.com>2025-01-16 21:29:43 +1100
committerRob Mensching <rob@firegiant.com>2025-03-03 06:35:56 -0800
commit3b9efe831c6a408cd71a7bea6fa95f65c141911b (patch)
treebf57792ff48689ecfffca80f68d0aa5b725dab27
parent4992cb0ec8259603133638b19633bd09a32d9261 (diff)
downloadwix-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>
-rw-r--r--src/ext/Msmq/ca/mqqueuesched.cpp10
-rw-r--r--src/ext/Msmq/ca/mqsched.cpp6
-rw-r--r--src/ext/Msmq/test/WixToolsetTest.Msmq/MsmqExtensionFixture.cs9
-rw-r--r--src/ext/Msmq/test/WixToolsetTest.Msmq/TestData/UsingMessageQueue/PackageComponents.wxs10
-rw-r--r--src/ext/Msmq/test/WixToolsetTest.Msmq/WixToolsetTest.Msmq.csproj1
-rw-r--r--src/ext/Msmq/wixext/MsmqDecompiler.cs310
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 =
10enum eMessageQueueQuery { mqqMessageQueue = 1, mqqComponent, mqqBasePriority, mqqJournalQuota, mqqLabel, mqqMulticastAddress, mqqPathName, mqqPrivLevel, mqqQuota, mqqServiceTypeGuid, mqqAttributes }; 10enum eMessageQueueQuery { mqqMessageQueue = 1, mqqComponent, mqqBasePriority, mqqJournalQuota, mqqLabel, mqqMulticastAddress, mqqPathName, mqqPrivLevel, mqqQuota, mqqServiceTypeGuid, mqqAttributes };
11 11
12LPCWSTR vcsMessageQueueUserPermissionQuery = 12LPCWSTR 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`";
14LPCWSTR vcsMessageQueueGroupPermissionQuery = 14LPCWSTR 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`";
16enum eMessageQueuePermissionQuery { mqpqMessageQueuePermission = 1, mqpqMessageQueue, mqpqComponent, mqpqDomain, mqpqName, mqpqPermissions }; 16enum 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
3namespace WixToolset.Msmq 3namespace 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}