blob: baaa4853fa1d0f740b807955dedcc58ceca9afd4 [file] [log] [blame]
#pragma once
//-------------------------------------------------------------------------------------------------
// <copyright file="wcawrapquery.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 wrappers meant to wrap an MSI view as
// opened by an immediate custom action and transmit it to a deferred custom action
// </summary>
//-------------------------------------------------------------------------------------------------
#include "wcautil.h"
// Enumerations
enum eWrapQueryAction
{
wqaTableBegin = 1,
wqaTableFinish,
wqaRowBegin,
wqaRowFinish
};
enum eColumnDataType
{
cdtString = 1,
cdtInt,
cdtStream,
cdtUnknown
};
enum eFormatMaskColumn
{
efmcColumn1 = 1,
efmcColumn2 = 1 << 1,
efmcColumn3 = 1 << 2,
efmcColumn4 = 1 << 3,
efmcColumn5 = 1 << 4,
efmcColumn6 = 1 << 5,
efmcColumn7 = 1 << 6,
efmcColumn8 = 1 << 7,
efmcColumn9 = 1 << 8,
efmcColumn10 = 1 << 9,
efmcColumn11 = 1 << 10,
efmcColumn12 = 1 << 11,
efmcColumn13 = 1 << 12,
efmcColumn14 = 1 << 13,
efmcColumn15 = 1 << 14,
efmcColumn16 = 1 << 15,
efmcColumn17 = 1 << 16,
efmcColumn18 = 1 << 17,
efmcColumn19 = 1 << 18,
efmcColumn20 = 1 << 19,
efmcColumn21 = 1 << 20,
efmcColumn22 = 1 << 21,
efmcColumn23 = 1 << 22,
efmcColumn24 = 1 << 23,
efmcColumn25 = 1 << 24,
efmcColumn26 = 1 << 25,
efmcColumn27 = 1 << 26,
efmcColumn28 = 1 << 27,
efmcColumn29 = 1 << 28,
efmcColumn30 = 1 << 29,
efmcColumn31 = 1 << 30,
efmcColumn32 = 1 << 31,
};
// Keeps track of the query instance for the reading CA (deferred CA)
typedef struct WCA_WRAPQUERY_STRUCT
{
// These are used to size our dynamic arrays below
DWORD dwColumns, dwRows, dwNextIndex;
// Dynamic arrays of column schema information
eColumnDataType *pcdtColumnType;
LPWSTR *ppwzColumnNames;
// Dynamic array of raw record data
MSIHANDLE *phRecords;
} *WCA_WRAPQUERY_HANDLE;
// Wrap a query
// Setting the pfFormatMask enables control over which fields will be formatted, and which will be left unchanged
// Setting dwComponentColumn to something other than 0xFFFFFFFF tells WcaWrapQuery to add two additional columns to the right side of the table
// - ISInstalled and ISAction - which map to the ComponentState of the component (the component is found in the column specified)
// Note that if a component is NULL, the component state columns will also be left null, and it will be up to the deferred CA to fail or ignore the case appropriately
// Setting dwDirectoryColumn to something other than 0xFFFFFFFF tells WcaWrapQuery to add two more additional columns to the right side of the table
// - SourcePath and TargetPath - which map to the Directory's Source and Target Path (the directory is found in the column specified)
// Note that if a directory is NULL, the directory source/target path columns will also be left null, and it will be up to the deferred CA to fail or ignore the case appropriately
HRESULT WIXAPI WcaWrapQuery(
__in_z LPCWSTR pwzQuery,
__inout LPWSTR * ppwzCustomActionData,
__in_opt DWORD dwFormatMask,
__in_opt DWORD dwComponentColumn,
__in_opt DWORD dwDirectoryColumn
);
// This wraps an empty table query into the custom action data - this is a way to indicate to the deferred custom action that a necessary table doesn't exist, or its query returned no results
HRESULT WIXAPI WcaWrapEmptyQuery(
__inout LPWSTR * ppwzCustomActionData
);
// Open a new unwrap query operation, with data from the ppwzCustomActionData string
HRESULT WIXAPI WcaBeginUnwrapQuery(
__out WCA_WRAPQUERY_HANDLE * phWrapQuery,
__inout LPWSTR * ppwzCustomActionData
);
// Get the number of records in a query being unwrapped
DWORD WIXAPI WcaGetQueryRecords(
__in const WCA_WRAPQUERY_HANDLE hWrapQuery
);
// This function resets a query back to its first row, so that the next fetch returns the first record
void WIXAPI WcaFetchWrappedReset(
__in WCA_WRAPQUERY_HANDLE hWrapQuery
);
// Fetch the next record in this query
// NOTE: the MSIHANDLE returned by this function should not be released, as it is the same handle used by the query object to maintain the item.
// so, don't use this function with PMSIHANDLE objects!
HRESULT WIXAPI WcaFetchWrappedRecord(
__in WCA_WRAPQUERY_HANDLE hWrapQuery,
__out MSIHANDLE* phRec
);
// Fetch the next record in the query where the string value in column dwComparisonColumn equals the value pwzExpectedValue
// NOTE: the MSIHANDLE returned by this function should not be released, as it is the same handle used by the query object to maintain the item.
// so, don't use this function with PMSIHANDLE objects!
HRESULT WIXAPI WcaFetchWrappedRecordWhereString(
__in WCA_WRAPQUERY_HANDLE hWrapQuery,
__in DWORD dwComparisonColumn,
__in_z LPCWSTR pwzExpectedValue,
__out MSIHANDLE* phRec
);
// Release a query ID (frees memory, and frees the ID for a new query)
void WIXAPI WcaFinishUnwrapQuery(
__in_opt WCA_WRAPQUERY_HANDLE hWrapQuery
);