
import "unknwn.idl";
import "messag.idl";
import "icust.idl";

cpp_quote("/****************************************************************************")
cpp_quote("	server.h")
cpp_quote("")
cpp_quote("	GENERATED FILE!!!  DO NOT EDIT!!!")
cpp_quote("	")
cpp_quote("	Owner: DavidMck")
cpp_quote(" 	Copyright (C) Microsoft Corporation, 1998 - 1999")
cpp_quote(" ")
cpp_quote("	This file contains the exported interfaces for Darwin's Server marshalling.")
cpp_quote("	It is generated by midl.exe from server.idl")
cpp_quote("****************************************************************************/")

cpp_quote("#ifndef SERVER_H")
cpp_quote("#define SERVER_H")

typedef enum iauthEnum // Authentication result enum
{
	iauthAccept,
	iauthReject,
	iauthCantValidate,
	iauthError
} iauthEnum;

// UI level, arg for IMsiEngine::Initialize, IMsiHandler::Initialize
typedef enum iuiEnum
{
	iuiFull = 0,  // 'F' complete UI functionality
	iuiReduced,   // 'R' non-progress related UI actions suppressed
	iuiBasic,     // 'B' internal engine UI, Message function only
	iuiNone,      // 'N' totally quiet UI
	iuiNextEnum
} iuiEnum;

typedef enum ipackTypeEnum // type of package to authenticate
{
	ipackTypePE,    // Windows PE (exe or dll)
	ipackTypeCAB,   // Cabinet file
	ipackTypeJava,  // Java class file
	ipackTypeOLE    // OLE storage file
} ipackTypeEnum;

typedef enum iesEnum  // return status from IMsiEngine::Sequence and DoAction
{
	iesNoAction       = 0,  // action not invoked
	iesSuccess        = 1,  // IDOK,     completed actions successfully
	iesUserExit       = 2,  // IDCANCEL, user terminated prematurely,$resume with next action
	iesFailure        = 3,  // IDABORT,  unrecoverable error occurred
	iesSuspend        = 4,  // IDRETRY,  sequence suspended, resume with same action
	iesFinished       = 5,  // IDIGNORE, skip remaining actions
	iesWrongState     = 6,  // calling sequence error, not in executable state
	iesBadActionData  = 7,  // invalid Action table record data
	iesInstallRunning = 8, // another install is in progress
	iesNextEnum
} iesEnum;

typedef enum ireEnum  // enumeration for 1st arg of CreateAndRunEngine
{
	ireProductCode,
	irePackagePath,
	ireSubStorage,
	ireDatabaseHandle,
 	ireInstallFinalize,
} ireEnum;

typedef enum iioEnum  // various options flags passed to IMsiEngine::Initialize
{
	iioUpgrade                   = 0x00000001,
	iioChild                     = 0x00000002,
	iioDisablePlatformValidation = 0x00000004,
	iioEndDialog                 = 0x00000008,
	iioCreatingAdvertiseScript   = 0x00000010,
	iioDisableRollback          = 0x00000020,
	iioMustAccessInstallerKey    = 0x00000040,    // Insist that we can access the installer key.
	iioReinstallModePackage      = 0x00000080,
	iioClientEngine              = 0x00000100,    // Used to indicate that we have a client engine.
	iioSimulateX86               = 0x00000200,    // ignore current execution platform and use X86, only valid w/ iioCreatingAdvertiseScript
	iioSimulateIA64              = 0x00000400,    // ignore current execution platform and use IA64, only valid w/ iioCreatingAdvertiseScript
	iioRestrictedEngine          = 0x00000800,    // create a "safe" engine that is not subject to machine state and cannot modify machine state
                   iioSimulateAMD64         = 0x00001000,     // ignore current execution platform and use AMD64, only valid w/iioCreateAdvertiseScript
} iioEnum;

typedef enum isrcEnum  // enumeration for sourcelist type to work with
{
	isrcNet     = 0,
	isrcMedia   = 1,
	isrcURL     = 2,	
} isrcEnum;

