//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1995 - 1999
//
//  File:       viewattr.cpp
//
//  Contents:   IEnumCERTVIEWATTRIBUTE IDispatch helper functions
//
//--------------------------------------------------------------------------

#include <pch.cpp>

#pragma hdrstop

#include <stdlib.h>
#include "csdisp.h"
#include "csprop.h"


//+------------------------------------------------------------------------
// IEnumCERTVIEWATTRIBUTE dispatch support

//+------------------------------------
// OpenConnection method:

static OLECHAR *_apszNext[] = {
    TEXT("Next"),
};

//+------------------------------------
// GetName method:

static OLECHAR *_apszGetName[] = {
    TEXT("GetName"),
};

//+------------------------------------
// GetValue method:

static OLECHAR *_apszGetValue[] = {
    TEXT("GetValue"),
};

//+------------------------------------
// 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_adtViewAttribute[] =
{
#define VIEWATTR_NEXT		0
    DECLARE_DISPATCH_ENTRY(_apszNext)

#define VIEWATTR_GETNAME	1
    DECLARE_DISPATCH_ENTRY(_apszGetName)

#define VIEWATTR_GETVALUE	2
    DECLARE_DISPATCH_ENTRY(_apszGetValue)

#define VIEWATTR_SKIP		3
    DECLARE_DISPATCH_ENTRY(_apszSkip)

#define VIEWATTR_RESET		4
    DECLARE_DISPATCH_ENTRY(_apszReset)

#define VIEWATTR_CLONE		5
    DECLARE_DISPATCH_ENTRY(_apszClone)
};
#define CVIEWATTRDISPATCH	(ARRAYSIZE(g_adtViewAttribute))


HRESULT
ViewAttribute_Init2(
    IN BOOL fIDispatch,
    IN IEnumCERTVIEWATTRIBUTE *pEnumAttribute,
    OUT DISPATCHINTERFACE *pdiViewAttribute)
{
    HRESULT hr;
    IDispatch *pDispatch = NULL;
    static BOOL s_fInitialized = FALSE;

    pdiViewAttribute->pDispatchTable = NULL;
    pdiViewAttribute->pDispatch = NULL;
    pdiViewAttribute->pUnknown = NULL;
    if (fIDispatch)
    {
	hr = pEnumAttribute->QueryInterface(
				    IID_IDispatch,
				    (VOID **) &pDispatch);
	_JumpIfError(hr, error, "QueryInterface");

	hr = DispatchGetIds(
			pDispatch,
			CVIEWATTRDISPATCH,
			g_adtViewAttribute,
			pdiViewAttribute);
	_JumpIfError(hr, error, "DispatchGetIds");

	pdiViewAttribute->pDispatch = pDispatch;
	pDispatch = NULL;
    }
    else
    {
	pEnumAttribute->AddRef();
	pdiViewAttribute->pUnknown = (IUnknown *) pEnumAttribute;
	hr = S_OK;
    }
    pdiViewAttribute->pDispatchTable = g_adtViewAttribute;

error:
    if (NULL != pDispatch)
    {
	pDispatch->Release();
    }
    return(hr);
}


VOID
ViewAttribute_Release(
    IN OUT DISPATCHINTERFACE *pdiViewAttribute)
{
    DispatchRelease(pdiViewAttribute);
}


HRESULT
ViewAttribute_Next(
    IN DISPATCHINTERFACE *pdiViewAttribute,
    OUT LONG *pIndex)
{
    HRESULT hr;

    CSASSERT(NULL != pdiViewAttribute && NULL != pdiViewAttribute->pDispatchTable);

    if (NULL != pdiViewAttribute->pDispatch)
    {
	hr = DispatchInvoke(
			pdiViewAttribute,
			VIEWATTR_NEXT,
			0,
			NULL,
			VT_I4,
			pIndex);
	_JumpIfError2(hr, error, "Invoke(Next)", S_FALSE);
    }
    else
    {
	hr = ((IEnumCERTVIEWATTRIBUTE *) pdiViewAttribute->pUnknown)->Next(pIndex);
	_JumpIfError2(hr, error, "Next", S_FALSE);
    }

error:
    return(hr);
}


