msi: iterate CreateShortcuts

Aric Stewart aric at codeweavers.com
Thu Jun 23 08:36:22 CDT 2005


rework CreateShortcuts to use MSI_IterateRecords
-------------- next part --------------
Index: dlls/msi/action.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/action.c,v
retrieving revision 1.160
diff -u -r1.160 action.c
--- dlls/msi/action.c	23 Jun 2005 11:04:09 -0000	1.160
+++ dlls/msi/action.c	23 Jun 2005 13:29:56 -0000
@@ -2815,187 +2770,166 @@
     return rc;
 }
 
-static UINT ACTION_CreateShortcuts(MSIPACKAGE *package)
+static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param)
 {
-    UINT rc;
-    MSIQUERY * view;
-    MSIRECORD * row = 0;
-    static const WCHAR Query[] =
-        {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
-         '`','S','h','o','r','t','c','u','t','`',0};
+    MSIPACKAGE *package = (MSIPACKAGE*)param;
+    LPWSTR target_file, target_folder;
+    LPCWSTR buffer;
+    WCHAR filename[0x100];
+    DWORD sz;
+    DWORD index;
+    static const WCHAR szlnk[]={'.','l','n','k',0};
     IShellLinkW *sl;
     IPersistFile *pf;
     HRESULT res;
 
-    if (!package)
-        return ERROR_INVALID_HANDLE;
-
-    res = CoInitialize( NULL );
-    if (FAILED (res))
-    {
-        ERR("CoInitialize failed\n");
-        return ERROR_FUNCTION_FAILED;
-    }
+    buffer = MSI_RecordGetString(row,4);
+    index = get_loaded_component(package,buffer);
 
-    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
-    if (rc != ERROR_SUCCESS)
+    if (index < 0)
         return ERROR_SUCCESS;
 
-    rc = MSI_ViewExecute(view, 0);
-    if (rc != ERROR_SUCCESS)
+    if (!ACTION_VerifyComponentForAction(package, index, INSTALLSTATE_LOCAL))
     {
-        MSI_ViewClose(view);
-        msiobj_release(&view->hdr);
-        return rc;
-    }
+        TRACE("Skipping shortcut creation due to disabled component\n");
 
-    while (1)
-    {
-        LPWSTR target_file, target_folder;
-        LPCWSTR buffer;
-        WCHAR filename[0x100];
-        DWORD sz;
-        DWORD index;
-        static const WCHAR szlnk[]={'.','l','n','k',0};
+        package->components[index].Action =
+                package->components[index].Installed;
 
-        rc = MSI_ViewFetch(view,&row);
-        if (rc != ERROR_SUCCESS)
-        {
-            rc = ERROR_SUCCESS;
-            break;
-        }
-        
-        buffer = MSI_RecordGetString(row,4);
-        index = get_loaded_component(package,buffer);
+        return ERROR_SUCCESS;
+    }
 
-        if (index < 0)
-        {
-            msiobj_release(&row->hdr);
-            continue;
-        }
+    package->components[index].Action = INSTALLSTATE_LOCAL;
 
-        if (!ACTION_VerifyComponentForAction(package, index,
-                                INSTALLSTATE_LOCAL))
-        {
-            TRACE("Skipping shortcut creation due to disabled component\n");
-            msiobj_release(&row->hdr);
+    ui_actiondata(package,szCreateShortcuts,row);
 
-            package->components[index].Action =
-                package->components[index].Installed;
+    res = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
+                    &IID_IShellLinkW, (LPVOID *) &sl );
 
-            continue;
-        }
+    if (FAILED(res))
+    {
+        ERR("Is IID_IShellLink\n");
+        return ERROR_SUCCESS;
+    }
 
-        package->components[index].Action = INSTALLSTATE_LOCAL;
+    res = IShellLinkW_QueryInterface( sl, &IID_IPersistFile,(LPVOID*) &pf );
+    if( FAILED( res ) )
+    {
+        ERR("Is IID_IPersistFile\n");
+        return ERROR_SUCCESS;
+    }
 