typedef enum icacCustomActionContext  // enumeration for types of custom action servers
{
	icacFirst = 0,
	icac32Impersonated = 0, 
	icac64Impersonated = 1,
	icac32Elevated     = 2,
	icac64Elevated     = 3,
	icacNext           = 4,
} icacCustomActionContext;

#ifdef UNICODE
typedef wchar_t	ichar;
#else
typedef char	ichar;
#endif //UNICODE


cpp_quote("#ifndef __cplusplus")
cpp_quote("typedef interface IMsiMessage IMsiMessage;")
cpp_quote("typedef interface IMsiCustomAction IMsiCustomAction;")
    typedef IMsiMessage *REF_IMsiMessage;
cpp_quote("#else // __cplusplus")
cpp_quote("#define REF_IMsiMessage IMsiMessage&")
cpp_quote("#endif")

[
	object,
	pointer_default(unique),
	uuid(000C101C-0000-0000-c000-000000000046)
	
]

interface IMsiServer : IUnknown
{
	typedef [unique] IMsiServer *PMSISERVER;

	[local]
	iesEnum InstallFinalize([in] iesEnum iesState, [in] REF_IMsiMessage riMessage, [in] boolean fUserChangedDuringInstall);
	[call_as(InstallFinalize)]
	HRESULT InstallFinalizeRemote([in] iesEnum iesState, [in] IMsiMessage* riMessage, [in] boolean fUserChangedDuringInstall, [out] iesEnum * iesRet);

	[local]
	IMsiRecord *SetLastUsedSource([in, string] const ichar *szProductCode, [in, string] const ichar *szPath,
									[in] boolean fAddToList, [in] boolean fPatch);
	[call_as(SetLastUsedSource)]
	HRESULT SetLastUsedSourceRemote([in, string] const ichar *szProductCode, [in, string] const ichar *szPath,
									[in] boolean fAddToList, [in] boolean fPatch, [out] int *pcb, [out, size_is(,*pcb)] char **pchRecordOut);

	[local]
	boolean RecordShutdownReason();
	[call_as(RecordShutdownReason)]
	HRESULT RecordShutdownReasonRemote([out] boolean *pfReturn);

	[local]
	boolean Reboot();
	[call_as(Reboot)]
	HRESULT RebootRemote([out] boolean *pfReturn);
   
	[local]
	int DoInstall([in] ireEnum ireProductCode, [in, string] const ichar *szProduct, [in, string, unique] const ichar *szAction,
						[in, string, unique] const ichar *szCommandLine, [in, string, unique] const ichar *szLogFile,
						[in] int iLogMode, [in] boolean fFlushEachLine, [in] REF_IMsiMessage riMessage, [in] iioEnum iioOptions);
	[call_as(DoInstall)]
	HRESULT DoInstallRemote([in] ireEnum ireProductCode, [in, string] const ichar *szProduct, [in, string, unique] const ichar *szAction,
						[in, string, unique] const ichar *szCommandLine,  [in, string, unique] const ichar *szLogFile,
						[in] int iLogMode, [in] boolean fFlushEachLine, [in] IMsiMessage *riMessage, [in] iioEnum iioOptions, [out] int *retVal);
	
	[local]
	IMsiRecord *RegisterUser([in, string] const ichar *szProductCode, [in, string, unique] const ichar *szUserName,
							 [in, string, unique] const ichar *szCompany, [in, string, unique] const ichar *szProductID);
	[call_as(RegisterUser)]
	HRESULT RegisterUserRemote([in, string] const ichar *szProductCode, [in, string, unique] const ichar *szUserName,
							   [in, string, unique] const ichar *szCompany, [in, string, unique] const ichar *szProductID,
							   [out] int *pcb, [out, size_is(,*pcb)] char **pchRecordOut);

