diff --git a/dlls/appxdeploymentclient/package.c b/dlls/appxdeploymentclient/package.c index 84a5189bb92..37af0fdaff4 100644 --- a/dlls/appxdeploymentclient/package.c +++ b/dlls/appxdeploymentclient/package.c @@ -22,6 +22,210 @@ WINE_DEFAULT_DEBUG_CHANNEL(appx); +struct package_manager +{ + IPackageManager IPackageManager_iface; + LONG ref; +}; + +static inline struct package_manager *impl_from_IPackageManager( IPackageManager *iface ) +{ + return CONTAINING_RECORD( iface, struct package_manager, IPackageManager_iface ); +} + +static HRESULT WINAPI package_manager_QueryInterface( IPackageManager *iface, REFIID iid, void **out ) +{ + struct package_manager *impl = impl_from_IPackageManager( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IPackageManager )) + { + *out = &impl->IPackageManager_iface; + IInspectable_AddRef( *out ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI package_manager_AddRef( IPackageManager *iface ) +{ + struct package_manager *impl = impl_from_IPackageManager( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI package_manager_Release( IPackageManager *iface ) +{ + struct package_manager *impl = impl_from_IPackageManager( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + + if (!ref) free( impl ); + return ref; +} + +static HRESULT WINAPI package_manager_GetIids( IPackageManager *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_GetRuntimeClassName( IPackageManager *iface, HSTRING *class_name ) +{ + FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_GetTrustLevel( IPackageManager *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_AddPackageAsync( IPackageManager *iface, IUriRuntimeClass *uri, + IIterable_Uri *dependencies, DeploymentOptions options, IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress **operation ) +{ + FIXME( "iface %p, uri %p, dependencies %p, options %d, operation %p stub!\n", iface, uri, dependencies, options, operation ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_UpdatePackageAsync( IPackageManager *iface, IUriRuntimeClass *uri, IIterable_Uri *dependencies, + DeploymentOptions options, IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress **operation ) +{ + FIXME( "iface %p, uri %p, dependencies %p, options %d, operation %p stub!\n", iface, uri, dependencies, options, operation ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_RemovePackageAsync( IPackageManager *iface, HSTRING name, + IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress **operation ) +{ + FIXME( "iface %p, name %s, operation %p stub!\n", iface, debugstr_hstring(name), operation ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_StagePackageAsync( IPackageManager *iface, IUriRuntimeClass *uri, IIterable_Uri *dependencies, + IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress **operation ) +{ + FIXME( "iface %p, uri %p, dependencies %p, operation %p stub!\n", iface, uri, dependencies, operation ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_RegisterPackageAsync( IPackageManager *iface, IUriRuntimeClass *uri, IIterable_Uri *dependencies, + DeploymentOptions options, IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress **operation ) +{ + FIXME( "iface %p, uri %p, dependencies %p, options %d, operation %p stub!\n", iface, uri, dependencies, options, operation ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_FindPackages( IPackageManager *iface, IIterable_Package **packages ) +{ + FIXME( "iface %p, packages %p stub!\n", iface, packages ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_FindPackagesByUserSecurityId( IPackageManager *iface, HSTRING sid, IIterable_Package **packages ) +{ + FIXME( "iface %p, sid %s, packages %p stub!\n", iface, debugstr_hstring(sid), packages ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_FindPackagesByNamePublisher( IPackageManager *iface, HSTRING name, HSTRING publisher, IIterable_Package **packages ) +{ + FIXME( "iface %p, name %s, publisher %s, packages %p stub!\n", iface, debugstr_hstring(name), debugstr_hstring(publisher), packages ); + + if (!name || !publisher) return E_INVALIDARG; + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_FindPackagesByUserSecurityIdNamePublisher( IPackageManager *iface, HSTRING sid, + HSTRING name, HSTRING publisher, IIterable_Package **packages ) +{ + FIXME( "iface %p, sid %s, name %s, publisher %s, packages %p stub!\n", iface, debugstr_hstring(sid), debugstr_hstring(name), debugstr_hstring(publisher), packages ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_FindUsers( IPackageManager *iface, HSTRING name, IIterable_PackageUserInformation **users ) +{ + FIXME( "iface %p, name %s, users %p stub!\n", iface, debugstr_hstring(name), users ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_SetPackageState( IPackageManager *iface, HSTRING name, PackageState state ) +{ + FIXME("iface %p, name %s, state %d stub!\n", iface, debugstr_hstring(name), state); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_FindPackageByPackageFullName( IPackageManager *iface, HSTRING name, IPackage **package ) +{ + FIXME( "iface %p, name %s, package %p stub!\n", iface, debugstr_hstring(name), package ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_CleanupPackageForUserAsync( IPackageManager *iface, HSTRING name, HSTRING sid, + IAsyncOperationWithProgress_DeploymentResult_DeploymentProgress **operation ) +{ + FIXME( "iface %p, name %s, sid %s, operation %p stub!\n", iface, debugstr_hstring(name), debugstr_hstring(sid), operation ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_FindPackagesByPackageFamilyName( IPackageManager *iface, HSTRING family_name, + IIterable_Package **packages ) +{ + FIXME( "iface %p, family_name %s, packages %p stub!\n", iface, debugstr_hstring(family_name), packages ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_FindPackagesByUserSecurityIdPackageFamilyName( IPackageManager *iface, HSTRING sid, + HSTRING family_name, IIterable_Package **packages ) +{ + FIXME( "iface %p, sid %s, family_name %s, packages %p stub!\n", iface, debugstr_hstring(sid), debugstr_hstring(family_name), packages ); + return E_NOTIMPL; +} + +static HRESULT WINAPI package_manager_FindPackageByUserSecurityIdPackageFullName( IPackageManager *iface, HSTRING sid, HSTRING name, IPackage **package ) +{ + FIXME( "iface %p, sid %s, name %s, package %p stub!\n", iface, debugstr_hstring(sid), debugstr_hstring(name), package ); + return E_NOTIMPL; +} + +static const struct IPackageManagerVtbl package_manager_vtbl = +{ + package_manager_QueryInterface, + package_manager_AddRef, + package_manager_Release, + /* IInspectable methods */ + package_manager_GetIids, + package_manager_GetRuntimeClassName, + package_manager_GetTrustLevel, + /* IPackageManager methods */ + package_manager_AddPackageAsync, + package_manager_UpdatePackageAsync, + package_manager_RemovePackageAsync, + package_manager_StagePackageAsync, + package_manager_RegisterPackageAsync, + package_manager_FindPackages, + package_manager_FindPackagesByUserSecurityId, + package_manager_FindPackagesByNamePublisher, + package_manager_FindPackagesByUserSecurityIdNamePublisher, + package_manager_FindUsers, + package_manager_SetPackageState, + package_manager_FindPackageByPackageFullName, + package_manager_CleanupPackageForUserAsync, + package_manager_FindPackagesByPackageFamilyName, + package_manager_FindPackagesByUserSecurityIdPackageFamilyName, + package_manager_FindPackageByUserSecurityIdPackageFullName +}; + struct package_manager_statics { IActivationFactory IActivationFactory_iface; @@ -89,8 +293,21 @@ static HRESULT WINAPI factory_GetTrustLevel( IActivationFactory *iface, TrustLev static HRESULT WINAPI factory_ActivateInstance( IActivationFactory *iface, IInspectable **instance ) { - FIXME( "iface %p, instance %p stub!\n", iface, instance ); - return E_NOTIMPL; + struct package_manager *impl; + + TRACE( "iface %p, instance %p.\n", iface, instance ); + + if (!(impl = calloc( 1, sizeof(*impl) ))) + { + *instance = NULL; + return E_OUTOFMEMORY; + } + + impl->IPackageManager_iface.lpVtbl = &package_manager_vtbl; + impl->ref = 1; + + *instance = (IInspectable *)&impl->IPackageManager_iface; + return S_OK; } static const struct IActivationFactoryVtbl factory_vtbl = diff --git a/dlls/appxdeploymentclient/private.h b/dlls/appxdeploymentclient/private.h index fd2aaf449c8..aafbfed11a1 100644 --- a/dlls/appxdeploymentclient/private.h +++ b/dlls/appxdeploymentclient/private.h @@ -33,6 +33,7 @@ #define WIDL_using_Windows_Foundation_Collections #include "windows.foundation.h" #define WIDL_using_Windows_Management_Deployment +#define WIDL_using_Windows_ApplicationModel #include "windows.management.deployment.h" extern IActivationFactory *package_manager_factory; diff --git a/dlls/windows.applicationmodel/tests/model.c b/dlls/windows.applicationmodel/tests/model.c index 772970972e2..840b1d9a364 100644 --- a/dlls/windows.applicationmodel/tests/model.c +++ b/dlls/windows.applicationmodel/tests/model.c @@ -429,10 +429,11 @@ static void test_PackageManager(void) IStorageItem *storage_item; IActivationFactory *factory; IIterable_Package *packages; + IInspectable *inspectable; IPackageManager *manager; IIterator_Package *iter; IPackage *package; - HSTRING str; + HSTRING str, str2; HRESULT hr; LONG ref; @@ -451,20 +452,39 @@ static void test_PackageManager(void) check_interface( factory, &IID_IUnknown ); check_interface( factory, &IID_IInspectable ); - hr = IActivationFactory_ActivateInstance( factory, (IInspectable **)&manager ); - todo_wine + hr = IActivationFactory_ActivateInstance( factory, &inspectable ); ok( hr == S_OK, "got hr %#lx.\n", hr ); - if (hr != S_OK) goto skip_manager; - check_interface( manager, &IID_IUnknown ); - check_interface( manager, &IID_IInspectable ); - check_interface( manager, &IID_IAgileObject ); - check_interface( manager, &IID_IPackageManager ); + check_interface( inspectable, &IID_IUnknown ); + check_interface( inspectable, &IID_IInspectable ); + check_interface( inspectable, &IID_IAgileObject ); + + hr = IInspectable_QueryInterface( inspectable, &IID_IPackageManager, (void **)&manager ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + + hr = IPackageManager_FindPackagesByNamePublisher( manager, NULL, NULL, &packages ); + ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); + hr = WindowsCreateString( L"Wine", wcslen( L"Wine" ), &str ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + hr = IPackageManager_FindPackagesByNamePublisher( manager, str, NULL, &packages ); + ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); + hr = WindowsCreateString( L"The Wine Project", wcslen( L"The Wine Project" ), &str2 ); + ok( hr == S_OK, "got hr %#lx.\n", hr ); + hr = IPackageManager_FindPackagesByNamePublisher( manager, NULL, str2, &packages ); + ok( hr == E_INVALIDARG, "got hr %#lx.\n", hr ); + hr = IPackageManager_FindPackagesByNamePublisher( manager, str, str2, &packages ); + todo_wine + ok( hr == S_OK || broken(hr == E_ACCESSDENIED) /* Requires admin privileges */, "got hr %#lx.\n", hr ); + if (hr == S_OK) IIterable_Package_Release( packages ); + WindowsDeleteString( str ); + WindowsDeleteString( str2 ); hr = IPackageManager_FindPackages( manager, &packages ); + todo_wine ok( hr == S_OK || broken(hr == E_ACCESSDENIED) /* w8adm */, "got hr %#lx.\n", hr ); - if (broken(hr == E_ACCESSDENIED)) + if (hr != S_OK) { + todo_wine win_skip("Unable to list packages, skipping package manager tests\n"); goto skip_tests; } @@ -499,8 +519,9 @@ static void test_PackageManager(void) skip_tests: ref = IPackageManager_Release( manager ); + ok( ref == 1, "got ref %ld.\n", ref ); + ref = IInspectable_Release( inspectable ); ok( !ref, "got ref %ld.\n", ref ); -skip_manager: ref = IActivationFactory_Release( factory ); ok( ref == 1, "got ref %ld.\n", ref ); }