-        ui_actiondata(package,szCreateShortcuts,row);
+    buffer = MSI_RecordGetString(row,2);
+    target_folder = resolve_folder(package, buffer,FALSE,FALSE,NULL);
 
-        res = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
-                              &IID_IShellLinkW, (LPVOID *) &sl );
+    /* may be needed because of a bug somehwere else */
+    create_full_pathW(target_folder);
 
-        if (FAILED(res))
-        {
-            ERR("Is IID_IShellLink\n");
-            msiobj_release(&row->hdr);
-            continue;
-        }
+    sz = 0x100;
+    MSI_RecordGetStringW(row,3,filename,&sz);
+    reduce_to_longfilename(filename);
+    if (!strchrW(filename,'.') || strcmpiW(strchrW(filename,'.'),szlnk))
+        strcatW(filename,szlnk);
+    target_file = build_directory_name(2, target_folder, filename);
+    HeapFree(GetProcessHeap(),0,target_folder);
 
-        res = IShellLinkW_QueryInterface( sl, &IID_IPersistFile,(LPVOID*) &pf );
-        if( FAILED( res ) )
-        {
-            ERR("Is IID_IPersistFile\n");
-            msiobj_release(&row->hdr);
-            continue;
-        }
+    buffer = MSI_RecordGetString(row,5);
+    if (strchrW(buffer,'['))
+    {
+        LPWSTR deformated;
+        deformat_string(package,buffer,&deformated);
+        IShellLinkW_SetPath(sl,deformated);
+        HeapFree(GetProcessHeap(),0,deformated);
+    }
+    else
+    {
+        LPWSTR keypath;
+        FIXME("poorly handled shortcut format, advertised shortcut\n");
+        keypath = strdupW(package->components[index].FullKeypath);
+        IShellLinkW_SetPath(sl,keypath);
+        HeapFree(GetProcessHeap(),0,keypath);
+    }
+
+    if (!MSI_RecordIsNull(row,6))
+    {
+        LPWSTR deformated;
+        buffer = MSI_RecordGetString(row,6);
+        deformat_string(package,buffer,&deformated);
+        IShellLinkW_SetArguments(sl,deformated);
+        HeapFree(GetProcessHeap(),0,deformated);
+    }
 
-        buffer = MSI_RecordGetString(row,2);
-        target_folder = resolve_folder(package, buffer,FALSE,FALSE,NULL);
+    if (!MSI_RecordIsNull(row,7))
+    {
+        buffer = MSI_RecordGetString(row,7);
+        IShellLinkW_SetDescription(sl,buffer);
+    }
 
-        /* may be needed because of a bug somehwere else */
-        create_full_pathW(target_folder);
+    if (!MSI_RecordIsNull(row,8))
+        IShellLinkW_SetHotkey(sl,MSI_RecordGetInteger(row,8));
 
-        sz = 0x100;
-        MSI_RecordGetStringW(row,3,filename,&sz);
-        reduce_to_longfilename(filename);
-        if (!strchrW(filename,'.') || strcmpiW(strchrW(filename,'.'),szlnk))
-            strcatW(filename,szlnk);
-        target_file = build_directory_name(2, target_folder, filename);
-        HeapFree(GetProcessHeap(),0,target_folder);
+    if (!MSI_RecordIsNull(row,9))
+    {
+        WCHAR *Path = NULL;
+        INT index; 
 
-        buffer = MSI_RecordGetString(row,5);
-        if (strchrW(buffer,'['))
-        {
-            LPWSTR deformated;
-            deformat_string(package,buffer,&deformated);
-            IShellLinkW_SetPath(sl,deformated);
-            HeapFree(GetProcessHeap(),0,deformated);
-        }
-        else
-        {
-            LPWSTR keypath;
-            FIXME("poorly handled shortcut format, advertised shortcut\n");
-            keypath = strdupW(package->components[index].FullKeypath);
-            IShellLinkW_SetPath(sl,keypath);
-            HeapFree(GetProcessHeap(),0,keypath);
-        }
+        buffer = MSI_RecordGetString(row,9);
 
-        if (!MSI_RecordIsNull(row,6))
-        {
-            LPWSTR deformated;
-            buffer = MSI_RecordGetString(row,6);
-            deformat_string(package,buffer,&deformated);
-            IShellLinkW_SetArguments(sl,deformated);
-            HeapFree(GetProcessHeap(),0,deformated);
-        }
+        build_icon_path(package,buffer,&Path);
+        index = MSI_RecordGetInteger(row,10);
 
-        if (!MSI_RecordIsNull(row,7))
-        {
-            buffer = MSI_RecordGetString(row,7);
-            IShellLinkW_SetDescription(sl,buffer);
-        }
+        IShellLinkW_SetIconLocation(sl,Path,index);
+        HeapFree(GetProcessHeap(),0,Path);
+    }
 
