blob: 487690d8210ab97ddd1933f4fa884616e20d9157 [file] [log] [blame]
#pragma once
//-------------------------------------------------------------------------------------------------
// <copyright file="wcautil.h" company="Outercurve Foundation">
// Copyright (c) 2004, Outercurve Foundation.
// This software is released under Microsoft Reciprocal License (MS-RL).
// The license and further copyright text can be found in the file
// LICENSE.TXT at the root directory of the distribution.
// </copyright>
//
// <summary>
// Windows Installer XML CustomAction utility library.
// </summary>
//-------------------------------------------------------------------------------------------------
#ifdef __cplusplus
extern "C" {
#endif
#define WIXAPI __stdcall
#define ExitTrace WcaLogError
#define ExitTrace1 WcaLogError
#define ExitTrace2 WcaLogError
#define ExitTrace3 WcaLogError
#include "dutil.h"
#define MessageExitOnLastError(x, e, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ExitTrace(x, "%s", s); WcaErrorMessage(e, x, MB_OK, 0); goto LExit; } }
#define MessageExitOnLastError1(x, e, f, s) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (FAILED(x)) { ExitTrace1(x, f, s); WcaErrorMessage(e, x, MB_OK, 1, s); goto LExit; } }
#define MessageExitOnFailure(x, e, s) if (FAILED(x)) { ExitTrace(x, "%s", s); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 0); goto LExit; }
#define MessageExitOnFailure1(x, e, f, s) if (FAILED(x)) { ExitTrace1(x, f, s); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 1, s); goto LExit; }
#define MessageExitOnFailure2(x, e, f, s, t) if (FAILED(x)) { ExitTrace2(x, f, s, t); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 2, s, t); goto LExit; }
#define MessageExitOnFailure3(x, e, f, s, t, u) if (FAILED(x)) { ExitTrace2(x, f, s, t, u); WcaErrorMessage(e, x, INSTALLMESSAGE_ERROR | MB_OK, 3, s, t, u); goto LExit; }
#define MessageExitOnNullWithLastError(p, x, e, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, "%s", s); WcaErrorMessage(e, x, MB_OK, 0); goto LExit; }
#define MessageExitOnNullWithLastError1(p, x, e, f, s) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, f, s); WcaErrorMessage(e, x, MB_OK, 1, s); goto LExit; }
#define MessageExitOnNullWithLastError2(p, x, e, f, s, t) if (NULL == p) { x = ::GetLastError(); x = HRESULT_FROM_WIN32(x); if (!FAILED(x)) { x = E_FAIL; } ExitTrace(x, f, s, t); WcaErrorMessage(e, x, MB_OK, 2, s, t); goto LExit; }
// Generic action enum.
enum WCA_ACTION
{
WCA_ACTION_NONE,
WCA_ACTION_INSTALL,
WCA_ACTION_UNINSTALL,
};
enum WCA_CASCRIPT
{
WCA_CASCRIPT_SCHEDULED,
WCA_CASCRIPT_ROLLBACK,
};
enum WCA_CASCRIPT_CLOSE
{
WCA_CASCRIPT_CLOSE_PRESERVE,
WCA_CASCRIPT_CLOSE_DELETE,
};
enum WCA_TODO
{
WCA_TODO_UNKNOWN,
WCA_TODO_INSTALL,
WCA_TODO_UNINSTALL,
WCA_TODO_REINSTALL,
};
typedef struct WCA_CASCRIPT_STRUCT
{
LPWSTR pwzScriptPath;
HANDLE hScriptFile;
} *WCA_CASCRIPT_HANDLE;
void WIXAPI WcaGlobalInitialize(
__in HINSTANCE hInst
);
void WIXAPI WcaGlobalFinalize();
HRESULT WIXAPI WcaInitialize(
__in MSIHANDLE hInstall,
__in_z PCSTR szCustomActionLogName
);
UINT WIXAPI WcaFinalize(
__in UINT iReturnValue
);
BOOL WIXAPI WcaIsInitialized();
MSIHANDLE WIXAPI WcaGetInstallHandle();
MSIHANDLE WIXAPI WcaGetDatabaseHandle();
const char* WIXAPI WcaGetLogName();
void WIXAPI WcaSetReturnValue(
__in UINT iReturnValue
);
BOOL WIXAPI WcaCancelDetected();
const int LOG_BUFFER = 2048;
enum LOGLEVEL
{
LOGMSG_TRACEONLY, // Never written to the log file (except in DEBUG builds)
LOGMSG_VERBOSE, // Written to log when LOGVERBOSE
LOGMSG_STANDARD // Written to log whenever informational logging is enabled
};
void __cdecl WcaLog(
__in LOGLEVEL llv,
__in_z __format_string PCSTR fmt, ...
);
BOOL WIXAPI WcaDisplayAssert(
__in LPCSTR sz
);
void __cdecl WcaLogError(
__in HRESULT hr,
__in LPCSTR szMessage,
...
);
UINT WIXAPI WcaProcessMessage(
__in INSTALLMESSAGE eMessageType,
__in MSIHANDLE hRecord
);
UINT __cdecl WcaErrorMessage(
__in int iError,
__in HRESULT hrError,
__in UINT uiType,
__in DWORD cArgs,
...
);
HRESULT WIXAPI WcaProgressMessage(
__in UINT uiCost,
__in BOOL fExtendProgressBar
);
BOOL WIXAPI WcaIsInstalling(
__in INSTALLSTATE isInstalled,
__in INSTALLSTATE isAction
);
BOOL WIXAPI WcaIsReInstalling(
__in INSTALLSTATE isInstalled,
__in INSTALLSTATE isAction
);
BOOL WIXAPI WcaIsUninstalling(
__in INSTALLSTATE isInstalled,
__in INSTALLSTATE isAction
);
HRESULT WIXAPI WcaSetComponentState(
__in_z LPCWSTR wzComponent,
__in INSTALLSTATE isState
);
HRESULT WIXAPI WcaTableExists(
__in_z LPCWSTR wzTable
);
HRESULT WIXAPI WcaOpenView(
__in_z LPCWSTR wzSql,
__out MSIHANDLE* phView
);
HRESULT WIXAPI WcaExecuteView(
__in MSIHANDLE hView,
__in MSIHANDLE hRec
);
HRESULT WIXAPI WcaOpenExecuteView(
__in_z LPCWSTR wzSql,
__out MSIHANDLE* phView
);
HRESULT WIXAPI WcaFetchRecord(
__in MSIHANDLE hView,
__out MSIHANDLE* phRec
);
HRESULT WIXAPI WcaFetchSingleRecord(
__in MSIHANDLE hView,
__out MSIHANDLE* phRec
);
HRESULT WIXAPI WcaGetProperty(
__in_z LPCWSTR wzProperty,
__inout LPWSTR* ppwzData
);
HRESULT WIXAPI WcaGetFormattedProperty(
__in_z LPCWSTR wzProperty,
__out LPWSTR* ppwzData
);
HRESULT WIXAPI WcaGetFormattedString(
__in_z LPCWSTR wzString,
__out LPWSTR* ppwzData
);
HRESULT WIXAPI WcaGetIntProperty(
__in_z LPCWSTR wzProperty,
__inout int* piData
);
HRESULT WIXAPI WcaGetTargetPath(
__in_z LPCWSTR wzFolder,
__out LPWSTR* ppwzData
);
HRESULT WIXAPI WcaSetProperty(
__in_z LPCWSTR wzPropertyName,
__in_z LPCWSTR wzPropertyValue
);
HRESULT WIXAPI WcaSetIntProperty(
__in_z LPCWSTR wzPropertyName,
__in int nPropertyValue
);
BOOL WIXAPI WcaIsPropertySet(
__in LPCSTR szProperty
);
BOOL WIXAPI WcaIsUnicodePropertySet(
__in LPCWSTR wzProperty
);
HRESULT WIXAPI WcaGetRecordInteger(
__in MSIHANDLE hRec,
__in UINT uiField,
__inout int* piData
);
HRESULT WIXAPI WcaGetRecordString(
__in MSIHANDLE hRec,
__in UINT uiField,
__inout LPWSTR* ppwzData
);
HRESULT WIXAPI WcaGetRecordFormattedInteger(
__in MSIHANDLE hRec,
__in UINT uiField,
__out int* piData
);
HRESULT WIXAPI WcaGetRecordFormattedString(
__in MSIHANDLE hRec,
__in UINT uiField,
__inout LPWSTR* ppwzData
);
HRESULT WIXAPI WcaAllocStream(
__deref_out_bcount_part(cbData, 0) BYTE** ppbData,
__in DWORD cbData
);
HRESULT WIXAPI WcaFreeStream(
__in BYTE* pbData
);
HRESULT WIXAPI WcaGetRecordStream(
__in MSIHANDLE hRecBinary,
__in UINT uiField,
__deref_out_bcount_full(*pcbData) BYTE** ppbData,
__out DWORD* pcbData
);
HRESULT WIXAPI WcaSetRecordString(
__in MSIHANDLE hRec,
__in UINT uiField,
__in_z LPCWSTR wzData
);
HRESULT WIXAPI WcaSetRecordInteger(
__in MSIHANDLE hRec,
__in UINT uiField,
__in int iValue
);
HRESULT WIXAPI WcaDoDeferredAction(
__in_z LPCWSTR wzAction,
__in_z LPCWSTR wzCustomActionData,
__in UINT uiCost
);
DWORD WIXAPI WcaCountOfCustomActionDataRecords(
__in_z LPCWSTR wzData
);
HRESULT WIXAPI WcaReadStringFromCaData(
__deref_in LPWSTR* ppwzCustomActionData,
__deref_out_z LPWSTR* ppwzString
);
HRESULT WIXAPI WcaReadIntegerFromCaData(
__deref_in LPWSTR* ppwzCustomActionData,
__out int* piResult
);
HRESULT WIXAPI WcaReadStreamFromCaData(
__deref_in LPWSTR* ppwzCustomActionData,
__deref_out_bcount(*pcbData) BYTE** ppbData,
__out DWORD_PTR* pcbData
);
HRESULT WIXAPI WcaWriteStringToCaData(
__in_z LPCWSTR wzString,
__deref_inout_z LPWSTR* ppwzCustomActionData
);
HRESULT WIXAPI WcaWriteIntegerToCaData(
__in int i,
__deref_out_z_opt LPWSTR* ppwzCustomActionData
);
HRESULT WIXAPI WcaWriteStreamToCaData(
__in_bcount(cbData) const BYTE* pbData,
__in DWORD cbData,
__deref_inout_z_opt LPWSTR* ppwzCustomActionData
);
HRESULT __cdecl WcaAddTempRecord(
__inout MSIHANDLE* phTableView,
__inout MSIHANDLE* phColumns,
__in_z LPCWSTR wzTable,
__out_opt MSIDBERROR* pdbError,
__in UINT uiUniquifyColumn,
__in UINT cColumns,
...
);
HRESULT WIXAPI WcaDumpTable(
__in_z LPCWSTR wzTable
);
HRESULT WIXAPI WcaDeferredActionRequiresReboot();
BOOL WIXAPI WcaDidDeferredActionRequireReboot();
HRESULT WIXAPI WcaCaScriptCreateKey(
__out LPWSTR* ppwzScriptKey
);
HRESULT WIXAPI WcaCaScriptCreate(
__in WCA_ACTION action,
__in WCA_CASCRIPT script,
__in BOOL fImpersonated,
__in_z LPCWSTR wzScriptKey,
__in BOOL fAppend,
__out WCA_CASCRIPT_HANDLE* phScript
);
HRESULT WIXAPI WcaCaScriptOpen(
__in WCA_ACTION action,
__in WCA_CASCRIPT script,
__in BOOL fImpersonated,
__in_z LPCWSTR wzScriptKey,
__out WCA_CASCRIPT_HANDLE* phScript
);
void WIXAPI WcaCaScriptClose(
__in_opt WCA_CASCRIPT_HANDLE hScript,
__in WCA_CASCRIPT_CLOSE closeOperation
);
HRESULT WIXAPI WcaCaScriptReadAsCustomActionData(
__in WCA_CASCRIPT_HANDLE hScript,
__out LPWSTR* ppwzCustomActionData
);
HRESULT WIXAPI WcaCaScriptWriteString(
__in WCA_CASCRIPT_HANDLE hScript,
__in_z LPCWSTR wzValue
);
HRESULT WIXAPI WcaCaScriptWriteNumber(
__in WCA_CASCRIPT_HANDLE hScript,
__in DWORD dwValue
);
void WIXAPI WcaCaScriptFlush(
__in WCA_CASCRIPT_HANDLE hScript
);
void WIXAPI WcaCaScriptCleanup(
__in_z LPCWSTR wzProductCode,
__in BOOL fImpersonated
);
HRESULT WIXAPI QuietExec(
__inout_z LPWSTR wzCommand,
__in DWORD dwTimeout
);
WCA_TODO WIXAPI WcaGetComponentToDo(
__in_z LPCWSTR wzComponentId
);
#ifdef __cplusplus
}
#endif