James Hawkins : msi: Factor out load_media_info from ready_media_for_file.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 9 06:08:30 CST 2006


Module: wine
Branch: master
Commit: 6ef6512938d1162114735a482572755f9dd4d099
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6ef6512938d1162114735a482572755f9dd4d099

Author: James Hawkins <truiken at gmail.com>
Date:   Wed Nov  8 14:03:36 2006 -0800

msi: Factor out load_media_info from ready_media_for_file.

---

 dlls/msi/files.c |  171 ++++++++++++++++++++++++------------------------------
 1 files changed, 75 insertions(+), 96 deletions(-)

diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 553b9da..dd5fa63 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -405,111 +405,97 @@ static UINT download_remote_cabinet(MSIP
     return ERROR_SUCCESS;
 }
 
-static UINT ready_media_for_file( MSIPACKAGE *package, struct media_info *mi,
-                                  MSIFILE *file )
+static UINT load_media_info(MSIPACKAGE *package, MSIFILE *file, struct media_info *mi)
 {
-    UINT rc = ERROR_SUCCESS;
-    MSIRECORD * row = 0;
-    static const WCHAR ExecSeqQuery[] =
-        {'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
-         '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ',
-         '`','L','a','s','t','S','e','q','u','e','n','c','e','`',' ','>','=',
-         ' ','%', 'i',' ','O','R','D','E','R',' ','B','Y',' ',
-         '`','D','i','s','k','I','d','`',0};
-    LPCWSTR cab, volume;
+    MSIRECORD *row;
     LPWSTR source_dir;
-    DWORD sz;
-    INT seq;
+    UINT r;
 
-    if (file->Sequence <= mi->last_sequence)
-    {
-        set_file_source(package, file, mi->source);
-        TRACE("Media already ready (%u, %u)\n",file->Sequence,mi->last_sequence);
-        return ERROR_SUCCESS;
-    }
+    static const WCHAR query[] = {
+        'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
+        '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ',
+        '`','L','a','s','t','S','e','q','u','e','n','c','e','`',' ','>','=',
+        ' ','%','i',' ','A','N','D',' ','`','D','i','s','k','I','d','`',' ','>','=',
+        ' ','%','i',' ','O','R','D','E','R',' ','B','Y',' ',
+        '`','D','i','s','k','I','d','`',0
+    };
 
-    row = MSI_QueryGetRecord(package->db, ExecSeqQuery, file->Sequence);
+    row = MSI_QueryGetRecord(package->db, query, file->Sequence, mi->disk_id);
     if (!row)
     {
         TRACE("Unable to query row\n");
         return ERROR_FUNCTION_FAILED;
     }
 
-    volume = MSI_RecordGetString(row, 5);
+    mi->disk_id = MSI_RecordGetInteger(row, 1);
+    mi->last_sequence = MSI_RecordGetInteger(row, 2);
     mi->disk_prompt = strdupW(MSI_RecordGetString(row, 3));
+    mi->cabinet = strdupW(MSI_RecordGetString(row, 4));
+    mi->volume_label = strdupW(MSI_RecordGetString(row, 5));
+    msiobj_release(&row->hdr);
 
     source_dir = msi_dup_property(package, cszSourceDir);
 
-    if (!file->IsCompressed)
+    if (mi->cabinet && mi->cabinet[0] == '#')
+    {
+        r = writeout_cabinet_stream(package, &mi->cabinet[1], mi->source);
+        if (r != ERROR_SUCCESS)
+        {
+            ERR("Failed to extract cabinet stream\n");
+            return ERROR_FUNCTION_FAILED;
+        }
+    }
+    else
     {
         lstrcpyW(mi->source, source_dir);
-        set_file_source(package, file, mi->source);
 
-        MsiSourceListAddMediaDiskW(package->ProductCode, NULL, 
-            MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id, volume,
-            mi->disk_prompt);
 
-        MsiSourceListSetInfoW(package->ProductCode, NULL, 
-                MSIINSTALLCONTEXT_USERMANAGED, 
-                MSICODE_PRODUCT|MSISOURCETYPE_MEDIA,
-                INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
-        msiobj_release(&row->hdr);
-        return rc;
+        if (mi->cabinet)
+            lstrcatW(mi->source, mi->cabinet);
     }
 
-    seq = MSI_RecordGetInteger(row,2);
-    mi->last_sequence = seq;
-
-    cab = MSI_RecordGetString(row,4);
-    if (cab)
-    {
-        TRACE("Source is CAB %s\n",debugstr_w(cab));
-        /* the stream does not contain the # character */
-        if (cab[0]=='#')
-        {
-            LPWSTR path;
-
-            rc = writeout_cabinet_stream(package,&cab[1],mi->source);
-            if (rc != ERROR_SUCCESS)
-                return rc;
+    MsiSourceListAddMediaDiskW(package->ProductCode, NULL,
+        MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT,
+        mi->disk_id, mi->volume_label, mi->disk_prompt);
 
-            path = msi_dup_property( package, cszSourceDir );
+    MsiSourceListSetInfoW(package->ProductCode, NULL,
+        MSIINSTALLCONTEXT_USERMANAGED,
+        MSICODE_PRODUCT | MSISOURCETYPE_MEDIA,
+        INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
 
-            MsiSourceListAddMediaDiskW(package->ProductCode, NULL, 
-                MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id,
-                volume, mi->disk_prompt);
+    msi_free(source_dir);
+    return ERROR_SUCCESS;
+}
 
-            MsiSourceListSetInfoW(package->ProductCode, NULL,
-                MSIINSTALLCONTEXT_USERMANAGED,
-                MSICODE_PRODUCT|MSISOURCETYPE_NETWORK,
-                INSTALLPROPERTY_LASTUSEDSOURCEW, path);
+static UINT ready_media_for_file( MSIPACKAGE *package, struct media_info *mi,
+                                  MSIFILE *file )
+{
+    UINT rc = ERROR_SUCCESS;
+    BOOL found = FALSE;
 
-            msi_free(path);
-        }
-        else
-        {
-            sz = MAX_PATH;
-            if (MSI_GetPropertyW(package, cszSourceDir, mi->source, &sz))
-            {
-                ERR("No Source dir defined\n");
-                rc = ERROR_FUNCTION_FAILED;
-            }
-            else
-            {
-                strcatW(mi->source,cab);
+    if (file->Sequence <= mi->last_sequence)
+    {
+        set_file_source(package, file, mi->source);
+        TRACE("Media already ready (%u, %u)\n",file->Sequence,mi->last_sequence);
+        return ERROR_SUCCESS;
+    }
 
-                if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
-                    rc = msi_change_media(package, mi);
+    rc = load_media_info(package, file, mi);
+    if (rc != ERROR_SUCCESS)
+    {
+        ERR("Unable to load media info\n");
+        return ERROR_FUNCTION_FAILED;
+    }
 
-                if ( rc != ERROR_SUCCESS )
-                    goto done;
+    if (!file->IsCompressed)
+    {
+        set_file_source(package, file, mi->source);
+        return rc;
+    }
 
-                MsiSourceListSetInfoW(package->ProductCode, NULL,
-                            MSIINSTALLCONTEXT_USERMANAGED,
-                            MSICODE_PRODUCT|MSISOURCETYPE_MEDIA,
-                            INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
-            }
-        }
+    if (mi->cabinet)
+    {
+        TRACE("Source is CAB %s\n", debugstr_w(mi->cabinet));
 
         /* only download the remote cabinet file if a local copy does not exist */
         if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES &&
@@ -519,32 +505,25 @@ static UINT ready_media_for_file( MSIPAC
             if (rc != ERROR_SUCCESS ||
                 GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
             {
-                goto done;
+                found = FALSE;
+            }
+        }
+
+        if (!found)
+        {
+            rc = msi_change_media(package, mi);
+            if (rc != ERROR_SUCCESS)
+            {
+                ERR("Cabinet not found: %s\n", debugstr_w(mi->cabinet));
+                return ERROR_FUNCTION_FAILED;
             }
         }
 
         rc = !extract_cabinet_file(package, mi);
     }
-    else
-    {
-        sz = MAX_PATH;
-        MSI_GetPropertyW(package,cszSourceDir,mi->source,&sz);
 
-        MsiSourceListSetInfoW(package->ProductCode, NULL,
-                    MSIINSTALLCONTEXT_USERMANAGED,
-                    MSICODE_PRODUCT|MSISOURCETYPE_MEDIA,
-                    INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
-    }
     set_file_source(package, file, mi->source);
 
-    MsiSourceListAddMediaDiskW(package->ProductCode, NULL,
-            MSIINSTALLCONTEXT_USERMANAGED, MSICODE_PRODUCT, mi->disk_id, volume,
-            mi->disk_prompt);
-
-done:
-    msi_free(source_dir);
-    msiobj_release(&row->hdr);
-
     return rc;
 }
 




More information about the wine-cvs mailing list