-        if (!MSI_RecordIsNull(row,8))
-            IShellLinkW_SetHotkey(sl,MSI_RecordGetInteger(row,8));
+    if (!MSI_RecordIsNull(row,11))
+        IShellLinkW_SetShowCmd(sl,MSI_RecordGetInteger(row,11));
 
-        if (!MSI_RecordIsNull(row,9))
-        {
-            WCHAR *Path = NULL;
-            INT index; 
+    if (!MSI_RecordIsNull(row,12))
+    {
+        LPWSTR Path;
+        buffer = MSI_RecordGetString(row,12);
+        Path = resolve_folder(package, buffer, FALSE, FALSE, NULL);
+        IShellLinkW_SetWorkingDirectory(sl,Path);
+        HeapFree(GetProcessHeap(), 0, Path);
+    }
 
-            buffer = MSI_RecordGetString(row,9);
+    TRACE("Writing shortcut to %s\n",debugstr_w(target_file));
+    IPersistFile_Save(pf,target_file,FALSE);
 
-            build_icon_path(package,buffer,&Path);
-            index = MSI_RecordGetInteger(row,10);
+    HeapFree(GetProcessHeap(),0,target_file);    
 
-            IShellLinkW_SetIconLocation(sl,Path,index);
-            HeapFree(GetProcessHeap(),0,Path);
-        }
+    IPersistFile_Release( pf );
+    IShellLinkW_Release( sl );
 
-        if (!MSI_RecordIsNull(row,11))
-            IShellLinkW_SetShowCmd(sl,MSI_RecordGetInteger(row,11));
+    return ERROR_SUCCESS;
+}
 
-        if (!MSI_RecordIsNull(row,12))
-        {
-            LPWSTR Path;
-            buffer = MSI_RecordGetString(row,12);
-            Path = resolve_folder(package, buffer, FALSE, FALSE, NULL);
-            IShellLinkW_SetWorkingDirectory(sl,Path);
-            HeapFree(GetProcessHeap(), 0, Path);
-        }
+static UINT ACTION_CreateShortcuts(MSIPACKAGE *package)
+{
+    UINT rc;
+    HRESULT res;
+    MSIQUERY * view;
+    static const WCHAR Query[] =
+        {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
+         '`','S','h','o','r','t','c','u','t','`',0};
 
-        TRACE("Writing shortcut to %s\n",debugstr_w(target_file));
-        IPersistFile_Save(pf,target_file,FALSE);
-    
-        HeapFree(GetProcessHeap(),0,target_file);    
+    if (!package)
+        return ERROR_INVALID_HANDLE;
 
-        IPersistFile_Release( pf );
-        IShellLinkW_Release( sl );
+    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
+    if (rc != ERROR_SUCCESS)
+        return ERROR_SUCCESS;
 
-        msiobj_release(&row->hdr);
+    res = CoInitialize( NULL );
+    if (FAILED (res))
+    {
+        ERR("CoInitialize failed\n");
+        return ERROR_FUNCTION_FAILED;
     }
-    MSI_ViewClose(view);
-    msiobj_release(&view->hdr);
 
+    rc = MSI_IterateRecords(view, NULL, ITERATE_CreateShortcuts, package);
+    msiobj_release(&view->hdr);
 
     CoUninitialize();
 



More information about the wine-patches mailing list