msi [5/11]: Model the media_info structure members after the columns in the media table

James Hawkins truiken at gmail.com
Tue Nov 7 17:10:52 CST 2006


Hi,

Changelog:
* Model the media_info structure members after the columns in the media table.

 dlls/msi/files.c |  110 ++++++++++++++++++++++--------------------------------
 1 files changed, 44 insertions(+), 66 deletions(-)

-- 
James Hawkins
-------------- next part --------------
diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 5dbf9bf..3359dc1 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -58,10 +58,12 @@ extern const WCHAR szRemoveFiles[];
 static const WCHAR cszTempFolder[]= {'T','e','m','p','F','o','l','d','e','r',0};
 
 struct media_info {
-    UINT last_sequence; 
-    LPWSTR last_volume;
-    LPWSTR last_path;
-    DWORD count;
+    UINT disk_id;
+    UINT last_sequence;
+    LPWSTR disk_prompt;
+    LPWSTR cabinet;
+    LPWSTR volume_label;
+    BOOL is_continuous;
     WCHAR source[MAX_PATH];
 };
 
@@ -112,7 +114,7 @@ end:
 typedef struct
 {
     MSIPACKAGE* package;
-    LPCSTR cab_path;
+    struct media_info *mi;
 } CabData;
 
 static void * cabinet_alloc(ULONG cb)
