diff options
Diffstat (limited to 'src/ext/Util/ca/scagroup.cpp')
-rw-r--r-- | src/ext/Util/ca/scagroup.cpp | 412 |
1 files changed, 370 insertions, 42 deletions
diff --git a/src/ext/Util/ca/scagroup.cpp b/src/ext/Util/ca/scagroup.cpp index c484c1d2..3d2c3beb 100644 --- a/src/ext/Util/ca/scagroup.cpp +++ b/src/ext/Util/ca/scagroup.cpp | |||
@@ -6,8 +6,11 @@ | |||
6 | LPCWSTR vcsGroupQuery = L"SELECT `Group`, `Component_`, `Name`, `Domain` FROM `Wix4Group` WHERE `Group`=?"; | 6 | LPCWSTR vcsGroupQuery = L"SELECT `Group`, `Component_`, `Name`, `Domain` FROM `Wix4Group` WHERE `Group`=?"; |
7 | enum eGroupQuery { vgqGroup = 1, vgqComponent, vgqName, vgqDomain }; | 7 | enum eGroupQuery { vgqGroup = 1, vgqComponent, vgqName, vgqDomain }; |
8 | 8 | ||
9 | LPCWSTR vcsGroupGroupQuery = L"SELECT `Parent_`, `Child_` FROM `Wix6GroupGroup` WHERE `Child_`=?"; | 9 | LPCWSTR vcsGroupParentsQuery = L"SELECT `Parent_`,`Component_`,`Name`,`Domain`,`Child_` FROM `Wix6GroupGroup`,`Wix4Group` WHERE `Wix6GroupGroup`.`Parent_`=`Wix4Group`.`Group` AND `Wix6GroupGroup`.`Child_`=?"; |
10 | enum eGroupGroupQuery { vggqParent = 1, vggqChild }; | 10 | enum eGroupParentsQuery { vgpqParent = 1, vgpqParentComponent, vgpqParentName, vgpqParentDomain, vgpqChild }; |
11 | |||
12 | LPCWSTR vcsGroupChildrenQuery = L"SELECT `Parent_`,`Child_`,`Component_`,`Name`,`Domain` FROM `Wix6GroupGroup`,`Wix4Group` WHERE `Wix6GroupGroup`.`Child_`=`Wix4Group`.`Group` AND `Wix6GroupGroup`.`Parent_`=?"; | ||
13 | enum eGroupChildrenQuery { vgcqParent = 1, vgcqChild, vgcqChildComponent, vgcqChildName, vgcqChildDomain }; | ||
11 | 14 | ||
12 | LPCWSTR vActionableGroupQuery = L"SELECT `Group`,`Component_`,`Name`,`Domain`,`Comment`,`Attributes` FROM `Wix4Group`,`Wix6Group` WHERE `Component_` IS NOT NULL AND `Group`=`Group_`"; | 15 | LPCWSTR vActionableGroupQuery = L"SELECT `Group`,`Component_`,`Name`,`Domain`,`Comment`,`Attributes` FROM `Wix4Group`,`Wix6Group` WHERE `Component_` IS NOT NULL AND `Group`=`Group_`"; |
13 | enum eActionableGroupQuery { vagqGroup = 1, vagqComponent, vagqName, vagqDomain, vagqComment, vagqAttributes }; | 16 | enum eActionableGroupQuery { vagqGroup = 1, vagqComponent, vagqName, vagqDomain, vagqComment, vagqAttributes }; |
@@ -16,7 +19,6 @@ static HRESULT AddGroupToList( | |||
16 | __inout SCA_GROUP** ppsgList | 19 | __inout SCA_GROUP** ppsgList |
17 | ); | 20 | ); |
18 | 21 | ||
19 | |||
20 | HRESULT __stdcall ScaGetGroup( | 22 | HRESULT __stdcall ScaGetGroup( |
21 | __in LPCWSTR wzGroup, | 23 | __in LPCWSTR wzGroup, |
22 | __out SCA_GROUP* pscag | 24 | __out SCA_GROUP* pscag |
@@ -160,11 +162,149 @@ void ScaGroupFreeList( | |||
160 | { | 162 | { |
161 | psgDelete = psgList; | 163 | psgDelete = psgList; |
162 | psgList = psgList->psgNext; | 164 | psgList = psgList->psgNext; |
165 | ScaGroupFreeList(psgDelete->psgParents); | ||
166 | ScaGroupFreeList(psgDelete->psgChildren); | ||
163 | 167 | ||
164 | MemFree(psgDelete); | 168 | MemFree(psgDelete); |
165 | } | 169 | } |
166 | } | 170 | } |
167 | 171 | ||
172 | HRESULT ScaGroupGetParents( | ||
173 | __inout SCA_GROUP* psg | ||
174 | ) | ||
175 | { | ||
176 | HRESULT hr = S_OK; | ||
177 | UINT er = ERROR_SUCCESS; | ||
178 | SCA_GROUP* psgParent = NULL; | ||
179 | PMSIHANDLE hView, hParamRec, hRec; | ||
180 | LPWSTR pwzTempStr = NULL; | ||
181 | |||
182 | if (S_OK != WcaTableExists(L"Wix6GroupGroup")) | ||
183 | { | ||
184 | WcaLog(LOGMSG_VERBOSE, "Wix6GroupGroup Table does not exist, exiting"); | ||
185 | ExitFunction1(hr = S_FALSE); | ||
186 | } | ||
187 | |||
188 | // setup the query parameter record | ||
189 | hParamRec = ::MsiCreateRecord(1); | ||
190 | hr = WcaSetRecordString(hParamRec, 1, psg->wzKey); | ||
191 | |||
192 | // | ||
193 | // loop through all the groups | ||
194 | // | ||
195 | hr = WcaOpenView(vcsGroupParentsQuery, &hView); | ||
196 | ExitOnFailure(hr, "failed to open view on Wix6GroupGroup,Wix4Group table(s)"); | ||
197 | hr = WcaExecuteView(hView, hParamRec); | ||
198 | ExitOnFailure(hr, "failed to open view on Wix4Group,Wix6Group table(s)"); | ||
199 | while (S_OK == (hr = WcaFetchRecord(hView, &hRec))) | ||
200 | { | ||
201 | hr = AddGroupToList(&psg->psgParents); | ||
202 | ExitOnFailure(hr, "failed to add group to list"); | ||
203 | |||
204 | psgParent = psg->psgParents; | ||
205 | |||
206 | if (::MsiRecordIsNull(hRec, vgcqChildComponent)) | ||
207 | { | ||
208 | psgParent->isInstalled = INSTALLSTATE_NOTUSED; | ||
209 | psgParent->isAction = INSTALLSTATE_NOTUSED; | ||
210 | } | ||
211 | else | ||
212 | { | ||
213 | hr = WcaGetRecordString(hRec, vgpqParentComponent, &pwzTempStr); | ||
214 | ExitOnFailure(hr, "failed to get Wix4Group.Component"); | ||
215 | wcsncpy_s(psgParent->wzComponent, pwzTempStr, MAX_DARWIN_KEY); | ||
216 | ReleaseNullStr(pwzTempStr); | ||
217 | |||
218 | er = ::MsiGetComponentStateW(WcaGetInstallHandle(), psgParent->wzComponent, &psgParent->isInstalled, &psgParent->isAction); | ||
219 | hr = HRESULT_FROM_WIN32(er); | ||
220 | ExitOnFailure(hr, "failed to get Component state for Wix4Group"); | ||
221 | } | ||
222 | |||
223 | hr = WcaGetRecordString(hRec, vgpqParentName, &pwzTempStr); | ||
224 | ExitOnFailure(hr, "failed to get Wix4Group.Name"); | ||
225 | wcsncpy_s(psgParent->wzName, pwzTempStr, MAX_DARWIN_COLUMN); | ||
226 | ReleaseNullStr(pwzTempStr); | ||
227 | |||
228 | |||
229 | hr = WcaGetRecordString(hRec, vgpqParentDomain, &pwzTempStr); | ||
230 | ExitOnFailure(hr, "failed to get Wix4Group.Domain"); | ||
231 | wcsncpy_s(psgParent->wzDomain, pwzTempStr, MAX_DARWIN_COLUMN); | ||
232 | ReleaseNullStr(pwzTempStr); | ||
233 | } | ||
234 | |||
235 | LExit: | ||
236 | ReleaseNullStr(pwzTempStr); | ||
237 | return hr; | ||
238 | } | ||
239 | |||
240 | HRESULT ScaGroupGetChildren( | ||
241 | __inout SCA_GROUP* psg | ||
242 | ) | ||
243 | { | ||
244 | HRESULT hr = S_OK; | ||
245 | UINT er = ERROR_SUCCESS; | ||
246 | SCA_GROUP* psgChild = NULL; | ||
247 | PMSIHANDLE hView, hParamRec, hRec; | ||
248 | LPWSTR pwzTempStr = NULL; | ||
249 | |||
250 | if (S_OK != WcaTableExists(L"Wix6GroupGroup")) | ||
251 | { | ||
252 | WcaLog(LOGMSG_VERBOSE, "Wix6GroupGroup Table does not exist, exiting"); | ||
253 | ExitFunction1(hr = S_FALSE); | ||
254 | } | ||
255 | |||
256 | // setup the query parameter record | ||
257 | hParamRec = ::MsiCreateRecord(1); | ||
258 | hr = WcaSetRecordString(hParamRec, 1, psg->wzKey); | ||
259 | |||
260 | // | ||
261 | // loop through all the groups | ||
262 | // | ||
263 | hr = WcaOpenView(vcsGroupChildrenQuery, &hView); | ||
264 | ExitOnFailure(hr, "failed to open view on Wix6GroupGroup,Wix4Group table(s)"); | ||
265 | hr = WcaExecuteView(hView, hParamRec); | ||
266 | ExitOnFailure(hr, "failed to open view on Wix4Group,Wix6Group table(s)"); | ||
267 | while (S_OK == (hr = WcaFetchRecord(hView, &hRec))) | ||
268 | { | ||
269 | hr = AddGroupToList(&psg->psgChildren); | ||
270 | ExitOnFailure(hr, "failed to add group to list"); | ||
271 | |||
272 | psgChild = psg->psgChildren; | ||
273 | |||
274 | if (::MsiRecordIsNull(hRec, vgcqChildComponent)) | ||
275 | { | ||
276 | psgChild->isInstalled = INSTALLSTATE_NOTUSED; | ||
277 | psgChild->isAction = INSTALLSTATE_NOTUSED; | ||
278 | } | ||
279 | else | ||
280 | { | ||
281 | hr = WcaGetRecordString(hRec, vgcqChildComponent, &pwzTempStr); | ||
282 | ExitOnFailure(hr, "failed to get Wix4Group.Component"); | ||
283 | wcsncpy_s(psgChild->wzComponent, pwzTempStr, MAX_DARWIN_KEY); | ||
284 | ReleaseNullStr(pwzTempStr); | ||
285 | |||
286 | er = ::MsiGetComponentStateW(WcaGetInstallHandle(), psgChild->wzComponent, &psgChild->isInstalled, &psgChild->isAction); | ||
287 | hr = HRESULT_FROM_WIN32(er); | ||
288 | ExitOnFailure(hr, "failed to get Component state for Wix4Group"); | ||
289 | } | ||
290 | |||
291 | hr = WcaGetRecordString(hRec, vgcqChildName, &pwzTempStr); | ||
292 | ExitOnFailure(hr, "failed to get Wix4Group.Name"); | ||
293 | wcsncpy_s(psgChild->wzName, pwzTempStr, MAX_DARWIN_COLUMN); | ||
294 | ReleaseNullStr(pwzTempStr); | ||
295 | |||
296 | |||
297 | hr = WcaGetRecordString(hRec, vgcqChildDomain, &pwzTempStr); | ||
298 | ExitOnFailure(hr, "failed to get Wix4Group.Domain"); | ||
299 | wcsncpy_s(psgChild->wzDomain, pwzTempStr, MAX_DARWIN_COLUMN); | ||
300 | ReleaseNullStr(pwzTempStr); | ||
301 | } | ||
302 | |||
303 | LExit: | ||
304 | ReleaseNullStr(pwzTempStr); | ||
305 | return hr; | ||
306 | } | ||
307 | |||
168 | 308 | ||
169 | HRESULT ScaGroupRead( | 309 | HRESULT ScaGroupRead( |
170 | __out SCA_GROUP** ppsgList | 310 | __out SCA_GROUP** ppsgList |
@@ -179,7 +319,7 @@ HRESULT ScaGroupRead( | |||
179 | 319 | ||
180 | LPWSTR pwzData = NULL; | 320 | LPWSTR pwzData = NULL; |
181 | 321 | ||
182 | BOOL fGroupGroupExists = FALSE; | 322 | //BOOL fGroupGroupExists = FALSE; |
183 | 323 | ||
184 | SCA_GROUP *psg = NULL; | 324 | SCA_GROUP *psg = NULL; |
185 | 325 | ||
@@ -196,11 +336,6 @@ HRESULT ScaGroupRead( | |||
196 | ExitFunction1(hr = S_FALSE); | 336 | ExitFunction1(hr = S_FALSE); |
197 | } | 337 | } |
198 | 338 | ||
199 | if (S_OK == WcaTableExists(L"Wix6GroupGroup")) | ||
200 | { | ||
201 | fGroupGroupExists = TRUE; | ||
202 | } | ||
203 | |||
204 | // | 339 | // |
205 | // loop through all the groups | 340 | // loop through all the groups |
206 | // | 341 | // |
@@ -230,21 +365,26 @@ HRESULT ScaGroupRead( | |||
230 | psg->isAction = isAction; | 365 | psg->isAction = isAction; |
231 | hr = ::StringCchCopyW(psg->wzComponent, countof(psg->wzComponent), pwzData); | 366 | hr = ::StringCchCopyW(psg->wzComponent, countof(psg->wzComponent), pwzData); |
232 | ExitOnFailure(hr, "failed to copy component name: %ls", pwzData); | 367 | ExitOnFailure(hr, "failed to copy component name: %ls", pwzData); |
368 | ReleaseNullStr(pwzData); | ||
233 | 369 | ||
234 | hr = WcaGetRecordString(hRec, vagqGroup, &pwzData); | 370 | hr = WcaGetRecordString(hRec, vagqGroup, &pwzData); |
235 | ExitOnFailure(hr, "failed to get Wix4Group.Group"); | 371 | ExitOnFailure(hr, "failed to get Wix4Group.Group"); |
236 | hr = ::StringCchCopyW(psg->wzKey, countof(psg->wzKey), pwzData); | 372 | hr = ::StringCchCopyW(psg->wzKey, countof(psg->wzKey), pwzData); |
237 | ExitOnFailure(hr, "failed to copy group key: %ls", pwzData); | 373 | ExitOnFailure(hr, "failed to copy group key: %ls", pwzData); |
374 | ReleaseNullStr(pwzData); | ||
238 | 375 | ||
239 | hr = WcaGetRecordFormattedString(hRec, vagqName, &pwzData); | 376 | hr = WcaGetRecordFormattedString(hRec, vagqName, &pwzData); |
240 | ExitOnFailure(hr, "failed to get Wix4Group.Name"); | 377 | ExitOnFailure(hr, "failed to get Wix4Group.Name"); |
241 | hr = ::StringCchCopyW(psg->wzName, countof(psg->wzName), pwzData); | 378 | hr = ::StringCchCopyW(psg->wzName, countof(psg->wzName), pwzData); |
242 | ExitOnFailure(hr, "failed to copy group name: %ls", pwzData); | 379 | ExitOnFailure(hr, "failed to copy group name: %ls", pwzData); |
380 | ReleaseNullStr(pwzData); | ||
243 | 381 | ||
244 | hr = WcaGetRecordFormattedString(hRec, vagqDomain, &pwzData); | 382 | hr = WcaGetRecordFormattedString(hRec, vagqDomain, &pwzData); |
245 | ExitOnFailure(hr, "failed to get Wix4Group.Domain"); | 383 | ExitOnFailure(hr, "failed to get Wix4Group.Domain"); |
246 | hr = ::StringCchCopyW(psg->wzDomain, countof(psg->wzDomain), pwzData); | 384 | hr = ::StringCchCopyW(psg->wzDomain, countof(psg->wzDomain), pwzData); |
247 | ExitOnFailure(hr, "failed to copy group domain: %ls", pwzData); | 385 | ExitOnFailure(hr, "failed to copy group domain: %ls", pwzData); |
386 | ReleaseNullStr(pwzData); | ||
387 | |||
248 | hr = WcaGetRecordFormattedString(hRec, vagqComment, &pwzData); | 388 | hr = WcaGetRecordFormattedString(hRec, vagqComment, &pwzData); |
249 | ExitOnFailure(hr, "failed to get Wix6Group.Comment"); | 389 | ExitOnFailure(hr, "failed to get Wix6Group.Comment"); |
250 | hr = ::StringCchCopyW(psg->wzComment, countof(psg->wzComment), pwzData); | 390 | hr = ::StringCchCopyW(psg->wzComment, countof(psg->wzComment), pwzData); |
@@ -253,36 +393,9 @@ HRESULT ScaGroupRead( | |||
253 | hr = WcaGetRecordInteger(hRec, vagqAttributes, &psg->iAttributes); | 393 | hr = WcaGetRecordInteger(hRec, vagqAttributes, &psg->iAttributes); |
254 | ExitOnFailure(hr, "failed to get Wix6Group.Attributes"); | 394 | ExitOnFailure(hr, "failed to get Wix6Group.Attributes"); |
255 | 395 | ||
256 | // Check if this group is to be added to any other groups | 396 | ScaGroupGetParents(psg); |
257 | if (fGroupGroupExists) | ||
258 | { | ||
259 | hGroupRec = ::MsiCreateRecord(1); | ||
260 | hr = WcaSetRecordString(hGroupRec, 1, psg->wzKey); | ||
261 | ExitOnFailure(hr, "Failed to create group record for querying Wix6GroupGroup table"); | ||
262 | |||
263 | hr = WcaOpenExecuteView(vcsGroupGroupQuery, &hGroupGroupView); | ||
264 | ExitOnFailure(hr, "Failed to open view on Wix6GroupGroup table for group %ls", psg->wzKey);/* | ||
265 | hr = WcaExecuteView(hGroupGroupView, hGroupRec); | ||
266 | ExitOnFailure(hr, "Failed to execute view on Wix6GroupGroup table for group: %ls", psg->wzKey);*/ | ||
267 | 397 | ||
268 | while (S_OK == (hr = WcaFetchRecord(hGroupGroupView, &hRec))) | 398 | ScaGroupGetChildren(psg); |
269 | { | ||
270 | hr = WcaGetRecordString(hRec, vggqParent, &pwzData); | ||
271 | ExitOnFailure(hr, "failed to get Wix6GroupGroup.Parent"); | ||
272 | |||
273 | hr = AddGroupToList(&(psg->psgGroups)); | ||
274 | ExitOnFailure(hr, "failed to add group to list"); | ||
275 | |||
276 | hr = ScaGetGroup(pwzData, psg->psgGroups); | ||
277 | ExitOnFailure(hr, "failed to get information for group: %ls", pwzData); | ||
278 | } | ||
279 | |||
280 | if (E_NOMOREITEMS == hr) | ||
281 | { | ||
282 | hr = S_OK; | ||
283 | } | ||
284 | ExitOnFailure(hr, "failed to enumerate selected rows from Wix4UserGroup table"); | ||
285 | } | ||
286 | } | 399 | } |
287 | } | 400 | } |
288 | 401 | ||
@@ -301,7 +414,6 @@ LExit: | |||
301 | /* **************************************************************** | 414 | /* **************************************************************** |
302 | ScaGroupExecute - Schedules group account creation or removal based on | 415 | ScaGroupExecute - Schedules group account creation or removal based on |
303 | component state. | 416 | component state. |
304 | |||
305 | ******************************************************************/ | 417 | ******************************************************************/ |
306 | HRESULT ScaGroupExecute( | 418 | HRESULT ScaGroupExecute( |
307 | __in SCA_GROUP *psgList | 419 | __in SCA_GROUP *psgList |
@@ -428,7 +540,7 @@ HRESULT ScaGroupExecute( | |||
428 | hr = WcaWriteIntegerToCaData(iRollbackUserAttributes, &pwzRollbackData); | 540 | hr = WcaWriteIntegerToCaData(iRollbackUserAttributes, &pwzRollbackData); |
429 | ExitOnFailure(hr, "failed to add group attributes to rollback custom action data for group: %ls", psg->wzKey); | 541 | ExitOnFailure(hr, "failed to add group attributes to rollback custom action data for group: %ls", psg->wzKey); |
430 | 542 | ||
431 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"CreateGroupRollback"), pwzRollbackData, COST_GROUP_DELETE); | 543 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION6(L"CreateGroupRollback"), pwzRollbackData, COST_GROUP_DELETE); |
432 | ExitOnFailure(hr, "failed to schedule CreateGroupRollback"); | 544 | ExitOnFailure(hr, "failed to schedule CreateGroupRollback"); |
433 | } | 545 | } |
434 | else | 546 | else |
@@ -441,7 +553,7 @@ HRESULT ScaGroupExecute( | |||
441 | // | 553 | // |
442 | // Schedule the creation now. | 554 | // Schedule the creation now. |
443 | // | 555 | // |
444 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"CreateGroup"), pwzActionData, COST_GROUP_ADD); | 556 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION6(L"CreateGroup"), pwzActionData, COST_GROUP_ADD); |
445 | ExitOnFailure(hr, "failed to schedule CreateGroup"); | 557 | ExitOnFailure(hr, "failed to schedule CreateGroup"); |
446 | } | 558 | } |
447 | else if (((GROUP_EXISTS_YES == geGroupExists) | 559 | else if (((GROUP_EXISTS_YES == geGroupExists) |
@@ -457,7 +569,7 @@ HRESULT ScaGroupExecute( | |||
457 | // | 569 | // |
458 | // Note: We can't rollback the removal of a group which is why RemoveGroup is a commit | 570 | // Note: We can't rollback the removal of a group which is why RemoveGroup is a commit |
459 | // CustomAction. | 571 | // CustomAction. |
460 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RemoveGroup"), pwzActionData, COST_GROUP_DELETE); | 572 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION6(L"RemoveGroup"), pwzActionData, COST_GROUP_DELETE); |
461 | ExitOnFailure(hr, "failed to schedule RemoveGroup"); | 573 | ExitOnFailure(hr, "failed to schedule RemoveGroup"); |
462 | } | 574 | } |
463 | 575 | ||
@@ -501,3 +613,219 @@ static HRESULT AddGroupToList( | |||
501 | LExit: | 613 | LExit: |
502 | return hr; | 614 | return hr; |
503 | } | 615 | } |
616 | |||
617 | /* **************************************************************** | ||
618 | ScaGroupMembershipRemoveParentsExecute - Schedules group membership removal | ||
619 | based on parent/child component state | ||
620 | ******************************************************************/ | ||
621 | HRESULT ScaGroupMembershipRemoveParentsExecute( | ||
622 | __in SCA_GROUP* psg | ||
623 | ) | ||
624 | { | ||
625 | HRESULT hr = S_OK; | ||
626 | LPWSTR pwzActionData = NULL; | ||
627 | |||
628 | for (SCA_GROUP* psgp = psg->psgParents; psgp; psgp = psgp->psgNext) | ||
629 | { | ||
630 | Assert(psgp->wzName); | ||
631 | if (WcaIsUninstalling(psg->isInstalled, psg->isAction) | ||
632 | || WcaIsUninstalling(psgp->isInstalled, psgp->isAction)) | ||
633 | { | ||
634 | hr = WcaWriteStringToCaData(psgp->wzName, &pwzActionData); | ||
635 | ExitOnFailure(hr, "Failed to add parent group name to custom action data: %ls", psgp->wzName); | ||
636 | hr = WcaWriteStringToCaData(psgp->wzDomain, &pwzActionData); | ||
637 | ExitOnFailure(hr, "Failed to add parent group domain to custom action data: %ls", psgp->wzDomain); | ||
638 | hr = WcaWriteStringToCaData(psg->wzName, &pwzActionData); | ||
639 | ExitOnFailure(hr, "Failed to add child group name to custom action data: %ls", psg->wzName); | ||
640 | hr = WcaWriteStringToCaData(psg->wzDomain, &pwzActionData); | ||
641 | ExitOnFailure(hr, "Failed to add child group domain to custom action data: %ls", psg->wzDomain); | ||
642 | hr = WcaWriteIntegerToCaData(psg->iAttributes, &pwzActionData); | ||
643 | ExitOnFailure(hr, "Failed to add group attributes to custom action data: %i", psg->iAttributes); | ||
644 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION6(L"RemoveGroupMembership"), pwzActionData, COST_GROUPMEMBERSHIP_DELETE); | ||
645 | |||
646 | LExit: | ||
647 | ReleaseNullStr(pwzActionData); | ||
648 | if (hr != S_OK && !(psg->iAttributes & SCAG_NON_VITAL)) | ||
649 | { | ||
650 | return hr; | ||
651 | } | ||
652 | } | ||
653 | } | ||
654 | return S_OK; | ||
655 | } | ||
656 | |||
657 | /* **************************************************************** | ||
658 | ScaGroupMembershipRemoveChildrenExecute - | ||
659 | ******************************************************************/ | ||
660 | HRESULT ScaGroupMembershipRemoveChildrenExecute( | ||
661 | __in SCA_GROUP* psg | ||
662 | ) | ||
663 | { | ||
664 | HRESULT hr = S_OK; | ||
665 | LPWSTR pwzActionData = NULL; | ||
666 | |||
667 | for (SCA_GROUP* psgc = psg->psgChildren; psgc; psgc = psgc->psgNext) | ||
668 | { | ||
669 | Assert(psgc->wzName); | ||
670 | if (WcaIsUninstalling(psg->isInstalled, psg->isAction) | ||
671 | || WcaIsUninstalling(psgc->isInstalled, psgc->isAction)) | ||
672 | { | ||
673 | hr = WcaWriteStringToCaData(psg->wzName, &pwzActionData); | ||
674 | ExitOnFailure(hr, "Failed to add parent group name to custom action data: %ls", psg->wzName); | ||
675 | hr = WcaWriteStringToCaData(psg->wzDomain, &pwzActionData); | ||
676 | ExitOnFailure(hr, "Failed to add parent group domain to custom action data: %ls", psg->wzDomain); | ||
677 | hr = WcaWriteStringToCaData(psgc->wzName, &pwzActionData); | ||
678 | ExitOnFailure(hr, "Failed to add child group name to custom action data: %ls", psgc->wzName); | ||
679 | hr = WcaWriteStringToCaData(psgc->wzDomain, &pwzActionData); | ||
680 | ExitOnFailure(hr, "Failed to add child group domain to custom action data: %ls", psgc->wzDomain); | ||
681 | hr = WcaWriteIntegerToCaData(psg->iAttributes, &pwzActionData); | ||
682 | ExitOnFailure(hr, "Failed to add group attributes to custom action data: %i", psg->iAttributes); | ||
683 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION6(L"RemoveGroupMembership"), pwzActionData, COST_GROUPMEMBERSHIP_DELETE); | ||
684 | |||
685 | LExit: | ||
686 | ReleaseNullStr(pwzActionData); | ||
687 | |||
688 | if (hr != S_OK && !(psg->iAttributes & SCAG_NON_VITAL)) | ||
689 | { | ||
690 | return hr; | ||
691 | } | ||
692 | } | ||
693 | } | ||
694 | return S_OK; | ||
695 | } | ||
696 | |||
697 | /* **************************************************************** | ||
698 | ScaGroupMembershipRemoveExecute - Schedules group membership removal | ||
699 | based on parent/child component state | ||
700 | ******************************************************************/ | ||
701 | HRESULT ScaGroupMembershipRemoveExecute( | ||
702 | __in SCA_GROUP* psgList | ||
703 | ) | ||
704 | { | ||
705 | HRESULT hr = S_OK; | ||
706 | |||
707 | // Loop through all the users to be configured. | ||
708 | for (SCA_GROUP* psg = psgList; psg; psg = psg->psgNext) | ||
709 | { | ||
710 | Assert(psg->wzName); | ||
711 | // first we loop through the Parents | ||
712 | hr = ScaGroupMembershipRemoveParentsExecute(psg); | ||
713 | ExitOnFailure(hr, "Failed to remove parent membership for vital group: %ls", psg->wzKey); | ||
714 | |||
715 | // then through the Children | ||
716 | hr = ScaGroupMembershipRemoveChildrenExecute(psg); | ||
717 | ExitOnFailure(hr, "Failed to remove child membership for vital group: %ls", psg->wzKey); | ||
718 | } | ||
719 | |||
720 | LExit: | ||
721 | return hr; | ||
722 | } | ||
723 | |||
724 | /* **************************************************************** | ||
725 | ScaGroupMembershipAddParentsExecute - Schedules group membership removal | ||
726 | based on parent/child component state | ||
727 | ******************************************************************/ | ||
728 | HRESULT ScaGroupMembershipAddParentsExecute( | ||
729 | __in SCA_GROUP* psg | ||
730 | ) | ||
731 | { | ||
732 | HRESULT hr = S_OK; | ||
733 | LPWSTR pwzActionData = NULL; | ||
734 | |||
735 | for (SCA_GROUP* psgp = psg->psgParents; psgp; psgp = psgp->psgNext) | ||
736 | { | ||
737 | Assert(psgp->wzName); | ||
738 | if (WcaIsInstalling(psg->isInstalled, psg->isAction) | ||
739 | || WcaIsInstalling(psgp->isInstalled, psgp->isAction)) | ||
740 | { | ||
741 | hr = WcaWriteStringToCaData(psgp->wzName, &pwzActionData); | ||
742 | ExitOnFailure(hr, "Failed to add parent group domain to custom action data: %ls", psgp->wzName); | ||
743 | hr = WcaWriteStringToCaData(psgp->wzDomain, &pwzActionData); | ||
744 | ExitOnFailure(hr, "Failed to add parent group domain to custom action data: %ls", psgp->wzDomain); | ||
745 | hr = WcaWriteStringToCaData(psg->wzName, &pwzActionData); | ||
746 | ExitOnFailure(hr, "Failed to add child group name to custom action data: %ls", psg->wzName); | ||
747 | hr = WcaWriteStringToCaData(psg->wzDomain, &pwzActionData); | ||
748 | ExitOnFailure(hr, "Failed to add child group domain to custom action data: %ls", psg->wzDomain); | ||
749 | hr = WcaWriteIntegerToCaData(psg->iAttributes, &pwzActionData); | ||
750 | ExitOnFailure(hr, "Failed to add group attributes to custom action data: %i", psg->iAttributes); | ||
751 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION6(L"AddGroupMembership"), pwzActionData, COST_GROUPMEMBERSHIP_ADD); | ||
752 | |||
753 | LExit: | ||
754 | ReleaseNullStr(pwzActionData); | ||
755 | |||
756 | if (hr != S_OK && !(psg->iAttributes & SCAG_NON_VITAL)) | ||
757 | { | ||
758 | return hr; | ||
759 | } | ||
760 | } | ||
761 | } | ||
762 | return S_OK; | ||
763 | } | ||
764 | |||
765 | /* **************************************************************** | ||
766 | ScaGroupMembershipAddChildrenExecute - Schedules group membership removal | ||
767 | based on parent/child component state | ||
768 | ******************************************************************/ | ||
769 | HRESULT ScaGroupMembershipAddChildrenExecute( | ||
770 | __in SCA_GROUP* psg | ||
771 | ) | ||
772 | { | ||
773 | HRESULT hr = S_OK; | ||
774 | LPWSTR pwzActionData = NULL; | ||
775 | |||
776 | // then through the Children | ||
777 | for (SCA_GROUP* psgc = psg->psgChildren; psgc; psgc = psgc->psgNext) | ||
778 | { | ||
779 | Assert(psgc->wzName); | ||
780 | if (WcaIsInstalling(psg->isInstalled, psg->isAction) | ||
781 | || WcaIsInstalling(psgc->isInstalled, psgc->isAction)) | ||
782 | { | ||
783 | hr = WcaWriteStringToCaData(psg->wzName, &pwzActionData); | ||
784 | ExitOnFailure(hr, "Failed to add child group name to custom action data: %ls", psg->wzName); | ||
785 | hr = WcaWriteStringToCaData(psg->wzDomain, &pwzActionData); | ||
786 | ExitOnFailure(hr, "Failed to add child group domain to custom action data: %ls", psg->wzDomain); | ||
787 | hr = WcaWriteStringToCaData(psgc->wzName, &pwzActionData); | ||
788 | ExitOnFailure(hr, "Failed to add parent group domain to custom action data: %ls", psgc->wzName); | ||
789 | hr = WcaWriteStringToCaData(psgc->wzDomain, &pwzActionData); | ||
790 | ExitOnFailure(hr, "Failed to add parent group domain to custom action data: %ls", psgc->wzDomain); | ||
791 | hr = WcaWriteIntegerToCaData(psg->iAttributes, &pwzActionData); | ||
792 | ExitOnFailure(hr, "Failed to add group attributes to custom action data: %i", psg->iAttributes); | ||
793 | hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION6(L"AddGroupMembership"), pwzActionData, COST_GROUPMEMBERSHIP_ADD); | ||
794 | |||
795 | LExit: | ||
796 | ReleaseNullStr(pwzActionData); | ||
797 | if (hr != S_OK && !(psg->iAttributes & SCAG_NON_VITAL)) | ||
798 | { | ||
799 | return hr; | ||
800 | } | ||
801 | } | ||
802 | } | ||
803 | return S_OK; | ||
804 | } | ||
805 | |||
806 | /* **************************************************************** | ||
807 | ScaGroupMembershipAddExecute - Schedules group membership addition | ||
808 | based on parent/child component state | ||
809 | ******************************************************************/ | ||
810 | HRESULT ScaGroupMembershipAddExecute( | ||
811 | __in SCA_GROUP* psgList | ||
812 | ) | ||
813 | { | ||
814 | HRESULT hr = S_OK; | ||
815 | |||
816 | // Loop through all the users to be configured. | ||
817 | for (SCA_GROUP* psg = psgList; psg; psg = psg->psgNext) | ||
818 | { | ||
819 | Assert(psg->wzName); | ||
820 | // first we loop through the Parents | ||
821 | hr = ScaGroupMembershipAddParentsExecute(psg); | ||
822 | ExitOnFailure(hr, "Failed to add parent membership for vital group: %ls", psg->wzKey); | ||
823 | |||
824 | // then through the Children | ||
825 | hr = ScaGroupMembershipAddChildrenExecute(psg); | ||
826 | ExitOnFailure(hr, "Failed to add child membership for vital group: %ls", psg->wzKey); | ||
827 | } | ||
828 | |||
829 | LExit: | ||
830 | return hr; | ||
831 | } | ||