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