Hans Leidekker : msi: Implement and test MsiSetFeatureAttributes.

Alexandre Julliard julliard at winehq.org
Fri Jun 10 11:16:19 CDT 2011


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Jun 10 10:13:47 2011 +0200

msi: Implement and test MsiSetFeatureAttributes.

---

 dlls/msi/install.c       |   70 ++++++++++++++++++++++++++++++++++++--
 dlls/msi/msi.spec        |    4 +-
 dlls/msi/tests/install.c |   83 ++++++++++++++++++++++++++++++++++++++++++++++
 include/msiquery.h       |    4 ++
 4 files changed, 155 insertions(+), 6 deletions(-)

diff --git a/dlls/msi/install.c b/dlls/msi/install.c
index 6225281..2be4c6c 100644
--- a/dlls/msi/install.c
+++ b/dlls/msi/install.c
@@ -1028,6 +1028,70 @@ UINT WINAPI MsiSetFeatureStateW(MSIHANDLE hInstall, LPCWSTR szFeature,
 }
 
 /***********************************************************************
+* MsiSetFeatureAttributesA   (MSI.@)
+*/
+UINT WINAPI MsiSetFeatureAttributesA( MSIHANDLE handle, LPCSTR feature, DWORD attrs )
+{
+    UINT r;
+    WCHAR *featureW = NULL;
+
+    TRACE("%u, %s, 0x%08x\n", handle, debugstr_a(feature), attrs);
+
+    if (feature && !(featureW = strdupAtoW( feature ))) return ERROR_OUTOFMEMORY;
+
+    r = MsiSetFeatureAttributesW( handle, featureW, attrs );
+    msi_free( featureW );
+    return r;
+}
+
+static DWORD unmap_feature_attributes( DWORD attrs )
+{
+    DWORD ret = 0;
+
+    if (attrs & INSTALLFEATUREATTRIBUTE_FAVORLOCAL)             ret = msidbFeatureAttributesFavorLocal;
+    if (attrs & INSTALLFEATUREATTRIBUTE_FAVORSOURCE)            ret |= msidbFeatureAttributesFavorSource;
+    if (attrs & INSTALLFEATUREATTRIBUTE_FOLLOWPARENT)           ret |= msidbFeatureAttributesFollowParent;
+    if (attrs & INSTALLFEATUREATTRIBUTE_FAVORADVERTISE)         ret |= msidbFeatureAttributesFavorAdvertise;
+    if (attrs & INSTALLFEATUREATTRIBUTE_DISALLOWADVERTISE)      ret |= msidbFeatureAttributesDisallowAdvertise;
+    if (attrs & INSTALLFEATUREATTRIBUTE_NOUNSUPPORTEDADVERTISE) ret |= msidbFeatureAttributesNoUnsupportedAdvertise;
+    return ret;
+}
+
+/***********************************************************************
+* MsiSetFeatureAttributesW   (MSI.@)
+*/
+UINT WINAPI MsiSetFeatureAttributesW( MSIHANDLE handle, LPCWSTR name, DWORD attrs )
+{
+    MSIPACKAGE *package;
+    MSIFEATURE *feature;
+    WCHAR *costing;
+
+    TRACE("%u, %s, 0x%08x\n", handle, debugstr_w(name), attrs);
+
+    if (!name || !name[0]) return ERROR_UNKNOWN_FEATURE;
+
+    if (!(package = msihandle2msiinfo( handle, MSIHANDLETYPE_PACKAGE )))
+        return ERROR_INVALID_HANDLE;
+
+    costing = msi_dup_property( package->db, szCostingComplete );
+    if (!costing || !strcmpW( costing, szOne ))
+    {
+        msi_free( costing );
+        msiobj_release( &package->hdr );
+        return ERROR_FUNCTION_FAILED;
+    }
+    msi_free( costing );
+    if (!(feature = msi_get_loaded_feature( package, name )))
+    {
+        msiobj_release( &package->hdr );
+        return ERROR_UNKNOWN_FEATURE;
+    }
+    feature->Attributes = unmap_feature_attributes( attrs );
+    msiobj_release( &package->hdr );
+    return ERROR_SUCCESS;
+}
+
+/***********************************************************************
 * MsiGetFeatureStateA   (MSI.@)
 */
 UINT WINAPI MsiGetFeatureStateA(MSIHANDLE hInstall, LPCSTR szFeature,
@@ -1036,12 +1100,10 @@ UINT WINAPI MsiGetFeatureStateA(MSIHANDLE hInstall, LPCSTR szFeature,
     LPWSTR szwFeature = NULL;
     UINT rc;
     
-    szwFeature = strdupAtoW(szFeature);
-
-    rc = MsiGetFeatureStateW(hInstall,szwFeature,piInstalled, piAction);
+    if (szFeature && !(szwFeature = strdupAtoW(szFeature))) return ERROR_OUTOFMEMORY;
 
+    rc = MsiGetFeatureStateW(hInstall, szwFeature, piInstalled, piAction);
     msi_free( szwFeature);
-
     return rc;
 }
 
diff --git a/dlls/msi/msi.spec b/dlls/msi/msi.spec
index 1008813..5f4a51f 100644
--- a/dlls/msi/msi.spec
+++ b/dlls/msi/msi.spec
@@ -199,8 +199,8 @@
 203 stdcall MsiProvideQualifiedComponentExW(wstr wstr long wstr long long ptr ptr)
 204 stdcall MsiEnumRelatedProductsA(str long long ptr)
 205 stdcall MsiEnumRelatedProductsW(wstr long long ptr)
-206 stub MsiSetFeatureAttributesA
-207 stub MsiSetFeatureAttributesW
+206 stdcall MsiSetFeatureAttributesA(long str long)
+207 stdcall MsiSetFeatureAttributesW(long wstr long)
 208 stdcall MsiSourceListClearAllA(str str long)
 209 stdcall MsiSourceListClearAllW(wstr wstr long)
 210 stdcall MsiSourceListAddSourceA(str str long str)
diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c
index 267b2bd..f93cc48 100644
--- a/dlls/msi/tests/install.c
+++ b/dlls/msi/tests/install.c
@@ -6469,6 +6469,88 @@ static void test_MsiGetFeatureInfo(void)
     DeleteFileA( msifile );
 }
 
