From 234dc4b2d2327d3f2e171403cc6105ae1ce964c1 Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Wed, 22 Jun 2005 18:27:34 +0000 Subject: [PATCH] Rework RegisterTypeLibraries to use MSI_IterateRecords. --- dlls/msi/action.c | 193 +++++++++++++++++++++------------------------- 1 file changed, 86 insertions(+), 107 deletions(-) diff --git a/dlls/msi/action.c b/dlls/msi/action.c index 417abf8428e..170a6137efc 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -2704,6 +2704,91 @@ static BOOL CALLBACK Typelib_EnumResNameProc( HMODULE hModule, LPCWSTR lpszType, return TRUE; } +static UINT ITERATE_RegisterTypeLibraries(MSIRECORD *row, LPVOID param) +{ + MSIPACKAGE* package = (MSIPACKAGE*)param; + LPCWSTR component; + INT index; + typelib_struct tl_struct; + HMODULE module; + static const WCHAR szTYPELIB[] = {'T','Y','P','E','L','I','B',0}; + + component = MSI_RecordGetString(row,3); + index = get_loaded_component(package,component); + if (index < 0) + return ERROR_SUCCESS; + + if (!ACTION_VerifyComponentForAction(package, index, INSTALLSTATE_LOCAL)) + { + TRACE("Skipping typelib reg due to disabled component\n"); + + package->components[index].Action = + package->components[index].Installed; + + return ERROR_SUCCESS; + } + + package->components[index].Action = INSTALLSTATE_LOCAL; + + index = get_loaded_file(package,package->components[index].KeyPath); + + if (index < 0) + return ERROR_SUCCESS; + + module = LoadLibraryExW(package->files[index].TargetPath, NULL, + LOAD_LIBRARY_AS_DATAFILE); + if (module != NULL) + { + LPWSTR guid; + guid = load_dynamic_stringW(row,1); + CLSIDFromString(guid, &tl_struct.clsid); + HeapFree(GetProcessHeap(),0,guid); + tl_struct.source = strdupW(package->files[index].TargetPath); + tl_struct.path = NULL; + + EnumResourceNamesW(module, szTYPELIB, Typelib_EnumResNameProc, + (LONG_PTR)&tl_struct); + + if (tl_struct.path != NULL) + { + LPWSTR help = NULL; + LPCWSTR helpid; + HRESULT res; + + helpid = MSI_RecordGetString(row,6); + + if (helpid) + help = resolve_folder(package,helpid,FALSE,FALSE,NULL); + res = RegisterTypeLib(tl_struct.ptLib,tl_struct.path,help); + HeapFree(GetProcessHeap(),0,help); + + if (!SUCCEEDED(res)) + ERR("Failed to register type library %s\n", + debugstr_w(tl_struct.path)); + else + { + ui_actiondata(package,szRegisterTypeLibraries,row); + + TRACE("Registered %s\n", debugstr_w(tl_struct.path)); + } + + ITypeLib_Release(tl_struct.ptLib); + HeapFree(GetProcessHeap(),0,tl_struct.path); + } + else + ERR("Failed to load type library %s\n", + debugstr_w(tl_struct.source)); + + FreeLibrary(module); + HeapFree(GetProcessHeap(),0,tl_struct.source); + } + else + ERR("Could not load file! %s\n", + debugstr_w(package->files[index].TargetPath)); + + return ERROR_SUCCESS; +} + static UINT ACTION_RegisterTypeLibraries(MSIPACKAGE *package) { /* @@ -2714,7 +2799,6 @@ static UINT ACTION_RegisterTypeLibraries(MSIPACKAGE *package) */ UINT rc; MSIQUERY * view; - MSIRECORD * row = 0; static const WCHAR Query[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', '`','T','y','p','e','L','i','b','`',0}; @@ -2726,112 +2810,7 @@ static UINT ACTION_RegisterTypeLibraries(MSIPACKAGE *package) if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; - rc = MSI_ViewExecute(view, 0); - if (rc != ERROR_SUCCESS) - { - MSI_ViewClose(view); - msiobj_release(&view->hdr); - return rc; - } - - while (1) - { - LPCWSTR component; - INT index; - typelib_struct tl_struct; - HMODULE module; - static const WCHAR szTYPELIB[] = {'T','Y','P','E','L','I','B',0}; - - rc = MSI_ViewFetch(view,&row); - if (rc != ERROR_SUCCESS) - { - rc = ERROR_SUCCESS; - break; - } - - component = MSI_RecordGetString(row,3); - index = get_loaded_component(package,component); - if (index < 0) - { - msiobj_release(&row->hdr); - continue; - } - - if (!ACTION_VerifyComponentForAction(package, index, - INSTALLSTATE_LOCAL)) - { - TRACE("Skipping typelib 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; - - index = get_loaded_file(package,package->components[index].KeyPath); - - if (index < 0) - { - msiobj_release(&row->hdr); - continue; - } - - module = LoadLibraryExW(package->files[index].TargetPath, NULL, - LOAD_LIBRARY_AS_DATAFILE); - if (module != NULL) - { - LPWSTR guid; - guid = load_dynamic_stringW(row,1); - CLSIDFromString(guid, &tl_struct.clsid); - HeapFree(GetProcessHeap(),0,guid); - tl_struct.source = strdupW(package->files[index].TargetPath); - tl_struct.path = NULL; - - EnumResourceNamesW(module, szTYPELIB, Typelib_EnumResNameProc, - (LONG_PTR)&tl_struct); - - if (tl_struct.path != NULL) - { - LPWSTR help = NULL; - LPCWSTR helpid; - HRESULT res; - - helpid = MSI_RecordGetString(row,6); - - if (helpid) - help = resolve_folder(package,helpid,FALSE,FALSE,NULL); - res = RegisterTypeLib(tl_struct.ptLib,tl_struct.path,help); - HeapFree(GetProcessHeap(),0,help); - - if (!SUCCEEDED(res)) - ERR("Failed to register type library %s\n", - debugstr_w(tl_struct.path)); - else - { - ui_actiondata(package,szRegisterTypeLibraries,row); - - TRACE("Registered %s\n", debugstr_w(tl_struct.path)); - } - - ITypeLib_Release(tl_struct.ptLib); - HeapFree(GetProcessHeap(),0,tl_struct.path); - } - else - ERR("Failed to load type library %s\n", - debugstr_w(tl_struct.source)); - - FreeLibrary(module); - HeapFree(GetProcessHeap(),0,tl_struct.source); - } - else - ERR("Could not load file! %s\n", - debugstr_w(package->files[index].TargetPath)); - msiobj_release(&row->hdr); - } - MSI_ViewClose(view); + rc = MSI_IterateRecords(view, NULL, ITERATE_RegisterTypeLibraries, package); msiobj_release(&view->hdr); return rc; }