//////////////////////////////////////////////////////////////////////////////////////////////////////// // // Microsoft WMI OLE DB Provider // (C) Copyright 1999 Microsoft Corporation. All Rights Reserved. // // Parameter handling Routines // //////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _UTLPARAM_H_ #define _UTLPARAM_H_ #define PARAM_MARKER L'?' class CCommand; const BYTE PARAMINFO_CONVERT_IUNKNOWN = 0x01; const DWORD CUTLPARAM_DEFAULT_PARAMS = 0x00000001; //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Parameter information struct. // //////////////////////////////////////////////////////////////////////////////////////////////////////// struct PARAMINFO { LPWSTR pwszParamName; //parameter name DBPARAMFLAGS dwFlags; //parameter flags DBLENGTH cbColLength; //max length of param as represented DBLENGTH cbValueMax; //max length of the param as represented by the OLE DB type DBLENGTH ulParamSize; //max length of the param as defined for ICommandWithParameters::GetParameterInfo DBSTATUS dwStatus; //status flags DBTYPE wOLEDBType; //corresponding OLE DB type LONG CIMType; BYTE * pbData; LONG Flavor; DBORDINAL iOrdinal; PARAMINFO() { this->Init(); } ~PARAMINFO() { delete pwszParamName; } void Init() { pwszParamName = NULL; dwFlags = 0; cbColLength = 0;cbValueMax = 0; dwStatus = 0;wOLEDBType = 0; pbData = NULL; } }; typedef PARAMINFO *PPARAMINFO; struct WMIBINDINFO { DBBINDING* pBinding; // Original binding data PARAMINFO* pParamInfo; // Parameter information WMIBINDINFO* pNextBindInfo; // Next binding for the output parameter WORD wFlags; // Flags WORD iBatchedRPC; // Index to which batched RPC this param was used }; typedef WMIBINDINFO *PWMIBINDINFO; // Get binding inline DBBINDING* GetBinding(PWMIBINDINFO pBindInfo) { if (pBindInfo->wFlags & DBPARAMIO_INPUT){ for (; pBindInfo; pBindInfo = pBindInfo->pNextBindInfo){ if (pBindInfo->pBinding->eParamIO & DBPARAMIO_INPUT){ break; } assert(pBindInfo); } } return pBindInfo->pBinding; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Utility class for parameter and binding information // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class CUtlParam { private: ULONG m_cRef; // reference count DBPARAMS m_dbparams; // parameters ULONG_PTR m_cbRowSize; // # of bytes allocated for a single set of params CImpIAccessor* m_pIAccessor; // accessor interface ULONG m_cParams; // # of parameters in the command WMIBINDINFO* m_prgBindInfo; //@cmember binding information PPARAMINFO* m_rgpParamInfo; // parm info derived from bind info ULONG m_cParamInfo; // # of param info structs derived // from the bind info DWORD m_dwStatus; // status information public: CUtlParam(); ~CUtlParam(); // Increments the Reference count STDMETHODIMP_(ULONG) AddRef(void); // Decrements the Reference count STDMETHODIMP_(ULONG) Release(void); // Get the number parameters in the command ULONG CParams() const { return m_cParams; } // Get the number parameter sets ULONG CParamSets() const { return (ULONG)m_dbparams.cParamSets; } // Are there any default parameters? BOOL FHaveDefaultParams() const { return (m_dwStatus & CUTLPARAM_DEFAULT_PARAMS) != 0; } //================================================================================== // Builds the binding information needed to execute a command with parameters //================================================================================== STDMETHODIMP BuildBindInfo( CCommand *pcmd, DBPARAMS *pParams, const IID* piid ); //================================================================================== // Builds the parameter information for the command from the binding information. //================================================================================== STDMETHODIMP BuildParamInfo( CCommand *pcmd, // IN | Command Structure const IID* piid // IN | Interface that invoked this method ); // Get the parameter information for a parameter inline PARAMINFO* GetParamInfo(ULONG iParam) const { return NULL; } // Set the status data for a parameter inline void SetStatus(DBBINDING *pBind, DBSTATUS dbstatus) { if (pBind->dwPart & DBPART_STATUS) { BYTE *pbData; ULONG iParamSet; for ( pbData = (BYTE*)m_dbparams.pData, iParamSet = 0; iParamSet < m_dbparams.cParamSets; pbData += m_cbRowSize, iParamSet++ ) { *(DBSTATUS *)(pbData + pBind->obStatus) = dbstatus; } } } // Bind a parameter to its data void BindParamData( ULONG iParamSet, ULONG iParam, DBBINDING* pBinding,BYTE** ppbValue, DWORD** ppdwLength, DWORD* pdwLength,DBSTATUS** ppdwStatus, DBSTATUS* pdwStatus, DBTYPE* pdbtype ); // Bind the pointers to parameter data inline void BindParamPtrs ( ULONG iParamSet, // IN | parameter set ordinal ULONG iParam, // IN | parameter ordinal DBBINDING* pBinding, // IN | Binding information BYTE** ppbValue, // OUT | pointer to the param value DWORD** ppdwLength, // OUT | pointer to the length of param value DBSTATUS** ppdwStatus // OUT | pointer to the status for the param ) { assert(iParamSet && iParamSet <= m_dbparams.cParamSets); assert(iParam && iParam <= m_cParams); assert(pBinding); assert(pBinding->iOrdinal == iParam); assert(ppbValue); assert(ppdwLength); assert(ppdwStatus); BYTE* pbData = (BYTE*)m_dbparams.pData + (iParamSet-1)*m_cbRowSize; *ppbValue = (pBinding->dwPart & DBPART_VALUE) ? pbData + pBinding->obValue : NULL; *ppdwStatus = (pBinding->dwPart & DBPART_STATUS) ? (DBSTATUS*)(pbData + pBinding->obStatus) : NULL; *ppdwLength = (pBinding->dwPart & DBPART_LENGTH) ? (DWORD*)(pbData + pBinding->obLength) : NULL; } // Bind a parameter to its data inline BOOL FIsDefaultParam ( ULONG iParamSet, // IN | parameter set ordinal ULONG iParam, // IN | parameter ordinal DBBINDING* pBinding // IN | Binding information ) { assert(iParamSet && iParamSet <= m_dbparams.cParamSets); assert(iParam && iParam <= m_cParams); assert(pBinding); assert(pBinding->iOrdinal == iParam); if (pBinding->dwPart & DBPART_STATUS) { BYTE* pbData = (BYTE*)m_dbparams.pData + (iParamSet-1)*m_cbRowSize; assert(!IsBadReadPtr(pbData+pBinding->obStatus,sizeof(DBSTATUS))); if (DBSTATUS_S_DEFAULT == *((DBSTATUS*)(pbData + pBinding->obStatus))) return TRUE; } return FALSE; } // Get the length of the bound data ULONG GetBindLength ( DBBINDING *pBinding, // IN | Binding information DWORD* pdwLength, // IN | bound length BYTE *pbData // IN | Pointer to param data ); // Set bind status for parameters to DBSTATUS_E_UNAVAILABLE void SetParamsUnavailable(ULONG iParamSetFailed, ULONG iParamFailed,BOOL fBackOut); }; typedef CUtlParam *PCUTLPARAM; #endif // UTLPARAM