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