//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1995 - 1999 // // File: viewcol.cpp // // Contents: IEnumCERTVIEWCOLUMN IDispatch helper functions // //-------------------------------------------------------------------------- #include #pragma hdrstop #include #include "csdisp.h" #include "csprop.h" #define __dwFILE__ __dwFILE_CERTLIB_VIEWCOL_CPP__ //+------------------------------------------------------------------------ // IEnumCERTVIEWCOLUMN dispatch support //+------------------------------------ // OpenConnection method: static OLECHAR *_apszNext[] = { TEXT("Next"), }; //+------------------------------------ // GetName method: static OLECHAR *_apszGetName[] = { TEXT("GetName"), }; //+------------------------------------ // GetDisplayName method: static OLECHAR *_apszGetDisplayName[] = { TEXT("GetDisplayName"), }; //+------------------------------------ // GetType method: static OLECHAR *_apszGetType[] = { TEXT("GetType"), }; //+------------------------------------ // IsIndexed method: static OLECHAR *_apszIsIndexed[] = { TEXT("IsIndexed"), }; //+------------------------------------ // GetMaxLength method: static OLECHAR *_apszGetMaxLength[] = { TEXT("GetMaxLength"), }; //+------------------------------------ // GetValue method: static OLECHAR *_apszGetValue[] = { TEXT("GetValue"), TEXT("Flags"), }; //+------------------------------------ // Skip method: static OLECHAR *_apszSkip[] = { TEXT("Skip"), TEXT("celt"), }; //+------------------------------------ // Reset method: static OLECHAR *_apszReset[] = { TEXT("Reset"), }; //+------------------------------------ // Clone method: static OLECHAR *_apszClone[] = { TEXT("Clone"), }; //+------------------------------------ // Dispatch Table: DISPATCHTABLE g_adtViewColumn[] = { #define VIEWCOL_NEXT 0 DECLARE_DISPATCH_ENTRY(_apszNext) #define VIEWCOL_GETNAME 1 DECLARE_DISPATCH_ENTRY(_apszGetName) #define VIEWCOL_GETDISPLAYNAME 2 DECLARE_DISPATCH_ENTRY(_apszGetDisplayName) #define VIEWCOL_GETTYPE 3 DECLARE_DISPATCH_ENTRY(_apszGetType) #define VIEWCOL_ISINDEXED 4 DECLARE_DISPATCH_ENTRY(_apszIsIndexed) #define VIEWCOL_GETMAXLENGTH 5 DECLARE_DISPATCH_ENTRY(_apszGetMaxLength) #define VIEWCOL_GETVALUE 6 DECLARE_DISPATCH_ENTRY(_apszGetValue) #define VIEWCOL_SKIP 7 DECLARE_DISPATCH_ENTRY(_apszSkip) #define VIEWCOL_RESET 8 DECLARE_DISPATCH_ENTRY(_apszReset) #define VIEWCOL_CLONE 9 DECLARE_DISPATCH_ENTRY(_apszClone) }; #define CVIEWCOLDISPATCH (ARRAYSIZE(g_adtViewColumn)) HRESULT ViewColumn_Init2( IN BOOL fIDispatch, IN IEnumCERTVIEWCOLUMN *pEnumColumn, OUT DISPATCHINTERFACE *pdiViewColumn) { HRESULT hr; IDispatch *pDispatch = NULL; static BOOL s_fInitialized = FALSE; pdiViewColumn->pDispatchTable = NULL; pdiViewColumn->pDispatch = NULL; pdiViewColumn->pUnknown = NULL; if (fIDispatch) { hr = pEnumColumn->QueryInterface( IID_IDispatch, (VOID **) &pDispatch); _JumpIfError(hr, error, "QueryInterface"); hr = DispatchGetIds( pDispatch, CVIEWCOLDISPATCH, g_adtViewColumn, pdiViewColumn); _JumpIfError(hr, error, "DispatchGetIds"); pdiViewColumn->pDispatch = pDispatch; pDispatch = NULL; } else { pEnumColumn->AddRef(); pdiViewColumn->pUnknown = (IUnknown *) pEnumColumn; hr = S_OK; } pdiViewColumn->pDispatchTable = g_adtViewColumn; error: if (NULL != pDispatch) { pDispatch->Release(); } return(hr); } VOID ViewColumn_Release( IN OUT DISPATCHINTERFACE *pdiViewColumn) { DispatchRelease(pdiViewColumn); } HRESULT ViewColumn_Next( IN DISPATCHINTERFACE *pdiViewColumn, OUT LONG *pIndex) { HRESULT hr; CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable); if (NULL != pdiViewColumn->pDispatch) { hr = DispatchInvoke( pdiViewColumn, VIEWCOL_NEXT, 0, NULL, VT_I4, pIndex); _JumpIfError2(hr, error, "Invoke(Next)", S_FALSE); } else { hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Next(pIndex); _JumpIfError2(hr, error, "Next", S_FALSE); } error: return(hr); } HRESULT ViewColumn_GetName( IN DISPATCHINTERFACE *pdiViewColumn, OUT BSTR *pstrOut) { HRESULT hr; CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable); if (NULL != pdiViewColumn->pDispatch) { hr = DispatchInvoke( pdiViewColumn, VIEWCOL_GETNAME, 0, NULL, VT_BSTR, pstrOut); _JumpIfError(hr, error, "Invoke(GetName)"); } else { hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetName(pstrOut); _JumpIfError(hr, error, "GetName"); } error: return(hr); } HRESULT ViewColumn_GetDisplayName( IN DISPATCHINTERFACE *pdiViewColumn, OUT BSTR *pstrOut) { HRESULT hr; CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable); if (NULL != pdiViewColumn->pDispatch) { hr = DispatchInvoke( pdiViewColumn, VIEWCOL_GETDISPLAYNAME, 0, NULL, VT_BSTR, pstrOut); _JumpIfError(hr, error, "Invoke(GetDisplayName)"); } else { hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetDisplayName(pstrOut); _JumpIfError(hr, error, "GetDisplayName"); } error: return(hr); } HRESULT ViewColumn_GetType( IN DISPATCHINTERFACE *pdiViewColumn, OUT LONG *pType) { HRESULT hr; CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable); if (NULL != pdiViewColumn->pDispatch) { hr = DispatchInvoke( pdiViewColumn, VIEWCOL_GETTYPE, 0, NULL, VT_I4, pType); _JumpIfError(hr, error, "Invoke(GetType)"); } else { hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetType(pType); _JumpIfError(hr, error, "GetType"); } error: return(hr); } HRESULT ViewColumn_IsIndexed( IN DISPATCHINTERFACE *pdiViewColumn, OUT LONG *pIndexed) { HRESULT hr; CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable); if (NULL != pdiViewColumn->pDispatch) { hr = DispatchInvoke( pdiViewColumn, VIEWCOL_ISINDEXED, 0, NULL, VT_I4, pIndexed); _JumpIfError(hr, error, "Invoke(IsIndexed)"); } else { hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->IsIndexed(pIndexed); _JumpIfError(hr, error, "IsIndexed"); } error: return(hr); } HRESULT ViewColumn_GetMaxLength( IN DISPATCHINTERFACE *pdiViewColumn, OUT LONG *pMaxLength) { HRESULT hr; CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable); if (NULL != pdiViewColumn->pDispatch) { hr = DispatchInvoke( pdiViewColumn, VIEWCOL_GETMAXLENGTH, 0, NULL, VT_I4, pMaxLength); _JumpIfError(hr, error, "Invoke(GetMaxLength)"); } else { hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetMaxLength( pMaxLength); _JumpIfError(hr, error, "GetMaxLength"); } error: return(hr); } HRESULT ViewColumn_GetValue( IN DISPATCHINTERFACE *pdiViewColumn, IN LONG Flags, IN LONG ColumnType, OUT VOID *pColumnValue) { HRESULT hr; LONG RetType; VARIANT varResult; VariantInit(&varResult); CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable); switch (ColumnType) { case PROPTYPE_BINARY: case PROPTYPE_STRING: RetType = VT_BSTR; break; case PROPTYPE_DATE: RetType = VT_DATE; break; case PROPTYPE_LONG: RetType = VT_I4; break; default: hr = E_INVALIDARG; _JumpError(hr, error, "PropertyType"); } if (NULL != pdiViewColumn->pDispatch) { VARIANT avar[1]; avar[0].vt = VT_I4; avar[0].lVal = Flags; hr = DispatchInvoke( pdiViewColumn, VIEWCOL_GETVALUE, ARRAYSIZE(avar), avar, RetType, pColumnValue); _JumpIfError2(hr, error, "Invoke(GetValue)", CERTSRV_E_PROPERTY_EMPTY); } else { hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetValue( Flags, &varResult); _JumpIfError(hr, error, "GetValue"); hr = DispatchGetReturnValue(&varResult, RetType, pColumnValue); _JumpIfError2(hr, error, "DispatchGetReturnValue", CERTSRV_E_PROPERTY_EMPTY); } error: VariantClear(&varResult); return(hr); } HRESULT ViewColumn_Skip( IN DISPATCHINTERFACE *pdiViewColumn, IN LONG celt) { HRESULT hr; CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable); if (NULL != pdiViewColumn->pDispatch) { VARIANT avar[1]; avar[0].vt = VT_I4; avar[0].lVal = celt; hr = DispatchInvoke( pdiViewColumn, VIEWCOL_SKIP, ARRAYSIZE(avar), avar, 0, NULL); _JumpIfError(hr, error, "Invoke(Skip)"); } else { hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Skip(celt); _JumpIfError(hr, error, "Skip"); } error: return(hr); } HRESULT ViewColumn_Reset( IN DISPATCHINTERFACE *pdiViewColumn) { HRESULT hr; CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable); if (NULL != pdiViewColumn->pDispatch) { hr = DispatchInvoke( pdiViewColumn, VIEWCOL_RESET, 0, NULL, 0, NULL); _JumpIfError(hr, error, "Invoke(Reset)"); } else { hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Reset(); _JumpIfError(hr, error, "Reset"); } error: return(hr); } HRESULT ViewColumn_Clone( IN DISPATCHINTERFACE *pdiViewColumn, OUT DISPATCHINTERFACE *pdiViewColumnClone) { HRESULT hr; IEnumCERTVIEWCOLUMN *pEnumColumn = NULL; CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable); if (NULL != pdiViewColumn->pDispatch) { hr = DispatchInvoke( pdiViewColumn, VIEWCOL_CLONE, 0, NULL, VT_DISPATCH, &pEnumColumn); _JumpIfError(hr, error, "Invoke(Clone)"); } else { hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Clone( &pEnumColumn); _JumpIfError(hr, error, "Clone"); } hr = ViewColumn_Init2( NULL != pdiViewColumn->pDispatch, pEnumColumn, pdiViewColumnClone); _JumpIfError(hr, error, "ViewColumn_Init2"); error: if (NULL != pEnumColumn) { pEnumColumn->Release(); } return(hr); }