James Hawkins : msi: Allow setting a media disk as the last used source in the internal msi_set_last_used_source .

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


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

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

msi: Allow setting a media disk as the last used source in the internal msi_set_last_used_source.

---

 dlls/msi/action.c  |   10 +++++++---
 dlls/msi/msipriv.h |    2 ++
 dlls/msi/source.c  |   51 +++++++++++++++++++++++++++++++++------------------
 3 files changed, 42 insertions(+), 21 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index dee64d1..d5fad0c 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -3508,9 +3508,13 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package)
     /* publish the SourceList info */
     LIST_FOR_EACH_ENTRY(info, &package->sourcelist_info, MSISOURCELISTINFO, entry)
     {
-        MsiSourceListSetInfoW(package->ProductCode, NULL,
-                              info->context, info->options,
-                              info->property, info->value);
+        if (!lstrcmpW(info->property, INSTALLPROPERTY_LASTUSEDSOURCEW))
+            msi_set_last_used_source(package->ProductCode, NULL, info->context,
+                                     info->options, info->value);
+        else
+            MsiSourceListSetInfoW(package->ProductCode, NULL,
+                                  info->context, info->options,
+                                  info->property, info->value);
     }
 
     LIST_FOR_EACH_ENTRY(disk, &package->sourcelist_media, MSIMEDIADISK, entry)
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index e23261b..975ebb6 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -885,6 +885,8 @@ extern BOOL check_unique_action(const MSIPACKAGE *, LPCWSTR);
 extern WCHAR* generate_error_string(MSIPACKAGE *, UINT, DWORD, ... );
 extern UINT msi_create_component_directories( MSIPACKAGE *package );
 extern void msi_ui_error( DWORD msg_id, DWORD type );
+extern UINT msi_set_last_used_source(LPCWSTR product, LPCWSTR usersid,
+                        MSIINSTALLCONTEXT context, DWORD options, LPCWSTR value);
 
 /* control event stuff */
 extern VOID ControlEvent_FireSubscribedEvent(MSIPACKAGE *package, LPCWSTR event,
diff --git a/dlls/msi/source.c b/dlls/msi/source.c
index b508569..37a0b8b 100644
--- a/dlls/msi/source.c
+++ b/dlls/msi/source.c
@@ -701,15 +701,16 @@ UINT WINAPI MsiSourceListSetInfoA(LPCSTR szProduct, LPCSTR szUserSid,
     return ret;
 }
 
-static UINT set_last_used_source(HKEY source, LPCWSTR product, LPCWSTR usersid,
-                                 MSIINSTALLCONTEXT context, DWORD options,
-                                 LPCWSTR value)
+UINT msi_set_last_used_source(LPCWSTR product, LPCWSTR usersid,
+                              MSIINSTALLCONTEXT context, DWORD options,
+                              LPCWSTR value)
 {
+    HKEY source;
     LPWSTR buffer;
     WCHAR typechar;
     DWORD size;
     UINT r;
-    int index = 0;
+    int index = 1;
 
     static const WCHAR format[] = {'%','c',';','%','i',';','%','s',0};
 
@@ -717,27 +718,36 @@ static UINT set_last_used_source(HKEY source, LPCWSTR product, LPCWSTR usersid,
         typechar = 'n';
     else if (options & MSISOURCETYPE_URL)
         typechar = 'u';
+    else if (options & MSISOURCETYPE_MEDIA)
+        typechar = 'm';
     else
         return ERROR_INVALID_PARAMETER;
 
-    /* make sure the source is registered */
-    r = MsiSourceListAddSourceExW(product, usersid, context,
-                                  options, value, 0);
-    if (r != ERROR_SUCCESS)
-        return r;
+    if (!(options & MSISOURCETYPE_MEDIA))
+    {
+        r = MsiSourceListAddSourceExW(product, usersid, context,
+                                      options, value, 0);
+        if (r != ERROR_SUCCESS)
+            return r;
 
-    while ((r = MsiSourceListEnumSourcesW(product, usersid, context, options,
-                                          index, NULL, NULL)) == ERROR_SUCCESS)
-        index++;
+        index = 0;
+        while ((r = MsiSourceListEnumSourcesW(product, usersid, context, options,
+                                              index, NULL, NULL)) == ERROR_SUCCESS)
+            index++;
 
-    if (r != ERROR_NO_MORE_ITEMS)
-        return r;
+        if (r != ERROR_NO_MORE_ITEMS)
+            return r;
+    }
 
     size = (lstrlenW(format) + lstrlenW(value) + 7) * sizeof(WCHAR);
     buffer = msi_alloc(size);
     if (!buffer)
         return ERROR_OUTOFMEMORY;
 
+    r = OpenSourceKey(product, &source, MSICODE_PRODUCT, context, FALSE);
+    if (r != ERROR_SUCCESS)
+        return r;
+
     sprintfW(buffer, format, typechar, index, value);
 
     size = (lstrlenW(buffer) + 1) * sizeof(WCHAR);
@@ -745,6 +755,7 @@ static UINT set_last_used_source(HKEY source, LPCWSTR product, LPCWSTR usersid,
                        REG_SZ, (LPBYTE)buffer, size);
     msi_free(buffer);
 
+    RegCloseKey(source);
     return r;
 }
 
@@ -818,15 +829,19 @@ UINT WINAPI MsiSourceListSetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
         if (rc != ERROR_SUCCESS)
             rc = ERROR_UNKNOWN_PROPERTY;
     }
-    else if (strcmpW(szProperty, INSTALLPROPERTY_LASTUSEDSOURCEW)==0)
-        rc = set_last_used_source(sourcekey, szProduct, szUserSid, dwContext,
-                                  dwOptions, szValue);
+    else if (!lstrcmpW(szProperty, INSTALLPROPERTY_LASTUSEDSOURCEW))
+    {
+        if (!(dwOptions & (MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL)))
+            rc = ERROR_INVALID_PARAMETER;
+        else
+            rc = msi_set_last_used_source(szProduct, szUserSid, dwContext,
+                                          dwOptions, szValue);
+    }
     else
         rc = ERROR_UNKNOWN_PROPERTY;
 
     RegCloseKey(sourcekey);
     return rc;
-
 }
 
 /******************************************************************




More information about the wine-cvs mailing list