//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992-2001.
//
//  File:       fusenet.idl
//
//  Contents:   Fusion Installer Interfaces
//
//  Classes:
//
//  Functions:
//
//
//----------------------------------------------------------------------------
cpp_quote("//=--------------------------------------------------------------------------=")
cpp_quote("// fusenet.h")
cpp_quote("//=--------------------------------------------------------------------------=")
cpp_quote("// (C) Copyright 1995-2001 Microsoft Corporation.  All Rights Reserved.")
cpp_quote("//")
cpp_quote("// THIS CODE AND INFORMATION IS PROVIDED \"AS IS\" WITHOUT WARRANTY OF")
cpp_quote("// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO")
cpp_quote("// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A")
cpp_quote("// PARTICULAR PURPOSE.")
cpp_quote("//=--------------------------------------------------------------------------=")
cpp_quote("")
cpp_quote("#pragma comment(lib,\"uuid.lib\")")
cpp_quote("")
cpp_quote("//---------------------------------------------------------------------------=")
cpp_quote("// Fusenet Interfaces.")
cpp_quote("")

import "objidl.idl";
import "oleidl.idl";
//import "bgcopy.idl";
import "bits.idl";

interface IAssemblyIdentity;
interface IAssemblyManifestImport;
interface IAssemblyCacheImport;
interface IAssemblyCacheEmit;
interface IAssemblyDownload;

cpp_quote("EXTERN_C const IID IID_IAssemblyFileInfo;")
cpp_quote("EXTERN_C const IID IID_IAssemblyIdentity;")
cpp_quote("EXTERN_C const IID IID_IAssemblyManifestImport;")
cpp_quote("EXTERN_C const IID IID_IAssemblyCacheImport;")
cpp_quote("EXTERN_C const IID IID_IAssemblyCacheEmit;")
cpp_quote("EXTERN_C const IID IID_IAssemblyDownload;")
cpp_quote("EXTERN_C const IID IID_IManifestApplicationInfo;")
cpp_quote("EXTERN_C const IID IID_IDependentAssemblyInfo;")

///////////////////////////////////////////////////////////////////////////////
//
// IAssemblyFileInfo
// 
///////////////////////////////////////////////////////////////////////////////
[
        local,
        object,
        uuid(66f171ea-bd29-4936-b391-4225c6d7361a),
        pointer_default(unique)
]
interface IAssemblyFileInfo: IUnknown
{
    typedef [unique] IAssemblyFileInfo *LPASSEMBLY_FILE_INFO;

    typedef enum
    {
        ASM_FILE_NAME = 0,
        ASM_FILE_HASH,
        ASM_FILE_SIZE,
        ASM_FILE_MAX
    } ASM_FILE;


    HRESULT Set(
        [in] DWORD dwPropertyId, 
        [in] LPCOLESTR pwzProperty);

    HRESULT Get(
        [in]  DWORD dwPropertyId,
        [out] LPOLESTR *ppwzProperty,
        [out] LPDWORD  pccProperty);
}


///////////////////////////////////////////////////////////////////////////////
//
// IAssemblyIdentity
// 
///////////////////////////////////////////////////////////////////////////////
[
        local,
        object,
        uuid(aaa1257d-a56c-4383-9b4a-c868eda7ca42),
        pointer_default(unique)
]
interface IAssemblyIdentity: IUnknown
{
    typedef [unique] IAssemblyIdentity *LPASSEMBLY_IDENTITY;

    typedef enum
    {
        ASMID_DISPLAYNAME_NOMANGLING= 0,
        ASMID_DISPLAYNAME_WILDCARDED,
        ASMID_DISPLAYNAME_MAX
    } ASMID_DISPLAYNAME_FLAGS;

    HRESULT SetAttribute(
        [in] LPCOLESTR pwzName, 
        [in] LPCOLESTR pwzValue, 
        [in] DWORD ccValue);

    HRESULT GetAttribute(
        [in]       LPCOLESTR pwzName, 
        [out]      LPOLESTR *ppwzValue, 
        [out]      LPDWORD   pccValue);

    HRESULT GetDisplayName(
        [in]         DWORD    dwFlags,
        [out]        LPOLESTR *ppwzDisplayName, 
        [out]        LPDWORD  pccDisplayName);

    HRESULT IsEqual(
        [in] IAssemblyIdentity *pAssemblyId);
}


///////////////////////////////////////////////////////////////////////////////
//
// IManifestApplicationInfo
// 
///////////////////////////////////////////////////////////////////////////////
[
        local,
        object,
		uuid(1367877f-be85-40ab-b16c-44b9c23b1819),
        pointer_default(unique)
]
interface IManifestApplicationInfo: IUnknown
{
    typedef [unique] IManifestApplicationInfo *LPMANIFEST_APPLICATION_INFO;

