Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/msi/install.c | 25 +++++++------------------ dlls/msi/package.c | 5 ++--- dlls/msi/tests/custom.c | 31 +++++++++++++++++++++++++++++++ dlls/msi/winemsi.idl | 2 +- 4 files changed, 41 insertions(+), 22 deletions(-)
diff --git a/dlls/msi/install.c b/dlls/msi/install.c index 1ff3ad9..b19b647 100644 --- a/dlls/msi/install.c +++ b/dlls/msi/install.c @@ -1359,33 +1359,22 @@ UINT WINAPI MsiGetComponentStateW(MSIHANDLE hInstall, LPCWSTR szComponent, TRACE("%d %s %p %p\n", hInstall, debugstr_w(szComponent), piInstalled, piAction);
+ if (!szComponent) + return ERROR_UNKNOWN_COMPONENT; + package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { MSIHANDLE remote; - HRESULT hr; - BSTR component;
if (!(remote = msi_get_remote(hInstall))) return ERROR_INVALID_HANDLE;
- component = SysAllocString(szComponent); - if (!component) - return ERROR_OUTOFMEMORY; + /* FIXME: should use SEH */ + if (!piInstalled || !piAction) + return RPC_X_NULL_REF_POINTER;
- hr = remote_GetComponentState(remote, component, piInstalled, piAction); - - SysFreeString(component); - - if (FAILED(hr)) - { - if (HRESULT_FACILITY(hr) == FACILITY_WIN32) - return HRESULT_CODE(hr); - - return ERROR_FUNCTION_FAILED; - } - - return ERROR_SUCCESS; + return remote_GetComponentState(remote, szComponent, piInstalled, piAction); }
ret = MSI_GetComponentStateW( package, szComponent, piInstalled, piAction); diff --git a/dlls/msi/package.c b/dlls/msi/package.c index f8b150b..18b8601 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -2534,11 +2534,10 @@ UINT __cdecl remote_SetFeatureState(MSIHANDLE hinst, LPCWSTR feature, INSTALLSTA return MsiSetFeatureStateW(hinst, feature, state); }
-HRESULT __cdecl remote_GetComponentState(MSIHANDLE hinst, BSTR component, +UINT __cdecl remote_GetComponentState(MSIHANDLE hinst, LPCWSTR component, INSTALLSTATE *installed, INSTALLSTATE *action) { - UINT r = MsiGetComponentStateW(hinst, component, installed, action); - return HRESULT_FROM_WIN32(r); + return MsiGetComponentStateW(hinst, component, installed, action); }
HRESULT __cdecl remote_SetComponentState(MSIHANDLE hinst, BSTR component, INSTALLSTATE state) diff --git a/dlls/msi/tests/custom.c b/dlls/msi/tests/custom.c index b30953a..b2c9352 100644 --- a/dlls/msi/tests/custom.c +++ b/dlls/msi/tests/custom.c @@ -655,6 +655,8 @@ static void test_feature_states(MSIHANDLE hinst) INSTALLSTATE state, action; UINT r;
+ /* test feature states */ + r = MsiGetFeatureStateA(hinst, NULL, &state, &action); ok(hinst, r == ERROR_UNKNOWN_FEATURE, "got %u\n", r);
@@ -688,6 +690,35 @@ static void test_feature_states(MSIHANDLE hinst) r = MsiGetFeatureStateA(hinst, "One", &state, &action); ok(hinst, !r, "got %u\n", r); ok(hinst, action == INSTALLSTATE_LOCAL, "got action %d\n", action); + + /* test component states */ + + r = MsiGetComponentStateA(hinst, NULL, &state, &action); + ok(hinst, r == ERROR_UNKNOWN_COMPONENT, "got %u\n", r); + + r = MsiGetComponentStateA(hinst, "fake", &state, &action); + ok(hinst, r == ERROR_UNKNOWN_COMPONENT, "got %u\n", r); + + r = MsiGetComponentStateA(hinst, "One", NULL, &action); + ok(hinst, r == RPC_X_NULL_REF_POINTER, "got %u\n", r); + + r = MsiGetComponentStateA(hinst, "One", &state, NULL); + ok(hinst, r == RPC_X_NULL_REF_POINTER, "got %u\n", r); + + r = MsiGetComponentStateA(hinst, "One", &state, &action); + ok(hinst, !r, "got %u\n", r); + ok(hinst, state == INSTALLSTATE_ABSENT, "got state %d\n", state); + ok(hinst, action == INSTALLSTATE_LOCAL, "got action %d\n", action); + + r = MsiGetComponentStateA(hinst, "dangler", &state, &action); + ok(hinst, !r, "got %u\n", r); + ok(hinst, state == INSTALLSTATE_ABSENT, "got state %d\n", state); + ok(hinst, action == INSTALLSTATE_UNKNOWN, "got action %d\n", action); + + r = MsiGetComponentStateA(hinst, "component", &state, &action); + ok(hinst, !r, "got %u\n", r); + ok(hinst, state == INSTALLSTATE_UNKNOWN, "got state %d\n", state); + ok(hinst, action == INSTALLSTATE_LOCAL, "got action %d\n", action); }
/* Main test. Anything that doesn't depend on a specific install configuration diff --git a/dlls/msi/winemsi.idl b/dlls/msi/winemsi.idl index 8bdc10d..5996487 100644 --- a/dlls/msi/winemsi.idl +++ b/dlls/msi/winemsi.idl @@ -83,7 +83,7 @@ interface IWineMsiRemote UINT remote_SetMode( [in] MSIHANDLE hinst, [in] MSIRUNMODE mode, [in] BOOL state ); UINT remote_GetFeatureState( [in] MSIHANDLE hinst, [in, string] LPCWSTR feature, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action ); UINT remote_SetFeatureState( [in] MSIHANDLE hinst, [in, string] LPCWSTR feature, [in] INSTALLSTATE state ); - HRESULT remote_GetComponentState( [in] MSIHANDLE hinst, [in] BSTR component, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action ); + UINT remote_GetComponentState( [in] MSIHANDLE hinst, [in, string] LPCWSTR component, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action ); HRESULT remote_SetComponentState( [in] MSIHANDLE hinst, [in] BSTR component, [in] INSTALLSTATE state ); HRESULT remote_GetLanguage( [in] MSIHANDLE hinst, [out] LANGID *language ); HRESULT remote_SetInstallLevel( [in] MSIHANDLE hinst, [in] int level );