msi: Implement the UnpublishComponents standard action.
This commit is contained in:
parent
d95e3eb4d2
commit
0f0e81d14a
|
@ -4583,6 +4583,80 @@ static UINT ACTION_PublishComponents(MSIPACKAGE *package)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UINT ITERATE_UnpublishComponent( MSIRECORD *rec, LPVOID param )
|
||||||
|
{
|
||||||
|
static const WCHAR szInstallerComponents[] = {
|
||||||
|
'S','o','f','t','w','a','r','e','\\',
|
||||||
|
'M','i','c','r','o','s','o','f','t','\\',
|
||||||
|
'I','n','s','t','a','l','l','e','r','\\',
|
||||||
|
'C','o','m','p','o','n','e','n','t','s','\\',0};
|
||||||
|
|
||||||
|
MSIPACKAGE *package = param;
|
||||||
|
LPCWSTR compgroupid, component, feature, qualifier;
|
||||||
|
MSICOMPONENT *comp;
|
||||||
|
MSIFEATURE *feat;
|
||||||
|
MSIRECORD *uirow;
|
||||||
|
WCHAR squashed[GUID_SIZE], keypath[MAX_PATH];
|
||||||
|
LONG res;
|
||||||
|
|
||||||
|
feature = MSI_RecordGetString( rec, 5 );
|
||||||
|
feat = get_loaded_feature( package, feature );
|
||||||
|
if (!feat)
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
|
||||||
|
if (feat->ActionRequest != INSTALLSTATE_ABSENT)
|
||||||
|
{
|
||||||
|
TRACE("Feature %s not scheduled for removal\n", debugstr_w(feature));
|
||||||
|
feat->Action = feat->Installed;
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
component = MSI_RecordGetString( rec, 3 );
|
||||||
|
comp = get_loaded_component( package, component );
|
||||||
|
if (!comp)
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
|
||||||
|
compgroupid = MSI_RecordGetString( rec, 1 );
|
||||||
|
qualifier = MSI_RecordGetString( rec, 2 );
|
||||||
|
|
||||||
|
squash_guid( compgroupid, squashed );
|
||||||
|
strcpyW( keypath, szInstallerComponents );
|
||||||
|
strcatW( keypath, squashed );
|
||||||
|
|
||||||
|
res = RegDeleteKeyW( HKEY_CURRENT_USER, keypath );
|
||||||
|
if (res != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
WARN("Unable to delete component key %d\n", res);
|
||||||
|
}
|
||||||
|
|
||||||
|
uirow = MSI_CreateRecord( 2 );
|
||||||
|
MSI_RecordSetStringW( uirow, 1, compgroupid );
|
||||||
|
MSI_RecordSetStringW( uirow, 2, qualifier );
|
||||||
|
ui_actiondata( package, szUnpublishComponents, uirow );
|
||||||
|
msiobj_release( &uirow->hdr );
|
||||||
|
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static UINT ACTION_UnpublishComponents( MSIPACKAGE *package )
|
||||||
|
{
|
||||||
|
UINT rc;
|
||||||
|
MSIQUERY *view;
|
||||||
|
static const WCHAR query[] =
|
||||||
|
{'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
|
||||||
|
'`','P','u','b','l','i','s','h',
|
||||||
|
'C','o','m','p','o','n','e','n','t','`',0};
|
||||||
|
|
||||||
|
rc = MSI_DatabaseOpenViewW( package->db, query, &view );
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
|
||||||
|
rc = MSI_IterateRecords( view, NULL, ITERATE_UnpublishComponent, package );
|
||||||
|
msiobj_release( &view->hdr );
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param)
|
static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param)
|
||||||
{
|
{
|
||||||
MSIPACKAGE *package = param;
|
MSIPACKAGE *package = param;
|
||||||
|
@ -6550,12 +6624,6 @@ static UINT ACTION_SetODBCFolders( MSIPACKAGE *package )
|
||||||
return msi_unimplemented_action_stub( package, "SetODBCFolders", table );
|
return msi_unimplemented_action_stub( package, "SetODBCFolders", table );
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT ACTION_UnpublishComponents( MSIPACKAGE *package )
|
|
||||||
{
|
|
||||||
static const WCHAR table[] = { 'P','u','b','l','i','s','h','C','o','m','p','o','n','e','n','t',0 };
|
|
||||||
return msi_unimplemented_action_stub( package, "UnpublishComponents", table );
|
|
||||||
}
|
|
||||||
|
|
||||||
static UINT ACTION_UnregisterClassInfo( MSIPACKAGE *package )
|
static UINT ACTION_UnregisterClassInfo( MSIPACKAGE *package )
|
||||||
{
|
{
|
||||||
static const WCHAR table[] = { 'A','p','p','I','d',0 };
|
static const WCHAR table[] = { 'A','p','p','I','d',0 };
|
||||||
|
|
Loading…
Reference in New Issue