+static void test_MsiSetFeatureAttributes(void)
+{
+    UINT r;
+    DWORD attrs;
+    char path[MAX_PATH];
+    MSIHANDLE package;
+
+    if (is_process_limited())
+    {
+        skip("process is limited\n");
+        return;
+    }
+    create_database( msifile, tables, sizeof(tables) / sizeof(tables[0]) );
+
+    strcpy( path, CURR_DIR );
+    strcat( path, "\\" );
+    strcat( path, msifile );
+
+    r = MsiOpenPackage( path, &package );
+    if (r == ERROR_INSTALL_PACKAGE_REJECTED)
+    {
+        skip("Not enough rights to perform tests\n");
+        DeleteFileA( msifile );
+        return;
+    }
+    ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
+
+    r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
+    ok(r == ERROR_FUNCTION_FAILED, "Expected ERROR_FUNCTION_FAILED, got %u\n", r);
+
+    r = MsiDoAction( package, "CostInitialize" );
+    ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
+
+    r = MsiSetFeatureAttributesA( 0, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
+    ok(r == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %u\n", r);
+
+    r = MsiSetFeatureAttributesA( package, "", INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
+    ok(r == ERROR_UNKNOWN_FEATURE, "expected ERROR_UNKNOWN_FEATURE, got %u\n", r);
+
+    r = MsiSetFeatureAttributesA( package, NULL, INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
+    ok(r == ERROR_UNKNOWN_FEATURE, "expected ERROR_UNKNOWN_FEATURE, got %u\n", r);
+
+    r = MsiSetFeatureAttributesA( package, "One", 0 );
+    ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
+
+    attrs = 0xdeadbeef;
+    r = MsiGetFeatureInfoA( package, "One", &attrs, NULL, NULL, NULL, NULL );
+    ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
+    ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORLOCAL,
+       "expected INSTALLFEATUREATTRIBUTE_FAVORLOCAL, got 0x%08x\n", attrs);
+
+    r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
+    ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
+
+    attrs = 0;
+    r = MsiGetFeatureInfoA( package, "One", &attrs, NULL, NULL, NULL, NULL );
+    ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
+    ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORLOCAL,
+       "expected INSTALLFEATUREATTRIBUTE_FAVORLOCAL, got 0x%08x\n", attrs);
+
+    r = MsiDoAction( package, "FileCost" );
+    ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
+
+    r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORSOURCE );
+    ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
+
+    attrs = 0;
+    r = MsiGetFeatureInfoA( package, "One", &attrs, NULL, NULL, NULL, NULL );
+    ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
+    ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORSOURCE,
+       "expected INSTALLFEATUREATTRIBUTE_FAVORSOURCE, got 0x%08x\n", attrs);
+
+    r = MsiDoAction( package, "CostFinalize" );
+    ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r);
+
+    r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL );
+    ok(r == ERROR_FUNCTION_FAILED, "expected ERROR_FUNCTION_FAILED, got %u\n", r);
+
+    MsiCloseHandle( package );
+    DeleteFileA( msifile );
+}
+
 START_TEST(install)
 {
     DWORD len;
@@ -6559,6 +6641,7 @@ START_TEST(install)
     test_command_line_parsing();
     test_upgrade_code();
     test_MsiGetFeatureInfo();
+    test_MsiSetFeatureAttributes();
 
     DeleteFileA(log_file);
 
diff --git a/include/msiquery.h b/include/msiquery.h
index 2ea8320..fbd4651 100644
--- a/include/msiquery.h
+++ b/include/msiquery.h
@@ -248,6 +248,10 @@ MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE);
 UINT WINAPI MsiViewGetColumnInfo(MSIHANDLE, MSICOLINFO, MSIHANDLE*);
 INT WINAPI MsiProcessMessage(MSIHANDLE, INSTALLMESSAGE, MSIHANDLE);
 
+UINT WINAPI MsiSetFeatureAttributesA(MSIHANDLE, LPCSTR, DWORD);
+UINT WINAPI MsiSetFeatureAttributesW(MSIHANDLE, LPCWSTR, DWORD);
+#define     MsiSetFeatureAttributes WINELIB_NAME_AW(MsiSetFeatureAttributes)
+
 UINT WINAPI MsiSetFeatureStateA(MSIHANDLE, LPCSTR, INSTALLSTATE);
 UINT WINAPI MsiSetFeatureStateW(MSIHANDLE, LPCWSTR, INSTALLSTATE);
 #define     MsiSetFeatureState WINELIB_NAME_AW(MsiSetFeatureState)




More information about the wine-cvs mailing list