HRESULT
ViewAttribute_GetName(
    IN DISPATCHINTERFACE *pdiViewAttribute,
    OUT BSTR *pstrOut)
{
    HRESULT hr;

    CSASSERT(NULL != pdiViewAttribute && NULL != pdiViewAttribute->pDispatchTable);

    if (NULL != pdiViewAttribute->pDispatch)
    {
	hr = DispatchInvoke(
			pdiViewAttribute,
			VIEWATTR_GETNAME,
			0,
			NULL,
			VT_BSTR,
			pstrOut);
	_JumpIfError(hr, error, "Invoke(GetName)");
    }
    else
    {
	hr = ((IEnumCERTVIEWATTRIBUTE *) pdiViewAttribute->pUnknown)->GetName(pstrOut);
	_JumpIfError(hr, error, "GetName");
    }

error:
    return(hr);
}


HRESULT
ViewAttribute_GetValue(
    IN DISPATCHINTERFACE *pdiViewAttribute,
    OUT BSTR *pstrOut)
{
    HRESULT hr;

    CSASSERT(NULL != pdiViewAttribute && NULL != pdiViewAttribute->pDispatchTable);

    if (NULL != pdiViewAttribute->pDispatch)
    {
	hr = DispatchInvoke(
			pdiViewAttribute,
			VIEWATTR_GETVALUE,
			0,
			NULL,
			VT_BSTR,
			pstrOut);
	_JumpIfError(hr, error, "Invoke(GetValue)");
    }
    else
    {
	hr = ((IEnumCERTVIEWATTRIBUTE *) pdiViewAttribute->pUnknown)->GetValue(
								    pstrOut);
	_JumpIfError(hr, error, "GetValue");
    }

error:
    return(hr);
}


HRESULT
ViewAttribute_Skip(
    IN DISPATCHINTERFACE *pdiViewAttribute,
    IN LONG celt)
{
    HRESULT hr;

    CSASSERT(NULL != pdiViewAttribute && NULL != pdiViewAttribute->pDispatchTable);

    if (NULL != pdiViewAttribute->pDispatch)
    {
	VARIANT avar[1];

	avar[0].vt = VT_I4;
	avar[0].lVal = celt;

	hr = DispatchInvoke(
			pdiViewAttribute,
			VIEWATTR_SKIP,
			ARRAYSIZE(avar),
			avar,
			0,
			NULL);
	_JumpIfError(hr, error, "Invoke(Skip)");
    }
    else
    {
	hr = ((IEnumCERTVIEWATTRIBUTE *) pdiViewAttribute->pUnknown)->Skip(celt);
	_JumpIfError(hr, error, "Skip");
    }

error:
    return(hr);
}


HRESULT
ViewAttribute_Reset(
    IN DISPATCHINTERFACE *pdiViewAttribute)
{
    HRESULT hr;

    CSASSERT(NULL != pdiViewAttribute && NULL != pdiViewAttribute->pDispatchTable);

    if (NULL != pdiViewAttribute->pDispatch)
    {
	hr = DispatchInvoke(
			pdiViewAttribute,
			VIEWATTR_RESET,
			0,
			NULL,
			0,
			NULL);
	_JumpIfError(hr, error, "Invoke(Reset)");
    }
    else
    {
	hr = ((IEnumCERTVIEWATTRIBUTE *) pdiViewAttribute->pUnknown)->Reset();
	_JumpIfError(hr, error, "Reset");
    }

error:
    return(hr);
}


HRESULT
ViewAttribute_Clone(
    IN DISPATCHINTERFACE *pdiViewAttribute,
    OUT DISPATCHINTERFACE *pdiViewAttributeClone)
{
    HRESULT hr;
    IEnumCERTVIEWATTRIBUTE *pEnumAttribute = NULL;

    CSASSERT(NULL != pdiViewAttribute && NULL != pdiViewAttribute->pDispatchTable);

    if (NULL != pdiViewAttribute->pDispatch)
    {
	hr = DispatchInvoke(
			pdiViewAttribute,
			VIEWATTR_CLONE,
			0,
			NULL,
			VT_DISPATCH,
			&pEnumAttribute);
	_JumpIfError(hr, error, "Invoke(Clone)");
    }
    else
    {
	hr = ((IEnumCERTVIEWATTRIBUTE *) pdiViewAttribute->pUnknown)->Clone(
							    &pEnumAttribute);
	_JumpIfError(hr, error, "Clone");
    }
    hr = ViewAttribute_Init2(
		    NULL != pdiViewAttribute->pDispatch,
		    pEnumAttribute,
		    pdiViewAttributeClone);
    _JumpIfError(hr, error, "ViewAttribute_Init2");

error:
    if (NULL != pEnumAttribute)
    {
	pEnumAttribute->Release();
    }
    return(hr);
}