James Hawkins : msi: Search the last used source if the cabinet to extract cannot be found.

Alexandre Julliard julliard at winehq.org
Thu May 22 06:26:47 CDT 2008


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

Author: James Hawkins <jhawkins at codeweavers.com>
Date:   Wed May 21 18:39:45 2008 -0500

msi: Search the last used source if the cabinet to extract cannot be found.

---

 dlls/msi/files.c   |    3 ++-
 dlls/msi/helpers.c |   10 ++++++++++
 dlls/msi/msipriv.h |    1 +
 3 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index d2bef7c..ae7f3f0 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -577,7 +577,7 @@ UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
 }
 
 /* FIXME: search NETWORK and URL sources as well */
-static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
+UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
 {
     WCHAR source[MAX_PATH];
     WCHAR volume[MAX_PATH];
@@ -586,6 +586,7 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
     DWORD index, size, id;
     UINT r;
 
+    size = MAX_PATH;
     r = MsiSourceListGetInfoW(package->ProductCode, NULL,
                               package->Context, MSICODE_PRODUCT,
                               INSTALLPROPERTY_LASTUSEDSOURCEW, source, &size);
diff --git a/dlls/msi/helpers.c b/dlls/msi/helpers.c
index 3ff47ed..cffc09a 100644
--- a/dlls/msi/helpers.c
+++ b/dlls/msi/helpers.c
@@ -1163,6 +1163,16 @@ UINT msi_extract_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR destdir)
     if (r != ERROR_SUCCESS)
         goto done;
 
+    if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
+    {
+        r = find_published_source(package, mi);
+        if (r != ERROR_SUCCESS)
+        {
+            ERR("Cabinet not found: %s\n", debugstr_w(mi->source));
+            return ERROR_INSTALL_FAILURE;
+        }
+    }
+
     data.package = package;
     data.mi = mi;
     data.file = file;
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 90eaa19..19d0b0d 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -908,6 +908,7 @@ extern UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO
 extern void msi_free_media_info(MSIMEDIAINFO *mi);
 extern BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, PFNFDINOTIFY notify, LPVOID data);
 extern UINT msi_extract_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR destdir);
+extern UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi);
 
 /* control event stuff */
 extern VOID ControlEvent_FireSubscribedEvent(MSIPACKAGE *package, LPCWSTR event,




More information about the wine-cvs mailing list