/*** Autogenerated by WIDL 1.6 from napcertrelyingparty.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __napcertrelyingparty_h__
#define __napcertrelyingparty_h__

/* Forward declarations */

#ifndef __INapCertRelyingParty_FWD_DEFINED__
#define __INapCertRelyingParty_FWD_DEFINED__
typedef interface INapCertRelyingParty INapCertRelyingParty;
#endif

/* Headers for imported files */

#include <naptypes.h>
#include <unknwn.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

#include <wincrypt.h>

__MINGW_ATTRIB_UNUSED static const UINT32 NapAfwZonePropId = CERT_FIRST_USER_PROP_ID;
__MINGW_ATTRIB_UNUSED static const UINT32 NapAfwProtectionLevelPropId = CERT_FIRST_USER_PROP_ID + 1;

EXTERN_C const CLSID CLSID_NapCertRelyingParty;
/*****************************************************************************
 * INapCertRelyingParty interface
 */
#ifndef __INapCertRelyingParty_INTERFACE_DEFINED__
#define __INapCertRelyingParty_INTERFACE_DEFINED__

DEFINE_GUID(IID_INapCertRelyingParty, 0x62c02ffc, 0x4c77, 0x4158, 0x87,0x54, 0x78,0x2d,0x5b,0x4e,0xe6,0x6e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("62c02ffc-4c77-4158-8754-782d5b4ee66e")
INapCertRelyingParty : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SubscribeCertByGroup(
        EnforcementEntityId id,
        const BSTR subscriberName,
        const VARIANT *reserved,
        WINBOOL *certExists) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnSubscribeCertByGroup(
        EnforcementEntityId id,
        const VARIANT *reserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSubscribedRelyingParties(
        EnforcementEntityCount *count,
        EnforcementEntityId **relyingParties) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(INapCertRelyingParty, 0x62c02ffc, 0x4c77, 0x4158, 0x87,0x54, 0x78,0x2d,0x5b,0x4e,0xe6,0x6e)
#endif
#else
typedef struct INapCertRelyingPartyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        INapCertRelyingParty* This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        INapCertRelyingParty* This);

    ULONG (STDMETHODCALLTYPE *Release)(
        INapCertRelyingParty* This);

    /*** INapCertRelyingParty methods ***/
    HRESULT (STDMETHODCALLTYPE *SubscribeCertByGroup)(
        INapCertRelyingParty* This,
        EnforcementEntityId id,
        const BSTR subscriberName,
        const VARIANT *reserved,
        WINBOOL *certExists);

    HRESULT (STDMETHODCALLTYPE *UnSubscribeCertByGroup)(
        INapCertRelyingParty* This,
        EnforcementEntityId id,
        const VARIANT *reserved);

    HRESULT (STDMETHODCALLTYPE *GetSubscribedRelyingParties)(
        INapCertRelyingParty* This,
        EnforcementEntityCount *count,
        EnforcementEntityId **relyingParties);

    END_INTERFACE
} INapCertRelyingPartyVtbl;
interface INapCertRelyingParty {
    CONST_VTBL INapCertRelyingPartyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define INapCertRelyingParty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define INapCertRelyingParty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define INapCertRelyingParty_Release(This) (This)->lpVtbl->Release(This)
/*** INapCertRelyingParty methods ***/
#define INapCertRelyingParty_SubscribeCertByGroup(This,id,subscriberName,reserved,certExists) (This)->lpVtbl->SubscribeCertByGroup(This,id,subscriberName,reserved,certExists)
#define INapCertRelyingParty_UnSubscribeCertByGroup(This,id,reserved) (This)->lpVtbl->UnSubscribeCertByGroup(This,id,reserved)
#define INapCertRelyingParty_GetSubscribedRelyingParties(This,count,relyingParties) (This)->lpVtbl->GetSubscribedRelyingParties(This,count,relyingParties)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT INapCertRelyingParty_QueryInterface(INapCertRelyingParty* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG INapCertRelyingParty_AddRef(INapCertRelyingParty* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG INapCertRelyingParty_Release(INapCertRelyingParty* This) {
    return This->lpVtbl->Release(This);
}
/*** INapCertRelyingParty methods ***/
static FORCEINLINE HRESULT INapCertRelyingParty_SubscribeCertByGroup(INapCertRelyingParty* This,EnforcementEntityId id,const BSTR subscriberName,const VARIANT *reserved,WINBOOL *certExists) {
    return This->lpVtbl->SubscribeCertByGroup(This,id,subscriberName,reserved,certExists);
}
static FORCEINLINE HRESULT INapCertRelyingParty_UnSubscribeCertByGroup(INapCertRelyingParty* This,EnforcementEntityId id,const VARIANT *reserved) {
    return This->lpVtbl->UnSubscribeCertByGroup(This,id,reserved);
}
static FORCEINLINE HRESULT INapCertRelyingParty_GetSubscribedRelyingParties(INapCertRelyingParty* This,EnforcementEntityCount *count,EnforcementEntityId **relyingParties) {
    return This->lpVtbl->GetSubscribedRelyingParties(This,count,relyingParties);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE INapCertRelyingParty_SubscribeCertByGroup_Proxy(
    INapCertRelyingParty* This,
    EnforcementEntityId id,
    const BSTR subscriberName,
    const VARIANT *reserved,
    WINBOOL *certExists);
void __RPC_STUB INapCertRelyingParty_SubscribeCertByGroup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE INapCertRelyingParty_UnSubscribeCertByGroup_Proxy(
    INapCertRelyingParty* This,
    EnforcementEntityId id,
    const VARIANT *reserved);
void __RPC_STUB INapCertRelyingParty_UnSubscribeCertByGroup_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE INapCertRelyingParty_GetSubscribedRelyingParties_Proxy(
    INapCertRelyingParty* This,
    EnforcementEntityCount *count,
    EnforcementEntityId **relyingParties);
void __RPC_STUB INapCertRelyingParty_GetSubscribedRelyingParties_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __INapCertRelyingParty_INTERFACE_DEFINED__ */

#endif
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __napcertrelyingparty_h__ */
