MSI: ITERATE_DuplicateFiles

Aric Stewart aric at codeweavers.com
Mon Jun 20 08:37:44 CDT 2005


Still breaking down that big patch.
Use MSI_IterateRecords for DuplicateFiles.
-------------- next part --------------
Index: dlls/msi/files.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/files.c,v
retrieving revision 1.1
diff -u -r1.1 files.c
--- dlls/msi/files.c	17 Jun 2005 20:56:55 -0000	1.1
+++ dlls/msi/files.c	20 Jun 2005 13:10:43 -0000
@@ -562,138 +562,122 @@
     return rc;
 }
 
-UINT ACTION_DuplicateFiles(MSIPACKAGE *package)
+static UINT ITERATE_DuplicateFiles(MSIRECORD *row, LPVOID param)
 {
-    UINT rc;
-    MSIQUERY * view;
-    MSIRECORD * row = 0;
-    static const WCHAR ExecSeqQuery[] =
-        {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
-         '`','D','u','p','l','i','c','a','t','e','F','i','l','e','`',0};
+    MSIPACKAGE *package = (MSIPACKAGE*)param;
+    WCHAR *file_source = NULL;
+    WCHAR dest_name[0x100];
+    LPWSTR dest_path, dest;
+    LPCWSTR file_key, component;
+    INT component_index;
+    DWORD sz;
+    DWORD rc;
 
-    if (!package)
-        return ERROR_INVALID_HANDLE;
+    component = MSI_RecordGetString(row,2);
+    component_index = get_loaded_component(package,component);
+
+    if (!ACTION_VerifyComponentForAction(package, component_index, 
+                                   INSTALLSTATE_LOCAL))
+    {
+        TRACE("Skipping copy due to disabled component %s\n",
+                        debugstr_w(component));
+
+        /* the action taken was the same as the current install state */        
+        package->components[component_index].Action =
+            package->components[component_index].Installed;
 
-    rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
-    if (rc != ERROR_SUCCESS)
         return ERROR_SUCCESS;
+    }
 
-    rc = MSI_ViewExecute(view, 0);
-    if (rc != ERROR_SUCCESS)
+    package->components[component_index].Action = INSTALLSTATE_LOCAL;
+
+    file_key = MSI_RecordGetString(row,3);
+    if (!file_key)
     {
-        MSI_ViewClose(view);
-        msiobj_release(&view->hdr);
-        return rc;
+        ERR("Unable to get file key\n");
+        return ERROR_FUNCTION_FAILED;
     }
 
-    while (1)
+    rc = get_file_target(package,file_key,&file_source);
+
+    if (rc != ERROR_SUCCESS)
     {
-        WCHAR *file_source = NULL;
-        WCHAR dest_name[0x100];
-        LPWSTR dest_path, dest;
-        LPCWSTR file_key, component;
-        INT component_index;
+        ERR("Original file unknown %s\n",debugstr_w(file_key));
+        HeapFree(GetProcessHeap(),0,file_source);
+        return ERROR_SUCCESS;
+    }
 
-        DWORD sz;
+    if (MSI_RecordIsNull(row,4))
+    {
+        strcpyW(dest_name,strrchrW(file_source,'\\')+1);
+    }
+    else
+    {
+        sz=0x100;
+        MSI_RecordGetStringW(row,4,dest_name,&sz);
+        reduce_to_longfilename(dest_name);
+     }
 
-        rc = MSI_ViewFetch(view,&row);
-        if (rc != ERROR_SUCCESS)
+    if (MSI_RecordIsNull(row,5))
+    {
+        LPWSTR p;
+        dest_path = strdupW(file_source);
+        p = strrchrW(dest_path,'\\');
+        if (p)
+            *p=0;
+    }
+    else
+    {
+        LPCWSTR destkey;
+        destkey = MSI_RecordGetString(row,5);
+        dest_path = resolve_folder(package, destkey, FALSE,FALSE,NULL);
+        if (!dest_path)
         {
-            rc = ERROR_SUCCESS;
-            break;
+            ERR("Unable to get destination folder\n");
+            HeapFree(GetProcessHeap(),0,file_source);
+            return ERROR_FUNCTION_FAILED;
         }
+    }
 
-        component = MSI_RecordGetString(row,2);
-        component_index = get_loaded_component(package,component);
-
-        if (!ACTION_VerifyComponentForAction(package, component_index, 
-                                       INSTALLSTATE_LOCAL))
-        {
-            TRACE("Skipping copy due to disabled component %s\n",
-                            debugstr_w(component));
-
-            /* the action taken was the same as the current install state */        
-            package->components[component_index].Action =
-                package->components[component_index].Installed;
-
-            msiobj_release(&row->hdr);
-            continue;
-        }
+    dest = build_directory_name(2, dest_path, dest_name);
+       
+    TRACE("Duplicating file %s to %s\n",debugstr_w(file_source),
+          debugstr_w(dest)); 
+    
+    if (strcmpW(file_source,dest))
+        rc = !CopyFileW(file_source,dest,TRUE);
+    else
+        rc = ERROR_SUCCESS;
+    
+    if (rc != ERROR_SUCCESS)
+        ERR("Failed to copy file %s -> %s, last error %ld\n", debugstr_w(file_source), debugstr_w(dest_path), GetLastError());
 
-        package->components[component_index].Action = INSTALLSTATE_LOCAL;
+    FIXME("We should track these duplicate files as well\n");   
 
-        file_key = MSI_RecordGetString(row,3);
-        if (!file_key)
-        {
-            ERR("Unable to get file key\n");
-            msiobj_release(&row->hdr);
-            break;
-        }
+    HeapFree(GetProcessHeap(),0,dest_path);
+    HeapFree(GetProcessHeap(),0,dest);
+    HeapFree(GetProcessHeap(),0,file_source);
 
-        rc = get_file_target(package,file_key,&file_source);
+    return ERROR_SUCCESS;
+}
 
