wine/dlls/msi package.c

Alexandre Julliard julliard at wine.codeweavers.com
Tue Nov 15 06:00:14 CST 2005


ChangeSet ID:	21267
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/11/15 06:00:14

Modified files:
	dlls/msi       : package.c 

Log message:
	Mike McCormack <mike at codeweavers.com>
	Set the Installed property if the product is already installed.

Patch: http://cvs.winehq.org/patch.py?id=21267

Old revision  New revision  Changes     Path
 1.66          1.67          +40 -33     wine/dlls/msi/package.c

Index: wine/dlls/msi/package.c
diff -u -p wine/dlls/msi/package.c:1.66 wine/dlls/msi/package.c:1.67
--- wine/dlls/msi/package.c:1.66	15 Nov 2005 12: 0:14 -0000
+++ wine/dlls/msi/package.c	15 Nov 2005 12: 0:14 -0000
@@ -31,7 +31,6 @@
 #include "wine/debug.h"
 #include "msi.h"
 #include "msiquery.h"
-#include "msipriv.h"
 #include "objidl.h"
 #include "wincrypt.h"
 #include "winuser.h"
@@ -39,6 +38,9 @@
 #include "wine/unicode.h"
 #include "objbase.h"
 
+#include "msipriv.h"
+#include "action.h"
+
 WINE_DEFAULT_DEBUG_CHANNEL(msi);
 
 static void MSI_FreePackage( MSIOBJECTHDR *arg)
@@ -121,6 +123,30 @@ static UINT clone_properties(MSIDATABASE
 }
 
 /*
+ * set_installed_prop
+ *
+ * Sets the "Installed" property to indicate that
+ *  the product is installed for the current user.
+ */
+static UINT set_installed_prop( MSIPACKAGE *package )
+{
+    static const WCHAR szInstalled[] = {
+        'I','n','s','t','a','l','l','e','d',0 };
+    WCHAR val[2] = { '1', 0 };
+    HKEY hkey = 0;
+    UINT r;
+
+    r = MSIREG_OpenUninstallKey( package->ProductCode, &hkey, FALSE );
+    if (r == ERROR_SUCCESS)
+    {
+        RegCloseKey( hkey );
+        MSI_SetPropertyW( package, szInstalled, val );
+    }
+
+    return r;
+}
+
+/*
  * There are a whole slew of these we need to set
  *
  *
@@ -203,29 +229,14 @@ static VOID set_installer_properties(MSI
     static const WCHAR szColorBits[] = {'C','o','l','o','r','B','i','t','s',0};
     static const WCHAR szScreenFormat[] = {'%','d',0};
 
-/*
- * Other things I notice set
- *
-SystemLanguageID
-ComputerName
-UserLanguageID
-LogonUser
-VirtualMemory
-Intel
-ShellAdvSupport
-DefaultUIFont
-VersionDatabase
-PackagecodeChanging
-ProductState
-CaptionHeight
-BorderTop
-BorderSide
-TextHeight
-RedirectedDllSupport
-Time
-Date
-Privileged
-*/
+    /*
+     * Other things that probably should be set:
+     *
+     * SystemLanguageID ComputerName UserLanguageID LogonUser VirtualMemory
+     * Intel ShellAdvSupport DefaultUIFont VersionDatabase PackagecodeChanging
+     * ProductState CaptionHeight BorderTop BorderSide TextHeight
+     * RedirectedDllSupport Time Date Privileged
+     */
 
     SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES_COMMON,NULL,0,pth);
     strcatW(pth,cszbs);
@@ -357,6 +368,8 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABA
 {
     static const WCHAR szLevel[] = { 'U','I','L','e','v','e','l',0 };
     static const WCHAR szpi[] = {'%','i',0};
+    static const WCHAR szProductCode[] = {
+        'P','r','o','d','u','c','t','C','o','d','e',0};
     MSIPACKAGE *package = NULL;
     WCHAR uilevel[10];
 
@@ -393,6 +406,9 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABA
         set_installer_properties(package);
         sprintfW(uilevel,szpi,gUILevel);
         MSI_SetPropertyW(package, szLevel, uilevel);
+
+        package->ProductCode = msi_dup_property( package, szProductCode );
+        set_installed_prop( package );
     }
 
     return package;
@@ -431,8 +447,6 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage,
     MSIDATABASE *db = NULL;
     MSIPACKAGE *package;
     MSIHANDLE handle;
-    DWORD size;
-    static const WCHAR szProductCode[]= {'P','r','o','d','u','c','t','C','o','d','e',0};
     UINT r;
 
     TRACE("%s %p\n", debugstr_w(szPackage), pPackage);
@@ -478,13 +492,6 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage,
         MSI_SetPropertyW( package, Database, szPackage );
     }
 
-    /* this property must exist */
-    size  = 0;
-    MSI_GetPropertyW(package,szProductCode,NULL,&size);
-    size ++;
-    package->ProductCode = msi_alloc(size * sizeof(WCHAR));
-    MSI_GetPropertyW(package,szProductCode,package->ProductCode, &size);
-    
     *pPackage = package;
 
     return ERROR_SUCCESS;



More information about the wine-cvs mailing list