	typedef enum
	{
		MAN_APPLICATION_FRIENDLYNAME= 0,
		MAN_APPLICATION_ENTRYPOINT,
		MAN_APPLICATION_ENTRYIMAGETYPE,
		MAN_APPLICATION_ICONFILE,
		MAN_APPLICATION_ICONINDEX,
		MAN_APPLICATION_SHOWCOMMAND,
		MAN_APPLICATION_HOTKEY,
	    MAN_APPLICATION_MAX
	} MAN_APPLICATION;

    HRESULT Set(
        [in] DWORD dwPropertyId, 
        [in] LPCOLESTR pwzProperty);

    HRESULT Get(
        [in]  DWORD dwPropertyId,
        [out] LPOLESTR *ppwzProperty,
        [out] LPDWORD  pccProperty);
    


}


///////////////////////////////////////////////////////////////////////////////
//
// IDependentAssemblyInfo
// 
///////////////////////////////////////////////////////////////////////////////
[
        local,
        object,
        uuid(c9629878-461a-451b-a032-eaca1cb5383a),
        pointer_default(unique)
]
interface IDependentAssemblyInfo: IUnknown
{
    typedef [unique] IDependentAssemblyInfo *LPDEPENDENT_ASSEMBLY_INFO;

    typedef enum
    {
        DEPENDENT_ASM_CODEBASE= 0,
        DEPENDENT_ASM_MAX
    } DEPENDENT_ASM;

    HRESULT SetAssemblyIdentity(
        [in] LPASSEMBLY_IDENTITY pAssemblyId);

    HRESULT GetAssemblyIdentity(
        [out] LPASSEMBLY_IDENTITY *ppAssemblyId);

    HRESULT Set(
        [in] DWORD dwPropertyId, 
        [in] LPCOLESTR pwzProperty);

    HRESULT Get(
        [in]  DWORD dwPropertyId,
        [out] LPOLESTR *ppwzProperty,
        [out] LPDWORD  pccProperty);


}


///////////////////////////////////////////////////////////////////////////////
//
// IAssemblyManifestImport
// 
///////////////////////////////////////////////////////////////////////////////
[
        local,
        object,
        uuid(696fb37f-da64-4175-94e7-fdc8234539c4),
        pointer_default(unique)
]
interface IAssemblyManifestImport: IUnknown
{
    typedef [unique] IAssemblyManifestImport *LPASSEMBLY_MANIFEST_IMPORT;

    typedef enum
    {
        MANIFEST_TYPE_UNKNOWN= 0,
        MANIFEST_TYPE_DESKTOP,
        MANIFEST_TYPE_SUBSCRIPTION,
        MANIFEST_TYPE_APPLICATION,
        MANIFEST_TYPE_MAX
    } MANIFEST_TYPE;

    HRESULT GetAssemblyIdentity(
        [out] IAssemblyIdentity        **ppAssemblyId);

    HRESULT GetManifestApplicationInfo(
        [out] IManifestApplicationInfo         **ppAppInfo);

    HRESULT GetPollingInterval(
        [out] DWORD     *pollingInterval);

    HRESULT GetNextFile(
        [in]    DWORD                  nIndex,
        [out]   IAssemblyFileInfo    **ppAssemblyFile);

    HRESULT QueryFile(
        [in]    LPCOLESTR               pwzFileName,
        [out]   IAssemblyFileInfo    **ppAssemblyFile);

    HRESULT GetNextAssembly(
        [in]    DWORD                  nIndex,
        [out]    IDependentAssemblyInfo    **ppDependAsm);

    HRESULT GetNextPatchAssemblyId(
        [in]    DWORD   nIndex,
        [out]   LPASSEMBLY_IDENTITY *ppAssemblyId);

    HRESULT GetTargetPatchMapping(
        [out]   LPWSTR pwzTarget,
        [out]   LPWSTR *ppwzSource,
        [out]   LPWSTR *ppwzPatchFile);

    HRESULT GetPatchFilePatchMapping(
        [out]   LPWSTR pwzPatchFile,
        [out]   LPWSTR *ppwzSource,
        [out]   LPWSTR *ppwzTarget);

    HRESULT SetPatchAssemblyNode(
        [in]   DWORD nIndex);

    HRESULT IsCABbed(
        [out]   LPWSTR *ppwzCabName);

    HRESULT ReportManifestType(
        [out]    DWORD                 *pdwType);
}

///////////////////////////////////////////////////////////////////////////////
//
// IAssemblyCacheImport
// 
///////////////////////////////////////////////////////////////////////////////
[
        local,
        object,
        uuid(c920b164-33e0-4c61-b595-eca4cdb04f12),
        pointer_default(unique)
]
interface IAssemblyCacheImport: IUnknown
{
    typedef [unique] IAssemblyCacheImport *LPASSEMBLY_CACHE_IMPORT;

    typedef enum
    {
        CACHEIMP_CREATE_NULL= 0,
        CACHEIMP_CREATE_RETRIEVE_EXIST,
        CACHEIMP_CREATE_RETRIEVE_EXIST_COMPLETED,
        CACHEIMP_CREATE_RETRIEVE_MAX_COMPLETED,
        CACHEIMP_CREATE_RESOLVE_REF,
        CACHEIMP_CREATE_RESOLVE_REF_EX,
        CACHEIMP_CREATE_MAX,
    } CACHEIMP_CREATE_FLAGS;
    
