James Hawkins : msi: Download the MSI package if it is a remote URL.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jul 27 05:42:33 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: d1617bea17b8614303ef5b19851e18f25b66a250
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=d1617bea17b8614303ef5b19851e18f25b66a250

Author: James Hawkins <truiken at gmail.com>
Date:   Wed Jul 26 14:54:15 2006 -0700

msi: Download the MSI package if it is a remote URL.

---

 dlls/msi/Makefile.in |    2 +-
 dlls/msi/package.c   |   41 ++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/dlls/msi/Makefile.in b/dlls/msi/Makefile.in
index 4bd23e8..fe12586 100644
--- a/dlls/msi/Makefile.in
+++ b/dlls/msi/Makefile.in
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = msi.dll
 IMPORTLIB = libmsi.$(IMPLIBEXT)
-IMPORTS   = comctl32 shell32 shlwapi cabinet oleaut32 ole32 version user32 gdi32 advapi32 kernel32
+IMPORTS   = urlmon wininet comctl32 shell32 shlwapi cabinet oleaut32 ole32 version user32 gdi32 advapi32 kernel32
 EXTRALIBS = -luuid
 
 C_SRCS = \
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index f3278c1..53433d0 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -35,6 +35,8 @@ #include "msiquery.h"
 #include "objidl.h"
 #include "wincrypt.h"
 #include "winuser.h"
+#include "wininet.h"
+#include "urlmon.h"
 #include "shlobj.h"
 #include "wine/unicode.h"
 #include "objbase.h"
@@ -452,6 +454,38 @@ static LPCWSTR copy_package_to_temp( LPC
     return filename;
 }
 
+static LPCWSTR msi_download_package( LPCWSTR szUrl, LPWSTR filename )
+{
+    LPINTERNET_CACHE_ENTRY_INFOW cache_entry;
+    DWORD size = 0;
+    HRESULT hr;
+
+    /* call will always fail, becase size is 0,
+     * but will return ERROR_FILE_NOT_FOUND first
+     * if the file doesn't exist
+     */
+    GetUrlCacheEntryInfoW( szUrl, NULL, &size );
+    if ( GetLastError() != ERROR_FILE_NOT_FOUND )
+    {
+        cache_entry = HeapAlloc( GetProcessHeap(), 0, size );
+        if ( !GetUrlCacheEntryInfoW( szUrl, cache_entry, &size ) )
+        {
+            HeapFree( GetProcessHeap(), 0, cache_entry );
+            return szUrl;
+        }
+
+        lstrcpyW( filename, cache_entry->lpszLocalFileName );
+        HeapFree( GetProcessHeap(), 0, cache_entry );
+        return filename;
+    }
+
+    hr = URLDownloadToCacheFileW( NULL, szUrl, filename, MAX_PATH, 0, NULL );
+    if ( FAILED(hr) )
+        return szUrl;
+
+    return filename;
+}
+
 UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
 {
     MSIDATABASE *db = NULL;
@@ -471,7 +505,12 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage,
     else
     {
         WCHAR temppath[MAX_PATH];
-        LPCWSTR file = copy_package_to_temp( szPackage, temppath );
+        LPCWSTR file;
+
+        if ( UrlIsW( szPackage, URLIS_URL ) )
+            file = msi_download_package( szPackage, temppath );
+        else
+            file = copy_package_to_temp( szPackage, temppath );
 
         r = MSI_OpenDatabaseW( file, MSIDBOPEN_READONLY, &db );
 




More information about the wine-cvs mailing list