aboutsummaryrefslogtreecommitdiff
path: root/src/ext/Msmq/ca/mqsched.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext/Msmq/ca/mqsched.cpp')
-rw-r--r--src/ext/Msmq/ca/mqsched.cpp196
1 files changed, 196 insertions, 0 deletions
diff --git a/src/ext/Msmq/ca/mqsched.cpp b/src/ext/Msmq/ca/mqsched.cpp
new file mode 100644
index 00000000..4c994901
--- /dev/null
+++ b/src/ext/Msmq/ca/mqsched.cpp
@@ -0,0 +1,196 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5
6/********************************************************************
7 MessageQueuingInstall - CUSTOM ACTION ENTRY POINT for installing MSMQ message queues
8
9********************************************************************/
10extern "C" UINT __stdcall MessageQueuingInstall(MSIHANDLE hInstall)
11{
12 HRESULT hr = S_OK;
13 UINT er = ERROR_SUCCESS;
14
15 MQI_MESSAGE_QUEUE_LIST lstMessageQueues;
16 MQI_MESSAGE_QUEUE_PERMISSION_LIST lstMessageQueuePermissions;
17
18 int iCost = 0;
19 LPWSTR pwzRollbackActionData = NULL;
20 LPWSTR pwzExecuteActionData = NULL;
21
22 ::ZeroMemory(&lstMessageQueues, sizeof(lstMessageQueues));
23 ::ZeroMemory(&lstMessageQueuePermissions, sizeof(lstMessageQueuePermissions));
24
25 // initialize
26 hr = WcaInitialize(hInstall, "MessageQueuingInstall");
27 ExitOnFailure(hr, "Failed to initialize");
28
29 do
30 {
31 hr = MqiSchedInitialize();
32 if (S_FALSE == hr)
33 {
34 WcaLog(LOGMSG_STANDARD, "Failed to load mqrt.dll.");
35 er = WcaErrorMessage(msierrMsmqCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
36 switch (er)
37 {
38 case IDABORT:
39 ExitFunction1(hr = E_FAIL); // bail with error
40 case IDRETRY:
41 break; // retry
42 case IDIGNORE: __fallthrough;
43 default:
44 ExitFunction1(hr = S_OK); // pretend everything is okay and bail
45 }
46 }
47 ExitOnFailure(hr, "Failed to initialize MSMQ.");
48 } while (S_FALSE == hr);
49
50 // read message queues
51 hr = MqiMessageQueueRead(&lstMessageQueues);
52 ExitOnFailure(hr, "Failed to read MessageQueue table");
53
54 // read message queue permissions
55 hr = MqiMessageQueuePermissionRead(&lstMessageQueues, &lstMessageQueuePermissions);
56 ExitOnFailure(hr, "Failed to read message queue permissions");
57
58 // verify message queue elementes
59 hr = MqiMessageQueueVerify(&lstMessageQueues);
60 ExitOnFailure(hr, "Failed to verify message queue elements.");
61
62 if (lstMessageQueues.iInstallCount || lstMessageQueuePermissions.iInstallCount)
63 {
64 // schedule rollback action
65 hr = MqiMessageQueuePermissionInstall(&lstMessageQueuePermissions, &pwzRollbackActionData);
66 ExitOnFailure(hr, "Failed to add message queue permissions to rollback action data");
67
68 hr = MqiMessageQueueInstall(&lstMessageQueues, TRUE, &pwzRollbackActionData);
69 ExitOnFailure(hr, "Failed to add message queues to rollback action data");
70
71 hr = WcaDoDeferredAction(L"MessageQueuingRollbackInstall", pwzRollbackActionData, 0);
72 ExitOnFailure(hr, "Failed to schedule MessageQueuingRollbackInstall");
73
74 // schedule execute action
75 hr = MqiMessageQueueInstall(&lstMessageQueues, FALSE, &pwzExecuteActionData);
76 ExitOnFailure(hr, "Failed to add message queues to execute action data");
77 iCost += lstMessageQueues.iInstallCount * COST_MESSAGE_QUEUE_CREATE;
78
79 hr = MqiMessageQueuePermissionInstall(&lstMessageQueuePermissions, &pwzExecuteActionData);
80 ExitOnFailure(hr, "Failed to add message queue permissions to execute action data");
81 iCost += lstMessageQueues.iInstallCount * COST_MESSAGE_QUEUE_PERMISSION_ADD;
82
83 hr = WcaDoDeferredAction(L"MessageQueuingExecuteInstall", pwzExecuteActionData, iCost);
84 ExitOnFailure(hr, "Failed to schedule MessageQueuingExecuteInstall");
85 }
86
87 hr = S_OK;
88
89LExit:
90 // clean up
91 MqiMessageQueueFreeList(&lstMessageQueues);
92 MqiMessageQueuePermissionFreeList(&lstMessageQueuePermissions);
93
94 ReleaseStr(pwzRollbackActionData);
95 ReleaseStr(pwzExecuteActionData);
96
97 // uninitialize
98 MqiSchedUninitialize();
99
100 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
101 return WcaFinalize(er);
102}
103
104
105/********************************************************************
106 MessageQueuingUninstall - CUSTOM ACTION ENTRY POINT for uninstalling MSMQ message queues
107
108********************************************************************/
109extern "C" UINT __stdcall MessageQueuingUninstall(MSIHANDLE hInstall)
110{
111 HRESULT hr = S_OK;
112 UINT er = ERROR_SUCCESS;
113
114 MQI_MESSAGE_QUEUE_LIST lstMessageQueues;
115 MQI_MESSAGE_QUEUE_PERMISSION_LIST lstMessageQueuePermissions;
116
117 int iCost = 0;
118 LPWSTR pwzRollbackActionData = NULL;
119 LPWSTR pwzExecuteActionData = NULL;
120
121 ::ZeroMemory(&lstMessageQueues, sizeof(lstMessageQueues));
122 ::ZeroMemory(&lstMessageQueuePermissions, sizeof(lstMessageQueuePermissions));
123
124 // initialize
125 hr = WcaInitialize(hInstall, "MessageQueuingUninstall");
126 ExitOnFailure(hr, "Failed to initialize");
127
128 do
129 {
130 hr = MqiSchedInitialize();
131 if (S_FALSE == hr)
132 {
133 WcaLog(LOGMSG_STANDARD, "Failed to load mqrt.dll.");
134 er = WcaErrorMessage(msierrMsmqCannotConnect, hr, INSTALLMESSAGE_ERROR | MB_ABORTRETRYIGNORE, 0);
135 switch (er)
136 {
137 case IDABORT:
138 ExitFunction1(hr = E_FAIL); // bail with error
139 case IDRETRY:
140 break; // retry
141 case IDIGNORE: __fallthrough;
142 default:
143 ExitFunction1(hr = S_OK); // pretend everything is okay and bail
144 }
145 }
146 ExitOnFailure(hr, "Failed to initialize MSMQ.");
147 } while (S_FALSE == hr);
148
149 // read message queues
150 hr = MqiMessageQueueRead(&lstMessageQueues);
151 ExitOnFailure(hr, "Failed to read MessageQueue table");
152
153 // read message queue permissions
154 hr = MqiMessageQueuePermissionRead(&lstMessageQueues, &lstMessageQueuePermissions);
155 ExitOnFailure(hr, "Failed to read message queue permissions");
156
157 if (lstMessageQueues.iUninstallCount || lstMessageQueuePermissions.iUninstallCount)
158 {
159 // schedule rollback action
160 hr = MqiMessageQueueUninstall(&lstMessageQueues, TRUE, &pwzRollbackActionData);
161 ExitOnFailure(hr, "Failed to add message queues to rollback action data");
162
163 hr = MqiMessageQueuePermissionUninstall(&lstMessageQueuePermissions, &pwzRollbackActionData);
164 ExitOnFailure(hr, "Failed to add message queue permissions to rollback action data");
165
166 hr = WcaDoDeferredAction(L"MessageQueuingRollbackUninstall", pwzRollbackActionData, 0);
167 ExitOnFailure(hr, "Failed to schedule MessageQueuingRollbackUninstall");
168
169 // schedule execute action
170 hr = MqiMessageQueuePermissionUninstall(&lstMessageQueuePermissions, &pwzExecuteActionData);
171 ExitOnFailure(hr, "Failed to add message queue permissions to execute action data");
172
173 hr = MqiMessageQueueUninstall(&lstMessageQueues, FALSE, &pwzExecuteActionData);
174 ExitOnFailure(hr, "Failed to add message queues to execute action data");
175 iCost += lstMessageQueues.iUninstallCount * COST_MESSAGE_QUEUE_DELETE;
176
177 hr = WcaDoDeferredAction(L"MessageQueuingExecuteUninstall", pwzExecuteActionData, iCost);
178 ExitOnFailure(hr, "Failed to schedule MessageQueuingExecuteUninstall");
179 }
180
181 hr = S_OK;
182
183LExit:
184 // clean up
185 MqiMessageQueueFreeList(&lstMessageQueues);
186 MqiMessageQueuePermissionFreeList(&lstMessageQueuePermissions);
187
188 ReleaseStr(pwzRollbackActionData);
189 ReleaseStr(pwzExecuteActionData);
190
191 // uninitialize
192 MqiSchedUninitialize();
193
194 er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
195 return WcaFinalize(er);
196}