//*************************************************************
//
// appmgmt.h
//
// APIs for operations on MSI applications which are deployed
// and managed in the NT Directory.
//
// Copyright (c) Microsoft Corporation 1998-1999
// All rights reserved
//
//*************************************************************

#ifndef _APPMGMT_H_
#define _APPMGMT_H_

#if _MSC_VER > 1000
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

typedef enum _INSTALLSPECTYPE
{
    APPNAME = 1,
    FILEEXT,
    PROGID,
    COMCLASS
} INSTALLSPECTYPE;

typedef union _INSTALLSPEC
{
    struct
    {
        WCHAR * Name;
        GUID    GPOId;
    } AppName;
    WCHAR * FileExt;
    WCHAR * ProgId;
    struct
    {
        GUID    Clsid;
        DWORD   ClsCtx;
    } COMClass;
} INSTALLSPEC;

typedef struct _INSTALLDATA
{
    INSTALLSPECTYPE Type;
    INSTALLSPEC     Spec;
} INSTALLDATA, *PINSTALLDATA;

typedef enum
{
    ABSENT,
    ASSIGNED,
    PUBLISHED
} APPSTATE;

#define LOCALSTATE_ASSIGNED                 0x1     // app is assigned
#define LOCALSTATE_PUBLISHED                0x2     // app is published
#define LOCALSTATE_UNINSTALL_UNMANAGED      0x4     // uninstall any unmanaged version before assigning
#define LOCALSTATE_POLICYREMOVE_ORPHAN      0x8     // app is orphaned when policy removed
#define LOCALSTATE_POLICYREMOVE_UNINSTALL   0x10    // app is uninstalled when policy removed
#define LOCALSTATE_ORPHANED                 0x20    // app is orphaned after being applied
#define LOCALSTATE_UNINSTALLED              0x40    // app is uninstalled after being applied

typedef struct _LOCALMANAGEDAPPLICATION
{
    LPWSTR      pszDeploymentName;
    LPWSTR      pszPolicyName;
    LPWSTR      pszProductId;
    DWORD       dwState;
} LOCALMANAGEDAPPLICATION, *PLOCALMANAGEDAPPLICATION;

#define MANAGED_APPS_USERAPPLICATIONS  0x1
#define MANAGED_APPS_FROMCATEGORY      0x2
#define MANAGED_APPS_INFOLEVEL_DEFAULT 0x10000

#define MANAGED_APPTYPE_WINDOWSINSTALLER 0x1
#define MANAGED_APPTYPE_SETUPEXE         0x2
#define MANAGED_APPTYPE_UNSUPPORTED      0x3

typedef struct _MANAGEDAPPLICATION
{
    LPWSTR      pszPackageName;
    LPWSTR      pszPublisher;
    DWORD       dwVersionHi;
    DWORD       dwVersionLo;
    DWORD       dwRevision;
    GUID        GpoId;
    LPWSTR      pszPolicyName;
    GUID        ProductId;
    LANGID      Language;
    LPWSTR      pszOwner;
    LPWSTR      pszCompany;
    LPWSTR      pszComments;
    LPWSTR      pszContact;
    LPWSTR      pszSupportUrl;
    DWORD       dwPathType;
    BOOL        bInstalled;
} MANAGEDAPPLICATION, *PMANAGEDAPPLICATION;

typedef struct _APPCATEGORYINFO
{
    LCID        Locale;
    LPWSTR      pszDescription;
    GUID        AppCategoryId;
} APPCATEGORYINFO;

typedef struct _APPCATEGORYINFOLIST
{
    DWORD               cCategory;
#ifdef MIDL_PASS
    [size_is(cCategory)]
#endif
    APPCATEGORYINFO *   pCategoryInfo;
} APPCATEGORYINFOLIST;

#ifndef WINAPI
#define WINAPI
#endif

DWORD WINAPI
InstallApplication(
    PINSTALLDATA pInstallInfo
    );

DWORD WINAPI
UninstallApplication(
    WCHAR *     ProductCode,
    DWORD       dwStatus
    );

DWORD WINAPI
CommandLineFromMsiDescriptor(
    WCHAR *     Descriptor,
    WCHAR *     CommandLine,
    DWORD *     CommandLineLength
    );

DWORD WINAPI
GetManagedApplications(
    GUID *               pCategory,
    DWORD                dwQueryFlags,
    DWORD                dwInfoLevel,
    LPDWORD              pdwApps,
    PMANAGEDAPPLICATION* prgManagedApps
    );

DWORD WINAPI
GetLocalManagedApplications(
    BOOL                        bUserApps,
    LPDWORD                     pdwApps,
    PLOCALMANAGEDAPPLICATION*   prgLocalApps
    );

void WINAPI
GetLocalManagedApplicationData(
    WCHAR *             ProductCode,
    LPWSTR *            DisplayName,
    LPWSTR *            SupportUrl
    );

DWORD WINAPI
GetManagedApplicationCategories(
    DWORD                dwReserved,
    APPCATEGORYINFOLIST* pAppCategory
    );

#ifdef __cplusplus
}
#endif

#endif