    HRESULT GetManifestImport(
        [out] IAssemblyManifestImport    **ppManifestImport);

    HRESULT GetManifestFilePath(
        [out]       LPOLESTR          *ppwzFilePath,
        [in, out]   LPDWORD            pccFilePath);

    HRESULT GetManifestFileDir(
        [out]       LPOLESTR          *ppwzFileDir,
        [in, out]   LPDWORD            pccFileDir);

    HRESULT GetDisplayName(
        [out]       LPOLESTR          *ppwzDisplayName,
        [in, out]   LPDWORD            pccDisplayName);

    HRESULT FindExistMatching(
        [in]       LPASSEMBLY_FILE_INFO  pAssemblyFileInfo,
        [out]      LPOLESTR             *ppwzPath);
}

///////////////////////////////////////////////////////////////////////////////
//
// IAssemblyCacheEmit
// 
///////////////////////////////////////////////////////////////////////////////
[
        local,
        object,
        uuid(83d6b9ac-eff9-45a3-8361-7c41df1f9f85),
        pointer_default(unique)
]
interface IAssemblyCacheEmit: IUnknown
{
    typedef [unique] IAssemblyCacheEmit *LPASSEMBLY_CACHE_EMIT;
        
    HRESULT GetManifestImport(
        [out] IAssemblyManifestImport    **ppManifestImport);

    HRESULT GetManifestFilePath(
        [out]       LPOLESTR          *ppwzFilePath,
        [in, out]   LPDWORD            pccFilePath);

    HRESULT GetManifestFileDir(
        [out]       LPOLESTR          *ppwzFilePath,
        [in, out]   LPDWORD            pccFilePath);

    HRESULT GetDisplayName(
        [out]       LPOLESTR          *ppwzDisplayName,
        [in, out]   LPDWORD            pccDisplayName);

    HRESULT CopyFile(
        [in]        LPOLESTR           pwzSourceFilePath,
        [in]        LPOLESTR           pwzFileName,
        [in]        DWORD              dwFlags);

    HRESULT Commit(
        [in]        DWORD              dwFlags);
}


///////////////////////////////////////////////////////////////////////////////
//
// IAssemblyDownload
// 
///////////////////////////////////////////////////////////////////////////////
[
        local,
        object,
        uuid(8a249b36-6132-4238-8871-a267029382a8),
        pointer_default(unique)
]
interface IAssemblyDownload: IBackgroundCopyCallback
{
    typedef [unique] IAssemblyDownload *LPASSEMBLY_DOWNLOAD;
        
    typedef enum
    {
        DOWNLOAD_FLAGS_NO_NOTIFICATION = 0x0,
        DOWNLOAD_FLAGS_PROGRESS_UI = 0x1,
        DOWNLOAD_FLAGS_NOTIFY_COMPLETION =0x2
    } ASM_DOWNLOAD;
   
    HRESULT DownloadManifestAndDependencies(
        [in]    LPWSTR pwzApplicationManifestUrl, HANDLE hNamedEvent, DWORD dwFlags);

}


#pragma midl_echo("STDAPI CreateAssemblyFileInfo(IAssemblyFileInfo** ppFile);")
#pragma midl_echo("STDAPI CreateAssemblyIdentity(LPASSEMBLY_IDENTITY *ppAssemblyId, DWORD dwFlags);")
#pragma midl_echo("STDAPI CreateAssemblyIdentityEx(LPASSEMBLY_IDENTITY *ppAssemblyId, DWORD dwFlags, LPWSTR wzDisplayName);")
#pragma midl_echo("STDAPI CloneAssemblyIdentity(LPASSEMBLY_IDENTITY pSrcAssemblyId, LPASSEMBLY_IDENTITY *ppDestAssemblyId);")
#pragma midl_echo("STDAPI CreateAssemblyManifestImport(LPASSEMBLY_MANIFEST_IMPORT *ppAssemblyManifestImport, LPCOLESTR szPath);")
#pragma midl_echo("STDAPI CreateAssemblyCacheImport(LPASSEMBLY_CACHE_IMPORT *ppAssemblyCacheImport, LPASSEMBLY_IDENTITY pAssemblyIdentity, DWORD dwFlags);")
#pragma midl_echo("STDAPI CreateAssemblyCacheEmit(LPASSEMBLY_CACHE_EMIT *ppAssemblyCacheEmit, LPASSEMBLY_CACHE_EMIT pAssemblyCacheEmit, DWORD dwFlags);")
#pragma midl_echo("STDAPI CreateAssemblyDownload(IAssemblyDownload** ppDownload);")
#pragma midl_echo("STDAPI CreateManifestApplicationInfo(LPMANIFEST_APPLICATION_INFO* ppManifestApplicationInfo);")
#pragma midl_echo("STDAPI CreateDependentAssemblyInfo(LPDEPENDENT_ASSEMBLY_INFO* ppDependentAssemblyInfo);")