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