	[local]
	IMsiRecord *RemoveRunOnceEntry([in, string] const ichar *szEntry);
	[call_as(RemoveRunOnceEntry)]
	HRESULT RemoveRunOnceEntryRemote([in, string] const ichar *szProductCode,
									 [out] int *pcb, [out, size_is(,*pcb)] char **pchRecordOut);

	[local]
	boolean CleanupTempPackages([in] REF_IMsiMessage riMessage);
	[call_as(CleanupTempPackages)]
	HRESULT CleanupTempPackagesRemote([in] IMsiMessage *riMessage, [out] boolean *pfReturn);

	[local]
	UINT SourceListClearByType([in, string] const ichar *szProductCode, [in, string, unique] const ichar *szUserName,
									  [in] isrcEnum isrcType);
	[call_as(SourceListClearByType)]
	HRESULT SourceListClearByTypeRemote([in, string] const ichar *szProductCode, [in, string, unique] const ichar *szUserName,
									  [in] isrcEnum isrcType, [out] unsigned int *retVal);

	[local]
	UINT SourceListAddSource([in, string] const ichar *szProductCode, [in, string, unique] const ichar *szUserName, [in] isrcEnum isrcType,
							 [in, string] const ichar *szSource);
	[call_as(SourceListAddSource)]
	HRESULT SourceListAddSourceRemote([in, string] const ichar *szProductCode, [in, string, unique] const ichar *szUserName, [in] isrcEnum isrcType,
									  [in, string] const ichar *szSource, [out] unsigned int *retVal);

	[local]
	UINT SourceListClearLastUsed([in, string] const ichar *szProductCode, [in, string, unique] const ichar *szUserName);
	[call_as(SourceListClearLastUsed)]
	HRESULT SourceListClearLastUsedRemote([in, string] const ichar *szProductCode, [in, string, unique] const ichar *szUserName, [out] unsigned int *retVal);

	[local]
	UINT RegisterCustomActionServer([in,out] icacCustomActionContext* picacContext, [in] const unsigned char *rgchCookie, [in] const int cbCookie, 
		[in, unique] IMsiCustomAction *piCustomAction, [out] unsigned long *dwProcessId, [out] IMsiRemoteAPI **piRemoteAPI, [out] DWORD *dwPrivileges);
	[call_as(RegisterCustomActionServer)]
	HRESULT RegisterCustomActionServerRemote([in, out] icacCustomActionContext* picacContext, [in, size_is(cbCookie)] const unsigned char *rgchCookie, [in] const int cbCookie, [in, unique] IMsiCustomAction *piCustomAction, [out] unsigned long *dwProcessId, 
		[out] IMsiRemoteAPI **piRemoteAPI, [out] DWORD* pdwPrivileges, [out] unsigned int *retVal);

	[local]
	UINT CreateCustomActionServer([in] const icacCustomActionContext icacContext, [in] const unsigned long dwProcessId, [in, unique] IMsiRemoteAPI *piRemoteAPI, 
		[in, size_is(cchEnvironment)] const WCHAR* pvEnvironment, [in] DWORD cchEnvironment, [in] DWORD dwPrivileges, [out] unsigned char *rgchCookie, [in, out] int *cbCookie, [out] IMsiCustomAction **piCustomAction, [out] unsigned long *dwServerProcessId);
	[call_as(CreateCustomActionServer)]
	HRESULT CreateCustomActionServerRemote([in] const icacCustomActionContext icacContext, [in] const unsigned long dwProcessId, [in, unique] IMsiRemoteAPI *piRemoteAPI,
		[in, size_is(cchEnvironment)] const WCHAR* pvEnvironment, [in] DWORD cchEnvironment, [in] DWORD dwPrivileges, [out, size_is(*cbCookie)] unsigned char *rgchCookie, [in, out] int *cbCookie, [out] IMsiCustomAction **piCustomAction, [out] unsigned long *dwServerProcessId, [out] unsigned int *retVal);
}	


cpp_quote("#endif // SERVER_H")


