From 3bdfa1f6248ebc86c5d734f53aa220b3cf4c2bae Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 2 Apr 2010 10:38:57 +0200 Subject: [PATCH] msi: Implement the UnregisterProgIdInfo standard action. --- dlls/msi/action.c | 12 ------------ dlls/msi/classes.c | 37 ++++++++++++++++++++++++++++++++++++- dlls/msi/font.c | 5 ----- dlls/msi/msipriv.h | 4 ++++ 4 files changed, 40 insertions(+), 18 deletions(-) diff --git a/dlls/msi/action.c b/dlls/msi/action.c index 2b729ec3f5..4f1be9aaa3 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -124,8 +124,6 @@ static const WCHAR szPublishComponents[] = {'P','u','b','l','i','s','h','C','o','m','p','o','n','e','n','t','s',0}; static const WCHAR szRegisterComPlus[] = {'R','e','g','i','s','t','e','r','C','o','m','P','l','u','s',0}; -static const WCHAR szRegisterFonts[] = - {'R','e','g','i','s','t','e','r','F','o','n','t','s',0}; static const WCHAR szRegisterUser[] = {'R','e','g','i','s','t','e','r','U','s','e','r',0}; static const WCHAR szRemoveEnvironmentStrings[] = @@ -162,12 +160,8 @@ static const WCHAR szUnregisterComPlus[] = {'U','n','r','e','g','i','s','t','e','r','C','o','m','P','l','u','s',0}; static const WCHAR szUnregisterExtensionInfo[] = {'U','n','r','e','g','i','s','t','e','r','E','x','t','e','n','s','i','o','n','I','n','f','o',0}; -static const WCHAR szUnregisterFonts[] = - {'U','n','r','e','g','i','s','t','e','r','F','o','n','t','s',0}; static const WCHAR szUnregisterMIMEInfo[] = {'U','n','r','e','g','i','s','t','e','r','M','I','M','E','I','n','f','o',0}; -static const WCHAR szUnregisterProgIdInfo[] = - {'U','n','r','e','g','i','s','t','e','r','P','r','o','g','I','d','I','n','f','o',0}; static const WCHAR szUnregisterTypeLibraries[] = {'U','n','r','e','g','i','s','t','e','r','T','y','p','e','L','i','b','r','a','r','i','e','s',0}; static const WCHAR szValidateProductID[] = @@ -6967,12 +6961,6 @@ static UINT ACTION_UnregisterMIMEInfo( MSIPACKAGE *package ) return msi_unimplemented_action_stub( package, "UnregisterMIMEInfo", table ); } -static UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package ) -{ - static const WCHAR table[] = { 'P','r','o','g','I','d',0 }; - return msi_unimplemented_action_stub( package, "UnregisterProgIdInfo", table ); -} - typedef UINT (*STANDARDACTIONHANDLER)(MSIPACKAGE*); static const struct diff --git a/dlls/msi/classes.c b/dlls/msi/classes.c index 7d4f1a01fd..d6e88084cc 100644 --- a/dlls/msi/classes.c +++ b/dlls/msi/classes.c @@ -25,7 +25,7 @@ * RegisterExtensionInfo * RegisterMIMEInfo * UnRegisterClassInfo - * UnRegisterProgIdInfo (TODO) + * UnRegisterProgIdInfo * UnRegisterExtensionInfo (TODO) * UnRegisterMIMEInfo (TODO) */ @@ -1105,6 +1105,41 @@ UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package) return ERROR_SUCCESS; } +UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package ) +{ + MSIPROGID *progid; + MSIRECORD *uirow; + LONG res; + + load_classes_and_such( package ); + + LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry ) + { + /* check if this progid is to be removed */ + if (progid->Class && !progid->Class->Installed) + progid->InstallMe = FALSE; + + if (progid->InstallMe) + { + TRACE("progid %s not scheduled to be removed\n", debugstr_w(progid->ProgID)); + continue; + } + + TRACE("Unregistering progid %s\n", debugstr_w(progid->ProgID)); + + res = RegDeleteTreeW( HKEY_CLASSES_ROOT, progid->ProgID ); + if (res != ERROR_SUCCESS) + WARN("Failed to delete progid key %d\n", res); + + uirow = MSI_CreateRecord( 1 ); + MSI_RecordSetStringW( uirow, 1, progid->ProgID ); + ui_actiondata( package, szUnregisterProgIdInfo, uirow ); + msiobj_release( &uirow->hdr ); + } + + return ERROR_SUCCESS; +} + static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid, MSICOMPONENT* component, const MSIEXTENSION* extension, MSIVERB* verb, INT* Sequence ) diff --git a/dlls/msi/font.c b/dlls/msi/font.c index 1b2c3c729d..1d99a4c0d3 100644 --- a/dlls/msi/font.c +++ b/dlls/msi/font.c @@ -64,11 +64,6 @@ typedef struct _tagTT_NAME_RECORD { #define SWAPWORD(x) MAKEWORD(HIBYTE(x), LOBYTE(x)) #define SWAPLONG(x) MAKELONG(SWAPWORD(HIWORD(x)), SWAPWORD(LOWORD(x))) -static const WCHAR szRegisterFonts[] = - {'R','e','g','i','s','t','e','r','F','o','n','t','s',0}; -static const WCHAR szUnregisterFonts[] = - {'U','n','r','e','g','i','s','t','e','r','F','o','n','t','s',0}; - static const WCHAR regfont1[] = {'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index d5a81a4ede..e81237c0a3 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -964,6 +964,7 @@ extern UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package); extern UINT ACTION_RegisterFonts(MSIPACKAGE *package); extern UINT ACTION_UnregisterClassInfo(MSIPACKAGE *package); extern UINT ACTION_UnregisterFonts(MSIPACKAGE *package); +extern UINT ACTION_UnregisterProgIdInfo(MSIPACKAGE *package); /* Helpers */ extern DWORD deformat_string(MSIPACKAGE *package, LPCWSTR ptr, WCHAR** data ); @@ -1086,6 +1087,9 @@ static const WCHAR szAppSearch[] = {'A','p','p','S','e','a','r','c','h',0}; static const WCHAR szMoveFiles[] = {'M','o','v','e','F','i','l','e','s',0}; static const WCHAR szCCPSearch[] = {'C','C','P','S','e','a','r','c','h',0}; static const WCHAR szUnregisterClassInfo[] = {'U','n','r','e','g','i','s','t','e','r','C','l','a','s','s','I','n','f','o',0}; +static const WCHAR szUnregisterProgIdInfo[] = {'U','n','r','e','g','i','s','t','e','r','P','r','o','g','I','d','I','n','f','o',0}; +static const WCHAR szRegisterFonts[] = {'R','e','g','i','s','t','e','r','F','o','n','t','s',0}; +static const WCHAR szUnregisterFonts[] = {'U','n','r','e','g','i','s','t','e','r','F','o','n','t','s',0}; static const WCHAR szCLSID[] = {'C','L','S','I','D',0}; static const WCHAR szProgID[] = {'P','r','o','g','I','D',0}; static const WCHAR szVIProgID[] = {'V','e','r','s','i','o','n','I','n','d','e','p','e','n','d','e','n','t','P','r','o','g','I','D',0}; -- 2.32.0.93.g670b81a890