@@ -282,53 +284,43 @@ static INT_PTR cabinet_notify(FDINOTIFIC
  */
 static BOOL extract_cabinet_file(MSIPACKAGE* package, struct media_info *mi)
 {
+    LPSTR cabinet, cab_path = NULL;
+    LPWSTR ptr;
     HFDI hfdi;
     ERF erf;
-    BOOL ret;
-    char *cabinet;
-    char *cab_path;
-    static CHAR empty[] = "";
+    BOOL ret = FALSE;
     CabData data;
 
-    TRACE("Extracting %s to %s\n",debugstr_w(mi->source), debugstr_w(mi->last_path));
-
-    hfdi = FDICreate(cabinet_alloc,
-                     cabinet_free,
-                     cabinet_open,
-                     cabinet_read,
-                     cabinet_write,
-                     cabinet_close,
-                     cabinet_seek,
-                     0,
-                     &erf);
+    TRACE("Extracting %s\n", debugstr_w(mi->source));
+
+    hfdi = FDICreate(cabinet_alloc, cabinet_free, cabinet_open, cabinet_read,
+                     cabinet_write, cabinet_close, cabinet_seek, 0, &erf);
     if (!hfdi)
     {
         ERR("FDICreate failed\n");
         return FALSE;
     }
 
-    if (!(cabinet = strdupWtoA( mi->source )))
-    {
-        FDIDestroy(hfdi);
-        return FALSE;
-    }
-    if (!(cab_path = strdupWtoA( mi->last_path )))
-    {
-        FDIDestroy(hfdi);
-        msi_free(cabinet);
-        return FALSE;
-    }
+    ptr = strrchrW(mi->source, '\\') + 1;
+    cabinet = strdupWtoA(ptr);
+    if (!cabinet)
+        goto done;
 
-    data.package = package;
-    data.cab_path = cab_path;
+    cab_path = strdupWtoA(mi->source);
+    if (!cab_path)
+        goto done;
 
-    ret = FDICopy(hfdi, cabinet, empty, 0, cabinet_notify, NULL, &data);
+    cab_path[ptr - mi->source] = '\0';
+
+    data.package = package;
+    data.mi = mi;
 
+    ret = FDICopy(hfdi, cabinet, cab_path, 0, cabinet_notify, NULL, &data);
     if (!ret)
         ERR("FDICopy failed\n");
 
+done:
     FDIDestroy(hfdi);
-
     msi_free(cabinet);
     msi_free(cab_path);
 
@@ -356,7 +348,9 @@ static VOID set_file_source(MSIPACKAGE* 
 
 static void free_media_info( struct media_info *mi )
 {
-    msi_free( mi->last_path );
+    msi_free( mi->disk_prompt );
+    msi_free( mi->cabinet );
+    msi_free( mi->volume_label );
     msi_free( mi );
 }
 
@@ -441,19 +435,18 @@ static UINT ready_media_for_file( MSIPAC
          ' ','%', 'i',' ','O','R','D','E','R',' ','B','Y',' ',
          '`','D','i','s','k','I','d','`',0};
     LPCWSTR cab, volume;
+    LPWSTR source_dir;
     DWORD sz;
     INT seq;
     LPCWSTR prompt;
-    MSICOMPONENT *comp = file->Component;
 
     if (file->Sequence <= mi->last_sequence)
     {
-        set_file_source(package, file, mi->last_path);
+        set_file_source(package, file, mi->source);
         TRACE("Media already ready (%u, %u)\n",file->Sequence,mi->last_sequence);
         return ERROR_SUCCESS;
     }
 
-    mi->count ++;
     row = MSI_QueryGetRecord(package->db, ExecSeqQuery, file->Sequence);
     if (!row)
     {
@@ -464,22 +457,21 @@ static UINT ready_media_for_file( MSIPAC
     volume = MSI_RecordGetString(row, 5);
     prompt = MSI_RecordGetString(row, 3);
 
-    msi_free(mi->last_path);
-    mi->last_path = NULL;
+    source_dir = msi_dup_property(package, cszSourceDir);
 
     if (!file->IsCompressed)
     {
-        mi->last_path = resolve_folder(package, comp->Directory, TRUE, FALSE, NULL);
-        set_file_source(package, file, mi->last_path);
+        lstrcpyW(mi->source, source_dir);
+        set_file_source(package, file, mi->source);
 
         MsiSourceListAddMediaDiskW(package->ProductCode, NULL, 
-            MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->count, volume,
+            MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id, volume,
             prompt);
 
         MsiSourceListSetInfoW(package->ProductCode, NULL, 
                 MSIINSTALLCONTEXT_USERMANAGED, 
                 MSICODE_PRODUCT|MSISOURCETYPE_MEDIA,
-                INSTALLPROPERTY_LASTUSEDSOURCEW, mi->last_path);
+                INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
         msiobj_release(&row->hdr);
         return rc;
     }
@@ -494,21 +486,16 @@ static UINT ready_media_for_file( MSIPAC
         /* the stream does not contain the # character */
         if (cab[0]=='#')
         {
-            LPWSTR path, p;
+            LPWSTR path;
 
             rc = writeout_cabinet_stream(package,&cab[1],mi->source);
             if (rc != ERROR_SUCCESS)
                 return rc;
 
-            mi->last_path = strdupW(mi->source);
-            p = strrchrW(mi->last_path,'\\');
-            if (p)
-                p[1] = 0;
-
             path = msi_dup_property( package, cszSourceDir );
 
             MsiSourceListAddMediaDiskW(package->ProductCode, NULL, 
-                MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->count,
+                MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id,
                 volume, prompt);
 
             MsiSourceListSetInfoW(package->ProductCode, NULL,
@@ -521,7 +508,6 @@ static UINT ready_media_for_file( MSIPAC
         else
         {
             sz = MAX_PATH;
-            mi->last_path = msi_alloc(MAX_PATH*sizeof(WCHAR));
             if (MSI_GetPropertyW(package, cszSourceDir, mi->source, &sz))
             {
                 ERR("No Source dir defined\n");
@@ -529,7 +515,6 @@ static UINT ready_media_for_file( MSIPAC
             }
             else
             {
-                strcpyW(mi->last_path,mi->source);
                 strcatW(mi->source,cab);
 
                 if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
@@ -541,13 +526,7 @@ static UINT ready_media_for_file( MSIPAC
                 MsiSourceListSetInfoW(package->ProductCode, NULL,
                             MSIINSTALLCONTEXT_USERMANAGED,
                             MSICODE_PRODUCT|MSISOURCETYPE_MEDIA,
-                            INSTALLPROPERTY_LASTUSEDSOURCEW, mi->last_path);
-
-                /* extract the cab file into a folder in the temp folder */
-                sz = MAX_PATH;
-                if (MSI_GetPropertyW(package, cszTempFolder,mi->last_path, &sz) 
-                                    != ERROR_SUCCESS)
-                    GetTempPathW(MAX_PATH,mi->last_path);
+                            INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
             }
         }
 
@@ -565,22 +544,21 @@ static UINT ready_media_for_file( MSIPAC
     else
     {
         sz = MAX_PATH;
-        mi->last_path = msi_alloc(MAX_PATH*sizeof(WCHAR));
         MSI_GetPropertyW(package,cszSourceDir,mi->source,&sz);
-        strcpyW(mi->last_path,mi->source);
 
         MsiSourceListSetInfoW(package->ProductCode, NULL,
                     MSIINSTALLCONTEXT_USERMANAGED,
                     MSICODE_PRODUCT|MSISOURCETYPE_MEDIA,
-                    INSTALLPROPERTY_LASTUSEDSOURCEW, mi->last_path);
+                    INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
     }
-    set_file_source(package, file, mi->last_path);
+    set_file_source(package, file, mi->source);
 
     MsiSourceListAddMediaDiskW(package->ProductCode, NULL,
-            MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->count, volume,
+            MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id, volume,
             prompt);
 
 done:
+    msi_free(source_dir);
     msiobj_release(&row->hdr);
 
     return rc;
-- 
1.4.2.4


More information about the wine-patches mailing list