From 187da09b2dd48b3cd5e26c1d51aa16d65ce6ba24 Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Wed, 9 Feb 2005 13:58:20 +0000 Subject: [PATCH] Implement RegisterExtensionInfo and RegisterMIMEInfo. --- dlls/msi/action.c | 214 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 212 insertions(+), 2 deletions(-) diff --git a/dlls/msi/action.c b/dlls/msi/action.c index 9829de818ee..519f15b4572 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -83,6 +83,8 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package); static UINT ACTION_RegisterTypeLibraries(MSIPACKAGE *package); static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package); static UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package); +static UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package); +static UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package); static UINT ACTION_CreateShortcuts(MSIPACKAGE *package); static UINT ACTION_PublishProduct(MSIPACKAGE *package); static UINT ACTION_WriteIniValues(MSIPACKAGE *package); @@ -303,9 +305,9 @@ struct _actions StandardActions[] = { { szPublishProduct, ACTION_PublishProduct }, { szRegisterClassInfo, ACTION_RegisterClassInfo }, { szRegisterComPlus, NULL}, - { szRegisterExtensionInfo, NULL}, + { szRegisterExtensionInfo, ACTION_RegisterExtensionInfo }, { szRegisterFonts, NULL}, - { szRegisterMIMEInfo, NULL}, + { szRegisterMIMEInfo, ACTION_RegisterMIMEInfo }, { szRegisterProduct, ACTION_RegisterProduct }, { szRegisterProgIdInfo, ACTION_RegisterProgIdInfo }, { szRegisterTypeLibraries, ACTION_RegisterTypeLibraries }, @@ -5352,6 +5354,214 @@ UINT ACTION_ResolveSource(MSIPACKAGE* package) return ERROR_SUCCESS; } + +static UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package) +{ + UINT rc; + MSIQUERY * view; + MSIRECORD * row = 0; + static const WCHAR ExecSeqQuery[] = { + 'S','E','L','E','C','T',' ','*',' ', + 'f','r','o','m',' ','E','x','t','e','n','s','i','o','n',0}; + static const WCHAR szContentType[] = +{ 'C','o','n','t','e','n','t',' ','T','y','p','e',0 }; + HKEY hkey; + + if (!package) + return ERROR_INVALID_HANDLE; + + rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + if (rc != ERROR_SUCCESS) + { + rc = ERROR_SUCCESS; + goto end; + } + + rc = MSI_ViewExecute(view, 0); + if (rc != ERROR_SUCCESS) + { + MSI_ViewClose(view); + msiobj_release(&view->hdr); + goto end; + } + + while (1) + { + WCHAR buffer[0x100]; + WCHAR extension[257]; + LPWSTR exten; + DWORD sz; + INT index; + + rc = MSI_ViewFetch(view,&row); + if (rc != ERROR_SUCCESS) + { + rc = ERROR_SUCCESS; + break; + } + + sz=0x100; + MSI_RecordGetStringW(row,2,buffer,&sz); + + index = get_loaded_component(package,buffer); + + if (index < 0) + { + msiobj_release(&row->hdr); + continue; + } + + if (package->components[index].ActionRequest != INSTALLSTATE_LOCAL) + { + TRACE("Skipping extension reg due to disabled component\n"); + msiobj_release(&row->hdr); + + package->components[index].Action = + package->components[index].Installed; + + continue; + } + + package->components[index].Action = INSTALLSTATE_LOCAL; + package->components[index].Installed = INSTALLSTATE_LOCAL; + + exten = load_dynamic_stringW(row,1); + extension[0] = '.'; + extension[1] = 0; + strcatW(extension,exten); + HeapFree(GetProcessHeap(),0,exten); + + RegCreateKeyW(HKEY_CLASSES_ROOT,extension,&hkey); + + if (!MSI_RecordIsNull(row,4)) + { + LPWSTR mime = load_dynamic_stringW(row,4); + RegSetValueExW(hkey,szContentType,0,REG_SZ,(LPVOID)mime, + (strlenW(mime)+1)*sizeof(WCHAR)); + HeapFree(GetProcessHeap(),0,mime); + } + + if (!MSI_RecordIsNull(row,3)) + { + static const WCHAR szSN[] = + {'\\','S','h','e','l','l','N','e','w',0}; + HKEY hkey2; + LPWSTR newkey; + LPWSTR progid= load_dynamic_stringW(row,3); + + RegSetValueExW(hkey,NULL,0,REG_SZ,(LPVOID)progid, + (strlenW(progid)+1)*sizeof(WCHAR)); + + newkey = HeapAlloc(GetProcessHeap(),0, + (strlenW(progid)+strlenW(szSN)+1) * sizeof(WCHAR)); + + strcpyW(newkey,progid); + strcatW(newkey,szSN); + RegCreateKeyW(hkey,newkey,&hkey2); + RegCloseKey(hkey2); + + HeapFree(GetProcessHeap(),0,progid); + HeapFree(GetProcessHeap(),0,newkey); + } + + + RegCloseKey(hkey); + + ui_actiondata(package,szRegisterExtensionInfo,row); + + msiobj_release(&row->hdr); + } + MSI_ViewClose(view); + msiobj_release(&view->hdr); + +end: + return rc; +} + +static UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package) +{ + UINT rc; + MSIQUERY * view; + MSIRECORD * row = 0; + static const WCHAR ExecSeqQuery[] = { + 'S','E','L','E','C','T',' ','*',' ', + 'f','r','o','m',' ','M','I','M','E',0}; + static const WCHAR szExten[] = +{ 'E','x','t','e','n','s','i','o','n',0 }; + HKEY hkey; + + if (!package) + return ERROR_INVALID_HANDLE; + + rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + if (rc != ERROR_SUCCESS) + { + rc = ERROR_SUCCESS; + goto end; + } + + rc = MSI_ViewExecute(view, 0); + if (rc != ERROR_SUCCESS) + { + MSI_ViewClose(view); + msiobj_release(&view->hdr); + goto end; + } + + while (1) + { + WCHAR extension[257]; + LPWSTR exten; + LPWSTR mime; + static const WCHAR fmt[] = +{'M','I','M','E','\\', +'D','a','t','a','b','a','s','e','\\', +'C','o','n','t','e','n','t',' ','T','y','p','e','\\', +'%','s',0}; + LPWSTR key; + + rc = MSI_ViewFetch(view,&row); + if (rc != ERROR_SUCCESS) + { + rc = ERROR_SUCCESS; + break; + } + + mime = load_dynamic_stringW(row,1); + exten = load_dynamic_stringW(row,2); + extension[0] = '.'; + extension[1] = 0; + strcatW(extension,exten); + HeapFree(GetProcessHeap(),0,exten); + + key = HeapAlloc(GetProcessHeap(),0,(strlenW(mime)+strlenW(fmt)+1) * + sizeof(WCHAR)); + sprintfW(key,fmt,mime); + RegCreateKeyW(HKEY_CLASSES_ROOT,key,&hkey); + RegSetValueExW(hkey,szExten,0,REG_SZ,(LPVOID)extension, + (strlenW(extension)+1)*sizeof(WCHAR)); + + HeapFree(GetProcessHeap(),0,mime); + HeapFree(GetProcessHeap(),0,key); + + if (!MSI_RecordIsNull(row,3)) + { + FIXME("Handle non null for field 3\n"); + } + + RegCloseKey(hkey); + + ui_actiondata(package,szRegisterMIMEInfo,row); + + msiobj_release(&row->hdr); + } + MSI_ViewClose(view); + msiobj_release(&view->hdr); + +end: + return rc; +} + /* Msi functions that seem appropriate here */ UINT WINAPI MsiDoActionA( MSIHANDLE hInstall, LPCSTR szAction ) {