/*
 * Copyright 2023 Rémi Bernon for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "windows.foundation.idl";
import "windows.applicationmodel.idl";

namespace Windows.Management.Deployment {

    typedef enum DeploymentOptions DeploymentOptions;
    typedef enum DeploymentProgressState DeploymentProgressState;
    typedef enum PackageInstallState PackageInstallState;
    typedef enum PackageState PackageState;
    typedef enum PackageTypes PackageTypes;
    typedef enum RemovalOptions RemovalOptions;

    typedef struct DeploymentProgress DeploymentProgress;

    interface IDeploymentResult;
    interface IPackageManager;
    interface IPackageManager2;
    interface IPackageUserInformation;

    runtimeclass DeploymentResult;
    runtimeclass PackageManager;
    runtimeclass PackageUserInformation;

    declare {
        interface Windows.Foundation.Collections.IIterable<Windows.Foundation.Uri *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Foundation.Uri *>;
        interface Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *>;
        interface Windows.Foundation.Collections.IIterator<Windows.ApplicationModel.Package *>;
        interface Windows.Foundation.Collections.IIterable<Windows.Management.Deployment.PackageUserInformation *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Management.Deployment.PackageUserInformation *>;
        interface Windows.Foundation.IAsyncOperationWithProgress<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress>;
        interface Windows.Foundation.AsyncOperationProgressHandler<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress>;
        interface Windows.Foundation.AsyncOperationWithProgressCompletedHandler<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress>;
    }

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    [flags]
    enum DeploymentOptions
    {
        None                            = 0x0,
        ForceApplicationShutdown        = 0x1,
        DevelopmentMode                 = 0x2,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        InstallAllResources             = 0x20,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        ForceTargetApplicationShutdown  = 0x40,
        [contract(Windows.Foundation.UniversalApiContract, 4.0)]
        RequiredContentGroupOnly        = 0x100,
        [contract(Windows.Foundation.UniversalApiContract, 7.0)]
        ForceUpdateFromAnyVersion       = 0x40000,
        [contract(Windows.Foundation.UniversalApiContract, 10.0)]
        RetainFilesOnFailure            = 0x200000,
        [contract(Windows.Foundation.UniversalApiContract, 10.0)]
        StageInPlace                    = 0x400000,
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    enum DeploymentProgressState
    {
        Queued     = 0,
        Processing = 1,
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    enum PackageInstallState
    {
        NotInstalled = 0,
        Staged       = 1,
        Installed    = 2,
        [contract(Windows.Foundation.UniversalApiContract, 2.0)]
        Paused       = 6,
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    enum PackageState
    {
        Normal         = 0,
        LicenseInvalid = 1,
        Modified       = 2,
        Tampered       = 3,
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    [flags]
    enum PackageTypes
    {
        None      = 0x0,
        Main      = 0x1,
        Framework = 0x2,
        Resource  = 0x4,
        Bundle    = 0x8,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        Xap       = 0x10,
        [contract(Windows.Foundation.UniversalApiContract, 3.0)]
        Optional  = 0x20,
        [contract(Windows.Foundation.UniversalApiContract, 10.0)]
        All       = 0xffffffff,
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    [flags]
    enum RemovalOptions
    {
        None                            = 0x0,
        PreserveApplicationData         = 0x1000,
        [contract(Windows.Foundation.UniversalApiContract, 10.0)]
        PreserveRoamableApplicationData = 0x80,
        [contract(Windows.Foundation.UniversalApiContract, 7.0)]
        RemoveForAllUsers               = 0x80000,
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    struct DeploymentProgress
    {
        Windows.Management.Deployment.DeploymentProgressState state;
        UINT32 percentage;
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Management.Deployment.DeploymentResult),
        uuid(2563b9ae-b77d-4c1f-8a7b-20e6ad515ef3)
    ]
    interface IDeploymentResult : IInspectable
    {
        [propget] HRESULT ErrorText([out, retval] HSTRING *value);
        [propget] HRESULT ActivityId([out, retval] GUID *value);
        [propget] HRESULT ExtendedErrorCode([out, retval] HRESULT *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Management.Deployment.PackageManager),
        uuid(9a7d4b65-5e8f-4fc7-a2e5-7f6925cb8b53)
    ]
    interface IPackageManager : IInspectable
    {
        [overload("AddPackageAsync")]
        HRESULT AddPackageAsync([in] Windows.Foundation.Uri *uri, [in] Windows.Foundation.Collections.IIterable<Windows.Foundation.Uri *> *dependencies, [in] Windows.Management.Deployment.DeploymentOptions options,
                                [out, retval] Windows.Foundation.IAsyncOperationWithProgress<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress> **operation);
        HRESULT UpdatePackageAsync([in] Windows.Foundation.Uri *uri, [in] Windows.Foundation.Collections.IIterable<Windows.Foundation.Uri *> *dependencies, [in] Windows.Management.Deployment.DeploymentOptions options,
                                   [out, retval] Windows.Foundation.IAsyncOperationWithProgress<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress> **operation);
        HRESULT RemovePackageAsync([in] HSTRING name, [out, retval] Windows.Foundation.IAsyncOperationWithProgress<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress> **operation);
        HRESULT StagePackageAsync([in] Windows.Foundation.Uri *uri, [in] Windows.Foundation.Collections.IIterable<Windows.Foundation.Uri *> *dependencies,
                                  [out, retval] Windows.Foundation.IAsyncOperationWithProgress<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress> **operation);
        [overload("RegisterPackageAsync")]
        HRESULT RegisterPackageAsync([in] Windows.Foundation.Uri* uri, [in] Windows.Foundation.Collections.IIterable<Windows.Foundation.Uri *> *dependencies, [in] Windows.Management.Deployment.DeploymentOptions options,
                                     [out, retval] Windows.Foundation.IAsyncOperationWithProgress<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress> **operation);
        [overload("FindPackages")]
        HRESULT FindPackages([out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        [overload("FindPackagesForUser")]
        HRESULT FindPackagesByUserSecurityId([in] HSTRING sid, [out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        [overload("FindPackages")]
        HRESULT FindPackagesByNamePublisher([in] HSTRING name, [in] HSTRING publisher, [out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        [overload("FindPackagesForUser")]
        HRESULT FindPackagesByUserSecurityIdNamePublisher([in] HSTRING sid, [in] HSTRING name, [in] HSTRING publisher, [out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        HRESULT FindUsers([in] HSTRING name, [out, retval] Windows.Foundation.Collections.IIterable<Windows.Management.Deployment.PackageUserInformation *> **users);
        HRESULT SetPackageState([in] HSTRING name, [in] Windows.Management.Deployment.PackageState state);
        [overload("FindPackage")]
        HRESULT FindPackageByPackageFullName([in] HSTRING name, [out, retval] Windows.ApplicationModel.Package **package);
        HRESULT CleanupPackageForUserAsync([in] HSTRING name, [in] HSTRING sid, [out, retval] Windows.Foundation.IAsyncOperationWithProgress<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress> **operation);
        [overload("FindPackages")]
        HRESULT FindPackagesByPackageFamilyName([in] HSTRING family_name, [out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        [overload("FindPackagesForUser")]
        HRESULT FindPackagesByUserSecurityIdPackageFamilyName([in] HSTRING sid, [in] HSTRING family_name, [out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        [overload("FindPackageForUser")]
        HRESULT FindPackageByUserSecurityIdPackageFullName([in] HSTRING sid, [in] HSTRING name, [out, retval] Windows.ApplicationModel.Package **package);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Management.Deployment.PackageManager),
        uuid(f7aad08d-0840-46f2-b5d8-cad47693a095)
    ]
    interface IPackageManager2 : IInspectable
    {
        [overload("RemovePackageAsync")]
        HRESULT RemovePackageWithOptionsAsync([in] HSTRING name, [in] Windows.Management.Deployment.RemovalOptions options,
                                              [out, retval] Windows.Foundation.IAsyncOperationWithProgress<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress> **operation);
        [overload("StagePackageAsync")]
        HRESULT StagePackageWithOptionsAsync([in] Windows.Foundation.Uri *uri, [in] Windows.Foundation.Collections.IIterable<Windows.Foundation.Uri *> *dependencies,
                                             [in] Windows.Management.Deployment.DeploymentOptions options,
                                             [out, retval] Windows.Foundation.IAsyncOperationWithProgress<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress> **operation);
        HRESULT RegisterPackageByFullNameAsync([in] HSTRING name, [in] Windows.Foundation.Collections.IIterable<HSTRING> *dependencies,
                                               [in] Windows.Management.Deployment.DeploymentOptions options,
                                               [out, retval] Windows.Foundation.IAsyncOperationWithProgress<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress> **operation);
        [overload("FindPackagesWithPackageTypes")]
        HRESULT FindPackagesWithPackageTypes([in] Windows.Management.Deployment.PackageTypes types, [out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        [overload("FindPackagesForUserWithPackageTypes")]
        HRESULT FindPackagesByUserSecurityIdWithPackageTypes([in] HSTRING sid, [in] Windows.Management.Deployment.PackageTypes types,
                                                             [out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        [overload("FindPackagesWithPackageTypes")]
        HRESULT FindPackagesByNamePublisherWithPackageTypes([in] HSTRING name, [in] HSTRING publisher, [in] Windows.Management.Deployment.PackageTypes types,
                                                            [out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        [overload("FindPackagesForUserWithPackageTypes")]
        HRESULT FindPackagesByUserSecurityIdNamePublisherWithPackageTypes([in] HSTRING sid, [in] HSTRING name, [in] HSTRING publisher, [in] Windows.Management.Deployment.PackageTypes types,
                                                                          [out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        [overload("FindPackagesWithPackageTypes")]
        HRESULT FindPackagesByPackageFamilyNameWithPackageTypes([in] HSTRING family_name, [in] Windows.Management.Deployment.PackageTypes types,
                                                                [out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        [overload("FindPackagesForUserWithPackageTypes")]
        HRESULT FindPackagesByUserSecurityIdPackageFamilyNameWithPackageTypes([in] HSTRING sid, [in] HSTRING family_name, [in] Windows.Management.Deployment.PackageTypes types,
                                                                              [out, retval] Windows.Foundation.Collections.IIterable<Windows.ApplicationModel.Package *> **packages);
        [overload("StageUserDataAsync")]
        HRESULT StageUserDataAsync([in] HSTRING name, [out, retval] Windows.Foundation.IAsyncOperationWithProgress<Windows.Management.Deployment.DeploymentResult *, Windows.Management.Deployment.DeploymentProgress> **operation);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Management.Deployment.PackageUserInformation),
        uuid(f6383423-fa09-4cbc-9055-15ca275e2e7e)
    ]
    interface IPackageUserInformation : IInspectable
    {
        [propget] HRESULT UserSecurityId([out, retval] HSTRING *value);
        [propget] HRESULT InstallState([out, retval] Windows.Management.Deployment.PackageInstallState *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass DeploymentResult
    {
        [default] interface Windows.Management.Deployment.IDeploymentResult;
        /* [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.Management.Deployment.IDeploymentResult2; */
    }

    [
        activatable(Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass PackageManager
    {
        [default] interface Windows.Management.Deployment.IPackageManager;
        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Management.Deployment.IPackageManager2;
        /* [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Management.Deployment.IPackageManager3; */
        /* [contract(Windows.Foundation.UniversalApiContract, 3.0)] interface Windows.Management.Deployment.IPackageManager4; */
        /* [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.Management.Deployment.IPackageManager5; */
        /* [contract(Windows.Foundation.UniversalApiContract, 5.0)] interface Windows.Management.Deployment.IPackageManager6; */
        /* [contract(Windows.Foundation.UniversalApiContract, 6.0)] interface Windows.Management.Deployment.IPackageManager7; */
        /* [contract(Windows.Foundation.UniversalApiContract, 7.0)] interface Windows.Management.Deployment.IPackageManager8; */
        /* [contract(Windows.Foundation.UniversalApiContract, 10.0)] interface Windows.Management.Deployment.IPackageManager9; */
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile)
    ]
    runtimeclass PackageUserInformation
    {
        [default] interface Windows.Management.Deployment.IPackageUserInformation;
    }

}
