//---------------------------------------------------------------------------
//
//  Copyright (c) Microsoft Corporation. All rights reserved.
//
//  Abstract:
//      Interfaces & Objects for manipulating Appx Packages.
//
//----------------------------------------------------------------------------

cpp_quote("#include <winapifamily.h>")

#pragma region Desktop Family
cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")

import "oaidl.idl";
import "ocidl.idl";
import "urlmon.idl"; // For IUri

cpp_quote("#if (NTDDI_VERSION >= NTDDI_WIN7)")

[
    uuid(d7255437-34ff-48d1-b726-601dc4de4cad),
    version(1.0),
    lcid(0x0000)
]
library APPXPACKAGING {

typedef struct APPX_PACKAGE_SETTINGS
{
    BOOL forceZip32;
    IUri* hashMethod;
} APPX_PACKAGE_SETTINGS;

typedef [v1_enum] enum APPX_COMPRESSION_OPTION
{
    APPX_COMPRESSION_OPTION_NONE = 0,
    APPX_COMPRESSION_OPTION_NORMAL = 1,
    APPX_COMPRESSION_OPTION_MAXIMUM = 2,
    APPX_COMPRESSION_OPTION_FAST = 3,
    APPX_COMPRESSION_OPTION_SUPERFAST = 4
} APPX_COMPRESSION_OPTION;

typedef [v1_enum] enum APPX_FOOTPRINT_FILE_TYPE
{
    APPX_FOOTPRINT_FILE_TYPE_MANIFEST = 0,
    APPX_FOOTPRINT_FILE_TYPE_BLOCKMAP = 1,
    APPX_FOOTPRINT_FILE_TYPE_SIGNATURE = 2,
    APPX_FOOTPRINT_FILE_TYPE_CODEINTEGRITY = 3
} APPX_FOOTPRINT_FILE_TYPE;

typedef [v1_enum] enum APPX_BUNDLE_FOOTPRINT_FILE_TYPE
{
    APPX_BUNDLE_FOOTPRINT_FILE_TYPE_FIRST = 0,
    APPX_BUNDLE_FOOTPRINT_FILE_TYPE_MANIFEST = 0,
    APPX_BUNDLE_FOOTPRINT_FILE_TYPE_BLOCKMAP = 1,
    APPX_BUNDLE_FOOTPRINT_FILE_TYPE_SIGNATURE = 2,
    APPX_BUNDLE_FOOTPRINT_FILE_TYPE_LAST = 2
} APPX_BUNDLE_FOOTPRINT_FILE_TYPE;

typedef [v1_enum] enum APPX_PACKAGE_ARCHITECTURE
{
    APPX_PACKAGE_ARCHITECTURE_X86 = 0, // PROCESSOR_ARCHITECTURE_INTEL
    APPX_PACKAGE_ARCHITECTURE_ARM = 5, // PROCESSOR_ARCHITECTURE_ARM
    APPX_PACKAGE_ARCHITECTURE_X64 = 9, // PROCESSOR_ARCHITECTURE_AMD64
    APPX_PACKAGE_ARCHITECTURE_NEUTRAL = 11 // PROCESSOR_ARCHITECTURE_NEUTRAL
} APPX_PACKAGE_ARCHITECTURE;

typedef [v1_enum] enum APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE
{
    APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE_APPLICATION = 0,
    APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE_RESOURCE = 1
} APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE;

typedef [v1_enum] enum APPX_CAPABILITIES
{
    APPX_CAPABILITY_INTERNET_CLIENT                 = 0x0000000000000001,
    APPX_CAPABILITY_INTERNET_CLIENT_SERVER          = 0x0000000000000002,
    APPX_CAPABILITY_PRIVATE_NETWORK_CLIENT_SERVER   = 0x0000000000000004,
    APPX_CAPABILITY_DOCUMENTS_LIBRARY               = 0x0000000000000008,
    APPX_CAPABILITY_PICTURES_LIBRARY                = 0x0000000000000010,
    APPX_CAPABILITY_VIDEOS_LIBRARY                  = 0x0000000000000020,
    APPX_CAPABILITY_MUSIC_LIBRARY                   = 0x0000000000000040,
    APPX_CAPABILITY_ENTERPRISE_AUTHENTICATION       = 0x0000000000000080,
    APPX_CAPABILITY_SHARED_USER_CERTIFICATES        = 0x0000000000000100,
    APPX_CAPABILITY_REMOVABLE_STORAGE               = 0x0000000000000200,
} APPX_CAPABILITIES;
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(APPX_CAPABILITIES);")

typedef [v1_enum] enum DX_FEATURE_LEVEL
{
    DX_FEATURE_LEVEL_UNSPECIFIED = 0,
    DX_FEATURE_LEVEL_9 = 1,
    DX_FEATURE_LEVEL_10 = 2,
    DX_FEATURE_LEVEL_11 = 3,
} DX_FEATURE_LEVEL;

interface IAppxPackageWriter;
interface IAppxPackageReader;
interface IAppxFile;
interface IAppxFilesEnumerator;
interface IAppxBlockMapReader;
interface IAppxBlockMapFile;
interface IAppxBlockMapFilesEnumerator;
interface IAppxBlockMapBlock;
interface IAppxBlockMapBlocksEnumerator;
interface IAppxManifestReader;
interface IAppxManifestPackageId;
interface IAppxManifestProperties;
interface IAppxManifestPackageDependency;
interface IAppxManifestPackageDependenciesEnumerator;
interface IAppxManifestResourcesEnumerator;
interface IAppxManifestDeviceCapabilitiesEnumerator;
interface IAppxManifestApplicationsEnumerator;
interface IAppxManifestApplication;
interface IAppxManifestQualifiedResourcesEnumerator;
interface IAppxManifestQualifiedResource;
interface IAppxBundleFactory;
interface IAppxBundleWriter;
interface IAppxBundleReader;
interface IAppxBundleManifestReader;
interface IAppxBundleManifestPackageInfoEnumerator;
interface IAppxBundleManifestPackageInfo;

[
    object,
    uuid(beb94909-e451-438b-b5a7-d79e767b75d8),
    pointer_default(ref)
]
interface IAppxFactory : IUnknown
{
    HRESULT
    CreatePackageWriter(
        [in]            IStream *               outputStream,
        [in]            APPX_PACKAGE_SETTINGS * settings,
        [out, retval]   IAppxPackageWriter **   packageWriter
    );

    HRESULT
    CreatePackageReader(
        [in]            IStream *                     inputStream,
        [out, retval]   IAppxPackageReader **         packageReader
    );

    HRESULT
    CreateManifestReader(
        [in]            IStream *               inputStream,
        [out, retval]   IAppxManifestReader **  manifestReader
    );

    HRESULT
    CreateBlockMapReader(
        [in]            IStream *               inputStream,
        [out, retval]   IAppxBlockMapReader **  blockMapReader
    );

    HRESULT
    CreateValidatedBlockMapReader(
        [in]            IStream *               blockMapStream,
        [in]            LPCWSTR                 signatureFileName,
        [out, retval]   IAppxBlockMapReader **  blockMapReader
    );
}

[
    uuid(5842a140-ff9f-4166-8f5c-62f5b7b0c781)
]
coclass AppxFactory
{
    interface IAppxFactory;
};

[
    object,
    uuid(b5c49650-99bc-481c-9a34-3d53a4106708),
    pointer_default(ref)
]
interface IAppxPackageReader : IUnknown
{
    HRESULT
    GetBlockMap(
        [out, retval]   IAppxBlockMapReader **  blockMapReader
    );

    HRESULT
    GetFootprintFile(
        [in]            APPX_FOOTPRINT_FILE_TYPE   type,
        [out, retval]   IAppxFile **               file
    );

    HRESULT
    GetPayloadFile(
        [in, string]    LPCWSTR         fileName,
        [out, retval]   IAppxFile **    file
    );

    HRESULT
    GetPayloadFiles(
        [out, retval]   IAppxFilesEnumerator **  filesEnumerator
    );

    HRESULT
    GetManifest(
        [out, retval]   IAppxManifestReader **  manifestReader
    );
}

[
    object,
    uuid(9099e33b-246f-41e4-881a-008eb613f858),
    pointer_default(ref)
]
interface IAppxPackageWriter : IUnknown
{
    HRESULT
    AddPayloadFile(
        [in, string]    LPCWSTR                   fileName,
        [in, string]    LPCWSTR                   contentType,
        [in]            APPX_COMPRESSION_OPTION   compressionOption,
        [in]            IStream *                 inputStream
    );

    HRESULT
    Close(
        [in]        IStream *       manifest
    );
}

[
    object,
    uuid(91df827b-94fd-468f-827b-57f41b2f6f2e),
    pointer_default(ref)
]
interface IAppxFile : IUnknown
{
    HRESULT
    GetCompressionOption(
        [out, retval]   APPX_COMPRESSION_OPTION *   compressionOption
    );

    HRESULT
    GetContentType(
        [out, string, retval]   LPWSTR *    contentType
    );

    HRESULT
    GetName(
        [out, string, retval]   LPWSTR *   fileName
    );

    HRESULT
    GetSize(
        [out, retval]   UINT64 *    size
    );

    HRESULT
    GetStream(
        [out, retval]   IStream **  stream
    );
}

[
    object,
    uuid(f007eeaf-9831-411c-9847-917cdc62d1fe),
    pointer_default(ref)
]
interface IAppxFilesEnumerator : IUnknown
{
    HRESULT
    GetCurrent(
        [out, retval]   IAppxFile **    file
    );

    HRESULT
    GetHasCurrent(
        [out, retval]     BOOL *    hasCurrent
    );

    HRESULT
    MoveNext(
        [out, retval]   BOOL *  hasNext
    );
}

[
    object,
    uuid(5efec991-bca3-42d1-9ec2-e92d609ec22a),
    pointer_default(ref)
]
interface IAppxBlockMapReader : IUnknown
{
    HRESULT
    GetFile(
        [in, string]    LPCWSTR                 filename,
        [out, retval]   IAppxBlockMapFile **    file
    );

    HRESULT
    GetFiles(
        [out, retval]   IAppxBlockMapFilesEnumerator **    enumerator
    );

    HRESULT
    GetHashMethod(
        [out, retval]   IUri ** hashMethod
    );

    HRESULT
    GetStream(
        [out, retval]   IStream ** blockMapStream
    );
}

[
    object,
    uuid(277672ac-4f63-42c1-8abc-beae3600eb59),
    pointer_default(ref)
]
interface IAppxBlockMapFile : IUnknown
{
    HRESULT
    GetBlocks(
        [out, retval]    IAppxBlockMapBlocksEnumerator **   blocks
    );

    HRESULT
    GetLocalFileHeaderSize(
        [out, retval]    UINT32 *   lfhSize
    );

    HRESULT
    GetName(
        [out, string, retval]    LPWSTR *   name
    );

    HRESULT
    GetUncompressedSize(
        [out, retval]    UINT64 *   size
    );

    HRESULT
    ValidateFileHash(
        [in]            IStream *   fileStream,
        [out, retval]   BOOL *      isValid
    );
}

[
    object,
    uuid(02b856a2-4262-4070-bacb-1a8cbbc42305),
    pointer_default(ref)
]
interface IAppxBlockMapFilesEnumerator : IUnknown
{
    HRESULT
    GetCurrent(
        [out, retval]     IAppxBlockMapFile **  file
    );

    HRESULT
    GetHasCurrent(
        [out, retval]     BOOL *    hasCurrent
    );

    HRESULT
    MoveNext(
        [out, retval]     BOOL *    hasCurrent
    );
}

[
    object,
    uuid(75cf3930-3244-4fe0-a8c8-e0bcb270b889),
    pointer_default(unique)
]
interface IAppxBlockMapBlock : IUnknown
{
    HRESULT
    GetHash(
        [out]                                   UINT32 *    bufferSize,
        [out, size_is(, *bufferSize), retval]   BYTE **     buffer
    );

    HRESULT
    GetCompressedSize(
        [out, retval]     UINT32 *  size
    );
}

[
    object,
    uuid(6b429b5b-36ef-479e-b9eb-0c1482b49e16),
    pointer_default(ref)
]
interface IAppxBlockMapBlocksEnumerator : IUnknown
{
    HRESULT
    GetCurrent(
        [out, retval]     IAppxBlockMapBlock ** block
    );

    HRESULT
    GetHasCurrent(
        [out, retval]     BOOL *    hasCurrent
    );

    HRESULT
    MoveNext(
        [out, retval]     BOOL *    hasNext
    );
}

[
    object,
    uuid(4e1bd148-55a0-4480-a3d1-15544710637c),
    pointer_default(ref)
]
interface IAppxManifestReader : IUnknown
{
    HRESULT
    GetPackageId(
        [out, retval]   IAppxManifestPackageId **   packageId
    );

    HRESULT
    GetProperties(
        [out, retval]   IAppxManifestProperties **    packageProperties
    );

    HRESULT
    GetPackageDependencies(
        [out, retval]   IAppxManifestPackageDependenciesEnumerator **  dependencies
    );

    HRESULT
    GetCapabilities(
        [out, retval]    APPX_CAPABILITIES *  capabilities
    );

    HRESULT
    GetResources(
        [out, retval]   IAppxManifestResourcesEnumerator ** resources
    );

    HRESULT
    GetDeviceCapabilities(
        [out, retval]   IAppxManifestDeviceCapabilitiesEnumerator ** deviceCapabilities
    );

    HRESULT
    GetPrerequisite(
        [in, string]    LPCWSTR     name,
        [out, retval]   UINT64 *    value
    );

    HRESULT
    GetApplications(
        [out, retval]   IAppxManifestApplicationsEnumerator ** applications
    );

    HRESULT
    GetStream(
        [out, retval]   IStream **  manifestStream
    );
}

[
    object,
    uuid(d06f67bc-b31d-4eba-a8af-638e73e77b4d),
    pointer_default(ref)
]
interface IAppxManifestReader2 : IAppxManifestReader
{
    HRESULT
    GetQualifiedResources(
        [out, retval]   IAppxManifestQualifiedResourcesEnumerator ** resources
    );
}

[
    object,
    uuid(283ce2d7-7153-4a91-9649-7a0f7240945f),
    pointer_default(ref)
]
interface IAppxManifestPackageId : IUnknown
{
    HRESULT
    GetName(
        [out, string, retval]   LPWSTR *    name
    );

    HRESULT
    GetArchitecture(
        [out, retval]   APPX_PACKAGE_ARCHITECTURE *   architecture
    );

    HRESULT
    GetPublisher(
        [out, string, retval]   LPWSTR *    publisher
    );

    HRESULT
    GetVersion(
        [out, retval]   UINT64 *    packageVersion
    );

    HRESULT
    GetResourceId(
        [out, string, retval]   LPWSTR *    resourceId
    );

    HRESULT
    ComparePublisher(
        [in, string]        LPCWSTR     other,
        [out, retval]       BOOL *      isSame
    );

    HRESULT
    GetPackageFullName(
        [out, string, retval]   LPWSTR *    packageFullName
    );

    HRESULT
    GetPackageFamilyName(
        [out, string, retval]   LPWSTR *    packageFamilyName
    );
}

[
    object,
    uuid(03faf64d-f26f-4b2c-aaf7-8fe7789b8bca),
    pointer_default(ref)
]
interface IAppxManifestProperties : IUnknown
{
    HRESULT
    GetBoolValue(
        [in, string]    LPCWSTR name,
        [out, retval]   BOOL *  value
    );

    HRESULT
    GetStringValue(
        [in, string]            LPCWSTR     name,
        [out, string, retval]   LPWSTR *    value
    );
}

[
    object,
    uuid(b43bbcf9-65a6-42dd-bac0-8c6741e7f5a4),
    pointer_default(ref)
]
interface IAppxManifestPackageDependenciesEnumerator : IUnknown
{
    HRESULT
    GetCurrent(
        [out, retval]   IAppxManifestPackageDependency **   dependency
    );

    HRESULT
    GetHasCurrent(
        [out, retval]   BOOL *  hasCurrent
    );

    HRESULT
    MoveNext(
        [out, retval]   BOOL *  hasNext
    );
}

[
    object,
    uuid(e4946b59-733e-43f0-a724-3bde4c1285a0),
    pointer_default(ref)
]
interface IAppxManifestPackageDependency : IUnknown
{
    HRESULT
    GetName(
        [out, string, retval]   LPWSTR *    name
    );

    HRESULT
    GetPublisher(
        [out, string, retval]   LPWSTR *    publisher
    );

    HRESULT
    GetMinVersion(
        [out, retval]   UINT64 *    minVersion
    );
}

[
    object,
    uuid(de4dfbbd-881a-48bb-858c-d6f2baeae6ed),
    pointer_default(ref)
]
interface IAppxManifestResourcesEnumerator : IUnknown
{
    HRESULT
    GetCurrent(
        [out, string, retval]   LPWSTR *  resource
    );

    HRESULT
    GetHasCurrent(
        [out, retval]   BOOL *  hasCurrent
    );

    HRESULT
    MoveNext(
        [out, retval]   BOOL *  hasNext
    );
}

[
    object,
    uuid(30204541-427b-4a1c-bacf-655bf463a540),
    pointer_default(ref)
]
interface IAppxManifestDeviceCapabilitiesEnumerator : IUnknown
{
    HRESULT
    GetCurrent(
        [out, string, retval]   LPWSTR *  deviceCapability
    );

    HRESULT
    GetHasCurrent(
        [out, retval]   BOOL *  hasCurrent
    );

    HRESULT
    MoveNext(
        [out, retval]   BOOL *  hasNext
    );
}

[
    object,
    uuid(9eb8a55a-f04b-4d0d-808d-686185d4847a),
    pointer_default(ref)
]
interface IAppxManifestApplicationsEnumerator : IUnknown
{
    HRESULT
    GetCurrent(
        [out, retval]   IAppxManifestApplication **  application
    );

    HRESULT
    GetHasCurrent(
        [out, retval]   BOOL *  hasCurrent
    );

    HRESULT
    MoveNext(
        [out, retval]   BOOL *  hasNext
    );
}

[
    object,
    uuid(5da89bf4-3773-46be-b650-7e744863b7e8),
    pointer_default(ref)
]
interface IAppxManifestApplication : IUnknown
{
    HRESULT
    GetStringValue(
        [in, string]            LPCWSTR     name,
        [out, string, retval]   LPWSTR *    value
    );

    HRESULT
    GetAppUserModelId(
        [out, string, retval] LPWSTR * appUserModelId
        );
}

[
    object,
    uuid(8ef6adfe-3762-4a8f-9373-2fc5d444c8d2),
    pointer_default(ref)
]
interface IAppxManifestQualifiedResourcesEnumerator : IUnknown
{
    HRESULT
    GetCurrent(
        [out, retval]     IAppxManifestQualifiedResource ** resource
    );

    HRESULT
    GetHasCurrent(
        [out, retval]     BOOL *    hasCurrent
    );

    HRESULT
    MoveNext(
        [out, retval]     BOOL *    hasNext
    );
}

[
    object,
    uuid(3b53a497-3c5c-48d1-9ea3-bb7eac8cd7d4),
    pointer_default(ref)
]
interface IAppxManifestQualifiedResource : IUnknown
{
    HRESULT
    GetLanguage(
        [out, string, retval]   LPWSTR *    language
    );

    HRESULT
    GetScale(
        [out, retval]   UINT32 *    scale
    );

    HRESULT
    GetDXFeatureLevel(
        [out, retval]   DX_FEATURE_LEVEL * dxFeatureLevel
    );
}

[
    object,
    uuid(BBA65864-965F-4A5F-855F-F074BDBF3A7B),
    pointer_default(ref)
]
interface IAppxBundleFactory : IUnknown
{
    HRESULT CreateBundleWriter(
        [in]           IStream*             outputStream,
        [in]           UINT64               bundleVersion,
        [out, retval]  IAppxBundleWriter**  bundleWriter
    );

    HRESULT CreateBundleReader(
        [in]           IStream*             inputStream,
        [out, retval]  IAppxBundleReader**  bundleReader
    );

    HRESULT CreateBundleManifestReader(
        [in]           IStream*                     inputStream,
        [out, retval]  IAppxBundleManifestReader**  manifestReader
    );
}

[
    uuid(378E0446-5384-43B7-8877-E7DBDD883446)
]
coclass AppxBundleFactory
{
    interface IAppxBundleFactory;
}

[
    object,
    uuid(EC446FE8-BFEC-4C64-AB4F-49F038F0C6D2),
    pointer_default(ref)
]
interface IAppxBundleWriter : IUnknown
{
    HRESULT AddPayloadPackage(
        [in, string]  LPCWSTR   fileName,
        [in]          IStream*  packageStream
    );

    HRESULT Close();
}

[
    object,
    uuid(DD75B8C0-BA76-43B0-AE0F-68656A1DC5C8),
    pointer_default(ref)
]
interface IAppxBundleReader : IUnknown
{
    HRESULT GetFootprintFile(
        [in]           APPX_BUNDLE_FOOTPRINT_FILE_TYPE  fileType,
        [out, retval]  IAppxFile**                      footprintFile
    );

    HRESULT GetBlockMap(
        [out, retval]  IAppxBlockMapReader**  blockMapReader
    );

    HRESULT GetManifest(
        [out, retval]  IAppxBundleManifestReader**  manifestReader
    );

    HRESULT GetPayloadPackages(
        [out, retval]  IAppxFilesEnumerator**  payloadPackages
    );

    HRESULT GetPayloadPackage(
        [in, string]   LPCWSTR      fileName,
        [out, retval]  IAppxFile**  payloadPackage
    );
}

[
    object,
    uuid(CF0EBBC1-CC99-4106-91EB-E67462E04FB0),
    pointer_default(ref)
]
interface IAppxBundleManifestReader : IUnknown
{
    HRESULT GetPackageId(
        [out, retval]  IAppxManifestPackageId**  packageId
    );

    HRESULT GetPackageInfoItems(
        [out, retval]  IAppxBundleManifestPackageInfoEnumerator**  packageInfoItems
    );

    HRESULT GetStream(
        [out, retval]  IStream**  manifestStream
    );
}

[
    object,
    uuid(F9B856EE-49A6-4E19-B2B0-6A2406D63A32),
    pointer_default(ref)
]
interface IAppxBundleManifestPackageInfoEnumerator : IUnknown
{
    HRESULT GetCurrent(
        [out, retval]  IAppxBundleManifestPackageInfo**  packageInfo
    );

    HRESULT GetHasCurrent(
        [out, retval]  BOOL*  hasCurrent
    );

    HRESULT MoveNext(
        [out, retval]  BOOL*  hasNext
    );
}

[
    object,
    uuid(54CD06C1-268F-40BB-8ED2-757A9EBAEC8D),
    pointer_default(ref)
]
interface IAppxBundleManifestPackageInfo : IUnknown
{
    HRESULT GetPackageType(
        [out, retval]  APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE*  packageType
    );

    HRESULT GetPackageId(
        [out, retval]  IAppxManifestPackageId**  packageId
    );

    HRESULT GetFileName(
        [out, string, retval]  LPWSTR*  fileName
    );

    HRESULT GetOffset(
        [out, retval]  UINT64*  offset
    );

    HRESULT GetSize(
        [out, retval]  UINT64*  size
    );

    HRESULT GetResources(
        [out, retval]  IAppxManifestQualifiedResourcesEnumerator**  resources
    );
}

}; // library APPXPACKAGING

cpp_quote("#endif // (NTDDI >= NTDDI_WIN7)")

cpp_quote("#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */")
#pragma endregion
