141 lines
5.5 KiB
C
141 lines
5.5 KiB
C
#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
|
|
);
|