James Hawkins : msi: Store the media type and set the last used source type accordingly.

Alexandre Julliard julliard at winehq.org
Tue Feb 26 05:45:15 CST 2008


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

Author: James Hawkins <jhawkins at codeweavers.com>
Date:   Tue Feb 26 01:54:14 2008 -0600

msi: Store the media type and set the last used source type accordingly.

---

 dlls/msi/action.c |   10 ----------
 dlls/msi/files.c  |   37 +++++++++++++++++++++++++++++--------
 2 files changed, 29 insertions(+), 18 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 54a9fbe..dee64d1 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -3468,16 +3468,6 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package)
     if (rc != ERROR_SUCCESS)
         goto end;
 
-    buffer = msi_dup_property( package, cszSourceDir );
-
-    rc = MsiSourceListSetInfoW( package->ProductCode, NULL,
-                                MSIINSTALLCONTEXT_USERUNMANAGED,
-                                MSICODE_PRODUCT | MSISOURCETYPE_NETWORK,
-                                INSTALLPROPERTY_LASTUSEDSOURCEW, buffer );
-    msi_free(buffer);
-    if (rc != ERROR_SUCCESS)
-        goto end;
-
     /* FIXME: Need to write more keys to the user registry */
   
     hDb= alloc_msihandle( &package->db->hdr );
diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 8ed2395..2b8ae6f 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -59,6 +59,7 @@ static const WCHAR cszTempFolder[]= {'T','e','m','p','F','o','l','d','e','r',0};
 
 struct media_info {
     UINT disk_id;
+    UINT type;
     UINT last_sequence;
     LPWSTR disk_prompt;
     LPWSTR cabinet;
@@ -504,6 +505,8 @@ static UINT load_media_info(MSIPACKAGE *package, MSIFILE *file, struct media_inf
 {
     MSIRECORD *row;
     LPWSTR source_dir;
+    LPWSTR source;
+    DWORD options;
     UINT r;
 
     static const WCHAR query[] = {
@@ -539,6 +542,9 @@ static UINT load_media_info(MSIPACKAGE *package, MSIFILE *file, struct media_inf
     source_dir = msi_dup_property(package, cszSourceDir);
     lstrcpyW(mi->source, source_dir);
 
+    PathStripToRootW(source_dir);
+    mi->type = GetDriveTypeW(source_dir);
+
     if (file->IsCompressed && mi->cabinet)
     {
         if (mi->cabinet[0] == '#')
@@ -554,12 +560,30 @@ static UINT load_media_info(MSIPACKAGE *package, MSIFILE *file, struct media_inf
             lstrcatW(mi->source, mi->cabinet);
     }
 
-    msi_package_add_media_disk(package, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
-                               mi->disk_id, mi->volume_label, mi->disk_prompt);
+    options = MSICODE_PRODUCT;
+    if (mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE)
+    {
+        source = source_dir;
+        options |= MSISOURCETYPE_MEDIA;
+    }
+    else if (package->BaseURL && UrlIsW(package->BaseURL, URLIS_URL))
+    {
+        source = package->BaseURL;
+        options |= MSISOURCETYPE_URL;
+    }
+    else
+    {
+        source = mi->source;
+        options |= MSISOURCETYPE_NETWORK;
+    }
+
+    if (mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE)
+        msi_package_add_media_disk(package, MSIINSTALLCONTEXT_USERUNMANAGED,
+                                   MSICODE_PRODUCT, mi->disk_id,
+                                   mi->volume_label, mi->disk_prompt);
 
     msi_package_add_info(package, MSIINSTALLCONTEXT_USERUNMANAGED,
-                         MSICODE_PRODUCT | MSISOURCETYPE_MEDIA,
-                         INSTALLPROPERTY_LASTUSEDSOURCEW, mi->source);
+                         options, INSTALLPROPERTY_LASTUSEDSOURCEW, source);
 
     msi_free(source_dir);
     return ERROR_SUCCESS;
@@ -602,14 +626,11 @@ static UINT ready_media(MSIPACKAGE *package, MSIFILE *file, struct media_info *m
     {
         LPWSTR source = msi_dup_property(package, cszSourceDir);
         BOOL matches;
-        UINT type;
 
-        PathStripToRootW(source);
-        type = GetDriveTypeW(source);
         matches = source_matches_volume(mi, source);
         msi_free(source);
 
-        if ((type == DRIVE_CDROM || type == DRIVE_REMOVABLE) && !matches)
+        if ((mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE) && !matches)
         {
             rc = msi_change_media(package, mi);
             if (rc != ERROR_SUCCESS)




More information about the wine-cvs mailing list