-        if (rc != ERROR_SUCCESS)
-        {
-            ERR("Original file unknown %s\n",debugstr_w(file_key));
-            msiobj_release(&row->hdr);
-            HeapFree(GetProcessHeap(),0,file_source);
-            continue;
-        }
+UINT ACTION_DuplicateFiles(MSIPACKAGE *package)
+{
+    UINT rc;
+    MSIQUERY * view;
+    static const WCHAR ExecSeqQuery[] =
+        {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
+         '`','D','u','p','l','i','c','a','t','e','F','i','l','e','`',0};
 
-        if (MSI_RecordIsNull(row,4))
-        {
-            strcpyW(dest_name,strrchrW(file_source,'\\')+1);
-        }
-        else
-        {
-            sz=0x100;
-            MSI_RecordGetStringW(row,4,dest_name,&sz);
-            reduce_to_longfilename(dest_name);
-         }
+    if (!package)
+        return ERROR_INVALID_HANDLE;
 
-        if (MSI_RecordIsNull(row,5))
-        {
-            LPWSTR p;
-            dest_path = strdupW(file_source);
-            p = strrchrW(dest_path,'\\');
-            if (p)
-                *p=0;
-        }
-        else
-        {
-            LPCWSTR destkey;
-            destkey = MSI_RecordGetString(row,5);
-            dest_path = resolve_folder(package, destkey, FALSE,FALSE,NULL);
-            if (!dest_path)
-            {
-                ERR("Unable to get destination folder\n");
-                msiobj_release(&row->hdr);
-                HeapFree(GetProcessHeap(),0,file_source);
-                break;
-            }
-        }
+    rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
+    if (rc != ERROR_SUCCESS)
+        return ERROR_SUCCESS;
 
-        dest = build_directory_name(2, dest_path, dest_name);
-           
-        TRACE("Duplicating file %s to %s\n",debugstr_w(file_source),
-              debugstr_w(dest)); 
-        
-        if (strcmpW(file_source,dest))
-            rc = !CopyFileW(file_source,dest,TRUE);
-        else
-            rc = ERROR_SUCCESS;
-        
-        if (rc != ERROR_SUCCESS)
-            ERR("Failed to copy file %s -> %s, last error %ld\n", debugstr_w(file_source), debugstr_w(dest_path), GetLastError());
-
-        FIXME("We should track these duplicate files as well\n");   
- 
-        msiobj_release(&row->hdr);
-        HeapFree(GetProcessHeap(),0,dest_path);
-        HeapFree(GetProcessHeap(),0,dest);
-        HeapFree(GetProcessHeap(),0,file_source);
-    }
-    MSI_ViewClose(view);
+    rc = MSI_IterateRecords(view, NULL, ITERATE_DuplicateFiles, package);
     msiobj_release(&view->hdr);
+
     return rc;
 }


More information about the wine-patches mailing list